diff --git a/.gersemirc b/.gersemirc index 4d74cb215ab..44ff8cc11cd 100644 --- a/.gersemirc +++ b/.gersemirc @@ -1,7 +1,8 @@ # yaml-language-server: $schema=https://raw.githubusercontent.com/BlankSpruce/gersemi/0.24.0/gersemi/configuration.schema.json -# Needed for gersemi to detect custom functions and macros. -definitions: ["./cmake"] +# Gersemi doesn't support autodetection of macros/functions from other files or from the current one +# and requires to explicitly list directories/cmake files that define them. +definitions: ["./cmake", "./src"] disable_formatting: false extensions: [] indent: 4 diff --git a/.github/scripts/publish-bonsai-releases.py b/.github/scripts/publish-bonsai-releases.py new file mode 100755 index 00000000000..a393104e7c9 --- /dev/null +++ b/.github/scripts/publish-bonsai-releases.py @@ -0,0 +1,95 @@ +#!/usr/bin/env -S uv run +# /// script +# dependencies = [ +# "PyGithub", +# "requests", +# ] +# /// + +import os +from pathlib import Path + +import requests +from github import Github +from github.GitReleaseAsset import GitReleaseAsset + +EXTENSION_ID = "bonsai" +CURRENT_PYTHON_VERSION = "py313" +CURRENT_PLATFORMS = ["linux-x64", "macos-arm64", "windows-x64"] + + +def publish_asset(asset: GitReleaseAsset, token: str, repo_root: Path) -> None: + """ + Publish an asset to Blender Extensions. + Reference: https://extensions.blender.org/api/v1/swagger + """ + temp_path = repo_root / asset.name + + response = requests.get(asset.browser_download_url) + response.raise_for_status() + temp_path.write_bytes(response.content) + + url = f"https://extensions.blender.org/api/v1/extensions/{EXTENSION_ID}/versions/upload/" + headers = {"Authorization": f"Bearer {token}"} + + files = {"version_file": temp_path.read_bytes()} + response = requests.post(url, headers=headers, files=files) + response.raise_for_status() + + temp_path.unlink() + + print(f"✓ Published {asset.name}") + + +def main() -> None: + token = os.getenv("BLENDER_EXTENSIONS_TOKEN") + if not token: + raise Exception("BLENDER_EXTENSIONS_TOKEN environment variable not set") + + # Get the repository root + repo_root = Path(__file__).parent.parent.parent + + # Read VERSION file + version_file = repo_root / "VERSION" + version = version_file.read_text().strip() + + print(f"Current VERSION: {version}") + + tag_name = f"bonsai-{version}" + + # Get release from GitHub + gh = Github() + gh_repo = gh.get_repo("IfcOpenShell/IfcOpenShell") + release = gh_repo.get_release(tag_name) + + assets = release.get_assets() + + asset_platform_map: dict[str, tuple[GitReleaseAsset, str]] = {} + for asset in assets: + if CURRENT_PYTHON_VERSION not in asset.name: + continue + for platform in CURRENT_PLATFORMS: + if platform in asset.name: + asset_platform_map[asset.name] = (asset, platform) + break + + if len(asset_platform_map) != len(CURRENT_PLATFORMS): + found_platforms = {platform for _, (_, platform) in asset_platform_map.items()} + missing_platforms = set(CURRENT_PLATFORMS) - found_platforms + raise Exception( + f"Expected {len(CURRENT_PLATFORMS)} assets but found {len(asset_platform_map)}. " + f"Missing: {', '.join(sorted(missing_platforms))}" + ) + + print("\nRelease assets:") + for asset_name in sorted(asset_platform_map.keys()): + print(f"- {asset_name}") + + # https://extensions.blender.org/api/v1/swagger + print("\nPublishing assets to Blender Extensions:") + for asset_name, (asset, platform) in asset_platform_map.items(): + publish_asset(asset, token, repo_root) + + +if __name__ == "__main__": + main() diff --git a/.github/workflows/build_osx.yml b/.github/workflows/build_osx.yml index f53d91b98d9..4c6cb9312ca 100644 --- a/.github/workflows/build_osx.yml +++ b/.github/workflows/build_osx.yml @@ -40,6 +40,8 @@ jobs: # preinstalled: xz, cmake brew install git bison autoconf automake libffi findutils echo "$(brew --prefix findutils)/libexec/gnubin" >> $GITHUB_PATH + # Mac is using bison 2.5 by default, but we need 3.5+ for swig. + echo "$(brew --prefix bison)/bin" >> $GITHUB_PATH - name: Install aws cli run: | @@ -47,11 +49,11 @@ jobs: - name: Unpack Dependencies run: | - install_root=$(find ./build -maxdepth 4 -type d -name install 2>/dev/null | head -n 1 || true) - [ -n "$install_root" ] && find "$install_root" -type f -name 'cache-*.tar.gz' -maxdepth 1 -exec tar -xzf {} -C "$install_root" \; || true + cd build + python ../nix/cache_dependencies.py unpack - name: ccache - uses: hendrikmuhs/ccache-action@v1.2 + uses: hendrikmuhs/ccache-action@v1.2.22 with: key: mac-${{ matrix.arch }} @@ -81,7 +83,7 @@ jobs: - name: Upload Build Logs if: always() - uses: actions/upload-artifact@v6 + uses: actions/upload-artifact@v7 with: name: build-logs-osx-${{ matrix.arch }} path: | @@ -93,9 +95,7 @@ jobs: - name: Pack Dependencies run: | cd build - for install_dir in $(find $(find . -maxdepth 4 -name install) -mindepth 1 -maxdepth 1 -type d); do - test -f $(dirname "$install_dir")/cache-$(basename "$install_dir").tar.gz || tar -czf $(dirname "$install_dir")/cache-$(basename "$install_dir").tar.gz -C $(dirname "$install_dir") $(basename "$install_dir"); - done + python ../nix/cache_dependencies.py pack - name: Commit and Push Changes to Build Repository run: | @@ -139,7 +139,7 @@ jobs: cd .. - name: Configure AWS credentials - uses: aws-actions/configure-aws-credentials@v5 + uses: aws-actions/configure-aws-credentials@v6 with: aws-access-key-id: ${{ secrets.AWS_UPLOAD_ACCESS_KEY_ID }} aws-secret-access-key: ${{ secrets.AWS_UPLOAD_SECRET_ACCESS_KEY }} diff --git a/.github/workflows/build_pyodide.yml b/.github/workflows/build_pyodide.yml index b5692b18f46..a5e80a32df6 100644 --- a/.github/workflows/build_pyodide.yml +++ b/.github/workflows/build_pyodide.yml @@ -26,10 +26,10 @@ jobs: - name: Unpack Dependencies run: | cd ifcopenshell_build - python ../IfcOpenShell/pyodide/cache_dependencies.py unpack + python ../IfcOpenShell/nix/cache_dependencies.py unpack - name: ccache - uses: hendrikmuhs/ccache-action@v1.2 + uses: hendrikmuhs/ccache-action@v1.2.22 with: key: ubuntu-22.04-${{ runner.arch }} @@ -42,7 +42,7 @@ jobs: - name: Upload Build Logs if: always() - uses: actions/upload-artifact@v6 + uses: actions/upload-artifact@v7 with: name: build-logs-pyodide path: | @@ -65,7 +65,7 @@ jobs: - name: Pack Dependencies run: | cd ifcopenshell_build - python ../IfcOpenShell/pyodide/cache_dependencies.py pack + python ../IfcOpenShell/nix/cache_dependencies.py pack - name: Commit and Push Changes to Build Repository run: | @@ -77,7 +77,7 @@ jobs: git push || echo "Push failed" - name: Configure AWS credentials - uses: aws-actions/configure-aws-credentials@v5 + uses: aws-actions/configure-aws-credentials@v6 with: aws-access-key-id: ${{ secrets.AWS_UPLOAD_ACCESS_KEY_ID }} aws-secret-access-key: ${{ secrets.AWS_UPLOAD_SECRET_ACCESS_KEY }} diff --git a/.github/workflows/build_rocky.yml b/.github/workflows/build_rocky.yml index 6a21a9dfc3b..a1aa6118263 100644 --- a/.github/workflows/build_rocky.yml +++ b/.github/workflows/build_rocky.yml @@ -6,18 +6,24 @@ on: jobs: build_ifcopenshell: runs-on: ubuntu-22.04 - container: rockylinux:8 + container: rockylinux:9 steps: + - name: Set up uv + uses: astral-sh/setup-uv@cec208311dfd045dd5311c1add060b2062131d57 # v8.0.0 + + - name: Install Python + # Installs latest Python version so it's preferred by uv over Rocky's system Python. + run: uv python install + - name: Install Dependencies run: | - yum update -y - yum install -y gcc gcc-c++ git autoconf automake bison make zip cmake python3 \ + dnf update -y + dnf install -y gcc gcc-c++ git autoconf automake bison make zip cmake python3 python3-pip \ bzip2 patch mesa-libGL-devel libffi-devel fontconfig-devel \ sqlite-devel bzip2-devel zlib-devel openssl-devel xz-devel \ readline-devel ncurses-devel libffi-devel libuuid-devel git-lfs \ findutils xz byacc - python3 -m pip install typing_extensions git config --global --add safe.directory '*' - name: Install aws cli @@ -38,30 +44,29 @@ jobs: with: repository: IfcOpenShell/build-outputs path: ./build - ref: rockylinux8-x64 + ref: rockylinux9-x64 lfs: true token: ${{ secrets.BUILD_REPO_TOKEN }} - name: Unpack Dependencies run: | - install_root=$(find ./build -maxdepth 4 -type d -name install 2>/dev/null | head -n 1 || true) - [ -n "$install_root" ] && find "$install_root" -type f -name 'cache-*.tar.gz' -maxdepth 1 -exec tar -xzf {} -C "$install_root" \; || true + cd build + uv run ../nix/cache_dependencies.py unpack - name: ccache - # TODO: Use tag after 1.2.20 releases. - uses: hendrikmuhs/ccache-action@5ebbd400eff9e74630f759d94ddd7b6c26299639 + uses: hendrikmuhs/ccache-action@v1.2.22 with: - key: ubuntu-22.04-${{ runner.arch }}-rockylinux8 + key: ubuntu-22.04-${{ runner.arch }}-rockylinux9 - name: Run Build Script shell: bash run: | set -o pipefail - CXXFLAGS="-O3" CFLAGS="-O3 ${DARWIN_C_SOURCE}" ADD_COMMIT_SHA=1 BUILD_CFG=Release python3 ./nix/build-all.py -v --diskcleanup 2>&1 | tee build.log + CXXFLAGS="-O3" CFLAGS="-O3 ${DARWIN_C_SOURCE}" ADD_COMMIT_SHA=1 BUILD_CFG=Release uv run ./nix/build-all.py -v --diskcleanup 2>&1 | tee build.log - name: Upload Build Logs if: always() - uses: actions/upload-artifact@v6 + uses: actions/upload-artifact@v7 with: name: build-logs-rocky path: | @@ -72,9 +77,7 @@ jobs: - name: Pack Dependencies run: | cd build - for install_dir in $(find $(find . -maxdepth 4 -name install) -mindepth 1 -maxdepth 1 -type d); do - test -f $(dirname "$install_dir")/cache-$(basename "$install_dir").tar.gz || tar -czf $(dirname "$install_dir")/cache-$(basename "$install_dir").tar.gz -C $(dirname "$install_dir") $(basename "$install_dir"); - done + uv run ../nix/cache_dependencies.py pack - name: Commit and Push Changes to Build Repository run: | @@ -118,7 +121,7 @@ jobs: cd .. - name: Configure AWS credentials - uses: aws-actions/configure-aws-credentials@v5 + uses: aws-actions/configure-aws-credentials@v6 with: aws-access-key-id: ${{ secrets.AWS_UPLOAD_ACCESS_KEY_ID }} aws-secret-access-key: ${{ secrets.AWS_UPLOAD_SECRET_ACCESS_KEY }} diff --git a/.github/workflows/build_rocky_arm.yml b/.github/workflows/build_rocky_arm.yml index c595c636768..a5cbea640df 100644 --- a/.github/workflows/build_rocky_arm.yml +++ b/.github/workflows/build_rocky_arm.yml @@ -6,18 +6,24 @@ on: jobs: build_ifcopenshell: runs-on: ubuntu-22.04-arm - container: arm64v8/rockylinux:8 + container: arm64v8/rockylinux:9 steps: + - name: Set up uv + uses: astral-sh/setup-uv@cec208311dfd045dd5311c1add060b2062131d57 # v8.0.0 + + - name: Install Python + # Installs latest Python version so it's preferred by uv over Rocky's system Python. + run: uv python install + - name: Install Dependencies run: | - yum update -y - yum install -y gcc gcc-c++ git autoconf automake bison make zip cmake python3 \ + dnf update -y + dnf install -y gcc gcc-c++ git autoconf automake bison make zip cmake python3 python3-pip \ bzip2 patch mesa-libGL-devel libffi-devel fontconfig-devel \ sqlite-devel bzip2-devel zlib-devel openssl-devel xz-devel \ readline-devel ncurses-devel libffi-devel libuuid-devel git-lfs \ findutils xz byacc - python3 -m pip install typing_extensions git config --global --add safe.directory '*' - name: Install aws cli @@ -38,30 +44,29 @@ jobs: with: repository: IfcOpenShell/build-outputs path: ./build - ref: rockylinux8-arm64 + ref: rockylinux9-arm64 lfs: true token: ${{ secrets.BUILD_REPO_TOKEN }} - name: Unpack Dependencies run: | - install_root=$(find ./build -maxdepth 4 -type d -name install 2>/dev/null | head -n 1 || true) - [ -n "$install_root" ] && find "$install_root" -type f -name 'cache-*.tar.gz' -maxdepth 1 -exec tar -xzf {} -C "$install_root" \; || true + cd build + uv run ../nix/cache_dependencies.py unpack - name: ccache - # TODO: Use tag after 1.2.20 releases. - uses: hendrikmuhs/ccache-action@5ebbd400eff9e74630f759d94ddd7b6c26299639 + uses: hendrikmuhs/ccache-action@v1.2.22 with: - key: ubuntu-22.04-${{ runner.arch }}-rockylinux8 + key: ubuntu-22.04-${{ runner.arch }}-rockylinux9 - name: Run Build Script shell: bash run: | set -o pipefail - CXXFLAGS="-O3" CFLAGS="-O3 ${DARWIN_C_SOURCE}" ADD_COMMIT_SHA=1 BUILD_CFG=Release python3 ./nix/build-all.py -v --diskcleanup 2>&1 | tee build.log + CXXFLAGS="-O3" CFLAGS="-O3 ${DARWIN_C_SOURCE}" ADD_COMMIT_SHA=1 BUILD_CFG=Release uv run ./nix/build-all.py -v --diskcleanup 2>&1 | tee build.log - name: Upload Build Logs if: always() - uses: actions/upload-artifact@v6 + uses: actions/upload-artifact@v7 with: name: build-logs-rocky-arm64 path: | @@ -72,9 +77,7 @@ jobs: - name: Pack Dependencies run: | cd build - for install_dir in $(find $(find . -maxdepth 4 -name install) -mindepth 1 -maxdepth 1 -type d); do - test -f $(dirname "$install_dir")/cache-$(basename "$install_dir").tar.gz || tar -czf $(dirname "$install_dir")/cache-$(basename "$install_dir").tar.gz -C $(dirname "$install_dir") $(basename "$install_dir"); - done + uv run ../nix/cache_dependencies.py pack - name: Commit and Push Changes to Build Repository run: | @@ -118,7 +121,7 @@ jobs: cd .. - name: Configure AWS credentials - uses: aws-actions/configure-aws-credentials@v5 + uses: aws-actions/configure-aws-credentials@v6 with: aws-access-key-id: ${{ secrets.AWS_UPLOAD_ACCESS_KEY_ID }} aws-secret-access-key: ${{ secrets.AWS_UPLOAD_SECRET_ACCESS_KEY }} diff --git a/.github/workflows/build_win.yml b/.github/workflows/build_win.yml index 6ef112da61f..7880296a2a5 100644 --- a/.github/workflows/build_win.yml +++ b/.github/workflows/build_win.yml @@ -5,11 +5,26 @@ on: jobs: build_ifcopenshell: - runs-on: windows-2022 strategy: fail-fast: false matrix: - arch: ['x64'] + include: + - arch: x64 + runs_on: windows-2022 + deps_dir: _deps-vs2022-x64-installed + vcvars: '"C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat"' + build_branch: windows-x64 + zip_suffix: win64 + + - arch: ARM64 + runs_on: windows-11-arm + deps_dir: _deps-vs2022-ARM64-installed + vcvars: '"C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvarsarm64.bat"' + build_branch: windows-arm64 + zip_suffix: win-arm64 + + runs-on: ${{ matrix.runs_on }} + steps: - name: Checkout Repository uses: actions/checkout@v6 @@ -20,8 +35,8 @@ jobs: uses: actions/checkout@v6 with: repository: IfcOpenShell/build-outputs - path: _deps-vs2022-x64-installed - ref: windows-${{ matrix.arch }} + path: ${{ matrix.deps_dir }} + ref: ${{ matrix.build_branch }} lfs: true token: ${{ secrets.BUILD_REPO_TOKEN }} @@ -31,14 +46,13 @@ jobs: - name: Unpack Dependencies run: | - cd _deps-vs2022-x64-installed + cd ${{ matrix.deps_dir }} Get-ChildItem -Path . -Filter 'cache-*.zip' | ForEach-Object { 7z x $_.FullName } - name: ccache - # TODO: Use tag after 1.2.20 releases. - uses: hendrikmuhs/ccache-action@5ebbd400eff9e74630f759d94ddd7b6c26299639 + uses: hendrikmuhs/ccache-action@v1.2.22 with: key: win-${{ matrix.arch }} # Windows ccache needs ~1GB @@ -47,14 +61,16 @@ jobs: - name: Run Build Script And Pack .zip Archives shell: cmd + env: + TARGET_ARCH: ${{ matrix.arch }} # lets the Python script know which arch to target (optional override) run: | - call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat" + call ${{ matrix.vcvars }} cd win python build-all-win.py - name: Pack Dependencies run: | - cd _deps-vs2022-x64-installed + cd ${{ matrix.deps_dir }} Get-ChildItem -Path . -Directory | ForEach-Object { $cacheFile = "cache-$($_.Name).zip" echo $cacheFile @@ -65,15 +81,16 @@ jobs: - name: Commit and Push Changes to Build Repository run: | - cd _deps-vs2022-x64-installed + cd ${{ matrix.deps_dir }} git config user.name "IfcOpenBot" git config user.email "ifcopenbot@ifcopenshell.org" + git checkout -B ${{ matrix.build_branch }} git add *.zip git commit -m "Update build artifacts [skip ci]" || echo "No changes to commit" - git push || echo "Push failed" + git push --set-upstream origin ${{ matrix.build_branch }} || echo "Push failed" - name: Configure AWS Credentials - uses: aws-actions/configure-aws-credentials@v5 + uses: aws-actions/configure-aws-credentials@v6 with: aws-access-key-id: ${{ secrets.AWS_UPLOAD_ACCESS_KEY_ID }} aws-secret-access-key: ${{ secrets.AWS_UPLOAD_SECRET_ACCESS_KEY }} diff --git a/.github/workflows/ci-bonsai-daily.yml b/.github/workflows/ci-bonsai-daily.yml index 4185574b2dc..5e1e90e8d9a 100644 --- a/.github/workflows/ci-bonsai-daily.yml +++ b/.github/workflows/ci-bonsai-daily.yml @@ -24,9 +24,15 @@ jobs: runs-on: ubuntu-latest if: | github.repository == 'IfcOpenShell/IfcOpenShell' + outputs: + timestamp: ${{ steps.timestamp.outputs.timestamp }} steps: - - name: Set env - run: echo ok go + - name: Get current timestamp + id: timestamp + # Include hours and minutes to release tag + # to avoid possibility of unstable repo's index.json + # pointing to the new file when index.json itself wasn't yet updated. + run: echo "timestamp=$(date +'%y%m%d%H%M')" >> $GITHUB_OUTPUT build: needs: activate @@ -35,7 +41,7 @@ jobs: strategy: fail-fast: false matrix: - pyver: [py311, py312] + pyver: [py311, py312, py313] config: - { name: "Windows Build", @@ -53,6 +59,11 @@ jobs: name: "MacOS ARM Build", short_name: macosm1, } + exclude: + # Python 3.13 is needed for Blender 5.1+ and Blender dropped Intel Mac support in 5.0. + - pyver: py313 + config: + short_name: macos steps: - uses: actions/checkout@v6 - uses: actions/setup-python@v6 # https://github.com/actions/setup-python @@ -62,12 +73,6 @@ jobs: - name: Get current version id: version run: echo "version=$(cat VERSION)" >> $GITHUB_OUTPUT - - name: Get current date - id: date - # Include hours and minutes to release tag - # to avoid possibility of unstable repo's index.json - # pointing to the new file when index.json itself wasn't yet updated. - run: echo "date=$(date +'%y%m%d%H%M')" >> $GITHUB_OUTPUT - name: Compile run: | cd src/bonsai && make dist PLATFORM=${{ matrix.config.short_name }} PYVERSION=${{ matrix.pyver }} @@ -83,8 +88,8 @@ jobs: repo_token: ${{ secrets.GITHUB_TOKEN }} file: ${{ steps.find_zip.outputs.filepath }} asset_name: ${{ steps.find_zip.outputs.filename }} - release_name: "bonsai-${{steps.version.outputs.version}}-alpha${{steps.date.outputs.date}} (unstable)" - tag: "bonsai-${{steps.version.outputs.version}}-alpha${{steps.date.outputs.date}}" + release_name: "bonsai-${{steps.version.outputs.version}}-alpha${{ needs.activate.outputs.timestamp }} (unstable)" + tag: "bonsai-${{steps.version.outputs.version}}-alpha${{ needs.activate.outputs.timestamp }}" overwrite: true body: "See README in https://github.com/IfcOpenShell/bonsai_unstable_repo/ on how to setup autoupdates for daily Bonsai builds." @@ -104,7 +109,7 @@ jobs: # Ensure Bonsai and ifcsverchok enable/disable works before uploading to extensions repo. # Download Blender. - wget -q -O blender.tar.xz https://download.blender.org/release/Blender4.5/blender-4.5.0-linux-x64.tar.xz + wget -q -O blender.tar.xz https://download.blender.org/release/Blender5.1/blender-5.1.0-linux-x64.tar.xz tar -xf blender.tar.xz # Setup Blender. @@ -117,7 +122,7 @@ jobs: pip install -r requirements.txt python setup_extensions_repo.py --last-tag cd .. - bonsai_zip="$(pwd)/$(ls bonsai_unstable_repo/bonsai_py311*-linux-x64.zip)" + bonsai_zip="$(pwd)/$(ls bonsai_unstable_repo/bonsai_py313*-linux-x64.zip)" # Install Bonsai. blender --command extension install-file -r user_default -e $bonsai_zip diff --git a/.github/workflows/ci-bonsai.yml b/.github/workflows/ci-bonsai.yml index 4c8364a9584..6fcc61658f3 100644 --- a/.github/workflows/ci-bonsai.yml +++ b/.github/workflows/ci-bonsai.yml @@ -24,7 +24,7 @@ jobs: strategy: fail-fast: false matrix: - pyver: [py311, py312] + pyver: [py311, py312, py313] config: - { name: "Windows Build", @@ -42,6 +42,11 @@ jobs: name: "MacOS ARM Build", short_name: macosm1, } + exclude: + # Python 3.13 is needed for Blender 5.1+ and Blender dropped Intel Mac support in 5.0. + - pyver: py313 + config: + short_name: macos steps: - uses: actions/checkout@v6 - uses: actions/setup-python@v6 # https://github.com/actions/setup-python diff --git a/.github/workflows/ci-ifcedit-pypi.yaml b/.github/workflows/ci-ifcedit-pypi.yaml new file mode 100644 index 00000000000..d961c72f564 --- /dev/null +++ b/.github/workflows/ci-ifcedit-pypi.yaml @@ -0,0 +1,35 @@ +name: ci-ifcedit-pypi + +on: + workflow_dispatch: + +jobs: + activate: + runs-on: ubuntu-latest + if: | + github.repository == 'IfcOpenShell/IfcOpenShell' + steps: + - name: Set env + run: echo ok go + + build: + needs: activate + runs-on: ubuntu-latest + strategy: + fail-fast: false + steps: + - uses: actions/checkout@v6 + - uses: actions/setup-python@v6 + with: + python-version: '3.11' + - name: Compile + run: | + pip install build + cd src/ifcedit && + make dist IS_STABLE=TRUE + - name: Publish a Python distribution to PyPI + uses: pypa/gh-action-pypi-publish@release/v1 + with: + user: __token__ + password: ${{ secrets.PYPI_API_TOKEN }} + packages_dir: src/ifcedit/dist diff --git a/.github/workflows/ci-ifcmcp-pypi.yaml b/.github/workflows/ci-ifcmcp-pypi.yaml new file mode 100644 index 00000000000..388c10217ae --- /dev/null +++ b/.github/workflows/ci-ifcmcp-pypi.yaml @@ -0,0 +1,36 @@ +name: ci-ifcmcp-pypi + +on: + workflow_dispatch: + +jobs: + activate: + runs-on: ubuntu-latest + if: | + github.repository == 'IfcOpenShell/IfcOpenShell' + steps: + - name: Set env + run: echo ok go + + build: + needs: activate + runs-on: ubuntu-latest + strategy: + fail-fast: false + steps: + - uses: actions/checkout@v6 + - uses: actions/setup-python@v6 + with: + python-version: '3.11' + - name: Compile + run: | + pip install build + cd src/ifcmcp && + make dist IS_STABLE=TRUE + - name: Publish a Python distribution to PyPI + uses: pypa/gh-action-pypi-publish@release/v1 + with: + user: __token__ + password: ${{ secrets.PYPI_API_TOKEN }} + packages_dir: src/ifcmcp/dist + verbose: true diff --git a/.github/workflows/ci-ifcopenshell-conda-cleaner.yml b/.github/workflows/ci-ifcopenshell-conda-cleaner.yml index 5c1b80bcc68..c34cf50e0f3 100644 --- a/.github/workflows/ci-ifcopenshell-conda-cleaner.yml +++ b/.github/workflows/ci-ifcopenshell-conda-cleaner.yml @@ -24,7 +24,7 @@ jobs: if: | github.repository == 'IfcOpenShell/IfcOpenShell' steps: - - uses: mamba-org/setup-micromamba@v2 # https://github.com/mamba-org/setup-micromamba + - uses: mamba-org/setup-micromamba@v3 # https://github.com/mamba-org/setup-micromamba with: environment-name: test-env create-args: >- diff --git a/.github/workflows/ci-ifcopenshell-conda-daily.yml b/.github/workflows/ci-ifcopenshell-conda-daily.yml index b648538ed7f..3d18316963c 100644 --- a/.github/workflows/ci-ifcopenshell-conda-daily.yml +++ b/.github/workflows/ci-ifcopenshell-conda-daily.yml @@ -84,7 +84,7 @@ jobs: run: | curl -L https://github.com/phracker/MacOSX-SDKs/releases/download/11.3/MacOSX10.13.sdk.tar.xz | tar -xvJf - -C /Users/runner/work/ - - uses: mamba-org/setup-micromamba@v2 # https://github.com/mamba-org/setup-micromamba + - uses: mamba-org/setup-micromamba@v3 # https://github.com/mamba-org/setup-micromamba with: environment-name: test-env create-args: >- diff --git a/.github/workflows/ci-ifcopenshell-docker.yml b/.github/workflows/ci-ifcopenshell-docker.yml index d5691ecfcef..df672139b8b 100644 --- a/.github/workflows/ci-ifcopenshell-docker.yml +++ b/.github/workflows/ci-ifcopenshell-docker.yml @@ -35,7 +35,7 @@ jobs: - name: ccache - uses: hendrikmuhs/ccache-action@v1.2 + uses: hendrikmuhs/ccache-action@v1.2.22 - name: Build ifcopenshell @@ -73,7 +73,7 @@ jobs: make package working-directory: build - name: Upload - uses: actions/upload-artifact@v6 + uses: actions/upload-artifact@v7 with: # Artifact name name: ifcos-artifacts @@ -91,26 +91,26 @@ jobs: lfs: true - name: Download - uses: actions/download-artifact@v7.0.0 + uses: actions/download-artifact@v8.0.1 with: # Artifact name name: ifcos-artifacts path: artifacts/ - name: Set up QEMU - uses: docker/setup-qemu-action@v3 + uses: docker/setup-qemu-action@v4 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 + uses: docker/setup-buildx-action@v4 - name: Login to Dockerhub - uses: docker/login-action@v3 + uses: docker/login-action@v4 with: username: aecgeeks password: ${{ secrets.DOCKER_HUB_TOKEN }} - name: Build container image - uses: docker/build-push-action@v6 + uses: docker/build-push-action@v7 with: context: artifacts repository: aecgeeks/ifcopenshell diff --git a/.github/workflows/ci-ifcopenshell-python-pypi.yml b/.github/workflows/ci-ifcopenshell-python-pypi.yml index 526aa09b643..7988a0bc6a1 100644 --- a/.github/workflows/ci-ifcopenshell-python-pypi.yml +++ b/.github/workflows/ci-ifcopenshell-python-pypi.yml @@ -24,7 +24,7 @@ jobs: strategy: fail-fast: false matrix: - pyver: [py39, py310, py311, py312, py313, py314] + pyver: [py310, py311, py312, py313, py314] config: - { name: "Windows 64bit", diff --git a/.github/workflows/ci-ifcopenshell-python.yml b/.github/workflows/ci-ifcopenshell-python.yml index 5d34335ada7..fe99f4857b8 100644 --- a/.github/workflows/ci-ifcopenshell-python.yml +++ b/.github/workflows/ci-ifcopenshell-python.yml @@ -19,7 +19,7 @@ jobs: strategy: fail-fast: false matrix: - pyver: [py39, py310, py311, py312, py313, py314] + pyver: [py310, py311, py312, py313, py314] config: - { name: "Windows 64bit", diff --git a/.github/workflows/ci-ifcquery-pypi.yaml b/.github/workflows/ci-ifcquery-pypi.yaml new file mode 100644 index 00000000000..9dc39a9304c --- /dev/null +++ b/.github/workflows/ci-ifcquery-pypi.yaml @@ -0,0 +1,35 @@ +name: ci-ifcquery-pypi + +on: + workflow_dispatch: + +jobs: + activate: + runs-on: ubuntu-latest + if: | + github.repository == 'IfcOpenShell/IfcOpenShell' + steps: + - name: Set env + run: echo ok go + + build: + needs: activate + runs-on: ubuntu-latest + strategy: + fail-fast: false + steps: + - uses: actions/checkout@v6 + - uses: actions/setup-python@v6 + with: + python-version: '3.11' + - name: Compile + run: | + pip install build + cd src/ifcquery && + make dist IS_STABLE=TRUE + - name: Publish a Python distribution to PyPI + uses: pypa/gh-action-pypi-publish@release/v1 + with: + user: __token__ + password: ${{ secrets.PYPI_API_TOKEN }} + packages_dir: src/ifcquery/dist diff --git a/.github/workflows/ci-black-formatting.yaml b/.github/workflows/ci-lint.yaml similarity index 76% rename from .github/workflows/ci-black-formatting.yaml rename to .github/workflows/ci-lint.yaml index 90a0b954317..4ef84f8cbba 100644 --- a/.github/workflows/ci-black-formatting.yaml +++ b/.github/workflows/ci-lint.yaml @@ -1,4 +1,4 @@ -name: ci-black-formatting +name: ci-lint on: push: @@ -7,6 +7,9 @@ on: jobs: lint-formatting: runs-on: ubuntu-latest + env: + MIN_IOS_PY_VERSION: "3.10" + MIN_BLENDER_PY_VERSION: "3.11" steps: - name: Action - checkout repository uses: actions/checkout@v6 @@ -14,12 +17,12 @@ jobs: - name: Action - install python uses: actions/setup-python@v6 with: - python-version: "3.10" + python-version: ${{ env.MIN_IOS_PY_VERSION }} - name: Action - install python uses: actions/setup-python@v6 with: - python-version: "3.11" + python-version: ${{ env.MIN_BLENDER_PY_VERSION }} - name: Install dependencies run: | @@ -27,14 +30,17 @@ jobs: uv tool install ruff uv tool install black uv tool install poethepoet + uv tool install ty # black doesn't catch all syntax errors, so we check them explicitly. - name: Check syntax errors id: syntax-errors run: | ERROR=0 - python3.10 -W error -m compileall -q src/ifcopenshell-python || ERROR=1 - python3.11 -W error -m compileall -q src/bonsai || ERROR=1 + # Using 2 Python versions - one minimum required for IfcOpenShell + # and other that's used by Blender currently. + python${{ env.MIN_IOS_PY_VERSION }} -W error -m compileall -q src/ifcopenshell-python || ERROR=1 + python${{ env.MIN_BLENDER_PY_VERSION }} -W error -m compileall -q src/bonsai || ERROR=1 exit $ERROR continue-on-error: true @@ -52,6 +58,13 @@ jobs: black --diff --check . | black-codeclimate | python .github/workflows/black_to_github_annotations.py continue-on-error: true + - name: ty check + id: ty + run: | + poe ty-venv + poe ty + continue-on-error: true + - name: Ruff check id: ruff run: | @@ -82,8 +95,7 @@ jobs: echo "\`\`\`" >> $GITHUB_STEP_SUMMARY } - run_check poe ruff-main - run_check poe ruff-old + run_check poe ruff exit $ERROR continue-on-error: true @@ -100,4 +112,7 @@ jobs: if [ "${{ steps.ruff.outcome }}" != "success" ]; then echo "::error::Ruff check failed, see Summary or 'ruff' step for the details." && ERROR=1 fi + if [ "${{ steps.ty.outcome }}" != "success" ]; then + echo "::error::ty check failed, see 'ty check' step for the details." && ERROR=1 + fi exit $ERROR diff --git a/.github/workflows/ci-pyodide-wasm-release.yml b/.github/workflows/ci-pyodide-wasm-release.yml new file mode 100644 index 00000000000..0e3017f8192 --- /dev/null +++ b/.github/workflows/ci-pyodide-wasm-release.yml @@ -0,0 +1,46 @@ +name: Release Pyodide WASM Wheel + +on: + workflow_dispatch: + +jobs: + build-and-push: + runs-on: ubuntu-latest + steps: + - name: Checkout IfcOpenShell + uses: actions/checkout@v6 + + - name: Install uv + uses: astral-sh/setup-uv@v7 + + - name: Build wheel + working-directory: pyodide + run: uv run pack_wheel.py --build + + - name: Find wheel + id: wheel + run: | + WHEEL=$(ls pyodide/dist/ifcopenshell-*.whl) + echo "path=$WHEEL" >> $GITHUB_OUTPUT + echo "name=$(basename $WHEEL)" >> $GITHUB_OUTPUT + + - name: Checkout wasm-wheels + uses: actions/checkout@v6 + with: + repository: IfcOpenShell/wasm-wheels + path: wasm-wheels + token: ${{ secrets.BUILD_REPO_TOKEN }} + + - name: Commit and push wheel to wasm-wheels + run: | + WHEEL_NAME="${{ steps.wheel.outputs.name }}" + cp "${{ steps.wheel.outputs.path }}" "wasm-wheels/$WHEEL_NAME" + cd wasm-wheels + git config user.name "IfcOpenBot" + git config user.email "ifcopenbot@ifcopenshell.org" + git add "$WHEEL_NAME" + git commit -m "Add $WHEEL_NAME" + VERSION=$(cat ../VERSION) + git tag "v${VERSION}" + git push origin main + git push origin "v${VERSION}" diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d2392ecb2ef..a49c92fcd76 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -53,7 +53,6 @@ jobs: python -m pip install --upgrade pip pip install xmlschema xsdata numpy lxml pytest isodate lark networkx tabulate python-dateutil shapely pip install src/bcf --no-deps - pip install git+https://github.com/zdhoward/aud pip install pytest-xdist==3.8.0 - name: Install C++ dependencies @@ -80,10 +79,7 @@ jobs: libhdf5-dev libcgal-dev libeigen3-dev - name: ccache - # TODO: temporarily pointing to 1.2.19 to get notified by dependabot when 1.2.20 is released - # to update hardcoded references to commits in some other workflows. - # Then we can switch back to 1.2 in all actions. - uses: hendrikmuhs/ccache-action@v1.2.19 + uses: hendrikmuhs/ccache-action@v1.2.22 with: key: ubuntu-22.04-${{ runner.arch }} @@ -185,6 +181,7 @@ jobs: "-DSCHEMA_VERSIONS=2x3;4;4x3_add2" \ -DGLTF_SUPPORT=On \ -DWITH_ROCKSDB=On \ + -DBUILD_EXAMPLES=ON \ ../cmake sudo make -j $(nproc) sudo make install @@ -209,17 +206,36 @@ jobs: - name: Build standalone examples to test cmake package run: | + set -x cd src/examples mkdir build && cd build cmake .. -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_C_COMPILER_LAUNCHER=ccache \ -DCMAKE_CXX_COMPILER_LAUNCHER=ccache cmake --build . + ./arbitrary_open_profile_def && test -f arbitrary_open_profile_def.ifc + ./composite_profile_def && test -f composite_profile_def.ifc + ./csg_primitive && test -f csg_primitive.ifc + ./ellipse_pies && test -f ellipse_pies.ifc + ./faces && test -f faces.ifc + ./ifc_curve_rebar && test -f ifc_curve_rebar.ifc + ./profiles + test -f IfcUShapeProfileDef.ifc + test -f IfcTShapeProfileDef.ifc + test -f IfcZShapeProfileDef.ifc + test -f IfcEllipseProfileDef.ifc + test -f IfcIShapeProfileDef.ifc + test -f IfcLShapeProfileDef.ifc + test -f IfcCShapeProfileDef.ifc + test -f IfcCircleProfileDef.ifc + test -f IfcRectangleProfileDef.ifc + test -f IfcTrapeziumProfileDef.ifc ./IfcParseExamples "../IfcParseExamples_test.ifc" - ./IfcOpenHouse - ./IfcAdvancedHouse - ./IfcAlignment - ./IfcSimplifiedAlignment + ./IfcOpenHouse && test -f IfcOpenHouse.ifc + ./IfcAdvancedHouse && test -f IfcAdvancedHouse.ifc + ./IfcAlignment && test -f IfcAlignment.ifc + ./IfcSimplifiedAlignment && test -f IfcSimplifiedAlignment.ifc + ./triangulated_faceset && test -f triangulated_faceset.ifc - name: Test ifcopenshell-python run: | @@ -238,6 +254,7 @@ jobs: cd ../ifcpatch && make test || ERROR=1 pip install -e ../ifctester --no-deps cd ../ifctester && make test || ERROR=1 + make build-ids-docs || ERROR=1 # Run mathutils related tests at the end to ensure no other code is relying on mathutils. cd ../ifcopenshell-python pip install mathutils diff --git a/.github/workflows/docs-deployment.yml b/.github/workflows/docs-deployment.yml deleted file mode 100644 index 3ff50b575e8..00000000000 --- a/.github/workflows/docs-deployment.yml +++ /dev/null @@ -1,36 +0,0 @@ -name: Build and Deploy Stable Documentation - -on: - workflow_dispatch: # Manual trigger - -jobs: - build: - runs-on: ubuntu-latest - - steps: - - name: Checkout repository - uses: actions/checkout@v6 - - - name: Set up Python - uses: actions/setup-python@v6 - with: - python-version: '3.x' - - - name: Install dependencies - run: | - cd src/bonsai/docs - pip install -r requirements.txt # Run pip install from the docs directory - - - name: Build documentation - run: | - cd src/bonsai/docs - make html - - - name: Deploy to GitHub Pages (Stable) - uses: peaceiris/actions-gh-pages@v4 - with: - deploy_key: ${{ secrets.ACTIONS_DEPLOY_KEY }} - external_repository: IfcOpenShell/bonsaibim_org_docs - publish_branch: main - cname: docs.bonsaibim.org - publish_dir: src/bonsai/docs/_build/html \ No newline at end of file diff --git a/.github/workflows/publish-aichat-app.yaml b/.github/workflows/publish-aichat-app.yaml new file mode 100644 index 00000000000..20369577f54 --- /dev/null +++ b/.github/workflows/publish-aichat-app.yaml @@ -0,0 +1,65 @@ +name: Deploy AI chat App to static page repo + +permissions: + id-token: write + pages: write + +on: + push: + paths: + - 'src/ifcchat/**' + - '.github/workflows/publish-aichat-app.yaml' + branches: + - v0.8.0 + workflow_dispatch: + +jobs: + activate: + runs-on: ubuntu-latest + if: | + github.repository == 'IfcOpenShell/IfcOpenShell' + steps: + - name: Set env + run: echo ok go + + build: + needs: activate + runs-on: ubuntu-latest + steps: + - name: Checkout (recursive) + uses: actions/checkout@v6 + with: + submodules: recursive + fetch-depth: 0 + - name: Checkout intermediate Pages repo + uses: actions/checkout@v6 + with: + repository: IfcOpenShell/aichat_ifcopenshell_org_static_html + ref: gh-pages + path: output + token: ${{ secrets.WEBSITE_PUBLISH }} + - name: Sync demo app into target subfolder + run: | + rsync -av --delete --exclude='.git/' src/ifcchat/ output/ + - name: Setup Python + uses: actions/setup-python@v6 + with: + python-version: "3.x" + - name: Download wheels + working-directory: output/ + run: | + pip download ifcquery==0.8.5 ifcopenshell-mcp==0.8.5 ifcedit==0.8.5 lark==1.3.1 isodate==0.7.2 --no-deps -d ./dist + - name: Commit and push if changed + working-directory: output + run: | + git config --global user.name 'IfcOpenBot' + git config --global user.email 'IfcOpenBot@users.noreply.github.com' + + git add . + if git diff --cached --quiet; then + echo "No changes to commit" + exit 0 + fi + + git commit -m "$(git log --oneline -1)" + git push origin gh-pages diff --git a/.github/workflows/publish-bonsai-releases.yml b/.github/workflows/publish-bonsai-releases.yml new file mode 100644 index 00000000000..25d9a67d412 --- /dev/null +++ b/.github/workflows/publish-bonsai-releases.yml @@ -0,0 +1,16 @@ +name: Publish Bonsai Releases + +on: + workflow_dispatch: + +jobs: + publish: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - uses: astral-sh/setup-uv@v3 + + - run: uv run .github/scripts/publish-bonsai-releases.py + env: + BLENDER_EXTENSIONS_TOKEN: ${{ secrets.BLENDER_EXTENSIONS_TOKEN }} diff --git a/.github/workflows/publish-pyodide-demo-app.yml b/.github/workflows/publish-pyodide-demo-app.yml index 4aebe4266e2..6b0141fc293 100644 --- a/.github/workflows/publish-pyodide-demo-app.yml +++ b/.github/workflows/publish-pyodide-demo-app.yml @@ -1,4 +1,4 @@ -name: Deploy Pyodide Demo App to GitHub Pages +name: Deploy Pyodide Demo App to static page repo permissions: id-token: write @@ -11,6 +11,7 @@ on: - '.github/workflows/publish-pyodide-demo-app.yml' branches: - v0.8.0 + workflow_dispatch: jobs: activate: @@ -30,21 +31,27 @@ jobs: with: submodules: recursive fetch-depth: 0 - - name: Setup Pages - uses: actions/configure-pages@v5 - - name: Upload static files as artifact - id: deployment - uses: actions/upload-pages-artifact@v4 + - name: Checkout intermediate Pages repo + uses: actions/checkout@v6 with: - path: src/pyodide/demo-app/ + repository: IfcOpenShell/wasm_ifcopenshell_org_static_html + ref: gh-pages + path: output + token: ${{ secrets.WEBSITE_PUBLISH }} + - name: Sync demo app into target subfolder + run: | + rsync -av --delete --exclude='.git/' src/pyodide/demo-app/ output/ + - name: Commit and push if changed + working-directory: output + run: | + git config --global user.name 'IfcOpenBot' + git config --global user.email 'IfcOpenBot@users.noreply.github.com' - deploy: - environment: - name: github-pages - url: ${{ steps.deployment.outputs.page_url }} - runs-on: ubuntu-latest - needs: build - steps: - - name: Deploy to GitHub Pages - id: deployment - uses: actions/deploy-pages@v4 + git add . + if git diff --cached --quiet; then + echo "No changes to commit" + exit 0 + fi + + git commit -m "$(git log --oneline -1)" + git push origin gh-pages diff --git a/.gitignore b/.gitignore index bfdfdd5f76d..80fbb01a00c 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,8 @@ /_installed-vs*-x*/ /build/ /src/examples/build/ +# ifctester docs output +/src/ifctester/test/build/ # output directories /cmake/out/ @@ -12,6 +14,7 @@ /src/ifcmax/out/ /src/ifcwrap/out/ /src/qtviewer/out/ +/src/ifctester/webapp/public/pyodide/ /win/BuildDepsCache*.txt @@ -22,6 +25,8 @@ venv # Visual Studio Code files .vscode +!.vscode/launch.json +!.vscode/tasks.json .vs # PyCharm files @@ -78,8 +83,14 @@ src/ifcopenshell-python/test/build # bonsai i18n src/bonsai/bonsai/translations.py -# bonsai test temp files +# bonsai external dependencies (cloned for just ty checks) +src/bonsai/external_dependencies/ + +# bonsai test temp/cache files src/bonsai/test/files/temp +src/bonsai/test/files/*.cache.blend +src/bonsai/test/files/*.cache.json +src/bonsai/test/files/*.cache.sqlite # bonsai data src/bonsai/bonsai/bim/data/build/ @@ -111,3 +122,9 @@ dev_environment.bat src/ifcopenshell-python/ifcopenshell/express/*.exp src/ifcopenshell-python/ifcopenshell/express/*.exp.cache.dat + + +# temp files from AI coding tools +*.claude +*.py.tmp* +*.json.tmp* diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 00000000000..63fa0f352d4 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,24 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + + { + "name": "Python Debugger: Remote Attach", + "type": "debugpy", + "request": "attach", + "connect": { + "host": "localhost", + "port": 5678 + }, + "pathMappings": [ + { + "localRoot": "${config:bonsai.localRoot}", + "remoteRoot": "${config:bonsai.remoteRoot}" + } + ] + } + ] +} \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 00000000000..883373e4760 --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,53 @@ +{ + // See https://go.microsoft.com/fwlink/?LinkId=733558 + // for the documentation about the tasks.json format + "version": "2.0.0", + "tasks": [ + { + "label": "Configure bonsai/vscode development environment", + "type": "shell", + "command": "${input:blenderPath}", + "args": [ + "--background", + "--python", "${workspaceFolder}/src/bonsai/scripts/dev_environment_vscode_config.py" + ], + "problemMatcher": [] + }, + { + "label": "Launch blender with debugpy", + "type": "shell", + "command": "blender", + "options": { + "cwd": "${config:bonsai.blenderPath}" + }, + "args": [ + "--python-expr", + "import debugpy; debugpy.listen(5678)" + ], + "problemMatcher": [] + }, + { + "label": "Install debugpy in Blender", + "type": "shell", + "command": "blender", + "options": { + "cwd": "${config:bonsai.blenderPath}" + }, + "args": [ + "--background", + "--python-expr", + "import os, sys, subprocess; path=os.path.abspath(sys.executable); subprocess.call([path, '-m', 'ensurepip']); subprocess.call([path, '-m', 'pip', 'install', '--upgrade', 'debugpy'])" + ], + "problemMatcher": [] + } + + ], + "inputs": [ + { + "id": "blenderPath", + "type": "promptString", + "description": "Enter the path to the blender executable", + "default": "blender" + } + ] +} \ No newline at end of file diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 00000000000..fd0e3052454 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,153 @@ + + +# AGENTS.md + +Guidelines for AI coding agents contributing to IfcOpenShell. This file is +intended to be read by all AI agents regardless of platform (Claude Code, +Copilot, Cursor, etc.) in addition to any tool-specific configuration files. + +Human contributors using AI tools should also read this document carefully, +as they are responsible for ensuring their contributions comply with these +guidelines. + +## Project Overview + +IfcOpenShell is an open source library for working with Industry Foundation +Classes (IFC). It provides C++ and Python APIs, geometry processing, and an +ecosystem of tools including IfcConvert and the Bonsai Blender add-on. + +## Licensing + +All contributions must be compatible with the project's licensing: + +- **Library code** (everything except Bonsai): **LGPL-3.0-or-later** +- **Bonsai** (`src/bonsai/`): **GPL-3.0-or-later** + +There is no Contributor License Agreement (CLA). By submitting a pull request, +you agree that your contribution is licensed under the applicable license above. + +## Indicating AI-Generated Code + +Contributors must clearly indicate when code has been generated or +substantially written by an AI tool. + +### Commits + +Commits that modify existing code must include a note in the **body** of the +commit message (not the subject line) indicating that the change was +AI-generated. For example: + +``` +Fix off-by-one error in element iteration + +The loop termination condition was incorrect when processing +IfcRelAggregates relationships. + +Generated with the assistance of an AI coding tool. +``` + +### New Files + +New files that are AI-generated must include a comment near the top of the +file indicating this. Use the appropriate comment syntax for the language: + +```python +# This file was generated with the assistance of an AI coding tool. +``` + +```cpp +// This file was generated with the assistance of an AI coding tool. +``` + +### Pull Requests + +Pull requests containing AI-generated code must indicate in the PR description +which parts of the contribution are AI-generated. If the entire PR is +AI-generated, state that clearly. If only specific commits or files are +AI-generated, identify them. + +## Pull Request Guidelines + +### Scope and Size + +- Each pull request should address a **single issue or feature**. +- Do not mix unrelated changes (e.g., bug fixes with refactoring or style + changes) in the same PR. +- Large pull requests should be broken down into **multiple small, standalone + commits** that are each easy to review independently. Rewrite commit history + for this purpose if necessary. +- PRs that are minimal, focused solutions to a specific problem are much more + likely to be accepted. + +### What to Avoid + +- **Over-engineering**: Do not add features, abstractions, or configurability + beyond what is needed to solve the immediate problem. +- **Scope creep**: Do not make changes to files or code that are not directly + related to the task at hand. +- **Unnecessary additions**: Do not add docstrings, comments, type annotations, + or error handling to code you did not otherwise need to change. +- **Cosmetic changes**: Do not reformat, rename, or reorganize code that is + unrelated to your change. + +## Commit Messages + +- The **subject line** must be **50 characters or less**. +- Use the **imperative mood** (e.g., "Fix crash in geometry kernel", not + "Fixed crash" or "Fixes crash"). +- A commit message can be a single line if the purpose is obvious from the + subject alone. +- Otherwise, add a blank line after the subject followed by a short explanation + of a few lines in the body. + +## Code Style + +### Python + +- **Line length**: 120 characters +- **Formatter**: black +- **Linter**: ruff +- Configuration is in `pyproject.toml` + +### C++ + +- **Standard**: C++17 minimum +- **Formatter**: clang-format (configuration in `.clang-format`) +- **Linter**: clang-tidy (configuration in `.clang-tidy`) + +Run linters and formatters **before submitting** your pull request. Do not rely +on CI to catch formatting issues. + +## Testing + +- Pull requests with test coverage are **much more likely to be merged**. +- If tests are appropriate and feasible for your change, they should be + included. +- Tests are not required for every change (e.g., documentation-only changes), + but the expectation is that testable code changes come with tests. +- Python tests use **pytest** and are located in `test/` or `tests/` directories + within each package under `src/`. +- Run the existing test suite for the package you modified before submitting. + +## Architecture Quick Reference + +### Directory Structure + +- `src/ifcparse/` — C++ IFC file parsing +- `src/ifcgeom/` — C++ geometry processing (OpenCASCADE and CGAL kernels) +- `src/serializers/` — Output format serializers (glTF, Collada, SVG, etc.) +- `src/ifcwrap/` — SWIG Python bindings +- `src/ifcconvert/` — CLI conversion tool +- `src/ifcopenshell-python/` — Python API (`ifcopenshell` package) +- `src/bonsai/` — Blender add-on (GPL-3.0-or-later) +- `src/ifctester/` — IDS model auditing +- `src/ifcpatch/` — IFC file manipulation scripts +- `src/ifcdiff/` — IFC model comparison +- `src/ifcclash/` — Clash detection +- `src/ifccsv/` — Schedule import/export + +### IFC Schema Versions + +The library supports IFC2x3 TC1, IFC4 Add2 TC1, IFC4x1, IFC4x2, and +IFC4x3 Add2. Schema-specific code is compiled conditionally. Be aware of +which schema versions your change affects. diff --git a/README.md b/README.md index 6b77a048339..a44a6ff78c5 100644 --- a/README.md +++ b/README.md @@ -50,11 +50,14 @@ Contents | [ifcconvert](https://docs.ifcopenshell.org/ifcconvert.html) | CLI app to convert IFC to many other formats | LGPL-3.0-or-later\* | [![Official](https://img.shields.io/badge/IfcOpenShell.org-Download-70ba35)](https://docs.ifcopenshell.org/ifcconvert/installation.html) [![GitHub](https://img.shields.io/github/v/release/ifcopenshell/ifcopenshell?filter=ifcconvert-*&label=GitHub&color=f6f8fa)](https://github.com/IfcOpenShell/IfcOpenShell/releases?q=ifcconvert&expanded=true) | [ifccsv](https://docs.ifcopenshell.org/ifccsv.html) | Library and CLI app to export and import schedules from IFC | LGPL-3.0-or-later | [![PyPI](https://img.shields.io/pypi/v/ifccsv?label=PyPI&color=006dad)](https://pypi.org/project/ifccsv/) | | [ifcdiff](https://docs.ifcopenshell.org/ifcdiff.html) | Compare changes between IFC models | LGPL-3.0-or-later | [![PyPI](https://img.shields.io/pypi/v/ifcdiff?label=PyPI&color=006dad)](https://pypi.org/project/ifcdiff/) | +| [ifcedit](https://docs.ifcopenshell.org/ifcedit.html) | CLI wrapper for ifcopenshell.api IFC model mutation functions | LGPL-3.0-or-later | [![PyPI](https://img.shields.io/pypi/v/ifcedit?label=PyPI&color=006dad)](https://pypi.org/project/ifcedit/) | | [ifcfm](https://docs.ifcopenshell.org/ifcfm.html) | Extract IFC data for FM handover requirements | LGPL-3.0-or-later | [![PyPI](https://img.shields.io/pypi/v/ifcfm?label=PyPI&color=006dad)](https://pypi.org/project/ifcfm/) | | [ifcmax](https://docs.ifcopenshell.org/ifcmax.html) | Historic extension for IFC support in 3DS Max | LGPL-3.0-or-later\* | [![Official](https://img.shields.io/badge/IfcOpenShell.org-Download-70ba35)](https://docs.ifcopenshell.org/ifcmax.html) -| [ifcopenshell-python](https://docs.ifcopenshell.org/ifcopenshell-python.html) | Python library for IFC manipulation | LGPL-3.0-or-later\* | [![Official](https://img.shields.io/badge/IfcOpenShell.org-Download-70ba35)](https://docs.ifcopenshell.org/ifcopenshell-python/installation.html) [![GitHub](https://img.shields.io/github/v/release/ifcopenshell/ifcopenshell?filter=ifcopenshell-python-*&label=GitHub&color=f6f8fa)](https://github.com/IfcOpenShell/IfcOpenShell/releases?q=ifcopenshell-python&expanded=true) [![PyPI](https://img.shields.io/pypi/v/ifcopenshell?label=PyPI&color=006dad)](https://pypi.org/project/ifcopenshell/) [![Anaconda](https://img.shields.io/conda/vn/conda-forge/ifcopenshell?label=Anaconda&color=43b02a)](https://anaconda.org/conda-forge/ifcopenshell) [![Anaconda](https://img.shields.io/conda/vn/ifcopenshell/ifcopenshell?label=Anaconda-Unstable&color=43b02a)](https://anaconda.org/ifcopenshell/ifcopenshell) [![Docker](https://img.shields.io/docker/pulls/aecgeeks/ifcopenshell?label=Docker&color=1D63ED)](https://hub.docker.com/r/aecgeeks/ifcopenshell) [![AUR](https://img.shields.io/aur/version/ifcopenshell?label=AUR&color=1793d1)](https://aur.archlinux.org/packages/ifcopenshell) [![AUR Unstable](https://img.shields.io/aur/version/ifcopenshell-git?label=AUR-Unstable&color=1793d1)](https://aur.archlinux.org/packages/ifcopenshell-git) [Pyodide WASM Wheels](https://github.com/IfcOpenShell/wasm-wheels#pyodide-test-wheels) | +| [ifcmcp](https://docs.ifcopenshell.org/ifcmcp.html) | MCP server for querying and editing IFC building models | LGPL-3.0-or-later | [![PyPI](https://img.shields.io/pypi/v/ifcopenshell-mcp?label=PyPI&color=006dad)](https://pypi.org/project/ifcopenshell-mcp/) | +| [ifcopenshell-python](https://docs.ifcopenshell.org/ifcopenshell-python.html) | Python library for IFC manipulation | LGPL-3.0-or-later\* | [![Official](https://img.shields.io/badge/IfcOpenShell.org-Download-70ba35)](https://docs.ifcopenshell.org/ifcopenshell-python/installation.html) [![GitHub](https://img.shields.io/github/v/release/ifcopenshell/ifcopenshell?filter=ifcopenshell-python-*&label=GitHub&color=f6f8fa)](https://github.com/IfcOpenShell/IfcOpenShell/releases?q=ifcopenshell-python&expanded=true) [![PyPI](https://img.shields.io/pypi/v/ifcopenshell?label=PyPI&color=006dad)](https://pypi.org/project/ifcopenshell/) [![Anaconda](https://img.shields.io/conda/vn/conda-forge/ifcopenshell?label=Anaconda&color=43b02a)](https://anaconda.org/conda-forge/ifcopenshell) [![Anaconda](https://img.shields.io/conda/vn/ifcopenshell/ifcopenshell?label=Anaconda-Unstable&color=43b02a)](https://anaconda.org/ifcopenshell/ifcopenshell) [![Docker](https://img.shields.io/docker/pulls/aecgeeks/ifcopenshell?label=Docker&color=1D63ED)](https://hub.docker.com/r/aecgeeks/ifcopenshell) [![AUR](https://img.shields.io/aur/version/ifcopenshell?label=AUR&color=1793d1)](https://aur.archlinux.org/packages/ifcopenshell) [![AUR Unstable](https://img.shields.io/aur/version/ifcopenshell-git?label=AUR-Unstable&color=1793d1)](https://aur.archlinux.org/packages/ifcopenshell-git) [![Pyodide WASM Wheels tag](https://img.shields.io/github/v/tag/ifcopenshell/wasm-wheels?sort=semver&label=pyodide-wasm-wheels)](https://github.com/IfcOpenShell/wasm-wheels) | | [ifcpatch](https://docs.ifcopenshell.org/ifcpatch.html) | Utility to run pre-packaged scripts to manipulate IFCs | LGPL-3.0-or-later | [![PyPI](https://img.shields.io/pypi/v/ifcpatch?label=PyPI&color=006dad)](https://pypi.org/project/ifcpatch/) | -| [ifcsverchok](https://docs.ifcopenshell.org/ifcsverchok.html) | Blender Add-on for visual node programming with IFC | GPL-3.0-or-later | [![GitHub Unstable](https://img.shields.io/github/v/release/ifcopenshell/ifcopenshell?filter=ifcsverchok-*.*.*.*&label=GitHub-Unstable&color=f6f8fa)](https://github.com/IfcOpenShell/IfcOpenShell/releases?q=ifcsverchok&expanded=true) +| [ifcquery](https://docs.ifcopenshell.org/ifcquery.html) | CLI tool for querying and inspecting IFC building models | LGPL-3.0-or-later | [![PyPI](https://img.shields.io/pypi/v/ifcquery?label=PyPI&color=006dad)](https://pypi.org/project/ifcquery/) | +| [ifcsverchok](https://docs.ifcopenshell.org/ifcsverchok.html) | Blender Add-on for visual node programming with IFC | GPL-3.0-or-later | [![GitHub](https://img.shields.io/github/v/release/ifcopenshell/ifcopenshell?filter=ifcsverchok-*.*.*&label=GitHub&color=f6f8fa)](https://github.com/IfcOpenShell/IfcOpenShell/releases?q=ifcsverchok&expanded=true) | [ifctester](https://docs.ifcopenshell.org/ifctester.html) | Library, CLI and webapp for IDS model auditing | LGPL-3.0-or-later | [![PyPI](https://img.shields.io/pypi/v/ifctester?label=PyPI&color=006dad)](https://pypi.org/project/ifctester/) | The IfcOpenShell C++ codebase is split into multiple interal libraries: diff --git a/VERSION b/VERSION index 7ada0d303f3..7fc2521fd74 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.8.5 +0.8.6 diff --git a/choco/bonsai/choco_release.py b/choco/bonsai/choco_release.py index 681e6c58e52..ea53798c5d2 100644 --- a/choco/bonsai/choco_release.py +++ b/choco/bonsai/choco_release.py @@ -13,6 +13,7 @@ import os import pathlib import re +import subprocess from typing import NoReturn from urllib import request @@ -20,7 +21,7 @@ def get_repo_tag_names() -> list[str]: - git_return = os.popen("git tag -l").read() + git_return = subprocess.check_output("git tag -l", text=True) tag_names = [tag_name for tag_name in git_return.split("\n") if tag_name] print(f"{len(tag_names)} tag_names found in repo") return tag_names @@ -78,6 +79,10 @@ def get_release_zip(tag: str) -> tuple[str, str]: raise Exception(f"Couldn't find the release matching '{python_version}' and '{TARGET_OS}' in tag '{tag}'.") +def run(command: str) -> None: + subprocess.check_output(command) + + start = datetime.datetime.now() URL_CHOCO_PACKAGE = "https://community.chocolatey.org/packages/blender" @@ -97,7 +102,7 @@ def get_release_zip(tag: str) -> tuple[str, str]: target_release_tag = "" TARGET_OS = "windows-x64" -git_status = os.popen("git status").read() +git_status = subprocess.check_output("git status", text=True) print(git_status) for tag_name in get_repo_tag_names(): @@ -147,7 +152,7 @@ def get_release_zip(tag: str) -> tuple[str, str]: # url_blenderbim_py3x_win_zip release_zip_file_name, url_blenderbim_py3x_win_zip = get_release_zip(target_release_tag) -os.popen(f"wget {url_blenderbim_py3x_win_zip} --no-verbose").read() +subprocess.check_call(f"wget {url_blenderbim_py3x_win_zip} --no-verbose") # sha256sum_blenderbim_py310_win_zip sha256sum_blenderbim_py3x_win_zip = get_file_sha256_hash(release_zip_file_name) @@ -201,13 +206,13 @@ def get_release_zip(tag: str) -> tuple[str, str]: print("\n_____ build choco.exe with mono") choco_version = "1.1.0" -os.popen(f"wget https://github.com/chocolatey/choco/archive/refs/tags/{choco_version}.tar.gz --quiet").read() -os.popen(f"tar -xzf {choco_version}.tar.gz").read() +run(f"wget https://github.com/chocolatey/choco/archive/refs/tags/{choco_version}.tar.gz --quiet") +run(f"tar -xzf {choco_version}.tar.gz") print("choco tar unpack successful") os.chdir("choco-1.1.0") -os.popen("./build.sh").read() +run("./build.sh") -os.popen("cp -r build_output/chocolatey /opt/chocolatey").read() +run("cp -r build_output/chocolatey /opt/chocolatey") os.chdir(BLENDERBIM_DIR) if pathlib.Path("/opt/chocolatey/choco.exe").exists(): @@ -215,11 +220,15 @@ def get_release_zip(tag: str) -> tuple[str, str]: print("\n_____ build choco pack") -os.popen("mono /opt/chocolatey/choco.exe pack --allow-unofficial").read() -os.popen('mono /opt/chocolatey/choco.exe setapikey --key="{choco_token}" --source="https://push.chocolatey.org/" --allow-unofficial').read() +run("mono /opt/chocolatey/choco.exe pack --allow-unofficial") +run( + 'mono /opt/chocolatey/choco.exe setapikey --key="{choco_token}" --source="https://push.chocolatey.org/" --allow-unofficial' +) print("\n_____ build choco push") -os.popen('mono /opt/chocolatey/choco.exe push --source="https://push.chocolatey.org/" --key="$CHOCO_TOKEN" --allow-unofficial --verbose').read() +run( + 'mono /opt/chocolatey/choco.exe push --source="https://push.chocolatey.org/" --key="$CHOCO_TOKEN" --allow-unofficial --verbose' +) print(f"choco push of version: {target_release_tag} successful!") print(f"it took: {datetime.datetime.now() - start}") diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index 9e88026ac75..917e66d192a 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -80,7 +80,7 @@ option(BUILD_IFCGEOM "Build IfcGeom." ON) option(BUILD_IFCPYTHON "Build IfcPython." ON) option(BUILD_CONVERT "Build IfcConvert executable." ON) option(BUILD_DOCUMENTATION "Build IfcOpenShell Documentation." OFF) -option(BUILD_EXAMPLES "Build example applications." ON) +option(BUILD_EXAMPLES "Build example applications." OFF) option(BUILD_GEOMSERVER "Build IfcGeomServer executable (Open CASCADE is required)." ON) option(BUILD_IFCMAX "Build IfcMax, a 3ds Max plug-in, Windows-only." OFF) option(BUILD_QTVIEWER "Build IfcOpenShell Qt GUI Viewer" OFF) # QtViewer requires Qt6 @@ -258,10 +258,10 @@ if(WITH_ROCKSDB) set(ROCKSDB_LIBRARIES "IFCOPENSHELL_RocksDB") target_compile_definitions(IFCOPENSHELL_RocksDB INTERFACE IFOPSH_WITH_ROCKSDB) set(SWIG_DEFINES ${SWIG_DEFINES} -DIFOPSH_WITH_ROCKSDB) - target_link_libraries( - IFCOPENSHELL_RocksDB - INTERFACE $,RocksDB::rocksdb-shared,RocksDB::rocksdb> - ) + # Shared binaries for `rocksdb` only support limited API (only `c.h`), but we use `db.h` API. + # So rocksdb supported only as a static library. + # See https://github.com/facebook/rocksdb/issues/981. + target_link_libraries(IFCOPENSHELL_RocksDB INTERFACE RocksDB::rocksdb) if(WITH_ZSTD) # @todo do we actually need the zstd include dir or rather just pass @@ -368,12 +368,20 @@ if(ENABLE_BUILD_OPTIMIZATIONS) # Linker # /OPT:REF enables also /OPT:ICF and disables INCREMENTAL - set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE} /LTCG /OPT:REF") - + set(LINKER_FLAGS_RELEASE "/LTCG /OPT:REF") # /OPT:NOICF is recommended when /DEBUG is used (http://msdn.microsoft.com/en-us/library/xe4t6fc1.aspx) - set(CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_SHARED_LINKER_FLAGS_RELEASE} /DEBUG /OPT:NOICF") - set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /LTCG /OPT:REF") - set(CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /DEBUG /OPT:NOICF") + set(LINKER_FLAGS_RELWITHDEBINFO "/DEBUG /OPT:NOICF") + + set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE} ${LINKER_FLAGS_RELEASE}") + set(CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO + "${CMAKE_SHARED_LINKER_FLAGS_RELEASE} ${LINKER_FLAGS_RELWITHDEBINFO}" + ) + set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} ${LINKER_FLAGS_RELEASE}") + set(CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_EXE_LINKER_FLAGS_RELEASE} ${LINKER_FLAGS_RELWITHDEBINFO}") + set(CMAKE_MODULE_LINKER_FLAGS_RELEASE "${CMAKE_MODULE_LINKER_FLAGS_RELEASE} ${LINKER_FLAGS_RELEASE}") + set(CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO + "${CMAKE_MODULE_LINKER_FLAGS_RELEASE} ${LINKER_FLAGS_RELWITHDEBINFO}" + ) else() # GCC-like: Release should use O3 but RelWithDebInfo 02 so enforce 03. Anything other useful that could be added here? set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3") diff --git a/cmake/FindOpenCASCADE.cmake b/cmake/FindOpenCASCADE.cmake index f78ee33b99e..aac5f0521ef 100644 --- a/cmake/FindOpenCASCADE.cmake +++ b/cmake/FindOpenCASCADE.cmake @@ -43,6 +43,17 @@ if(NOT OCC_INCLUDE_DIR AND NOT OCC_LIBRARY_DIR) set_target_properties(TKernel PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${OpenCASCADE_INCLUDE_DIR}") endif() + if( + OpenCASCADE_VERSION VERSION_LESS "7.9.0" + AND CMAKE_VERSION GREATER_EQUAL "3.24" + AND CMAKE_CXX_COMPILER_ID STREQUAL "GNU" + ) + # Before 7.9.0 targets in OCCT cmake configs are not linked to each other + # leading to missing symbols on Unix. Link them as a single group as a workaround. + # Only needed for gcc, because other compilers (e.g. Apple Clang, MSVC) do rescan automatically. + set(OpenCASCADE_LIBRARIES "$") + endif() + if(OpenCASCADE_VERSION VERSION_LESS "7.9.0" AND WIN32) # Bug in OCCT cmake configs < 7.9.0 - missing linked library. list(APPEND OpenCASCADE_LIBRARIES WSOCK32.lib) diff --git a/cmake/IfcOpenShellConfig.cmake.in b/cmake/IfcOpenShellConfig.cmake.in index 95df6180f97..e5e5d350b8f 100644 --- a/cmake/IfcOpenShellConfig.cmake.in +++ b/cmake/IfcOpenShellConfig.cmake.in @@ -13,7 +13,14 @@ include(CMakeFindDependencyMacro) set(Boost_USE_STATIC_LIBS ON) set(Boost_USE_STATIC_RUNTIME OFF) set(Boost_USE_MULTITHREADED ON) -set(Boost_COMPONENTS system program_options regex thread date_time iostreams) +set(Boost_COMPONENTS + system + program_options + regex + thread + date_time + iostreams +) find_dependency(Boost CONFIG COMPONENTS ${Boost_COMPONENTS}) find_dependency(Eigen3 CONFIG) @@ -39,7 +46,6 @@ if(IFCOPENSHELL_IFCXML) find_dependency(LibXml2 CONFIG) endif() - if(IFCOPENSHELL_WITH_CGAL) find_dependency(CGAL CONFIG) endif() @@ -48,9 +54,7 @@ if(IFCOPENSHELL_WITH_OPENCASCADE) find_dependency(OpenCASCADE CONFIG) if(OpenCASCADE_VERSION VERSION_LESS "7.7.0") # cmake configs < 7.7.0 were not adding include directories to targets automatically. - set_target_properties(TKernel PROPERTIES - INTERFACE_INCLUDE_DIRECTORIES "${OpenCASCADE_INCLUDE_DIR}" - ) + set_target_properties(TKernel PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${OpenCASCADE_INCLUDE_DIR}") endif() endif() diff --git a/cmake/cmake_uninstall.cmake.in b/cmake/cmake_uninstall.cmake.in index 04da07edd61..aa91cd810dd 100644 --- a/cmake/cmake_uninstall.cmake.in +++ b/cmake/cmake_uninstall.cmake.in @@ -25,19 +25,12 @@ file(READ "@CMAKE_BINARY_DIR@/install_manifest.txt" files) string(REGEX REPLACE "\n" ";" files "${files}") foreach(file ${files}) - message(STATUS "Uninstalling $ENV{DESTDIR}${file}") + set(filepath "$ENV{DESTDIR}${file}") + message(STATUS "Uninstalling ${filepath}") - if(IS_SYMLINK "$ENV{DESTDIR}${file}" OR EXISTS "$ENV{DESTDIR}${file}") - exec_program( - "@CMAKE_COMMAND@" ARGS "-E remove \"$ENV{DESTDIR}${file}\"" - OUTPUT_VARIABLE rm_out - RETURN_VALUE rm_retval - ) - - if(NOT "${rm_retval}" STREQUAL 0) - message(FATAL_ERROR "Problem when removing $ENV{DESTDIR}${file}") - endif() - else(IS_SYMLINK "$ENV{DESTDIR}${file}" OR EXISTS "$ENV{DESTDIR}${file}") - message(STATUS "File $ENV{DESTDIR}${file} does not exist.") + if(IS_SYMLINK "${filepath}" OR EXISTS "${filepath}") + file(REMOVE "${filepath}") + else(NOT EXISTS "${filepath}") + message(STATUS "File ${filepath} does not exist.") endif() endforeach() diff --git a/docs/cpp-api/CMakeLists.txt b/docs/cpp-api/CMakeLists.txt index 0b729355e54..80593dd2202 100644 --- a/docs/cpp-api/CMakeLists.txt +++ b/docs/cpp-api/CMakeLists.txt @@ -1,14 +1,10 @@ #Look for an executable called sphinx-build -find_program(SPHINX_EXECUTABLE - NAMES sphinx-build - DOC "Path to sphinx-build executable") +find_program(SPHINX_EXECUTABLE NAMES sphinx-build DOC "Path to sphinx-build executable") include(FindPackageHandleStandardArgs) #Handle standard arguments to find_package like REQUIRED and QUIET -find_package_handle_standard_args(Sphinx - "Failed to find sphinx-build executable" - SPHINX_EXECUTABLE) +find_package_handle_standard_args(Sphinx "Failed to find sphinx-build executable" SPHINX_EXECUTABLE) find_package(Doxygen REQUIRED) #find_package(Sphinx REQUIRED) @@ -16,25 +12,24 @@ find_package(Doxygen REQUIRED) set(SPHINX_SOURCE ${CMAKE_CURRENT_SOURCE_DIR}) set(SPHINX_BUILD ${CMAKE_CURRENT_BINARY_DIR}/docs/sphinx) -MESSAGE(STATUS "SPHINX BUILD ${CMAKE_CURRENT_BINARY_DIR}") +message(STATUS "SPHINX BUILD ${CMAKE_CURRENT_BINARY_DIR}") file(MAKE_DIRECTORY ./output/doxygen) -if (DOXYGEN_FOUND) - -add_custom_target(Sphinx ALL - COMMAND - ${SPHINX_EXECUTABLE} -v -T -b html - ${SPHINX_SOURCE} ${CMAKE_CURRENT_SOURCE_DIR}/output - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/output - COMMENT "Generating documentation with Sphinx") - -# add_custom_target(ifcopenshell_python_docs ALL - # COMMAND make html - # WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../src/ifcblenderexport/docs - # OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/../src/ifcblenderexport/docs - # COMMENT "Generating documentation with Sphinx") - -else (DOXYGEN_FOUND) - message("Doxygen need to be installed to generate the doxygen documentation") -endif (DOXYGEN_FOUND) +if(DOXYGEN_FOUND) + add_custom_target( + Sphinx + ALL + COMMAND ${SPHINX_EXECUTABLE} -v -T -b html ${SPHINX_SOURCE} ${CMAKE_CURRENT_SOURCE_DIR}/output + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/output + COMMENT "Generating documentation with Sphinx" + ) + + # add_custom_target(ifcopenshell_python_docs ALL + # COMMAND make html + # WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../src/ifcblenderexport/docs + # OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/../src/ifcblenderexport/docs + # COMMENT "Generating documentation with Sphinx") +else(DOXYGEN_FOUND) + message("Doxygen need to be installed to generate the doxygen documentation") +endif(DOXYGEN_FOUND) diff --git a/nix/build-all.py b/nix/build-all.py index 448e3655ec8..4858907ce6d 100644 --- a/nix/build-all.py +++ b/nix/build-all.py @@ -1,4 +1,6 @@ #!/usr/bin/python +# /// script +# /// ############################################################################### # # # This file is part of IfcOpenShell. # @@ -75,27 +77,30 @@ # # # for python37 to install correctly additionally: # # * libffi(-dev[el]) # -# for Python build we also needs ssl # +# for Python build we also needs ssl and zlib # # (since we do `pip install numpy` at the end) # # * libssl-dev # # # # on debian 7.8 these can be obtained with: # # $ apt-get install git gcc g++ autoconf bison bzip2 cmake # # mesa-common-dev libffi-dev libfontconfig1-dev # -# libssl-dev xz # +# libssl-dev xz zlib1g-dev # # # # on ubuntu 14.04: # # $ apt-get install git gcc g++ autoconf bison make cmake # # mesa-common-dev libffi-dev libfontconfig1-dev # -# libssl-dev xz-utils # +# libssl-dev xz-utils zlib1g-dev # # # # on OS X El Capitan with homebrew: # # $ brew install git bison autoconf automake libffi cmake # +# $ # `bison` shipped with Mac is too old for swig build, # +# $ # so we use `brew`. # +# $ export PATH=$(brew --prefix bison)/bin:$PATH # # # # on RHEL-related distros: # -# $ yum install git gcc gcc-c++ autoconf bison make cmake # +# $ dnf install git gcc gcc-c++ autoconf bison make cmake # # mesa-libGL-devel libffi-devel fontconfig-devel bzip2 # -# automake patch byacc xz # +# automake patch byacc xz zlib-devel openssl-devel # """ @@ -123,13 +128,7 @@ from pathlib import Path from urllib.request import urlretrieve -try: - from typing import Literal, Union -except: - # python 3.6 compatibility for rocky 8 - from typing import Union - - from typing_extensions import Literal +from typing import Literal, Union logger = logging.getLogger(__name__) logger.setLevel(logging.INFO) @@ -147,9 +146,8 @@ BOOST_VERSION = "1.86.0" EIGEN_VERSION = "3.4.0" PCRE_VERSION = "8.41" -PCRE2_VERSION = "10.32" LIBXML2_VERSION = "2.13.8" -SWIG_VERSION = "4.1.0" +SWIG_VERSION = "4.2.1" OPENCOLLADA_VERSION = "v1.6.68" HDF5_VERSION = "1.13.1" @@ -246,15 +244,8 @@ def get_pyodide_build_version() -> "tuple[int, ...]": # https://github.com/pyodide/pyodide-build/pull/249 WASM_CMAKE_IS_USING_INIT_VARS = get_pyodide_build_version() >= (99, 0, 0) - # pyodide provide empty `CXXFLAGS`, leading to issues using C++ files compiled with `-fexceptions` - # which is used by OCCT. - # https://github.com/pyodide/pyodide-build/issues/251 - side_module_cxx_flags = os.environ.get("SIDE_MODULE_CXXFLAGS", "") - if side_module_cxx_flags.strip(): - print("SIDE_MODULE_CXXFLAGS are already passed from pyodide build ('{side_module_cxx_flags}').") - print("Maybe it's time to stop overriding them in the script?") - - os.environ["SIDE_MODULE_CXXFLAGS"] = os.environ["SIDE_MODULE_CFLAGS"] + # 0.31 is required for SIDE_MODULE_CXXFLAGS to be provided. + assert get_pyodide_build_version() >= (0, 31) # Set defaults for missing empty environment variables @@ -294,6 +285,7 @@ def get_pyodide_build_version() -> "tuple[int, ...]": if not os.path.exists(DEPS_DIR): os.makedirs(DEPS_DIR) +INSTALL_DIR = Path(DEPS_DIR) / "install" BUILD_CFG = os.getenv("BUILD_CFG", "RelWithDebInfo") @@ -319,24 +311,18 @@ def get_pyodide_build_version() -> "tuple[int, ...]": cecho(f"* Dependency Directory = {DEPS_DIR}", MAGENTA) cecho(f" - The directory where {PROJECT_NAME} dependencies are installed.") cecho(f"* Build Config Type = {BUILD_CFG}", MAGENTA) -cecho( - """ - The used build configuration type for the dependencies. - Defaults to RelWithDebInfo if not specified.""" -) +cecho(""" - The used build configuration type for the dependencies. + Defaults to RelWithDebInfo if not specified.""") if BUILD_CFG == "MinSizeRel": cecho(" WARNING: MinSizeRel build can suffer from a significant performance loss.", RED) cecho(f"* IFCOS_NUM_BUILD_PROCS = {IFCOS_NUM_BUILD_PROCS}", MAGENTA) -cecho( - """ - How many compiler processes may be run in parallel. -""" -) +cecho(""" - How many compiler processes may be run in parallel. +""") cecho(f" * IFCOS_SCHEMAS = '{os.environ.get('IFCOS_SCHEMAS')}'", MAGENTA) -cecho( - """ - IFC Schemas to compile. If not provided, fallback to default provided in cmake. -""" -) +cecho(""" - IFC Schemas to compile. If not provided, fallback to default provided in cmake. +""") dependency_tree: "dict[str, tuple[str, ...]]" = { "IfcParse": ("boost", "libxml2", "hdf5", "rocksdb"), @@ -345,13 +331,12 @@ def get_pyodide_build_version() -> "tuple[int, ...]": "OpenCOLLADA": ("libxml2", "pcre"), "IfcGeomServer": ("IfcGeom",), "IfcOpenShell-Python": ("python", "swig", "IfcGeom"), - "swig": ("pcre2",), + "swig": (), "boost": (), "libxml2": (), "python": (), "occ": (), "pcre": (), - "pcre2": (), "json": (), "hdf5": (), "cgal": (), @@ -418,7 +403,6 @@ def gather_dependencies(dep: str) -> "Generator[str]": "opencollada", "swig", "pcre", - "pcre2", "IfcGeom", "IfcConvert", "IfcGeomServer", @@ -433,13 +417,16 @@ def gather_dependencies(dep: str) -> "Generator[str]": # Check that required tools are in PATH yacc = "yacc" # Used during swig building process, installed with `bison` on Debian / `byacc` on Red Hat. +bison = "bison" + missing_commands: "list[str]" = [] -required_commands = [git, bunzip2, tar, cc, cplusplus, autoconf, automake, make, "patch", "cmake", yacc, xz] +required_commands = [git, bunzip2, tar, cc, cplusplus, autoconf, automake, make, "patch", "cmake", yacc, xz, bison] if "wasm" in flags: # Skip swig build for WASM. required_commands.append("swig") required_commands.append("pyodide") required_commands.remove(yacc) + required_commands.remove(bison) for cmd in required_commands: if shutil.which(cmd) is None: @@ -498,7 +485,7 @@ def stream_reader(pipe, collector: "list[str]", log_file) -> None: collector.append(line) pipe.close() - logger.debug(f"running command {' '.join(cmds)} in directory {cwd}") + logger.debug(f"running command `{' '.join(cmds)}` in directory '{cwd}'") stdout: list[str] = [] stderr: list[str] = [] @@ -544,14 +531,14 @@ def stream_reader(pipe, collector: "list[str]", log_file) -> None: # Helper functions -def run_autoconf(arg1: str, configure_args: "list[str]", cwd: str) -> None: +def run_autoconf(dependency_name: str, configure_args: "list[str]", cwd: str) -> None: configure_path = os.path.realpath(os.path.join(cwd, "..", "configure")) if not os.path.exists(configure_path): run( [bash, "./autogen.sh"], cwd=os.path.realpath(os.path.join(cwd, "..")) ) # only run autogen.sh in the directory it is located and use cwd to achieve that in order to not mess up things # Using `sh` over `bash` fixes issues with building swig - prefix = os.path.realpath(f"{DEPS_DIR}/install/{arg1}") + prefix = os.path.realpath(f"{DEPS_DIR}/install/{dependency_name}") wasm = [] if "wasm" in flags: @@ -930,20 +917,15 @@ def build_dependency( restore_env("CC", OLD_CC) restore_env("CXX", OLD_CXX) -if "pcre2" in targets: - build_dependency( - name=f"pcre2-{PCRE2_VERSION}", - mode="autoconf", - build_tool_args=[DISABLE_FLAG], - download_url=f"https://downloads.sourceforge.net/project/pcre/pcre2/{PCRE2_VERSION}/", - download_name=f"pcre2-{PCRE2_VERSION}.tar.bz2", - ) - if "swig" in targets: + dependency_name = f"swig-{SWIG_VERSION}" build_dependency( - name=f"swig-{SWIG_VERSION}", - mode="autoconf", - build_tool_args=["--disable-ccache", f"--with-pcre2-prefix={DEPS_DIR}/install/pcre2-{PCRE2_VERSION}"], + name=dependency_name, + mode="cmake", + build_tool_args=[ + "-DWITH_PCRE=OFF", + f"-DCMAKE_INSTALL_PREFIX={DEPS_DIR}/install/{dependency_name}", + ], download_url="https://github.com/swig/swig.git", download_name="swig", download_tool=download_tool_git, @@ -951,21 +933,18 @@ def build_dependency( ) if USE_OCCT and "occ" in targets: - patches = [] + occt_args: "list[str]" = [] + patches: "list[str]" = [] if OCCT_VERSION < "7.4": patches.append("./patches/occt/enable-exception-handling.patch") - if OCCT_VERSION == "7.7.1": + # Skip ExpToCasExe as we don't need it and it requires additional dependencies. + # Before 7.7.2 ExpToCasExe is part of DataExchange, DETools doesn't exist yet. + # Since we do need DataExchange (used for IgesSerializer), we use a patch to skip only ExpToCasExe. + if "7.7.2" > OCCT_VERSION >= "7.7": patches.append("./patches/occt/no_ExpToCasExe.patch") - - if OCCT_VERSION == "7.7.2": - patches.append("./patches/occt/no_ExpToCasExe_7_7_2.patch") - - if OCCT_VERSION == "7.8.1": - patches.append("./patches/occt/no_ExpToCasExe_7_8_1.patch") - - if OCCT_VERSION == "7.9.1": - patches.append("./patches/occt/no_ExpToCasExe_7_9_1.patch") + elif OCCT_VERSION >= "7.7.2": + occt_args.append("-DBUILD_MODULE_DETools=OFF") if "wasm" in flags: patches.append("./patches/occt/no_em_js.patch") @@ -986,6 +965,7 @@ def build_dependency( f"-DUSE_GLES2=OFF", f"-DCMAKE_POLICY_VERSION_MINIMUM=3.5", *MAC_CROSS_COMPILE_INTEL_ARGS, + *occt_args, ], download_url="https://github.com/Open-Cascade-SAS/OCCT", download_name="occt", @@ -1101,23 +1081,28 @@ def build_dependency( PYTHON_CONFIGURE_ARGS.extend(["--with-universal-archs=intel-64", "--enable-universalsdk"]) for PYTHON_VERSION in PYTHON_VERSIONS: + # Don't fail silently on missing Python dependencies (e.g. openssl or zlib), + # because later ifcopenshell-python build will fail too but in a more confusing way. + build_dependency( + f"python-{PYTHON_VERSION}", + "autoconf", + PYTHON_CONFIGURE_ARGS, + f"http://www.python.org/ftp/python/{PYTHON_VERSION}/", + f"Python-{PYTHON_VERSION}.tgz", + ) + python_install = INSTALL_DIR / f"python-{PYTHON_VERSION}" + python_bin = python_install / "bin" / "python3" + # `_ssl` module is present -> we will be able to install `numpy` later + # to verify IfcOpenShell installation try: - build_dependency( - f"python-{PYTHON_VERSION}", - "autoconf", - PYTHON_CONFIGURE_ARGS, - f"http://www.python.org/ftp/python/{PYTHON_VERSION}/", - f"Python-{PYTHON_VERSION}.tgz", + run([str(python_bin), "-c", "import _ssl"]) + except RuntimeError: + print( + "ERROR: Python was built without SSL support (_ssl module is missing). " + f"To fix this: remove the installed Python at {python_install}; " + "install OpenSSL development libraries and re-run." ) - except RuntimeError as e: - # Sometimes setting up modules such as pip/lzma can cause - # the python installer script to return a non zero exit - # code where actually the headers and dynamic libraries - # are installed correctly. This is all we need so we catch - # the exception and only reraise if a partially successful - # install is not detected. - if not os.path.exists(os.path.join(DEPS_DIR, "install", f"python-{PYTHON_VERSION}")): - raise e + raise if MAC_CROSS_COMPILE_INTEL: assert original_path @@ -1177,6 +1162,8 @@ def build_dependency( # Disable assembly, otherwise `emcc -c conftest.s` will crash due to assembly mismatch. gmp_args.extend(("--disable-assembly", "--enable-cxx")) mpfr_args.extend(("--host", "none")) + elif "x86" in arch: + gmp_args.append("--enable-fat") # See issues #7458 #7556 OLD_CC = None if MAC_CROSS_COMPILE_INTEL: @@ -1533,13 +1520,16 @@ def compile_python_wrapper( ) # Copy setup.py where pyodide build system expects it. shutil.copy(REPO_PATH / "pyodide" / "setup.py", REPO_PATH) + # Empty pyproject so it's contents won't affect the resulting wheel + # otherwise the wheel will use version and dependencies from toml, not setup.py. + (REPO_PATH / "pyproject.toml").write_text("") elif USE_CURRENT_PYTHON_VERSION: python_info = sysconfig.get_paths() compile_python_wrapper(platform.python_version(), python_info["include"], sys.executable) else: for python_version in PYTHON_VERSIONS: - python_path = Path(DEPS_DIR) / "install" / f"python-{python_version}" + python_path = INSTALL_DIR / f"python-{python_version}" module_dir = compile_python_wrapper(python_version, python_path=python_path) assert module_dir # Not sure why, but added after reading this in the logs diff --git a/pyodide/cache_dependencies.py b/nix/cache_dependencies.py similarity index 71% rename from pyodide/cache_dependencies.py rename to nix/cache_dependencies.py index 5800cba0674..7d231779ee0 100644 --- a/pyodide/cache_dependencies.py +++ b/nix/cache_dependencies.py @@ -1,3 +1,5 @@ +# /// script +# /// """ Cache built dependencies for builds. @@ -5,9 +7,13 @@ packs each folder into a tar.gz archive, if it wasn't packed before, or unpacks existing archives. +Expected to be executed from 'build' directory (e.g. that might contain 'Linux/x86_64/install'). + Usage: python cache_dependencies.py [pack|unpack] """ +import platform +import subprocess import sys import tarfile from pathlib import Path @@ -17,23 +23,35 @@ def get_install_dir() -> Path: - for data in Path.cwd().glob("*/*/install"): + if platform.system() == "Darwin": + pattern = "Darwin/*/*/install" + else: + pattern = "*/*/install" + for data in Path.cwd().glob(pattern): return data raise Exception("No install dir found") +def run(cmd: str) -> None: + print(f"Running command: `{cmd}`") + subprocess.check_call(cmd, shell=True) + + def pack_dependencies(install_dir: Path) -> None: # Process each install_dir for dependency_path in install_dir.iterdir(): if not dependency_path.is_dir(): continue dependency_name = dependency_path.name + # Skip ifcopenshell - it's a build output, not a dependency to reuse across builds. + if dependency_name == "ifcopenshell": + continue tar_path = install_dir / f"{CACHE_PREFIX}{dependency_name}.tar.gz" if tar_path.exists(): print(f"Skipping existing cache: '{tar_path}'") else: - with tarfile.open(tar_path, "w:gz") as tar: - tar.add(dependency_path, arcname=dependency_path.name) + # Python's `tarfile` is 10x slower than `tar` cli, so we use `tar`. + run(f'tar -czf "{tar_path}" -C "{install_dir}" "{dependency_name}"') print(f"Created cache: '{tar_path}'") diff --git a/nix/patches/occt/no_ExpToCasExe.patch b/nix/patches/occt/no_ExpToCasExe.patch index 6e10f2a9fba..2f998459252 100644 --- a/nix/patches/occt/no_ExpToCasExe.patch +++ b/nix/patches/occt/no_ExpToCasExe.patch @@ -1,13 +1,9 @@ -diff --git a/CMakeLists.txt b/CMakeLists.txt -index fd17283f77..6cecf9dad3 100644 ---- a/CMakeLists.txt -+++ b/CMakeLists.txt -@@ -826,6 +826,8 @@ if (EMSCRIPTEN) - list (REMOVE_ITEM BUILD_TOOLKITS ExpToCasExe) - endif() - -+list (REMOVE_ITEM BUILD_TOOLKITS ExpToCasExe) -+ - # bison - if (BUILD_YACCLEX) - OCCT_INCLUDE_CMAKE_FILE ("adm/cmake/bison") +--- a/adm/MODULES ++++ b/adm/MODULES +@@ -3,5 +3,5 @@ ModelingData TKG2d TKG3d TKGeomBase TKBRep + ModelingAlgorithms TKGeomAlgo TKTopAlgo TKPrim TKBO TKBool TKHLR TKFillet TKOffset TKFeat TKMesh TKXMesh TKShHealing + Visualization TKService TKV3d TKOpenGl TKOpenGles TKMeshVS TKIVtk TKD3DHost + ApplicationFramework TKCDF TKLCAF TKCAF TKBinL TKXmlL TKBin TKXml TKStdL TKStd TKTObj TKBinTObj TKXmlTObj TKVCAF +-DataExchange TKXDE TKXSBase TKSTEPBase TKSTEPAttr TKSTEP209 TKSTEP TKIGES TKXCAF TKXDEIGES TKXDESTEP TKSTL TKVRML TKXmlXCAF TKBinXCAF TKRWMesh TKXDECascade TKExpress ExpToCasExe ++DataExchange TKXDE TKXSBase TKSTEPBase TKSTEPAttr TKSTEP209 TKSTEP TKIGES TKXCAF TKXDEIGES TKXDESTEP TKSTL TKVRML TKXmlXCAF TKBinXCAF TKRWMesh TKXDECascade TKExpress + Draw TKDraw TKTopTest TKOpenGlTest TKOpenGlesTest TKD3DHostTest TKViewerTest TKXSDRAW TKDCAF TKXDEDRAW TKTObjDRAW TKQADraw TKIVtkDraw DRAWEXE diff --git a/nix/patches/occt/no_ExpToCasExe_7_7_2.patch b/nix/patches/occt/no_ExpToCasExe_7_7_2.patch deleted file mode 100644 index 8b9f924e83f..00000000000 --- a/nix/patches/occt/no_ExpToCasExe_7_7_2.patch +++ /dev/null @@ -1,13 +0,0 @@ -diff --git a/CMakeLists.txt b/CMakeLists.txt -index 1bacca1a48..11f931ad39 100644 ---- a/CMakeLists.txt -+++ b/CMakeLists.txt -@@ -820,6 +820,8 @@ else() - OCCT_CHECK_AND_UNSET ("3RDPARTY_DOT_EXECUTABLE") - endif() - -+list (REMOVE_ITEM BUILD_TOOLKITS ExpToCasExe) -+ - # bison - if (BUILD_YACCLEX) - OCCT_INCLUDE_CMAKE_FILE ("adm/cmake/bison") diff --git a/nix/patches/occt/no_ExpToCasExe_7_8_1.patch b/nix/patches/occt/no_ExpToCasExe_7_8_1.patch deleted file mode 100644 index 63d6fd3206c..00000000000 --- a/nix/patches/occt/no_ExpToCasExe_7_8_1.patch +++ /dev/null @@ -1,13 +0,0 @@ -diff --git a/CMakeLists.txt b/CMakeLists.txt -index 86905287dc..9d0bce984c 100644 ---- a/CMakeLists.txt -+++ b/CMakeLists.txt -@@ -828,6 +828,8 @@ else() - OCCT_CHECK_AND_UNSET ("3RDPARTY_DOT_EXECUTABLE") - endif() - -+list (REMOVE_ITEM BUILD_TOOLKITS ExpToCasExe) -+ - # bison - if (BUILD_YACCLEX) - OCCT_INCLUDE_CMAKE_FILE ("adm/cmake/bison") diff --git a/nix/patches/occt/no_ExpToCasExe_7_9_1.patch b/nix/patches/occt/no_ExpToCasExe_7_9_1.patch deleted file mode 100644 index abe2b20ef94..00000000000 --- a/nix/patches/occt/no_ExpToCasExe_7_9_1.patch +++ /dev/null @@ -1,13 +0,0 @@ -diff --git a/CMakeLists.txt b/CMakeLists.txt -index 34300d41ad..09b2e0d45f 100644 ---- a/CMakeLists.txt -+++ b/CMakeLists.txt -@@ -721,6 +721,8 @@ else() - OCCT_CHECK_AND_UNSET ("3RDPARTY_DOT_EXECUTABLE") - endif() - -+list (REMOVE_ITEM BUILD_TOOLKITS ExpToCasExe) -+ - # bison - if (BUILD_YACCLEX) - list (APPEND OCCT_3RDPARTY_CMAKE_LIST "adm/cmake/bison") diff --git a/pyodide/build_pyodide.sh b/pyodide/build_pyodide.sh index 2994a44ae6d..205ee5395f5 100755 --- a/pyodide/build_pyodide.sh +++ b/pyodide/build_pyodide.sh @@ -1,26 +1,28 @@ #!/usr/bin/bash set -ex +PYODIDE_VERSION=0.29.3 +PYODIDE_BUILD_VERSION=0.33.0 + +# Script is assuming that it will be possible to execute it multiple times +# therefore we're clearing venv each time and ignoring existing 'emsdk' folder. + # Install uv. curl -LsSf https://astral.sh/uv/install.sh | sh -uv venv --python 3.13 +uv venv --python 3.13 --clear source .venv/bin/activate # Install pyodide cross build environment. # Instructions: https://pyodide.org/en/stable/development/building-packages.html -uv pip install pyodide-build +uv pip install "pyodide-build==${PYODIDE_BUILD_VERSION}" # `uv run` is required, so xbuildenv would skip using `pip`. -uv run pyodide xbuildenv install - -# Emscripten doesn't come with xbuildenv. -git clone https://github.com/emscripten-core/emsdk -pushd emsdk -PYODIDE_EMSCRIPTEN_VERSION=$(pyodide config get emscripten_version) -./emsdk install ${PYODIDE_EMSCRIPTEN_VERSION} -./emsdk activate ${PYODIDE_EMSCRIPTEN_VERSION} -source emsdk_env.sh +uv run pyodide xbuildenv install "${PYODIDE_VERSION}" +uv run pyodide xbuildenv install-emscripten + +EMSDK_ROOT=$(pyodide config get emscripten_dir) +[ -f "${EMSDK_ROOT}/emsdk_env.sh" ] && source "${EMSDK_ROOT}/emsdk_env.sh" +[ -f "${EMSDK_ROOT}/../../emsdk_env.sh" ] && source "${EMSDK_ROOT}/../../emsdk_env.sh" which emcc -popd mkdir -p packages/ifcopenshell VERSION=`cat IfcOpenShell/VERSION` diff --git a/pyodide/pack_wheel.py b/pyodide/pack_wheel.py new file mode 100644 index 00000000000..7b6c2a63d5c --- /dev/null +++ b/pyodide/pack_wheel.py @@ -0,0 +1,232 @@ +# +# /// script +# # Latest Pyodide build env versions are listed here: +# # https://pyodide.github.io/pyodide/api/pyodide-cross-build-environments.json +# # https://github.com/pyodide/pyodide-build/blob/main/pyodide_build/xbuildenv_releases.py +# requires-python = "==3.13.2" +# dependencies = [ +# "requests", +# "setuptools", +# ] +# /// +""" +Pack an IfcOpenShell WASM wheel using Pyodide build system. + +Usage: + uv run make_wheel.py # Show this help + uv run make_wheel.py --build # Build wheel + uv run make_wheel.py --clean # Clean build artifacts and exit +""" + +import argparse +import os +import re +import shutil +import subprocess +import time +import zipfile +from pathlib import Path +from urllib.parse import quote + +import requests + +# Get repo root (parent of this script's parent directory) +REPO_ROOT = Path(__file__).parent.parent +PYODIDE_DIR = REPO_ROOT / "pyodide" +BUILD_DIR = PYODIDE_DIR / "build" + +# Hardcoded path (Windows packing workaround with --dev flag) +PYODIDE_BUILD = Path(r"L:\Projects\Github\pyodide-build") + +# Wheel platform tag (from PYODIDE_EMSCRIPTEN_VERSION in pyodide-build/Makefile.envs) +WHEEL_PLATFORM_TAG = "emscripten_4_0_9_wasm32" + +# Location where ifcopenshell will be extracted +IFCOPENSHELL_DIR = PYODIDE_DIR / "ifcopenshell" + + +class WheelBuilder: + @staticmethod + def extract_ifcopenshell_from_git(dst: Path) -> None: + """Extract ifcopenshell directory from git repo into destination.""" + Tools.rmrf(dst) + + print(f"Extracting ifcopenshell from git to {dst}...") + # Use git ls-files piped to git checkout-index to avoid copying + # untracked or ignored files from the actual repo. + ls_proc = subprocess.Popen( + ["git", "ls-files", "-z", "src/ifcopenshell-python/ifcopenshell"], + cwd=REPO_ROOT, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + ) + checkout_proc = subprocess.Popen( + ["git", "checkout-index", "-z", "--prefix", "pyodide/", "--stdin"], + cwd=REPO_ROOT, + stdin=ls_proc.stdout, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + ) + assert ls_proc.stdout is not None + ls_proc.stdout.close() + checkout_proc.communicate() + + if checkout_proc.returncode != 0: + assert checkout_proc.stderr is not None + raise RuntimeError(f"Failed to extract: {checkout_proc.stderr.decode()}") + + # Move src/ifcopenshell-python/ifcopenshell to ifcopenshell. + temp_src = PYODIDE_DIR / "src" / "ifcopenshell-python" / "ifcopenshell" + shutil.move(temp_src, dst) + + # Clean up temporary src directory. + Tools.rmrf(PYODIDE_DIR / "src") + + print("✓ Extracted ifcopenshell from git") + + @staticmethod + def get_wheel_url(makefile_path: Path) -> str: + """Get S3 wheel URL based on BINARY_VERSION and BUILD_COMMIT from Makefile.""" + + def parse_makefile_vars() -> dict[str, str]: + content = makefile_path.read_text() + vars: dict[str, str] = {} + for match in re.finditer(r"^(BINARY_VERSION|BUILD_COMMIT):=(.+)$", content, re.MULTILINE): + vars[match.group(1)] = match.group(2).strip() + return vars + + vars: dict[str, str] = parse_makefile_vars() + binary_version = vars["BINARY_VERSION"] + build_commit = vars["BUILD_COMMIT"] + filename = f"ifcopenshell-{binary_version}+{build_commit}-cp313-cp313-pyodide_2025_0_wasm32.whl" + encoded_filename = quote(filename, safe="") + return f"https://s3.amazonaws.com/ifcopenshell-builds/{encoded_filename}" + + @staticmethod + def download_and_extract_so(url: str, build_dir: Path) -> tuple[Path, Path]: + """Download wheel from URL and extract .so and .py files.""" + py_wrapper_filename = "ifcopenshell_wrapper.py" + build_dir.mkdir(parents=True, exist_ok=True) + + wheel_path = build_dir / url.rsplit("/", 1)[-1] + + if wheel_path.exists(): + print(f"Using cached wheel: {wheel_path}") + else: + print(f"Downloading {url}...") + response = requests.get(url) + response.raise_for_status() + wheel_path.write_bytes(response.content) + + print("Extracting _ifcopenshell_wrapper files...") + with zipfile.ZipFile(wheel_path) as zf: + so_files = [f for f in zf.namelist() if f.endswith(".so")] + py_files = [f for f in zf.namelist() if f.endswith(py_wrapper_filename)] + + assert so_files, "No .so file found in wheel" + assert py_files, f"No {py_wrapper_filename} file found in wheel" + + so_file = so_files[0] + so_dst = build_dir / Path(so_file).name + so_dst.write_bytes(zf.read(so_file)) + + py_file = py_files[0] + py_dst = build_dir / Path(py_file).name + py_dst.write_bytes(zf.read(py_file)) + + return so_dst, py_dst + + +class Tools: + @staticmethod + def run( + cmd: list[str], + cwd: Path | None = None, + ) -> None: + print(f"$ {' '.join(cmd)}") + subprocess.check_call(cmd, cwd=cwd) + + @staticmethod + def create_symlink(dst: Path, src: Path) -> None: + Tools.rmrf(dst) + dst.symlink_to(src) + + @staticmethod + def rmrf(path: Path) -> None: + if path.exists() or path.is_symlink(): + if path.is_dir() and not path.is_symlink(): + shutil.rmtree(path) + else: + path.unlink() + + +def clean() -> None: + """Remove build artifacts.""" + paths_to_remove = ( + BUILD_DIR, + PYODIDE_DIR / ".pyodide_build", + PYODIDE_DIR / "dist", + PYODIDE_DIR / "ifcopenshell.egg-info", + PYODIDE_DIR / "src", + IFCOPENSHELL_DIR, + ) + for path in paths_to_remove: + if path.exists() or path.is_symlink(): + print(f"Removing {path}...") + Tools.rmrf(path) + print("✓ Clean complete") + + +def main() -> None: + parser = argparse.ArgumentParser(description=__doc__, add_help=False) + parser.add_argument("--build", action="store_true", help="Build the wheel") + parser.add_argument("--clean", action="store_true", help="Clean build folder") + parser.add_argument( + "--dev", + action="store_true", + help="Use editable pyodide-build from hardcoded path (Windows packing workaround)", + ) + args = parser.parse_args() + + if not args.build and not args.clean: + print(__doc__) + return + + if args.clean: + clean() + return + + start_time = time.time() + + WheelBuilder.extract_ifcopenshell_from_git(IFCOPENSHELL_DIR) + + print("Downloading and extracting _ifcopenshell_wrapper files...") + makefile = REPO_ROOT / "src" / "ifcopenshell-python" / "Makefile" + wheel_url = WheelBuilder.get_wheel_url(makefile) + so_file, py_file = WheelBuilder.download_and_extract_so(wheel_url, BUILD_DIR) + + Tools.create_symlink(IFCOPENSHELL_DIR / Path(so_file).name, so_file) + Tools.create_symlink(IFCOPENSHELL_DIR / Path(py_file).name, py_file) + + print("Installing pyodide-build...") + if args.dev: + Tools.run(["uv", "pip", "install", "-e", str(PYODIDE_BUILD)]) + else: + Tools.run(["uv", "pip", "install", "pyodide-build"]) + + print("Building with pyodide...") + # Use --no-isolation due to pyodide-build Windows support issues: + # symlink_unisolated_packages fails with missing `_sysconfigdata_$(CPYTHON_ABI_FLAGS)_emscripten_wasm32-emscripten.py`. + # Hardcode platform name since pyodide doesn't yet support overriding wheel tags on Windows. + # + # Use `LEGACY_PLATFORM` since pyodide 0.34.1 introduced new tag for wheels `pyemscripten`, + # which doesn't work with pyodide itself yet - https://github.com/pyodide/pyodide/issues/6177. + os.environ["USE_LEGACY_PLATFORM"] = "1" + Tools.run(["pyodide", "build", f"-C--build-option=--plat-name={WHEEL_PLATFORM_TAG}"]) + + elapsed = time.time() - start_time + print(f"\n✓ Done! ({elapsed:.1f}s)") + + +if __name__ == "__main__": + main() diff --git a/pyodide/setup.py b/pyodide/setup.py index 9678de0ac3e..474a0b45a42 100644 --- a/pyodide/setup.py +++ b/pyodide/setup.py @@ -2,12 +2,16 @@ # because `tool.setuptools.ext-modules` is still experimental in pyproject.toml # and we need it to get the wheel suffix right. import os +import sys from pathlib import Path import tomllib from setuptools import Extension, find_packages, setup +from setuptools.command.build_ext import build_ext -REPO_FOLDER = Path(__file__).parent +# Detect repo folder: if setup.py is in pyodide folder, go to parent +SETUP_DIR = Path(__file__).parent +REPO_FOLDER = SETUP_DIR.parent if SETUP_DIR.name == "pyodide" else SETUP_DIR def get_version() -> str: @@ -25,6 +29,39 @@ def get_dependencies() -> list[str]: return dependencies +class UnixBuildExt(build_ext): + """Customize ``build_ext`` to support packing on Windows.""" + + def finalize_options(self): + from distutils import sysconfig + + super().finalize_options() + if sys.platform == "win32": + self.compiler = "unix" + + # Configure sysconfig for Windows builds + # CCSHARED is the only variable that's not customizable with env vars. + # Basically avoiding this: + # File ".venv\Lib\site-packages\setuptools\_distutils\sysconfig.py", line 366, in customize_compiler + # compiler_so=cc_cmd + ' ' + ccshared, + # ~~~~~~~~~~~~~^~~~~~~~~~ + # TypeError: can only concatenate str (not "NoneType") to str + sysconfig.get_config_vars() # Initialize config cache + if sysconfig._config_vars.get("CCSHARED") is None: + sysconfig._config_vars["CCSHARED"] = "-fPIC" + # Override compiler type before it's instantiated + + # Set Emscripten compiler environment variables + os.environ["CC"] = "emcc" + os.environ["CXX"] = "em++" + os.environ["CFLAGS"] = "" + os.environ["CXXFLAGS"] = "" + os.environ["LDSHARED"] = "emcc -shared" + os.environ["AR"] = "emar" + os.environ["ARFLAGS"] = "rcs" + os.environ["SETUPTOOLS_EXT_SUFFIX"] = ".cpython-313-wasm32-emscripten.so" + + setup( name="ifcopenshell", version=get_version(), @@ -44,4 +81,5 @@ def get_dependencies() -> list[str]: }, # Has to provide extension to get the correct wheel suffix. ext_modules=[Extension("ifcopenshell._ifcopenshell_wrapper", sources=[])], + cmdclass={"build_ext": UnixBuildExt}, ) diff --git a/pyproject.toml b/pyproject.toml index 8df2bb8091f..45c0b357a8b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -2,10 +2,11 @@ name = "IfcOpenShell" version = "0.0.0" dependencies = [ - "black==25.12", - "ruff==0.14.10", + "black==26.3.1", + "ruff==0.15.10", "poethepoet", - "gersemi==0.24", + "ty==0.0.29", + "gersemi==0.26.1", ] [tool.black] @@ -15,7 +16,8 @@ include = ''' |nix/.*.pyi?$ ''' extend-exclude = ''' - src/ifcopenshell-python/ifcopenshell/express/* + src/ifcopenshell-python/ifcopenshell/express/rules/* + |src/ifcopenshell-python/ifcopenshell/express/express_parser.py |src/ifcopenshell-python/ifcopenshell/mvd/* |src/ifcopenshell-python/ifcopenshell/simple_spf/* |src/ifc2ca/templates/* @@ -27,6 +29,15 @@ extend-exclude = ''' reportInvalidTypeForm = false disableBytesTypePromotions = true reportUnnecessaryTypeIgnoreComment = true +reportRedeclaration = false +# Ignore warnings from bpy stubs missing actual source files. +reportMissingModuleSource = false +# Pylance doesn't respect gitignore, so we have to exclude files manually here +# to avoid VS Code slowing down. +# https://github.com/microsoft/pylance-release/issues/5169 +exclude = [ + "_deps", +] # Define here general ruff settings, # then they will be inherited by projects' .toml files. @@ -71,15 +82,184 @@ ignore = [ "UP032", # Replace .format with f-string ] +[tool.ty.rules] +all = "ignore" + +# Structural rules (no deep type inference needed, easier to adapt). +abstract-method-in-final-class = "error" +ambiguous-protocol-member = "error" +conflicting-declarations = "error" +conflicting-metaclass = "error" +cyclic-class-definition = "error" +cyclic-type-alias-definition = "error" +dataclass-field-order = "error" +duplicate-base = "error" +duplicate-kw-only = "error" +empty-body = "error" +escape-character-in-forward-annotation = "error" +final-on-non-method = "error" +final-without-value = "error" +ignore-comment-unknown-rule = "error" +implicit-concatenated-string-type-annotation = "error" +inconsistent-mro = "error" +ineffective-final = "error" +instance-layout-conflict = "error" +invalid-dataclass = "error" +invalid-dataclass-override = "error" +invalid-enum-member-annotation = "error" +invalid-explicit-override = "error" +invalid-frozen-dataclass-subclass = "error" +invalid-generic-class = "error" +invalid-generic-enum = "error" +invalid-ignore-comment = "error" +invalid-legacy-positional-parameter = "error" +invalid-legacy-type-variable = "error" +invalid-named-tuple = "error" +invalid-newtype = "error" +invalid-overload = "error" +invalid-paramspec = "error" +invalid-protocol = "error" +invalid-syntax-in-forward-annotation = "error" +invalid-total-ordering = "error" +invalid-type-alias-type = "error" +invalid-type-checking-constant = "error" +invalid-type-guard-definition = "error" +invalid-type-variable-bound = "error" +invalid-type-variable-constraints = "error" +invalid-typed-dict-header = "error" +invalid-typed-dict-statement = "error" +override-of-final-method = "error" +override-of-final-variable = "error" +possibly-missing-import = "error" +possibly-missing-submodule = "error" +# Has false positives due to ty walrus operator bug. +# possibly-unresolved-reference = "error" +raw-string-type-annotation = "error" +redundant-final-classvar = "error" +shadowed-type-variable = "error" +subclass-of-final-class = "error" +super-call-in-named-tuple-method = "error" +unavailable-implicit-super-arguments = "error" +unbound-type-variable = "error" +undefined-reveal = "error" +unresolved-global = "error" +unresolved-import = "error" +unresolved-reference = "error" +unused-ignore-comment = "error" +unused-type-ignore-comment = "error" +useless-overload-body = "error" + +# Non-structural rules: +deprecated = "error" +zero-stepsize-in-slice = "error" +possibly-missing-implicit-call = "error" +unused-awaitable = "error" + +# Function argument rules: +# Conflicts with `ifcopenshell.api.geometry.add_representation` type of callables we have, confusing them with a module. +# call-non-callable = "error" +conflicting-argument-forms = "error" +# Too many false positives. +# invalid-argument-type = "error" +missing-argument = "error" +parameter-already-assigned = "error" +positional-only-parameter-as-kwarg = "error" +too-many-positional-arguments = "error" +unknown-argument = "error" +# Has a lot of warnings due to current ty walrus operator issues. +# index-out-of-bounds = "error" +# unresolved-attribute = "error" + +[tool.ty.environment] +extra-paths = [ + "src/bonsai/external_dependencies", + "src/bcf", + "src/bsdd", + "src/bonsai", + "src/ifc4d", + "src/ifc5d", + "src/ifccityjson", + "src/ifcclash", + "src/ifccsv", + "src/ifcdiff", + "src/ifcfm", + "src/ifcopenshell-python", + "src/ifcpatch", + "src/ifctester", +] + +[tool.ty.src] +exclude = [ + # External dependencies cloned for type checking only. + "src/bonsai/external_dependencies", + # Submodules. + "src/ifcopenshell-python/ifcopenshell/express", + "src/ifcopenshell-python/ifcopenshell/mvd", + "src/ifcopenshell-python/ifcopenshell/simple_spf", + "src/svgfill/3rdparty", + # Has special dependencies. + "src/ifcopenshell-python/ifcopenshell/geom/app.py", + "src/ifcopenshell-python/ifcopenshell/geom/code_editor_pane.py", + "src/ifcopenshell-python/ifcopenshell/util/doc.py", + "src/ifcopenshell-python/ifcopenshell/util/generate_pset_templates.py", + "src/ifcopenshell-python/ifcopenshell/util/ifc4x3dev_scrape_data_for_docs.py", + # Too esoteric. + "src/ifcopenshell-python/ifcopenshell/ifcopenshell_wrapper.py", + "src/ifc2ca/templates", + # Too dev. + "src/bcf/setup.py", + "src/bsdd/yml_to_classes.py", + # Deprecated. + "src/ifc2ca/_deprecated", +] + [tool.poe.tasks] -ruff-main = "ruff check --extend-exclude nix/build-all.py" -# It's actually Python 3.6, but ruff only supports 3.7+, but it should do. -ruff-old = "ruff check nix/build-all.py --target-version py37" -ruff.sequence = ["ruff-main", "ruff-old"] +ruff = "ruff check" black = "black ." -format.sequence = ["black", "ruff-main", "ruff-old"] +ty.sequence = ["ty-bonsai", "ty-ios"] +ty.help = "Run ty type checker. Requires ty-venv to be set up first." +ty-bonsai = "ty check src/bonsai --python=src/bonsai/.venv" + +ty-venv.sequence = ["bonsai-deps", "ty-venv-bonsai", "ty-venv-ios"] + +ty-venv-bonsai.sequence = [ + {cmd = "uv venv src/bonsai/.venv --python=3.11 --allow-existing"}, + {cmd = "uv pip install -r src/bonsai/type-check-requirements.txt --python=src/bonsai/.venv"}, +] + +ty-venv-ios.sequence = [ + {cmd = "uv venv src/ifcopenshell-python/.venv --python=3.10 --allow-existing"}, + {cmd = "uv pip install -r src/ifcopenshell-python/type-check-requirements.txt --python=src/ifcopenshell-python/.venv"}, +] + +format.sequence = ["black", "ruff"] + +cmake-format = "gersemi . --in-place" + +[tool.poe.tasks.ty-ios] +# --ignore unresolved-reference: walrus operator false positives in ty. +cmd = """ + ty check + src/bcf + src/bsdd + src/ifc2ca + src/ifc4d + src/ifc5d + src/ifccityjson + src/ifcclash + src/ifccsv + src/ifcdiff + src/ifcfm + src/ifcopenshell-python + src/ifcpatch + src/ifctester + --python=src/ifcopenshell-python/.venv + --ignore unresolved-reference +""" -cmake-format = "gersemi cmake src --in-place" +[tool.poe.tasks.bonsai-deps] +help = "Clone or update Bonsai external dependencies." +cmd = "python src/bonsai/scripts/bonsai_deps.py" diff --git a/src/bcf/bcf/agnostic/topic.py b/src/bcf/bcf/agnostic/topic.py index 1e77f40e974..a25f4af4827 100644 --- a/src/bcf/bcf/agnostic/topic.py +++ b/src/bcf/bcf/agnostic/topic.py @@ -2,6 +2,8 @@ from pathlib import Path from typing import Optional, Union +from typing_extensions import assert_never + import bcf.agnostic.model as mdl import bcf.v2.bcfxml import bcf.v2.model @@ -9,7 +11,6 @@ import bcf.v3.bcfxml import bcf.v3.model import bcf.v3.topic -from typing_extensions import assert_never TopicHandler = Union[bcf.v2.topic.TopicHandler, bcf.v3.topic.TopicHandler] diff --git a/src/bcf/bcf/v2/model/extensions.py b/src/bcf/bcf/v2/model/extensions.py index e50277570ec..695027bc6ce 100644 --- a/src/bcf/bcf/v2/model/extensions.py +++ b/src/bcf/bcf/v2/model/extensions.py @@ -14,7 +14,7 @@ # Currently extensions support for v2 is only read-only. -from dataclasses import dataclass, field, fields +from dataclasses import dataclass, field from typing import Optional diff --git a/src/bcf/bcf/v2/topic.py b/src/bcf/bcf/v2/topic.py index 30506d734d3..2f69a0c18aa 100644 --- a/src/bcf/bcf/v2/topic.py +++ b/src/bcf/bcf/v2/topic.py @@ -3,11 +3,10 @@ from __future__ import annotations import datetime -import tempfile import uuid import zipfile from pathlib import Path -from typing import Any, NoReturn, Optional, Union +from typing import Any, NoReturn, Optional import numpy as np from ifcopenshell import entity_instance diff --git a/src/bcf/bcf/v2/visinfo.py b/src/bcf/bcf/v2/visinfo.py index 1d081ae7827..7081bf20523 100644 --- a/src/bcf/bcf/v2/visinfo.py +++ b/src/bcf/bcf/v2/visinfo.py @@ -1,7 +1,7 @@ import uuid import zipfile from collections.abc import Iterable -from typing import Any, Literal, Optional, Union +from typing import Literal, Optional, Union import ifcopenshell.util.placement import ifcopenshell.util.unit diff --git a/src/bcf/bcf/v3/bcfapi.py b/src/bcf/bcf/v3/bcfapi.py index 5c66cee067c..368c294cd07 100644 --- a/src/bcf/bcf/v3/bcfapi.py +++ b/src/bcf/bcf/v3/bcfapi.py @@ -24,7 +24,6 @@ import urllib.parse import uuid import webbrowser -from re import A from typing import Any, Optional import requests @@ -35,8 +34,8 @@ class OAuthReceiver(http.server.BaseHTTPRequestHandler): def do_GET(self) -> None: query = urllib.parse.parse_qs(urllib.parse.urlparse(self.path).query) - self.server.auth_code = query.get("code", [""])[0] # type:ignore - self.server.auth_state = query.get("state", [""])[0] # type:ignore + self.server.auth_code = query.get("code", [""])[0] + self.server.auth_state = query.get("state", [""])[0] self.send_response(200) self.send_header("Content-type", "text/plain") self.end_headers() @@ -256,7 +255,7 @@ def get_topics( project_id: str = "", topics: str = "", query_string: Optional[str] = None, - ) -> list[Any]: + ) -> None: # return self.get( # f"/projects/{project_id}/topics", # { diff --git a/src/bcf/bcf/v3/document.py b/src/bcf/bcf/v3/document.py index afc6be50b92..d906b96d26b 100644 --- a/src/bcf/bcf/v3/document.py +++ b/src/bcf/bcf/v3/document.py @@ -1,7 +1,7 @@ """BCF XML V3 Documents handler.""" import zipfile -from typing import Any, Optional +from typing import Optional import bcf.v3.model as mdl from bcf.inmemory_zipfile import ZipFileInterface diff --git a/src/bcf/bcf/v3/visinfo.py b/src/bcf/bcf/v3/visinfo.py index 050641ed23c..b3b99d7890e 100644 --- a/src/bcf/bcf/v3/visinfo.py +++ b/src/bcf/bcf/v3/visinfo.py @@ -1,7 +1,7 @@ import uuid import zipfile from collections.abc import Iterable -from typing import Any, Literal, Optional, Union +from typing import Literal, Optional, Union import ifcopenshell.util.placement import ifcopenshell.util.unit diff --git a/src/bcf/pyproject.toml b/src/bcf/pyproject.toml index 7047595ce1d..b4e990f39c2 100644 --- a/src/bcf/pyproject.toml +++ b/src/bcf/pyproject.toml @@ -140,3 +140,9 @@ max-attributes = 10 [tool.pylint.format] expected-line-ending-format = "LF" max-line-length = 120 + +[tool.ruff] +extend = "../../pyproject.toml" +lint.select = [ + "F401", # unused imports +] diff --git a/src/bcf/tests/conftest.py b/src/bcf/tests/conftest.py index f19792122a4..ea1b2aee8b6 100644 --- a/src/bcf/tests/conftest.py +++ b/src/bcf/tests/conftest.py @@ -1,4 +1,5 @@ import pytest + from bcf.xml_parser import XmlParserSerializer diff --git a/src/bcf/tests/v2/test_bcf_xml.py b/src/bcf/tests/v2/test_bcf_xml.py index 1b5128e96f3..fed1428e738 100644 --- a/src/bcf/tests/v2/test_bcf_xml.py +++ b/src/bcf/tests/v2/test_bcf_xml.py @@ -4,8 +4,9 @@ from pathlib import Path from tempfile import TemporaryDirectory -import bcf.v2.model as mdl import pytest + +import bcf.v2.model as mdl from bcf.v2.bcfxml import BcfXml from bcf.v2.topic import TopicHandler from bcf.v2.visinfo import ( diff --git a/src/bcf/tests/v2/test_example_files.py b/src/bcf/tests/v2/test_example_files.py index 6d964bd0e9e..3821569c282 100644 --- a/src/bcf/tests/v2/test_example_files.py +++ b/src/bcf/tests/v2/test_example_files.py @@ -3,10 +3,11 @@ import zipfile from pathlib import Path +from xsdata.models.datatype import XmlDateTime + import bcf.v2.model as mdl from bcf.v2.bcfxml import BcfXml from bcf.v2.topic import TopicHandler -from xsdata.models.datatype import XmlDateTime def test_maximum_information() -> None: diff --git a/src/bcf/tests/v2/test_ifcclash_api.py b/src/bcf/tests/v2/test_ifcclash_api.py index 34c3a493e4e..14945e8392a 100644 --- a/src/bcf/tests/v2/test_ifcclash_api.py +++ b/src/bcf/tests/v2/test_ifcclash_api.py @@ -1,5 +1,6 @@ import numpy as np import pytest + from bcf.v2.bcfxml import BcfXml diff --git a/src/bcf/tests/v3/test_bcf_xml.py b/src/bcf/tests/v3/test_bcf_xml.py index ae658ca55f1..50664b98c72 100644 --- a/src/bcf/tests/v3/test_bcf_xml.py +++ b/src/bcf/tests/v3/test_bcf_xml.py @@ -4,8 +4,9 @@ from pathlib import Path from tempfile import TemporaryDirectory -import bcf.v3.model as mdl import pytest + +import bcf.v3.model as mdl from bcf.v3.bcfxml import BcfXml from bcf.v3.topic import TopicHandler from bcf.v3.visinfo import ( diff --git a/src/bcf/tests/v3/test_example_files.py b/src/bcf/tests/v3/test_example_files.py index 6774c49982d..06eb5d22dd3 100644 --- a/src/bcf/tests/v3/test_example_files.py +++ b/src/bcf/tests/v3/test_example_files.py @@ -1,12 +1,11 @@ -import json import os import zipfile from pathlib import Path +from xsdata.models.datatype import XmlDateTime + import bcf.v3.model as mdl from bcf.v3.bcfxml import BcfXml -from bcf.v3.topic import TopicHandler -from xsdata.models.datatype import XmlDateTime def test_doc_ref_internal() -> None: @@ -174,16 +173,17 @@ def assert_viewpoints(viewpoints): assert viewpoint.snapshot is not None +# TODO: dead code - ported from v2 but buildingSMART/BCF-XML has no v3 MaximumInformation.bcf equivalent def assert_second_viewpoint(viewpoint, expected_selection, expected_exception, expected_coloring) -> None: expected_vp = mdl.VisualizationInfo( components=mdl.Components( - view_setup_hints=mdl.ViewSetupHints( - spaces_visible=False, - space_boundaries_visible=False, - openings_visible=False, - ), selection=expected_selection, visibility=mdl.ComponentVisibility( + view_setup_hints=mdl.ViewSetupHints( + spaces_visible=False, + space_boundaries_visible=False, + openings_visible=False, + ), exceptions=expected_exception, default_visibility=False, ), @@ -194,6 +194,7 @@ def assert_second_viewpoint(viewpoint, expected_selection, expected_exception, e camera_direction=mdl.Direction(x=0.6745243072509766, y=-0.6599355936050415, z=-0.33091068267822266), camera_up_vector=mdl.Direction(x=0.2271970510482788, y=-0.24091780185699463, z=0.9435783624649048), field_of_view=60, + aspect_ratio=1.0, ), guid="21dd4807-e9af-439e-a980-04d913a6b1ce", ) @@ -201,16 +202,17 @@ def assert_second_viewpoint(viewpoint, expected_selection, expected_exception, e assert viewpoint.snapshot is not None +# TODO: dead code - ported from v2 but buildingSMART/BCF-XML has no v3 MaximumInformation.bcf equivalent def assert_third_viewpoint(viewpoint, expected_selection, expected_exception, expected_coloring) -> None: expected_vp = mdl.VisualizationInfo( components=mdl.Components( - view_setup_hints=mdl.ViewSetupHints( - spaces_visible=False, - space_boundaries_visible=False, - openings_visible=True, - ), selection=expected_selection, visibility=mdl.ComponentVisibility( + view_setup_hints=mdl.ViewSetupHints( + spaces_visible=False, + space_boundaries_visible=False, + openings_visible=True, + ), exceptions=expected_exception, default_visibility=True, ), @@ -221,6 +223,7 @@ def assert_third_viewpoint(viewpoint, expected_selection, expected_exception, ex camera_direction=mdl.Direction(x=0.7232745289802551, y=0.5967116951942444, z=-0.3475759029388428), camera_up_vector=mdl.Direction(x=0.27662187814712524, y=0.21082592010498047, z=0.937567412853241), field_of_view=60, + aspect_ratio=1.0, ), guid="81daa431-bf01-4a49-80a2-1ab07c177717", ) diff --git a/src/bcf/tests/v3/test_ifcclash_api.py b/src/bcf/tests/v3/test_ifcclash_api.py index faea9b6a1a4..d470f1ffb8a 100644 --- a/src/bcf/tests/v3/test_ifcclash_api.py +++ b/src/bcf/tests/v3/test_ifcclash_api.py @@ -1,5 +1,6 @@ import numpy as np import pytest + from bcf.v3.bcfxml import BcfXml diff --git a/src/bonsai/Dockerfile b/src/bonsai/Dockerfile new file mode 100644 index 00000000000..9805ec05305 --- /dev/null +++ b/src/bonsai/Dockerfile @@ -0,0 +1,22 @@ +# Build Bonsai .zip. +# Usage: +# # While in `bonsai` folder. +# docker build -t bonsai-dist . +# # Output zip file will be in `dist` folder. +# # See possible values for variables in `Makefile`'s `dist` target description. +# docker run --rm -v "$PWD/../../:/work" -w /work -e PLATFORM=win -e PYVERSION=py313 bonsai-dist + +FROM ubuntu:24.04 +RUN apt-get update +RUN apt-get install -y make git wget unzip zip + +# Python +RUN apt-get install -y software-properties-common +RUN add-apt-repository ppa:deadsnakes/ppa +RUN apt-get update +RUN apt-get install -y python3.11 python3.11-venv + +RUN apt-get install -y npm + +WORKDIR /work +CMD cd src/bonsai && make dist PLATFORM=$PLATFORM PYVERSION=$PYVERSION diff --git a/src/bonsai/Makefile b/src/bonsai/Makefile index 5b484f99424..e00d77da8e5 100644 --- a/src/bonsai/Makefile +++ b/src/bonsai/Makefile @@ -17,8 +17,8 @@ # along with Bonsai. If not, see . SHELL := sh -PYTHON:=python3.11 -PIP:=pip3.11 +PYTHON:=python3 +PIP:=pip3 PATCH:=patch SED:=sed -i VENV_ACTIVATE:=bin/activate @@ -48,18 +48,35 @@ VERSION_PATCH:=$(shell cat '../../VERSION' | cut -d '.' -f 3) VERSION_DATE:=$(shell date '+%y%m%d') LAST_COMMIT_HASH:=$(shell git rev-parse HEAD) LAST_COMMIT_DATE:=$(shell git show -s --format=%cI) -PYVERSION:=py310 +LAST_GIT_BRANCH:=$(shell git rev-parse --abbrev-ref HEAD) PYPI_IMP:=cp -ifeq ($(PYVERSION), py311) -PYLIBDIR:=python3.11 -PYNUMBER:=311 -PYPI_VERSION:=3.11 +ifdef PYVERSION +SUPPORTED_PYVERSIONS := py311 py312 py313 + +ifeq ($(filter $(PYVERSION),$(SUPPORTED_PYVERSIONS)),) +$(error Unsupported PYVERSION=$(PYVERSION). Must be one of $(SUPPORTED_PYVERSIONS)) +endif + +PYMINOR:=$(subst py3,,$(PYVERSION)) +PYLIBDIR:=python3.$(PYMINOR) +PYNUMBER:=3$(PYMINOR) +PYPI_VERSION:=3.$(PYMINOR) +endif # def PYVERSION + +IFCMERGE_VERSION:=2026-04-07 + +ifdef PLATFORM +SUPPORTED_PLATFORMS := linux macos macosm1 win + +ifeq ($(filter $(PLATFORM),$(SUPPORTED_PLATFORMS)),) +$(error Unsupported PLATFORM=$(PLATFORM). Must be one of $(SUPPORTED_PLATFORMS)) +endif + +ifeq ($(PLATFORM),macos) +ifeq ($(PYVERSION),py313) +$(error Blender 5.1 with Python 3.13 doesn't support intel macOS.) endif -ifeq ($(PYVERSION), py312) -PYLIBDIR:=python3.12 -PYNUMBER:=312 -PYPI_VERSION:=3.12 endif ifeq ($(PLATFORM), linux) @@ -86,8 +103,10 @@ PYPI_PLATFORM:=--platform win_amd64 BLENDER_PLATFORM:=windows-x64 endif +endif # def PLATFORM + # Current build commit hash. -OLD:=e8eb5e4 +OLD:=1c5b825 .PHONY: bump bump: ifndef NEW @@ -99,7 +118,10 @@ endif .PHONY: dist dist: ifndef PLATFORM - $(error PLATFORM is not set) + $(error PLATFORM is not set. Example values: $(SUPPORTED_PLATFORMS).) +endif +ifndef PYVERSION + $(error PYVERSION is not set. Example values: $(SUPPORTED_PYVERSIONS). ) endif rm -rf build mkdir -p build @@ -125,9 +147,6 @@ endif cd ../ifc5d && make dist && mv dist/*.whl ../bonsai/build/wheels/ cd ../ifccityjson && make dist && mv dist/*.whl ../bonsai/build/wheels/ cd build && . env/$(VENV_ACTIVATE) && $(PIP) download GitPython --dest=./wheels - # Provides audio playback for costing - # This is a REALLY IMPORTANT feature - cd build && . env/$(VENV_ACTIVATE) && $(PIP) wheel git+https://github.com/zdhoward/aud --wheel-dir=./wheels # IfcOpenShell dependency - support for new typing features cd build && . env/$(VENV_ACTIVATE) && $(PIP) download typing_extensions --dest=./wheels # Required by IfcCSV @@ -189,7 +208,7 @@ endif cd build && . env/$(VENV_ACTIVATE) && $(PIP) download tzfpy $(PYPI_PLATFORM) --python-version $(PYPI_VERSION) --implementation $(PYPI_IMP) --only-binary=:all: --dest=./wheels # pyradiance is using different platform versions than defaults in our makefile. ifeq ($(PLATFORM), linux) - cd build && . env/$(VENV_ACTIVATE) && $(PIP) download pyradiance --platform manylinux_2_35_x86_64 --python-version $(PYPI_VERSION) --implementation $(PYPI_IMP) --only-binary=:all: --dest=./wheels + cd build && . env/$(VENV_ACTIVATE) && $(PIP) download pyradiance --platform manylinux_2_28_x86_64 --python-version $(PYPI_VERSION) --implementation $(PYPI_IMP) --only-binary=:all: --dest=./wheels else ifeq ($(PLATFORM), macos) cd build && . env/$(VENV_ACTIVATE) && $(PIP) download pyradiance --platform macosx_10_13_x86_64 --python-version $(PYPI_VERSION) --implementation $(PYPI_IMP) --only-binary=:all: --dest=./wheels else @@ -206,19 +225,8 @@ endif cd build/bonsai/bim/data/gantt/ && wget https://raw.githubusercontent.com/jsGanttImproved/jsgantt-improved/master/dist/jsgantt.css # Provides IFCJSON functionality - cd build && wget -O ifc2json.zip https://github.com/IFCJSON-Team/IFC2JSON_python/archive/refs/heads/master.zip - cd build && unzip ifc2json.zip && rm ifc2json.zip - # IFCJSON doesn't have pyproject.toml, so we use python command. - cd build && . env/$(VENV_ACTIVATE) && cd IFC2JSON_python-*/file_converters && \ - $(PYTHON) -c "from setuptools import setup; \ - setup( \ - name='ifcjson', \ - version='0.0.1', \ - author='Jan Brouwer', \ - author_email='jan@brewsky.nl', \ - packages=['ifcjson'], \ - )" bdist_wheel - cp -r build/IFC2JSON_python-*/file_converters/dist/*.whl build/wheels/ + # TODO: Use official repo, once https://github.com/IFCJSON-Team/IFC2JSON_python/pull/8 is merged. + cd build && . env/$(VENV_ACTIVATE) && $(PYTHON) -m pip wheel "git+https://github.com/Andrej730/IFC2JSON_python.git@pyproject_toml" --no-deps -w wheels/ # Brickschema requires pkg_resources which is provided by Blender. # Provides Brickschema functionality @@ -226,26 +234,16 @@ endif cd build/bonsai/bim/data/brick/ && wget https://github.com/BrickSchema/Brick/releases/download/nightly/Brick.ttl # Required for hipped roof generation - cd build && wget https://github.com/prochitecture/bpypolyskel/archive/refs/heads/master.zip - cd build && unzip master.zip && rm master.zip - cd build && . env/$(VENV_ACTIVATE) && cd bpypolyskel-master && \ - $(PYTHON) -c "from setuptools import setup; \ - setup( \ - name='bpypolyskel', \ - version='0.0.0', \ - packages=['bpypolyskel'], \ - )" bdist_wheel - cp -r build/bpypolyskel-master/dist/*.whl build/wheels/ + cd build && . env/$(VENV_ACTIVATE) && $(PYTHON) -m pip wheel "git+https://github.com/prochitecture/bpypolyskel" --no-deps -w wheels/ # folder for executable files mkdir -p build/bonsai/libs/bin # required for three-way git merging ifeq ($(PLATFORM), win) - cd build/bonsai/libs/bin && wget https://github.com/brunopostle/ifcmerge/releases/download/2025-01-26/ifcmerge.zip - cd build/bonsai/libs/bin && unzip ifcmerge.zip && rm ifcmerge.zip + cd build/bonsai/libs/bin && wget https://github.com/brunopostle/ifcmerge/releases/download/$(IFCMERGE_VERSION)/ifcmerge.exe else - cd build/bonsai/libs/bin && wget https://raw.githubusercontent.com/brunopostle/ifcmerge/main/ifcmerge && chmod +x ifcmerge + cd build/bonsai/libs/bin && wget https://raw.githubusercontent.com/brunopostle/ifcmerge/$(IFCMERGE_VERSION)/ifcmerge && chmod +x ifcmerge endif # Generate translations module for Bonsai build @@ -264,9 +262,15 @@ else $(SED) "s/0.0.0/$(VERSION)-alpha$(VERSION_DATE)/" build/bonsai/blender_manifest.toml $(SED) "s/8888888/$(LAST_COMMIT_HASH)/" build/bonsai/__init__.py $(SED) "s/9999999/$(LAST_COMMIT_DATE)/" build/bonsai/__init__.py + $(SED) "s/7777777/$(LAST_GIT_BRANCH)/" build/bonsai/__init__.py $(SED) 's/version = "0.0.0"/version = "$(VERSION)-alpha$(VERSION_DATE)"/' build/pyproject.toml endif +# Blender 5.1+ requires Python 3.13. +ifeq ($(PYVERSION), py313) + $(SED) 's/blender_version_min = "4\.2\.0"/blender_version_min = "5.1.0"/' build/bonsai/blender_manifest.toml +endif + $(SED) "s/os-arch/$(BLENDER_PLATFORM)/" build/bonsai/blender_manifest.toml # Provides bonsai Add-on functionality @@ -288,12 +292,6 @@ endif fi mv build/wheels/*.whl build/bonsai/wheels/ - # Temporary workaround for Blender not handling non-3.11 wheels #5743. - # Use '-n' as on macos x86-64 doesn't have a binary wheel and it autoincludes 'cp311'. - prev_whl_name=$$(find build/bonsai/wheels/tzfpy-*.whl); \ - whl_name=$$(echo $$prev_whl_name | sed "s/-cp39-/-cp$(PYNUMBER)-/"); \ - mv --update=none "$$prev_whl_name" "$$whl_name"; - ifneq ($(PLATFORM), linux) # Safeguard: in case one of `pip download` will break, # it will produce a linux wheel for non-linux build (our github action machine is using linux). @@ -336,7 +334,11 @@ test: .PHONY: test-core test-core: +ifndef MODULE pytest -p no:pytest-blender test/core +else + pytest -p no:pytest-blender test/core/test_${MODULE}.py +endif .PHONY: test-bim test-bim: @@ -351,7 +353,7 @@ test-tool: ifndef MODULE pytest test/tool else - pytest test/tool/test_$(MODULE).py + pytest test/tool/test_$(MODULE).py --maxfail=1 endif # Reregistering test is not added to the standard test suite because during unregister diff --git a/src/bonsai/bonsai/__init__.py b/src/bonsai/bonsai/__init__.py index ab5d46607bc..c6ec6405c06 100644 --- a/src/bonsai/bonsai/__init__.py +++ b/src/bonsai/bonsai/__init__.py @@ -32,20 +32,18 @@ # and then as a bonsai-package. IN_PACKAGE = __package__ == "bonsai" -import re import platform +import re import traceback import webbrowser -import uuid -import shutil from collections import deque -from pathlib import Path -from typing import Union, Any from collections.abc import Generator - +from pathlib import Path +from typing import TYPE_CHECKING, Any, Union last_commit_hash = "8888888" last_commit_date = "9999999" +last_git_branch = "7777777" def get_last_commit_hash() -> Union[str, None]: @@ -63,6 +61,15 @@ def get_last_commit_date() -> Union[str, None]: return last_commit_date +def get_git_branch() -> Union[str, None]: + # Using this weird way to write 7777777, + # so makefile won't accidentally replace it here + # we'll be able to distinguish branch from placeholder value. + if last_git_branch == str(7_777777): + return None + return last_git_branch + + # Accessed from bonsai extension: bbim_semver: dict[str, Any] = {} @@ -74,6 +81,21 @@ def get_last_commit_date() -> Union[str, None]: REGISTERED_BBIM_PACKAGE: str +def is_registering() -> bool: + """ + During addon registration ``bpy.context`` and ``bpy.data`` are restricted + and you can't access their properties. + """ + import bpy + + if TYPE_CHECKING or bpy.app.version >= (5, 0, 0): + import _bpy_restrict_state as bpy_restrict_state + else: + import bpy_restrict_state + + return isinstance(bpy.context, bpy_restrict_state._RestrictContext) + + def initialize_bbim_semver(): """Initialize `bbim_semver` dictionary. @@ -95,9 +117,13 @@ def initialize_bbim_semver(): bbim_semver["version"] = version_str -def get_debug_info(): +def get_debug_info(*, bonsai_failed_to_load: bool = False) -> dict[str, Any]: + import bpy + bbim_version = bbim_semver["version"] + # All data here should be gettable even in case of `bpy.context` and `bpy.data` being inaccessible + # and Bonsai completely failed to load. debug_info = { "os": platform.system(), "os_version": platform.version(), @@ -109,10 +135,19 @@ def get_debug_info(): "bonsai_version": bbim_version, "bonsai_commit_hash": get_last_commit_hash(), "bonsai_commit_date": get_last_commit_date(), + "bonsai_git_branch": get_git_branch(), "last_actions": last_actions, "last_error": last_error, } + # Can't access blend data or context during registration. + # If Bonsai failed to load we cannot safely access any of its properties or its tools + # as they may not be registered yet and acessing them will break Bonsai Fatal Error UI. + if is_registering() or bonsai_failed_to_load: + return debug_info + + import bonsai.tool as tool + # Add .blend file save information if bpy.data.is_saved: debug_info["blend_file_path"] = bpy.data.filepath @@ -133,7 +168,7 @@ def get_debug_info(): return debug_info -def format_debug_info(info: dict): +def format_debug_info(info: dict[str, Any]) -> str: last_actions = "" for action in info["last_actions"]: last_actions += f"\n# {action['type']}: {action['name']}" @@ -151,33 +186,10 @@ def get_binaries(path: Path) -> Generator[Path, None, None]: yield from path.glob("**/*.so") -def safe_link_dlls() -> None: - # Blender 4.2+ has a problem on Windows for disabling/enabling/reinstalling extensions - # with loaded binary dependencies (on Windows you can't remove a binary if it's loaded by some program). - # To avoid this issue we temporary hard link dlls to our temp directory on unregister() - # (unregister is executed before Blender will try to uninstall dependencies and the issue will arise). - # Then, Blender won't have a problem unlinking unloaded dlls as they are still linked somewhere. - # On register() we clean up our temp directory with binaries. - # - # TODO: If user uninstalls Bonsai to never use it again, temporary directory won't be cleared. - # - # See: https://projects.blender.org/blender/blender/issues/125049 - import bpy - - ext_path = Path(bpy.utils.user_resource("EXTENSIONS")) - local_path = ext_path / ".local" - - # We use random hash subfolder as user may try to enable/disable addon multiple times. - random_hash = uuid.uuid4().hex[:8] - temp_local = ext_path / ".local_temp" / random_hash - temp_local.mkdir(parents=True) - - for filepath in get_binaries(local_path): - dest_path = temp_local / filepath.relative_to(local_path) - dest_path.parent.mkdir(exist_ok=True, parents=True) - os.link(filepath, dest_path) - - +# TODO: remove before 0.8.6 release. +# On Windows issues with removing extensions were resolved in Blender 4.3, +# but we removed our workaround that was producing some junk only in 0.8.5 release. +# So we're temporarily keeping the part that's cleaning up outputs from previous releases. def clean_up_dlls_safe_links() -> None: import bpy @@ -207,6 +219,8 @@ def remove_empty_folders(folder: Path) -> None: if IN_BLENDER: + import bpy + initialize_bbim_semver() def get_binary_info() -> dict[str, Any]: @@ -248,10 +262,12 @@ def update_commit_data() -> None: global last_commit_hash global last_commit_date + global last_git_branch path = Path(__file__).resolve().parent repo = git.Repo(str(path), search_parent_directories=True) last_commit_hash = repo.head.object.hexsha last_commit_date = repo.head.object.committed_datetime.isoformat() + last_git_branch = repo.active_branch.name except: pass @@ -298,9 +314,6 @@ def register(): purge_cache() def unregister(): - if platform.system() == "Windows": - safe_link_dlls() - import bonsai.bim bonsai.bim.unregister() @@ -335,7 +348,7 @@ class BIM_PT_fatal_error(bpy.types.Panel): bl_context = "scene" def draw(self, context): - info = get_debug_info() + info = get_debug_info(bonsai_failed_to_load=True) layout = self.layout layout.alert = True @@ -411,7 +424,7 @@ class CopyDebugInformation(bpy.types.Operator): bl_description = "Copies debugging information to your clipboard for use in bugreports" def execute(self, context): - info = get_debug_info() + info = get_debug_info(bonsai_failed_to_load=True) info.update(get_binary_info()) info = format_debug_info(info) context.window_manager.clipboard = info diff --git a/src/bonsai/bonsai/bim/__init__.py b/src/bonsai/bonsai/bim/__init__.py index 785d7eac666..4302739aab6 100644 --- a/src/bonsai/bonsai/bim/__init__.py +++ b/src/bonsai/bonsai/bim/__init__.py @@ -16,14 +16,16 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . +import importlib import os +from collections.abc import Callable +from typing import Union + import bpy import bpy.utils.previews -import importlib -from bpy_extras.io_utils import ImportHelper, ExportHelper -from . import handler, ui, prop, operator -from typing import Union -from collections.abc import Callable +from bpy_extras.io_utils import ExportHelper, ImportHelper + +from . import handler, operator, prop, ui try: from bonsai.translations import translations_dict @@ -130,12 +132,7 @@ prop.StrProperty, operator.BIM_OT_enum_property_search, # /!\ Register AFTER prop.StrProperty operator.BIM_OT_attribute_search_values, - operator.BIM_UL_tab_panels, - operator.BIM_OT_toggle_panel_visibility, - operator.BIM_OT_bookmark_panel, - operator.BIM_OT_manage_tab_panels, operator.BIM_OT_manage_tab_visibility, - operator.BIM_OT_toggle_tab_visibility, operator.BIM_OT_reset_ui_layout, prop.ObjProperty, prop.MultipleFileSelect, @@ -144,7 +141,7 @@ prop.BIMAreaProperties, prop.BIMTabProperties, prop.BIMTabVisibility, # Must be registered before BIMProperties - prop.BIMPanelProperties, # Must be registered before BIMProperties + prop.BIMPanelVisibility, # Must be registered before BIMProperties prop.BIMProperties, prop.IfcParameter, prop.PsetQto, @@ -157,6 +154,8 @@ prop.BIMSnapGroups, ui.BIM_UL_clipping_plane, ui.BIM_UL_generic, + ui.BIM_UL_tab_visibilities, + ui.BIM_UL_panel_visibilities, ui.DocPreferences, ui.GizmoPreferencesDoor, # Register before GizmoPreferences ui.GizmoPreferencesWindow, # Register before GizmoPreferences @@ -318,10 +317,6 @@ def register(): # RestrictedContext doesn't allow accessing scene attribute, postpone it for a bit. bpy.app.timers.register(tool.Blender.setup_user_data_dir, first_interval=0.1) - bpy.types.Scene.active_tab_name = bpy.props.StringProperty() - bpy.types.Scene.tab_panels = bpy.props.CollectionProperty(type=bpy.types.PropertyGroup) - bpy.types.Scene.active_tab_panel_index = bpy.props.IntProperty() - def unregister(): global icons @@ -363,7 +358,3 @@ def unregister(): tool.Blender.remove_scene_panel_override(panel) bpy.app.translations.unregister("bonsai") - - del bpy.types.Scene.active_tab_name - del bpy.types.Scene.tab_panels - del bpy.types.Scene.active_tab_panel_index diff --git a/src/bonsai/bonsai/bim/data/fonts/LICENSE b/src/bonsai/bonsai/bim/data/fonts/LICENSE new file mode 100644 index 00000000000..4dc4bdd0937 --- /dev/null +++ b/src/bonsai/bonsai/bim/data/fonts/LICENSE @@ -0,0 +1,96 @@ +Copyright (c) 2011-2012, Nikita Volchenkov (), +with Reserved Font Name OpenGost Type B. + +Copyright (c) 2012, Valek Filippov (). + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/src/bonsai/bonsai/bim/data/webui/sioserver.py b/src/bonsai/bonsai/bim/data/webui/sioserver.py index 47012682328..91c3c4e8eba 100644 --- a/src/bonsai/bonsai/bim/data/webui/sioserver.py +++ b/src/bonsai/bonsai/bim/data/webui/sioserver.py @@ -1,6 +1,5 @@ -import sys import os - +import sys bonsai_lib_path = os.environ.get("BONSAI_LIB_PATH") bonsai_version = os.environ.get("BONSAI_VERSION") @@ -9,13 +8,14 @@ sys.path.insert(0, bonsai_lib_path) import argparse -from aiohttp import web -import socketio -import pystache -import json import base64 +import json import xml.etree.ElementTree as ET +import pystache +import socketio +from aiohttp import web + sio_port = 8080 # default port sio = socketio.AsyncServer(cors_allowed_origins="*", async_mode="aiohttp", max_http_buffer_size=10000000) diff --git a/src/bonsai/bonsai/bim/export_ifc.py b/src/bonsai/bonsai/bim/export_ifc.py index 61347861243..f28c106e95b 100644 --- a/src/bonsai/bonsai/bim/export_ifc.py +++ b/src/bonsai/bonsai/bim/export_ifc.py @@ -17,27 +17,23 @@ # along with Bonsai. If not, see . from __future__ import annotations -import os -import bpy -import json + import datetime -import zipfile +import json +import os import tempfile +import zipfile +from logging import Logger +from typing import Union + +import bpy import ifcopenshell -import ifcopenshell.api import ifcopenshell.util.element -import ifcopenshell.util.placement import ifcopenshell.util.unit -import bonsai.tool as tool + import bonsai.core.geometry -import bonsai.core.aggregate -import bonsai.core.spatial -import bonsai.core.style +import bonsai.tool as tool from bonsai.bim.ifc import IfcStore -from mathutils import Vector -from typing import Union -from logging import Logger -from math import radians class IfcExporter: @@ -49,7 +45,6 @@ def export(self): self.set_header() IfcStore.update_cache() self.sync_all_objects() - tool.Project.save_linked_models_to_ifc() extension = self.ifc_export_settings.output_file.split(".")[-1].lower() if extension == "ifczip": with tempfile.TemporaryDirectory() as unzipped_path: @@ -77,9 +72,7 @@ def export(self): def set_header(self): self.file.header.file_name.name = os.path.basename(self.ifc_export_settings.output_file) - self.file.header.file_name.time_stamp = ( - datetime.datetime.utcnow().replace(tzinfo=datetime.UTC).astimezone().replace(microsecond=0).isoformat() - ) + self.file.header.file_name.time_stamp = datetime.datetime.now().astimezone().replace(microsecond=0).isoformat() self.file.header.file_name.preprocessor_version = "IfcOpenShell {}".format(ifcopenshell.version) self.file.header.file_name.originating_system = "{} {}".format( self.get_application_name(), tool.Blender.get_bonsai_version() diff --git a/src/bonsai/bonsai/bim/handler.py b/src/bonsai/bonsai/bim/handler.py index c7cb10cdde4..e11eb07ce8f 100644 --- a/src/bonsai/bonsai/bim/handler.py +++ b/src/bonsai/bonsai/bim/handler.py @@ -17,39 +17,47 @@ # along with Bonsai. If not, see . import os +import weakref +from collections.abc import Callable +from math import cos +from typing import Union + import bpy +import ifcopenshell.api.owner.settings import ifcopenshell.util.element import ifcopenshell.util.representation import ifcopenshell.util.unit -import ifcopenshell.api.owner.settings +from bpy.app.handlers import persistent +from mathutils import Vector + import bonsai.bim import bonsai.tool as tool -import weakref -from bpy.app.handlers import persistent from bonsai.bim.ifc import IfcStore -from bonsai.bim.module.model.data import AuthoringData from bonsai.bim.module.aggregate.decorator import AggregateDecorator from bonsai.bim.module.georeference.decorator import GeoreferenceDecorator -from bonsai.bim.module.model.decorator import WallAxisDecorator, SlabDirectionDecorator, BoundingBoxDecorator +from bonsai.bim.module.model.data import AuthoringData +from bonsai.bim.module.model.decorator import ( + BoundingBoxDecorator, + SlabDirectionDecorator, + WallAxisDecorator, +) from bonsai.bim.module.nest.decorator import NestDecorator -from mathutils import Vector -from math import cos -from typing import Union -from collections.abc import Callable - cwd = os.path.dirname(os.path.realpath(__file__)) global_subscription_owner = object() +# Separate owner for per-object msgbus subscriptions (name, active_material_index). +# Using a dedicated owner allows clearing all per-object subscriptions at once +# during undo/redo without affecting other global subscriptions. +object_subscription_owner = object() def name_callback(obj: Union[bpy.types.Object, bpy.types.Material], data: str) -> None: try: obj.name except: - # The object is invalid but somehow still has a callback. Clear all - # msgbus subscriptions to prevent useless further triggers. - bpy.msgbus.clear_by_owner(obj) - return # In case the object RNA is gone during an undo / redo operation + # The object is invalid but somehow still has a callback. + # This can occur during undo/redo when the Python wrapper is stale. + return # Blender names are up to 63 UTF-8 bytes if len(bytes(obj.name, "utf-8")) >= 63: return @@ -184,7 +192,7 @@ def subscribe_to(obj: bpy.types.ID, data_path: str, callback: Callable[[bpy.type return bpy.msgbus.subscribe_rna( key=subscribe_to, - owner=obj, + owner=object_subscription_owner, args=( obj, data_path, @@ -202,8 +210,8 @@ def refresh_ui_data(): Note that calling non-ifc-operators by itself doesn't refresh the UI data and it need to be refreshed manually if needed. """ - from bonsai.bim import modules import bonsai.bim.ui + from bonsai.bim import modules bonsai.bim.ui.refresh() diff --git a/src/bonsai/bonsai/bim/helper.py b/src/bonsai/bonsai/bim/helper.py index 3b3dd502e47..ab4a0875abe 100644 --- a/src/bonsai/bonsai/bim/helper.py +++ b/src/bonsai/bonsai/bim/helper.py @@ -17,24 +17,30 @@ # along with Bonsai. If not, see . from __future__ import annotations + import importlib -import bpy import json +from collections.abc import Callable, Iterable, Sequence +from types import EllipsisType +from typing import TYPE_CHECKING, Any, Optional, Union + +import bpy import ifcopenshell import ifcopenshell.ifcopenshell_wrapper as W import ifcopenshell.util.attribute -import ifcopenshell.util.element import ifcopenshell.util.unit -from ifcopenshell.util.doc import get_attribute_doc, get_predefined_type_doc, get_property_doc +from ifcopenshell.util.doc import ( + get_attribute_doc, + get_predefined_type_doc, + get_property_doc, +) + import bonsai.tool as tool -from types import EllipsisType -from typing import Optional, Any, Union, TYPE_CHECKING -from collections.abc import Callable, Iterable, Sequence if TYPE_CHECKING: import bonsai.bim.prop - from bonsai.bim.prop import Attribute from bonsai.bim.module.search.prop import BIMFilterGroup + from bonsai.bim.prop import Attribute # ImportCallback return values: # - None - property should be imported by default workflow @@ -428,7 +434,11 @@ def get_enum_items( else: annotations_data = data - prop = annotations_data.__annotations__[prop_name] + try: + annotations = annotations_data.__annotations__ + except AttributeError: + annotations = type(annotations_data).__annotations__ + prop = annotations[prop_name] items = prop.keywords.get("items") if items is None: return @@ -507,14 +517,15 @@ def draw_filter( row.operator("bim.edit_element_filter", icon="CHECKMARK", text="").filter_mode = "EXCLUDE" row.operator("bim.enable_editing_element_filter", icon="CANCEL", text="").filter_mode = "NONE" row = layout.row(align=True) - if not tool.Blender.get_addon_preferences().chain_filter_with_set_operations: + preferences = tool.Blender.get_addon_preferences() + if not preferences.chain_filter_with_set_operations: row.operator("bim.add_filter_group", text="Add Search Group", icon="ADD").module = module else: - if not filter_groups or not any(fg.filters for fg in filter_groups): - op = row.operator("bim.add_filter", text="Add Filter", icon="ADD") - op.type = "entity" - op.index = 0 - op.module = module + row.prop(sprops, "facet", text="") + op = row.operator("bim.add_filter", text="Add Filter", icon="ADD") + op.type = sprops.facet + op.index = 0 + op.module = module op = row.operator("bim.edit_filter_query", text="", icon="FILTER") if "module" in op.bl_rna.properties: op.module = module @@ -522,26 +533,23 @@ def draw_filter( for i, filter_group in enumerate(filter_groups): box = layout.box() - row = box.row(align=True) - row.prop(sprops, "facet", text="") - op = row.operator("bim.add_filter", text="Add Filter", icon="ADD") - op.type = sprops.facet - op.index = i - op.module = module - op = row.operator("bim.remove_filter_group", text="", icon="X") - op.index = i - op.module = module + preferences = tool.Blender.get_addon_preferences() + if not preferences.chain_filter_with_set_operations: + row = box.row(align=True) + row.prop(sprops, "facet", text="") + op = row.operator("bim.add_filter", text="Add Filter", icon="ADD") + op.type = sprops.facet + op.index = i + op.module = module + op = row.operator("bim.remove_filter_group", text="", icon="X") + op.index = i + op.module = module for j, ifc_filter in enumerate(filter_group.filters): if ifc_filter.type == "entity": row = box.row(align=True) preferences = tool.Blender.get_addon_preferences() - if preferences.chain_filter_with_set_operations: - show_mode_toggle = j > 0 - else: - show_mode_toggle = ( - preferences.default_filter_with_set_operations_for_globalid_and_class and j > 0 - ) # PR 7315 mode + show_mode_toggle = preferences.chain_filter_with_set_operations and j > 0 if show_mode_toggle: mode_icons = {"ADD": "ADD", "SUBTRACT": "REMOVE", "FILTER": "FILTER"} op = row.operator( @@ -757,12 +765,7 @@ def draw_filter( elif ifc_filter.type == "instance": row = box.row(align=True) preferences = tool.Blender.get_addon_preferences() - if preferences.chain_filter_with_set_operations: - show_mode_toggle = j > 0 - else: - show_mode_toggle = ( - preferences.default_filter_with_set_operations_for_globalid_and_class and j > 0 - ) # PR 7315 mode + show_mode_toggle = preferences.chain_filter_with_set_operations and j > 0 if show_mode_toggle: mode_icons = {"ADD": "ADD", "SUBTRACT": "REMOVE", "FILTER": "FILTER"} op = row.operator( @@ -788,149 +791,3 @@ def draw_filter( op.group_index = i op.index = j op.module = module - - -# ============================================================================ -# UI Panel Visibility Helpers -# ============================================================================ - - -def get_tab_names(): - from bonsai.bim.prop import get_tab - - enum_items = get_tab(None, None) - # Exclude None separators and the BLENDER tab (not part of BIM tab system) - return [item[0] for item in enum_items if item is not None and item[0] != "BLENDER"] - - -def get_panel_tab_name(panel_class): - if hasattr(panel_class, "bim_tab_name"): - return panel_class.bim_tab_name - return "PROJECT" # Default fallback - - -def should_show_panel(panel_id, panel_tab_name, context): - if tool.Blender.is_tab(context, "BOOKMARK"): - return is_panel_bookmarked(panel_id) and get_panel_visibility(panel_id, "BOOKMARK") - - if tool.Blender.is_tab(context, panel_tab_name): - return get_tab_visibility(panel_tab_name) and get_panel_visibility(panel_id, panel_tab_name) - - return False - - -def get_tab_visibility(tab_name): - bim_props = tool.Blender.get_bim_props() - tab_vis = bim_props.tab_visibilities.get(tab_name) - return tab_vis.is_visible if tab_vis else True - - -def set_tab_visibility(tab_name, visible): - bim_props = tool.Blender.get_bim_props() - tab_vis = bim_props.tab_visibilities.get(tab_name) - if tab_vis: - tab_vis.is_visible = visible - else: - new_tab = bim_props.tab_visibilities.add() - new_tab.name = tab_name - new_tab.is_visible = visible - - -def get_panel_visibility(panel_id, current_tab=None): - panel_config = get_panel_config(panel_id) - if panel_config: - if current_tab == "BOOKMARK": - return panel_config.is_visible_in_bookmarks - else: - return panel_config.is_visible_in_tab - return True - - -def is_panel_bookmarked(panel_id): - panel_config = get_panel_config(panel_id) - if panel_config: - return panel_config.is_bookmarked - return False - - -def get_panel_config(panel_id, create_if_missing=False): - try: - bim_props = tool.Blender.get_bim_props() - except (AttributeError, AssertionError): - return None - - for prop in bim_props.panel_properties: - if prop.name == panel_id: - return prop - - if create_if_missing: - try: - prop = bim_props.panel_properties.add() - prop.name = panel_id - prop.is_visible_in_tab = True - prop.is_visible_in_bookmarks = True - prop.is_bookmarked = False - return prop - except AttributeError: - pass - - return None - - -def get_all_tab_panels(force_refresh=False): - panels = {tab_name: [] for tab_name in get_tab_names() if tab_name != "BOOKMARK"} - panels["BOOKMARK"] = [] - - bim_props = tool.Blender.get_bim_props() - for prop in bim_props.panel_properties: - panel_class = getattr(bpy.types, prop.name, None) - if panel_class: - tab_name = get_panel_tab_name(panel_class) - if tab_name and tab_name != "BOOKMARK": - bl_label = getattr(panel_class, "bl_label", prop.name) - panels[tab_name].append({"bl_idname": prop.name, "bl_label": bl_label}) - - if prop.is_bookmarked: - panel_class = getattr(bpy.types, prop.name, None) - if panel_class: - bl_label = getattr(panel_class, "bl_label", prop.name) - panels["BOOKMARK"].append({"bl_idname": prop.name, "bl_label": bl_label}) - - if not panels["BOOKMARK"]: - panels["BOOKMARK"] = [{}] - - return panels - - -def initialize_tab_visibilities(): - bim_props = tool.Blender.get_bim_props() - - if len(bim_props.tab_visibilities) > 0: - return - - for tab_name in get_tab_names(): - tab_vis = bim_props.tab_visibilities.add() - tab_vis.name = tab_name - tab_vis.is_visible = True - - -def initialize_panel_properties(): - - bim_props = tool.Blender.get_bim_props() - - if len(bim_props.panel_properties) > 0: - return - - for attr_name in dir(bpy.types): - if attr_name.startswith("BIM_PT_tab_"): - panel_class = getattr(bpy.types, attr_name) - if not hasattr(panel_class, "bl_idname"): - continue - - panel_id = panel_class.bl_idname - - prop = bim_props.panel_properties.add() - prop.name = panel_id - prop.is_visible_in_tab = True - prop.is_visible_in_bookmarks = True - prop.is_bookmarked = False diff --git a/src/bonsai/bonsai/bim/ifc.py b/src/bonsai/bonsai/bim/ifc.py index 881de8adf9b..b07e584a711 100644 --- a/src/bonsai/bonsai/bim/ifc.py +++ b/src/bonsai/bonsai/bim/ifc.py @@ -17,26 +17,28 @@ # along with Bonsai. If not, see . from __future__ import annotations + +import hashlib import os -import bpy -import uuid import shutil -import hashlib -import zipfile import tempfile import traceback +import uuid +import zipfile +from collections.abc import Callable +from pathlib import Path +from typing import Literal, NotRequired, Optional, TypedDict, Union + +import bpy import ifcopenshell import ifcopenshell.geom import ifcopenshell.ifcopenshell_wrapper +from ifcopenshell.file import UndoSystemError + import bonsai import bonsai.bim.handler import bonsai.tool as tool -from ifcopenshell.file import UndoSystemError -from pathlib import Path from bonsai.tool.brick import BrickStore -from typing import Union, Optional, TypedDict, NotRequired, Literal -from collections.abc import Callable - IFC_CONNECTED_TYPE = Union[bpy.types.Material, bpy.types.Object] @@ -314,11 +316,8 @@ def rollback_link_element(data: OperationData) -> None: del IfcStore.id_map[data["id"]] if "guid" in data: del IfcStore.guid_map[data["guid"]] - obj = IfcStore.get_object_by_name(data["obj"]) - if obj is None: - # obj was just created during this step and didn't existed before. - return - bpy.msgbus.clear_by_owner(obj) + # Note: msgbus subscriptions are cleared globally during + # rebuild_element_maps which runs after every undo/redo. @staticmethod def commit_link_element(data: OperationData) -> None: @@ -365,10 +364,8 @@ def commit_unlink_element(data: OperationData) -> None: del IfcStore.id_map[data["id"]] if "guid" in data: del IfcStore.guid_map[data["guid"]] - obj = IfcStore.get_object_by_name(data["obj"]) - # obj might be removed after unlink. - if not obj: - bpy.msgbus.clear_by_owner(obj) + # Note: msgbus subscriptions are cleared globally during + # rebuild_element_maps which runs after every undo/redo. @staticmethod def unlink_element( diff --git a/src/bonsai/bonsai/bim/import_ifc.py b/src/bonsai/bonsai/bim/import_ifc.py index 7669edbd146..267800469a2 100644 --- a/src/bonsai/bonsai/bim/import_ifc.py +++ b/src/bonsai/bonsai/bim/import_ifc.py @@ -17,32 +17,34 @@ # along with Bonsai. If not, see . from __future__ import annotations -import bpy -import time + import json -import ifcpatch import logging -import traceback -import mathutils -import numpy as np -import numpy.typing as npt import multiprocessing +import time +import traceback +from collections.abc import Iterable +from typing import Any, Literal, Optional, Union + +import bpy import ifcopenshell import ifcopenshell.api.pset import ifcopenshell.geom import ifcopenshell.ifcopenshell_wrapper as W -import ifcopenshell.util.unit import ifcopenshell.util.element -import ifcopenshell.util.geolocation import ifcopenshell.util.placement import ifcopenshell.util.representation import ifcopenshell.util.shape +import ifcopenshell.util.unit +import ifcpatch +import mathutils +import numpy as np +import numpy.typing as npt +from ifcopenshell.util.shape import MatrixType + import bonsai.tool as tool -from bonsai.bim.ifc import IfcStore, IFC_CONNECTED_TYPE +from bonsai.bim.ifc import IFC_CONNECTED_TYPE, IfcStore from bonsai.tool.loader import OBJECT_DATA_TYPE -from typing import Union, Optional, Any, Literal -from collections.abc import Iterable -from ifcopenshell.util.shape import MatrixType class MaterialCreator: @@ -62,8 +64,8 @@ def create( mesh: Union[OBJECT_DATA_TYPE, None], shape_has_openings: bool, ) -> None: - if ((rep := getattr(element, "Representation", ...) is not ...) and not rep) or ( - (rep := getattr(element, "RepresentationMaps", ...) is not ...) and not rep + if ((rep := getattr(element, "Representation", ...)) is not ... and not rep) or ( + (rep := getattr(element, "RepresentationMaps", ...)) is not ... and not rep ): return @@ -82,7 +84,7 @@ def create( if element.is_a("IfcTypeProduct"): self.parse_element_type_material_styles(element) self.parsed_meshes.add(self.mesh.name) - if not self.ifc_import_settings.load_indexed_maps: + if self.ifc_import_settings.load_indexed_maps: self.load_texture_maps(shape_has_openings) self.assign_material_slots_to_faces() tool.Geometry.record_object_materials(obj) @@ -114,7 +116,6 @@ def get_ifc_coordinate(self, material: bpy.types.Material) -> Union[ifcopenshell for texture in texture_style.Textures or []: if coords := getattr(texture, "IsMappedBy", None): coords = coords[0] - # IfcTextureCoordinateGenerator handled in the style shader graph if coords.is_a("IfcIndexedTextureMap"): return coords # TODO: support IfcTextureMap @@ -132,6 +133,10 @@ def load_texture_maps(self, shape_has_openings: bool) -> None: if shape_has_openings and coords.is_a("IfcIndexedTextureMap"): continue tool.Loader.load_indexed_map(coords, self.mesh) + elif tool.Style.get_texture_style(material): + # No explicit coordinate mapping (e.g. IFC2X3 has no IsMappedBy, + # and IFC4 COORD uses generated UVs). Bake XY→UV as fallback. + tool.Loader.load_generated_uv_map(self.mesh) def assign_material_slots_to_faces(self) -> None: if not self.mesh["ios_materials"]: @@ -290,7 +295,6 @@ def execute(self) -> None: self.profile_code("Load linked models") self.add_project_to_scene() self.profile_code("Add project to scene") - self.hide_ifc_spaces() if self.ifc_import_settings.should_clean_mesh and len(self.file.by_type("IfcElement")) < 1000: self.clean_mesh() self.profile_code("Mesh cleaning") @@ -743,6 +747,7 @@ def create_products( self.update_progress((percent_average / 100 * progress_range) + start_progress) shape = iterator.get() if shape: + assert isinstance(shape, W.TriangulationElement) product = self.file.by_id(shape.id) self.create_product(product, shape) results.add(product) @@ -890,48 +895,6 @@ def create_product( obj, tool.Loader.apply_blender_offset_to_matrix_world(obj, self.get_element_matrix(element)) ) - if element.is_a("IfcAnnotation") and getattr(element, "ObjectType", None) == "IMAGE": - image = None - if obj.data and obj.data.materials and obj.data.materials[0]: - material = obj.data.materials[0] - if material.use_nodes and material.node_tree: - for node in material.node_tree.nodes: - if node.type == "TEX_IMAGE" and node.image: - image = node.image - break - if image: - import bmesh - - bm = bmesh.new() - bm.from_mesh(obj.data) - if not bm.loops.layers.uv: - uv_layer = bm.loops.layers.uv.new() - else: - uv_layer = bm.loops.layers.uv.active - - if bm.verts: - min_x = min(v.co.x for v in bm.verts) - max_x = max(v.co.x for v in bm.verts) - min_y = min(v.co.y for v in bm.verts) - max_y = max(v.co.y for v in bm.verts) - - width = max_x - min_x - height = max_y - min_y - - for face in bm.faces: - for loop in face.loops: - vert = loop.vert - u = (vert.co.x - min_x) / width if width > 0 else 0.5 - v = (vert.co.y - min_y) / height if height > 0 else 0.5 - - u = max(0.0, min(1.0, u)) - v = max(0.0, min(1.0, v)) - - loop[uv_layer].uv = (u, v) - - bm.to_mesh(obj.data) - bm.free() - obj.data.update() return obj def load_existing_meshes(self) -> None: @@ -1058,7 +1021,8 @@ def create_project(self): obj.hide_select = True obj.hide_viewport = True self.project["blender"].objects.link(obj) - self.project["blender"].BIMCollectionProperties.obj = obj + collection_props = tool.Blender.get_collection_props(self.project["blender"]) + collection_props.obj = obj props = tool.Blender.get_object_bim_props(obj) props.collection = self.collections[project.GlobalId] = self.project["blender"] @@ -1287,13 +1251,6 @@ def update_linked_aggregates(self): properties={"Aggregate_Index": aggregate_index, "Name": name}, ) - def hide_ifc_spaces(self): - """Hide IfcSpace objects after they've been added to the scene.""" - for ifc_definition_id, obj in self.added_data.items(): - if isinstance(obj, bpy.types.Object): - element = self.file.by_id(ifc_definition_id) - if element.is_a("IfcSpace"): - obj.hide_set(True) class IfcImportSettings: """ @@ -1311,7 +1268,7 @@ def __init__(self): self.should_load_geometry = True self.should_clean_mesh = False self.should_cache = True - self.deflection_tolerance = 0.001 + self.deflection_tolerance = 0.05 # Default is 0.001, but I find this to be more practical self.angular_tolerance = 0.5 self.void_limit = 30 self.style_limit = 300 diff --git a/src/bonsai/bonsai/bim/module/aggregate/__init__.py b/src/bonsai/bonsai/bim/module/aggregate/__init__.py index daafdf201ca..9f081ecaec2 100644 --- a/src/bonsai/bonsai/bim/module/aggregate/__init__.py +++ b/src/bonsai/bonsai/bim/module/aggregate/__init__.py @@ -17,7 +17,8 @@ # along with Bonsai. If not, see . import bpy -from . import ui, prop, operator + +from . import operator, prop, ui classes = ( operator.BIM_OT_add_aggregate, diff --git a/src/bonsai/bonsai/bim/module/aggregate/data.py b/src/bonsai/bonsai/bim/module/aggregate/data.py index ad58f6defbc..22c7505bf3a 100644 --- a/src/bonsai/bonsai/bim/module/aggregate/data.py +++ b/src/bonsai/bonsai/bim/module/aggregate/data.py @@ -16,10 +16,12 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . +from typing import Union + import bpy -import bonsai.tool as tool import ifcopenshell.util.element -from typing import Union + +import bonsai.tool as tool def refresh(): diff --git a/src/bonsai/bonsai/bim/module/aggregate/decorator.py b/src/bonsai/bonsai/bim/module/aggregate/decorator.py index 877e7f41e03..eb389a58bd2 100644 --- a/src/bonsai/bonsai/bim/module/aggregate/decorator.py +++ b/src/bonsai/bonsai/bim/module/aggregate/decorator.py @@ -19,14 +19,13 @@ import blf import bpy import gpu -import ifcopenshell import ifcopenshell.util.element -import bonsai.tool as tool from bpy.types import SpaceView3D from bpy_extras import view3d_utils from gpu_extras.batch import batch_for_shader from mathutils import Vector -from bonsai.bim.module.geometry.decorator import ItemDecorator + +import bonsai.tool as tool def transparent_color(color, alpha=0.1): diff --git a/src/bonsai/bonsai/bim/module/aggregate/operator.py b/src/bonsai/bonsai/bim/module/aggregate/operator.py index 32d06dd94e2..98bc6127845 100644 --- a/src/bonsai/bonsai/bim/module/aggregate/operator.py +++ b/src/bonsai/bonsai/bim/module/aggregate/operator.py @@ -16,17 +16,17 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . +from typing import TYPE_CHECKING + import bpy -import ifcopenshell -import ifcopenshell.api import ifcopenshell.api.group import ifcopenshell.api.pset import ifcopenshell.api.root import ifcopenshell.util.element -import bonsai.tool as tool + import bonsai.core.aggregate as core import bonsai.core.spatial -from typing import TYPE_CHECKING +import bonsai.tool as tool class BIM_OT_aggregate_assign_object(bpy.types.Operator, tool.Ifc.Operator): @@ -222,7 +222,7 @@ def _execute(self, context): tool.Collector, tool.Spatial, container=current_container, - element_obj=aggregate, + objs=[aggregate], ) core.assign_object(tool.Ifc, tool.Aggregate, tool.Collector, relating_obj=aggregate, related_obj=obj) diff --git a/src/bonsai/bonsai/bim/module/aggregate/prop.py b/src/bonsai/bonsai/bim/module/aggregate/prop.py index 03a3d0f533d..424f2b829f5 100644 --- a/src/bonsai/bonsai/bim/module/aggregate/prop.py +++ b/src/bonsai/bonsai/bim/module/aggregate/prop.py @@ -16,24 +16,22 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . +from typing import TYPE_CHECKING, Union + import bpy import ifcopenshell.util.element -import bonsai.tool as tool -from bonsai.bim.prop import StrProperty, Attribute -from bonsai.bim.module.spatial.data import SpatialData -from bpy.types import PropertyGroup from bpy.props import ( - PointerProperty, - StringProperty, - EnumProperty, BoolProperty, - IntProperty, - FloatProperty, - FloatVectorProperty, CollectionProperty, + PointerProperty, +) +from bpy.types import PropertyGroup + +import bonsai.tool as tool +from bonsai.bim.module.aggregate.decorator import ( + AggregateDecorator, + AggregateModeDecorator, ) -from bonsai.bim.module.aggregate.decorator import AggregateDecorator, AggregateModeDecorator -from typing import TYPE_CHECKING, Union def can_aggregate(relating_obj: bpy.types.Object, related_obj: bpy.types.Object) -> bool: @@ -75,6 +73,22 @@ def poll_related_object(self: "BIMObjectAggregateProperties", related_obj: bpy.t return True +def update_relating_object(self, context): + if self.relating_object: + ifc_id = tool.Blender.get_object_bim_props(self.relating_object).ifc_definition_id + if ifc_id: + bpy.ops.bim.aggregate_assign_object(relating_object=ifc_id) + bpy.ops.bim.disable_editing_aggregate() + + +def update_related_object(self, context): + if self.related_object: + ifc_id = tool.Blender.get_object_bim_props(self.related_object).ifc_definition_id + if ifc_id: + bpy.ops.bim.aggregate_assign_object(related_object=ifc_id) + bpy.ops.bim.disable_editing_aggregate() + + def update_aggregate_decorator(self, context): if self.aggregate_decorator: AggregateDecorator.install(bpy.context) @@ -91,12 +105,15 @@ def update_aggregate_mode_decorator(self, context): class BIMObjectAggregateProperties(PropertyGroup): is_editing: BoolProperty(name="Is Editing") - relating_object: PointerProperty(name="Relating Whole", type=bpy.types.Object, poll=poll_relating_object) + relating_object: PointerProperty( + name="Relating Whole", type=bpy.types.Object, poll=poll_relating_object, update=update_relating_object + ) related_object: PointerProperty( name="Related Part", description="Related Part, will be used to derive the Relating Object", type=bpy.types.Object, poll=poll_related_object, + update=update_related_object, ) if TYPE_CHECKING: diff --git a/src/bonsai/bonsai/bim/module/aggregate/ui.py b/src/bonsai/bonsai/bim/module/aggregate/ui.py index e9c596f9ac5..f59ead63085 100644 --- a/src/bonsai/bonsai/bim/module/aggregate/ui.py +++ b/src/bonsai/bonsai/bim/module/aggregate/ui.py @@ -17,10 +17,10 @@ # along with Bonsai. If not, see . from bpy.types import Panel -from bonsai.bim.module.aggregate.data import AggregateData -from bonsai.bim.module.group.data import GroupsData, ObjectGroupsData -from bonsai.bim.ifc import IfcStore + import bonsai.tool as tool +from bonsai.bim.ifc import IfcStore +from bonsai.bim.module.aggregate.data import AggregateData class BIM_PT_aggregate(Panel): diff --git a/src/bonsai/bonsai/bim/module/alignment/operator.py b/src/bonsai/bonsai/bim/module/alignment/operator.py index 58c139b6394..42ad1d25ded 100644 --- a/src/bonsai/bonsai/bim/module/alignment/operator.py +++ b/src/bonsai/bonsai/bim/module/alignment/operator.py @@ -18,26 +18,16 @@ # pyright: reportUnnecessaryTypeIgnoreComment=error -import os - -import ifcopenshell.api.alignment +import time import bpy -import json -import time -import calendar -import isodate -import bonsai.core.sequence as core -import bonsai.tool as tool -import bonsai.bim.module.sequence.helper as helper +import ifcopenshell.api.alignment import ifcopenshell.api.spatial import ifcopenshell.geom -import ifcopenshell.util.sequence -import ifcopenshell.util.selector -from datetime import datetime -from dateutil import parser, relativedelta from bpy_extras.io_utils import ImportHelper +import bonsai.tool as tool + class ImportAlignmentCSV(bpy.types.Operator, tool.Ifc.Operator, ImportHelper): bl_idname = "bim.import_alignment_csv" diff --git a/src/bonsai/bonsai/bim/module/attribute/__init__.py b/src/bonsai/bonsai/bim/module/attribute/__init__.py index 7348a2cffbb..1e1402d6f56 100644 --- a/src/bonsai/bonsai/bim/module/attribute/__init__.py +++ b/src/bonsai/bonsai/bim/module/attribute/__init__.py @@ -17,7 +17,8 @@ # along with Bonsai. If not, see . import bpy -from . import ui, prop, operator + +from . import operator, prop, ui classes = ( operator.EnableEditingAttributes, diff --git a/src/bonsai/bonsai/bim/module/attribute/data.py b/src/bonsai/bonsai/bim/module/attribute/data.py index 8c5000a1285..32f6f895ce5 100644 --- a/src/bonsai/bonsai/bim/module/attribute/data.py +++ b/src/bonsai/bonsai/bim/module/attribute/data.py @@ -18,6 +18,7 @@ import bpy import ifcopenshell + import bonsai.tool as tool diff --git a/src/bonsai/bonsai/bim/module/attribute/operator.py b/src/bonsai/bonsai/bim/module/attribute/operator.py index fb39efe91ea..8069aa29ceb 100644 --- a/src/bonsai/bonsai/bim/module/attribute/operator.py +++ b/src/bonsai/bonsai/bim/module/attribute/operator.py @@ -16,22 +16,25 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . -import bpy import json +from typing import TYPE_CHECKING, Any, Literal, Union + +import bpy import ifcopenshell import ifcopenshell.api.attribute import ifcopenshell.guid import ifcopenshell.util.element + import bonsai.bim.helper -import bonsai.tool as tool import bonsai.core.attribute as core import bonsai.core.spatial -from typing import TYPE_CHECKING, Any, Union, Literal +import bonsai.tool as tool if TYPE_CHECKING: - from bonsai.bim.prop import Attribute import bpy.stub_internal.rna_enums as rna_enums + from bonsai.bim.prop import Attribute + def get_objs_for_operation( operator_properties: "AttributesOperator", context: bpy.types.Context @@ -292,13 +295,13 @@ class ExplorerShowUIPopup(bpy.types.Operator): bl_description = "Show Explorer UI to select element as attribute value or edit it." bl_options = {"REGISTER", "UNDO"} - ifc_class: bpy.props.StringProperty() # pyright: ignore[reportRedeclaration] + ifc_class: bpy.props.StringProperty() """Element IFC class.""" - attribute_name: bpy.props.StringProperty() # pyright: ignore[reportRedeclaration] + attribute_name: bpy.props.StringProperty() """IFC class attribute name.""" - data_path: bpy.props.StringProperty() # pyright: ignore[reportRedeclaration] + data_path: bpy.props.StringProperty() """Full data path""" - preselect_ifc_id: bpy.props.IntProperty(options={"SKIP_SAVE"}) # pyright: ignore[reportRedeclaration] + preselect_ifc_id: bpy.props.IntProperty(options={"SKIP_SAVE"}) """IFC id to preselect in the popup.""" if TYPE_CHECKING: diff --git a/src/bonsai/bonsai/bim/module/attribute/prop.py b/src/bonsai/bonsai/bim/module/attribute/prop.py index 97246cf7ce1..425c875e37c 100644 --- a/src/bonsai/bonsai/bim/module/attribute/prop.py +++ b/src/bonsai/bonsai/bim/module/attribute/prop.py @@ -16,21 +16,19 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . +from typing import TYPE_CHECKING, Union + import bpy -import bonsai.tool as tool -from bonsai.bim.prop import StrProperty, Attribute -from bpy.types import PropertyGroup from bpy.props import ( - PointerProperty, - StringProperty, - EnumProperty, BoolProperty, - IntProperty, - FloatProperty, - FloatVectorProperty, CollectionProperty, + EnumProperty, + IntProperty, ) -from typing import TYPE_CHECKING, Union +from bpy.types import PropertyGroup + +import bonsai.tool as tool +from bonsai.bim.prop import Attribute class BIMAttributeProperties(PropertyGroup): @@ -43,7 +41,7 @@ class BIMAttributeProperties(PropertyGroup): class ExplorerEntity(PropertyGroup): - ifc_definition_id: bpy.props.IntProperty() # pyright: ignore[reportRedeclaration] + ifc_definition_id: bpy.props.IntProperty() if TYPE_CHECKING: ifc_definition_id: int @@ -62,7 +60,7 @@ def update_is_loaded(self, context: object) -> None: self.property_unset("editing_entity_id") self.entity_attributes.clear() - is_loaded: BoolProperty( # pyright: ignore[reportRedeclaration] + is_loaded: BoolProperty( name="Toggle Explorer UI", update=update_is_loaded, ) @@ -78,15 +76,15 @@ def get_ifc_class(self, context: object) -> tool.Blender.BLENDER_ENUM_ITEMS: def update_ifc_class(self, context: object) -> None: tool.Attribute.refresh_uilist_entities() - ifc_class: EnumProperty( # pyright: ignore[reportRedeclaration] + ifc_class: EnumProperty( name="IFC Class To Search", items=get_ifc_class, update=update_ifc_class, ) - entities: CollectionProperty(type=ExplorerEntity) # pyright: ignore[reportRedeclaration] - active_entity_index: IntProperty() # pyright: ignore[reportRedeclaration] - editing_entity_id: IntProperty() # pyright: ignore[reportRedeclaration] - entity_attributes: CollectionProperty(type=Attribute) # pyright: ignore[reportRedeclaration] + entities: CollectionProperty(type=ExplorerEntity) + active_entity_index: IntProperty() + editing_entity_id: IntProperty() + entity_attributes: CollectionProperty(type=Attribute) if TYPE_CHECKING: is_loaded: bool diff --git a/src/bonsai/bonsai/bim/module/attribute/ui.py b/src/bonsai/bonsai/bim/module/attribute/ui.py index 0665c84dd53..84813e8d1e4 100644 --- a/src/bonsai/bonsai/bim/module/attribute/ui.py +++ b/src/bonsai/bonsai/bim/module/attribute/ui.py @@ -17,12 +17,15 @@ # along with Bonsai. If not, see . from __future__ import annotations -import bonsai.bim.helper + +from typing import TYPE_CHECKING + import bpy.types from bpy.types import Panel -from bonsai.bim.module.attribute.data import AttributesData + +import bonsai.bim.helper import bonsai.tool as tool -from typing import TYPE_CHECKING +from bonsai.bim.module.attribute.data import AttributesData if TYPE_CHECKING: from bonsai.bim.module.attribute.prop import BIMExplorerProperties, ExplorerEntity diff --git a/src/bonsai/bonsai/bim/module/augin/__init__.py b/src/bonsai/bonsai/bim/module/augin/__init__.py index 8b8009c4e6a..bff5e9449d2 100644 --- a/src/bonsai/bonsai/bim/module/augin/__init__.py +++ b/src/bonsai/bonsai/bim/module/augin/__init__.py @@ -17,7 +17,8 @@ # along with Bonsai. If not, see . import bpy -from . import ui, prop, operator + +from . import operator, prop, ui classes = ( prop.AuginProperties, diff --git a/src/bonsai/bonsai/bim/module/augin/operator.py b/src/bonsai/bonsai/bim/module/augin/operator.py index b578beb554c..10d802569ac 100644 --- a/src/bonsai/bonsai/bim/module/augin/operator.py +++ b/src/bonsai/bonsai/bim/module/augin/operator.py @@ -16,14 +16,16 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . +import datetime import os -import bpy -import string import random import shutil -import requests +import string import tempfile -import datetime + +import bpy +import requests + import bonsai.tool as tool diff --git a/src/bonsai/bonsai/bim/module/augin/prop.py b/src/bonsai/bonsai/bim/module/augin/prop.py index 9878909eb07..6358371613e 100644 --- a/src/bonsai/bonsai/bim/module/augin/prop.py +++ b/src/bonsai/bonsai/bim/module/augin/prop.py @@ -16,8 +16,9 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . -import bpy.props -import bpy.types +from typing import TYPE_CHECKING + +import bpy class AuginProperties(bpy.types.PropertyGroup): @@ -27,3 +28,11 @@ class AuginProperties(bpy.types.PropertyGroup): project_name: bpy.props.StringProperty(name="Project Name") project_filename: bpy.props.StringProperty(name="IFC Filename") is_success: bpy.props.BoolProperty(name="Is Successful Upload", default=False) + + if TYPE_CHECKING: + username: str + password: str + token: str + project_name: str + project_filename: str + is_success: bool diff --git a/src/bonsai/bonsai/bim/module/augin/ui.py b/src/bonsai/bonsai/bim/module/augin/ui.py index 65ca3ac7f96..dfd6e497307 100644 --- a/src/bonsai/bonsai/bim/module/augin/ui.py +++ b/src/bonsai/bonsai/bim/module/augin/ui.py @@ -17,6 +17,7 @@ # along with Bonsai. If not, see . import bpy.types + import bonsai.tool as tool diff --git a/src/bonsai/bonsai/bim/module/bcf/__init__.py b/src/bonsai/bonsai/bim/module/bcf/__init__.py index e7153974f42..000f3437278 100644 --- a/src/bonsai/bonsai/bim/module/bcf/__init__.py +++ b/src/bonsai/bonsai/bim/module/bcf/__init__.py @@ -17,7 +17,8 @@ # along with Bonsai. If not, see . import bpy -from . import ui, prop, operator + +from . import operator, prop, ui classes = ( operator.ActivateBcfViewpoint, diff --git a/src/bonsai/bonsai/bim/module/bcf/bcfstore.py b/src/bonsai/bonsai/bim/module/bcf/bcfstore.py index 13be3faf1d5..b1abc97c6e8 100644 --- a/src/bonsai/bonsai/bim/module/bcf/bcfstore.py +++ b/src/bonsai/bonsai/bim/module/bcf/bcfstore.py @@ -17,12 +17,12 @@ # along with Bonsai. If not, see . import os -import bpy -import bcf +from typing import Union + import bcf.bcfxml -import bcf.v2.bcfxml +import bpy + import bonsai.tool as tool -from typing import Union class BcfStore: diff --git a/src/bonsai/bonsai/bim/module/bcf/operator.py b/src/bonsai/bonsai/bim/module/bcf/operator.py index 1c6137e93b2..461321852d7 100644 --- a/src/bonsai/bonsai/bim/module/bcf/operator.py +++ b/src/bonsai/bonsai/bim/module/bcf/operator.py @@ -16,38 +16,35 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . -import os -import bcf.v3 +import tempfile +import uuid +import webbrowser +from math import atan, degrees, radians, tan +from pathlib import Path + +import bcf.agnostic.topic +import bcf.agnostic.visinfo +import bcf.v2.bcfxml +import bcf.v2.model +import bcf.v2.topic +import bcf.v2.visinfo import bcf.v3.bcfxml import bcf.v3.document import bcf.v3.model import bcf.v3.topic import bcf.v3.visinfo import bpy -import bcf -import bcf.bcfxml -import bcf.v2.bcfxml -import bcf.v2.model -import bcf.v2.topic -import bcf.v2.visinfo -import bcf.agnostic.topic -import bcf.agnostic.visinfo -import uuid -import numpy as np -import tempfile -import webbrowser import ifcopenshell import ifcopenshell.util.geolocation import ifcopenshell.util.unit -import bonsai.tool as tool -import bonsai.bim.module.bcf.prop as bcf_prop -import bonsai.bim.module.bcf.bcfstore as bcfstore -from bpy_extras.io_utils import ImportHelper, ExportHelper -from pathlib import Path -from math import radians, degrees, atan, tan, cos, sin -from mathutils import Vector, Matrix, Euler, geometry +import numpy as np +from bpy_extras.io_utils import ExportHelper, ImportHelper +from mathutils import Matrix, Vector from xsdata.models.datatype import XmlDateTime +import bonsai.bim.module.bcf.bcfstore as bcfstore +import bonsai.tool as tool + class NewBcfProject(bpy.types.Operator): bl_idname = "bim.new_bcf_project" @@ -1256,8 +1253,8 @@ def execute(self, context): else: obj.data.show_background_images = False - area = next(area for area in context.screen.areas if area.type == "VIEW_3D") - area.spaces[0].region_3d.view_perspective = "CAMERA" + assert (space := tool.Blender.get_view3d_space()) + space.region_3d.view_perspective = "CAMERA" if self.file: self.set_viewpoint_components(viewpoint, context) diff --git a/src/bonsai/bonsai/bim/module/bcf/prop.py b/src/bonsai/bonsai/bim/module/bcf/prop.py index 6a01115821d..651c0c052f1 100644 --- a/src/bonsai/bonsai/bim/module/bcf/prop.py +++ b/src/bonsai/bonsai/bim/module/bcf/prop.py @@ -16,24 +16,24 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . +from typing import TYPE_CHECKING, Union + import bpy -import bonsai.tool as tool -from . import bcfstore -from bonsai.bim.prop import StrProperty -from bpy.types import PropertyGroup +from bcf.agnostic.extensions import get_extensions_attributes from bpy.props import ( - PointerProperty, - StringProperty, - EnumProperty, BoolProperty, - IntProperty, - FloatProperty, - FloatVectorProperty, CollectionProperty, + EnumProperty, + IntProperty, + PointerProperty, + StringProperty, ) -from bcf.agnostic.extensions import get_extensions_attributes -from typing import TYPE_CHECKING, Union +from bpy.types import PropertyGroup +import bonsai.tool as tool +from bonsai.bim.prop import StrProperty + +from . import bcfstore bcfviewpoints_enum = None @@ -230,7 +230,7 @@ class BcfTopic(PropertyGroup): def get_related_topics(self: "BCFProperties", context: bpy.types.Context) -> list[tuple[str, str, str]]: - global RELATED_TOPICS_ENUM_ITEMS + global RELATED_TOPICS_ENUM_ITEMS # ty: ignore[unresolved-global] props = self active_topic = props.active_topic active_related_topics = active_topic.related_topics.keys() diff --git a/src/bonsai/bonsai/bim/module/bcf/ui.py b/src/bonsai/bonsai/bim/module/bcf/ui.py index d0d25ecd10f..881bef488ba 100644 --- a/src/bonsai/bonsai/bim/module/bcf/ui.py +++ b/src/bonsai/bonsai/bim/module/bcf/ui.py @@ -17,15 +17,18 @@ # along with Bonsai. If not, see . from __future__ import annotations -import os + +from typing import TYPE_CHECKING + import bpy +from bpy.types import Panel + import bonsai.tool as tool + from . import bcfstore -from bpy.types import Panel -from typing import TYPE_CHECKING if TYPE_CHECKING: - from bonsai.bim.module.bcf.prop import BcfTopic, BCFProperties + from bonsai.bim.module.bcf.prop import BCFProperties, BcfTopic class BIM_PT_bcf(Panel): diff --git a/src/bonsai/bonsai/bim/module/boundary/__init__.py b/src/bonsai/bonsai/bim/module/boundary/__init__.py index cf2f78a7da7..fe11440adc7 100644 --- a/src/bonsai/bonsai/bim/module/boundary/__init__.py +++ b/src/bonsai/bonsai/bim/module/boundary/__init__.py @@ -17,7 +17,8 @@ # along with Bonsai. If not, see . import bpy -from . import ui, operator, prop + +from . import operator, prop, ui classes = ( operator.AddBoundary, diff --git a/src/bonsai/bonsai/bim/module/boundary/data.py b/src/bonsai/bonsai/bim/module/boundary/data.py index e7f82caf4c1..58ccadc7132 100644 --- a/src/bonsai/bonsai/bim/module/boundary/data.py +++ b/src/bonsai/bonsai/bim/module/boundary/data.py @@ -17,6 +17,7 @@ # along with Bonsai. If not, see . import bpy + import bonsai.tool as tool diff --git a/src/bonsai/bonsai/bim/module/boundary/decorator.py b/src/bonsai/bonsai/bim/module/boundary/decorator.py index c7875c94bfb..a2d134a1357 100644 --- a/src/bonsai/bonsai/bim/module/boundary/decorator.py +++ b/src/bonsai/bonsai/bim/module/boundary/decorator.py @@ -16,13 +16,13 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . -import gpu import bmesh -import bonsai.tool as tool +import gpu from bpy.types import SpaceView3D -from mathutils import Vector from gpu_extras.batch import batch_for_shader +import bonsai.tool as tool + class BoundaryDecorator: installed = None diff --git a/src/bonsai/bonsai/bim/module/boundary/operator.py b/src/bonsai/bonsai/bim/module/boundary/operator.py index 89b4bf6e721..45ee8c60e24 100644 --- a/src/bonsai/bonsai/bim/module/boundary/operator.py +++ b/src/bonsai/bonsai/bim/module/boundary/operator.py @@ -16,34 +16,34 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . -import bpy -import bmesh import logging -import shapely -import shapely.ops -import mathutils -import numpy as np import multiprocessing +from math import acos, degrees, inf, pi, radians +from typing import Optional, Union + +import bmesh +import bpy import ifcopenshell.api import ifcopenshell.api.boundary import ifcopenshell.api.root import ifcopenshell.geom -import ifcopenshell.util.unit -import ifcopenshell.util.shape +import ifcopenshell.ifcopenshell_wrapper as W import ifcopenshell.util.element import ifcopenshell.util.placement -import ifcopenshell.util.representation -import bonsai.tool as tool +import ifcopenshell.util.shape +import ifcopenshell.util.unit +import mathutils +import shapely +import shapely.ops +from ifcopenshell.util.shape_builder import ShapeBuilder +from mathutils import Matrix, Vector + import bonsai.bim.import_ifc as import_ifc -from math import pi, inf, degrees, acos, radians -from mathutils import Vector, Matrix +import bonsai.core.geometry +import bonsai.tool as tool from bonsai.bim.ifc import IfcStore -from bonsai.bim.module.model.decorator import ProfileDecorator from bonsai.bim.module.boundary.decorator import BoundaryDecorator -from ifcopenshell.util.shape_builder import ShapeBuilder -import bonsai.core -import bonsai.core.geometry -from typing import Union, Optional +from bonsai.bim.module.model.decorator import ProfileDecorator def disable_editing_boundary_geometry(context): @@ -377,6 +377,8 @@ def execute(self, context): obj = tool.Ifc.get_object(entity) if entity and obj: setattr(bprops, blender_property, obj) + bprops.physical_or_virtual = boundary.PhysicalOrVirtualBoundary or "NOTDEFINED" + bprops.internal_or_external = boundary.InternalOrExternalBoundary or "NOTDEFINED" return {"FINISHED"} @@ -392,6 +394,8 @@ def execute(self, context): bprops.is_editing = False for ifc_attribute, blender_property in EDITABLE_ATTRIBUTES.items(): setattr(bprops, blender_property, None) + bprops.physical_or_virtual = "NOTDEFINED" + bprops.internal_or_external = "NOTDEFINED" return {"FINISHED"} @@ -411,6 +415,8 @@ def _execute(self, context): obj = getattr(bprops, blender_property, None) entity = tool.Ifc.get_entity(obj) attributes[blender_property] = entity + attributes["physical_or_virtual"] = bprops.physical_or_virtual + attributes["internal_or_external"] = bprops.internal_or_external ifcopenshell.api.boundary.edit_attributes(tool.Ifc.get(), entity=boundary, **attributes) bpy.ops.bim.disable_editing_boundary() return {"FINISHED"} @@ -702,6 +708,7 @@ def auto_generate_boundaries( while True: tree.add_element(iterator.get_native()) shape = iterator.get() + assert isinstance(shape, W.TriangulationElement) shapes[shape.id] = { "verts": ifcopenshell.util.shape.get_vertices(shape.geometry), "faces": ifcopenshell.util.shape.get_faces(shape.geometry), diff --git a/src/bonsai/bonsai/bim/module/boundary/prop.py b/src/bonsai/bonsai/bim/module/boundary/prop.py index dc76de0e000..7b4f5069ad1 100644 --- a/src/bonsai/bonsai/bim/module/boundary/prop.py +++ b/src/bonsai/bonsai/bim/module/boundary/prop.py @@ -16,21 +16,18 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . +from typing import TYPE_CHECKING, Union + import bpy -from bpy.types import PropertyGroup -from bonsai.bim.prop import ObjProperty from bpy.props import ( - PointerProperty, - StringProperty, - EnumProperty, BoolProperty, - IntProperty, - FloatProperty, - FloatVectorProperty, - CollectionProperty, + EnumProperty, + PointerProperty, ) +from bpy.types import PropertyGroup + import bonsai.tool as tool -from typing import TYPE_CHECKING, Union +from bonsai.bim.prop import ObjProperty def space_filter(self: "BIMObjectBoundaryProperties", object: bpy.types.Object) -> bool: @@ -54,12 +51,43 @@ def element_filter(self: "BIMObjectBoundaryProperties", object: bpy.types.Object return False +def get_internal_or_external_items( + self: "BIMObjectBoundaryProperties", context: bpy.types.Context | None +) -> list[tuple[str, str, str]]: + items = [ + ("INTERNAL", "Internal", ""), + ("EXTERNAL", "External", ""), + ] + ifc = tool.Ifc.get() + if not ifc or ifc.schema != "IFC2X3": + items += [ + ("EXTERNAL_EARTH", "External Earth", ""), + ("EXTERNAL_WATER", "External Water", ""), + ("EXTERNAL_FIRE", "External Fire", ""), + ] + items.append(("NOTDEFINED", "Not Defined", "")) + return items + + class BIMObjectBoundaryProperties(PropertyGroup): is_editing: BoolProperty(name="Is Editing") relating_space: PointerProperty(name="RelatingSpace", type=bpy.types.Object, poll=space_filter) related_building_element: PointerProperty(name="RelatedBuildingElement", type=bpy.types.Object, poll=element_filter) parent_boundary: PointerProperty(name="ParentBoundary", type=bpy.types.Object, poll=boundary_filter) corresponding_boundary: PointerProperty(name="CorrespondingBoundary", type=bpy.types.Object, poll=boundary_filter) + physical_or_virtual: EnumProperty( + name="PhysicalOrVirtualBoundary", + items=[ + ("PHYSICAL", "Physical", ""), + ("VIRTUAL", "Virtual", ""), + ("NOTDEFINED", "Not Defined", ""), + ], + default="NOTDEFINED", + ) + internal_or_external: EnumProperty( + name="InternalOrExternalBoundary", + items=get_internal_or_external_items, + ) if TYPE_CHECKING: is_editing: bool @@ -67,6 +95,8 @@ class BIMObjectBoundaryProperties(PropertyGroup): related_building_element: Union[bpy.types.Object, None] parent_boundary: Union[bpy.types.Object, None] corresponding_boundary: Union[bpy.types.Object, None] + physical_or_virtual: str + internal_or_external: str # values depend on schema: IFC2X3 omits EXTERNAL_EARTH/WATER/FIRE class BIMBoundaryProperties(PropertyGroup): diff --git a/src/bonsai/bonsai/bim/module/boundary/ui.py b/src/bonsai/bonsai/bim/module/boundary/ui.py index ba7592b34c8..91990a5eb00 100644 --- a/src/bonsai/bonsai/bim/module/boundary/ui.py +++ b/src/bonsai/bonsai/bim/module/boundary/ui.py @@ -16,8 +16,8 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . -import bpy -from bpy.types import Panel, UIList +from bpy.types import Panel + import bonsai.tool as tool from bonsai.bim.module.boundary.data import SpaceBoundariesData @@ -77,6 +77,10 @@ def draw(self, context): self.draw_relation_editor(boundary, "RelatedBuildingElement", "related_building_element") self.draw_relation_editor(boundary, "ParentBoundary", "parent_boundary") self.draw_relation_editor(boundary, "CorrespondingBoundary", "corresponding_boundary") + row = self.layout.row() + row.prop(self.bprops, "physical_or_virtual") + row = self.layout.row() + row.prop(self.bprops, "internal_or_external") else: row = self.layout.row() row.operator("bim.enable_editing_boundary", icon="GREASEPENCIL", text="Edit") @@ -84,6 +88,8 @@ def draw(self, context): self.draw_relation_data(boundary, "RelatedBuildingElement") self.draw_relation_data(boundary, "ParentBoundary") self.draw_relation_data(boundary, "CorrespondingBoundary") + self.draw_enum_data(boundary, "PhysicalOrVirtualBoundary") + self.draw_enum_data(boundary, "InternalOrExternalBoundary") if hasattr(boundary, "InnerBoundaries"): for i, inner_boundary in enumerate(getattr(boundary, "InnerBoundaries", ())): row = self.layout.row(align=True) @@ -110,6 +116,11 @@ def draw_relation_data(self, boundary, ifc_attribute: str): else: row.label(text="") + def draw_enum_data(self, boundary, ifc_attribute: str): + row = self.layout.row(align=True) + row.label(text=ifc_attribute) + row.label(text=getattr(boundary, ifc_attribute, "") or "") + def draw_relation_editor(self, boundary, ifc_attribute: str, blender_property: str): if hasattr(boundary, ifc_attribute): row = self.layout.row(align=True) diff --git a/src/bonsai/bonsai/bim/module/brick/__init__.py b/src/bonsai/bonsai/bim/module/brick/__init__.py index 6f5077f7676..64d1bd3156a 100644 --- a/src/bonsai/bonsai/bim/module/brick/__init__.py +++ b/src/bonsai/bonsai/bim/module/brick/__init__.py @@ -17,7 +17,8 @@ # along with Bonsai. If not, see . import bpy -from . import ui, prop, operator + +from . import operator, prop, ui classes = ( operator.AddBrick, diff --git a/src/bonsai/bonsai/bim/module/brick/data.py b/src/bonsai/bonsai/bim/module/brick/data.py index b7ac6f61e16..e4147235944 100644 --- a/src/bonsai/bonsai/bim/module/brick/data.py +++ b/src/bonsai/bonsai/bim/module/brick/data.py @@ -17,11 +17,12 @@ # along with Bonsai. If not, see . import bpy + import bonsai.tool as tool from bonsai.tool.brick import BrickStore try: - from rdflib import URIRef, BNode + from rdflib import BNode, URIRef except: # See #1860 print("Warning: brickschema not available.") @@ -62,8 +63,7 @@ def active_relations(cls): if namespace == "https://brickschema.org/schema/Brick": return [] results = [] - query = BrickStore.graph.query( - """ + query = BrickStore.graph.query(""" PREFIX brick: PREFIX rdfs: PREFIX rdf: @@ -80,10 +80,7 @@ def active_relations(cls): } } GROUP BY ?object - """.replace( - "{uri}", uri - ) - ) + """.replace("{uri}", uri)) for row in query: predicate_uri = row.get("predicate") predicate_name = predicate_uri.toPython().split("#")[-1] diff --git a/src/bonsai/bonsai/bim/module/brick/operator.py b/src/bonsai/bonsai/bim/module/brick/operator.py index 94a9f9fe54b..2f71e6b6387 100644 --- a/src/bonsai/bonsai/bim/module/brick/operator.py +++ b/src/bonsai/bonsai/bim/module/brick/operator.py @@ -17,12 +17,13 @@ # along with Bonsai. If not, see . import os + import bpy -import ifcopenshell.api -import bonsai.tool as tool -import bonsai.core.brick as core +from bpy_extras.io_utils import ExportHelper, ImportHelper + import bonsai.bim.handler -from bpy_extras.io_utils import ImportHelper, ExportHelper +import bonsai.core.brick as core +import bonsai.tool as tool from bonsai.bim.ifc import IfcStore from bonsai.tool.brick import BrickStore diff --git a/src/bonsai/bonsai/bim/module/brick/prop.py b/src/bonsai/bonsai/bim/module/brick/prop.py index 4b738a0c77c..2d507411e4e 100644 --- a/src/bonsai/bonsai/bim/module/brick/prop.py +++ b/src/bonsai/bonsai/bim/module/brick/prop.py @@ -16,24 +16,23 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . +from typing import TYPE_CHECKING + import bpy -from bonsai.bim.module.brick.data import BrickschemaData, BrickschemaReferencesData -from bonsai.bim.prop import StrProperty, Attribute -from bpy.types import PropertyGroup from bpy.props import ( - PointerProperty, - StringProperty, - EnumProperty, BoolProperty, - IntProperty, - FloatProperty, - FloatVectorProperty, CollectionProperty, + EnumProperty, + IntProperty, + StringProperty, ) +from bpy.types import PropertyGroup + import bonsai.core.brick as core import bonsai.tool.brick as tool +from bonsai.bim.module.brick.data import BrickschemaData, BrickschemaReferencesData +from bonsai.bim.prop import StrProperty from bonsai.tool.brick import BrickStore -from typing import TYPE_CHECKING def update_active_brick_index(self, context): @@ -47,26 +46,26 @@ def get_libraries(self, context): def get_namespaces(self, context): - global NAMESPACES_ENUM_ITEMS + global NAMESPACES_ENUM_ITEMS # ty: ignore[unresolved-global] NAMESPACES_ENUM_ITEMS = [(uri, f"{alias}: {uri}", "") for alias, uri in BrickStore.namespaces] return NAMESPACES_ENUM_ITEMS def get_brick_entity_classes(self, context): - global ENTITY_CLASSES_ENUM_ITEMS + global ENTITY_CLASSES_ENUM_ITEMS # ty: ignore[unresolved-global] entity = self.brick_entity_create_type ENTITY_CLASSES_ENUM_ITEMS = [(uri, uri.split("#")[-1], "") for uri in BrickStore.entity_classes[entity]] return ENTITY_CLASSES_ENUM_ITEMS def get_brick_roots(self, context): - global BRICK_ROOTS_ENUM_ITEMS + global BRICK_ROOTS_ENUM_ITEMS # ty: ignore[unresolved-global] BRICK_ROOTS_ENUM_ITEMS = [(root, root, "") for root in BrickStore.root_classes] return BRICK_ROOTS_ENUM_ITEMS def get_brick_relations(self, context): - global BRICK_RELATIONS_ENUM_ITEMS + global BRICK_RELATIONS_ENUM_ITEMS # ty: ignore[unresolved-global] BRICK_RELATIONS_ENUM_ITEMS = [(uri, uri.split("#")[-1], "") for uri in BrickStore.relationships] for relation in BrickschemaData.data["active_relations"]: if relation["predicate_name"] == "label": diff --git a/src/bonsai/bonsai/bim/module/brick/ui.py b/src/bonsai/bonsai/bim/module/brick/ui.py index a845b12e8e3..2ec063a0dc7 100644 --- a/src/bonsai/bonsai/bim/module/brick/ui.py +++ b/src/bonsai/bonsai/bim/module/brick/ui.py @@ -16,8 +16,18 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . -import bonsai.tool as tool +from __future__ import annotations + +from typing import TYPE_CHECKING + +import bpy from bpy.types import Panel, UIList + +import bonsai.tool as tool + +if TYPE_CHECKING: + from bonsai.bim.module.brick.prop import Brick + from bonsai.bim.helper import prop_with_search from bonsai.bim.module.brick.data import BrickschemaData, BrickschemaReferencesData from bonsai.tool.brick import BrickStore @@ -273,7 +283,9 @@ def draw(self, context): class BIM_UL_bricks(UIList): split_screen = False - def draw_item(self, context, layout, data, item, icon, active_data, active_propname): + def draw_item( + self, context, layout: bpy.types.UILayout, data, item: Brick, icon, active_data, active_propname + ) -> None: if item: split = layout.split(factor=0.85, align=True) row = split.row() diff --git a/src/bonsai/bonsai/bim/module/bsdd/__init__.py b/src/bonsai/bonsai/bim/module/bsdd/__init__.py index 607e2754c2d..25d6f501f00 100644 --- a/src/bonsai/bonsai/bim/module/bsdd/__init__.py +++ b/src/bonsai/bonsai/bim/module/bsdd/__init__.py @@ -17,7 +17,8 @@ # along with Bonsai. If not, see . import bpy -from . import ui, prop, operator + +from . import operator, prop, ui classes = ( operator.AddBSDDProperties, diff --git a/src/bonsai/bonsai/bim/module/bsdd/data.py b/src/bonsai/bonsai/bim/module/bsdd/data.py index 7905ca75c13..37d030d8673 100644 --- a/src/bonsai/bonsai/bim/module/bsdd/data.py +++ b/src/bonsai/bonsai/bim/module/bsdd/data.py @@ -16,12 +16,8 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . -import bpy -import ifcopenshell -import ifcopenshell.util.date -import ifcopenshell.util.classification + import bonsai.tool as tool -from bonsai.bim.ifc import IfcStore def refresh(): diff --git a/src/bonsai/bonsai/bim/module/bsdd/operator.py b/src/bonsai/bonsai/bim/module/bsdd/operator.py index 3a6d46d1fae..8b94e12fd93 100644 --- a/src/bonsai/bonsai/bim/module/bsdd/operator.py +++ b/src/bonsai/bonsai/bim/module/bsdd/operator.py @@ -16,13 +16,14 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . import textwrap +from typing import Any + import bpy -import bsdd -import bonsai.tool as tool import ifcopenshell.api.pset import ifcopenshell.util.element + +import bonsai.tool as tool from bonsai.core import bsdd as core -from typing import Any class LoadBSDDDictionaries(bpy.types.Operator): diff --git a/src/bonsai/bonsai/bim/module/bsdd/prop.py b/src/bonsai/bonsai/bim/module/bsdd/prop.py index 3b427ba6269..5103358b6ee 100644 --- a/src/bonsai/bonsai/bim/module/bsdd/prop.py +++ b/src/bonsai/bonsai/bim/module/bsdd/prop.py @@ -16,23 +16,22 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . +from typing import TYPE_CHECKING, Literal, Union + import bpy -import bonsai.tool as tool -from bpy.types import PropertyGroup -from bonsai.bim.module.bsdd.data import BSDDData -from bonsai.bim.module.classification.data import ClassificationsData -from bonsai.bim.prop import Attribute, StrProperty from bpy.props import ( - PointerProperty, - StringProperty, - EnumProperty, BoolProperty, - IntProperty, - FloatProperty, - FloatVectorProperty, CollectionProperty, + EnumProperty, + IntProperty, + StringProperty, ) -from typing import Union, TYPE_CHECKING, Literal +from bpy.types import PropertyGroup + +import bonsai.tool as tool +from bonsai.bim.module.bsdd.data import BSDDData +from bonsai.bim.module.classification.data import ClassificationsData +from bonsai.bim.prop import Attribute def get_active_dictionary(self: "BIMBSDDProperties", context: object) -> tool.Blender.BLENDER_ENUM_ITEMS: diff --git a/src/bonsai/bonsai/bim/module/bsdd/ui.py b/src/bonsai/bonsai/bim/module/bsdd/ui.py index 39b2f9140ea..c6966c01d8a 100644 --- a/src/bonsai/bonsai/bim/module/bsdd/ui.py +++ b/src/bonsai/bonsai/bim/module/bsdd/ui.py @@ -17,14 +17,22 @@ # along with Bonsai. If not, see . from __future__ import annotations + +from typing import TYPE_CHECKING + import bpy +from bpy.types import Panel, UIList + import bonsai.tool as tool from bonsai.bim.module.bsdd.data import BSDDData -from bpy.types import Panel, UIList -from typing import TYPE_CHECKING if TYPE_CHECKING: - from bonsai.bim.module.bsdd.prop import BIMBSDDProperties, BSDDDictionary, BSDDClassification, BSDDProperty + from bonsai.bim.module.bsdd.prop import ( + BIMBSDDProperties, + BSDDClassification, + BSDDDictionary, + BSDDProperty, + ) class BIM_PT_bsdd(Panel): diff --git a/src/bonsai/bonsai/bim/module/cad/__init__.py b/src/bonsai/bonsai/bim/module/cad/__init__.py index 601c4da1c38..6ddca2dd96d 100644 --- a/src/bonsai/bonsai/bim/module/cad/__init__.py +++ b/src/bonsai/bonsai/bim/module/cad/__init__.py @@ -17,6 +17,7 @@ # along with Bonsai. If not, see . import bpy + from . import operator, prop, workspace classes = ( diff --git a/src/bonsai/bonsai/bim/module/cad/operator.py b/src/bonsai/bonsai/bim/module/cad/operator.py index 06f026a5777..bef1d851afa 100644 --- a/src/bonsai/bonsai/bim/module/cad/operator.py +++ b/src/bonsai/bonsai/bim/module/cad/operator.py @@ -16,17 +16,16 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . -import bpy import math +from math import pi, sqrt + import bmesh -import mathutils +import bpy import bpy_extras -import bonsai.tool as tool -from mathutils import Vector, Matrix -from math import pi, radians, sin, cos, sqrt -import ifcopenshell.util.unit -from typing import Union +import mathutils +from mathutils import Matrix, Vector +import bonsai.tool as tool messages = { "SHARED_VERTEX": "Shared Vertex, no intersection possible", @@ -38,6 +37,7 @@ class CadTrimExtend(bpy.types.Operator): bl_idname = "bim.cad_trim_extend" bl_label = "CAD Trim / Extend" + bl_description = "Extends/reduces element to 3D cursor" @classmethod def poll(cls, context): @@ -83,6 +83,7 @@ def execute(self, context): class CadMitre(bpy.types.Operator): bl_idname = "bim.cad_mitre" bl_label = "CAD Mitre" + bl_description = "Joins two non-parallel paths at their intersection" @classmethod def poll(cls, context): diff --git a/src/bonsai/bonsai/bim/module/cad/prop.py b/src/bonsai/bonsai/bim/module/cad/prop.py index 7247408f00c..7dab36df918 100644 --- a/src/bonsai/bonsai/bim/module/cad/prop.py +++ b/src/bonsai/bonsai/bim/module/cad/prop.py @@ -16,12 +16,12 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . -import bpy -from bonsai.bim.module.model.data import AuthoringData -from bpy.types import PropertyGroup from math import pi from typing import TYPE_CHECKING +import bpy +from bpy.types import PropertyGroup + class BIMCadProperties(PropertyGroup): resolution: bpy.props.IntProperty(name="Arc Resolution", min=1, default=1) diff --git a/src/bonsai/bonsai/bim/module/cad/workspace.py b/src/bonsai/bonsai/bim/module/cad/workspace.py index 017f4936828..24fb98ba3ff 100644 --- a/src/bonsai/bonsai/bim/module/cad/workspace.py +++ b/src/bonsai/bonsai/bim/module/cad/workspace.py @@ -17,13 +17,13 @@ # along with Bonsai. If not, see . import os +from functools import partial + import bpy -import bonsai.tool as tool -import bonsai.bim.module.type.prop as type_prop -import ifcopenshell.util.unit from bpy.types import WorkSpaceTool -from bonsai.bim.module.model.data import AuthoringData, RailingData, RoofData -from functools import partial + +import bonsai.tool as tool +from bonsai.bim.module.model.data import RailingData, RoofData def load_custom_icons(): @@ -106,23 +106,37 @@ def draw_settings( ) row = layout.row(align=True) - add_layout_hotkey_operator(row, "Extend", "S_E", "Extends/reduces element to 3D cursor", ui_context) + add_layout_hotkey_operator( + row, "Extend", "S_E", bpy.ops.bim.cad_trim_extend.__doc__.split("\n", 1)[1].strip(), ui_context + ) row = row if ui_context == "TOOL_HEADER" else layout.row(align=True) add_layout_hotkey_operator( - row, "Join", "S_T", "Joins two non-parallel paths at their intersection", ui_context + row, "Join", "S_T", bpy.ops.bim.cad_mitre.__doc__.split("\n", 1)[1].strip(), ui_context ) row = row if ui_context == "TOOL_HEADER" else layout.row(align=True) - add_layout_hotkey_operator(row, "Fillet", "S_F", bpy.ops.bim.add_ifcarcindex_fillet.__doc__, ui_context) + add_layout_hotkey_operator( + row, "Fillet", "S_F", bpy.ops.bim.add_ifcarcindex_fillet.__doc__.split("\n", 1)[1].strip(), ui_context + ) row = row if ui_context == "TOOL_HEADER" else layout.row(align=True) - add_layout_hotkey_operator(row, "Offset", "S_O", bpy.ops.bim.cad_offset.__doc__, ui_context) + add_layout_hotkey_operator( + row, "Offset", "S_O", bpy.ops.bim.cad_offset.__doc__.split("\n", 1)[1].strip(), ui_context + ) row = row if ui_context == "TOOL_HEADER" else layout.row(align=True) - add_layout_hotkey_operator(row, "Rectangle", "S_R", bpy.ops.bim.add_rectangle.__doc__, ui_context) + add_layout_hotkey_operator( + row, "Rectangle", "S_R", bpy.ops.bim.add_rectangle.__doc__.split("\n", 1)[1].strip(), ui_context + ) row = row if ui_context == "TOOL_HEADER" else layout.row(align=True) - add_layout_hotkey_operator(row, "Circle", "S_C", bpy.ops.bim.add_ifccircle.__doc__, ui_context) + add_layout_hotkey_operator( + row, "Circle", "S_C", bpy.ops.bim.add_ifccircle.__doc__.split("\n", 1)[1].strip(), ui_context + ) row = row if ui_context == "TOOL_HEADER" else layout.row(align=True) - add_layout_hotkey_operator(row, "3-Point Arc", "S_V", bpy.ops.bim.set_arc_index.__doc__, ui_context) + add_layout_hotkey_operator( + row, "3-Point Arc", "S_V", bpy.ops.bim.set_arc_index.__doc__.split("\n", 1)[1].strip(), ui_context + ) row = row if ui_context == "TOOL_HEADER" else layout.row(align=True) - add_layout_hotkey_operator(row, "Reset Vertex", "S_X", bpy.ops.bim.reset_vertex.__doc__, ui_context) + add_layout_hotkey_operator( + row, "Reset Vertex", "S_X", bpy.ops.bim.reset_vertex.__doc__.split("\n", 1)[1].strip(), ui_context + ) elif ( isinstance(data, tool.Geometry.TYPES_WITH_MESH_PROPERTIES) @@ -132,15 +146,21 @@ def draw_settings( layout, "Edit Axis", "bim.edit_extrusion_axis", "bim.disable_editing_extrusion_axis", ui_context ) row = layout.row(align=True) - add_layout_hotkey_operator(row, "Extend", "S_E", "Extends/reduces element to 3D cursor", ui_context) + add_layout_hotkey_operator( + row, "Extend", "S_E", bpy.ops.bim.cad_trim_extend.__doc__.split("\n", 1)[1].strip(), ui_context + ) row = row if ui_context == "TOOL_HEADER" else layout.row(align=True) add_layout_hotkey_operator( - row, "Join", "S_T", "Joins two non-parallel paths at their intersection", ui_context + row, "Join", "S_T", bpy.ops.bim.cad_mitre.__doc__.split("\n", 1)[1].strip(), ui_context ) row = row if ui_context == "TOOL_HEADER" else layout.row(align=True) - add_layout_hotkey_operator(row, "Fillet", "S_F", bpy.ops.bim.cad_fillet.__doc__, ui_context) + add_layout_hotkey_operator( + row, "Fillet", "S_F", bpy.ops.bim.cad_fillet.__doc__.split("\n", 1)[1].strip(), ui_context + ) row = row if ui_context == "TOOL_HEADER" else layout.row(align=True) - add_layout_hotkey_operator(row, "Offset", "S_O", bpy.ops.bim.cad_offset.__doc__, ui_context) + add_layout_hotkey_operator( + row, "Offset", "S_O", bpy.ops.bim.cad_offset.__doc__.split("\n", 1)[1].strip(), ui_context + ) else: if ( @@ -168,19 +188,37 @@ def draw_settings( add_layout_hotkey_operator(row, "Set Gable Roof Angle", "S_R", "Set Gable Roof Angle", ui_context) row = layout.row(align=True) - add_layout_hotkey_operator(row, "Extend", "S_E", "Extends/reduces element to 3D cursor", ui_context) + add_layout_hotkey_operator( + row, "Extend", "S_E", bpy.ops.bim.cad_trim_extend.__doc__.split("\n", 1)[1].strip(), ui_context + ) row = row if ui_context == "TOOL_HEADER" else layout.row(align=True) add_layout_hotkey_operator( - row, "Join", "S_T", "Joins two non-parallel paths at their intersection", ui_context + row, "Join", "S_T", bpy.ops.bim.cad_mitre.__doc__.split("\n", 1)[1].strip(), ui_context ) row = row if ui_context == "TOOL_HEADER" else layout.row(align=True) - add_layout_hotkey_operator(row, "Fillet", "S_F", bpy.ops.bim.add_ifcarcindex_fillet.__doc__, ui_context) + add_layout_hotkey_operator( + row, "Fillet", "S_F", bpy.ops.bim.add_ifcarcindex_fillet.__doc__.split("\n", 1)[1].strip(), ui_context + ) row = row if ui_context == "TOOL_HEADER" else layout.row(align=True) - add_layout_hotkey_operator(row, "Offset", "S_O", bpy.ops.bim.cad_offset.__doc__, ui_context) + add_layout_hotkey_operator( + row, "Offset", "S_O", bpy.ops.bim.cad_offset.__doc__.split("\n", 1)[1].strip(), ui_context + ) row = row if ui_context == "TOOL_HEADER" else layout.row(align=True) - add_layout_hotkey_operator(row, "2-Point Arc", "S_C", bpy.ops.bim.cad_arc_from_2_points.__doc__, ui_context) + add_layout_hotkey_operator( + row, + "2-Point Arc", + "S_C", + bpy.ops.bim.cad_arc_from_2_points.__doc__.split("\n", 1)[1].strip(), + ui_context, + ) row = row if ui_context == "TOOL_HEADER" else layout.row(align=True) - add_layout_hotkey_operator(row, "3-Point Arc", "S_V", bpy.ops.bim.cad_arc_from_3_points.__doc__, ui_context) + add_layout_hotkey_operator( + row, + "3-Point Arc", + "S_V", + bpy.ops.bim.cad_arc_from_3_points.__doc__.split("\n", 1)[1].strip(), + ui_context, + ) class CadHotkey(bpy.types.Operator): diff --git a/src/bonsai/bonsai/bim/module/clash/__init__.py b/src/bonsai/bonsai/bim/module/clash/__init__.py index a3ada1bc72f..6bfabacfabb 100644 --- a/src/bonsai/bonsai/bim/module/clash/__init__.py +++ b/src/bonsai/bonsai/bim/module/clash/__init__.py @@ -17,7 +17,8 @@ # along with Bonsai. If not, see . import bpy -from . import ui, prop, operator + +from . import operator, prop, ui classes = ( operator.AddClashSet, diff --git a/src/bonsai/bonsai/bim/module/clash/data.py b/src/bonsai/bonsai/bim/module/clash/data.py index b994a1b7504..f5b87ede955 100644 --- a/src/bonsai/bonsai/bim/module/clash/data.py +++ b/src/bonsai/bonsai/bim/module/clash/data.py @@ -16,9 +16,8 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . -import bpy import json -import ifcopenshell.util.element + import bonsai.tool as tool diff --git a/src/bonsai/bonsai/bim/module/clash/decorator.py b/src/bonsai/bonsai/bim/module/clash/decorator.py index 91ecc1fc162..ab95c92d9f9 100644 --- a/src/bonsai/bonsai/bim/module/clash/decorator.py +++ b/src/bonsai/bonsai/bim/module/clash/decorator.py @@ -18,12 +18,12 @@ import blf import gpu -import bmesh -import bonsai.tool as tool from bpy.types import SpaceView3D -from mathutils import Vector -from gpu_extras.batch import batch_for_shader from bpy_extras.view3d_utils import location_3d_to_region_2d +from gpu_extras.batch import batch_for_shader +from mathutils import Vector + +import bonsai.tool as tool class ClashDecorator: diff --git a/src/bonsai/bonsai/bim/module/clash/operator.py b/src/bonsai/bonsai/bim/module/clash/operator.py index 3463b8fc103..ae5f622bbdc 100644 --- a/src/bonsai/bonsai/bim/module/clash/operator.py +++ b/src/bonsai/bonsai/bim/module/clash/operator.py @@ -16,22 +16,21 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . -import os -import bpy import json -import tempfile -import bmesh import logging -import numpy as np -import ifcopenshell -import bonsai.tool as tool +import tempfile +from math import radians from pathlib import Path +from typing import TYPE_CHECKING + +import bpy +import ifcopenshell from bpy_extras.io_utils import ExportHelper, ImportHelper -from math import radians from mathutils import Matrix, Vector + +import bonsai.tool as tool from bonsai.bim.ifc import IfcStore from bonsai.bim.module.clash.decorator import ClashDecorator -from typing import TYPE_CHECKING class ExportClashSets(bpy.types.Operator, ExportHelper): @@ -202,16 +201,10 @@ class ExecuteIfcClash(bpy.types.Operator, ExportHelper): "ALT+click to run a quick clash without selecting a file to save." ) - filter_glob: bpy.props.StringProperty( # pyright: ignore[reportRedeclaration] - default="*.bcf;*.json", options={"HIDDEN"} - ) - format: bpy.props.EnumProperty( # pyright: ignore[reportRedeclaration] - name="Format", items=[(i, i, "") for i in ("bcf", "json")] - ) - filepath: bpy.props.StringProperty( # pyright: ignore[reportRedeclaration] - subtype="FILE_PATH", options={"SKIP_SAVE"} - ) - quick_clash: bpy.props.BoolProperty( # pyright: ignore[reportRedeclaration] + filter_glob: bpy.props.StringProperty(default="*.bcf;*.json", options={"HIDDEN"}) + format: bpy.props.EnumProperty(name="Format", items=[(i, i, "") for i in ("bcf", "json")]) + filepath: bpy.props.StringProperty(subtype="FILE_PATH", options={"SKIP_SAVE"}) + quick_clash: bpy.props.BoolProperty( options={"SKIP_SAVE"}, ) @@ -458,9 +451,7 @@ def poll(cls, context): def execute(self, context): ClashDecorator.uninstall() - for area in context.screen.areas: - if area.type == "VIEW_3D": - area.tag_redraw() + tool.Blender.update_all_viewports(context) return {"FINISHED"} diff --git a/src/bonsai/bonsai/bim/module/clash/prop.py b/src/bonsai/bonsai/bim/module/clash/prop.py index a7c6101b738..1ef3403e648 100644 --- a/src/bonsai/bonsai/bim/module/clash/prop.py +++ b/src/bonsai/bonsai/bim/module/clash/prop.py @@ -16,32 +16,33 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . +from typing import TYPE_CHECKING, Literal, Union + import bpy -import bonsai.tool as tool -from bonsai.bim.prop import StrProperty, Attribute, BIMFilterGroup -from bpy.types import PropertyGroup from bpy.props import ( - PointerProperty, - StringProperty, - EnumProperty, BoolProperty, - IntProperty, + CollectionProperty, + EnumProperty, FloatProperty, FloatVectorProperty, - CollectionProperty, + IntProperty, + StringProperty, ) -from ifcopenshell.geom.main import ClashType, CLASH_TYPE_ITEMS +from bpy.types import PropertyGroup +from ifcopenshell.geom.main import CLASH_TYPE_ITEMS, ClashType from mathutils import Vector -from typing import TYPE_CHECKING, Literal, Union + +import bonsai.tool as tool +from bonsai.bim.prop import BIMFilterGroup, StrProperty class ClashSource(PropertyGroup): - name: StringProperty( # pyright: ignore[reportRedeclaration] + name: StringProperty( name="File", description="Absolute filepath to existing .ifc file to use as a clash source.", ) - filter_groups: CollectionProperty(type=BIMFilterGroup, name="Filter Groups") # pyright: ignore[reportRedeclaration] - mode: EnumProperty( # pyright: ignore[reportRedeclaration] + filter_groups: CollectionProperty(type=BIMFilterGroup, name="Filter Groups") + mode: EnumProperty( items=[ ("a", "All Elements", "All elements will be used for clashing"), ("i", "Include", "Only the selected elements are included for clashing"), @@ -61,7 +62,7 @@ class Clash(PropertyGroup): b_global_id: StringProperty(name="B") a_name: StringProperty(name="A Name") b_name: StringProperty(name="B Name") - clash_type: EnumProperty( # pyright: ignore[reportRedeclaration] + clash_type: EnumProperty( name="Clash Type", items=tuple((i, i, "") for i in CLASH_TYPE_ITEMS), ) diff --git a/src/bonsai/bonsai/bim/module/clash/ui.py b/src/bonsai/bonsai/bim/module/clash/ui.py index 5e3711efe02..a6ef267d84b 100644 --- a/src/bonsai/bonsai/bim/module/clash/ui.py +++ b/src/bonsai/bonsai/bim/module/clash/ui.py @@ -17,15 +17,23 @@ # along with Bonsai. If not, see . from __future__ import annotations + +from typing import TYPE_CHECKING, assert_never + import bpy -import bonsai.tool as tool -import bonsai.bim.helper from bpy.types import Panel + +import bonsai.bim.helper +import bonsai.tool as tool from bonsai.bim.module.clash.data import ClashData -from typing import TYPE_CHECKING, assert_never if TYPE_CHECKING: - from bonsai.bim.module.clash.prop import BIMClashProperties, ClashSet, SmartClashGroup, Clash + from bonsai.bim.module.clash.prop import ( + BIMClashProperties, + Clash, + ClashSet, + SmartClashGroup, + ) class BIM_PT_ifcclash(Panel): diff --git a/src/bonsai/bonsai/bim/module/classification/__init__.py b/src/bonsai/bonsai/bim/module/classification/__init__.py index 6d33b50ee69..155bbdd6eef 100644 --- a/src/bonsai/bonsai/bim/module/classification/__init__.py +++ b/src/bonsai/bonsai/bim/module/classification/__init__.py @@ -17,7 +17,8 @@ # along with Bonsai. If not, see . import bpy -from . import ui, prop, operator + +from . import operator, prop, ui classes = ( operator.AddClassification, diff --git a/src/bonsai/bonsai/bim/module/classification/data.py b/src/bonsai/bonsai/bim/module/classification/data.py index a1fa3a6d58e..9685e8faa90 100644 --- a/src/bonsai/bonsai/bim/module/classification/data.py +++ b/src/bonsai/bonsai/bim/module/classification/data.py @@ -16,12 +16,14 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . +from typing import Any, Literal, Union + import bpy import ifcopenshell -import ifcopenshell.util.date import ifcopenshell.util.classification +import ifcopenshell.util.date + import bonsai.tool as tool -from typing import Any, Literal, Union from bonsai.bim.ifc import IfcStore diff --git a/src/bonsai/bonsai/bim/module/classification/operator.py b/src/bonsai/bonsai/bim/module/classification/operator.py index a6fd0c6df5b..77b77ba5410 100644 --- a/src/bonsai/bonsai/bim/module/classification/operator.py +++ b/src/bonsai/bonsai/bim/module/classification/operator.py @@ -18,14 +18,14 @@ import bpy import ifcopenshell -import ifcopenshell.api -import ifcopenshell.api.pset import ifcopenshell.api.classification +import ifcopenshell.api.pset import ifcopenshell.util.classification import ifcopenshell.util.element -import bonsai.tool as tool -import bonsai.bim.helper from bpy_extras.io_utils import ImportHelper + +import bonsai.bim.helper +import bonsai.tool as tool from bonsai.bim.ifc import IfcStore diff --git a/src/bonsai/bonsai/bim/module/classification/prop.py b/src/bonsai/bonsai/bim/module/classification/prop.py index 4e2de0119de..44f174bd138 100644 --- a/src/bonsai/bonsai/bim/module/classification/prop.py +++ b/src/bonsai/bonsai/bim/module/classification/prop.py @@ -16,22 +16,24 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . +from typing import TYPE_CHECKING + import bpy -import bonsai.tool as tool -from bonsai.bim.prop import Attribute -from bonsai.bim.module.classification.data import ClassificationsData, ObjectClassificationsData -from bpy.types import PropertyGroup from bpy.props import ( - PointerProperty, - StringProperty, - EnumProperty, BoolProperty, - IntProperty, - FloatProperty, - FloatVectorProperty, CollectionProperty, + EnumProperty, + IntProperty, + StringProperty, ) -from typing import TYPE_CHECKING +from bpy.types import PropertyGroup + +import bonsai.tool as tool +from bonsai.bim.module.classification.data import ( + ClassificationsData, + ObjectClassificationsData, +) +from bonsai.bim.prop import Attribute def get_available_classifications( diff --git a/src/bonsai/bonsai/bim/module/classification/ui.py b/src/bonsai/bonsai/bim/module/classification/ui.py index 077f97553fb..6840238927d 100644 --- a/src/bonsai/bonsai/bim/module/classification/ui.py +++ b/src/bonsai/bonsai/bim/module/classification/ui.py @@ -17,24 +17,28 @@ # along with Bonsai. If not, see . from __future__ import annotations + +from typing import TYPE_CHECKING, Any, Union + import bpy -import bonsai.bim.helper -import bonsai.tool as tool -import bonsai.bim.module.classification.prop as classification_prop import ifcopenshell.util.classification - from bpy.types import Panel, UIList + +import bonsai.bim.helper +import bonsai.tool as tool from bonsai.bim.module.classification.data import ( ClassificationsData, - ObjectClassificationsData, - MaterialClassificationsData, CostClassificationsData, + MaterialClassificationsData, + ObjectClassificationsData, ZoneClassificationsData, ) -from typing import TYPE_CHECKING, Any, Union if TYPE_CHECKING: - from bonsai.bim.module.classification.prop import BIMClassificationProperties, ClassificationReference + from bonsai.bim.module.classification.prop import ( + BIMClassificationProperties, + ClassificationReference, + ) class BIM_PT_classifications(Panel): diff --git a/src/bonsai/bonsai/bim/module/constraint/__init__.py b/src/bonsai/bonsai/bim/module/constraint/__init__.py index 54b5183023d..858c1da1307 100644 --- a/src/bonsai/bonsai/bim/module/constraint/__init__.py +++ b/src/bonsai/bonsai/bim/module/constraint/__init__.py @@ -17,7 +17,8 @@ # along with Bonsai. If not, see . import bpy -from . import ui, prop, operator + +from . import operator, prop, ui classes = ( operator.LoadObjectives, diff --git a/src/bonsai/bonsai/bim/module/constraint/data.py b/src/bonsai/bonsai/bim/module/constraint/data.py index 8a92de2c713..d44a7d2a557 100644 --- a/src/bonsai/bonsai/bim/module/constraint/data.py +++ b/src/bonsai/bonsai/bim/module/constraint/data.py @@ -17,9 +17,10 @@ # along with Bonsai. If not, see . import bpy -import bonsai.tool as tool from ifcopenshell.util.doc import get_entity_doc +import bonsai.tool as tool + def refresh(): ConstraintsData.is_loaded = False diff --git a/src/bonsai/bonsai/bim/module/constraint/operator.py b/src/bonsai/bonsai/bim/module/constraint/operator.py index 4297642c3b8..d438325f446 100644 --- a/src/bonsai/bonsai/bim/module/constraint/operator.py +++ b/src/bonsai/bonsai/bim/module/constraint/operator.py @@ -16,12 +16,13 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . +from typing import TYPE_CHECKING + import bpy -import ifcopenshell.api import ifcopenshell.api.constraint + import bonsai.bim.helper import bonsai.tool as tool -from typing import TYPE_CHECKING def get_active_object(context: bpy.types.Context, obj_name: str) -> bpy.types.Object: diff --git a/src/bonsai/bonsai/bim/module/constraint/prop.py b/src/bonsai/bonsai/bim/module/constraint/prop.py index ec66f782115..55ae9d12232 100644 --- a/src/bonsai/bonsai/bim/module/constraint/prop.py +++ b/src/bonsai/bonsai/bim/module/constraint/prop.py @@ -16,23 +16,19 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . +from typing import TYPE_CHECKING, Literal + import bpy -from ifcopenshell.util.doc import get_entity_doc -import bonsai.tool as tool -from bonsai.bim.prop import Attribute -from bonsai.bim.module.constraint.data import ConstraintsData -from bpy.types import PropertyGroup from bpy.props import ( - PointerProperty, - StringProperty, + CollectionProperty, EnumProperty, - BoolProperty, IntProperty, - FloatProperty, - FloatVectorProperty, - CollectionProperty, + StringProperty, ) -from typing import TYPE_CHECKING, Literal +from bpy.types import PropertyGroup + +from bonsai.bim.module.constraint.data import ConstraintsData +from bonsai.bim.prop import Attribute def get_available_constraint_types(self, context): diff --git a/src/bonsai/bonsai/bim/module/constraint/ui.py b/src/bonsai/bonsai/bim/module/constraint/ui.py index 61b335d782a..5ab3d7c93c5 100644 --- a/src/bonsai/bonsai/bim/module/constraint/ui.py +++ b/src/bonsai/bonsai/bim/module/constraint/ui.py @@ -17,14 +17,21 @@ # along with Bonsai. If not, see . from __future__ import annotations -import bonsai.tool as tool + +from typing import TYPE_CHECKING + from bpy.types import Panel, UIList + +import bonsai.tool as tool from bonsai.bim.helper import draw_attributes from bonsai.bim.module.constraint.data import ConstraintsData, ObjectConstraintsData -from typing import TYPE_CHECKING if TYPE_CHECKING: - from bonsai.bim.module.constraint.prop import BIMConstraintProperties, BIMObjectConstraintProperties, Constraint + from bonsai.bim.module.constraint.prop import ( + BIMConstraintProperties, + BIMObjectConstraintProperties, + Constraint, + ) class BIM_PT_constraints(Panel): diff --git a/src/bonsai/bonsai/bim/module/context/__init__.py b/src/bonsai/bonsai/bim/module/context/__init__.py index 65665ae290c..da24e53f552 100644 --- a/src/bonsai/bonsai/bim/module/context/__init__.py +++ b/src/bonsai/bonsai/bim/module/context/__init__.py @@ -17,7 +17,8 @@ # along with Bonsai. If not, see . import bpy -from . import ui, prop, operator + +from . import operator, prop, ui classes = ( operator.AddContext, diff --git a/src/bonsai/bonsai/bim/module/context/data.py b/src/bonsai/bonsai/bim/module/context/data.py index c0b21438014..e2717a166a2 100644 --- a/src/bonsai/bonsai/bim/module/context/data.py +++ b/src/bonsai/bonsai/bim/module/context/data.py @@ -16,11 +16,12 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . -import bpy -import bonsai.tool as tool -import ifcopenshell from typing import Any +import ifcopenshell + +import bonsai.tool as tool + def refresh(): ContextData.is_loaded = False diff --git a/src/bonsai/bonsai/bim/module/context/operator.py b/src/bonsai/bonsai/bim/module/context/operator.py index fbf1f179632..88483dfc0c2 100644 --- a/src/bonsai/bonsai/bim/module/context/operator.py +++ b/src/bonsai/bonsai/bim/module/context/operator.py @@ -17,8 +17,9 @@ # along with Bonsai. If not, see . import bpy -import bonsai.tool as tool + import bonsai.core.context as core +import bonsai.tool as tool class AddContext(bpy.types.Operator, tool.Ifc.Operator): diff --git a/src/bonsai/bonsai/bim/module/context/prop.py b/src/bonsai/bonsai/bim/module/context/prop.py index 3a6f3c226f0..e8540746ff3 100644 --- a/src/bonsai/bonsai/bim/module/context/prop.py +++ b/src/bonsai/bonsai/bim/module/context/prop.py @@ -16,21 +16,17 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . +from typing import TYPE_CHECKING + import bpy -from bonsai.bim.prop import StrProperty, Attribute -from bonsai.bim.module.context.data import ContextData -from bpy.types import PropertyGroup from bpy.props import ( - PointerProperty, - StringProperty, + CollectionProperty, EnumProperty, - BoolProperty, IntProperty, - FloatProperty, - FloatVectorProperty, - CollectionProperty, ) -from typing import TYPE_CHECKING +from bpy.types import PropertyGroup + +from bonsai.bim.prop import Attribute class BIMContextProperties(PropertyGroup): diff --git a/src/bonsai/bonsai/bim/module/context/ui.py b/src/bonsai/bonsai/bim/module/context/ui.py index e8d0d337b49..3090da38fc3 100644 --- a/src/bonsai/bonsai/bim/module/context/ui.py +++ b/src/bonsai/bonsai/bim/module/context/ui.py @@ -17,6 +17,7 @@ # along with Bonsai. If not, see . import bpy + import bonsai.bim.helper import bonsai.tool as tool from bonsai.bim.module.context.data import ContextData diff --git a/src/bonsai/bonsai/bim/module/cost/__init__.py b/src/bonsai/bonsai/bim/module/cost/__init__.py index 6f42a71bf9d..9378a68ee18 100644 --- a/src/bonsai/bonsai/bim/module/cost/__init__.py +++ b/src/bonsai/bonsai/bim/module/cost/__init__.py @@ -17,7 +17,8 @@ # along with Bonsai. If not, see . import bpy -from . import ui, prop, operator + +from . import operator, prop, ui classes = ( operator.AddCostColumn, diff --git a/src/bonsai/bonsai/bim/module/cost/data.py b/src/bonsai/bonsai/bim/module/cost/data.py index 4b5198bb035..32299b8e41a 100644 --- a/src/bonsai/bonsai/bim/module/cost/data.py +++ b/src/bonsai/bonsai/bim/module/cost/data.py @@ -16,15 +16,15 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . -import bpy +from typing import Any, Union + import ifcopenshell import ifcopenshell.util.cost import ifcopenshell.util.date import ifcopenshell.util.element import ifcopenshell.util.unit + import bonsai.tool as tool -from ifcopenshell.util.doc import get_entity_doc, get_predefined_type_doc -from typing import Any, Union def refresh(): diff --git a/src/bonsai/bonsai/bim/module/cost/operator.py b/src/bonsai/bonsai/bim/module/cost/operator.py index 644871488c7..ac9d2d4bf14 100644 --- a/src/bonsai/bonsai/bim/module/cost/operator.py +++ b/src/bonsai/bonsai/bim/module/cost/operator.py @@ -18,16 +18,16 @@ # pyright: reportUnnecessaryTypeIgnoreComment=error -import bpy import textwrap -import ifcopenshell.api.nest -import bonsai.tool as tool -from bpy_extras.io_utils import ImportHelper, ExportHelper -import bonsai.tool as tool -import bonsai.core.cost as core from pathlib import Path +from typing import TYPE_CHECKING, Literal, get_args -from typing import get_args, TYPE_CHECKING, Literal +import bpy +import ifcopenshell.api.nest +from bpy_extras.io_utils import ExportHelper, ImportHelper + +import bonsai.core.cost as core +import bonsai.tool as tool class AddCostSchedule(bpy.types.Operator, tool.Ifc.Operator): @@ -87,7 +87,7 @@ class CopyCostSchedule(bpy.types.Operator, tool.Ifc.Operator): bl_label = "Copy Cost Schedule" bl_description = "Create a duplicate of the provided cost schedule." bl_options = {"REGISTER", "UNDO"} - cost_schedule: bpy.props.IntProperty() # pyright: ignore[reportRedeclaration] + cost_schedule: bpy.props.IntProperty() if TYPE_CHECKING: cost_schedule: int @@ -987,10 +987,10 @@ def draw(self, context): @classmethod def poll(cls, context): try: - import typst + import typst # noqa: F401 return True - except: + except ModuleNotFoundError: cls.poll_message_set( "Typst not available.\nIt can be installed from Quality and\nControl -> Debug and using 'typst' with Pip Install.\n(Run Blender as Administrator)" ) diff --git a/src/bonsai/bonsai/bim/module/cost/prop.py b/src/bonsai/bonsai/bim/module/cost/prop.py index 3ce30e665e0..426d5c1e33e 100644 --- a/src/bonsai/bonsai/bim/module/cost/prop.py +++ b/src/bonsai/bonsai/bim/module/cost/prop.py @@ -16,25 +16,28 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . +from typing import TYPE_CHECKING, Literal, Union + import bpy -import ifcopenshell.api import ifcopenshell.api.cost -import bonsai.tool as tool -from bonsai.bim.module.classification.data import CostClassificationsData -from bonsai.bim.module.cost.data import CostSchedulesData, CostItemRatesData, CostItemQuantitiesData -from bonsai.bim.prop import StrProperty, Attribute -from bpy.types import PropertyGroup from bpy.props import ( - PointerProperty, - StringProperty, - EnumProperty, BoolProperty, - IntProperty, - FloatProperty, - FloatVectorProperty, CollectionProperty, + EnumProperty, + FloatProperty, + IntProperty, + StringProperty, ) -from typing import TYPE_CHECKING, Literal, Union +from bpy.types import PropertyGroup + +import bonsai.tool as tool +from bonsai.bim.module.classification.data import CostClassificationsData +from bonsai.bim.module.cost.data import ( + CostItemQuantitiesData, + CostItemRatesData, + CostSchedulesData, +) +from bonsai.bim.prop import Attribute, StrProperty def get_schedule_of_rates(self: "BIMCostProperties", context: bpy.types.Context) -> tool.Blender.BLENDER_ENUM_ITEMS: diff --git a/src/bonsai/bonsai/bim/module/cost/ui.py b/src/bonsai/bonsai/bim/module/cost/ui.py index e8eb58a855c..f8126d3c6c2 100644 --- a/src/bonsai/bonsai/bim/module/cost/ui.py +++ b/src/bonsai/bonsai/bim/module/cost/ui.py @@ -17,16 +17,20 @@ # along with Bonsai. If not, see . from __future__ import annotations + +from typing import TYPE_CHECKING, Any + import bpy +from bpy.types import Panel, UIList + import bonsai.bim.helper import bonsai.bim.module.cost.prop as CostProp import bonsai.tool as tool -from bpy.types import Panel, UIList -from bonsai.bim.module.cost.data import CostSchedulesData -from typing import Any, TYPE_CHECKING +from bonsai.bim.module.cost.data import CostItem, CostSchedulesData if TYPE_CHECKING: from bonsai.bim.module.cost.prop import BIMCostProperties, CostItemQuantity + from bonsai.bim.prop import StrProperty class BIM_PT_cost_schedules(Panel): @@ -395,8 +399,8 @@ def draw(self, context): op = row2.operator("bim.calculate_cost_item_resource_value", text="", icon="DISC") op.cost_item = cost_item.ifc_definition_id - rtprops = context.scene.BIMResourceTreeProperties rprops = tool.Resource.get_resource_props() + rtprops = rprops.tree if rtprops.resources and rprops.active_resource_index < len(rtprops.resources): if has_quantity_names: op = row2.operator("bim.assign_cost_item_quantity", text="", icon="PROPERTIES") @@ -658,9 +662,18 @@ def draw_header(cls, layout: bpy.types.UILayout): split2.alignment = "LEFT" split2.label(text="Rate") - def draw_item(self, context, layout, data, item, icon, active_data, active_propname): + def draw_item( + self, + context, + layout: bpy.types.UILayout, + data: BIMCostProperties, + item: CostProp.CostItem, + icon, + active_data, + active_propname, + ) -> None: if item: - self.props = tool.Cost.get_cost_props() + self.props = data cost_item = CostSchedulesData.data["cost_items"][item.ifc_definition_id] row = layout.row(align=True) @@ -691,7 +704,7 @@ def draw_item(self, context, layout, data, item, icon, active_data, active_propn # TODO: reimplement "bim.copy_cost_item_values" somewhere with better UX - def draw_parent_operator(self, row, cost_item_id): + def draw_parent_operator(self, row: bpy.types.UILayout, cost_item_id: int) -> None: if self.props.active_cost_item_id: if self.props.active_cost_item_id != cost_item_id: op = row.operator("bim.change_parent_cost_item", text="", icon="LINKED", emboss=False).new_parent = ( @@ -700,7 +713,7 @@ def draw_parent_operator(self, row, cost_item_id): else: row.label(text="", icon="BLANK1") - def draw_hierarchy(self, row, item): + def draw_hierarchy(self, row: bpy.types.UILayout, item: CostProp.CostItem) -> None: for i in range(0, item.level_index): row.label(text="", icon="BLANK1") if item.has_children: @@ -746,7 +759,7 @@ def draw_assigned_rate_column(self, layout, cost_item): else: row.label(text="-") - def draw_value_column(self, layout, cost_item): + def draw_value_column(self, layout: bpy.types.UILayout, cost_item: CostItem) -> None: if cost_item["TotalAppliedValue"]: text = "{0:,.2f}".format(cost_item["TotalAppliedValue"]).replace(",", " ") if cost_item["UnitBasisValueComponent"] not in [None, 1]: @@ -757,13 +770,13 @@ def draw_value_column(self, layout, cost_item): else: layout.label(text="-") - def draw_total_cost_column(self, layout, cost_item): + def draw_total_cost_column(self, layout: bpy.types.UILayout, cost_item: CostItem) -> None: format_numbers = "{0:,.2f}".format(cost_item["TotalCost"]).replace(",", " ") currency = CostSchedulesData.data["currency"] text = "{} {}".format(format_numbers, currency["name"]) if currency else format_numbers layout.label(text=text) - def draw_order_operator(self, row, ifc_definition_id, cost_item): + def draw_order_operator(self, row: bpy.types.UILayout, ifc_definition_id: int, cost_item: CostItem) -> None: if cost_item["NestingIndex"] is not None: if cost_item["NestingIndex"] == 0: op = row.operator("bim.reorder_cost_item_nesting", icon="TRIA_DOWN", text="") @@ -790,12 +803,14 @@ class BIM_UL_cost_item_rates(BIM_UL_cost_items_trait, UIList): def draw_quantity_column(self, layout, cost_item): self.draw_uom_column(layout, cost_item) - def draw_total_cost_column(self, layout, cost_item): + def draw_total_cost_column(self, layout: bpy.types.UILayout, cost_item: CostItem) -> None: pass # No such thing as a total cost in a schedule of rates class BIM_UL_cost_columns(UIList): - def draw_item(self, context, layout, data, item, icon, active_data, active_propname): + def draw_item( + self, context, layout: bpy.types.UILayout, data, item: StrProperty, icon, active_data, active_propname + ) -> None: if item: row = layout.row(align=True) row.prop(item, "name", emboss=False, text="") @@ -803,9 +818,17 @@ def draw_item(self, context, layout, data, item, icon, active_data, active_propn class BIM_UL_cost_item_types(UIList): - def draw_item(self, context, layout, data, item, icon, active_data, active_propname): - props = tool.Cost.get_cost_props() - cost_item = props.cost_items[props.active_cost_item_index] + def draw_item( + self, + context, + layout: bpy.types.UILayout, + data: BIMCostProperties, + item: CostProp.CostItemType, + icon, + active_data, + active_propname, + ) -> None: + cost_item = data.cost_items[data.active_cost_item_index] if item: row = layout.row(align=True) @@ -841,7 +864,16 @@ def draw_item( class BIM_UL_product_cost_items(UIList): - def draw_item(self, context, layout, data, item, icon, active_data, active_propname): + def draw_item( + self, + context, + layout: bpy.types.UILayout, + data, + item: CostItemQuantity, + icon, + active_data, + active_propname, + ) -> None: if item: row = layout.row(align=True) op = row.operator("bim.highlight_product_cost_item", text="", icon="STYLUS_PRESSURE") diff --git a/src/bonsai/bonsai/bim/module/covering/__init__.py b/src/bonsai/bonsai/bim/module/covering/__init__.py index 5e00a6dfbe4..3cec5084c4b 100644 --- a/src/bonsai/bonsai/bim/module/covering/__init__.py +++ b/src/bonsai/bonsai/bim/module/covering/__init__.py @@ -17,6 +17,7 @@ # along with Bonsai. If not, see . import bpy + from . import prop, workspace classes = ( diff --git a/src/bonsai/bonsai/bim/module/covering/prop.py b/src/bonsai/bonsai/bim/module/covering/prop.py index 3dc65903aab..3655d50c9f5 100644 --- a/src/bonsai/bonsai/bim/module/covering/prop.py +++ b/src/bonsai/bonsai/bim/module/covering/prop.py @@ -16,9 +16,10 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . +from typing import TYPE_CHECKING + import bpy from bpy.types import PropertyGroup -from typing import TYPE_CHECKING class BIMCoveringProperties(PropertyGroup): diff --git a/src/bonsai/bonsai/bim/module/covering/workspace.py b/src/bonsai/bonsai/bim/module/covering/workspace.py index 3e44b0476d9..728b4f60137 100644 --- a/src/bonsai/bonsai/bim/module/covering/workspace.py +++ b/src/bonsai/bonsai/bim/module/covering/workspace.py @@ -18,13 +18,14 @@ import os +from functools import partial + import bpy -import ifcopenshell +from bpy.types import WorkSpaceTool + import bonsai.tool as tool from bonsai.bim.helper import prop_with_search from bonsai.bim.module.model.data import AuthoringData -from bpy.types import WorkSpaceTool -from functools import partial class CoveringTool(WorkSpaceTool): diff --git a/src/bonsai/bonsai/bim/module/covetool/__init__.py b/src/bonsai/bonsai/bim/module/covetool/__init__.py index 6697f243015..beb75bb7af3 100644 --- a/src/bonsai/bonsai/bim/module/covetool/__init__.py +++ b/src/bonsai/bonsai/bim/module/covetool/__init__.py @@ -17,7 +17,8 @@ # along with Bonsai. If not, see . import bpy -from . import ui, prop, operator + +from . import operator, prop, ui classes = ( prop.CoveToolProject, diff --git a/src/bonsai/bonsai/bim/module/covetool/operator.py b/src/bonsai/bonsai/bim/module/covetool/operator.py index cccb164611d..fb2b2f30863 100644 --- a/src/bonsai/bonsai/bim/module/covetool/operator.py +++ b/src/bonsai/bonsai/bim/module/covetool/operator.py @@ -16,12 +16,13 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . -import bpy import json -import ifcopenshell +from math import atan2, degrees + +import bpy import ifcopenshell.util.element + import bonsai.tool as tool -from math import degrees, atan2 from .api import Api diff --git a/src/bonsai/bonsai/bim/module/covetool/prop.py b/src/bonsai/bonsai/bim/module/covetool/prop.py index 06444de29fd..42e59466d90 100644 --- a/src/bonsai/bonsai/bim/module/covetool/prop.py +++ b/src/bonsai/bonsai/bim/module/covetool/prop.py @@ -16,9 +16,10 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . -import bpy from typing import TYPE_CHECKING +import bpy + class CoveToolProject(bpy.types.PropertyGroup): run_set: bpy.props.StringProperty(name="Run Set") diff --git a/src/bonsai/bonsai/bim/module/covetool/ui.py b/src/bonsai/bonsai/bim/module/covetool/ui.py index e26ac1338ab..1a7015b1392 100644 --- a/src/bonsai/bonsai/bim/module/covetool/ui.py +++ b/src/bonsai/bonsai/bim/module/covetool/ui.py @@ -17,12 +17,15 @@ # along with Bonsai. If not, see . from __future__ import annotations + +from typing import TYPE_CHECKING + import bpy.types + import bonsai.tool as tool -from typing import TYPE_CHECKING if TYPE_CHECKING: - from bonsai.bim.module.covetool.prop import CoveToolProperties, CoveToolProject + from bonsai.bim.module.covetool.prop import CoveToolProject, CoveToolProperties class BIM_PT_covetool(bpy.types.Panel): diff --git a/src/bonsai/bonsai/bim/module/csv/__init__.py b/src/bonsai/bonsai/bim/module/csv/__init__.py index 7a6b99906e4..f544445b202 100644 --- a/src/bonsai/bonsai/bim/module/csv/__init__.py +++ b/src/bonsai/bonsai/bim/module/csv/__init__.py @@ -17,7 +17,8 @@ # along with Bonsai. If not, see . import bpy -from . import ui, prop, operator + +from . import operator, prop, ui classes = ( operator.AddCsvAttribute, diff --git a/src/bonsai/bonsai/bim/module/csv/operator.py b/src/bonsai/bonsai/bim/module/csv/operator.py index 34e20f6d9cc..3b1db40b6b4 100644 --- a/src/bonsai/bonsai/bim/module/csv/operator.py +++ b/src/bonsai/bonsai/bim/module/csv/operator.py @@ -17,20 +17,19 @@ # along with Bonsai. If not, see . from __future__ import annotations -import os -import bpy + import json -import ifccsv -import logging -import tempfile +from collections import Counter +from typing import TYPE_CHECKING + +import bpy import ifcopenshell import ifcopenshell.util.selector -import bonsai.tool as tool -import bonsai.bim.module.drawing.scheduler as scheduler from bpy_extras.io_utils import ExportHelper, ImportHelper + +import bonsai.bim.module.drawing.scheduler as scheduler +import bonsai.tool as tool from bonsai.bim.handler import refresh_ui_data -from typing import TYPE_CHECKING -from collections import Counter if TYPE_CHECKING: import pandas as pd diff --git a/src/bonsai/bonsai/bim/module/csv/prop.py b/src/bonsai/bonsai/bim/module/csv/prop.py index 371776bef2d..8104a8d75bf 100644 --- a/src/bonsai/bonsai/bim/module/csv/prop.py +++ b/src/bonsai/bonsai/bim/module/csv/prop.py @@ -16,20 +16,18 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . +from typing import TYPE_CHECKING, Literal + import bpy -from bonsai.bim.prop import StrProperty, BIMFilterGroup -from bpy.types import PropertyGroup from bpy.props import ( - PointerProperty, - StringProperty, - EnumProperty, BoolProperty, - IntProperty, - FloatProperty, - FloatVectorProperty, CollectionProperty, + EnumProperty, + StringProperty, ) -from typing import TYPE_CHECKING, Literal +from bpy.types import PropertyGroup + +from bonsai.bim.prop import BIMFilterGroup class CsvAttribute(PropertyGroup): diff --git a/src/bonsai/bonsai/bim/module/csv/ui.py b/src/bonsai/bonsai/bim/module/csv/ui.py index a407efc7d1d..c40be1b0377 100644 --- a/src/bonsai/bonsai/bim/module/csv/ui.py +++ b/src/bonsai/bonsai/bim/module/csv/ui.py @@ -16,9 +16,10 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . +from bpy.types import Panel + import bonsai.bim.helper import bonsai.tool as tool -from bpy.types import Panel from bonsai.bim.module.search.data import SearchData diff --git a/src/bonsai/bonsai/bim/module/debug/__init__.py b/src/bonsai/bonsai/bim/module/debug/__init__.py index c01cf03275f..bd3ecac4f6c 100644 --- a/src/bonsai/bonsai/bim/module/debug/__init__.py +++ b/src/bonsai/bonsai/bim/module/debug/__init__.py @@ -17,7 +17,8 @@ # along with Bonsai. If not, see . import bpy -from . import ui, prop, operator + +from . import operator, prop, ui classes = ( operator.ChangeLogLevel, diff --git a/src/bonsai/bonsai/bim/module/debug/operator.py b/src/bonsai/bonsai/bim/module/debug/operator.py index 0820d5e3d60..c88ea4a00ee 100644 --- a/src/bonsai/bonsai/bim/module/debug/operator.py +++ b/src/bonsai/bonsai/bim/module/debug/operator.py @@ -16,34 +16,35 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . +import logging import os -import sys -import bpy -import time +import platform import random -import logging import subprocess -import platform +import sys +import time +from collections import defaultdict +from pathlib import Path +from typing import TYPE_CHECKING, Any, Literal, Union, assert_never, get_args + +import bpy import ifcopenshell -import ifcopenshell.api import ifcopenshell.api.pset import ifcopenshell.geom import ifcopenshell.ifcopenshell_wrapper as W import ifcopenshell.util.element import ifcopenshell.util.placement import ifcopenshell.util.unit -import bonsai.tool as tool +from bpy_extras.io_utils import ExportHelper, ImportHelper + +import bonsai.bim.handler +import bonsai.bim.import_ifc as import_ifc import bonsai.core.debug as core import bonsai.core.profile import bonsai.core.type -import bonsai.bim.handler -import bonsai.bim.import_ifc as import_ifc -from collections import defaultdict -from bpy_extras.io_utils import ImportHelper, ExportHelper -from pathlib import Path -from bonsai import get_debug_info, format_debug_info +import bonsai.tool as tool +from bonsai import format_debug_info, get_debug_info from bonsai.bim.ifc import IfcStore -from typing import get_args, Union, Any, TYPE_CHECKING, Literal, get_args, assert_never if TYPE_CHECKING: from bonsai.bim.prop import Attribute @@ -259,14 +260,14 @@ class CreateAllShapes(bpy.types.Operator): ) bl_options = {"REGISTER"} - geometry_library: bpy.props.EnumProperty( # pyright: ignore[reportRedeclaration] + geometry_library: bpy.props.EnumProperty( name="Geometry Library", description="Geometry library to use for testing shape creation.", items=[(i, i, "") for i in get_args(ifcopenshell.geom.GEOMETRY_LIBRARY)], # By default use the same library as used for importing ifc project. default="hybrid-cgal-simple-opencascade", ) - custom_geometry_library: bpy.props.StringProperty( # pyright: ignore[reportRedeclaration] + custom_geometry_library: bpy.props.StringProperty( name="Custom Geometry Library", description="Provide a custom geometry library name, will override the 'geometry library' property.", ) @@ -780,7 +781,7 @@ class PurgeUnusedObjects(bpy.types.Operator, tool.Ifc.Operator): bl_label = "Purge Unused Objects" bl_options = {"REGISTER", "UNDO"} - object_type: bpy.props.EnumProperty( # pyright: ignore[reportRedeclaration] + object_type: bpy.props.EnumProperty( name="Object Type", items=((s, s.capitalize(), "") for s in get_args(tool.Debug.PurgeMergeObjectType)), ) @@ -826,7 +827,7 @@ class MergeIdenticalObjects(bpy.types.Operator, tool.Ifc.Operator): ) bl_options = {"REGISTER", "UNDO"} - object_type: bpy.props.EnumProperty( # pyright: ignore[reportRedeclaration] + object_type: bpy.props.EnumProperty( name="Object Type", items=((s, s.capitalize(), "") for s in get_args(tool.Debug.PurgeMergeObjectType)), ) @@ -1072,7 +1073,7 @@ class ChangeLogLevel(bpy.types.Operator): bl_options = {"REGISTER"} bl_description = "Change general log level across all Python code in Blender" - log_level: bpy.props.EnumProperty( # pyright: ignore[reportRedeclaration] + log_level: bpy.props.EnumProperty( name="Log Level", items=[(i, i, "") for i in get_args(LogLevelType)], default="WARNING", diff --git a/src/bonsai/bonsai/bim/module/debug/prop.py b/src/bonsai/bonsai/bim/module/debug/prop.py index 5a28b22f791..9744159e206 100644 --- a/src/bonsai/bonsai/bim/module/debug/prop.py +++ b/src/bonsai/bonsai/bim/module/debug/prop.py @@ -16,20 +16,18 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . +from typing import TYPE_CHECKING, Literal, get_args + import bpy -from bonsai.bim.prop import StrProperty, Attribute -from bpy.types import PropertyGroup from bpy.props import ( - PointerProperty, - StringProperty, + CollectionProperty, EnumProperty, - BoolProperty, IntProperty, - FloatProperty, - FloatVectorProperty, - CollectionProperty, + StringProperty, ) -from typing import TYPE_CHECKING, Literal, get_args +from bpy.types import PropertyGroup + +from bonsai.bim.prop import Attribute, StrProperty DisplayType = Literal["BOUNDS", "WIRE", "SOLID", "TEXTURED"] diff --git a/src/bonsai/bonsai/bim/module/debug/ui.py b/src/bonsai/bonsai/bim/module/debug/ui.py index 58af7b9f724..5ffa99cf355 100644 --- a/src/bonsai/bonsai/bim/module/debug/ui.py +++ b/src/bonsai/bonsai/bim/module/debug/ui.py @@ -17,9 +17,10 @@ # along with Bonsai. If not, see . import bpy -import bonsai.tool as tool from bpy.types import Panel +import bonsai.tool as tool + class BIM_PT_debug(Panel): bl_label = "Debug" diff --git a/src/bonsai/bonsai/bim/module/demo/__init__.py b/src/bonsai/bonsai/bim/module/demo/__init__.py index 705e0be0466..7dc5f18ff79 100644 --- a/src/bonsai/bonsai/bim/module/demo/__init__.py +++ b/src/bonsai/bonsai/bim/module/demo/__init__.py @@ -28,7 +28,8 @@ # system when the add-on loads. This is where it happens. import bpy -from . import ui, prop, operator + +from . import operator, prop, ui # You'll need to provide a list of every one of your classes here. If you forget # to specify your class, it won't load and you won't be able to use that diff --git a/src/bonsai/bonsai/bim/module/demo/operator.py b/src/bonsai/bonsai/bim/module/demo/operator.py index 001c8de692a..fb1927c9bdc 100644 --- a/src/bonsai/bonsai/bim/module/demo/operator.py +++ b/src/bonsai/bonsai/bim/module/demo/operator.py @@ -28,8 +28,9 @@ # "Operators", since they correlate to a single user operation. import bpy -import bonsai.tool as tool + import bonsai.core.demo as core +import bonsai.tool as tool # Each button correlates to a class like the one below. In this case, we're diff --git a/src/bonsai/bonsai/bim/module/demo/prop.py b/src/bonsai/bonsai/bim/module/demo/prop.py index 83df8ccfdab..6570c4cbc07 100644 --- a/src/bonsai/bonsai/bim/module/demo/prop.py +++ b/src/bonsai/bonsai/bim/module/demo/prop.py @@ -32,21 +32,13 @@ from typing import TYPE_CHECKING -import bpy -from bpy.types import PropertyGroup - # Properties have many different data types. We won't use all of them in this # demo module, but this is a list for your reference. from bpy.props import ( - PointerProperty, - StringProperty, - EnumProperty, BoolProperty, - IntProperty, - FloatProperty, - FloatVectorProperty, - CollectionProperty, + StringProperty, ) +from bpy.types import PropertyGroup # All properties must belong in a property group. Usually, you'd have a group diff --git a/src/bonsai/bonsai/bim/module/demo/ui.py b/src/bonsai/bonsai/bim/module/demo/ui.py index 6005814cfa3..cade6dbf03f 100644 --- a/src/bonsai/bonsai/bim/module/demo/ui.py +++ b/src/bonsai/bonsai/bim/module/demo/ui.py @@ -27,6 +27,7 @@ # panels, buttons, labels, and input fields are laid out. import bpy + import bonsai.tool as tool from bonsai.bim.module.demo.data import DemoData diff --git a/src/bonsai/bonsai/bim/module/diff/__init__.py b/src/bonsai/bonsai/bim/module/diff/__init__.py index 2cfb1b3c7bb..fdeaf495969 100644 --- a/src/bonsai/bonsai/bim/module/diff/__init__.py +++ b/src/bonsai/bonsai/bim/module/diff/__init__.py @@ -17,7 +17,8 @@ # along with Bonsai. If not, see . import bpy -from . import ui, prop, operator + +from . import operator, prop, ui classes = ( operator.ExecuteIfcDiff, diff --git a/src/bonsai/bonsai/bim/module/diff/data.py b/src/bonsai/bonsai/bim/module/diff/data.py index ac3e545f43d..9fce7f38ba7 100644 --- a/src/bonsai/bonsai/bim/module/diff/data.py +++ b/src/bonsai/bonsai/bim/module/diff/data.py @@ -16,8 +16,10 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . -import bpy import json + +import bpy + import bonsai.tool as tool diff --git a/src/bonsai/bonsai/bim/module/diff/operator.py b/src/bonsai/bonsai/bim/module/diff/operator.py index 954e43ac1eb..020c0c40f20 100644 --- a/src/bonsai/bonsai/bim/module/diff/operator.py +++ b/src/bonsai/bonsai/bim/module/diff/operator.py @@ -16,15 +16,17 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . -import bpy import json import logging + +import bpy import ifcdiff import ifcopenshell +from bpy_extras.io_utils import ExportHelper, ImportHelper + import bonsai.bim.handler import bonsai.bim.import_ifc import bonsai.tool as tool -from bpy_extras.io_utils import ImportHelper, ExportHelper from bonsai.bim.ifc import IfcStore @@ -96,8 +98,8 @@ def execute(self, context): obj.color = (0.0, 1.0, 0.0, 1.0) elif global_id in diff["changed"]: obj.color = (0.0, 0.0, 1.0, 1.0) - area = next(area for area in context.screen.areas if area.type == "VIEW_3D") - area.spaces[0].shading.color_type = "OBJECT" + assert (space := tool.Blender.get_view3d_space()) + space.shading.color_type = "OBJECT" return {"FINISHED"} diff --git a/src/bonsai/bonsai/bim/module/diff/prop.py b/src/bonsai/bonsai/bim/module/diff/prop.py index 61da124a7c4..cfe5b147fed 100644 --- a/src/bonsai/bonsai/bim/module/diff/prop.py +++ b/src/bonsai/bonsai/bim/module/diff/prop.py @@ -16,21 +16,19 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . +from typing import TYPE_CHECKING, Literal, get_args + import bpy -from bonsai.bim.prop import StrProperty, BIMFilterGroup -from bonsai.bim.module.diff.data import DiffData -from bpy.types import PropertyGroup from bpy.props import ( - PointerProperty, - StringProperty, - EnumProperty, BoolProperty, - IntProperty, - FloatProperty, - FloatVectorProperty, CollectionProperty, + EnumProperty, + StringProperty, ) -from typing import TYPE_CHECKING, Literal, get_args +from bpy.types import PropertyGroup + +from bonsai.bim.module.diff.data import DiffData +from bonsai.bim.prop import BIMFilterGroup def update_diff_json_file(self: "DiffProperties", context: bpy.types.Context) -> None: diff --git a/src/bonsai/bonsai/bim/module/diff/ui.py b/src/bonsai/bonsai/bim/module/diff/ui.py index 91e0a6b48ed..383345e8b52 100644 --- a/src/bonsai/bonsai/bim/module/diff/ui.py +++ b/src/bonsai/bonsai/bim/module/diff/ui.py @@ -17,9 +17,10 @@ # along with Bonsai. If not, see . from bpy.types import Panel -from bonsai.bim.module.diff.data import DiffData + import bonsai.bim.helper import bonsai.tool as tool +from bonsai.bim.module.diff.data import DiffData class BIM_PT_diff(Panel): diff --git a/src/bonsai/bonsai/bim/module/document/__init__.py b/src/bonsai/bonsai/bim/module/document/__init__.py index f4eede17217..ac3bdfb1a32 100644 --- a/src/bonsai/bonsai/bim/module/document/__init__.py +++ b/src/bonsai/bonsai/bim/module/document/__init__.py @@ -17,27 +17,32 @@ # along with Bonsai. If not, see . import bpy -from . import ui, prop, operator + +from . import operator, prop, ui classes = ( operator.AddDocumentReference, operator.AddInformation, operator.AssignDocument, operator.DisableDocumentEditingUI, + operator.DisableObjectDocumentEditingUI, operator.DisableEditingDocument, operator.EditDocument, operator.EnableEditingDocument, - operator.LoadDocument, - operator.LoadParentDocument, + operator.LoadObjectDocuments, operator.LoadProjectDocuments, operator.RemoveDocument, operator.SelectDocumentObjects, + operator.ToggleDocument, operator.UnassignDocument, + operator.OpenIFCDocument, prop.Document, + prop.DocumentObject, prop.BIMDocumentProperties, ui.BIM_PT_documents, ui.BIM_PT_object_documents, ui.BIM_UL_documents, + ui.BIM_UL_document_objects, ) diff --git a/src/bonsai/bonsai/bim/module/document/data.py b/src/bonsai/bonsai/bim/module/document/data.py index 5cde82e4990..f194e2f4e0c 100644 --- a/src/bonsai/bonsai/bim/module/document/data.py +++ b/src/bonsai/bonsai/bim/module/document/data.py @@ -17,9 +17,10 @@ # along with Bonsai. If not, see . import os + import bpy -import ifcopenshell -import ifcopenshell.util.schema +from natsort import natsorted + import bonsai.tool as tool @@ -35,30 +36,50 @@ class DocumentData: @classmethod def load(cls): cls.data = { - "total_information": cls.total_information(), - "parent_document": cls.parent_document(), + "total_documents": cls.total_documents(), + "document_objects": cls.document_objects(), } cls.is_loaded = True @classmethod - def total_information(cls): - return len( - [ - rel - for rel in tool.Ifc.get().by_type("IfcProject")[0].HasAssociations or [] - if rel.is_a("IfcRelAssociatesDocument") and rel.RelatingDocument.is_a("IfcDocumentInformation") - ] - ) + def total_documents(cls): + file = tool.Ifc.get() + return len(file.by_type("IfcDocumentInformation")) + len(file.by_type("IfcDocumentReference")) @classmethod - def parent_document(cls): + def document_objects(cls): + document_objects = {} + file = tool.Ifc.get() + + for rel in file.by_type("IfcRelAssociatesDocument"): + document_id = rel.RelatingDocument.id() + if document_id not in document_objects: + document_objects[document_id] = [] + + for related_object in rel.RelatedObjects: + element = related_object + obj = tool.Ifc.get_object(element) + if obj: + document_objects[document_id].append({"id": element.id(), "name": obj.name, "obj": obj}) + + return document_objects + + @classmethod + def load_document_objects_into_props(cls, document_id): + if not cls.is_loaded: + cls.load() + props = tool.Document.get_document_props() - if len(props.breadcrumbs): - parent = tool.Ifc.get().by_id(int(props.breadcrumbs[-1].name)) - if tool.Ifc.get_schema() == "IFC2X3": - return str(parent.DocumentId) - return str(parent.Identification) - return "" + props.document_objects.clear() + + if document_id not in cls.data["document_objects"]: + return + + sorted_objects = natsorted(cls.data["document_objects"][document_id], key=lambda x: x["name"].lower()) + + for obj_data in sorted_objects: + item = props.document_objects.add() + item.name = obj_data["name"] class ObjectDocumentData: @@ -72,6 +93,18 @@ def load(cls): } cls.is_loaded = True + @staticmethod + def convert_to_file_uri(location: str) -> str: + if not location: + return "" + + uri = location + if "://" not in uri: + if not os.path.isabs(uri): + uri = os.path.abspath(os.path.join(os.path.dirname(tool.Ifc.get_path()), uri)) + uri = "file://" + uri + return uri + @classmethod def documents(cls): results = [] @@ -80,44 +113,61 @@ def documents(cls): return results for rel in getattr(element, "HasAssociations", []): if rel.is_a("IfcRelAssociatesDocument"): - if not rel.RelatingDocument.is_a("IfcDocumentReference"): - continue + relating_document = rel.RelatingDocument - name = rel.RelatingDocument.Name + is_information = relating_document.is_a("IfcDocumentInformation") + is_reference = relating_document.is_a("IfcDocumentReference") - if tool.Ifc.get_schema() == "IFC2X3": - if not name and rel.RelatingDocument.ReferenceToDocument: - name = rel.RelatingDocument.ReferenceToDocument[0].Name - - identification = rel.RelatingDocument.ItemReference - if not identification and rel.RelatingDocument.ReferenceToDocument: - identification = rel.RelatingDocument.ReferenceToDocument[0].DocumentId + if not (is_information or is_reference): + continue - location = rel.RelatingDocument.Location - else: - if not name and rel.RelatingDocument.ReferencedDocument: - name = rel.RelatingDocument.ReferencedDocument.Name + name = relating_document.Name - identification = rel.RelatingDocument.Identification - if not identification and rel.RelatingDocument.ReferencedDocument: - identification = rel.RelatingDocument.ReferencedDocument.Identification + location = None + identification = None - location = rel.RelatingDocument.Location - if location is None and rel.RelatingDocument.ReferencedDocument: - location = rel.RelatingDocument.ReferencedDocument.Location + if is_information: + if tool.Ifc.get_schema() == "IFC2X3": + identification = relating_document.DocumentId + else: + identification = relating_document.Identification - if location: - if not "://" in location: - if not os.path.isabs(location): - location = os.path.abspath(os.path.join(os.path.dirname(tool.Ifc.get_path()), location)) - location = "file://" + location + location = getattr(relating_document, "Location", None) + description = getattr(relating_document, "Description", "No description") + else: + description = relating_document.Description + if tool.Ifc.get_schema() == "IFC2X3": + reference_to_document = relating_document.ReferenceToDocument + if not name and reference_to_document: + name = reference_to_document[0].Name + + identification = relating_document.ItemReference + if not identification and reference_to_document: + identification = reference_to_document[0].DocumentId + location = relating_document.Location + else: + referenced_document = relating_document.ReferencedDocument + if not name and referenced_document: + name = referenced_document.Name + + identification = relating_document.Identification + if not identification and referenced_document: + identification = referenced_document.Identification + + location = relating_document.Location + if location is None and referenced_document: + location = referenced_document.Location + + location = cls.convert_to_file_uri(location) if location else None results.append( { - "id": rel.RelatingDocument.id(), + "id": relating_document.id(), "identification": identification, "name": name, "location": location, + "is_information": is_information, + "description": description, } ) return results diff --git a/src/bonsai/bonsai/bim/module/document/operator.py b/src/bonsai/bonsai/bim/module/document/operator.py index da75e16e63b..21abc428954 100644 --- a/src/bonsai/bonsai/bim/module/document/operator.py +++ b/src/bonsai/bonsai/bim/module/document/operator.py @@ -16,14 +16,14 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . -import bpy import json -import ifcopenshell.api -import ifcopenshell.util.attribute + +import bpy import ifcopenshell.util.element -import bonsai.bim.handler -import bonsai.tool as tool + import bonsai.core.document as core +import bonsai.tool as tool +from bonsai.bim.module.document.data import ObjectDocumentData class LoadProjectDocuments(bpy.types.Operator): @@ -33,40 +33,26 @@ class LoadProjectDocuments(bpy.types.Operator): def execute(self, context): core.load_project_documents(tool.Document) - bonsai.bim.handler.refresh_ui_data() # Update breadcrumbs data. return {"FINISHED"} -class LoadDocument(bpy.types.Operator): - bl_idname = "bim.load_document" - bl_label = "Load Document" +class DisableDocumentEditingUI(bpy.types.Operator): + bl_idname = "bim.disable_document_editing_ui" + bl_label = "Disable Document Editing UI" bl_options = {"REGISTER", "UNDO"} - document: bpy.props.IntProperty() def execute(self, context): - core.load_document(tool.Document, document=tool.Ifc.get().by_id(self.document)) - bonsai.bim.handler.refresh_ui_data() # Update breadcrumbs data. + core.disable_document_editing_ui(tool.Document) return {"FINISHED"} -class LoadParentDocument(bpy.types.Operator): - bl_idname = "bim.load_parent_document" - bl_label = "Load Parent Document" +class DisableObjectDocumentEditingUI(bpy.types.Operator): + bl_idname = "bim.disable_object_document_editing_ui" + bl_label = "Disable Object Document Editing UI" bl_options = {"REGISTER", "UNDO"} def execute(self, context): - core.load_parent_document(tool.Document) - bonsai.bim.handler.refresh_ui_data() # Update breadcrumbs data. - return {"FINISHED"} - - -class DisableDocumentEditingUI(bpy.types.Operator): - bl_idname = "bim.disable_document_editing_ui" - bl_label = "Disable Document Editing UI" - bl_options = {"REGISTER", "UNDO"} - - def execute(self, context): - core.disable_document_editing_ui(tool.Document) + core.disable_object_document_editing_ui(tool.Document) return {"FINISHED"} @@ -77,7 +63,7 @@ class EnableEditingDocument(bpy.types.Operator): document: bpy.props.IntProperty() def execute(self, context): - core.enable_editing_document(tool.Document, document=tool.Ifc.get().by_id(self.document)) + core.enable_editing_document(tool.Document, ifc_document=tool.Ifc.get().by_id(self.document)) return {"FINISHED"} @@ -97,7 +83,35 @@ class AddInformation(bpy.types.Operator, tool.Ifc.Operator): bl_options = {"REGISTER", "UNDO"} def _execute(self, context): - core.add_information(tool.Ifc, tool.Document) + props = tool.Document.get_document_props() + parent = None + if props.active_document: + selected_document = props.active_document + + if selected_document.document_type == "PROJECT": + parent = tool.Ifc.get().by_type("IfcProject")[0] + elif selected_document.document_type == "INFORMATION": + parent = tool.Ifc.get().by_id(selected_document.ifc_definition_id) + elif selected_document.document_type == "REFERENCE": + self.report({"ERROR"}, "Cannot add an information element as a child of a reference element") + return {"CANCELLED"} + else: + parent = tool.Ifc.get().by_type("IfcProject")[0] + + core.add_information(tool.Ifc, tool.Document, parent) + + expanded_docs = [] + try: + expanded_docs = json.loads(props.json_string) + except (AttributeError, json.JSONDecodeError): + pass + + if parent and parent.is_a("IfcDocumentInformation"): + if parent.id() not in expanded_docs: + expanded_docs.append(parent.id()) + + props.json_string = json.dumps(expanded_docs) + bpy.ops.bim.load_project_documents() class AddDocumentReference(bpy.types.Operator, tool.Ifc.Operator): @@ -106,7 +120,33 @@ class AddDocumentReference(bpy.types.Operator, tool.Ifc.Operator): bl_options = {"REGISTER", "UNDO"} def _execute(self, context): + props = tool.Document.get_document_props() + + if not props.active_document: + self.report({"ERROR"}, "No document selected") + return {"CANCELLED"} + + selected_document = props.active_document + + if selected_document.document_type != "INFORMATION": + self.report({"ERROR"}, "Cannot add a reference to a document that is not an information element") + return {"CANCELLED"} + + parent = tool.Ifc.get().by_id(selected_document.ifc_definition_id) + + props.document_attributes.clear() core.add_reference(tool.Ifc, tool.Document) + expanded_docs = [] + try: + expanded_docs = json.loads(props.json_string) + except (AttributeError, json.JSONDecodeError): + pass + + if parent.id() not in expanded_docs: + expanded_docs.append(parent.id()) + props.json_string = json.dumps(expanded_docs) + + bpy.ops.bim.load_project_documents() class EditDocument(bpy.types.Operator, tool.Ifc.Operator): @@ -116,7 +156,9 @@ class EditDocument(bpy.types.Operator, tool.Ifc.Operator): def _execute(self, context): props = tool.Document.get_document_props() - core.edit_document(tool.Ifc, tool.Document, document=tool.Ifc.get().by_id(props.active_document_id)) + if props.active_document_id: + core.edit_document(tool.Ifc, tool.Document, ifc_document=tool.Ifc.get().by_id(props.active_document_id)) + props.active_document_id = 0 class RemoveDocument(bpy.types.Operator, tool.Ifc.Operator): @@ -126,7 +168,7 @@ class RemoveDocument(bpy.types.Operator, tool.Ifc.Operator): document: bpy.props.IntProperty() def _execute(self, context): - core.remove_document(tool.Ifc, tool.Document, document=tool.Ifc.get().by_id(self.document)) + core.remove_document(tool.Ifc, tool.Document, ifc_document=tool.Ifc.get().by_id(self.document)) class AssignDocument(bpy.types.Operator, tool.Ifc.Operator): @@ -138,12 +180,15 @@ class AssignDocument(bpy.types.Operator, tool.Ifc.Operator): document: bpy.props.IntProperty() def _execute(self, context): - document = tool.Ifc.get().by_id(self.document) objs = [bpy.data.objects[self.obj]] if self.obj else tool.Blender.get_selected_objects() for obj in objs: element = tool.Ifc.get_entity(obj) if element: - core.assign_document(tool.Ifc, product=element, document=document) + core.assign_document(tool.Ifc, product=element, ifc_document=tool.Ifc.get().by_id(self.document)) + + tool.Document.update_document_objects(self.document) + ObjectDocumentData.load() + return {"FINISHED"} class UnassignDocument(bpy.types.Operator, tool.Ifc.Operator): @@ -154,12 +199,25 @@ class UnassignDocument(bpy.types.Operator, tool.Ifc.Operator): document: bpy.props.IntProperty() def _execute(self, context): - document = tool.Ifc.get().by_id(self.document) objs = [bpy.data.objects.get(self.obj)] if self.obj else tool.Blender.get_selected_objects() for obj in objs: - element = tool.Ifc.get_entity(obj) - if element: - core.unassign_document(tool.Ifc, product=element, document=document) + if obj: + element = tool.Ifc.get_entity(obj) + if element: + core.unassign_document(tool.Ifc, product=element, ifc_document=tool.Ifc.get().by_id(self.document)) + + props = tool.Document.get_document_props() + active_document_id = None + if props.active_document: + active_document_id = props.active_document.ifc_definition_id + + if active_document_id and active_document_id != self.document: + tool.Document.update_document_objects(active_document_id) + else: + tool.Document.update_document_objects() + + ObjectDocumentData.load() + return {"FINISHED"} class SelectDocumentObjects(bpy.types.Operator): @@ -182,3 +240,81 @@ def execute(self, context): i += 1 self.report({"INFO"}, f"{i} objects selected.") return {"FINISHED"} + + +class LoadObjectDocuments(bpy.types.Operator): + bl_idname = "bim.load_object_documents" + bl_label = "Load Object Documents" + bl_description = "Load documents to assign to the selected object" + bl_options = {"REGISTER", "UNDO"} + + def execute(self, context): + core.load_project_documents(tool.Document) + + props = tool.Document.get_document_props() + props.is_object_editing = True + ObjectDocumentData.load() + return {"FINISHED"} + + +class OpenIFCDocument(bpy.types.Operator): + bl_idname = "bim.open_ifc_document" + bl_label = "Open IFC Document" + bl_description = "Open the IFC document in a new Blender instance and load the project" + bl_options = {"REGISTER", "UNDO"} + + uri: bpy.props.StringProperty(name="URI") + + def execute(self, context): + import os + import subprocess + + if not self.uri or not self.uri.lower().startswith("file://"): + self.report({"ERROR"}, "Only local file:// URIs are supported") + return {"CANCELLED"} + + filepath = self.uri[7:] + + if not os.path.exists(filepath): + self.report({"ERROR"}, f"File not found: {filepath}") + return {"CANCELLED"} + + blender_path = bpy.app.binary_path + args = [ + blender_path, + "--python-expr", + "import bpy; bpy.ops.bim.load_project(filepath='{}')".format(filepath), + ] + subprocess.Popen(args) + self.report({"INFO"}, f"Opening {filepath} in a new Blender instance") + + return {"FINISHED"} + + +class ToggleDocument(bpy.types.Operator): + bl_idname = "bim.toggle_document" + bl_label = "Toggle Document" + bl_options = {"REGISTER", "UNDO"} + document: bpy.props.IntProperty() + option: bpy.props.StringProperty() + + def execute(self, context): + expanded_documents = [] + props = tool.Document.get_document_props() + try: + expanded_documents = json.loads(props.json_string) + except (AttributeError, json.JSONDecodeError): + expanded_documents = [] + + document_id = self.document + + document = tool.Ifc.get().by_id(document_id) + if document: + if self.option == "Expand" and document_id not in expanded_documents: + expanded_documents.append(document_id) + elif self.option == "Collapse" and document_id in expanded_documents: + expanded_documents.remove(document_id) + + props.json_string = json.dumps(expanded_documents) + bpy.ops.bim.load_project_documents() + return {"FINISHED"} diff --git a/src/bonsai/bonsai/bim/module/document/prop.py b/src/bonsai/bonsai/bim/module/document/prop.py index f4e4b16686d..01ddf82f432 100644 --- a/src/bonsai/bonsai/bim/module/document/prop.py +++ b/src/bonsai/bonsai/bim/module/document/prop.py @@ -1,36 +1,18 @@ -# Bonsai - OpenBIM Blender Add-on -# Copyright (C) 2020, 2021 Dion Moult -# -# This file is part of Bonsai. -# -# Bonsai is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Bonsai is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Bonsai. If not, see . +from typing import TYPE_CHECKING, Literal, Union import bpy -import bonsai.tool as tool -from bonsai.bim.prop import StrProperty, Attribute -from bpy.types import PropertyGroup from bpy.props import ( - PointerProperty, - StringProperty, - EnumProperty, BoolProperty, - IntProperty, - FloatProperty, - FloatVectorProperty, CollectionProperty, + EnumProperty, + IntProperty, + StringProperty, ) -from typing import TYPE_CHECKING, Union +from bpy.types import PropertyGroup + +import bonsai.tool as tool +from bonsai.bim.module.document.data import DocumentData, refresh +from bonsai.bim.prop import Attribute def update_document_name(self: "Document", context: bpy.types.Context) -> None: @@ -49,18 +31,50 @@ def update_document_identification(self: "Document", context: bpy.types.Context) tool.Document.set_external_reference_id(document, self.identification) +def update_active_document_index(self, context): + refresh() + if document := self.active_document: + if document.ifc_definition_id: + DocumentData.load_document_objects_into_props(document.ifc_definition_id) + + class Document(PropertyGroup): - name: StringProperty(name="Name", update=update_document_name) - identification: StringProperty(name="Identification", update=update_document_identification) - is_information: BoolProperty( - name="Is Information", - description="Whether element is IfcDocumentInformation, otherwise it's IfcDocumentReference.", - ) + name: StringProperty(name="Name") + identification: StringProperty(name="Identification") + description: StringProperty(name="Description") ifc_definition_id: IntProperty(name="IFC Definition ID") + location: StringProperty(name="Location", default="") + tree_depth: IntProperty(name="Tree Depth", default=0) + has_children: BoolProperty(name="Has Children", default=False) + is_expanded: BoolProperty(name="Is Expanded", default=False) + document_type: EnumProperty( + name="Document Type", + items=[ + ("PROJECT", "Project", "Virtual project root node"), + ("INFORMATION", "Information", "IfcDocumentInformation"), + ("REFERENCE", "Reference", "IfcDocumentReference"), + ], + default="INFORMATION", + ) if TYPE_CHECKING: + name: str identification: str - is_information: bool + description: str + ifc_definition_id: int + location: str + tree_depth: int + has_children: bool + is_expanded: bool + document_type: Literal["PROJECT", "INFORMATION", "REFERENCE"] + + +class DocumentObject(PropertyGroup): + name: StringProperty(name="Name") + ifc_definition_id: IntProperty(name="IFC Definition ID") + + if TYPE_CHECKING: + name: str ifc_definition_id: int @@ -68,17 +82,23 @@ class BIMDocumentProperties(PropertyGroup): document_attributes: CollectionProperty(name="Document Attributes", type=Attribute) active_document_id: IntProperty(name="Active Document Id") documents: CollectionProperty(name="Documents", type=Document) - breadcrumbs: CollectionProperty(name="Breadcrumbs", type=StrProperty) - active_document_index: IntProperty(name="Active Document Index") + active_document_index: IntProperty(name="Active Document Index", update=update_active_document_index) is_editing: BoolProperty(name="Is Editing", default=False) + is_object_editing: BoolProperty(name="Is Object Editing", default=False) + document_objects: CollectionProperty(name="Document Objects", type=DocumentObject) + active_document_object_index: IntProperty(name="Active Document Object Index") + json_string: StringProperty(name="JSON String", default="[]") if TYPE_CHECKING: document_attributes: bpy.types.bpy_prop_collection_idprop[Attribute] active_document_id: int documents: bpy.types.bpy_prop_collection_idprop[Document] - breadcrumbs: bpy.types.bpy_prop_collection_idprop[StrProperty] active_document_index: int is_editing: bool + is_object_editing: bool + document_objects: bpy.types.bpy_prop_collection_idprop[DocumentObject] + active_document_object_index: int + json_string: str @property def active_document(self) -> Union[Document, None]: diff --git a/src/bonsai/bonsai/bim/module/document/ui.py b/src/bonsai/bonsai/bim/module/document/ui.py index 5897edbad87..1b25c05c150 100644 --- a/src/bonsai/bonsai/bim/module/document/ui.py +++ b/src/bonsai/bonsai/bim/module/document/ui.py @@ -16,8 +16,22 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . -import bonsai.tool as tool +from __future__ import annotations + +from typing import TYPE_CHECKING + +import bpy from bpy.types import Panel, UIList + +import bonsai.tool as tool + +if TYPE_CHECKING: + from bonsai.bim.module.document.prop import ( + BIMDocumentProperties, + Document, + DocumentObject, + ) + from bonsai.bim.helper import draw_attributes from bonsai.bim.module.document.data import DocumentData, ObjectDocumentData @@ -42,7 +56,8 @@ def draw(self, context): self.props = tool.Document.get_document_props() row = self.layout.row(align=True) - row.label(text="{} Documents Found".format(DocumentData.data["total_information"]), icon="FILE") + row.label(text="{} Documents found".format(DocumentData.data["total_documents"]), icon="FILE") + if self.props.is_editing: row.operator("bim.disable_document_editing_ui", text="", icon="CANCEL") else: @@ -52,34 +67,54 @@ def draw(self, context): return row = self.layout.row(align=True) - if self.props.breadcrumbs: - row.operator("bim.load_parent_document", text="", icon="FRAME_PREV") - row.label(text=DocumentData.data["parent_document"]) - else: - row.alignment = "RIGHT" - row.operator("bim.add_information", text="", icon="ADD") - if self.props.breadcrumbs: - row.operator("bim.add_document_reference", text="", icon="FILE_HIDDEN") - - active_document = self.props.active_document + row.alignment = "RIGHT" - if self.props.active_document_id: + if self.props.active_document_id > 0: row.operator("bim.edit_document", text="", icon="CHECKMARK") row.operator("bim.disable_editing_document", text="", icon="CANCEL") - elif active_document: - ifc_definition_id = active_document.ifc_definition_id - row.operator("bim.select_document_objects", text="", icon="RESTRICT_SELECT_OFF").document = ( - ifc_definition_id - ) - row.operator("bim.assign_document", text="", icon="BRUSH_DATA").document = ifc_definition_id - row.operator("bim.enable_editing_document", text="", icon="GREASEPENCIL").document = ifc_definition_id - row.operator("bim.remove_document", text="", icon="X").document = ifc_definition_id + else: + if not self.props.active_document or self.props.active_document.document_type in ["INFORMATION", "PROJECT"]: + row.operator("bim.add_information", text="", icon="ADD") + + if self.props.active_document and ( + self.props.active_document.document_type == "INFORMATION" + and self.props.active_document.document_type != "PROJECT" + ): + row.operator("bim.add_document_reference", text="", icon="FILE_HIDDEN") + active_document = self.props.active_document + if active_document: + ifc_definition_id = active_document.ifc_definition_id + + if active_document.document_type != "PROJECT": + row.operator("bim.select_document_objects", text="", icon="RESTRICT_SELECT_OFF").document = ( + ifc_definition_id + ) + row.operator("bim.assign_document", text="", icon="BRUSH_DATA").document = ifc_definition_id + row.operator("bim.enable_editing_document", text="", icon="GREASEPENCIL").document = ( + ifc_definition_id + ) + row.operator("bim.remove_document", text="", icon="X").document = ifc_definition_id self.layout.template_list("BIM_UL_documents", "", self.props, "documents", self.props, "active_document_index") - if self.props.active_document_id: + if self.props.active_document_id > 0: + active_document = self.props.active_document draw_attributes(self.props.document_attributes, self.layout) + if self.props.is_editing and self.props.active_document: + document = self.props.active_document + box = self.layout.box() + row = box.row(align=True) + row.label(text="Assigned Objects", icon="OUTLINER_OB_EMPTY") + box.template_list( + "BIM_UL_document_objects", + "", + self.props, + "document_objects", + self.props, + "active_document_object_index", + ) + class BIM_PT_object_documents(Panel): bl_label = "Documents" @@ -102,65 +137,159 @@ def poll(cls, context): return True def draw(self, context): + obj = context.active_object if not ObjectDocumentData.is_loaded: ObjectDocumentData.load() - obj = context.active_object self.oprops = tool.Blender.get_object_bim_props(obj) self.props = tool.Document.get_document_props() self.file = tool.Ifc.get() - self.draw_add_ui() + doc_count = len(ObjectDocumentData.data["documents"]) - if not ObjectDocumentData.data["documents"]: - row = self.layout.row(align=True) - row.label(text="No Documents", icon="FILE") + row = self.layout.row(align=True) + row.label(text="{} Documents Assigned".format(doc_count), icon="FILE") - for document in ObjectDocumentData.data["documents"]: - row = self.layout.row(align=True) - row.label(text=document["identification"] or "*", icon="FILE") - row.label(text=document["name"] or "Unnamed") - if document["location"]: - row.operator("bim.open_uri", icon="URL", text="").uri = document["location"] - row.operator("bim.unassign_document", text="", icon="X").document = document["id"] + if self.props.is_object_editing: + row.operator("bim.disable_object_document_editing_ui", text="", icon="CANCEL") + else: + row.operator("bim.load_object_documents", text="", icon="IMPORT") - def draw_add_ui(self): - if not self.props.is_editing: - row = self.layout.row(align=True) - row.operator("bim.load_project_documents", text="Assign Document References", icon="ADD") + if not self.props.is_object_editing and doc_count == 0: + row = self.layout.row() + row.label(text="No documents assigned", icon="INFO") return - row = self.layout.row(align=True) - if self.props.breadcrumbs: - row.operator("bim.load_parent_document", text="", icon="FRAME_PREV") - row.label(text=DocumentData.data["parent_document"]) - else: + if self.props.is_object_editing: + self.draw_add_ui() + box = self.layout.box() + row = box.row(align=True) + row.label(text="Assigned Documents", icon="OUTLINER_OB_EMPTY") + + if doc_count > 0: + col = box.column(align=True) + for document in ObjectDocumentData.data["documents"]: + row = col.row(align=True) + + # Create a split layout to separate left and right sides + split = row.split(factor=0.7) # Adjust factor as needed (0.7 = 70% left, 30% right) + + # Left side - Document identification and name + left_side = split.row(align=True) + left_side.alignment = "LEFT" + left_side.label(text=document["identification"] or "*", icon="FILE") + left_side.label(text=document["name"] or "Unnamed") + + # Right side - Action buttons + right_side = split.row(align=True) + right_side.alignment = "RIGHT" # Align buttons to the right + + if document["location"]: + if document["location"].lower().endswith(".ifc"): + right_side.operator("bim.open_ifc_document", icon="HIDE_OFF", text="").uri = document[ + "location" + ] + right_side.operator("bim.open_uri", icon="URL", text="").uri = document["location"] + + right_side.operator("bim.unassign_document", text="", icon="X").document = document["id"] + + def draw_add_ui(self): + if self.props.is_object_editing: + row = self.layout.row(align=True) row.alignment = "RIGHT" - if self.props.documents and self.props.active_document_index < len(self.props.documents): - document = self.props.documents[self.props.active_document_index] - if not document.is_information: - row.operator("bim.assign_document", text="", icon="ADD").document = document.ifc_definition_id - row.operator("bim.disable_document_editing_ui", text="", icon="CANCEL") + if self.props.active_document: + document = self.props.active_document - self.layout.template_list("BIM_UL_documents", "", self.props, "documents", self.props, "active_document_index") + assigned_doc_ids = [] + for doc in ObjectDocumentData.data["documents"]: + assigned_doc_ids.append(doc["id"]) + + if ( + document.document_type == "INFORMATION" + and document.document_type != "PROJECT" + and document.ifc_definition_id not in assigned_doc_ids + ): + doc_op = row.operator("bim.assign_document", text="", icon="BRUSH_DATA") + doc_op.document = document.ifc_definition_id + elif document.ifc_definition_id in assigned_doc_ids: + row.label(text="", icon="CHECKMARK") + self.layout.template_list( + "BIM_UL_documents", "", self.props, "documents", self.props, "active_document_index" + ) class BIM_UL_documents(UIList): - def draw_item(self, context, layout, data, item, icon, active_data, active_propname): + def draw_item( + self, + context, + layout: bpy.types.UILayout, + data: BIMDocumentProperties, + item: Document, + icon, + active_data, + active_propname, + ) -> None: if item: row = layout.row(align=True) + indent_depth = 0 + + if item.document_type != "PROJECT": + if item.tree_depth > 1: + indent_depth = item.tree_depth - 1 - if item.is_information: - op = row.operator("bim.load_document", text="", emboss=False, icon="DISCLOSURE_TRI_RIGHT") + for i in range(indent_depth): + row.label(text="", icon="BLANK1") + + if item.document_type == "PROJECT": + row.label(text="", icon="OUTLINER_COLLECTION") + row.label(text=item.name) + return + + if item.document_type == "INFORMATION" and item.has_children: + op = row.operator( + "bim.toggle_document", icon="TRIA_DOWN" if item.is_expanded else "TRIA_RIGHT", text="", emboss=False + ) op.document = item.ifc_definition_id + op.option = "Collapse" if item.is_expanded else "Expand" + elif item.document_type == "INFORMATION": + row.label(text="", icon="BLANK1") + + if item.document_type == "INFORMATION": row.label(text="", icon="FILE") + text = " - ".join([x for x in [item.location, item.description, item.name] if x]) else: - row.label(text="", icon="BLANK1") row.label(text="", icon="FILE_HIDDEN") - + text = " - ".join([x for x in [item.location, item.description] if x]) split1 = row.split(factor=0.1) - # split1.label(text=item.identification) split1.prop(item, "identification", text="", emboss=False) - split2 = split1.split(factor=0.9) - split2.prop(item, "name", text="", emboss=False) + split2 = split1.split(factor=0.8) + split2.label(text=text) + + if item.location: + uri = ObjectDocumentData.convert_to_file_uri(item.location) + if item.location.lower().endswith(".ifc"): + row.operator("bim.open_ifc_document", icon="HIDE_OFF", text="").uri = uri + row.operator("bim.open_uri", icon="URL", text="").uri = uri + + +class BIM_UL_document_objects(UIList): + def draw_item( + self, + context, + layout: bpy.types.UILayout, + data: BIMDocumentProperties, + item: DocumentObject, + icon, + active_data, + active_propname, + ) -> None: + if item: + row = layout.row(align=True) + row.prop(item, "name", text="", emboss=False, icon="OBJECT_DATA") + row.operator("bim.select_object", text="", icon="RESTRICT_SELECT_OFF").obj_name = item.name + + if document := data.active_document: + op = row.operator("bim.unassign_document", text="", icon="X") + op.document = document.ifc_definition_id + op.obj = item.name diff --git a/src/bonsai/bonsai/bim/module/drawing/__init__.py b/src/bonsai/bonsai/bim/module/drawing/__init__.py index 1578f4eeed4..9f172ce2bb1 100644 --- a/src/bonsai/bonsai/bim/module/drawing/__init__.py +++ b/src/bonsai/bonsai/bim/module/drawing/__init__.py @@ -17,9 +17,11 @@ # along with Bonsai. If not, see . import bpy -from . import ui, prop, operator, handler, gizmos, workspace + import bonsai.tool as tool +from . import gizmos, handler, operator, prop, ui, workspace + classes = ( operator.ActivateDrawing, operator.ActivateDrawingFromSheet, @@ -43,6 +45,7 @@ operator.CleanWireframes, operator.ContractSheet, operator.ConvertSVGToDXF, + operator.CopyTextToSelection, operator.CreateDrawing, operator.CreateSheets, operator.DisableAddAnnotationType, @@ -113,7 +116,6 @@ prop.BIMCameraProperties, prop.ElementValueRow, prop.LiteralProps, - prop.LiteralApplySettings, prop.BIMTextProperties, prop.BIMAssignedProductProperties, prop.BIMAnnotationProperties, @@ -158,6 +160,7 @@ def menu_func(self, context): if element and element.is_a("IfcAnnotation") and element.ObjectType in ["SECTION", "ELEVATION"]: self.layout.operator("bim.activate_drawing_by_annotation", text="Go to Drawing") + def register(): if not bpy.app.background: bpy.utils.register_tool(workspace.AnnotationTool, after={"bim.bim_tool"}, separator=True, group=False) @@ -170,7 +173,7 @@ def register(): bpy.app.handlers.load_post.append(handler.load_post) bpy.app.handlers.depsgraph_update_pre.append(handler.depsgraph_update_pre_handler) bpy.types.VIEW3D_MT_image_add.append(ui.add_object_button) - bpy.types.VIEW3D_MT_object_context_menu.append(menu_func) + bpy.types.VIEW3D_MT_object_context_menu.append(menu_func) def unregister(): diff --git a/src/bonsai/bonsai/bim/module/drawing/annotation.py b/src/bonsai/bonsai/bim/module/drawing/annotation.py index 9589b9ac00d..d1e2dc4b2ba 100644 --- a/src/bonsai/bonsai/bim/module/drawing/annotation.py +++ b/src/bonsai/bonsai/bim/module/drawing/annotation.py @@ -17,15 +17,15 @@ # along with Bonsai. If not, see . from __future__ import annotations -import os -import bpy -import math + +from typing import Optional + import bmesh -import bonsai.tool as tool +import bpy import ifcopenshell.util.element -from pathlib import Path -from mathutils import Vector, Matrix -from typing import Optional +from mathutils import Vector + +import bonsai.tool as tool class Annotator: diff --git a/src/bonsai/bonsai/bim/module/drawing/data.py b/src/bonsai/bonsai/bim/module/drawing/data.py index 1b3d1255a10..23ee7c1987d 100644 --- a/src/bonsai/bonsai/bim/module/drawing/data.py +++ b/src/bonsai/bonsai/bim/module/drawing/data.py @@ -16,18 +16,20 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . +import json import os +from pathlib import Path +from typing import Any, Union + import bpy -import json +import ifcopenshell.util.classification import ifcopenshell.util.element -import ifcopenshell.util.representation +import ifcopenshell.util.placement import ifcopenshell.util.unit -import ifcopenshell.util.selector -import bonsai.tool as tool -from pathlib import Path -from typing import Any, Union from natsort import natsorted +import bonsai.tool as tool + def refresh(): ProductAssignmentsData.is_loaded = False @@ -353,8 +355,6 @@ def get_text_data(cls, obj: bpy.types.Object) -> dict[str, Any]: font_size = FONT_SIZES[font_size_type] symbol = tool.Drawing.get_annotation_symbol(element) newline_at = pset_data.get("Newline_At", 0) - reverse_list = pset_data.get("Reverse_List", False) - list_separator = pset_data.get("List_Separator") or ", " # other attributes literals = tool.Drawing.get_text_literal(obj, return_list=True) @@ -365,17 +365,10 @@ def get_text_data(cls, obj: bpy.types.Object) -> dict[str, Any]: for literal in literals: literal_value = literal.Literal - - try: - current_value = cls.evaluate_formatting_expressions(literal_value) - current_value = tool.Drawing.replace_text_literal_variables(current_value, product) - except Exception: - current_value = literal_value - literal_data = { "Literal": literal_value, "BoxAlignment": literal.BoxAlignment, - "CurrentValue": current_value, + "CurrentValue": tool.Drawing.replace_text_literal_variables(literal_value, product), } literals_data.append(literal_data) @@ -384,8 +377,6 @@ def get_text_data(cls, obj: bpy.types.Object) -> dict[str, Any]: "FontSize": font_size, "Symbol": symbol, "Newline_At": newline_at, - "Reverse_List": reverse_list, - "List_Separator": list_separator, } @classmethod @@ -403,21 +394,6 @@ def get_product_for_element_values(cls, text_obj: bpy.types.Object, element: ifc return element - @classmethod - def evaluate_formatting_expressions(cls, text: str) -> str: - """Evaluate formatting expressions wrapped in backticks using ifcopenshell.util.selector.format""" - import re - - def evaluate_expression(match): - try: - expression = match.group(1) - result = ifcopenshell.util.selector.format(expression) - return str(result) - except Exception as e: - return match.group(0) - - return re.sub(r"``([^`]+)``", evaluate_expression, text) - @classmethod def get_element_value_by_key(cls, element: ifcopenshell.entity_instance, key: str): """Get element value by its key using IfcOpenShell selector syntax""" diff --git a/src/bonsai/bonsai/bim/module/drawing/decoration.py b/src/bonsai/bonsai/bim/module/drawing/decoration.py index fc3b9ecbf65..b9b4dd40cbc 100644 --- a/src/bonsai/bonsai/bim/module/drawing/decoration.py +++ b/src/bonsai/bonsai/bim/module/drawing/decoration.py @@ -16,33 +16,34 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . -import gpu -import bpy -import blf -import os import math +import os +from collections.abc import Generator, Iterator +from functools import cache +from math import acos, atan, cos, degrees, pi, radians, sin +from pathlib import Path +from timeit import default_timer as timer +from typing import Optional + +import blf import bmesh -import shapely -import numpy as np +import bpy +import gpu import ifcopenshell import ifcopenshell.util.element import ifcopenshell.util.representation import ifcopenshell.util.unit -import bonsai.tool as tool -import bonsai.bim.module.drawing.helper as helper -from pathlib import Path -from math import pi, sin, cos, acos, atan, degrees, radians +import numpy as np from bpy.types import SpaceView3D -from mathutils import Vector, Matrix from bpy_extras.view3d_utils import location_3d_to_region_2d from gpu_extras.batch import batch_for_shader +from mathutils import Matrix, Vector + +import bonsai.bim.module.drawing.helper as helper +import bonsai.tool as tool from bonsai.bim.module.drawing.data import DecoratorData, DrawingsData -from bonsai.bim.module.drawing.shaders import add_verts_sequence, add_offsets from bonsai.bim.module.drawing.helper import format_distance -from timeit import default_timer as timer -from functools import cache -from typing import Optional, Union -from collections.abc import Generator, Iterator +from bonsai.bim.module.drawing.shaders import add_offsets, add_verts_sequence UNSPECIAL_ELEMENT_COLOR = (0.2, 0.2, 0.2, 1) # GREY @@ -69,9 +70,9 @@ def stop(cls): cls.start_time = None lines = "\n".join(cls.lines) print(lines) - import pyperclip - pyperclip.copy(lines) + assert (wm := bpy.context.window_manager) + wm.clipboard = lines cls.lines = [] @@ -1760,40 +1761,34 @@ def draw_batch(self, shader_type, content_pos, color, indices=None): shader.uniform_float("color", color) batch.draw(shader) - def cache_camera_matrix(self): + def cache_camera_matrix(self) -> None: + assert bpy.context.scene and bpy.context.scene.camera obj = bpy.context.scene.camera - # Explicit `dtype` for Blender <5.0 compatibility. DecoratorData.camera_location_checksum = repr( - np.array(obj.matrix_world.translation, dtype=np.float32).tobytes() + tool.Blender.np_array_legacy(obj.matrix_world.translation).tobytes() ) - DecoratorData.camera_rotation_checksum = repr(np.array(obj.matrix_world.to_3x3(), dtype=np.float32).tobytes()) + DecoratorData.camera_rotation_checksum = repr(tool.Blender.np_array_legacy(obj.matrix_world.to_3x3()).tobytes()) - def is_camera_moved(self): + def is_camera_moved(self) -> bool: if not DecoratorData.camera_location_checksum: self.cache_camera_matrix() return True # Let's be conservative + + assert bpy.context.scene and bpy.context.scene.camera obj = bpy.context.scene.camera # Handle both old float64 and new float32 checksums for version compatibility - loc_checksum_bytes = eval(DecoratorData.camera_location_checksum) - if len(loc_checksum_bytes) == 24: # Old format: 3 * 8 bytes (float64) - loc_check = np.frombuffer(loc_checksum_bytes, dtype=np.float64).astype(np.float32) - else: # New format: 3 * 4 bytes (float32) - loc_check = np.frombuffer(loc_checksum_bytes, dtype=np.float32) - - loc_real = np.array(obj.matrix_world.translation, dtype=np.float32).flatten() + loc_checksum_bytes: bytes = eval(DecoratorData.camera_location_checksum) + loc_check = tool.Blender.np_frombuffer_legacy(loc_checksum_bytes, 3) + loc_real = tool.Blender.np_array_legacy(obj.matrix_world.translation) if not np.allclose(loc_check, loc_real, atol=1e-4): # 0.1 mm self.cache_camera_matrix() return True # Handle both old float64 and new float32 checksums for version compatibility - rot_checksum_bytes = eval(DecoratorData.camera_rotation_checksum) - if len(rot_checksum_bytes) == 72: # Old format: 9 * 8 bytes (float64) - rot_check = np.frombuffer(rot_checksum_bytes, dtype=np.float64).astype(np.float32).reshape(3, 3) - else: # New format: 9 * 4 bytes (float32) - rot_check = np.frombuffer(rot_checksum_bytes, dtype=np.float32).reshape(3, 3) - - rot_real = np.array(obj.matrix_world.to_3x3(), dtype=np.float32) + rot_checksum_bytes: bytes = eval(DecoratorData.camera_rotation_checksum) + rot_check = tool.Blender.np_frombuffer_legacy(rot_checksum_bytes, 9).reshape(3, 3) + rot_real = tool.Blender.np_array_legacy(obj.matrix_world.to_3x3()) rot_dot = np.dot(rot_check, rot_real.T) angle_rad = np.arccos(np.clip((np.trace(rot_dot) - 1) / 2, -1, 1)) if angle_rad > 0.0017453292519943296: # 0.1 degrees diff --git a/src/bonsai/bonsai/bim/module/drawing/gizmos.py b/src/bonsai/bonsai/bim/module/drawing/gizmos.py index 3b25a0b12a2..d350cf80ee8 100644 --- a/src/bonsai/bonsai/bim/module/drawing/gizmos.py +++ b/src/bonsai/bonsai/bim/module/drawing/gizmos.py @@ -132,28 +132,31 @@ class GizmoDoorEdition(bpy.types.GizmoGroup, BaseParametricGizmoGroup): "ExtrusionWidget", ] -from typing import Any, Literal, Protocol, runtime_checkable, get_args +import math from collections.abc import Callable, Iterator +from dataclasses import dataclass from enum import Enum +from typing import Any, Literal, Protocol, get_args, runtime_checkable import blf import bpy import gpu -import math import numpy as np from bpy import types -from dataclasses import dataclass -from mathutils import Vector, Matrix -from mathutils.kdtree import KDTree -from mathutils.geometry import intersect_line_line -from bpy_extras.view3d_utils import region_2d_to_vector_3d, region_2d_to_origin_3d, location_3d_to_region_2d from bpy_extras import view3d_utils +from bpy_extras.view3d_utils import ( + location_3d_to_region_2d, + region_2d_to_origin_3d, + region_2d_to_vector_3d, +) from gpu_extras.batch import batch_for_shader -import bonsai.tool as tool -from bonsai.tool.unit import parse_distance_string -from bonsai.bim.module.drawing.shaders import ExtrusionGuidesShader from ifcopenshell.util.unit import si_conversions +from mathutils import Matrix, Vector, geometry +from mathutils.geometry import intersect_line_line +from mathutils.kdtree import KDTree +import bonsai.tool as tool +from bonsai.bim.module.drawing.shaders import ExtrusionGuidesShader SNAP_POINT_SIZE = 10.0 SNAP_POINT_COLOR = (1.0, 0.5, 0.0, 1.0) @@ -1024,7 +1027,7 @@ def parse(self) -> None: return input_str = self.get_input_string() - is_valid, value = parse_distance_string(input_str) + is_valid, value = tool.Unit.parse_distance_string(input_str) if is_valid: self.parsed_value = value @@ -1240,9 +1243,7 @@ def _draw(self) -> None: @staticmethod def _redraw_viewport() -> None: """Force 3D viewport redraw.""" - for area in bpy.context.screen.areas: - if area.type == "VIEW_3D": - area.tag_redraw() + tool.Blender.update_all_viewports() def build_snap_cache( self, context: bpy.types.Context, active_obj: bpy.types.Object, include_active: bool = False @@ -1284,7 +1285,7 @@ def build_snap_cache( continue coords = np.empty(vertex_count * 3, dtype=np.float32) - mesh.vertices.foreach_get("co", coords) # type: ignore[arg-type] + mesh.vertices.foreach_get("co", coords) coords = coords.reshape(-1, 3) matrix = np.array(obj_eval.matrix_world, dtype=np.float32) diff --git a/src/bonsai/bonsai/bim/module/drawing/handler.py b/src/bonsai/bonsai/bim/module/drawing/handler.py index 75bf62d506f..026d274fb39 100644 --- a/src/bonsai/bonsai/bim/module/drawing/handler.py +++ b/src/bonsai/bonsai/bim/module/drawing/handler.py @@ -17,9 +17,10 @@ # along with Bonsai. If not, see . import bpy +from bpy.app.handlers import persistent + import bonsai.bim.module.drawing.decoration as decoration import bonsai.tool as tool -from bpy.app.handlers import persistent @persistent diff --git a/src/bonsai/bonsai/bim/module/drawing/helper.py b/src/bonsai/bonsai/bim/module/drawing/helper.py index 01a78aad11c..d4895410cb9 100644 --- a/src/bonsai/bonsai/bim/module/drawing/helper.py +++ b/src/bonsai/bonsai/bim/module/drawing/helper.py @@ -16,15 +16,15 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . -import bpy import math + +import bpy import ifcopenshell.util.element -import mathutils.geometry -import ifcopenshell import ifcopenshell.util.unit -import bonsai.tool as tool +import mathutils.geometry from mathutils import Vector -from typing import Union + +import bonsai.tool as tool # Code taken and updated from https://blenderartists.org/t/detecting-intersection-of-bounding-boxes/457520/2 @@ -313,15 +313,13 @@ def format_distance( if not feet and not add_inches: tx_dist += str(feet) + "'" - # Add "0' - " when we have inches but no feet - # But only add " - " separator if we actually have inches to show if not feet and add_inches: - tx_dist += "0' - " + if value < 0: + tx_dist += "-0' - " + else: + tx_dist += "0' - " elif feet and add_inches: tx_dist += " - " - - if not feet and value < 0: - tx_dist += "-" if add_inches: if feet == 0 and inches == 0 and not frac: # Special case: exactly zero, show "0" @@ -458,7 +456,8 @@ def format_distance( tx_dist = fmt % d_cm else: - tx_dist = fmt % value + assert f"Unexpected unit_system - '{unit_system}'." + # tx_dist = fmt % value return tx_dist diff --git a/src/bonsai/bonsai/bim/module/drawing/operator.py b/src/bonsai/bonsai/bim/module/drawing/operator.py index 66c417f3ecb..d6594364bfa 100644 --- a/src/bonsai/bonsai/bim/module/drawing/operator.py +++ b/src/bonsai/bonsai/bim/module/drawing/operator.py @@ -16,58 +16,72 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . -import os -import bpy +import hashlib import json -import re -import time -import bmesh +import logging +import multiprocessing +import os import shutil -import hashlib -import shapely -import shapely.ops import subprocess -import numpy as np -import multiprocessing +import time +from math import radians +from pathlib import Path +from timeit import default_timer as timer +from typing import ( + TYPE_CHECKING, + Any, + Literal, + NamedTuple, + Optional, + TypedDict, + Union, + get_args, +) + +import bmesh +import bpy import ifcopenshell -import ifcopenshell.api import ifcopenshell.api.document +import ifcopenshell.api.geometry import ifcopenshell.api.pset import ifcopenshell.api.style -import ifcopenshell.ifcopenshell_wrapper import ifcopenshell.geom +import ifcopenshell.ifcopenshell_wrapper import ifcopenshell.util.element import ifcopenshell.util.representation import ifcopenshell.util.selector +import ifcopenshell.util.shape_builder import ifcopenshell.util.unit -import bonsai.bim.helper +import numpy as np +import shapely +from bpy_extras.image_utils import load_image +from bpy_extras.io_utils import ImportHelper +from lxml import etree +from mathutils import Color, Vector + +import bonsai.bim.export_ifc import bonsai.bim.handler -import bonsai.tool as tool -import bonsai.core.geometry -import bonsai.core.drawing as core -import bonsai.bim.module.drawing.svgwriter as svgwriter -import bonsai.bim.module.drawing.annotation as annotation +import bonsai.bim.import_ifc import bonsai.bim.module.drawing.sheeter as sheeter -import bonsai.bim.export_ifc -from bpy_extras.io_utils import ImportHelper -from bonsai.bim.module.drawing.decoration import CutDecorator +import bonsai.bim.module.drawing.svgwriter as svgwriter +import bonsai.core.drawing as core +import bonsai.core.geometry +import bonsai.tool as tool +from bonsai.bim.ifc import IfcStore from bonsai.bim.module.drawing.data import DecoratorData, ElementValuesData +from bonsai.bim.module.drawing.decoration import CutDecorator +from bonsai.bim.module.drawing.prop import ( + RASTER_STYLE_PROPERTIES_EXCLUDE, + RasterStyleProperty, +) from bonsai.bim.module.drawing.ui import get_current_product_for_element_values from bonsai.bim.prop import StrProperty -from typing import NamedTuple, Union, Optional, Literal, TYPE_CHECKING, Any, TypedDict, get_args -from lxml import etree -from math import radians -from mathutils import Vector, Color, Matrix -from timeit import default_timer as timer -from bonsai.bim.module.drawing.prop import RasterStyleProperty, RASTER_STYLE_PROPERTIES_EXCLUDE -from bonsai.bim.ifc import IfcStore -from pathlib import Path -from bpy_extras.image_utils import load_image if TYPE_CHECKING: + from bpy.stub_internal import rna_enums + from bonsai.bim.module.drawing.prop import RenderType from bonsai.bim.module.project.prop import Link - from bpy.stub_internal import rna_enums cwd = os.path.dirname(os.path.realpath(__file__)) @@ -123,7 +137,7 @@ def _execute(self, context): element.ApplicableOccurrence = f"IfcAnnotation/{object_type}" if props.create_representation_for_type and object_type == "IMAGE": - bpy.ops.bim.add_reference_image("INVOKE_DEFAULT", use_existing_object_by_name=obj.name) + bpy.ops.bim.add_reference_image("INVOKE_DEFAULT", existing_object_by_name=obj.name) class EnableAddAnnotationType(bpy.types.Operator): @@ -232,17 +246,17 @@ class CreateDrawing(bpy.types.Operator): + "Add the CTRL modifier to optionally open drawings to view them as\n" + "they are created" ) - print_all: bpy.props.BoolProperty( # pyright: ignore[reportRedeclaration] + print_all: bpy.props.BoolProperty( name="Print All", default=False, options={"SKIP_SAVE"}, ) - open_viewer: bpy.props.BoolProperty( # pyright: ignore[reportRedeclaration] + open_viewer: bpy.props.BoolProperty( name="Open in Viewer", default=False, options={"SKIP_SAVE"}, ) - sync: bpy.props.BoolProperty( # pyright: ignore[reportRedeclaration] + sync: bpy.props.BoolProperty( name="Sync Before Creating Drawing", description="Could save some time if you're sure IFC and current Blender session are already in sync", default=True, @@ -353,20 +367,20 @@ def execute(self, context): # Clear any local camera setup and force viewport to use scene camera for area in context.screen.areas: - if area.type == 'VIEW_3D': + if area.type == "VIEW_3D": for space in area.spaces: - if space.type == 'VIEW_3D': + if space.type == "VIEW_3D": # Clear local camera to ensure we use scene.camera space.use_local_camera = False space.camera = context.scene.camera - space.region_3d.view_perspective = 'CAMERA' + space.region_3d.view_perspective = "CAMERA" print(f"Set viewport camera to: {context.scene.camera.name}") break - + # Force complete scene update context.view_layer.update() context.evaluated_depsgraph_get() - + underlay_svg = self.generate_underlay(context) with profile("Generate linework"): @@ -913,7 +927,7 @@ def generate_linework(self, context: bpy.types.Context) -> Union[str, None]: props = tool.Project.get_project_props() for link in props.get_loaded_links_for_drawings(): - files[link.name] = self.get_linked_file(link) + files[link.filepath] = self.get_linked_file(link) target_view = ifcopenshell.util.element.get_psets(self.camera_element)["EPset_Drawing"]["TargetView"] self.setup_serialiser(target_view) @@ -1359,7 +1373,7 @@ def is_manifold(self, obj) -> bool: return True def get_linked_file(self, link: "Link") -> ifcopenshell.file: - link_path = link.name + link_path = link.filepath ifc_file = IfcStore.session_files.get(link_path, None) if ifc_file is not None: return ifc_file @@ -1412,6 +1426,7 @@ def merge_linework_and_add_metadata(self, root): "/Pset_.*Common/.Status", "EPset_Status.Status", "EPset_Status.UserDefinedStatus", + "Material.Name", ] group = root.find("{http://www.w3.org/2000/svg}g") @@ -1744,7 +1759,7 @@ def _execute(self, context): enable_editing=True, ) if props.object_type == "IMAGE": - bpy.ops.bim.add_reference_image("INVOKE_DEFAULT", use_existing_object_by_name=obj.name) + bpy.ops.bim.add_reference_image("INVOKE_DEFAULT", existing_object_by_name=obj.name) class AddSheet(bpy.types.Operator, tool.Ifc.Operator): @@ -2307,14 +2322,14 @@ class ActivateDrawingBase(tool.Ifc.Operator): + "SHIFT+CLICK to load a quick preview of the drawing view" ) - drawing: bpy.props.IntProperty() # pyright: ignore[reportRedeclaration] - should_view_from_camera: bpy.props.BoolProperty( # pyright: ignore[reportRedeclaration] + drawing: bpy.props.IntProperty() + should_view_from_camera: bpy.props.BoolProperty( name="Should View From Camera", description="Move view to the activated drawing's camera position.", default=True, options={"SKIP_SAVE"}, ) - use_quick_preview: bpy.props.BoolProperty( # pyright: ignore[reportRedeclaration] + use_quick_preview: bpy.props.BoolProperty( name="Use Quick Preview", description="Just move the camera to the drawing view, without loading anything else.", default=False, @@ -2881,12 +2896,16 @@ class AddSchedule(bpy.types.Operator, tool.Ifc.Operator, ImportHelper): bl_options = {"REGISTER", "UNDO"} bl_description = "Add an .ods, .xls or .xlsx file as a schedule" + files: bpy.props.CollectionProperty(name="Files", type=bpy.types.OperatorFileListElement) + directory: bpy.props.StringProperty(subtype="DIR_PATH") filter_glob: bpy.props.StringProperty(default="*.ods;*.xls;*.xlsx", options={"HIDDEN"}) use_relative_path: bpy.props.BoolProperty(name="Use Relative Path", default=True) def _execute(self, context): - filepath = tool.Ifc.get_uri(self.filepath, use_relative_path=self.use_relative_path) - core.add_document(tool.Ifc, tool.Drawing, "SCHEDULE", uri=filepath) + for filepath in tool.Blender.get_selected_files( + self.directory, self.files, use_relative_path=self.use_relative_path + ): + core.add_document(tool.Ifc, tool.Drawing, "SCHEDULE", uri=filepath) class RemoveSchedule(bpy.types.Operator, tool.Ifc.Operator): @@ -3075,23 +3094,16 @@ class AddReference(bpy.types.Operator, tool.Ifc.Operator, ImportHelper): bl_description = "Import a .svg file to the project as a reference" bl_options = {"REGISTER", "UNDO"} + files: bpy.props.CollectionProperty(name="Files", type=bpy.types.OperatorFileListElement) + directory: bpy.props.StringProperty(subtype="DIR_PATH") filter_glob: bpy.props.StringProperty(default="*.svg", options={"HIDDEN"}) use_relative_path: bpy.props.BoolProperty(name="Use Relative Path", default=True) filename_ext = ".svg" - - files: bpy.props.CollectionProperty(type=bpy.types.OperatorFileListElement) - directory: bpy.props.StringProperty(subtype='DIR_PATH') def _execute(self, context): - # Handle both single and multiple file selection - if self.files: - for file_elem in self.files: - filepath = os.path.join(self.directory, file_elem.name) - uri = tool.Ifc.get_uri(filepath, use_relative_path=self.use_relative_path) - core.add_document(tool.Ifc, tool.Drawing, "REFERENCE", uri=uri) - else: - # Fallback for single file (backward compatibility) - filepath = tool.Ifc.get_uri(self.filepath, use_relative_path=self.use_relative_path) + for filepath in tool.Blender.get_selected_files( + self.directory, self.files, use_relative_path=self.use_relative_path + ): core.add_document(tool.Ifc, tool.Drawing, "REFERENCE", uri=filepath) @@ -3150,6 +3162,7 @@ def cancel(self, context): bpy.ops.bim.disable_editing_text() def execute(self, context): + # TODO: check for possible subtle undo bug here # can't use invoke() because this operator # will be run indirectly by hotkey # so we use execute() and track whether it's the first run of the operator @@ -3166,169 +3179,34 @@ class EditText(bpy.types.Operator, tool.Ifc.Operator): bl_idname = "bim.edit_text" bl_label = "Edit Text" bl_description = "Save changes to the text annotation and\ndisable the text editing options" - bl_options = {"REGISTER", "UNDO"} def _execute(self, context): - obj = context.active_object - props = tool.Drawing.get_text_props(obj) - - captured_apply_settings = { - "apply_font_size_to_all": props.apply_font_size_to_all, - "apply_newline_to_all": props.apply_newline_to_all, - "font_size": props.font_size, - "newline_at": props.newline_at, - "literals": [], - } - - for i, literal in enumerate(props.literals): - literal_data = { - "attributes": [ - (attr.string_value, attr.enum_value if attr.data_type == "enum" else attr.string_value) - for attr in literal.attributes - ], - "box_alignment": literal.box_alignment[:] if hasattr(literal, "box_alignment") else None, - "element_value_rows": [ - { - "category": row.category, - "element_key": row.element_key, - "formatted_value": row.formatted_value, - "separator": row.separator, - } - for row in literal.element_value_rows - ], - "product_used": literal.product_used.name if literal.product_used else None, - } - - if i < len(props.literal_apply_settings): - apply_settings = props.literal_apply_settings[i] - literal_data["apply_text_to_all"] = apply_settings.apply_text_to_all - literal_data["apply_path_to_all"] = apply_settings.apply_path_to_all - literal_data["apply_box_alignment_to_all"] = apply_settings.apply_box_alignment_to_all - else: - literal_data["apply_text_to_all"] = False - literal_data["apply_path_to_all"] = False - literal_data["apply_box_alignment_to_all"] = False - - captured_apply_settings["literals"].append(literal_data) - - obj["_bonsai_element_value_rows_backup"] = json.dumps(captured_apply_settings["literals"]) - - core.edit_text(tool.Drawing, obj=obj) - - self.apply_to_selected_objects_with_captured_data(context, obj, captured_apply_settings) - + core.edit_text(tool.Drawing, obj=tool.Blender.get_active_object()) tool.Blender.update_viewport() - return {"FINISHED"} - - def apply_to_selected_objects(self, context, active_obj, active_props): - """Apply changes to other selected text objects based on toggle settings""" - selected_objects = [obj for obj in context.selected_objects if obj != active_obj] - - for obj in selected_objects: - element = tool.Ifc.get_entity(obj) - if not element or not tool.Drawing.is_annotation_object_type(element, ["TEXT", "TEXT_LEADER"]): - continue - - obj_props = tool.Drawing.get_text_props(obj) - needs_update = False - - if active_props.apply_font_size_to_all: - obj_props.font_size = active_props.font_size - needs_update = True - - if active_props.apply_newline_to_all: - obj_props.newline_at = active_props.newline_at - needs_update = True - - for i, active_literal in enumerate(active_props.literals): - if i >= len(obj_props.literals): - continue - - obj_props.ensure_literal_apply_settings(len(obj_props.literals)) - obj_literal = obj_props.literals[i] - - if i < len(active_props.literal_apply_settings): - active_settings = active_props.literal_apply_settings[i] - - if active_settings.apply_text_to_all: - if len(active_literal.attributes) > 0 and len(obj_literal.attributes) > 0: - obj_literal.attributes[0].string_value = active_literal.attributes[0].string_value - needs_update = True - if active_settings.apply_path_to_all: - if len(active_literal.attributes) > 1 and len(obj_literal.attributes) > 1: - if ( - active_literal.attributes[1].data_type == "enum" - and obj_literal.attributes[1].data_type == "enum" - ): - obj_literal.attributes[1].enum_value = active_literal.attributes[1].enum_value - else: - obj_literal.attributes[1].string_value = active_literal.attributes[1].string_value - needs_update = True - - if active_settings.apply_box_alignment_to_all: - obj_literal.box_alignment = active_literal.box_alignment[:] - needs_update = True - - if needs_update: - core.edit_text(tool.Drawing, obj=obj) - - def apply_to_selected_objects_with_captured_data(self, context, active_obj, captured_data): - """Apply changes to other selected text objects using captured apply settings""" - selected_objects = [obj for obj in context.selected_objects if obj != active_obj] - - for obj in selected_objects: - element = tool.Ifc.get_entity(obj) - if not element: - continue - if not tool.Drawing.is_annotation_object_type(element, ["TEXT", "TEXT_LEADER"]): - continue - - obj_props = tool.Drawing.get_text_props(obj) - - if len(obj_props.literals) == 0: - core.enable_editing_text(tool.Drawing, obj=obj) - obj_props.ensure_literal_apply_settings(len(obj_props.literals)) - - needs_update = False - - if captured_data["apply_font_size_to_all"]: - obj_props.font_size = captured_data["font_size"] - needs_update = True - - if captured_data["apply_newline_to_all"]: - obj_props.newline_at = captured_data["newline_at"] - needs_update = True - - for i, captured_literal in enumerate(captured_data["literals"]): - if i >= len(obj_props.literals): - continue - - obj_literal = obj_props.literals[i] - - if captured_literal["apply_text_to_all"]: - if len(captured_literal["attributes"]) > 0 and len(obj_literal.attributes) > 0: - new_value = captured_literal["attributes"][0][0] # [0] = string_value - obj_literal.attributes[0].string_value = new_value - needs_update = True - - if captured_literal["apply_path_to_all"]: - if len(captured_literal["attributes"]) > 1 and len(obj_literal.attributes) > 1: - new_value = captured_literal["attributes"][1][1] # [1] = enum_value or string_value - if obj_literal.attributes[1].data_type == "enum": - obj_literal.attributes[1].enum_value = new_value - else: - obj_literal.attributes[1].string_value = new_value - needs_update = True - - if captured_literal["apply_box_alignment_to_all"] and captured_literal["box_alignment"]: - obj_literal.box_alignment = captured_literal["box_alignment"] - needs_update = True +class CopyTextToSelection(bpy.types.Operator, tool.Ifc.Operator): + bl_idname = "bim.copy_text_to_selection" + bl_label = "Copy Text To Selection" + bl_description = "Copy text formatting or literals to selected objects" + bl_options = {"REGISTER", "UNDO"} + attribute: bpy.props.StringProperty() - if needs_update: - core.edit_text(tool.Drawing, obj=obj) + def _execute(self, context): + apply_objs = [ + obj + for obj in tool.Blender.get_selected_objects() + if (element := tool.Ifc.get_entity(obj)) + and tool.Drawing.is_annotation_object_type(element, ["TEXT", "TEXT_LEADER"]) + ] + core.copy_text_to_selection( + tool.Drawing, + attribute=self.attribute, + attribute_obj=tool.Blender.get_active_object(), + apply_objs=apply_objs, + ) + tool.Blender.update_viewport() class EnableEditingText(bpy.types.Operator, tool.Ifc.Operator): @@ -3343,8 +3221,6 @@ def _execute(self, context): props = tool.Drawing.get_text_props(obj) core.enable_editing_text(tool.Drawing, obj=obj) - props.ensure_literal_apply_settings(len(props.literals)) - text_element = tool.Ifc.get_entity(obj) assigned_product_entity = tool.Drawing.get_assigned_product(text_element) if text_element else None assigned_product_obj = tool.Ifc.get_object(assigned_product_entity) if assigned_product_entity else None @@ -3355,14 +3231,14 @@ def _execute(self, context): for i, literal_backup in enumerate(literals_backup): if i < len(props.literals): literal_props = props.literals[i] - + if assigned_product_obj: literal_props.product_used = assigned_product_obj elif "product_used" in literal_backup and literal_backup["product_used"]: product_name = literal_backup["product_used"] if product_name in bpy.data.objects: literal_props.product_used = bpy.data.objects[product_name] - + literal_props.element_value_rows.clear() if "element_value_rows" in literal_backup: for row_data in literal_backup["element_value_rows"]: @@ -3430,12 +3306,8 @@ def execute(self, context): attr.data_type = "string" attr.string_value = literal_attr_values[attr_name] - box_alignment_mask = [False] * 9 - box_alignment_mask[6] = True # bottom_left box_alignment - literal_props.box_alignment = box_alignment_mask - - props.ensure_literal_apply_settings(len(props.literals)) - + literal_props.align_vertical = "bottom" + literal_props.align_horizontal = "left" return {"FINISHED"} @@ -3454,9 +3326,6 @@ def execute(self, context): props = tool.Drawing.get_text_props(obj) props.literals.remove(self.literal_prop_id) tool.Blender.update_viewport() - - props.ensure_literal_apply_settings(len(props.literals)) - return {"FINISHED"} @@ -3496,57 +3365,55 @@ def execute(self, context): return {"FINISHED"} -# Ifc Operator is unnecessary, because suboperator is handling IFC changes. -class AssignSelectedObjectAsProduct(bpy.types.Operator): +class AssignSelectedObjectAsProduct(bpy.types.Operator, tool.Ifc.Operator): bl_idname = "bim.assign_selected_as_product" bl_label = "Assign Selected Object As Product" bl_options = {"REGISTER", "UNDO"} @classmethod def poll(cls, context): - if len(context.selected_objects) != 2: - cls.poll_message_set("2 objects need to be selected") + if len(context.selected_objects) < 2: + cls.poll_message_set("At least 2 objects need to be selected") return False return True - def execute(self, context): - assert bpy.context.view_layer + def _execute(self, context): objs = context.selected_objects[:] - obj1, obj2 = objs - element1 = tool.Ifc.get_entity(obj1) - element2 = tool.Ifc.get_entity(obj2) - assert element1 and element2 + ifc_objs = [(o, tool.Ifc.get_entity(o)) for o in objs if tool.Ifc.get_entity(o)] - # Check if at least one object is an IfcAnnotation - is_annotation1 = element1.is_a("IfcAnnotation") - is_annotation2 = element2.is_a("IfcAnnotation") + annotations = [(o, e) for o, e in ifc_objs if e.is_a("IfcAnnotation")] + non_annotations = [(o, e) for o, e in ifc_objs if not e.is_a("IfcAnnotation")] - if not (is_annotation1 or is_annotation2): - self.report({"ERROR"}, "At least one of the selected objects must be IfcAnnotation.") + if not annotations: + self.report({"ERROR"}, "At least one selected object must be an IfcAnnotation.") return {"CANCELLED"} - # If both are annotations, use the currently active object as relating product - if is_annotation1 and is_annotation2: + if len(non_annotations) == 1: + # One product, one or more annotations — assign all annotations to the product. + product = non_annotations[0][1] + elif len(non_annotations) == 0 and len(annotations) == 2: + # Both objects are annotations — use the non-active one as the relating product. active_obj = context.active_object - if active_obj == obj1: - other_selected_object = obj1 - bpy.context.view_layer.objects.active = obj2 + if annotations[0][0] == active_obj: + annotation_obj, annotation = annotations[0] + product = annotations[1][1] else: - other_selected_object = obj2 - bpy.context.view_layer.objects.active = obj1 - # If only one is an annotation, make it the active object - elif is_annotation1: - other_selected_object = obj2 - bpy.context.view_layer.objects.active = obj1 + annotation_obj, annotation = annotations[1] + product = annotations[0][1] + core.edit_assigned_product(tool.Ifc, tool.Drawing, obj=annotation_obj, product=product) + tool.Blender.update_viewport() + return else: - other_selected_object = obj1 - bpy.context.view_layer.objects.active = obj2 + self.report( + {"ERROR"}, + "Select exactly one product object and one or more IfcAnnotation objects.", + ) + return {"CANCELLED"} - assert (active_obj := context.active_object) - props = tool.Drawing.get_object_assigned_product_props(active_obj) - props.relating_product = other_selected_object - bpy.ops.bim.edit_assigned_product() - return {"FINISHED"} + for annotation_obj, _ in annotations: + core.edit_assigned_product(tool.Ifc, tool.Drawing, obj=annotation_obj, product=product) + + tool.Blender.update_viewport() class EditAssignedProduct(bpy.types.Operator, tool.Ifc.Operator): @@ -3768,14 +3635,12 @@ class ToggleTargetView(bpy.types.Operator): bl_label = "Toggle Target View" bl_options = {"REGISTER", "UNDO"} - target_view: bpy.props.StringProperty() # pyright: ignore[reportRedeclaration] - toggle_all: bpy.props.BoolProperty( # pyright: ignore[reportRedeclaration] + target_view: bpy.props.StringProperty() + toggle_all: bpy.props.BoolProperty( default=False, options={"SKIP_SAVE"}, ) - option: bpy.props.EnumProperty( # pyright: ignore[reportRedeclaration] - items=[(i, i, "") for i in get_args(ToggleOption)] - ) + option: bpy.props.EnumProperty(items=[(i, i, "") for i in get_args(ToggleOption)]) if TYPE_CHECKING: target_view: str @@ -3932,83 +3797,51 @@ class AddReferenceImage(bpy.types.Operator, tool.Ifc.Operator, ImportHelper): use_relative_path: bpy.props.BoolProperty(name="Use Relative Path", default=True) filter_image: bpy.props.BoolProperty(default=True, options={"HIDDEN", "SKIP_SAVE"}) filter_folder: bpy.props.BoolProperty(default=True, options={"HIDDEN", "SKIP_SAVE"}) - - override_existing_image: bpy.props.BoolProperty( - name="Override Existing Image", - default=True, - description=( - "Override image if it was previously loaded to Blender. If disabled, will always create a new image" - ), - ) - use_existing_object_by_name: bpy.props.StringProperty( - name="Use Existing Object By Name", - description="Existing object name to add a style with reference image to. If not provided will create a new object.", - options={"SKIP_SAVE"}, - ) - x_length: bpy.props.FloatProperty( name="X Length", - description="Width of the reference image in project units", + description="Width of the reference image", default=1.0, min=0.001, soft_min=0.01, precision=3, + unit="LENGTH", ) y_length: bpy.props.FloatProperty( name="Y Length", - description="Height of the reference image in project units", + description="Height of the reference image", default=1.0, min=0.001, soft_min=0.01, precision=3, + unit="LENGTH", + ) + show_texture_solid_mode: bpy.props.BoolProperty( + name="Show Texture in Solid mode (slow)", + description="Show Texture in Solid mode (slow)", + default=False, ) - show_dimensions_dialog: bpy.props.BoolProperty(default=False, options={"HIDDEN", "SKIP_SAVE"}) - - def draw(self, context): - layout = self.layout - - if getattr(self, "show_dimensions_dialog", False): - if tool.Ifc.get(): - length_unit = ifcopenshell.util.unit.get_project_unit(tool.Ifc.get(), "LENGTHUNIT") - if length_unit: - unit_name = ifcopenshell.util.unit.get_full_unit_name(length_unit).lower() - else: - unit_name = "project units" - layout.label(text=f"Set Reference Image Dimensions (in {unit_name}):") - else: - layout.label(text="Set Reference Image Dimensions (in project units):") - layout.separator() - layout.prop(self, "x_length") - layout.prop(self, "y_length") - else: - if Path(tool.Ifc.get_path()).is_file(): - layout.prop(self, "use_relative_path") - else: - self.use_relative_path = False - layout.label(text="Save the .ifc file first ") - layout.label(text="to use relative paths.") - layout.prop(self, "override_existing_image") - layout.prop(self, "use_existing_object_by_name") + @classmethod + def poll(cls, context): + if not tool.Ifc.get(): + cls.poll_message_set("No IFC project is loaded.") + return False + return True def invoke(self, context, event): - if not getattr(self, "show_dimensions_dialog", False): - context.window_manager.fileselect_add(self) - return {"RUNNING_MODAL"} - else: - return context.window_manager.invoke_props_dialog(self) + self._last_filepath = "" + return super().invoke(context, event) - def execute(self, context): - if not getattr(self, "show_dimensions_dialog", False): - abs_path = Path(self.filepath).absolute().resolve() - if self.override_existing_image: - params = {"check_existing": True, "force_reload": True} - else: - params = {"check_existing": False} + def check(self, context): + if not hasattr(self, "_last_filepath"): + self._last_filepath = "" - try: - image = load_image(abs_path.name, str(abs_path.parent), **params) + if self.filepath and self.filepath != self._last_filepath: + self._last_filepath = self.filepath + abs_path = Path(self.filepath).absolute().resolve() + if abs_path.exists() and abs_path.is_file(): + image = load_image(abs_path.name, str(abs_path.parent), check_existing=False) image_width_px = image.size[0] image_height_px = image.size[1] aspect_ratio = image_width_px / image_height_px @@ -4021,17 +3854,23 @@ def execute(self, context): self.y_length = 1.0 bpy.data.images.remove(image) + return True - except Exception as e: - self.report({"ERROR"}, f"Failed to load image: {str(e)}") - return {"CANCELLED"} - - self.show_dimensions_dialog = True - return context.window_manager.invoke_props_dialog(self) + return False - return self._execute(context) + def draw(self, context): + layout = self.layout + if Path(tool.Ifc.get_path()).is_file(): + layout.prop(self, "use_relative_path") + else: + self.use_relative_path = False + layout.prop(self, "show_texture_solid_mode") + layout.prop(self, "x_length") + layout.prop(self, "y_length") def _execute(self, context): + project_props = tool.Project.get_project_props() + project_props.load_indexed_maps = self.show_texture_solid_mode space = tool.Blender.get_view3d_space() if space.shading.color_type != "TEXTURE": space.shading.color_type = "TEXTURE" @@ -4044,121 +3883,65 @@ def _execute(self, context): image_filepath = Path(tool.Ifc.get_uri(self.filepath, use_relative_path=self.use_relative_path)) ifc_file = tool.Ifc.get() - if self.override_existing_image: - params = {"check_existing": True, "force_reload": True} - else: - params = {"check_existing": False} - image = load_image(abs_path.name, str(abs_path.parent), **params) - - def bm_add_image_plane(mesh): - bm = tool.Blender.get_bmesh_for_mesh(mesh, clean=True) - - unit_scale = ifcopenshell.util.unit.calculate_unit_scale(ifc_file) - plane_scale = Vector((self.x_length * unit_scale / 2.0, self.y_length * unit_scale / 2.0, 1.0)) - matrix = Matrix.LocRotScale(None, None, plane_scale) - bmesh.ops.create_grid(bm, x_segments=1, y_segments=1, size=1, matrix=matrix, calc_uvs=False) - - if not bm.loops.layers.uv: - uv_layer = bm.loops.layers.uv.new() - else: - uv_layer = bm.loops.layers.uv.active + image = load_image(abs_path.name, str(abs_path.parent), check_existing=False) - min_x = min(v.co.x for v in bm.verts) - max_x = max(v.co.x for v in bm.verts) - min_y = min(v.co.y for v in bm.verts) - max_y = max(v.co.y for v in bm.verts) - - width = max_x - min_x - height = max_y - min_y - - for face in bm.faces: - for loop in face.loops: - vert = loop.vert - u = (vert.co.x - min_x) / width if width > 0 else 0.5 - v = (vert.co.y - min_y) / height if height > 0 else 0.5 - - u = max(0.0, min(1.0, u)) - v = max(0.0, min(1.0, v)) - loop[uv_layer].uv = (u, v) + mesh = bpy.data.meshes.new(image_filepath.stem) + obj = bpy.data.objects.new(image_filepath.stem, mesh) + element = tool.Drawing.run_root_assign_class( + obj=obj, ifc_class="IfcAnnotation", predefined_type="IMAGE", should_add_representation=False + ) - tool.Blender.apply_bmesh(mesh, bm) + builder = ifcopenshell.util.shape_builder.ShapeBuilder(ifc_file) + unit_scale = ifcopenshell.util.unit.calculate_unit_scale(ifc_file) + hx = self.x_length * 0.5 / unit_scale + hy = self.y_length * 0.5 / unit_scale + verts = [(-hx, -hy, 0.0), (hx, -hy, 0.0), (hx, hy, 0.0), (-hx, hy, 0.0)] + item = builder.mesh(verts, [[0, 1, 2, 3]]) - if self.use_existing_object_by_name: - obj = bpy.data.objects[self.use_existing_object_by_name] - bm_add_image_plane(obj.data) - bpy.ops.bim.update_representation(obj=obj.name, ifc_representation_class="") - else: - temp_mesh = bpy.data.meshes.new("temp_mesh") - bm_add_image_plane(temp_mesh) - obj = bpy.data.objects.new(image_filepath.stem, temp_mesh) - tool.Drawing.run_root_assign_class( - obj=obj, - ifc_class="IfcAnnotation", - predefined_type="IMAGE", - should_add_representation=True, - context=ifcopenshell.util.representation.get_context(ifc_file, "Model", "Body", "MODEL_VIEW"), - ifc_representation_class=None, - ) - tool.Blender.remove_data_block(temp_mesh) + ifc_context = ifcopenshell.util.representation.get_context(ifc_file, "Model", "Body", "MODEL_VIEW") + representation = builder.get_representation(ifc_context, [item]) + ifcopenshell.api.geometry.assign_representation(ifc_file, element, representation) - element = tool.Ifc.get_entity(obj) - if element and isinstance(obj.data, bpy.types.Mesh): - representation = ifcopenshell.util.representation.get_representation(element, "Model", "Body", "MODEL_VIEW") - if representation and representation.Items: - item_id = representation.Items[0].id() - num_faces = len(obj.data.polygons) - obj.data["ios_item_ids"] = [item_id] * num_faces - tool.Blender.Attribute.fill_attribute(obj.data, "ios_item_ids", "FACE", "INT", [item_id] * num_faces) - - for item in representation.Items: - if item.is_a("IfcPolygonalFaceSet") and item.Coordinates: - new_coords = [] - for vertex in obj.data.vertices: - co = obj.matrix_world @ vertex.co - new_coords.append([co.x, co.y, co.z]) - item.Coordinates.CoordList = new_coords - - tool.Blender.set_active_object(obj) - - material = bpy.data.materials.new(name=image_filepath.stem) - obj.data.materials.append(None) # new slot - obj.material_slots[0].material = material - bpy.ops.bim.add_style() - - style = tool.Ifc.get_entity(material) - assert style - tool.Style.assign_style_to_object(style, obj) + style = ifcopenshell.api.style.add_style(tool.Ifc.get(), name=image_filepath.stem) + ifcopenshell.api.style.assign_representation_styles( + ifc_file, shape_representation=representation, styles=[style] + ) # TODO: IfcSurfaceStyleRendering is unnecessary here, added it only because # we don't support IfcSurfaceStyleWithTextures without Rendering yet shading_attributes = { - "SurfaceColour": { - "Red": 1.0, - "Green": 1.0, - "Blue": 1.0, - }, + "SurfaceColour": {"Red": 1.0, "Green": 1.0, "Blue": 1.0}, "Transparency": 0.0, "ReflectanceMethod": "NOTDEFINED", } ifcopenshell.api.style.add_surface_style( - tool.Ifc.get(), - style=style, - ifc_class="IfcSurfaceStyleRendering", - attributes=shading_attributes, + tool.Ifc.get(), style=style, ifc_class="IfcSurfaceStyleRendering", attributes=shading_attributes ) - texture = ifc_file.create_entity("IfcImageTexture", Mode="DIFFUSE", URLReference=image_filepath.as_posix()) + + if tool.Ifc.get_schema() == "IFC2X3": + texture = ifc_file.create_entity( + "IfcImageTexture", + RepeatS=True, + RepeatT=True, + TextureType="TEXTURE", + UrlReference=image_filepath.as_posix(), + ) + else: + texture = ifc_file.create_entity("IfcImageTexture", Mode="DIFFUSE", URLReference=image_filepath.as_posix()) + ifc_file.create_entity("IfcTextureCoordinateGenerator", Maps=[texture], Mode="COORD") + textures = [texture] - ifc_file.create_entity("IfcTextureCoordinateGenerator", Maps=textures, Mode="COORD") # UV map ifcopenshell.api.style.add_surface_style( - ifc_file, - style=style, - ifc_class="IfcSurfaceStyleWithTextures", - attributes={"Textures": textures}, + ifc_file, style=style, ifc_class="IfcSurfaceStyleWithTextures", attributes={"Textures": textures} ) - tool.Style.reload_material_from_ifc(material) - tool.Geometry.record_object_materials(obj) - return {"FINISHED"} + logger = logging.getLogger("ImportIFC") + ifc_import_settings = bonsai.bim.import_ifc.IfcImportSettings.factory(bpy.context, None, logger) + ifc_importer = bonsai.bim.import_ifc.IfcImporter(ifc_import_settings) + ifc_importer.file = tool.Ifc.get() + ifc_importer.create_style(style) + + bonsai.core.geometry.switch_representation(tool.Ifc, tool.Geometry, obj=obj, representation=representation) class ConvertSVGToDXF(bpy.types.Operator): @@ -4251,63 +4034,62 @@ class ActivateDrawingByAnnotation(bpy.types.Operator, tool.Ifc.Operator): bl_label = "Activate Drawing" bl_description = "Activate the drawing corresponding to the selected annotation" bl_options = {"REGISTER", "UNDO"} - + @classmethod def poll(cls, context): # Check if an annotation object is selected if not context.selected_objects: cls.poll_message_set("No object selected") return False - + active_obj = context.active_object if not active_obj: cls.poll_message_set("No active object") return False - + element = tool.Ifc.get_entity(active_obj) if not element: cls.poll_message_set("Selected object is not an IFC element") return False - + # Check if it's an IfcAnnotation with ObjectType = "SECTION" or "ELEVATION" if not element.is_a("IfcAnnotation") or element.ObjectType not in ["SECTION", "ELEVATION"]: cls.poll_message_set("Selected object is not a drawing annotation") return False - + return True def _execute(self, context): active_obj = context.active_object element = tool.Ifc.get_entity(active_obj) - + if not element or not element.is_a("IfcAnnotation") or element.ObjectType not in ["SECTION", "ELEVATION"]: self.report({"ERROR"}, "Selected object is not a drawing annotation") return {"CANCELLED"} - + # Find the drawing/camera element that this annotation references drawing_element = self.find_drawing_from_annotation(element) - + if not drawing_element: self.report({"ERROR"}, "Could not find drawing element for this annotation") return {"CANCELLED"} - + # Use the existing ActivateDrawing operator with the drawing element's ID bpy.ops.bim.activate_drawing(drawing=drawing_element.id()) - + return {"FINISHED"} - + def find_drawing_from_annotation(self, annotation_element): """Find the drawing/camera element that this annotation references.""" ifc = tool.Ifc.get() - + # Check IfcRelAssignsToProduct relationships for rel in ifc.get_inverse(annotation_element): if rel.is_a("IfcRelAssignsToProduct") and rel.RelatingProduct: if rel.RelatingProduct.is_a("IfcAnnotation"): # Found the drawing element! return rel.RelatingProduct - - + return None @@ -4391,10 +4173,7 @@ def execute(self, context): should_select = True break elif self.attribute_type == "box_alignment": - box_alignment_attr = next( - (attr for attr in literal.attributes if attr.name == "BoxAlignment"), None - ) - if box_alignment_attr and box_alignment_attr.string_value == self.literal_value: + if literal.get_box_alignment() == self.literal_value: should_select = True break @@ -5042,7 +4821,7 @@ def execute(self, context): class AddElementValueRow(bpy.types.Operator): bl_idname = "bim.add_element_value_row" - bl_label = "Add Element" + bl_label = "Add Element Value Row" bl_description = "Add a new element value row" bl_options = {"REGISTER", "UNDO"} @@ -5062,7 +4841,7 @@ def execute(self, context): new_row.category = literal_props.category_for_adding new_row.element_key = "" new_row.formatted_value = "" - + if len(literal_props.element_value_rows) == 1: new_row.separator = "" else: @@ -5106,10 +4885,10 @@ class ElementValueSuggestionsPopup(bpy.types.Operator): row_index: bpy.props.IntProperty() category: bpy.props.StringProperty() search_query: bpy.props.StringProperty(name="Search", description="Search for element values") - + collection_keys: bpy.props.CollectionProperty(type=StrProperty) collection_descriptions: bpy.props.CollectionProperty(type=StrProperty) - + selected_key: bpy.props.StringProperty() def invoke(self, context, event): @@ -5157,13 +4936,13 @@ def invoke(self, context, event): def draw(self, context): layout = self.layout - + layout.prop_search(self, "selected_key", self, "collection_descriptions", text="Value") def execute(self, context): if not self.selected_key: return {"CANCELLED"} - + obj = context.active_object if not obj: return {"CANCELLED"} @@ -5177,7 +4956,7 @@ def execute(self, context): return {"CANCELLED"} value_row = literal_props.element_value_rows[self.row_index] - + for idx, desc_item in enumerate(self.collection_descriptions): if desc_item.name == self.selected_key: actual_key = self.collection_keys[idx].name @@ -5260,10 +5039,7 @@ class FormatElementValueRow(bpy.types.Operator): custom_expression: bpy.props.StringProperty( name="Custom Expression", - description=( - "Custom expression using functions\n" - "Use {{value}} as placeholder for the current row's value." - ), + description=("Custom expression using functions\n" "Use {{value}} as placeholder for the current row's value."), default='concat({{value}}, " - additional text")', ) @@ -5288,51 +5064,51 @@ def invoke(self, context, event): def _load_formatting_from_row(self, row): """Parse the formatted_value to load existing formatting settings""" import re - + formatted_value = row.formatted_value - + if not formatted_value or formatted_value == f"{{{{{row.element_key}}}}}": self.formatting_type = "NONE" return - + if formatted_value.startswith("``") and formatted_value.endswith("``"): expression = formatted_value[2:-2].strip() else: self.formatting_type = "NONE" return - + if match := re.match(r"upper\(\{\{[^}]+\}\}\)", expression): self.formatting_type = "UPPER" - + elif match := re.match(r"lower\(\{\{[^}]+\}\}\)", expression): self.formatting_type = "LOWER" - + elif match := re.match(r"title\(\{\{[^}]+\}\}\)", expression): self.formatting_type = "TITLE" - + elif match := re.match(r"int\(\{\{[^}]+\}\}\)", expression): self.formatting_type = "INT" - + elif match := re.match(r"round\(\{\{[^}]+\}\},\s*([^)]+)\)", expression): self.formatting_type = "ROUND" self.round_precision = match.group(1).strip() - + elif match := re.match(r"number\(\{\{[^}]+\}\},\s*([^,]+),\s*([^)]+)\)", expression): self.formatting_type = "NUMBER" self.decimal_separator = match.group(1).strip() self.thousands_separator = match.group(2).strip() - + elif match := re.match(r"metric_length\(\{\{[^}]+\}\},\s*([^,]+),\s*([^)]+)\)", expression): self.formatting_type = "METRIC_LENGTH" self.metric_precision = match.group(1).strip() self.metric_decimals = int(match.group(2).strip()) - + elif match := re.match(r'imperial_length\(\{\{[^}]+\}\},\s*(\d+),\s*"([^"]+)",\s*"([^"]+)"\)', expression): self.formatting_type = "IMPERIAL_LENGTH" self.imperial_precision = int(match.group(1).strip()) self.imperial_input_unit = match.group(2).strip() self.imperial_output_unit = match.group(3).strip() - + else: self.formatting_type = "CUSTOM" self.custom_expression = expression @@ -5450,9 +5226,9 @@ def execute(self, context): default_format = f"{{{{{row.element_key}}}}}" row.formatted_value = default_format value_part = default_format - + parts.append(row.separator + value_part) - + concatenated_value = "".join(parts) for attr in literal_props.attributes: @@ -5469,12 +5245,12 @@ def _update_formatted_value(self, new_element_key: str, old_formatted_value: str This preserves formatting functions like upper(), round(), etc. """ import re - - pattern = r'\{\{[^}]+\}\}' - + + pattern = r"\{\{[^}]+\}\}" + new_base_value = f"{{{{{new_element_key}}}}}" updated_value = re.sub(pattern, new_base_value, old_formatted_value) - + return updated_value diff --git a/src/bonsai/bonsai/bim/module/drawing/prop.py b/src/bonsai/bonsai/bim/module/drawing/prop.py index da04caf7ffa..1647d44773d 100644 --- a/src/bonsai/bonsai/bim/module/drawing/prop.py +++ b/src/bonsai/bonsai/bim/module/drawing/prop.py @@ -16,39 +16,38 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . -import os -import bpy -import json import enum +import json +from collections.abc import Callable +from typing import TYPE_CHECKING, Any, Literal, Union + +import bpy import ifcopenshell -import ifcopenshell.api import ifcopenshell.api.pset import ifcopenshell.util.element -import bonsai.tool as tool -import bonsai.core.drawing as core -import bonsai.bim.module.drawing.annotation as annotation -import bonsai.bim.module.drawing.decoration as decoration -from mathutils import Matrix -from bonsai.bim.prop import BIMFilterGroup -from bonsai.bim.module.drawing.data import DrawingsData, DecoratorData, SheetsData, AnnotationData, ElementValuesData -from bonsai.bim.module.drawing.data import refresh as refresh_drawing_data -from pathlib import Path -from bonsai.bim.prop import Attribute, StrProperty -from bpy.types import PropertyGroup from bpy.props import ( - PointerProperty, - StringProperty, - EnumProperty, BoolProperty, - IntProperty, - FloatProperty, - FloatVectorProperty, CollectionProperty, - BoolVectorProperty, + EnumProperty, + FloatProperty, + IntProperty, + PointerProperty, + StringProperty, ) -from typing import TYPE_CHECKING, Literal, Any, get_args, Union -from collections.abc import Callable +from bpy.types import PropertyGroup +from mathutils import Matrix +import bonsai.bim.module.drawing.decoration as decoration +import bonsai.core.drawing as core +import bonsai.tool as tool +from bonsai.bim.module.drawing.data import ( + AnnotationData, + DrawingsData, + ElementValuesData, + SheetsData, +) +from bonsai.bim.module.drawing.data import refresh as refresh_drawing_data +from bonsai.bim.prop import Attribute, BIMFilterGroup diagram_scales_enum = [] @@ -673,20 +672,6 @@ def get_scale_and_aspect_ratio(self) -> tuple[float, float]: return ortho_scale, aspect_ratio -DEFAULT_BOX_ALIGNMENT = [False] * 6 + [True] + [False] * 2 -BOX_ALIGNMENT_POSITIONS = [ - "top-left", - "top-middle", - "top-right", - "middle-left", - "center", - "middle-right", - "bottom-left", - "bottom-middle", - "bottom-right", -] - - class ElementValueRow(PropertyGroup): """Represents a single element value row with category, key, and formatted value""" @@ -714,7 +699,9 @@ class ElementValueRow(PropertyGroup): ) element_key: StringProperty( - name="Element Key", description="The element value key (e.g., 'id', 'Name', 'Pset_WallCommon.Reference')", default="" + name="Element Key", + description="The element value key (e.g., 'id', 'Name', 'Pset_WallCommon.Reference')", + default="", ) formatted_value: StringProperty( @@ -756,71 +743,69 @@ def get_category_items_with_counts(self, context): ("Coordinates", "Coordinates", "Coordinate information", "EMPTY_ARROWS"), ("Custom String", "Custom String", "Add custom text (no element key)", "SMALL_CAPS"), ] - + obj = context.active_object - + if obj and tool.Ifc.get_entity(obj): try: element = tool.Ifc.get_entity(obj) text_element = element - - if hasattr(self, 'product_used'): + + if hasattr(self, "product_used"): if self.product_used: element = tool.Ifc.get_entity(self.product_used) else: assigned = tool.Drawing.get_assigned_product(text_element) if assigned: element = assigned - + available_keys = ElementValuesData.get_available_element_value_keys(element) items = [] for i, (identifier, base_name, description, icon) in enumerate(category_metadata): count = len(available_keys.get(identifier, [])) display_name = f"{base_name} ({count})" if count > 0 else base_name items.append((identifier, display_name, description, icon, i)) - + return items except Exception as e: pass - + return [(id, name, desc, icon, i) for i, (id, name, desc, icon) in enumerate(category_metadata)] class LiteralProps(PropertyGroup): - def set_box_alignment(self, new_value): - markers = new_value.count(True) - if not markers: - return - - if markers > 1: - prev_value = self.get("box_alignment", DEFAULT_BOX_ALIGNMENT) - # looking for the first value changed to positive - first_changed_value = next((i for i in range(9) if new_value[i] and new_value[i] != prev_value[i]), None) - - # if nothing have changed we just keep the previous value - if first_changed_value is None: - return - new_value = [False] * 9 - new_value[first_changed_value] = True - - self["box_alignment"] = new_value - position_string = BOX_ALIGNMENT_POSITIONS[next(i for i in range(9) if new_value[i])] - self.attributes["BoxAlignment"].set_value(position_string) - - def get_box_alignment(self): - return self.get("box_alignment", DEFAULT_BOX_ALIGNMENT) - attributes: CollectionProperty(name="Attributes", type=Attribute) - box_alignment: BoolVectorProperty( - name="Box alignment", size=9, set=set_box_alignment, get=get_box_alignment, default=DEFAULT_BOX_ALIGNMENT - ) ifc_definition_id: IntProperty(name="IFC definition ID", default=0) + align_horizontal: EnumProperty( + items=[ + ("left", "Left", "", "ALIGN_LEFT", 0), + ("middle", "Middle", "", "ALIGN_CENTER", 1), + ("right", "Right", "", "ALIGN_RIGHT", 2), + ], + default="left", + name="Horizontal Alignment", + ) + align_vertical: EnumProperty( + items=[ + ("top", "Top", "", "ALIGN_TOP", 0), + ("middle", "Middle", "", "ALIGN_MIDDLE", 1), + ("bottom", "Bottom", "", "ALIGN_BOTTOM", 2), + ], + default="middle", + name="Vertical Alignment", + ) + + def get_box_alignment(self) -> str: + alignment = self.align_vertical + "-" + self.align_horizontal + if alignment == "middle-middle": + alignment = "center" + return alignment def get_literal_edited_data(self) -> dict[str, str]: text_data = { "CurrentValue": self.attributes["Literal"].string_value, "Literal": self.attributes["Literal"].string_value, - "BoxAlignment": self.attributes["BoxAlignment"].string_value, + "BoxAlignment": self.get_box_alignment(), } return text_data @@ -843,43 +828,48 @@ def get_literal_edited_data(self) -> dict[str, str]: ) element_value_rows: CollectionProperty( - name="Element Value Rows", + name="Element Value Rows", type=ElementValueRow, - description="Collection of element value rows for building the literal value" + description="Collection of element value rows for building the literal value", ) category_for_adding: EnumProperty( name="Category for Adding", items=get_category_items_with_counts, default=0, - description="Category to use when adding a new element value row" + description="Category to use when adding a new element value row", ) if TYPE_CHECKING: attributes: bpy.types.bpy_prop_collection_idprop[Attribute] value: str - box_alignment: tuple[bool, bool, bool, bool, bool, bool, bool, bool, bool] ifc_definition_id: int + align_horizontal: str + align_vertical: str element_value_rows: bpy.types.bpy_prop_collection_idprop[ElementValueRow] category_for_adding: str -class LiteralApplySettings(PropertyGroup): - literal_index: IntProperty(name="Literal Index") - apply_text_to_all: BoolProperty(name="Apply Text to All", default=False) - apply_path_to_all: BoolProperty(name="Apply Path to All", default=False) - apply_box_alignment_to_all: BoolProperty(name="Apply Box Alignment to All", default=False) - - if TYPE_CHECKING: - literal_index: int - apply_text_to_all: bool - apply_path_to_all: bool - apply_box_alignment_to_all: bool +def update_text_alignment(self, context): + for literal_props in self.literals: + literal_props.align_horizontal = self.align_horizontal + literal_props.align_vertical = self.align_vertical class BIMTextProperties(PropertyGroup): is_editing: BoolProperty(name="Is Editing", default=False) literals: CollectionProperty(name="Literals", type=LiteralProps) + newline_at: IntProperty(name="Newline At") + symbol: EnumProperty( + name="Symbol", + description="Symbol from symbols.svg to use for this text.", + items=[(s, s, "") for s in ["NO SYMBOL", "CUSTOM SYMBOL"] + tool.Drawing.DEFAULT_SYMBOLS], + default="NO SYMBOL", + ) + custom_symbol: StringProperty( + name="Custom Symbol", + description="Non-default symbol to use for this text.", + ) font_size: EnumProperty( items=[ ("1.8", "1.8 - Small", ""), @@ -891,52 +881,36 @@ class BIMTextProperties(PropertyGroup): default="2.5", name="Font Size", ) - newline_at: IntProperty(name="Newline At") - reverse_list: BoolProperty(name="Reverse List", description="Reverses the order of any list.", default=False) - list_separator: StringProperty( # pyright: ignore[reportRedeclaration] - name="List Separator", - description="Text used to separate lists. Uses a comma (, ) if empty.", - ) - symbol: EnumProperty( # pyright: ignore[reportRedeclaration] - name="Symbol", - description="Symbol from symbols.svg to use for this text.", - items=[(s, s, "") for s in ["NO SYMBOL", "CUSTOM SYMBOL"] + tool.Drawing.DEFAULT_SYMBOLS], - default="NO SYMBOL", - ) - custom_symbol: StringProperty( # pyright: ignore[reportRedeclaration] - name="Custom Symbol", - description="Non-default symbol to use for this text.", - ) - - apply_font_size_to_all: BoolProperty( - name="Apply Font Size to All", description="Apply font size changes to all selected text objects", default=False + align_horizontal: EnumProperty( + items=[ + ("left", "Left", "", "ALIGN_LEFT", 0), + ("middle", "Middle", "", "ALIGN_CENTER", 1), + ("right", "Right", "", "ALIGN_RIGHT", 2), + ], + default="left", + name="Horizontal Alignment", + update=update_text_alignment, ) - apply_newline_to_all: BoolProperty( - name="Apply Newline to All", description="Apply newline changes to all selected text objects", default=False + align_vertical: EnumProperty( + items=[ + ("top", "Top", "", "ALIGN_TOP", 0), + ("middle", "Middle", "", "ALIGN_MIDDLE", 1), + ("bottom", "Bottom", "", "ALIGN_BOTTOM", 2), + ], + default="middle", + name="Vertical Alignment", + update=update_text_alignment, ) - literal_apply_settings: CollectionProperty(name="Literal Apply Settings", type=LiteralApplySettings) - - def ensure_literal_apply_settings(self, literal_count: int): - """Ensure we have apply settings for all literals""" - while len(self.literal_apply_settings) > literal_count: - self.literal_apply_settings.remove(len(self.literal_apply_settings) - 1) - - while len(self.literal_apply_settings) < literal_count: - setting = self.literal_apply_settings.add() - setting.literal_index = len(self.literal_apply_settings) - 1 - if TYPE_CHECKING: is_editing: bool literals: bpy.types.bpy_prop_collection_idprop[LiteralProps] - font_size: str newline_at: int - reverse_list: bool - list_separator: str symbol: Union[str, Literal["NO SYMBOL", "CUSTOM SYMBOL"]] custom_symbol: str - apply_font_size_to_all: bool - apply_newline_to_all: bool + font_size: str + align_horizontal: str + align_vertical: str def get_symbol(self) -> Union[str, None]: if self.symbol == "NO SYMBOL": @@ -971,8 +945,6 @@ def get_text_edited_data(self) -> dict[str, Any]: "FontSize": float(self.font_size), "Newline_At": int(self.newline_at), "Symbol": self.get_symbol(), - "Reverse_List": self.reverse_list, - "List_Separator": self.list_separator or ", ", } return text_data diff --git a/src/bonsai/bonsai/bim/module/drawing/scheduler.py b/src/bonsai/bonsai/bim/module/drawing/scheduler.py index da80a46126f..a1610020c49 100644 --- a/src/bonsai/bonsai/bim/module/drawing/scheduler.py +++ b/src/bonsai/bonsai/bim/module/drawing/scheduler.py @@ -18,22 +18,21 @@ import os import re -import bpy import string -import svgwrite +from pathlib import Path +from textwrap import wrap + import openpyxl import openpyxl.cell # Unnecessary, bug in typeshed. import openpyxl.utils # Unnecessary, bug in typeshed. -import bonsai.tool as tool - -from bonsai.bim.module.drawing.svgwriter import SvgWriter +import svgwrite from odf.opendocument import load as load_ods -from odf.table import Table, TableRow, TableColumn, TableCell -from odf.text import P from odf.style import Style -from textwrap import wrap -from pathlib import Path -from bonsai.bim.ifc import IfcStore +from odf.table import Table, TableCell, TableColumn, TableRow +from odf.text import P + +import bonsai.tool as tool +from bonsai.bim.module.drawing.svgwriter import SvgWriter DEBUG = False diff --git a/src/bonsai/bonsai/bim/module/drawing/shaders.py b/src/bonsai/bonsai/bim/module/drawing/shaders.py index 020fc53147e..c050cf0f41e 100644 --- a/src/bonsai/bonsai/bim/module/drawing/shaders.py +++ b/src/bonsai/bonsai/bim/module/drawing/shaders.py @@ -16,11 +16,10 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . -from gpu_extras.batch import batch_for_shader import gpu +from gpu_extras.batch import batch_for_shader from mathutils import Vector - # NOTES: # Since Metal doesn't support geometry shaders we stick to builtin shaders # and generate all geometry data in python before passing it to the shader. @@ -336,12 +335,9 @@ class BaseLinesShader(BaseShader): TYPE = "LINES" - DEF_GLSL = ( - BaseShader.DEF_GLSL - + """ + DEF_GLSL = BaseShader.DEF_GLSL + """ #define GAP_SIZE {gap_size} """ - ) GEOM_GLSL = """ layout(lines) in; @@ -370,9 +366,6 @@ class BaseLinesShader(BaseShader): } """ - def __init__(self, gap_size=16): - super().__init__(gap_size=gap_size) - def glenable(self): super().glenable() @@ -402,13 +395,10 @@ class DotsGizmoShader(GizmoShader): TYPE = "POINTS" - DEF_GLSL = ( - BaseShader.DEF_GLSL - + """ + DEF_GLSL = BaseShader.DEF_GLSL + """ #define CIRCLE_SEGMENTS 12 #define CIRCLE_RADIUS 8 """ - ) GEOM_GLSL = """ layout(points) in; diff --git a/src/bonsai/bonsai/bim/module/drawing/sheeter.py b/src/bonsai/bonsai/bim/module/drawing/sheeter.py index a3ec74159a9..df57b6efb56 100644 --- a/src/bonsai/bonsai/bim/module/drawing/sheeter.py +++ b/src/bonsai/bonsai/bim/module/drawing/sheeter.py @@ -16,20 +16,21 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . +import ntpath import os -import bpy -import uuid +import re import shutil -import ntpath -import pystache import urllib.parse +import uuid import xml.etree.ElementTree as ET -import bonsai.tool as tool -import ifcopenshell.util.geolocation from pathlib import Path from xml.dom import minidom + +import ifcopenshell.util.geolocation +import pystache from mathutils import Vector -import re + +import bonsai.tool as tool VIEW_TITLE_OFFSET_Y = 5 DRAWING_PADDING = 10 diff --git a/src/bonsai/bonsai/bim/module/drawing/svgwriter.py b/src/bonsai/bonsai/bim/module/drawing/svgwriter.py index 2d8c4e60cf8..9b2910b9a0c 100644 --- a/src/bonsai/bonsai/bim/module/drawing/svgwriter.py +++ b/src/bonsai/bonsai/bim/module/drawing/svgwriter.py @@ -16,33 +16,31 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . -import os -import re -import bpy import math -import bmesh +import os import shutil -from bpy.types import SplineBezierPoints, SplinePoints -import mathutils import xml.etree.ElementTree as ET -import svgwrite -import svgwrite.container -import svgwrite.text +from collections.abc import Callable, Sequence +from math import acos, atan, ceil, degrees, pi +from pathlib import Path +from typing import Optional, Self, Union + +import bmesh +import bpy import ifcopenshell import ifcopenshell.util.element -import ifcopenshell.util.representation import ifcopenshell.util.selector import ifcopenshell.util.unit -import bonsai.tool as tool -import bonsai.bim.module.drawing.helper as helper -from bonsai.bim.module.drawing.data import DrawingsData -from bonsai.bim.module.drawing.data import DecoratorData -from math import pi, ceil, atan, degrees, acos -from mathutils import geometry, Vector -from typing import Optional, Self, Union -from collections.abc import Callable, Sequence -from pathlib import Path +import svgwrite +import svgwrite.container +import svgwrite.text +from bpy.types import SplineBezierPoints, SplinePoints from markdown_it import MarkdownIt +from mathutils import Vector, geometry + +import bonsai.bim.module.drawing.helper as helper +import bonsai.tool as tool +from bonsai.bim.module.drawing.data import DecoratorData, DrawingsData class External(svgwrite.container.Group): @@ -115,9 +113,13 @@ def parse_markdown_it(text: str) -> list[dict[str, Union[str, None]]]: if tokens[j].type == "inline": for child in tokens[j].children or []: if child.type == "softbreak": - segments.append({"text": None, "url": None, "break": True, "bold": False, "italic": False}) + segments.append( + {"text": None, "url": None, "break": True, "bold": False, "italic": False} + ) elif child.type == "html_inline" and child.content.strip().lower() == "
": - segments.append({"text": None, "url": None, "break": True, "bold": False, "italic": False}) + segments.append( + {"text": None, "url": None, "break": True, "bold": False, "italic": False} + ) elif child.type == "strong_open": bold = True elif child.type == "strong_close": @@ -133,11 +135,27 @@ def parse_markdown_it(text: str) -> list[dict[str, Union[str, None]]]: elif child.type == "link_close" and link_opening: url = link_opening.attrGet("href") if url and link_text: - segments.append({"text": link_text, "url": url, "break": False, "bold": bold, "italic": italic}) + segments.append( + { + "text": link_text, + "url": url, + "break": False, + "bold": bold, + "italic": italic, + } + ) link_opening = None link_text = None elif child.type == "text" and not link_opening: - segments.append({"text": child.content, "url": None, "break": False, "bold": bold, "italic": italic}) + segments.append( + { + "text": child.content, + "url": None, + "break": False, + "bold": bold, + "italic": italic, + } + ) j += 1 i = j else: @@ -168,7 +186,9 @@ def parse_markdown_it(text: str) -> list[dict[str, Union[str, None]]]: link_opening = None link_text = None elif child.type == "text" and not link_opening: - segments.append({"text": child.content, "url": None, "break": False, "bold": bold, "italic": italic}) + segments.append( + {"text": child.content, "url": None, "break": False, "bold": bold, "italic": italic} + ) i += 1 segments = [seg for seg in segments if seg.get("text") is not None or seg.get("break", False)] if not segments: @@ -257,14 +277,16 @@ def calculate_scale(self): self.height = self.raw_height * self.svg_scale def add_stylesheet(self): - path = self.resource_paths["Stylesheet"] - if not path: - return - if not os.path.exists(path): - print(f"WARNING. Couldn't find stylesheet for the drawing by the path: {path}") + paths = self.resource_paths["Stylesheet"] + if not paths: return - with open(path, "r") as stylesheet: - self.svg.defs.add(self.svg.style(stylesheet.read())) + path_list = [p.strip() for p in paths.split(",")] + for path in path_list: + if not os.path.exists(path): + print(f"WARNING. Couldn't find stylesheet for the drawing by the path: {path}") + continue + with open(path, "r") as stylesheet: + self.svg.defs.add(self.svg.style(stylesheet.read())) def add_markers(self): path = self.resource_paths["Markers"] @@ -964,11 +986,6 @@ def draw_text_annotation(self, text_obj: bpy.types.Object, position: Vector) -> symbol = tool.Drawing.get_annotation_symbol(element) newline_at = tool.Drawing.get_newline_at(element) - # Get reverse_list and list_separator from EPset_Annotation - pset_data = ifcopenshell.util.element.get_pset(element, "EPset_Annotation") or {} - reverse_list = pset_data.get("Reverse_List", False) - list_separator = pset_data.get("List_Separator") or ", " - template_text_fields = [] if symbol: symbol_transform = self.get_symbol_transform(text_position_svg_str, angle, text_obj) @@ -985,7 +1002,7 @@ def draw_text_annotation(self, text_obj: bpy.types.Object, position: Vector) -> # NOTE: zip makes sure that we iterate over the shortest list for field, text_literal in zip(template_text_fields, text_literals): field.text = tool.Drawing.replace_text_literal_variables( - text_literal.Literal, product or element, reverse_list, list_separator + text_literal.Literal, product or element ) field.attrib["class"] = classes_str @@ -1005,10 +1022,9 @@ def draw_text_annotation(self, text_obj: bpy.types.Object, position: Vector) -> line_number = 0 for text_literal in text_literals: - text = tool.Drawing.replace_text_literal_variables( - text_literal.Literal, product or element, reverse_list, list_separator - ) - + text = tool.Drawing.replace_text_literal_variables(text_literal.Literal, product or element) + if newline_at: + text = helper.add_newline_between_words(text, newline_at) text_segments = parse_markdown_it(text) if len(text_segments) == 1 and text_segments[0]["url"] is None and not text_segments[0].get("break", False): diff --git a/src/bonsai/bonsai/bim/module/drawing/ui.py b/src/bonsai/bonsai/bim/module/drawing/ui.py index 552ca7f9b4d..c1809995a01 100644 --- a/src/bonsai/bonsai/bim/module/drawing/ui.py +++ b/src/bonsai/bonsai/bim/module/drawing/ui.py @@ -17,20 +17,22 @@ # along with Bonsai. If not, see . from __future__ import annotations + +from typing import TYPE_CHECKING, Optional, Union + import bpy +from bpy.types import Panel + import bonsai.bim.helper import bonsai.tool as tool -from bpy.types import Panel from bonsai.bim.module.drawing.data import ( - ProductAssignmentsData, - SheetsData, + DecoratorData, DocumentsData, DrawingsData, ElementFiltersData, - DecoratorData, - ElementValuesData, + ProductAssignmentsData, + SheetsData, ) -from typing import TYPE_CHECKING, Union, Optional if TYPE_CHECKING: from bonsai.bim.module.drawing.prop import DocProperties, Drawing, Sheet @@ -86,7 +88,7 @@ def draw(self, context): for link in links: row = panel.row(align=True) split = row.split(factor=0.9) - split.label(text=link.name, icon="FILE") + split.label(text=link.filepath, icon="FILE") split.prop(link, "include_in_drawings", text="") else: panel.label(text="No IFC projects linked and loaded.") @@ -476,7 +478,6 @@ def draw(self, context): op = row3.operator("bim.activate_drawing_from_sheet", icon="OUTLINER_OB_CAMERA", text="") - if active_sheet.reference_type == "DRAWING": drawingnamesvg = active_sheet.name drawingname = drawingnamesvg.split(".svg")[0] @@ -642,58 +643,56 @@ def draw_text_editing_ui( row.operator("bim.add_text_literal", icon="ADD", text="Add Literal") else: row.operator("bim.edit_text", icon="CHECKMARK") - row.operator("bim.add_text_literal", icon="ADD", text="") row.operator("bim.disable_editing_text", icon="CANCEL", text="") row = self.layout.row(align=True) row.prop(props, "font_size") - row.prop(props, "apply_font_size_to_all", text="", icon="COPYDOWN") + row.operator("bim.copy_text_to_selection", text="", icon="COPYDOWN").attribute = "FONT_SIZE" + row = self.layout.row() + row.label(text="Alignment") + row.prop(props, "align_horizontal", text="", expand=True) + row.prop(props, "align_vertical", text="", expand=True) + row.operator("bim.copy_text_to_selection", text="", icon="COPYDOWN").attribute = "ALIGNMENT" row = self.layout.row(align=True) row.prop(props, "newline_at") - row = self.layout.row(align=True) - row.prop(props, "reverse_list") - row = self.layout.row(align=True) - row.prop(props, "list_separator") + row.operator("bim.copy_text_to_selection", text="", icon="COPYDOWN").attribute = "WRAP_LENGTH" row = self.layout.row(align=True) row.prop(props, "symbol") if props.symbol == "CUSTOM SYMBOL": row = self.layout.row(align=True) row.prop(props, "custom_symbol", text="") - row.prop(props, "apply_newline_to_all", text="", icon="COPYDOWN") select_op = row.operator("bim.select_similar_text_literal_value", text="", icon="RESTRICT_SELECT_OFF") select_op.literal_value = str(props.newline_at) select_op.attribute_type = "newline" + row.operator("bim.copy_text_to_selection", text="", icon="COPYDOWN").attribute = "SYMBOL" + + row = self.layout.row(align=True) + row.label(text="Literals:") + row.operator("bim.copy_text_to_selection", text="", icon="COPYDOWN").attribute = "LITERALS" + row.operator("bim.add_text_literal", icon="ADD", text="") for i, literal_props in enumerate(props.literals): box = self.layout.box() - - row = box.row(align=True) - row.label(text=f"Literal[{i}]:") - if i > 0: - row.operator("bim.order_text_literal_up", icon="TRIA_UP", text="").literal_prop_id = i - if i < len(props.literals) - 1: - row.operator("bim.order_text_literal_down", icon="TRIA_DOWN", text="").literal_prop_id = i - row.operator("bim.remove_text_literal", icon="X", text="").literal_prop_id = i - - if len(literal_props.attributes) > 0 and i < len(props.literal_apply_settings): + if len(literal_props.attributes): row = box.row(align=True) - row.prop(literal_props.attributes[0], "string_value", text="Literal") - + bonsai.bim.helper.draw_attribute(literal_props.attributes[0], row, enable_search=True) + if i > 0: + row.operator("bim.order_text_literal_up", icon="TRIA_UP", text="").literal_prop_id = i + if i < len(props.literals) - 1: + row.operator("bim.order_text_literal_down", icon="TRIA_DOWN", text="").literal_prop_id = i + row.operator("bim.remove_text_literal", icon="X", text="").literal_prop_id = i + expand_icon = "DOWNARROW_HLT" if getattr(literal_props, "show_element_values", False) else "RIGHTARROW" op = row.operator("bim.toggle_element_values_panel", icon=expand_icon, text="") op.literal_prop_id = i - - row.prop(props.literal_apply_settings[i], "apply_text_to_all", text="", icon="COPYDOWN") - + element = tool.Ifc.get_entity(obj) assigned_element = tool.Drawing.get_assigned_product(element) or element resolved_value = tool.Drawing.replace_text_literal_variables( literal_props.attributes[0].string_value, assigned_element, - props.reverse_list, - props.list_separator, ) row = box.row(align=True) row.label(text="CurrentValue:") @@ -711,8 +710,10 @@ def draw_text_editing_ui( element_values_row.prop(literal_props, "product_used", text="", icon="EYEDROPPER") current_product = get_current_product_for_element_values(obj, literal_props) - - product_name = current_product.name if (current_product and hasattr(current_product, "name")) else "Unknown" + + product_name = ( + current_product.name if (current_product and hasattr(current_product, "name")) else "Unknown" + ) source_row = values_box.row() source_row.label(text=f"Source: {product_name}", icon="OBJECT_DATA") @@ -720,29 +721,29 @@ def draw_text_editing_ui( if element: add_row = values_box.row(align=True) add_row.prop(literal_props, "category_for_adding", text="") - + op = add_row.operator("bim.add_element_value_row", text="Add Element", icon="ADD") op.literal_prop_id = i if len(literal_props.element_value_rows) > 0: for row_idx, value_row in enumerate(literal_props.element_value_rows): row = values_box.row(align=True) - + is_custom_string = value_row.category == "Custom String" - + if is_custom_string: category_icon = get_category_icon(value_row.category) row.prop(value_row, "element_key", text="", icon=category_icon) else: split = row.split(factor=0.25, align=True) - + sep_col = split.row(align=True) sep_col.prop(value_row, "separator", text="") - + key_col = split.row(align=True) category_icon = get_category_icon(value_row.category) key_col.prop(value_row, "element_key", text="", icon=category_icon) - + op = row.operator("bim.element_value_suggestions_popup", text="", icon="VIEWZOOM") op.literal_prop_id = i op.row_index = row_idx @@ -758,7 +759,9 @@ def draw_text_editing_ui( apply_row = values_box.row() apply_row.scale_y = 1.2 - op = apply_row.operator("bim.apply_element_value_rows_to_literal", text="Apply to Literal", icon="CHECKMARK") + op = apply_row.operator( + "bim.apply_element_value_rows_to_literal", text="Apply to Literal", icon="CHECKMARK" + ) op.literal_prop_id = i else: error_row = values_box.row() @@ -773,44 +776,15 @@ def draw_text_editing_ui( else: row.prop(attr, "string_value", text="Path") select_value = attr.string_value - if i < len(props.literal_apply_settings): - row.prop(props.literal_apply_settings[i], "apply_path_to_all", text="", icon="COPYDOWN") other_attributes = [a for a in literal_props.attributes[2:] if a.name != "BoxAlignment"] if other_attributes: bonsai.bim.helper.draw_attributes(other_attributes, box) - row = box.row(align=True) - cols = [row.column(align=True) for j in range(3)] - for j in range(9): - cols[j % 3].prop( - literal_props, - "box_alignment", - text="", - index=j, - icon="RADIOBUT_ON" if literal_props.box_alignment[j] else "RADIOBUT_OFF", - ) - - col = row.column(align=True) - alignment_label_row = col.row(align=True) - alignment_label_row.label(text=" Text box alignment:") - if i < len(props.literal_apply_settings): - alignment_label_row.prop( - props.literal_apply_settings[i], "apply_box_alignment_to_all", text="", icon="COPYDOWN" - ) - - box_alignment_value = ( - literal_props.attributes[ - next( - (idx for idx, attr in enumerate(literal_props.attributes) if attr.name == "BoxAlignment"), - -1, - ) - ].string_value - if any(attr.name == "BoxAlignment" for attr in literal_props.attributes) - else "N/A" - ) - - col.label(text=f" {box_alignment_value}") + row = box.row() + row.label(text="Alignment") + row.prop(literal_props, "align_horizontal", text="", expand=True) + row.prop(literal_props, "align_vertical", text="", expand=True) def draw(self, context): obj = context.active_object @@ -818,61 +792,51 @@ def draw(self, context): props = tool.Drawing.get_text_props(obj) if props.is_editing: - self.draw_text_editing_ui(context) - else: - text_data = DecoratorData.get_text_data(obj) + return self.draw_text_editing_ui(context) + text_data = DecoratorData.get_text_data(obj) - row = self.layout.row() - row.operator("bim.enable_editing_text", icon="GREASEPENCIL") + row = self.layout.row() + row.operator("bim.enable_editing_text", icon="GREASEPENCIL") - row = self.layout.row(align=True) - row.label(text="FontSize") - click_op = row.operator( - "bim.select_similar_text_literal_value", text=str(text_data["FontSize"]), emboss=False - ) - click_op.literal_value = str(text_data["FontSize"]) - click_op.attribute_type = "font_size" - click_op.display_text = str(text_data["FontSize"]) + row = self.layout.row(align=True) + row.label(text="FontSize") + click_op = row.operator("bim.select_similar_text_literal_value", text=str(text_data["FontSize"]), emboss=False) + click_op.literal_value = str(text_data["FontSize"]) + click_op.attribute_type = "font_size" + click_op.display_text = str(text_data["FontSize"]) - row = self.layout.row(align=True) - row.label(text="Newline_At") - click_op = row.operator( - "bim.select_similar_text_literal_value", text=str(text_data["Newline_At"]), emboss=False - ) - click_op.literal_value = str(text_data["Newline_At"]) - click_op.attribute_type = "newline" - click_op.display_text = str(text_data["Newline_At"]) - row = self.layout.row(align=True) - row.label(text="Reverse_List") - row.label(text=str(text_data["Reverse_List"])) - row = self.layout.row(align=True) - row.label(text="List_Separator") - row.label(text=str(text_data["List_Separator"])) - - for i, literal_data in enumerate(text_data["Literals"]): - box = self.layout.box() - box.label(text=f"Literal[{i}]:") - - # Combine both approaches: clickable attributes from PR #7292 and display from PR #7106 - for attribute in literal_data: - row = box.row(align=True) - row.label(text=attribute) - click_op = row.operator( - "bim.select_similar_text_literal_value", - text=str(literal_data[attribute]), - emboss=False, - ) - click_op.literal_value = str(literal_data[attribute]) - click_op.literal_index = i - if attribute == "Literal": - click_op.attribute_type = "literal" - elif attribute == "Path": - click_op.attribute_type = "path" - elif attribute == "BoxAlignment": - click_op.attribute_type = "box_alignment" - else: - click_op.attribute_type = "text" - click_op.display_text = str(literal_data[attribute]) + row = self.layout.row(align=True) + row.label(text="Newline_At") + click_op = row.operator( + "bim.select_similar_text_literal_value", text=str(text_data["Newline_At"]), emboss=False + ) + click_op.literal_value = str(text_data["Newline_At"]) + click_op.attribute_type = "newline" + click_op.display_text = str(text_data["Newline_At"]) + + for i, literal_data in enumerate(text_data["Literals"]): + box = self.layout.box() + + # Combine both approaches: clickable attributes from PR #7292 and display from PR #7106 + for attribute in literal_data: + row = box.row(align=True) + row.label(text=attribute) + click_op = row.operator( + "bim.select_similar_text_literal_value", + text=str(literal_data[attribute]), + emboss=False, + ) + click_op.literal_value = str(literal_data[attribute]) + click_op.literal_index = i + if attribute == "Literal": + click_op.attribute_type = "literal" + elif attribute == "Path": + click_op.attribute_type = "path" + elif attribute == "BoxAlignment": + click_op.attribute_type = "box_alignment" + else: + click_op.attribute_type = "text" + click_op.display_text = str(literal_data[attribute]) class BIM_UL_drawinglist(bpy.types.UIList): diff --git a/src/bonsai/bonsai/bim/module/drawing/workspace.py b/src/bonsai/bonsai/bim/module/drawing/workspace.py index ae593d08738..bc7463073e0 100644 --- a/src/bonsai/bonsai/bim/module/drawing/workspace.py +++ b/src/bonsai/bonsai/bim/module/drawing/workspace.py @@ -18,18 +18,20 @@ import os +from functools import partial + import bpy import ifcopenshell.api.group import ifcopenshell.util.element +import ifcopenshell.util.representation +from bpy.types import WorkSpaceTool + +import bonsai.core.drawing as core import bonsai.core.geometry import bonsai.core.type -import bonsai.core.drawing as core import bonsai.tool as tool -import ifcopenshell.util.representation -from bonsai.bim.module.drawing.data import DecoratorData, AnnotationData from bonsai.bim.helper import prop_with_search -from bpy.types import WorkSpaceTool -from functools import partial +from bonsai.bim.module.drawing.data import AnnotationData, DecoratorData class LaunchAnnotationTypeManager(bpy.types.Operator): @@ -166,7 +168,7 @@ def create_annotation_occurrence(context): ) assert element - bonsai.core.type.assign_type(tool.Ifc, tool.Type, element=element, type=relating_type) + bonsai.core.type.assign_type(tool.Ifc, tool.Model, tool.Type, element=element, type=relating_type) ifcopenshell.api.group.assign_group(ifc_file, group=tool.Drawing.get_drawing_group(drawing), products=[element]) tool.Collector.assign(obj) diff --git a/src/bonsai/bonsai/bim/module/fm/__init__.py b/src/bonsai/bonsai/bim/module/fm/__init__.py index dc26a6379c3..5b54adb71be 100644 --- a/src/bonsai/bonsai/bim/module/fm/__init__.py +++ b/src/bonsai/bonsai/bim/module/fm/__init__.py @@ -19,7 +19,8 @@ # pyright: reportAttributeAccessIssue=false import bpy -from . import ui, prop, operator + +from . import operator, prop, ui classes = ( operator.ExecuteIfcFM, diff --git a/src/bonsai/bonsai/bim/module/fm/data.py b/src/bonsai/bonsai/bim/module/fm/data.py index fa4a9c4c6a9..6d486fd9ce3 100644 --- a/src/bonsai/bonsai/bim/module/fm/data.py +++ b/src/bonsai/bonsai/bim/module/fm/data.py @@ -16,9 +16,8 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . -import os + import ifcfm -import importlib def refresh(): diff --git a/src/bonsai/bonsai/bim/module/fm/operator.py b/src/bonsai/bonsai/bim/module/fm/operator.py index cda36598db6..43e9bb50e7f 100644 --- a/src/bonsai/bonsai/bim/module/fm/operator.py +++ b/src/bonsai/bonsai/bim/module/fm/operator.py @@ -17,15 +17,14 @@ # along with Bonsai. If not, see . import os + import bpy -import json import ifcfm -import logging -import tempfile import ifcopenshell -import bonsai.tool as tool from bpy_extras.io_utils import ExportHelper, ImportHelper +import bonsai.tool as tool + class ExecuteIfcFM(bpy.types.Operator, ExportHelper): bl_idname = "bim.execute_ifcfm" diff --git a/src/bonsai/bonsai/bim/module/fm/prop.py b/src/bonsai/bonsai/bim/module/fm/prop.py index 25db89224fa..cd6b038bc7e 100644 --- a/src/bonsai/bonsai/bim/module/fm/prop.py +++ b/src/bonsai/bonsai/bim/module/fm/prop.py @@ -16,22 +16,20 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . +from typing import TYPE_CHECKING, Literal + import bpy -import bonsai.tool as tool -from bonsai.bim.module.fm.data import FMData -from bonsai.bim.prop import MultipleFileSelect, StrProperty -from bpy.types import PropertyGroup from bpy.props import ( - PointerProperty, - StringProperty, - EnumProperty, BoolProperty, - IntProperty, - FloatProperty, - FloatVectorProperty, CollectionProperty, + EnumProperty, + PointerProperty, ) -from typing import TYPE_CHECKING, Literal +from bpy.types import PropertyGroup + +import bonsai.tool as tool +from bonsai.bim.module.fm.data import FMData +from bonsai.bim.prop import MultipleFileSelect, StrProperty def get_engine(self: "BIMFMProperties", context: object) -> tool.Blender.BLENDER_ENUM_ITEMS: diff --git a/src/bonsai/bonsai/bim/module/fm/ui.py b/src/bonsai/bonsai/bim/module/fm/ui.py index fa889c61fd1..69e51ea6dcc 100644 --- a/src/bonsai/bonsai/bim/module/fm/ui.py +++ b/src/bonsai/bonsai/bim/module/fm/ui.py @@ -16,8 +16,9 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . -import bonsai.tool as tool from bpy.types import Panel + +import bonsai.tool as tool from bonsai.bim.module.fm.data import FMData diff --git a/src/bonsai/bonsai/bim/module/geometry/__init__.py b/src/bonsai/bonsai/bim/module/geometry/__init__.py index de9a75fbc7b..111b67b5b05 100644 --- a/src/bonsai/bonsai/bim/module/geometry/__init__.py +++ b/src/bonsai/bonsai/bim/module/geometry/__init__.py @@ -17,10 +17,10 @@ # along with Bonsai. If not, see . import bpy -from . import ui, prop, operator -from bpy.app.handlers import persistent import ifcopenshell.util.element -import math +from bpy.app.handlers import persistent + +from . import operator, prop, ui classes = ( operator.AddCurvelikeItem, diff --git a/src/bonsai/bonsai/bim/module/geometry/data.py b/src/bonsai/bonsai/bim/module/geometry/data.py index 2e7d6c4205f..05344ab87e0 100644 --- a/src/bonsai/bonsai/bim/module/geometry/data.py +++ b/src/bonsai/bonsai/bim/module/geometry/data.py @@ -16,16 +16,18 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . +from typing import Any, Union + import bpy import ifcopenshell.util.element import ifcopenshell.util.geolocation import ifcopenshell.util.placement import ifcopenshell.util.representation import ifcopenshell.util.unit -import bonsai.tool as tool -from typing import Any, Union from mathutils import Vector +import bonsai.tool as tool + def refresh(): ViewportData.is_loaded = False diff --git a/src/bonsai/bonsai/bim/module/geometry/decorator.py b/src/bonsai/bonsai/bim/module/geometry/decorator.py index 14f48d8eec9..589b18ec84c 100644 --- a/src/bonsai/bonsai/bim/module/geometry/decorator.py +++ b/src/bonsai/bonsai/bim/module/geometry/decorator.py @@ -16,18 +16,19 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . -import bpy +from collections.abc import Sequence + import blf +import bpy import gpu -import bmesh import ifcopenshell -import bonsai.tool as tool import numpy as np from bpy.types import SpaceView3D -from mathutils import Vector, Matrix -from gpu_extras.batch import batch_for_shader from bpy_extras.view3d_utils import location_3d_to_region_2d -from collections.abc import Sequence +from gpu_extras.batch import batch_for_shader +from mathutils import Matrix, Vector + +import bonsai.tool as tool class ItemDecorator: @@ -74,7 +75,7 @@ def get_obj_data(cls, obj: bpy.types.Object) -> dict[str, list]: special_verts = [] special_edges = [] - if len(obj.data.loop_triangles) > 0: + if (total_triangles := len(obj.data.loop_triangles)) > 0: verts = [tuple(obj.matrix_world @ v.co) for v in obj.data.vertices] tris = [tuple(t.vertices) for t in obj.data.loop_triangles] diff --git a/src/bonsai/bonsai/bim/module/geometry/helper.py b/src/bonsai/bonsai/bim/module/geometry/helper.py index 7f70df4b962..3b14003435e 100644 --- a/src/bonsai/bonsai/bim/module/geometry/helper.py +++ b/src/bonsai/bonsai/bim/module/geometry/helper.py @@ -16,19 +16,16 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . -import bpy +from math import pi +from typing import Any, Optional, TypeVar, Union + import bmesh -import shapely -import mathutils -import numpy as np +import bpy import ifcopenshell import ifcopenshell.util.unit -import ifcopenshell.util.shape -import bonsai.tool as tool -from math import pi, pow -from mathutils import Vector, Matrix, geometry -from typing import Union, Any, TypeVar, Optional +import mathutils from ifcopenshell.util.shape_builder import ShapeBuilder +from mathutils import Matrix, Vector, geometry T = TypeVar("T") diff --git a/src/bonsai/bonsai/bim/module/geometry/operator.py b/src/bonsai/bonsai/bim/module/geometry/operator.py index d148b3df053..8d075a96058 100644 --- a/src/bonsai/bonsai/bim/module/geometry/operator.py +++ b/src/bonsai/bonsai/bim/module/geometry/operator.py @@ -16,18 +16,28 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . -import re -import bpy +from collections.abc import Sequence +from time import time +from typing import ( + TYPE_CHECKING, + Any, + Literal, + NamedTuple, + Union, + assert_never, + get_args, +) + import bmesh -import numpy as np -import numpy.typing as npt +import bpy import ifcopenshell +import ifcopenshell.api.boundary import ifcopenshell.api.drawing -import ifcopenshell.api.group -import ifcopenshell.api.pset import ifcopenshell.api.geometry +import ifcopenshell.api.group import ifcopenshell.api.layer import ifcopenshell.api.material +import ifcopenshell.api.pset import ifcopenshell.api.root import ifcopenshell.api.style import ifcopenshell.util.element @@ -35,26 +45,21 @@ import ifcopenshell.util.representation import ifcopenshell.util.shape_builder import ifcopenshell.util.unit -import ifcopenshell.api -import ifcopenshell.api.boundary -import ifcopenshell.api.grid +import numpy as np +import numpy.typing as npt +from ifcopenshell.util.shape_builder import ShapeBuilder +from mathutils import Matrix, Quaternion, Vector + +import bonsai.bim.handler +import bonsai.core.aggregate +import bonsai.core.drawing import bonsai.core.geometry import bonsai.core.geometry as core -import bonsai.core.aggregate import bonsai.core.nest -import bonsai.core.spatial -import bonsai.core.style import bonsai.core.root -import bonsai.core.drawing +import bonsai.core.spatial import bonsai.tool as tool -import bonsai.bim.handler -from bonsai.bim.module.model.data import AuthoringData -from mathutils import Vector, Matrix, Quaternion -from time import time from bonsai.bim.ifc import IfcStore -from ifcopenshell.util.shape_builder import ShapeBuilder -from collections.abc import Sequence -from typing import Any, Union, Literal, get_args, TYPE_CHECKING, assert_never, NamedTuple from bonsai.bim.module.model.decorator import ProfileDecorator if TYPE_CHECKING: @@ -80,7 +85,7 @@ def _execute(self, context): class OverrideMeshSeparate(bpy.types.Operator, tool.Ifc.Operator): bl_idname = "bim.override_mesh_separate" bl_label = "IFC Mesh Separate" - blender_op = bpy.ops.mesh.separate.get_rna_type() + blender_op = bpy.ops.mesh.separate.get_rna_type() # ty: ignore[missing-argument] bl_description = blender_op.description + ".\nAlso makes sure changes are in sync with IFC." bl_options = {"REGISTER", "UNDO"} blender_type_prop = blender_op.properties["type"] @@ -241,7 +246,7 @@ def separate_element( class OverrideOriginSet(bpy.types.Operator, tool.Ifc.Operator): bl_idname = "bim.override_origin_set" - blender_op = bpy.ops.object.origin_set.get_rna_type() + blender_op = bpy.ops.object.origin_set.get_rna_type() # ty: ignore[missing-argument] bl_label = "IFC Origin Set" bl_description = ( blender_op.description + ".\nAlso makes sure changes are in sync with IFC (operator works only on IFC objects)" @@ -796,7 +801,7 @@ def calc_delete_is_batch(ifc_file: ifcopenshell.file, context: bpy.types.Context class OverrideDelete(bpy.types.Operator): bl_idname = "bim.override_object_delete" bl_label = "IFC Delete" - blender_op = bpy.ops.object.delete.get_rna_type() + blender_op = bpy.ops.object.delete.get_rna_type() # ty: ignore[missing-argument] bl_description = ( blender_op.description + ".\nAlso makes sure changes in sync with IFC." @@ -816,7 +821,7 @@ class OverrideDelete(bpy.types.Operator): def poll(cls, context): # Match `object.delete` poll for consistency. # `object.delete` poll just checks for OBJECT mode. - poll = bpy.ops.object.delete.poll() + poll = bpy.ops.object.delete.poll() # ty: ignore[missing-argument] if poll: return True cls.poll_message_set("Only available in OBJECT mode") @@ -892,6 +897,7 @@ def _execute(self, context: bpy.types.Context): if not is_valid_data_block: continue + element = tool.Ifc.get_entity(obj) if element: if tool.Geometry.is_locked(element): @@ -902,6 +908,9 @@ def _execute(self, context: bpy.types.Context): if ifcopenshell.util.element.get_pset(element, "BBIM_Array"): self.report({"INFO"}, "Elements that are part of an array cannot be deleted.") continue + if element.is_a("IfcDocumentReference"): + self.report({"INFO"}, "Linked models cannot be deleted.") + continue if element.is_a("IfcGridAxis"): # Deleting the last W axis is OK if ((grid := element.PartOfU) and len(grid[0].UAxes) == 1) or ( @@ -1036,7 +1045,7 @@ class SelectedIdsData(NamedTuple): class OverrideOutlinerDelete(bpy.types.Operator, tool.Ifc.Operator): bl_idname = "bim.override_outliner_delete" bl_label = "IFC Delete" - blender_op = bpy.ops.outliner.delete.get_rna_type() + blender_op = bpy.ops.outliner.delete.get_rna_type() # ty: ignore[missing-argument] bl_description = ( blender_op.description + ".\nAlso makes sure changes in sync with IFC." @@ -1051,13 +1060,13 @@ class OverrideOutlinerDelete(bpy.types.Operator, tool.Ifc.Operator): def poll(cls, context) -> bool: # Match `outliner.delete` poll for consistency. # `outliner.delete` just checks `area.type` == `OUTLINER`. - poll = bpy.ops.outliner.delete.poll() + poll = bpy.ops.outliner.delete.poll() # ty: ignore[missing-argument] if poll: return True cls.poll_message_set("Only available from Outliner.") return False - def execute(self, context): + def execute(self, context): # ty:ignore[override-of-final-method] if len(getattr(context, "selected_ids", [])) == 0: return {"FINISHED"} @@ -1155,7 +1164,7 @@ class OverrideDuplicateMove(bpy.types.Operator): def poll(cls, context) -> bool: # Match `object.duplicate_move` poll for consistency. # `object.duplicate_move` poll checks for OBJECT mode. - poll = bpy.ops.object.duplicate_move.poll() + poll = bpy.ops.object.duplicate_move.poll() # ty: ignore[missing-argument] if poll: return True cls.poll_message_set("Only available in OBJECT mode") @@ -1198,6 +1207,11 @@ def execute_ifc_duplicate_operator(operator: bpy.types.Operator, context: bpy.ty operator.report({"ERROR"}, f"Drawing '{obj.name}' not duplicated.") continue + if element.is_a("IfcDocumentReference"): + objects_to_remove.add(obj) + operator.report({"ERROR"}, f"Linked model '{obj.name}' not duplicated.") + continue + if tool.Geometry.is_locked(element): objects_to_remove.add(obj) operator.report({"ERROR"}, lock_error_message(obj.name)) @@ -1205,13 +1219,84 @@ def execute_ifc_duplicate_operator(operator: bpy.types.Operator, context: bpy.ty for obj in objects_to_remove: tool.Blender.deselect_object(obj) + # Expand selection to include all parts of selected aggregates + objects_to_duplicate = set(context.selected_objects) - objects_to_remove + expanded_objects = set(objects_to_duplicate) + + for obj in objects_to_duplicate: + element = tool.Ifc.get_entity(obj) + if element and element.is_a("IfcElementAssembly"): + parts = tool.Aggregate.get_parts_recursively(element) + for part in parts: + part_obj = tool.Ifc.get_object(part) + if part_obj: + expanded_objects.add(part_obj) + + # Store parent aggregate relationships + parent_aggregates = {} + + for obj in expanded_objects: + element = tool.Ifc.get_entity(obj) + if element and element.is_a("IfcElementAssembly"): + parent_aggregate = ifcopenshell.util.element.get_aggregate(element) + if parent_aggregate: + parent_aggregates[element] = parent_aggregate + old_to_new, new_active_obj = tool.Geometry.duplicate_ifc_objects( - set(context.selected_objects) - objects_to_remove, + expanded_objects, linked=linked, active_object=context.active_object, ) + + # Restore parent aggregate relationships, but only for parents that were NOT duplicated + for old_elem, new_elems in old_to_new.items(): + if old_elem in parent_aggregates: + old_parent = parent_aggregates[old_elem] + + # Check if the parent was also duplicated + if old_parent in old_to_new: + # The duplication already created the correct nested relationship + continue + + # Parent was NOT duplicated, so we need to assign to the original parent + for new_elem in new_elems: + new_obj = tool.Ifc.get_object(new_elem) + parent_obj = tool.Ifc.get_object(old_parent) + if new_obj and parent_obj: + bonsai.core.aggregate.assign_object( + tool.Ifc, + tool.Aggregate, + tool.Collector, + relating_obj=parent_obj, + related_obj=new_obj, + ) + + # Select all duplicated objects and their parts + all_objects_to_select = set() + for old_elem, new_elems in old_to_new.items(): + for new_elem in new_elems: + new_obj = tool.Ifc.get_object(new_elem) + if new_obj: + all_objects_to_select.add(new_obj) + + # If it's an aggregate, also select all its parts + if new_elem.is_a("IfcElementAssembly"): + parts = tool.Aggregate.get_parts_recursively(new_elem) + for part in parts: + part_obj = tool.Ifc.get_object(part) + if part_obj: + all_objects_to_select.add(part_obj) + + # Deselect everything first + bpy.ops.object.select_all(action="DESELECT") + + # Select all the duplicated objects + for obj in all_objects_to_select: + obj.select_set(True) + if new_active_obj: context.view_layer.objects.active = new_active_obj + return old_to_new @@ -1491,6 +1576,7 @@ def _execute(self, context): old_to_new = {} original_data: dict[int, dict[int, dict[str, Any]]] = {} + # Define all nested functions FIRST def delete_objects(element: ifcopenshell.entity_instance) -> None: """Remove IfcElementAssembly and it's parts.""" parts = ifcopenshell.util.element.get_parts(element) @@ -1542,7 +1628,10 @@ def get_original_data(element: ifcopenshell.entity_instance) -> dict[int, dict[i if r.is_a("IfcRelAssignsToGroup") if self.group_name in r.RelatingGroup.Name ).id() - original_data[group] = {} + + # Initialize if not exists + if group not in original_data: + original_data[group] = {} pset: dict[str, Any] = ifcopenshell.util.element.get_pset(element, self.pset_name) index: int = pset["Index"] @@ -1559,8 +1648,13 @@ def get_original_data(element: ifcopenshell.entity_instance) -> dict[int, dict[i if parts: for part in parts: if part.is_a("IfcElementAssembly"): - # TODO: unused expression. - original_data | get_original_data(part) + # Recursively collect data from nested assemblies + nested_data = get_original_data(part) + # Merge nested data into original_data + for nested_group_id, nested_group_data in nested_data.items(): + if nested_group_id not in original_data: + original_data[nested_group_id] = {} + original_data[nested_group_id].update(nested_group_data) else: try: pset = ifcopenshell.util.element.get_pset(part, self.pset_name) @@ -1584,50 +1678,102 @@ def set_original_data(obj: bpy.types.Object, original_data: dict[int, dict[int, ): # if element has parts it means it is the base of and aggregate or sub-aggregate aggregate = element - group = next( - r.RelatingGroup - for r in getattr(aggregate, "HasAssignments", []) or [] - if r.is_a("IfcRelAssignsToGroup") - if self.group_name in r.RelatingGroup.Name - ).id() - if not group: + # Get the new group + new_group_entity = next( + ( + r.RelatingGroup + for r in getattr(aggregate, "HasAssignments", []) or [] + if r.is_a("IfcRelAssignsToGroup") + if self.group_name in r.RelatingGroup.Name + ), + None, + ) + + if not new_group_entity: return pset = ifcopenshell.util.element.get_pset(element, self.pset_name) + if not pset: + return + index = pset["Index"] + # Find the matching old group by looking for the same aggregate name + matching_group_id = None + if index == 0: + # This is a root assembly - find by Name + aggregate_name = pset.get("Name") + for group_id, group_data in original_data.items(): + if 0 in group_data and group_data[0].get("Name") == aggregate_name: + matching_group_id = group_id + break + else: + # This is a part - find the group that has this index + for group_id, group_data in original_data.items(): + if index in group_data: + matching_group_id = group_id + break + + if matching_group_id is None: + return + if index == 0: - obj.name = pset["Name"] + "_" + str(original_data[group][index]["Aggregate_Index"]) + obj.name = pset["Name"] + "_" + str(original_data[matching_group_id][index]["Aggregate_Index"]) ifc_file = tool.Ifc.get() ifcopenshell.api.pset.edit_pset( ifc_file, ifc_file.by_id(pset["id"]), - properties={"Aggregate_Index": int(original_data[group][index]["Aggregate_Index"])}, + properties={"Aggregate_Index": int(original_data[matching_group_id][index]["Aggregate_Index"])}, ) - bonsai.core.spatial.assign_container( - tool.Ifc, - tool.Collector, - tool.Spatial, - container=original_data[group][index]["Container"], - element_obj=obj, - ) - for part in ifcopenshell.util.element.get_parts(tool.Ifc.get_entity(obj)): - tool.Collector.assign(tool.Ifc.get_object(part)) - assignments = original_data[group][index]["Assignment"] + + # Only assign container if element is not already aggregated under another element + # Aggregated elements should not be in the spatial structure + if not ifcopenshell.util.element.get_aggregate(element): + bonsai.core.spatial.assign_container( + tool.Ifc, + tool.Collector, + tool.Spatial, + container=original_data[matching_group_id][index]["Container"], + objs=[obj], + ) + for part in ifcopenshell.util.element.get_parts(tool.Ifc.get_entity(obj)): + tool.Collector.assign(tool.Ifc.get_object(part)) + + assignments = original_data[matching_group_id][index]["Assignment"] if assignments: assign_to_annotations(obj, assignments) else: try: - obj.name = original_data[group][index]["Name"] + obj.name = original_data[matching_group_id][index]["Name"] except: pass try: - assignments = original_data[group][index]["Assignment"] + assignments = original_data[matching_group_id][index]["Assignment"] except: assignments = [] if assignments: assign_to_annotations(obj, assignments) + def get_original_matrix( + element: ifcopenshell.entity_instance, base_instance: ifcopenshell.entity_instance + ) -> tuple[Matrix, tuple[Vector, Quaternion, Vector]]: + selected_obj = tool.Ifc.get_object(base_instance) + selected_matrix = selected_obj.matrix_world + object_duplicate = tool.Ifc.get_object(element) + duplicate_matrix = object_duplicate.matrix_world.decompose() + + return selected_matrix, duplicate_matrix + + def set_new_matrix( + selected_matrix: Matrix, duplicate_matrix: tuple[Vector, Quaternion, Vector], old_to_new: dict + ) -> None: + for old, new in old_to_new.items(): + new_obj = tool.Ifc.get_object(new[0]) + new_base_matrix = Matrix.LocRotScale(*duplicate_matrix) + matrix_diff = Matrix.inverted(selected_matrix) @ new_obj.matrix_world + new_obj_matrix = new_base_matrix @ matrix_diff + new_obj.matrix_world = new_obj_matrix + def get_element_assembly(element: ifcopenshell.entity_instance) -> Union[ifcopenshell.entity_instance, None]: if element.is_a("IfcElementAssembly"): return element @@ -1671,26 +1817,6 @@ def handle_selection( return list(set(linked_aggregate_groups)), selected_parents - def get_original_matrix( - element: ifcopenshell.entity_instance, base_instance: ifcopenshell.entity_instance - ) -> tuple[Matrix, tuple[Vector, Quaternion, Vector]]: - selected_obj = tool.Ifc.get_object(base_instance) - selected_matrix = selected_obj.matrix_world - object_duplicate = tool.Ifc.get_object(element) - duplicate_matrix = object_duplicate.matrix_world.decompose() - - return selected_matrix, duplicate_matrix - - def set_new_matrix( - selected_matrix: Matrix, duplicate_matrix: tuple[Vector, Quaternion, Vector], old_to_new: dict - ) -> None: - for old, new in old_to_new.items(): - new_obj = tool.Ifc.get_object(new[0]) - new_base_matrix = Matrix.LocRotScale(*duplicate_matrix) - matrix_diff = Matrix.inverted(selected_matrix) @ new_obj.matrix_world - new_obj_matrix = new_base_matrix @ matrix_diff - new_obj.matrix_world = new_obj_matrix - active_element = tool.Ifc.get_entity(context.active_object) if not active_element: self.report({"INFO"}, "Object has no Ifc metadata.") @@ -1727,6 +1853,7 @@ def set_new_matrix( base_pset = ifcopenshell.util.element.get_pset(base_instance, self.pset_name) base_obj = tool.Ifc.get_object(base_instance) base_obj.name = base_pset["Name"] + "_" + str(base_pset["Aggregate_Index"]) + for element in instances_to_refresh: if element.GlobalId == base_instance.GlobalId: continue @@ -1735,7 +1862,12 @@ def set_new_matrix( selected_matrix, duplicate_matrix = get_original_matrix(element, base_instance) - original_data = get_original_data(element) + # Merge data instead of overwriting + element_original_data = get_original_data(element) + for group_id, group_data in element_original_data.items(): + if group_id not in original_data: + original_data[group_id] = {} + original_data[group_id].update(group_data) delete_objects(element) @@ -1749,7 +1881,7 @@ def set_new_matrix( set_new_matrix(selected_matrix, duplicate_matrix, old_to_new) for old, new in old_to_new.items(): - if element_aggregate and new[0].is_a("IfcElementAssembly"): + if element_aggregate and new[0].is_a("IfcElementAssembly") and old == base_instance: new_aggregate = ifcopenshell.util.element.get_aggregate(new[0]) if not new_aggregate: @@ -1776,7 +1908,7 @@ def set_new_matrix( class OverrideJoin(bpy.types.Operator, tool.Ifc.Operator): bl_idname = "bim.override_object_join" bl_label = "IFC Join" - blender_op = bpy.ops.mesh.separate.get_rna_type() + blender_op = bpy.ops.mesh.separate.get_rna_type() # ty: ignore[missing-argument] bl_description = ( blender_op.description + ".\nAlso makes sure changes are in sync with IFC." @@ -1794,7 +1926,7 @@ class OverrideJoin(bpy.types.Operator, tool.Ifc.Operator): @classmethod def poll(cls, context): - if not bpy.ops.object.join.poll(): + if not bpy.ops.object.join.poll(): # ty: ignore[missing-argument] cls.poll_message_set("Active object is not EDITable.") return False if not context.selected_editable_objects: @@ -1914,6 +2046,7 @@ def apply_placement( return position items = list(representation.Items) + skipped_objects = [] for obj in context.selected_editable_objects: if obj == self.target: continue @@ -1933,12 +2066,8 @@ def apply_placement( assert obj_rep if obj_rep.RepresentationType != representation_type: obj.select_set(False) - self.report( - {"ERROR"}, - f"IFC join failed - object '{obj.name}' has a different representation type " - f"({obj_rep.RepresentationType})\nthan target '{self.target.name}' ({representation_type}).", - ) - return + skipped_objects.append((obj.name, obj_rep.RepresentationType)) + continue placement = np.array(obj.matrix_world) placement[M_TRANSLATION] /= si_conversion @@ -2018,6 +2147,9 @@ def validate_item(item: ifcopenshell.entity_instance) -> bool: items.append(copied_item) ifcopenshell.api.root.remove_product(ifc_file, product=element) + if skipped_objects: + skipped_info = ", ".join(f"'{name}' ({rep_type})" for name, rep_type in skipped_objects) + self.report({"INFO"}, f"Skipped incompatible objects: {skipped_info}") representation.Items = items bpy.ops.object.join() core.switch_representation( @@ -2157,7 +2289,7 @@ def handle_single_object(self, context: bpy.types.Context, obj: bpy.types.Object elif obj in pprops.clipping_planes_objs: self.report({"ERROR"}, "Clipping planes cannot be edited") elif element: - if not obj.data: + if not obj.data or obj.type not in ("MESH", "CURVE"): self.report({"INFO"}, "No geometry to edit") elif tool.Geometry.is_locked(element): self.report({"ERROR"}, lock_error_message(obj.name)) diff --git a/src/bonsai/bonsai/bim/module/geometry/prop.py b/src/bonsai/bonsai/bim/module/geometry/prop.py index 1f8e00c11bb..549c3bd2271 100644 --- a/src/bonsai/bonsai/bim/module/geometry/prop.py +++ b/src/bonsai/bonsai/bim/module/geometry/prop.py @@ -16,23 +16,22 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . -import ifcopenshell +from typing import TYPE_CHECKING, Literal, Optional, Union + import bpy -import bonsai.tool as tool -from bonsai.bim.prop import StrProperty, Attribute, ObjProperty -from bonsai.bim.module.geometry.data import RepresentationsData, ViewportData -from bpy.types import PropertyGroup +import ifcopenshell from bpy.props import ( - PointerProperty, - StringProperty, - EnumProperty, BoolProperty, - IntProperty, - FloatProperty, - FloatVectorProperty, CollectionProperty, + EnumProperty, + IntProperty, + PointerProperty, + StringProperty, ) -from typing import Optional, TYPE_CHECKING, Union, Literal +from bpy.types import PropertyGroup + +import bonsai.tool as tool +from bonsai.bim.module.geometry.data import RepresentationsData, ViewportData def get_contexts(self: "BIMObjectGeometryProperties", context: bpy.types.Context) -> list[tuple[str, str, str]]: diff --git a/src/bonsai/bonsai/bim/module/geometry/ui.py b/src/bonsai/bonsai/bim/module/geometry/ui.py index c4ae6e54912..e7912c7a779 100644 --- a/src/bonsai/bonsai/bim/module/geometry/ui.py +++ b/src/bonsai/bonsai/bim/module/geometry/ui.py @@ -17,16 +17,17 @@ # along with Bonsai. If not, see . import bpy +from bpy.types import Menu, Panel, UIList + import bonsai.bim import bonsai.tool as tool -from bpy.types import Panel, Menu, UIList from bonsai.bim.helper import prop_with_search from bonsai.bim.module.geometry.data import ( - RepresentationsData, - RepresentationItemsData, ConnectionsData, - PlacementData, DerivedCoordinatesData, + PlacementData, + RepresentationItemsData, + RepresentationsData, ) from bonsai.bim.module.layer.data import LayersData @@ -514,6 +515,8 @@ def poll(cls, context): return context.active_object is not None def draw(self, context): + assert context.active_object + props = tool.Model.get_model_props() if not DerivedCoordinatesData.is_loaded: DerivedCoordinatesData.load() @@ -528,10 +531,8 @@ def draw(self, context): row = self.layout.row(align=True) row.enabled = False - area_3d = next((area for area in context.screen.areas if area.type == "VIEW_3D"), None) - space_3d = next((space for space in area_3d.spaces if space.type == "VIEW_3D"), None) - if bpy.context.scene.BIMModelProperties.show_bounding_box: + if props.show_bounding_box: for axis, icon, idx in [("X", "STRIP_COLOR_01", 0), ("Y", "STRIP_COLOR_04", 1), ("Z", "STRIP_COLOR_05", 2)]: row.label(text="", icon=icon) row.prop(context.active_object, "dimensions", text=axis, index=idx) diff --git a/src/bonsai/bonsai/bim/module/georeference/__init__.py b/src/bonsai/bonsai/bim/module/georeference/__init__.py index 407cd8feade..39ee8f41430 100644 --- a/src/bonsai/bonsai/bim/module/georeference/__init__.py +++ b/src/bonsai/bonsai/bim/module/georeference/__init__.py @@ -17,7 +17,8 @@ # along with Bonsai. If not, see . import bpy -from . import ui, prop, operator + +from . import operator, prop, ui classes = ( operator.AddGeoreferencing, diff --git a/src/bonsai/bonsai/bim/module/georeference/data.py b/src/bonsai/bonsai/bim/module/georeference/data.py index 059368abc73..bc9e5b9ac4b 100644 --- a/src/bonsai/bonsai/bim/module/georeference/data.py +++ b/src/bonsai/bonsai/bim/module/georeference/data.py @@ -17,15 +17,15 @@ # along with Bonsai. If not, see . -import bpy -import numpy as np -import bonsai.tool as tool import ifcopenshell.util.element import ifcopenshell.util.geolocation import ifcopenshell.util.schema import ifcopenshell.util.unit -from mathutils import Matrix, Vector +import numpy as np from ifcopenshell.util.doc import get_entity_doc +from mathutils import Matrix, Vector + +import bonsai.tool as tool def refresh(): diff --git a/src/bonsai/bonsai/bim/module/georeference/decorator.py b/src/bonsai/bonsai/bim/module/georeference/decorator.py index 55fcbc1d640..05bce0e20b5 100644 --- a/src/bonsai/bonsai/bim/module/georeference/decorator.py +++ b/src/bonsai/bonsai/bim/module/georeference/decorator.py @@ -16,18 +16,17 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . -import bpy +from math import radians + import blf import gpu -import bmesh -import ifcopenshell import ifcopenshell.util.geolocation -import bonsai.tool as tool -from math import radians from bpy.types import SpaceView3D -from mathutils import Vector, Matrix -from gpu_extras.batch import batch_for_shader from bpy_extras.view3d_utils import location_3d_to_region_2d +from gpu_extras.batch import batch_for_shader +from mathutils import Matrix, Vector + +import bonsai.tool as tool from bonsai.bim.module.georeference.data import GeoreferenceData @@ -53,12 +52,13 @@ def uninstall(cls): pass cls.is_installed = False - def draw_batch(self, shader_type, content_pos, color, indices=None): + def draw_batch(self, shader_type, content_pos, color, indices=None, should_scale=True): if not tool.Blender.validate_shader_batch_data(content_pos, indices): return props = tool.Georeference.get_georeference_props() - self.scale = props.visualization_scale - content_pos = [v * self.scale for v in content_pos] + if should_scale: + scale = tool.Georeference.get_georeference_props().visualization_scale + content_pos = [v * scale for v in content_pos] shader = self.line_shader if shader_type == "LINES" else self.shader batch = batch_for_shader(shader, shader_type, {"pos": content_pos}, indices=indices) shader.uniform_float("color", color) @@ -141,12 +141,13 @@ def draw_text(self, context): if wcs["blender_location"].length < 1000: position = wcs["blender_location"].copy() + position -= Vector((0, 0.1, 0)) + self.draw_text_at_position(context, text, position, should_scale=False) else: position = wcs["blender_location"].normalized() * 3 text += "\n(Warning: Actual XYZ Not Shown)" - position -= Vector((0, 0.1, 0)) - - self.draw_text_at_position(context, text, position) + position -= Vector((0, 0.1, 0)) + self.draw_text_at_position(context, text, position) if props.has_blender_offset: text = "IFC Local Origin" @@ -165,8 +166,10 @@ def draw_text(self, context): self.draw_text_at_position(context, text, location) blf.disable(self.font_id, blf.SHADOW) - def draw_text_at_position(self, context, text, position): - position = [v * self.scale for v in position] + def draw_text_at_position(self, context, text, position, should_scale=True): + if should_scale: + scale = tool.Georeference.get_georeference_props().visualization_scale + position = [v * scale for v in position] coords_2d = location_3d_to_region_2d(context.region, context.region_data, position) if not coords_2d: return @@ -309,8 +312,8 @@ def draw_geometry(self, context): if wcs["blender_location"].length < 1000: verts = [Vector((0, 0, 0)), wcs["blender_location"]] edges = [[0, 1]] - self.draw_batch("LINES", verts, decorator_color_special, edges) - self.draw_batch("POINTS", verts[1:], decorator_color_special) + self.draw_batch("LINES", verts, decorator_color_special, edges, should_scale=False) + self.draw_batch("POINTS", verts[1:], decorator_color_special, should_scale=False) else: location = wcs["blender_location"].normalized() edges = [[0, 1]] @@ -332,7 +335,7 @@ def draw_geometry(self, context): self.draw_batch("LINES", verts, decorator_color_special, edges) self.draw_dashed_line(location * 3, location * 6, decorator_color_error) - def draw_dashed_line(self, start, end, colour): + def draw_dashed_line(self, start, end, colour, should_scale=True): direction = (end - start).normalized() distance = (end - start).length current_distance = Vector((0, 0, 0)) @@ -347,7 +350,7 @@ def draw_dashed_line(self, start, end, colour): edges = [[i, i + 1] for i in range(0, len(points), 2)] verts = points - self.draw_batch("LINES", verts, colour, edges) + self.draw_batch("LINES", verts, colour, edges, should_scale=should_scale) def calculate_angles(self, context): self.pn_angle = 0.0 diff --git a/src/bonsai/bonsai/bim/module/georeference/operator.py b/src/bonsai/bonsai/bim/module/georeference/operator.py index 7d8f98dd6c3..93a4e0ef24d 100644 --- a/src/bonsai/bonsai/bim/module/georeference/operator.py +++ b/src/bonsai/bonsai/bim/module/georeference/operator.py @@ -17,11 +17,10 @@ # along with Bonsai. If not, see . import bpy +from bpy_extras.io_utils import ImportHelper -import bonsai.tool as tool import bonsai.core.georeference as core -from bpy_extras.io_utils import ImportHelper -from bonsai.bim.module.georeference.decorator import GeoreferenceDecorator +import bonsai.tool as tool class AddGeoreferencing(bpy.types.Operator, tool.Ifc.Operator): @@ -51,7 +50,7 @@ class RemoveGeoreferencing(bpy.types.Operator, tool.Ifc.Operator): bl_description = "Remove the georeferencing" def _execute(self, context): - core.remove_georeferencing(tool.Ifc) + core.remove_georeferencing(tool.Ifc, tool.Georeference) class EditGeoreferencing(bpy.types.Operator, tool.Ifc.Operator): diff --git a/src/bonsai/bonsai/bim/module/georeference/prop.py b/src/bonsai/bonsai/bim/module/georeference/prop.py index 0a5eecf4c17..9b1f8d5f4d7 100644 --- a/src/bonsai/bonsai/bim/module/georeference/prop.py +++ b/src/bonsai/bonsai/bim/module/georeference/prop.py @@ -16,24 +16,22 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . +from typing import TYPE_CHECKING + import bpy import ifcopenshell.util.geolocation -import bonsai.tool as tool -from bonsai.bim.prop import Attribute -from bpy.types import PropertyGroup from bpy.props import ( - PointerProperty, - StringProperty, - EnumProperty, BoolProperty, - IntProperty, - FloatProperty, - FloatVectorProperty, CollectionProperty, + FloatProperty, + StringProperty, ) +from bpy.types import PropertyGroup + +import bonsai.tool as tool from bonsai.bim.module.georeference.data import GeoreferenceData from bonsai.bim.module.georeference.decorator import GeoreferenceDecorator -from typing import TYPE_CHECKING +from bonsai.bim.prop import Attribute def get_coordinate_operation_class( @@ -141,7 +139,9 @@ def update_local_coordinates(self: "BIMGeoreferenceProperties", context: bpy.typ tool.Georeference.set_coordinates( "blender", ifcopenshell.util.geolocation.enh2xyz( - *local_coordinates, + local_coordinates[0], + local_coordinates[1], + local_coordinates[2], float(props.blender_offset_x), float(props.blender_offset_y), float(props.blender_offset_z), @@ -164,7 +164,9 @@ def update_map_coordinates(self: "BIMGeoreferenceProperties", context: bpy.types tool.Georeference.set_coordinates( "blender", ifcopenshell.util.geolocation.enh2xyz( - *local_coordinates, + local_coordinates[0], + local_coordinates[1], + local_coordinates[2], float(props.blender_offset_x), float(props.blender_offset_y), float(props.blender_offset_z), @@ -215,23 +217,19 @@ class BIMGeoreferenceProperties(PropertyGroup): description="Affects the georeference decorator size", default=1, soft_min=0.1, - soft_max=50, + soft_max=100, ) grid_north_angle: StringProperty(name="Grid North Angle", update=update_grid_north_angle) x_axis_abscissa: StringProperty(name="X Axis Abscissa", update=update_grid_north_vector) x_axis_ordinate: StringProperty(name="X Axis Ordinate", update=update_grid_north_vector) x_axis_is_null: BoolProperty(name="X Axis Is Null") - # These are only for reference to capture data about a host model from a linked model - # If you relink a model from a new host origin, we can autodetect it in theory with this - host_model_origin: StringProperty(name="Host Model Origin") - host_model_origin_si: StringProperty(name="Host Model Origin SI") - host_model_project_north: StringProperty(name="Host Model Angle to Grid North") - # This is the ENH in project units and SI units of the Blender session's 0,0,0. # These are only for reference, using tool.Georeference.set_model_origin on # project load, project create, and when linking for the first time from an # empty Blender session. + model_is_georeferenced: BoolProperty(name="Model Is Georeferenced") + model_crs: StringProperty(name="Model CRS") model_origin: StringProperty(name="Model Origin") model_origin_si: StringProperty(name="Model Origin SI") model_project_north: StringProperty(name="Model Angle to Grid North") @@ -273,10 +271,8 @@ class BIMGeoreferenceProperties(PropertyGroup): x_axis_ordinate: str x_axis_is_null: bool - host_model_origin: str - host_model_origin_si: str - host_model_project_north: str - + model_is_georeferenced: bool + model_crs: str model_origin: str model_origin_si: str model_project_north: str diff --git a/src/bonsai/bonsai/bim/module/georeference/ui.py b/src/bonsai/bonsai/bim/module/georeference/ui.py index 3dfec3a9f51..93e16b0fbe0 100644 --- a/src/bonsai/bonsai/bim/module/georeference/ui.py +++ b/src/bonsai/bonsai/bim/module/georeference/ui.py @@ -16,9 +16,10 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . -import bonsai.tool as tool from bpy.types import Panel -from bonsai.bim.helper import draw_attributes, draw_attribute + +import bonsai.tool as tool +from bonsai.bim.helper import draw_attribute, draw_attributes from bonsai.bim.module.georeference.data import GeoreferenceData diff --git a/src/bonsai/bonsai/bim/module/gis/__init__.py b/src/bonsai/bonsai/bim/module/gis/__init__.py index 4f0707c6934..2e0eeecad30 100644 --- a/src/bonsai/bonsai/bim/module/gis/__init__.py +++ b/src/bonsai/bonsai/bim/module/gis/__init__.py @@ -17,9 +17,8 @@ # along with Bonsai. If not, see . import bpy -from . import prop -from . import operator -from . import ui + +from . import operator, prop, ui classes = ( prop.BIMCityJsonProperties, diff --git a/src/bonsai/bonsai/bim/module/gis/prop.py b/src/bonsai/bonsai/bim/module/gis/prop.py index bbf12aeb07e..5971fa80a9e 100644 --- a/src/bonsai/bonsai/bim/module/gis/prop.py +++ b/src/bonsai/bonsai/bim/module/gis/prop.py @@ -16,14 +16,18 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . +from typing import TYPE_CHECKING + +import bpy +from bpy.props import BoolProperty, CollectionProperty, EnumProperty, StringProperty from bpy.types import PropertyGroup -from bpy.props import StringProperty, BoolProperty, EnumProperty, CollectionProperty + from bonsai.bim.prop import StrProperty class BIMCityJsonProperties(PropertyGroup): def get_lods(self, context): - global LODS_ENUM_ITEMS + global LODS_ENUM_ITEMS # ty: ignore[unresolved-global] LODS_ENUM_ITEMS = [(item.name, "LOD" + item.name, "Level of Detail " + item.name) for item in self.lods] return LODS_ENUM_ITEMS @@ -36,3 +40,13 @@ def get_lods(self, context): lod: EnumProperty(name="LOD", description="", items=get_lods, options={"ANIMATABLE"}, default=None) is_lod_found: BoolProperty(name="Is LOD Found", default=False) load_after_convert: BoolProperty(name="Load After Converting", default=True) + + if TYPE_CHECKING: + input: str + output: str + name: str + split_lod: bool + lods: bpy.types.bpy_prop_collection_idprop[StrProperty] + lod: str + is_lod_found: bool + load_after_convert: bool diff --git a/src/bonsai/bonsai/bim/module/group/__init__.py b/src/bonsai/bonsai/bim/module/group/__init__.py index 86e85366722..6fd4ed5408d 100644 --- a/src/bonsai/bonsai/bim/module/group/__init__.py +++ b/src/bonsai/bonsai/bim/module/group/__init__.py @@ -17,7 +17,8 @@ # along with Bonsai. If not, see . import bpy -from . import ui, prop, operator + +from . import operator, prop, ui classes = ( operator.AddGroup, diff --git a/src/bonsai/bonsai/bim/module/group/data.py b/src/bonsai/bonsai/bim/module/group/data.py index 60b97e77f07..fd5eba102d2 100644 --- a/src/bonsai/bonsai/bim/module/group/data.py +++ b/src/bonsai/bonsai/bim/module/group/data.py @@ -17,9 +17,7 @@ # along with Bonsai. If not, see . import bpy -import ifcopenshell -import ifcopenshell.util.cost -import ifcopenshell.util.element + import bonsai.tool as tool diff --git a/src/bonsai/bonsai/bim/module/group/operator.py b/src/bonsai/bonsai/bim/module/group/operator.py index 40c3e418a16..f58ba727637 100644 --- a/src/bonsai/bonsai/bim/module/group/operator.py +++ b/src/bonsai/bonsai/bim/module/group/operator.py @@ -16,13 +16,14 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . +from typing import TYPE_CHECKING, get_args + import bpy -import ifcopenshell.api import ifcopenshell.api.group import ifcopenshell.util.element + import bonsai.bim.helper import bonsai.tool as tool -from typing import TYPE_CHECKING, Literal, get_args class LoadGroups(bpy.types.Operator, tool.Ifc.Operator): @@ -42,11 +43,11 @@ class ToggleGroup(bpy.types.Operator, tool.Ifc.Operator): bl_label = "Toggle Group" bl_options = {"REGISTER", "UNDO"} - ifc_definition_id: bpy.props.IntProperty() # pyright: ignore[reportRedeclaration] - group_type: bpy.props.EnumProperty( # pyright: ignore[reportRedeclaration] + ifc_definition_id: bpy.props.IntProperty() + group_type: bpy.props.EnumProperty( items=[(i, i, "") for i in get_args(tool.Group.GroupType)], ) - option: bpy.props.EnumProperty( # pyright: ignore[reportRedeclaration] + option: bpy.props.EnumProperty( items=[(i, i, "") for i in get_args(tool.Group.ToggleOption)], ) diff --git a/src/bonsai/bonsai/bim/module/group/prop.py b/src/bonsai/bonsai/bim/module/group/prop.py index e96f6f8a2a1..56cf7aae07d 100644 --- a/src/bonsai/bonsai/bim/module/group/prop.py +++ b/src/bonsai/bonsai/bim/module/group/prop.py @@ -16,22 +16,20 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . +from typing import TYPE_CHECKING, Union + import bpy -import bonsai.tool as tool -from bonsai.bim.prop import StrProperty, Attribute -from bonsai.bim.module.pset.data import refresh as refresh_pset -from bpy.types import PropertyGroup from bpy.props import ( - PointerProperty, - StringProperty, - EnumProperty, BoolProperty, - IntProperty, - FloatProperty, - FloatVectorProperty, CollectionProperty, + IntProperty, + StringProperty, ) -from typing import TYPE_CHECKING, Union +from bpy.types import PropertyGroup + +import bonsai.tool as tool +from bonsai.bim.module.pset.data import refresh as refresh_pset +from bonsai.bim.prop import Attribute def update_active_group_index(self, context): diff --git a/src/bonsai/bonsai/bim/module/group/ui.py b/src/bonsai/bonsai/bim/module/group/ui.py index ac437e9c422..a9620c8ffcf 100644 --- a/src/bonsai/bonsai/bim/module/group/ui.py +++ b/src/bonsai/bonsai/bim/module/group/ui.py @@ -17,12 +17,15 @@ # along with Bonsai. If not, see . from __future__ import annotations + +from typing import TYPE_CHECKING + import bpy -import bonsai.tool as tool from bpy.types import Panel, UIList + +import bonsai.tool as tool from bonsai.bim.helper import draw_attributes from bonsai.bim.module.group.data import GroupsData, ObjectGroupsData -from typing import TYPE_CHECKING if TYPE_CHECKING: from bonsai.bim.module.group.prop import BIMGroupProperties, Group diff --git a/src/bonsai/bonsai/bim/module/ifcgit/__init__.py b/src/bonsai/bonsai/bim/module/ifcgit/__init__.py index ae946e4e9d2..6f4fec0836d 100644 --- a/src/bonsai/bonsai/bim/module/ifcgit/__init__.py +++ b/src/bonsai/bonsai/bim/module/ifcgit/__init__.py @@ -16,8 +16,8 @@ # Massimo Fabbro import bpy -from . import ui, prop, operator +from . import operator, prop, ui classes = ( operator.AddFileToRepo, @@ -34,8 +34,10 @@ operator.Fetch, operator.Merge, operator.ObjectLog, + operator.SelectConflictEntity, operator.Push, operator.RefreshGit, + operator.RenameBranch, operator.SwitchRevision, operator.InstallGit, operator.RunGitDiff, diff --git a/src/bonsai/bonsai/bim/module/ifcgit/data.py b/src/bonsai/bonsai/bim/module/ifcgit/data.py index 18ffe0e55ce..7dbd26b5e01 100644 --- a/src/bonsai/bonsai/bim/module/ifcgit/data.py +++ b/src/bonsai/bonsai/bim/module/ifcgit/data.py @@ -1,4 +1,3 @@ -import bpy import os import shutil @@ -22,65 +21,71 @@ def make_sure_is_loaded(cls): @classmethod def load(cls): + repo = None + if bool(tool.Ifc.get()): + path_ifc = tool.Ifc.get_path() + if os.path.isfile(path_ifc): + repo = tool.IfcGit.repo_from_path(path_ifc) + cls.data = { - "repo": cls.repo(), - "remotes": cls.remotes(), - "branch_names": cls.branch_names(), - "remote_names": cls.remote_names(), - "remote_urls": cls.remote_urls(), + "repo": repo, + "remotes": repo.remotes if repo else None, + "branch_names": cls.branch_names(repo), + "tag_names": cls.tag_names(repo), + "remote_names": cls.remote_names(repo), + "remote_urls": {r.name: r.url for r in repo.remotes} if repo else {}, "path_ifc": cls.path_ifc(), "branches_by_hexsha": cls.branches_by_hexsha(), "tags_by_hexsha": cls.tags_by_hexsha(), - "name_ifc": cls.name_ifc(), + "name_ifc": cls.name_ifc(repo), "dir_name": cls.dir_name(), "base_name": cls.base_name(), - "working_dir": cls.working_dir(), - "untracked_files": cls.untracked_files(), - "is_detached": cls.is_detached(), - "active_branch_name": cls.active_branch_name(), - "is_dirty": cls.is_dirty(), - "commit": cls.commit(), - "current_revision": cls.current_revision(), + "working_dir": repo.working_dir if repo else None, + "ifc_is_untracked": cls.ifc_is_untracked(repo), + "is_detached": repo.head.is_detached if repo else None, + "active_branch_name": repo.active_branch.name if repo and not repo.head.is_detached else None, + "is_dirty": cls.is_dirty(repo), + "current_revision": cls.current_revision(repo), "git_exe": cls.git_exe(), "ifcmerge_exe": cls.ifcmerge_exe(), } cls.is_loaded = True @classmethod - def repo(cls): - if bool(tool.Ifc.get()): - path_ifc = tool.Ifc.get_path() - if os.path.isfile(path_ifc): - return tool.IfcGit.repo_from_path(path_ifc) - return None - - @classmethod - def remotes(cls): - if cls.repo(): - return cls.repo().remotes - return None - - @classmethod - def branch_names(cls): - return [] + def branch_names(cls, repo): + if not repo or not repo.heads: + return [] + names = sorted([b.name for b in repo.branches]) + if "main" in names: + names.remove("main") + names = ["main"] + names + if repo.remotes: + for remote in repo.remotes: + for ref in remote.refs: + names.append(ref.name) + return names @classmethod - def remote_names(cls): - return [] + def tag_names(cls, repo): + if not repo: + return [] + return [t.name for t in repo.tags] @classmethod - def remote_urls(cls): - result = {} - if cls.repo(): - for remote in cls.repo().remotes: - result[remote.name] = remote.url - return result + def remote_names(cls, repo): + if not repo: + return [] + names = sorted([r.name for r in repo.remotes]) + if "origin" in names: + names.remove("origin") + names = ["origin"] + names + return names @classmethod def path_ifc(cls): path_ifc = tool.Ifc.get_path() if os.path.isfile(path_ifc): - return tool.Ifc.get_path() + return path_ifc return None @classmethod @@ -89,7 +94,8 @@ def branches_by_hexsha(cls): if tool.IfcGitRepo.repo.branches: return tool.IfcGit.branches_by_hexsha(tool.IfcGitRepo.repo) except AttributeError: - return {} + pass + return {} @classmethod def tags_by_hexsha(cls): @@ -98,12 +104,11 @@ def tags_by_hexsha(cls): return {} @classmethod - def name_ifc(cls): - if bool(tool.Ifc.get()): + def name_ifc(cls, repo): + if bool(tool.Ifc.get()) and repo: path_ifc = tool.Ifc.get_path() - if tool.IfcGitRepo.repo and os.path.isfile(path_ifc): - working_dir = tool.IfcGitRepo.repo.working_dir - return os.path.relpath(path_ifc, working_dir) + if os.path.isfile(path_ifc): + return os.path.relpath(path_ifc, repo.working_dir) return None @classmethod @@ -123,49 +128,28 @@ def base_name(cls): return None @classmethod - def working_dir(cls): - if cls.repo(): - return cls.repo().working_dir - - @classmethod - def untracked_files(cls): - if cls.repo(): - return cls.repo().untracked_files - return [] - - @classmethod - def is_detached(cls): - if cls.repo(): - return cls.repo().head.is_detached - - @classmethod - def active_branch_name(cls): - if cls.repo() and not cls.is_detached(): - return cls.repo().active_branch.name + def ifc_is_untracked(cls, repo): + """Return True if the IFC file exists in the repo but has not been added to git.""" + if not repo: + return False + path_ifc = tool.Ifc.get_path() + if not os.path.isfile(path_ifc): + return False + return not bool(repo.git.ls_files(path_ifc)) @classmethod - def is_dirty(cls): - if cls.repo() and cls.git_exe(): + def is_dirty(cls, repo): + if repo and cls.git_exe(): path_ifc = tool.Ifc.get_path() if os.path.isfile(path_ifc): - return cls.repo().is_dirty(path=path_ifc) + return repo.is_dirty(path=path_ifc) return False @classmethod - def commit(cls): - props = tool.IfcGit.get_ifcgit_props() - if cls.repo() and len(props.ifcgit_commits) > 0: - item = props.ifcgit_commits[props.commit_index] - try: - return cls.repo().commit(rev=item.hexsha) - except ValueError: - return - - @classmethod - def current_revision(cls): + def current_revision(cls, repo): props = tool.IfcGit.get_ifcgit_props() - if cls.repo() and cls.repo().head.is_valid() and len(props.ifcgit_commits) > 0: - return tool.IfcGitRepo.repo.commit() + if repo and repo.head.is_valid() and len(props.ifcgit_commits) > 0: + return repo.commit() @classmethod def git_exe(cls): diff --git a/src/bonsai/bonsai/bim/module/ifcgit/operator.py b/src/bonsai/bonsai/bim/module/ifcgit/operator.py index 8457c69fc7c..65bec6b2523 100644 --- a/src/bonsai/bonsai/bim/module/ifcgit/operator.py +++ b/src/bonsai/bonsai/bim/module/ifcgit/operator.py @@ -1,10 +1,12 @@ import os import re +from typing import TYPE_CHECKING + import bpy + import bonsai.core.ifcgit as core import bonsai.tool as tool from bonsai.bim.module.ifcgit.data import IfcGitData, refresh -from typing import TYPE_CHECKING class CreateRepo(bpy.types.Operator): @@ -118,11 +120,11 @@ def poll(cls, context): if props.commit_message == "": return False if repo: - if props.new_branch_name in [branch.name for branch in repo.branches]: + if props.new_branch_name in IfcGitData.data["branch_names"]: cls.poll_message_set("Branch already exists!") return False elif not tool.IfcGit.is_valid_ref_format(props.new_branch_name): - if repo.head.is_detached: + if IfcGitData.data["is_detached"]: cls.poll_message_set("Branch name is invalid or empty!") return False elif props.new_branch_name != "": @@ -132,10 +134,17 @@ def poll(cls, context): def execute(self, context): - repo = IfcGitData.data["repo"] - core.commit_changes(tool.IfcGit, tool.Ifc, repo) - core.refresh_revision_list(tool.IfcGit, repo, tool.Ifc) + props = tool.IfcGit.get_ifcgit_props() + commit_message = props.commit_message + new_branch_name = props.new_branch_name + core.commit_changes(tool.IfcGit, tool.Ifc, commit_message, new_branch_name) + props.new_branch_name = "" + props.commit_message = "" + core.refresh_revision_list(tool.IfcGit, tool.Ifc) refresh() + IfcGitData.load() + if new_branch_name: + props.display_branch = new_branch_name return {"FINISHED"} @@ -155,7 +164,7 @@ def poll(cls, context): repo = IfcGitData.data["repo"] if repo and ( not tool.IfcGit.is_valid_ref_format(props.new_tag_name) - or props.new_tag_name in [tag.name for tag in repo.tags] + or props.new_tag_name in IfcGitData.data["tag_names"] ): return False return True @@ -163,8 +172,12 @@ def poll(cls, context): def execute(self, context): repo = IfcGitData.data["repo"] - core.add_tag(tool.IfcGit, repo) - core.refresh_revision_list(tool.IfcGit, repo, tool.Ifc) + props = tool.IfcGit.get_ifcgit_props() + item = props.ifcgit_commits[props.commit_index] + core.add_tag(tool.IfcGit, repo, item.hexsha, props.new_tag_name, props.new_tag_message) + props.new_tag_name = "" + props.new_tag_message = "" + core.refresh_revision_list(tool.IfcGit, tool.Ifc) refresh() return {"FINISHED"} @@ -181,7 +194,7 @@ def execute(self, context): repo = IfcGitData.data["repo"] core.delete_tag(tool.IfcGit, repo, self.tag_name) - core.refresh_revision_list(tool.IfcGit, repo, tool.Ifc) + core.refresh_revision_list(tool.IfcGit, tool.Ifc) refresh() return {"FINISHED"} @@ -189,7 +202,7 @@ def execute(self, context): class RefreshGit(bpy.types.Operator): """Refresh revision list""" - bl_label = "" + bl_label = "Refresh" bl_idname = "ifcgit.refresh" bl_options = {"REGISTER"} @@ -203,8 +216,7 @@ def poll(cls, context): def execute(self, context): - repo = IfcGitData.data["repo"] - core.refresh_revision_list(tool.IfcGit, repo, tool.Ifc) + core.refresh_revision_list(tool.IfcGit, tool.Ifc) refresh() tool.IfcGit.decolourise() return {"FINISHED"} @@ -213,7 +225,7 @@ def execute(self, context): class DisplayRevision(bpy.types.Operator): """Colourise objects by selected revision""" - bl_label = "" + bl_label = "Colourise Revision" bl_idname = "ifcgit.display_revision" bl_options = {"REGISTER"} @@ -248,7 +260,7 @@ def execute(self, context): class SwitchRevision(bpy.types.Operator): """Switches the repository to the selected revision and reloads the IFC file""" - bl_label = "" + bl_label = "Switch Revision" bl_idname = "ifcgit.switch_revision" bl_options = {"REGISTER"} @@ -266,7 +278,7 @@ def execute(self, context): class Merge(bpy.types.Operator): - """Merges the selected branch into working branch""" + """Merges the selected branch into working branch.\nCtrl+click to preview without merging""" bl_label = "Merge this branch" bl_idname = "ifcgit.merge" @@ -280,15 +292,84 @@ def poll(cls, context): return True return False - def execute(self, context): + def invoke(self, context, event): + if event.ctrl: + core.dry_run_merge(tool.IfcGit, tool.Ifc, self) + refresh() + return {"FINISHED"} + return self.execute(context) - if core.merge_branch(tool.IfcGit, tool.Ifc, self): + def execute(self, context): + if core.merge_branch(tool.IfcGit, tool.Ifc, self) is not False: refresh() return {"FINISHED"} else: return {"CANCELLED"} +class SelectConflictEntity(bpy.types.Operator): + """Select the conflicting entity in the viewport""" + + bl_label = "Select Conflict Entity" + bl_idname = "ifcgit.select_conflict_entity" + bl_options = {"REGISTER"} + + step_id: bpy.props.IntProperty() + + if TYPE_CHECKING: + step_id: int + + def execute(self, context): + model = tool.Ifc.get() + if not model: + return {"CANCELLED"} + + try: + entity = model.by_id(self.step_id) + except Exception: + self.report({"WARNING"}, f"Entity #{self.step_id} not found (may have been deleted locally)") + return {"CANCELLED"} + + obj = tool.Ifc.get_object(entity) + if obj is None: + # Walk inverse references up to 5 hops to find nearest entity with a Blender object + visited = {entity.id()} + queue = [entity] + for _ in range(5): + next_queue = [] + for ent in queue: + for inv in model.get_inverse(ent): + if inv.id() in visited: + continue + visited.add(inv.id()) + obj = tool.Ifc.get_object(inv) + if obj is not None: + break + next_queue.append(inv) + if obj is not None: + break + if obj is not None: + break + queue = next_queue + + if obj is None: + self.report({"INFO"}, f"No viewport representation found for #{self.step_id} ({entity.is_a()})") + return {"CANCELLED"} + + bpy.ops.object.select_all(action="DESELECT") + obj.select_set(True) + context.view_layer.objects.active = obj + for area in context.screen.areas: + if area.type == "VIEW_3D": + region = next((r for r in area.regions if r.type == "WINDOW"), None) + if region: + with context.temp_override(area=area, region=region): + bpy.ops.view3d.view_selected() + break + + return {"FINISHED"} + + class Push(bpy.types.Operator): """Pushes the working branch to selected remote""" @@ -312,9 +393,9 @@ class Fetch(bpy.types.Operator): def execute(self, context): props = tool.IfcGit.get_ifcgit_props() - repo = IfcGitData.data["repo"] - remote = repo.remotes[props.select_remote] - remote.fetch() + core.fetch(tool.IfcGit, props.select_remote) + core.refresh_revision_list(tool.IfcGit, tool.Ifc) + refresh() return {"FINISHED"} @@ -334,7 +415,7 @@ def poll(cls, context): not repo or not tool.IfcGit.is_valid_ref_format(props.remote_name) or not props.remote_url - or props.remote_name in [remote.name for remote in repo.remotes] + or props.remote_name in IfcGitData.data["remote_names"] ): return False return True @@ -342,8 +423,11 @@ def poll(cls, context): def execute(self, context): repo = IfcGitData.data["repo"] - core.add_remote(tool.IfcGit, repo) - core.refresh_revision_list(tool.IfcGit, repo, tool.Ifc) + props = tool.IfcGit.get_ifcgit_props() + core.add_remote(tool.IfcGit, repo, props.remote_name, props.remote_url) + props.remote_name = "" + props.remote_url = "" + core.refresh_revision_list(tool.IfcGit, tool.Ifc) refresh() return {"FINISHED"} @@ -358,8 +442,19 @@ class DeleteRemote(bpy.types.Operator): def execute(self, context): repo = IfcGitData.data["repo"] - core.delete_remote(tool.IfcGit, repo) - core.refresh_revision_list(tool.IfcGit, repo, tool.Ifc) + props = tool.IfcGit.get_ifcgit_props() + remote_name = props.select_remote + if props.display_branch.startswith(remote_name + "/"): + active = IfcGitData.data["active_branch_name"] + if active: + props.display_branch = active + else: + local_branches = [b for b in IfcGitData.data["branch_names"] if "/" not in b] + if local_branches: + props.display_branch = local_branches[0] + core.delete_remote(tool.IfcGit, repo, remote_name) + tool.IfcGit.select_first_remote() + core.refresh_revision_list(tool.IfcGit, tool.Ifc) refresh() return {"FINISHED"} @@ -373,8 +468,8 @@ class ObjectLog(bpy.types.Operator): @classmethod def poll(cls, context): - if not (obj := context.active_object): - cls.poll_message_set("No Active Object") + if not (obj := context.active_object) or not obj.select_get(): + cls.poll_message_set("No selected object") elif not tool.Blender.get_ifc_definition_id(obj): cls.poll_message_set("Active Object doesn't have an IFC definition") else: @@ -420,7 +515,7 @@ class RunGitDiff(bpy.types.Operator): ) bl_options = set() - save_to_temp: bpy.props.BoolProperty(options={"SKIP_SAVE"}) # pyright: ignore[reportRedeclaration] + save_to_temp: bpy.props.BoolProperty(options={"SKIP_SAVE"}) if TYPE_CHECKING: save_to_temp: bool @@ -443,3 +538,37 @@ def invoke(self, context, event): def execute(self, context): core.run_git_diff(tool.IfcGit, self, self.save_to_temp) return {"FINISHED"} + + +class RenameBranch(bpy.types.Operator): + """Rename the current branch""" + + bl_label = "Rename Branch" + bl_idname = "ifcgit.rename_branch" + bl_options = {"REGISTER"} + + new_name: bpy.props.StringProperty(name="New name") + + if TYPE_CHECKING: + new_name: str + + @classmethod + def poll(cls, context): + IfcGitData.make_sure_is_loaded() + if not IfcGitData.data["repo"]: + return False + if IfcGitData.data["is_detached"]: + return False + if IfcGitData.data["is_dirty"]: + return False + return True + + def invoke(self, context, event): + self.new_name = IfcGitData.data["active_branch_name"] + return context.window_manager.invoke_props_dialog(self) + + def execute(self, context): + repo = IfcGitData.data["repo"] + core.rename_branch(tool.IfcGit, repo, self.new_name) + refresh() + return {"FINISHED"} diff --git a/src/bonsai/bonsai/bim/module/ifcgit/prop.py b/src/bonsai/bonsai/bim/module/ifcgit/prop.py index 128cfcd44b3..494da26f355 100644 --- a/src/bonsai/bonsai/bim/module/ifcgit/prop.py +++ b/src/bonsai/bonsai/bim/module/ifcgit/prop.py @@ -1,42 +1,30 @@ +from typing import TYPE_CHECKING, Literal + import bpy -import bonsai.tool as tool -from bpy.types import PropertyGroup from bpy.props import ( - StringProperty, BoolProperty, CollectionProperty, - IntProperty, EnumProperty, + IntProperty, + StringProperty, ) +from bpy.types import PropertyGroup + +import bonsai.tool as tool from bonsai.bim.module.ifcgit.data import IfcGitData -from typing import TYPE_CHECKING, Literal def git_branches(self: "IfcGitProperties", context: bpy.types.Context) -> tool.Blender.BLENDER_ENUM_ITEMS: # NOTE "Python must keep a reference to the strings returned by # the callback or Blender will misbehave or even crash" - IfcGitData.data["branch_names"] = sorted([branch.name for branch in IfcGitData.data["repo"].heads]) - - if "main" in IfcGitData.data["branch_names"]: - IfcGitData.data["branch_names"].remove("main") - IfcGitData.data["branch_names"] = ["main"] + IfcGitData.data["branch_names"] - - if IfcGitData.data["remotes"]: - for remote in IfcGitData.data["remotes"]: - for remote_branch in remote.refs: - IfcGitData.data["branch_names"].append(remote_branch.name) - - return [(myname, myname, myname) for myname in IfcGitData.data["branch_names"]] + # Branch list (local + remote, main first) is computed once in IfcGitData.load() + IfcGitData.make_sure_is_loaded() + return [(name, name, name) for name in IfcGitData.data["branch_names"]] def git_remotes(self: "IfcGitProperties", context: bpy.types.Context) -> tool.Blender.BLENDER_ENUM_ITEMS: - IfcGitData.data["remote_names"] = sorted([remote.name for remote in IfcGitData.data["remotes"]]) - - if "origin" in IfcGitData.data["remote_names"]: - IfcGitData.data["remote_names"].remove("origin") - IfcGitData.data["remote_names"] = ["origin"] + IfcGitData.data["remote_names"] - - return [(myname, myname, myname) for myname in IfcGitData.data["remote_names"]] + IfcGitData.make_sure_is_loaded() + return [(name, name, name) for name in IfcGitData.data["remote_names"]] def update_revlist(self: "IfcGitProperties", context: bpy.types.Context) -> None: @@ -88,6 +76,7 @@ class IfcGitListItem(PropertyGroup): name="Commit Message", default="", ) + committed_date: IntProperty(name="Committed Date", default=0) tags: CollectionProperty(type=IfcGitTag, name="List of revision tags") if TYPE_CHECKING: @@ -96,6 +85,7 @@ class IfcGitListItem(PropertyGroup): author_name: str author_email: str message: str + committed_date: int tags: bpy.types.bpy_prop_collection_idprop[IfcGitTag] @@ -149,6 +139,11 @@ class IfcGitProperties(PropertyGroup): ], update=update_revlist, ) + merge_conflicts: StringProperty( + name="Merge Conflicts", + description="JSON report from last failed merge attempt", + default="", + ) if TYPE_CHECKING: ifcgit_commits: bpy.types.bpy_prop_collection_idprop[IfcGitListItem] @@ -163,3 +158,4 @@ class IfcGitProperties(PropertyGroup): display_branch: str select_remote: str ifcgit_filter: Literal["all", "tagged", "relevant"] + merge_conflicts: str diff --git a/src/bonsai/bonsai/bim/module/ifcgit/ui.py b/src/bonsai/bonsai/bim/module/ifcgit/ui.py index 631f33c7e1d..901dee31ade 100644 --- a/src/bonsai/bonsai/bim/module/ifcgit/ui.py +++ b/src/bonsai/bonsai/bim/module/ifcgit/ui.py @@ -1,15 +1,17 @@ from __future__ import annotations -import bpy -import time + import os import platform -import bonsai.tool as tool +import time from typing import TYPE_CHECKING +import bpy + +import bonsai.tool as tool from bonsai.bim.module.ifcgit.data import IfcGitData if TYPE_CHECKING: - from bonsai.bim.module.ifcgit.prop import IfcGitProperties, IfcGitListItem + from bonsai.bim.module.ifcgit.prop import IfcGitListItem, IfcGitProperties class IFCGIT_PT_panel(bpy.types.Panel): @@ -50,7 +52,7 @@ def draw(self, context): if IfcGitData.data["repo"] and os.path.exists(IfcGitData.data["repo"].git_dir): name_ifc = IfcGitData.data["name_ifc"] row.label(text=IfcGitData.data["working_dir"], icon="SYSTEM") - if name_ifc in IfcGitData.data["untracked_files"]: + if IfcGitData.data["ifc_is_untracked"]: row.operator( "ifcgit.addfile", text="Add '" + name_ifc + "' to repository", @@ -110,15 +112,13 @@ def draw(self, context): row.label(text="Working branch: Detached HEAD") else: row.label(text="Working branch: " + IfcGitData.data["active_branch_name"]) + row.operator("ifcgit.rename_branch", icon="GREASEPENCIL", text="") - grouped = layout.row() - column = grouped.column() - row = column.row() + row = layout.row() row.prop(props, "display_branch", text="Browse branch") row.prop(props, "ifcgit_filter", text="Filter revisions") - row = column.row() - row.template_list( + layout.template_list( "COMMIT_UL_List", "The_List", props, @@ -126,20 +126,64 @@ def draw(self, context): props, "commit_index", ) - column = grouped.column() - row = column.row() - row.operator("ifcgit.refresh", icon="FILE_REFRESH") + row = layout.row(align=True) + row.operator("ifcgit.refresh", icon="FILE_REFRESH") if not is_dirty: - - row = column.row() row.operator("ifcgit.display_revision", icon="SELECT_DIFFERENCE") - - row = column.row() row.operator("ifcgit.switch_revision", icon="CURRENT_FILE") + row.operator("ifcgit.merge", icon="SYSTEM") - row = column.row() - row.operator("ifcgit.merge", icon="EXPERIMENTAL", text="") + conflicts = tool.IfcGit.get_merge_conflicts() + if conflicts is not None: + box = layout.box() + box.alert = True + row = box.row() + row.label( + text=f"Merge failed \u2014 {len(conflicts)} conflict(s)", + icon="ERROR", + ) + for conflict in conflicts: + col = box.column(align=True) + conflict_type = conflict.get("type", "") + entity_id = conflict.get("entity_id", "?") + local_id = conflict.get("original_local_id") + + if conflict_type == "attribute_conflict": + entity_class = conflict.get("entity_class", "Entity") + attr_idx = conflict.get("attribute_index", "?") + desc = f"#{entity_id} {entity_class}: attribute {attr_idx} conflict" + elif conflict_type == "entity_deleted_and_modified": + entity_class = conflict.get("entity_class", "Entity") + desc = f"#{entity_id} {entity_class}: " + conflict.get("message", "deleted/modified conflict") + elif conflict_type == "class_changed": + desc = ( + f"#{entity_id}: class changed " + + conflict.get("base_class", "?") + + " \u2192 " + + conflict.get("modified_class", "?") + ) + elif conflict_type == "required_entity_deleted": + desc = f"#{entity_id}: " + conflict.get("message", "required entity deleted") + else: + desc = f"#{entity_id}: {conflict_type}" + + row = col.row(align=True) + row.label(text=desc) + if local_id: + op = row.operator( + "ifcgit.select_conflict_entity", + text="", + icon="RESTRICT_SELECT_OFF", + ) + op.step_id = local_id + + if conflict_type == "attribute_conflict": + sub = col.column(align=True) + sub.scale_y = 0.75 + sub.label(text=f" Base: {conflict.get('base_value', '')}") + sub.label(text=f" Local: {conflict.get('local_value', '')}") + sub.label(text=f" Remote: {conflict.get('remote_value', '')}") if not props.ifcgit_commits: return @@ -214,13 +258,7 @@ def draw_item( ): current_revision = IfcGitData.data["current_revision"] - - # TODO Figure how this "item" can be acesse in "data.py" - # so it's possible to move the ".commit" - try: - commit = IfcGitData.data["repo"].commit(rev=item.hexsha) - except ValueError: - return + current_hexsha = current_revision.hexsha if current_revision else None lookup = IfcGitData.data["branches_by_hexsha"] refs = "" @@ -234,11 +272,11 @@ def draw_item( for tag in lookup[item.hexsha]: refs += "{" + tag.name + "} " - if commit == current_revision: - layout.label(text="[HEAD] " + refs + commit.message.split("\n")[0], icon="DECORATE_KEYFRAME") + if item.hexsha == current_hexsha: + layout.label(text="[HEAD] " + refs + item.message.split("\n")[0], icon="DECORATE_KEYFRAME") else: - layout.label(text=refs + commit.message.split("\n")[0], icon="DECORATE_ANIMATE") - layout.label(text=time.strftime("%c", time.localtime(commit.committed_date))) + layout.label(text=refs + item.message.split("\n")[0], icon="DECORATE_ANIMATE") + layout.label(text=time.strftime("%c", time.localtime(item.committed_date))) def draw_filter(self, context, layout): diff --git a/src/bonsai/bonsai/bim/module/layer/__init__.py b/src/bonsai/bonsai/bim/module/layer/__init__.py index 9ee1c57fb4d..06d5175833d 100644 --- a/src/bonsai/bonsai/bim/module/layer/__init__.py +++ b/src/bonsai/bonsai/bim/module/layer/__init__.py @@ -17,7 +17,8 @@ # along with Bonsai. If not, see . import bpy -from . import ui, prop, operator + +from . import operator, prop, ui classes = ( operator.AddPresentationLayer, diff --git a/src/bonsai/bonsai/bim/module/layer/data.py b/src/bonsai/bonsai/bim/module/layer/data.py index f55b4c2900c..1ec9db8b39d 100644 --- a/src/bonsai/bonsai/bim/module/layer/data.py +++ b/src/bonsai/bonsai/bim/module/layer/data.py @@ -16,10 +16,11 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . +from typing import Any + import bpy -import ifcopenshell + import bonsai.tool as tool -from typing import Any def refresh(): diff --git a/src/bonsai/bonsai/bim/module/layer/operator.py b/src/bonsai/bonsai/bim/module/layer/operator.py index d1b5a0580b2..4ff2a4fe0e2 100644 --- a/src/bonsai/bonsai/bim/module/layer/operator.py +++ b/src/bonsai/bonsai/bim/module/layer/operator.py @@ -16,13 +16,14 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . +from typing import TYPE_CHECKING + import bpy -import ifcopenshell.api import ifcopenshell.api.layer import ifcopenshell.util.element + import bonsai.bim.helper import bonsai.tool as tool -from typing import TYPE_CHECKING def get_active_mesh(context: bpy.types.Context, mesh_name: str) -> bpy.types.Mesh: diff --git a/src/bonsai/bonsai/bim/module/layer/prop.py b/src/bonsai/bonsai/bim/module/layer/prop.py index 079ba262de0..f91681af76f 100644 --- a/src/bonsai/bonsai/bim/module/layer/prop.py +++ b/src/bonsai/bonsai/bim/module/layer/prop.py @@ -16,21 +16,20 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . +from typing import TYPE_CHECKING + import bpy -import bonsai.tool as tool -from bonsai.bim.prop import StrProperty, Attribute -from bpy.types import PropertyGroup from bpy.props import ( - PointerProperty, - StringProperty, - EnumProperty, BoolProperty, - IntProperty, - FloatProperty, - FloatVectorProperty, CollectionProperty, + EnumProperty, + IntProperty, + StringProperty, ) -from typing import TYPE_CHECKING +from bpy.types import PropertyGroup + +import bonsai.tool as tool +from bonsai.bim.prop import Attribute def update_layer_property(self: "Layer", context: bpy.types.Context, *, property: str) -> None: diff --git a/src/bonsai/bonsai/bim/module/layer/ui.py b/src/bonsai/bonsai/bim/module/layer/ui.py index d7fcdec215f..b4de131ad6b 100644 --- a/src/bonsai/bonsai/bim/module/layer/ui.py +++ b/src/bonsai/bonsai/bim/module/layer/ui.py @@ -17,12 +17,15 @@ # along with Bonsai. If not, see . from __future__ import annotations + +from typing import TYPE_CHECKING + import bpy +from bpy.types import Mesh, Panel, UIList + import bonsai.tool as tool -from bpy.types import Panel, UIList, Mesh from bonsai.bim.helper import draw_attributes from bonsai.bim.module.layer.data import LayersData -from typing import TYPE_CHECKING if TYPE_CHECKING: from bonsai.bim.module.layer.prop import BIMLayerProperties, Layer diff --git a/src/bonsai/bonsai/bim/module/library/__init__.py b/src/bonsai/bonsai/bim/module/library/__init__.py index 5017772cfea..a3ef2c30603 100644 --- a/src/bonsai/bonsai/bim/module/library/__init__.py +++ b/src/bonsai/bonsai/bim/module/library/__init__.py @@ -17,7 +17,8 @@ # along with Bonsai. If not, see . import bpy -from . import ui, prop, operator + +from . import operator, prop, ui classes = ( operator.AddLibrary, diff --git a/src/bonsai/bonsai/bim/module/library/data.py b/src/bonsai/bonsai/bim/module/library/data.py index 87ad7c23ae2..0d26369035c 100644 --- a/src/bonsai/bonsai/bim/module/library/data.py +++ b/src/bonsai/bonsai/bim/module/library/data.py @@ -17,6 +17,7 @@ # along with Bonsai. If not, see . import bpy + import bonsai.tool as tool diff --git a/src/bonsai/bonsai/bim/module/library/operator.py b/src/bonsai/bonsai/bim/module/library/operator.py index 6f4e9714656..058b474732a 100644 --- a/src/bonsai/bonsai/bim/module/library/operator.py +++ b/src/bonsai/bonsai/bim/module/library/operator.py @@ -17,9 +17,9 @@ # along with Bonsai. If not, see . import bpy -import ifcopenshell.api -import bonsai.tool as tool + import bonsai.core.library as core +import bonsai.tool as tool class AddLibrary(bpy.types.Operator, tool.Ifc.Operator): diff --git a/src/bonsai/bonsai/bim/module/library/prop.py b/src/bonsai/bonsai/bim/module/library/prop.py index 24defdf9ea7..d7a9b51e1f2 100644 --- a/src/bonsai/bonsai/bim/module/library/prop.py +++ b/src/bonsai/bonsai/bim/module/library/prop.py @@ -16,22 +16,20 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . +from typing import TYPE_CHECKING, Literal + import bpy -import bonsai.tool as tool -from bonsai.bim.prop import StrProperty, Attribute -from bonsai.bim.module.library.data import LibrariesData -from bpy.types import PropertyGroup from bpy.props import ( - PointerProperty, - StringProperty, + CollectionProperty, EnumProperty, - BoolProperty, IntProperty, - FloatProperty, - FloatVectorProperty, - CollectionProperty, + StringProperty, ) -from typing import TYPE_CHECKING, Literal +from bpy.types import PropertyGroup + +import bonsai.tool as tool +from bonsai.bim.module.library.data import LibrariesData +from bonsai.bim.prop import Attribute def update_active_reference_index(self, context): diff --git a/src/bonsai/bonsai/bim/module/library/ui.py b/src/bonsai/bonsai/bim/module/library/ui.py index bfc64e30206..32780f27971 100644 --- a/src/bonsai/bonsai/bim/module/library/ui.py +++ b/src/bonsai/bonsai/bim/module/library/ui.py @@ -17,15 +17,18 @@ # along with Bonsai. If not, see . from __future__ import annotations + +from typing import TYPE_CHECKING + import bpy +from bpy.types import Panel, UIList + import bonsai.bim.helper import bonsai.tool as tool -from bpy.types import Panel, UIList from bonsai.bim.module.library.data import LibrariesData, LibraryReferencesData -from typing import TYPE_CHECKING if TYPE_CHECKING: - from bonsai.bim.module.library.prop import BIMLibraryProperties, LibraryReference + from bonsai.bim.module.library.prop import LibraryReference class BIM_PT_libraries(Panel): diff --git a/src/bonsai/bonsai/bim/module/light/__init__.py b/src/bonsai/bonsai/bim/module/light/__init__.py index 2785bba125c..fa167bc5184 100644 --- a/src/bonsai/bonsai/bim/module/light/__init__.py +++ b/src/bonsai/bonsai/bim/module/light/__init__.py @@ -16,17 +16,15 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . -import bpy -from . import ui, prop, operator, list - +import importlib.util import stat from pathlib import Path -import importlib -import importlib.util -import traceback +import bpy import pyradiance +from . import list, operator, prop, ui + def get_pyradiance_path(): return importlib.util.find_spec("pyradiance").submodule_search_locations[0] diff --git a/src/bonsai/bonsai/bim/module/light/data.py b/src/bonsai/bonsai/bim/module/light/data.py index abe9d9e87dd..d14835bb27e 100644 --- a/src/bonsai/bonsai/bim/module/light/data.py +++ b/src/bonsai/bonsai/bim/module/light/data.py @@ -16,10 +16,9 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . -import bpy -import bonsai.tool as tool import ifcopenshell.util.geolocation -from mathutils import Vector + +import bonsai.tool as tool def refresh(): diff --git a/src/bonsai/bonsai/bim/module/light/decorator.py b/src/bonsai/bonsai/bim/module/light/decorator.py index 77cd20ddbd3..f72a941ab84 100644 --- a/src/bonsai/bonsai/bim/module/light/decorator.py +++ b/src/bonsai/bonsai/bim/module/light/decorator.py @@ -16,16 +16,16 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . -import bpy + import blf +import bpy import gpu -import bmesh -import bonsai.tool as tool from bpy.types import SpaceView3D -from math import radians, degrees -from mathutils import Vector, Matrix -from gpu_extras.batch import batch_for_shader from bpy_extras.view3d_utils import location_3d_to_region_2d +from gpu_extras.batch import batch_for_shader +from mathutils import Matrix, Vector + +import bonsai.tool as tool from bonsai.bim.module.light.data import SolarData diff --git a/src/bonsai/bonsai/bim/module/light/list.py b/src/bonsai/bonsai/bim/module/light/list.py index 6eaa1f4c79f..ff6b7ae4bd6 100644 --- a/src/bonsai/bonsai/bim/module/light/list.py +++ b/src/bonsai/bonsai/bim/module/light/list.py @@ -17,13 +17,18 @@ # along with Bonsai. If not, see . from __future__ import annotations -import bpy + import json import os from typing import TYPE_CHECKING +import bpy + if TYPE_CHECKING: - from bonsai.bim.module.light.prop import RadianceExporterProperties, RadianceMaterial + from bonsai.bim.module.light.prop import ( + RadianceExporterProperties, + RadianceMaterial, + ) with open(os.path.join(os.path.dirname(__file__), "spectraldb.json"), "r") as f: spectraldb = json.load(f) diff --git a/src/bonsai/bonsai/bim/module/light/operator.py b/src/bonsai/bonsai/bim/module/light/operator.py index 4a8d993e0ec..c3f377e9b96 100644 --- a/src/bonsai/bonsai/bim/module/light/operator.py +++ b/src/bonsai/bonsai/bim/module/light/operator.py @@ -16,28 +16,29 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . -import os - -import pyradiance as pr -from datetime import datetime -import bpy -import bonsai.tool as tool -from pathlib import Path -from typing import Union, TYPE_CHECKING import json import math +import multiprocessing +import os import time -import ifcopenshell -import ifcopenshell.util.geolocation import webbrowser +from datetime import datetime +from math import radians +from pathlib import Path +from typing import TYPE_CHECKING, Union + +import bpy +import ifcopenshell import ifcopenshell.geom -import multiprocessing +import ifcopenshell.ifcopenshell_wrapper as W +import ifcopenshell.util.geolocation +import pyradiance as pr import requests -from math import radians +from bpy_extras.io_utils import ExportHelper, ImportHelper from mathutils import Vector + +import bonsai.tool as tool from bonsai.bim.module.light.data import SolarData -from bpy_extras.io_utils import ExportHelper -from bpy_extras.io_utils import ImportHelper ifc_materials = [] @@ -106,9 +107,8 @@ def execute(self, context): if iterator.initialize(): while True: shape = iterator.get() + assert isinstance(shape, W.TriangulationElement) materials = shape.geometry.materials - material_ids = shape.geometry.material_ids - # material_names = shape.geometry.material_names for material in materials: ifc_materials.append(material.name) @@ -272,21 +272,21 @@ def execute(self, context): + '''" map_u map_v 0 1 0.5 - + # This is a multiplier to colour balance the env map # In this case, it provides a rough ground luminance from 3k-5k env_map colorfunc env_colour 4 100 100 100 . 0 0 - + # .37 .57 1.5 is measured from a HDRI image # It is multiplied by a factor such that grey(r,g,b) = 1 skyfunc colorfunc sky_colour 4 .64 .99 2.6 . 0 0 - + void mixpict composite 7 env_colour sky_colour grey "''' + hdr_mask_path @@ -295,22 +295,22 @@ def execute(self, context): + """" map_u map_v 0 2 0.5 1 - + composite glow env_map_glow 0 0 4 1 1 1 0 - + env_map_glow source sky 0 0 4 0 0 1 180 - + env_colour glow ground_glow 0 0 4 1 1 1 0 - + ground_glow source ground 0 0 @@ -566,7 +566,7 @@ class LightPickCoordinates(bpy.types.Operator): ) bl_options = {"REGISTER", "UNDO"} - use_current_location: bpy.props.BoolProperty(options={"SKIP_SAVE"}) # pyright: ignore[reportRedeclaration] + use_current_location: bpy.props.BoolProperty(options={"SKIP_SAVE"}) if TYPE_CHECKING: use_current_location: bool diff --git a/src/bonsai/bonsai/bim/module/light/prop.py b/src/bonsai/bonsai/bim/module/light/prop.py index e538ca1bf24..24233b44d86 100644 --- a/src/bonsai/bonsai/bim/module/light/prop.py +++ b/src/bonsai/bonsai/bim/module/light/prop.py @@ -16,27 +16,29 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . +import datetime +import json +import os +from math import pi, radians +from typing import TYPE_CHECKING, Literal, Union + import bpy import pytz import tzfpy -import json -import datetime -import bonsai.tool as tool -from typing import TYPE_CHECKING, Literal, Union -from math import radians, pi -from mathutils import Euler, Vector, Matrix, Quaternion from bpy.props import ( - IntProperty, - StringProperty, + BoolProperty, + CollectionProperty, EnumProperty, FloatProperty, FloatVectorProperty, - BoolProperty, - CollectionProperty, + IntProperty, PointerProperty, + StringProperty, ) -import os from bpy.types import PropertyGroup +from mathutils import Euler, Matrix, Quaternion, Vector + +import bonsai.tool as tool from bonsai.bim.module.light.data import SolarData from bonsai.bim.module.light.decorator import SolarDecorator @@ -318,7 +320,7 @@ def update_material_mapping(self, context: bpy.types.Context) -> None: ) def get_subcategories(self, context: bpy.types.Context) -> tool.Blender.BLENDER_ENUM_ITEMS: - global SUBCATEGORIES_ENUM_ITEMS + global SUBCATEGORIES_ENUM_ITEMS # ty: ignore[unresolved-global] if self.category in spectraldb: SUBCATEGORIES_ENUM_ITEMS = [(k, k, "") for k in spectraldb[self.category].keys()] else: diff --git a/src/bonsai/bonsai/bim/module/light/ui.py b/src/bonsai/bonsai/bim/module/light/ui.py index 0f0ffc09cb6..cd4bdbb3621 100644 --- a/src/bonsai/bonsai/bim/module/light/ui.py +++ b/src/bonsai/bonsai/bim/module/light/ui.py @@ -17,9 +17,11 @@ # along with Bonsai. If not, see . import calendar +from typing import TYPE_CHECKING + import bpy + import bonsai.tool as tool -from typing import TYPE_CHECKING from bonsai.bim.module.light.data import SolarData diff --git a/src/bonsai/bonsai/bim/module/material/__init__.py b/src/bonsai/bonsai/bim/module/material/__init__.py index c7f7756bc96..5f14b170ee6 100644 --- a/src/bonsai/bonsai/bim/module/material/__init__.py +++ b/src/bonsai/bonsai/bim/module/material/__init__.py @@ -17,7 +17,8 @@ # along with Bonsai. If not, see . import bpy -from . import ui, prop, operator + +from . import operator, prop, ui classes = ( operator.AddConstituent, diff --git a/src/bonsai/bonsai/bim/module/material/data.py b/src/bonsai/bonsai/bim/module/material/data.py index efe79c17314..6d9e568087b 100644 --- a/src/bonsai/bonsai/bim/module/material/data.py +++ b/src/bonsai/bonsai/bim/module/material/data.py @@ -16,16 +16,16 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . -import os +from typing import Any, Union + import bpy import ifcopenshell -import ifcopenshell.util.element import ifcopenshell.util.doc -import ifcopenshell.util.schema +import ifcopenshell.util.element +from natsort import natsorted + import bonsai.tool as tool from bonsai.bim.module.drawing.helper import format_distance -from typing import Any, Union -from natsort import natsorted def refresh(): @@ -102,7 +102,6 @@ def styles(cls) -> list[tuple[str, str, str]]: if (style_name := s.Name) is not None ] results = natsorted(results, key=lambda i: i[1]) - results.insert(0, ("-", "No Surface Style", "")) return results @classmethod @@ -176,6 +175,7 @@ def load(cls): cls.data["active_material_constituents"] = cls.active_material_constituents() # after material_name and type_material cls.data["is_type_material_overridden"] = cls.is_type_material_overridden() + cls.data["bbim_material_layer_pset"] = cls.bbim_material_layer_pset() cls.is_loaded = True @@ -426,3 +426,35 @@ def is_type_material_overridden(cls) -> bool: # so we check occurrence material explicitly occurrence_material = ifcopenshell.util.element.get_material(cls.element, should_inherit=False) return bool(occurrence_material) + + @classmethod + def bbim_material_layer_pset(cls) -> Union[dict[str, Any], None]: + """Load BBIM_MaterialLayer pset data for display in UI.""" + if not cls.element: + return None + + pset_data = ifcopenshell.util.element.get_pset(cls.element, "BBIM_MaterialLayer") + if not pset_data or not pset_data.get("UseCustomOffset", False): + return None + + # Keep offset in SI units - format_distance will handle conversion + custom_offset_si = pset_data.get("CustomOffset", 0.0) + + # Get the appropriate reference based on usage type + usage_type = tool.Model.get_usage_type(cls.element) + custom_reference = None + reference_label = None + + if usage_type == "LAYER2": + custom_reference = pset_data.get("CustomWallReference", "") + reference_label = "Wall Reference" + elif usage_type == "LAYER3": + custom_reference = pset_data.get("CustomSlabReference", "") + reference_label = "Slab Reference" + + return { + "use_custom_offset": pset_data.get("UseCustomOffset", False), + "custom_offset": custom_offset_si, # Store in SI units + "custom_reference": custom_reference, + "reference_label": reference_label, + } diff --git a/src/bonsai/bonsai/bim/module/material/operator.py b/src/bonsai/bonsai/bim/module/material/operator.py index eef35d519c0..7587a7e4ed4 100644 --- a/src/bonsai/bonsai/bim/module/material/operator.py +++ b/src/bonsai/bonsai/bim/module/material/operator.py @@ -16,20 +16,21 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . -import bpy import json -import ifcopenshell.api +from typing import TYPE_CHECKING, Any, Literal, Union + +import bpy import ifcopenshell.api.material import ifcopenshell.api.profile import ifcopenshell.api.style import ifcopenshell.util.element import ifcopenshell.util.representation + import bonsai.bim.helper -import bonsai.tool as tool -import bonsai.core.material as core import bonsai.bim.module.model.profile as model_profile -from typing import Any, Union, TYPE_CHECKING, Literal -from bonsai.bim.module.model import wall, slab +import bonsai.core.material as core +import bonsai.tool as tool +from bonsai.bim.module.model import slab, wall if TYPE_CHECKING: from bonsai.bim.prop import Attribute @@ -209,14 +210,15 @@ class AssignMaterialToSelected(bpy.types.Operator, tool.Ifc.Operator): bl_idname = "bim.assign_material_to_selected" bl_label = "Assign Material To Selected" bl_description = ( - "Assign currently selected material in Materials UI to the selected objects.\n\n" - "ALT+CLICK to assign material as a usage." + "Assign currently selected material in Materials UI to the selected objects.\n" + "Occurrences automatically get usages for layer/profile sets.\n\n" + "ALT+CLICK to assign without a usage." ) bl_options = {"REGISTER", "UNDO"} material: bpy.props.IntProperty(name="Material IFC ID") - assign_as_usage: bpy.props.BoolProperty( - name="Assign Material As A Usage", - default=False, + should_auto_assign_usage: bpy.props.BoolProperty( + name="Auto Assign Usage", + default=True, options={"SKIP_SAVE"}, ) @@ -229,25 +231,19 @@ def poll(cls, context): def invoke(self, context, event): if event.type == "LEFTMOUSE" and event.alt: - material_class = tool.Ifc.get().by_id(self.material).is_a() - if material_class not in ("IfcMaterialProfileSet", "IfcMaterialLayerSet"): - self.report({"ERROR"}, f"{material_class} cannot be assigned as a usage.") - return {"CANCELLED"} - self.assign_as_usage = True + self.should_auto_assign_usage = False return self.execute(context) def _execute(self, context): material = tool.Ifc.get().by_id(self.material) objects = tool.Blender.get_selected_objects() - material_type = material.is_a() - if self.assign_as_usage: - material_type += "Usage" core.assign_material( tool.Ifc, tool.Material, - material_type=material_type, + material_type=material.is_a(), objects=objects, material=material, + should_auto_assign_usage=self.should_auto_assign_usage, ) @@ -509,6 +505,10 @@ def execute(self, context): bonsai.bim.helper.import_attributes(material[0], props.material_set_attributes) else: bonsai.bim.helper.import_attributes(material, props.material_set_attributes) + + # Load custom offset from BBIM_MaterialLayer pset + tool.Model.load_custom_offset_from_pset(element, obj) + return {"FINISHED"} def import_attributes_callback( @@ -622,12 +622,16 @@ def _execute(self, context): layer_sets_to_regenerate.add(obj_material_usage.ForLayerSet) + # Save custom offset to BBIM_MaterialLayer pset + tool.Model.save_custom_offset_to_pset(obj_element, obj) + for layer_set in layer_sets_to_regenerate: wall.DumbWallPlaner().regenerate_from_layer_set(layer_set) slab.DumbSlabPlaner().regenerate_from_layer_set(layer_set) if material_set_usage.is_a("IfcMaterialProfileSetUsage"): - attributes["CardinalPoint"] = int(attributes["CardinalPoint"]) + if "CardinalPoint" in attributes: + attributes["CardinalPoint"] = int(attributes["CardinalPoint"]) ifcopenshell.api.material.edit_profile_usage( self.file, usage=material_set_usage, @@ -713,7 +717,11 @@ def execute(self, context): self.props.material_set_item_material = str(material_set_item.Material.id()) self.props.material_set_item_attributes.clear() - bonsai.bim.helper.import_attributes(material_set_item, self.props.material_set_item_attributes) + bonsai.bim.helper.import_attributes( + material_set_item, + self.props.material_set_item_attributes, + callback=self.import_attributes_callback, + ) if material_set_item.is_a("IfcMaterialProfile"): if material_set_item.Profile and material_set_item.Profile.ProfileName: @@ -721,6 +729,29 @@ def execute(self, context): return {"FINISHED"} + def import_attributes_callback( + self, name: str, prop: Union["Attribute", None], data: dict[str, Any] + ) -> None | Literal[True]: + if data["type"] != "IfcMaterialLayer" or name != "IsVentilated" or not prop: + return None + + # Keep null semantics unchanged on export, but avoid an empty UI selection. + prop.data_type = "enum" + prop.special_type = "LOGICAL" + prop.enum_items = json.dumps(("TRUE", "FALSE", "UNKNOWN")) + + value = data[name] + if value == "UNKNOWN": + prop.enum_value = "UNKNOWN" + elif value is None: + # Keep visible default as FALSE, but preserve null semantics on save. + prop.enum_value = "FALSE" + prop.is_null = True + else: + prop.enum_value = "TRUE" if value else "FALSE" + + return True + class DisableEditingMaterialSetItem(bpy.types.Operator): bl_idname = "bim.disable_editing_material_set_item" diff --git a/src/bonsai/bonsai/bim/module/material/prop.py b/src/bonsai/bonsai/bim/module/material/prop.py index 2fbd8d28475..9c8454f05ed 100644 --- a/src/bonsai/bonsai/bim/module/material/prop.py +++ b/src/bonsai/bonsai/bim/module/material/prop.py @@ -16,26 +16,24 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . -import ifcopenshell +from typing import TYPE_CHECKING + import bpy -from ifcopenshell.util.doc import get_entity_doc -import bonsai.tool as tool -from bonsai.bim.module.classification.data import MaterialClassificationsData -from bonsai.bim.module.material.data import MaterialsData, ObjectMaterialData -from bonsai.bim.module.profile.data import ProfileData -from bonsai.bim.prop import StrProperty, Attribute -from bpy.types import PropertyGroup from bpy.props import ( - PointerProperty, - StringProperty, - EnumProperty, BoolProperty, - IntProperty, - FloatProperty, - FloatVectorProperty, CollectionProperty, + EnumProperty, + FloatProperty, + IntProperty, + StringProperty, ) -from typing import TYPE_CHECKING +from bpy.types import PropertyGroup + +import bonsai.tool as tool +from bonsai.bim.module.classification.data import MaterialClassificationsData +from bonsai.bim.module.material.data import MaterialsData, ObjectMaterialData +from bonsai.bim.module.profile.data import ProfileData +from bonsai.bim.prop import Attribute def get_profile_classes(self, context): diff --git a/src/bonsai/bonsai/bim/module/material/ui.py b/src/bonsai/bonsai/bim/module/material/ui.py index 5c1b7d05b24..db16755aad2 100644 --- a/src/bonsai/bonsai/bim/module/material/ui.py +++ b/src/bonsai/bonsai/bim/module/material/ui.py @@ -17,17 +17,20 @@ # along with Bonsai. If not, see . from __future__ import annotations -import bonsai.bim.helper -import bonsai.tool as tool + +from typing import TYPE_CHECKING, Any + import bpy +import ifcopenshell.util.element from bpy.types import Panel, UIList -from bonsai.bim.helper import draw_attributes -from bonsai.bim.helper import prop_with_search + +import bonsai.bim.helper +import bonsai.tool as tool +from bonsai.bim.helper import draw_attributes, prop_with_search from bonsai.bim.module.material.data import MaterialsData, ObjectMaterialData -from typing import TYPE_CHECKING, Any if TYPE_CHECKING: - from bonsai.bim.module.material.prop import Material, BIMMaterialProperties + from bonsai.bim.module.material.prop import BIMMaterialProperties, Material class BIM_PT_materials(Panel): @@ -115,12 +118,17 @@ def draw_editing_ui(self): row.operator("bim.edit_material", text="Save Material", icon="CHECKMARK").material = ifc_definition_id row.operator("bim.disable_editing_material", text="", icon="CANCEL") elif self.props.editing_material_type == "STYLE": - row = self.layout.row(align=True) - row.prop(self.props, "contexts", text="") - prop_with_search(row, self.props, "styles", text="") - row = self.layout.row(align=True) - row.operator("bim.edit_material_style", text="Assign Style", icon="CHECKMARK") - row.operator("bim.disable_editing_material", text="", icon="CANCEL") + if MaterialsData.data["styles"]: + row = self.layout.row(align=True) + row.prop(self.props, "contexts", text="") + prop_with_search(row, self.props, "styles", text="") + row = self.layout.row(align=True) + row.operator("bim.edit_material_style", text="Assign Style", icon="CHECKMARK") + row.operator("bim.disable_editing_material", text="", icon="CANCEL") + else: + row = self.layout.row(align=True) + row.label(text="No Styles Found") + row.operator("bim.disable_editing_material", text="", icon="CANCEL") class BIM_PT_object_material(Panel): @@ -134,8 +142,6 @@ class BIM_PT_object_material(Panel): @classmethod def poll(cls, context): - if not tool.Blender.is_tab(context, "GEOMETRY"): - return False if not (obj := context.active_object): return False ifc_id = tool.Blender.get_ifc_definition_id(obj) @@ -228,31 +234,47 @@ def draw_set_ui(self): self.draw_read_only_set_ui() def draw_editable_set_ui(self): - bonsai.bim.helper.draw_attributes(self.props.material_set_attributes, self.layout) - bonsai.bim.helper.draw_attributes(self.props.material_set_usage_attributes, self.layout) + # Material Set Attributes Section + row = self.layout.row(align=True) + box = row.box() + bonsai.bim.helper.draw_attributes(self.props.material_set_attributes, box) + bonsai.bim.helper.draw_attributes(self.props.material_set_usage_attributes, box) + + # Custom Offset Section self.draw_custom_offset() + + # Dynamic header based on material set type + set_item_name = ObjectMaterialData.data["set_item_name"] + header_map = { + "layer": "Material Layers", + "profile": "Material Profiles", + "constituent": "Material Constituents", + "list_item": "Material List Items", + } + header_text = header_map.get(set_item_name, "Material Items") + self.layout.label(text=header_text) + + total_items = len(ObjectMaterialData.data["set_items"]) + + row = self.layout.row(align=True) + box = row.box() + + # Add Material Section (at the top of this box) if ObjectMaterialData.data["set_item_name"] == "profile" and not self.mprops.profiles: - row = self.layout.row(align=True) - row.label(text="No Profiles Available") - row.operator("bim.add_profile_def", icon="ADD", text="") + box_row = box.row(align=True) + box_row.label(text="No Profiles Available") + box_row.operator("bim.add_profile_def", icon="ADD", text="") else: - layout = self.layout - layout.separator() - layout.separator() - row = self.layout.row(align=True) + box_row = box.row(align=True) if ObjectMaterialData.data["set_item_name"] == "profile": - prop_with_search(row, self.mprops, "profiles", icon="ITALIC", text="") - prop_with_search(row, self.props, "material", icon="MATERIAL", text="") - op = row.operator(f"bim.add_{ObjectMaterialData.data['set_item_name']}", icon="ADD", text="") + prop_with_search(box_row, self.mprops, "profiles", icon="ITALIC", text="") + prop_with_search(box_row, self.props, "material", icon="MATERIAL", text="") + op = box_row.operator(f"bim.add_{ObjectMaterialData.data['set_item_name']}", icon="ADD", text="") setattr(op, f"{ObjectMaterialData.data['set_item_name']}_set", ObjectMaterialData.data["set"]["id"]) - total_items = len(ObjectMaterialData.data["set_items"]) - - layout = self.layout - box = layout.box() active_object = bpy.context.active_object - self.layerset_bounds(box, active_object, location="Top_Exterior") + self.layerset_bounds(box, active_object, location="Top_Interior") if not ObjectMaterialData.data["set_items"]: row = box.row() @@ -269,7 +291,7 @@ def draw_editable_set_ui(self): else: self.draw_read_only_set_item_ui(box, set_item) - self.layerset_bounds(box, active_object, location="Bottom_Interior") + self.layerset_bounds(box, active_object, location="Bottom_Exterior") def draw_editable_set_item_profile_ui(self, box, set_item): # box = self.layout.box() @@ -335,29 +357,100 @@ def draw_read_only_set_item_ui(self, box: bpy.types.UILayout, set_item: dict[str setattr(op, f"{ObjectMaterialData.data['set_item_name']}_index", set_item["index"]) def draw_read_only_set_ui(self): + # Material Set Information Section + row = self.layout.row(align=True) + box = row.box() + if ObjectMaterialData.data["material_class"] != "IfcMaterialList": - row = self.layout.row(align=True) + box_row = box.row(align=True) set_name = ObjectMaterialData.data["set"]["name"] - row.label(text="Name") - row.label(text=set_name) + box_row.label(text="Name") + box_row.label(text=set_name) if value := ObjectMaterialData.data["set"]["description"]: - row = self.layout.row(align=True) - row.label(text="Description") - row.label(text=value) + box_row = box.row(align=True) + box_row.label(text="Description") + box_row.label(text=value) if ObjectMaterialData.data["material_class"] == "IfcMaterialProfileSetUsage": if value := ObjectMaterialData.data["set_usage"].get("cardinal_point"): - row = self.layout.row(align=True) - row.label(text="Cardinal Point") - row.label(text=value) + box_row = box.row(align=True) + box_row.label(text="Cardinal Point") + box_row.label(text=value) if ObjectMaterialData.data["total_thickness"]: + box_row = box.row(align=True) + box_row.label(text="Total Thickness*") + box_row.label(text=ObjectMaterialData.data["total_thickness"]) + + # Display OffsetFromReferenceLine for layer sets + if "Layer" in ObjectMaterialData.data["material_class"]: + obj = bpy.context.active_object + if obj: + element = tool.Ifc.get_entity(obj) + if element: + material = ifcopenshell.util.element.get_material(element) + if material and material.is_a("IfcMaterialLayerSetUsage"): + offset_value = material.OffsetFromReferenceLine + # Format the offset value + unit_system = bpy.context.scene.unit_settings.system + prefs = tool.Blender.get_addon_preferences() + precision = None + if unit_system == "IMPERIAL": + precision = prefs.doc.imperial_precision + from bonsai.bim.module.drawing.helper import format_distance + + formatted_offset = format_distance( + offset_value, precision=precision, suppress_zero_inches=True, in_unit_length=True + ) + box_row = box.row(align=True) + box_row.label(text="Offset From Reference Line") + box_row.label(text=formatted_offset) + + # BBIM_MaterialLayer Pset Section + if pset_data := ObjectMaterialData.data.get("bbim_material_layer_pset"): + self.layout.label(text="BBIM_MaterialLayer Pset") + row = self.layout.row(align=True) - row.label(text="Total Thickness*") - row.label(text=ObjectMaterialData.data["total_thickness"]) + box = row.box() + + # Custom Offset value - format using format_distance + unit_system = bpy.context.scene.unit_settings.system + prefs = tool.Blender.get_addon_preferences() + precision = None + if unit_system == "IMPERIAL": + precision = prefs.doc.imperial_precision + from bonsai.bim.module.drawing.helper import format_distance + + formatted_custom_offset = format_distance( + pset_data["custom_offset"], precision=precision, suppress_zero_inches=True, in_unit_length=True + ) + box_row = box.row(align=True) + box_row.label(text="Custom Offset") + box_row.label(text=formatted_custom_offset) + + # Reference (if exists) + if pset_data["custom_reference"]: + box_row = box.row(align=True) + box_row.label(text=pset_data["reference_label"]) + box_row.label(text=pset_data["custom_reference"]) + + # Dynamic header based on material set type + set_item_name = ObjectMaterialData.data.get("set_item_name") + if set_item_name: + header_map = { + "layer": "Material Layers", + "profile": "Material Profiles", + "constituent": "Material Constituents", + "list_item": "Material List Items", + } + header_text = header_map.get(set_item_name, "Material Items") + else: + header_text = "Materials" - box = self.layout.box() + self.layout.label(text=header_text) + row = self.layout.row(align=True) + box = row.box() active_object = bpy.context.active_object self.layerset_bounds(box, active_object, location="Top_Interior") @@ -403,20 +496,27 @@ def draw_custom_offset(self): set_usage = ObjectMaterialData.data.get("set_usage", {}) layer_set_direction = set_usage.get("layer_set_direction") if layer_set_direction: - box = self.layout.box() - row = box.row(align=True) - row.prop(self.props, "use_custom_offset", text="Use Custom Offset") - row = box.row(align=True) + row = self.layout.row(align=True) + row.label(text="BBIM_MaterialLayer Pset") + + # Add indentation with a row that has a separator + row = self.layout.row(align=True) + # row.separator(factor=2.0) # Adjust factor for more/less indent + + box = row.box() + box_row = box.row(align=True) + box_row.prop(self.props, "use_custom_offset", text="Use Custom Offset") + box_row = box.row(align=True) if layer_set_direction == "AXIS2": - row.prop(self.props, "custom_wall_reference", text="Reference") - row.enabled = self.props.use_custom_offset + box_row.prop(self.props, "custom_wall_reference", text="Reference") + box_row.enabled = self.props.use_custom_offset if layer_set_direction == "AXIS3": - row.prop(self.props, "custom_slab_reference", text="Reference") - row.enabled = self.props.use_custom_offset + box_row.prop(self.props, "custom_slab_reference", text="Reference") + box_row.enabled = self.props.use_custom_offset - row = box.row(align=True) - row.prop(self.props, "custom_offset", text="Custom Offset") - row.enabled = self.props.use_custom_offset + box_row = box.row(align=True) + box_row.prop(self.props, "custom_offset", text="Custom Offset") + box_row.enabled = self.props.use_custom_offset class BIM_UL_materials(UIList): diff --git a/src/bonsai/bonsai/bim/module/misc/__init__.py b/src/bonsai/bonsai/bim/module/misc/__init__.py index 27ab626183a..c7e2e690d83 100644 --- a/src/bonsai/bonsai/bim/module/misc/__init__.py +++ b/src/bonsai/bonsai/bim/module/misc/__init__.py @@ -17,17 +17,28 @@ # along with Bonsai. If not, see . import bpy -from . import ui, prop, operator + +from . import operator, prop, ui classes = ( + operator.ImportQuickFavorites, + operator.RemoveQuickFavoritesItem, + operator.MoveQuickFavoritesItem, + operator.AddQuickFavoritesItem, + operator.ConfirmQuickFavoriteOperator, operator.DrawSystemArrows, operator.GetConnectedSystemElements, + operator.IfcSverchokUseBonsaiFile, operator.ResizeToStorey, operator.SetOverrideColour, operator.SnapSpacesTogether, operator.SplitAlongEdge, + prop.QuickFavoriteEnumItem, + prop.QuickFavoriteProperty, + prop.QuickFavoritesItem, prop.BIMMiscProperties, ui.BIM_PT_misc_utilities, + ui.BIM_PT_quick_favorites_manager, ) diff --git a/src/bonsai/bonsai/bim/module/misc/data.py b/src/bonsai/bonsai/bim/module/misc/data.py new file mode 100644 index 00000000000..eb697d0bff0 --- /dev/null +++ b/src/bonsai/bonsai/bim/module/misc/data.py @@ -0,0 +1,48 @@ +# Bonsai - OpenBIM Blender Add-on +# Copyright (C) 2021 Dion Moult +# +# This file is part of Bonsai. +# +# Bonsai is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Bonsai is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Bonsai. If not, see . + +from typing import Any + +import bpy + + +def refresh() -> None: + QuickFavoritesData.is_loaded = False + + +class QuickFavoritesData: + data: dict[str, Any] = {} + is_loaded = False + + @classmethod + def load(cls) -> None: + cls.data = { + "operators": cls.operators(), + } + cls.is_loaded = True + + @classmethod + def operators(cls) -> list[str]: + items: list[str] = [] + for module_name in dir(bpy.ops): + module = getattr(bpy.ops, module_name) + for op_name in dir(module): + op = getattr(module, op_name) + bl_label = op.get_rna_type().name + items.append(f"{module_name}.{op_name} - {bl_label}") + return items diff --git a/src/bonsai/bonsai/bim/module/misc/operator.py b/src/bonsai/bonsai/bim/module/misc/operator.py index 15fca6b5477..203bc9dd6c0 100644 --- a/src/bonsai/bonsai/bim/module/misc/operator.py +++ b/src/bonsai/bonsai/bim/module/misc/operator.py @@ -16,18 +16,22 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . +from typing import TYPE_CHECKING, Literal, assert_never, get_args + import bpy -import numpy as np -import ifcopenshell import ifcopenshell.util.geolocation import ifcopenshell.util.placement import ifcopenshell.util.unit -import bonsai.tool as tool -import bonsai.core.misc as core +import numpy as np +from mathutils import Matrix + import bonsai.core.geometry as core_geometry +import bonsai.core.misc as core import bonsai.core.root -from mathutils import Vector, Matrix, Euler -from typing import TYPE_CHECKING, Literal, get_args, assert_never +import bonsai.tool as tool + +if TYPE_CHECKING: + from bpy.stub_internal import rna_enums class SetOverrideColour(bpy.types.Operator): @@ -40,10 +44,11 @@ def poll(cls, context): return context.selected_objects def execute(self, context): + props = tool.Misc.get_misc_props() for obj in context.selected_objects: - obj.color = context.scene.BIMMiscProperties.override_colour - area = next(area for area in context.screen.areas if area.type == "VIEW_3D") - area.spaces[0].shading.color_type = "OBJECT" + obj.color = props.override_colour + assert (space := tool.Blender.get_view3d_space()) + space.shading.color_type = "OBJECT" return {"FINISHED"} @@ -131,7 +136,7 @@ class SplitAlongEdge(bpy.types.Operator, tool.Ifc.Operator): "Will unassign element from a type if type has a representation." ) bl_options = {"REGISTER", "UNDO"} - mode: bpy.props.EnumProperty( # pyright: ignore[reportRedeclaration] + mode: bpy.props.EnumProperty( default="BOOLEAN", items=tuple((i, i, "") for i in get_args(SplitAlongEdgeMode)), ) @@ -348,3 +353,167 @@ def get_absolute_matrix(self, matrix): ) ) return matrix + + +class ConfirmQuickFavoriteOperator(bpy.types.Operator): + bl_idname = "bim.confirm_quick_favorite_operator" + bl_label = "Confirm Operator" + bl_options = {"REGISTER", "UNDO"} + index: bpy.props.IntProperty() + + if TYPE_CHECKING: + index: int + + def execute(self, context) -> set["rna_enums.OperatorReturnItems"]: + props = tool.Misc.get_misc_props() + fav = props.quick_favorites[self.index] + rna = fav.get_searched_operator() + + if rna is None: + self.report({"INFO"}, "No operator entered for search.") + return {"CANCELLED"} + + fav.operator_id = tool.Blender.operator_idname_to_py(rna.identifier) + fav.label = rna.name + fav.properties.clear() + has_skipped = False + for p in rna.properties: + # skip silently, e.g. `rna_type` is a PointerProperty + if isinstance(p, bpy.types.PointerProperty): + continue + if isinstance(p, (bpy.types.FloatProperty, bpy.types.BoolProperty, bpy.types.IntProperty)) and p.is_array: + print(f"Array property '{p.identifier}' is not supported, skipping.") + has_skipped = True + continue + item = fav.properties.add() + item.name = p.identifier + item.display_name = p.name + if isinstance(p, bpy.types.FloatProperty): + item.value_prop = "float_value" + item.float_value = p.default + elif isinstance(p, bpy.types.BoolProperty): + item.value_prop = "bool_value" + item.bool_value = p.default + elif isinstance(p, bpy.types.IntProperty): + item.value_prop = "int_value" + item.int_value = p.default + elif isinstance(p, bpy.types.EnumProperty): + item.value_prop = "enum_value" + item.set_enum_items([(e.identifier, e.name, e.description) for e in p.enum_items]) + item.enum_value = p.default + elif isinstance(p, bpy.types.StringProperty): + item.value_prop = "string_value" + item.string_value = p.default + else: + print(f"Unhandled property type {type(p).__name__} for '{p.identifier}', skipping.") + has_skipped = True + if has_skipped: + self.report({"WARNING"}, "Some properties were skipped, see the system console for details.") + return {"FINISHED"} + + +class ImportQuickFavorites(bpy.types.Operator): + bl_idname = "bim.import_quick_favorites" + bl_label = "Import Quick Favorites" + bl_description = "Import operators from Blender's Quick Favorites menu, including their configured properties" + bl_options = {"REGISTER", "UNDO"} + + def execute(self, context) -> set["rna_enums.OperatorReturnItems"]: + props = tool.Misc.get_misc_props() + props.quick_favorites.clear() + + has_missing_props = False + for i, qf in enumerate(tool.Misc.QuickFavorites.get_quick_favorites()): + fav = props.quick_favorites.add() + fav.label = qf.ui_name + fav.search = qf.op_idname_py + bpy.ops.bim.confirm_quick_favorite_operator(index=i) + fav.label = qf.ui_name or fav.label + + for prop in fav.properties: + prop.is_active = prop.name in qf.props + + for key, value in qf.props.items(): + if key not in fav.properties: + print(f"Property '{key}' not found in operator '{qf.op_idname_py}'.") + has_missing_props = True + continue + item = fav.properties[key] + item.set_value(value) + + if has_missing_props: + self.report( + {"WARNING"}, "Some properties were not found during import, see the system console for details." + ) + return {"FINISHED"} + + +class MoveQuickFavoritesItem(bpy.types.Operator): + bl_idname = "bim.move_quick_favorites_item" + bl_label = "Move Quick Favorites Item" + bl_options = {"REGISTER", "UNDO"} + index: bpy.props.IntProperty() + direction: bpy.props.EnumProperty(items=[("UP", "Up", ""), ("DOWN", "Down", "")]) + + if TYPE_CHECKING: + index: int + direction: Literal["UP", "DOWN"] + + def execute(self, context) -> set["rna_enums.OperatorReturnItems"]: + props = tool.Misc.get_misc_props() + total = len(props.quick_favorites) + new_index = self.index - 1 if self.direction == "UP" else self.index + 1 + if 0 <= new_index < total: + props.quick_favorites.move(self.index, new_index) + return {"FINISHED"} + + +class RemoveQuickFavoritesItem(bpy.types.Operator): + bl_idname = "bim.remove_quick_favorites_item" + bl_label = "Remove Quick Favorites Item" + bl_options = {"REGISTER", "UNDO"} + index: bpy.props.IntProperty() + + if TYPE_CHECKING: + index: int + + def execute(self, context) -> set["rna_enums.OperatorReturnItems"]: + props = tool.Misc.get_misc_props() + props.quick_favorites.remove(self.index) + return {"FINISHED"} + + +class AddQuickFavoritesItem(bpy.types.Operator): + bl_idname = "bim.add_quick_favorites_item" + bl_label = "Add Quick Favorites Item" + bl_options = {"REGISTER", "UNDO"} + + def execute(self, context) -> set["rna_enums.OperatorReturnItems"]: + props = tool.Misc.get_misc_props() + fav = props.quick_favorites.add() + fav.search = "bim.select_query_elements" + index = len(props.quick_favorites) - 1 + bpy.ops.bim.confirm_quick_favorite_operator(index=index) + fav.properties["query"].string_value = "IfcWall" + return {"FINISHED"} + + +class IfcSverchokUseBonsaiFile(bpy.types.Operator, tool.Ifc.Operator): + bl_idname = "bim.ifcsverchok_use_bonsai_file" + bl_label = "Use Bonsai IFC File" + bl_description = "Apply current IfcSverchok tree to the active Bonsai file." + bl_options = {"REGISTER", "UNDO"} + + def _execute(self, context): + import sverchok.node_tree + + ifc_file = tool.Ifc.get() + if ifc_file is None: + self.report({"ERROR"}, "No active IFC file.") + return {"CANCELLED"} + + space_data = context.space_data + assert isinstance(space_data, bpy.types.SpaceNodeEditor) + node_tree = space_data.node_tree + assert isinstance(node_tree, sverchok.node_tree.SverchCustomTree) + tool.Model.run_ifcsverchok_graph_on_bonsai_file(node_tree) diff --git a/src/bonsai/bonsai/bim/module/misc/prop.py b/src/bonsai/bonsai/bim/module/misc/prop.py index 3201cbd94dd..74a82f06cd7 100644 --- a/src/bonsai/bonsai/bim/module/misc/prop.py +++ b/src/bonsai/bonsai/bim/module/misc/prop.py @@ -16,19 +16,126 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . +from typing import TYPE_CHECKING, Any, Literal, cast, get_args + import bpy -from bonsai.bim.prop import StrProperty, Attribute -from bpy.types import PropertyGroup from bpy.props import ( - PointerProperty, - StringProperty, - EnumProperty, BoolProperty, - IntProperty, + CollectionProperty, + EnumProperty, FloatProperty, FloatVectorProperty, - CollectionProperty, + IntProperty, + StringProperty, ) +from bpy.types import PropertyGroup + +from bonsai.bim.module.misc.data import QuickFavoritesData + +QuickFavoriteValueType = Literal["float_value", "bool_value", "int_value", "string_value", "enum_value"] + + +class QuickFavoriteEnumItem(PropertyGroup): + name: StringProperty(name="Name", default="") + display_name: StringProperty(name="Display Name", default="") + description: StringProperty(name="Description", default="") + + if TYPE_CHECKING: + name: str + display_name: str + description: str + + +def get_enum_items(self: "QuickFavoriteProperty", context: bpy.types.Context | None) -> list[tuple[str, str, str]]: + return [(item.name, item.display_name, item.description) for item in self.enum_items] + + +class QuickFavoriteProperty(PropertyGroup): + name: StringProperty(name="Name", default="") + display_name: StringProperty(name="Display Name", default="") + value_prop: EnumProperty( + name="Value Prop", + items=tuple((v, v, "") for v in get_args(QuickFavoriteValueType)), + ) + string_value: StringProperty(name="String Value", default="") + float_value: FloatProperty(name="Float Value", default=0.0) + int_value: IntProperty(name="Int Value", default=0) + bool_value: BoolProperty(name="Bool Value", default=False) + enum_value: EnumProperty(name="Enum Value", items=get_enum_items) + enum_items: CollectionProperty(type=QuickFavoriteEnumItem) + is_active: BoolProperty( + name="Is Active", + description="Only active properties will be added to the operator when invoked from Quick Favorites", + default=False, + ) + + def set_value(self, value: Any) -> None: + setattr(self, self.value_prop, value) + + def set_enum_items(self, items: list[tuple[str, str, str]]) -> None: + self.enum_items.clear() + for identifier, name, description in items: + item = self.enum_items.add() + item.name = identifier + item.display_name = name + item.description = description + + if TYPE_CHECKING: + name: str + display_name: str + value_prop: QuickFavoriteValueType + string_value: str + float_value: float + int_value: int + bool_value: bool + enum_value: str + enum_items: bpy.types.bpy_prop_collection_idprop[QuickFavoriteEnumItem] + is_active: bool + + +def get_operator_suggestions(self: "QuickFavoritesItem", context: bpy.types.Context, edit_text: str) -> list[str]: + if not QuickFavoritesData.is_loaded: + QuickFavoritesData.load() + return QuickFavoritesData.data["operators"] + + +class QuickFavoritesItem(PropertyGroup): + is_expanded: BoolProperty(name="Is Expanded", default=False) + search: StringProperty( + name="Search", + default="", + search=get_operator_suggestions, + # Resetting `search_options`, allowing users only to use suggestions. + search_options=set(), + ) + properties: CollectionProperty(type=QuickFavoriteProperty) + operator_id: StringProperty( + name="Operator ID", + default="", + ) + label: StringProperty( + name="Label", + description="Label that will be used in Quick Favorites for this operator", + default="", + ) + + def get_searched_operator(self) -> bpy.types.Struct | None: + if not self.search: + return None + search_label = self.search + name = search_label.split(" - ", 1)[0] + module, func = name.split(".", 1) + op = getattr(getattr(bpy.ops, module), func) + rna = cast(bpy.types.Struct, op.get_rna_type()) + return rna + + if TYPE_CHECKING: + is_expanded: bool + search: str + """Internal property set when confirming results of the search field""" + properties: bpy.types.bpy_prop_collection_idprop[QuickFavoriteProperty] + operator_id: str + label: str class BIMMiscProperties(PropertyGroup): @@ -40,3 +147,9 @@ class BIMMiscProperties(PropertyGroup): override_colour: FloatVectorProperty( name="Override Colour", subtype="COLOR", default=(1, 0, 0, 1), min=0.0, max=1.0, size=4 ) + quick_favorites: CollectionProperty(type=QuickFavoritesItem) + + if TYPE_CHECKING: + total_storeys: int + override_colour: tuple[float, float, float, float] + quick_favorites: bpy.types.bpy_prop_collection_idprop[QuickFavoritesItem] diff --git a/src/bonsai/bonsai/bim/module/misc/ui.py b/src/bonsai/bonsai/bim/module/misc/ui.py index c009b720e47..3e4a952bc3a 100644 --- a/src/bonsai/bonsai/bim/module/misc/ui.py +++ b/src/bonsai/bonsai/bim/module/misc/ui.py @@ -18,6 +18,8 @@ import bpy +import bonsai.tool as tool + class BIM_PT_misc_utilities(bpy.types.Panel): bl_idname = "BIM_PT_misc_utilities" @@ -30,7 +32,8 @@ class BIM_PT_misc_utilities(bpy.types.Panel): def draw(self, context): layout = self.layout - props = context.scene.BIMMiscProperties + assert layout + props = tool.Misc.get_misc_props() row = layout.split(factor=0.2, align=True) row.prop(props, "override_colour", text="") row.operator("bim.set_override_colour") @@ -56,3 +59,72 @@ def draw(self, context): row.operator("bim.disable_editing_sketch_extrusion_profile", text="", icon="CANCEL") row = layout.row() row.operator("bim.import_plot", text="Import Plot Coordinates", icon="FILE_FOLDER") + + +class BIM_PT_quick_favorites_manager(bpy.types.Panel): + bl_idname = "BIM_PT_quick_favorites_manager" + bl_label = "Quick Favorites Manager" + bl_space_type = "PROPERTIES" + bl_region_type = "WINDOW" + bl_context = "output" + bl_options = {"DEFAULT_CLOSED"} + bl_parent_id = "BIM_PT_tab_sandbox" + + def draw(self, context): + layout = self.layout + assert layout + props = tool.Misc.get_misc_props() + + row = layout.row(align=True) + row.label(text="Quick Favorites:") + row.operator("bim.add_quick_favorites_item", text="", icon="ADD") + row.operator("bim.import_quick_favorites", text="", icon="BLENDER") + op = row.operator("bim.show_description", text="", icon="INFO") + op.attr_name = "Quick Favorites Manager" + op.description = ( + "Blender does not support editing Quick Favorites natively. " + "This manager allows you to load existing Quick Favorites operators, " + "configure their properties and labels, and re-add them to the menu with customized settings." + ) + + for fav in props.quick_favorites: + if fav.operator_id: + row = layout.row() + op = row.operator(fav.operator_id, text=fav.label) + for item in fav.properties: + if item.is_active: + setattr(op, item.name, getattr(item, item.value_prop)) + + layout.separator() + + for i, fav in enumerate(props.quick_favorites): + box = layout.box() + row = box.row(align=True) + row.prop(fav, "is_expanded", text="", icon="TRIA_DOWN" if fav.is_expanded else "TRIA_RIGHT", emboss=False) + row.prop(fav, "label", text="") + if i > 0: + up = row.operator("bim.move_quick_favorites_item", text="", icon="TRIA_UP") + up.index = i + up.direction = "UP" + if i < len(props.quick_favorites) - 1: + down = row.operator("bim.move_quick_favorites_item", text="", icon="TRIA_DOWN") + down.index = i + down.direction = "DOWN" + row.operator("bim.remove_quick_favorites_item", text="", icon="X").index = i + if not fav.is_expanded: + continue + row = box.row(align=True) + row.prop(fav, "search", text="") + row.operator("bim.confirm_quick_favorite_operator", text="", icon="VIEWZOOM").index = i + if not fav.operator_id: + continue + layout.separator() + if fav.properties: + box.label(text="Properties:") + prop_box = box.box() + for item in fav.properties: + row = prop_box.row(align=True) + row.prop(item, item.value_prop, text=item.display_name) + row.prop(item, "is_active", text="", icon="RADIOBUT_ON" if item.is_active else "RADIOBUT_OFF") + else: + box.label(text="No Properties.") diff --git a/src/bonsai/bonsai/bim/module/model/__init__.py b/src/bonsai/bonsai/bim/module/model/__init__.py index 47ef5a03433..9fbd6310034 100644 --- a/src/bonsai/bonsai/bim/module/model/__init__.py +++ b/src/bonsai/bonsai/bim/module/model/__init__.py @@ -16,33 +16,33 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . +from typing import NamedTuple + import bpy + from . import ( - handler, - prop, - ui, - grid, array, + covering, + door, + external, + grid, + handler, + mep, + opening, product, - wall, + profile, + prop, + railing, roof, slab, space, - covering, stair, + sverchok_modifier, + ui, + wall, window, - opening, - mep, workspace, - profile, - sverchok_modifier, - door, - railing, - roof, - mep, - external, ) -from typing import NamedTuple classes = ( array.AddArray, @@ -50,9 +50,10 @@ array.EditArray, array.EnableEditingArray, array.ApplyArray, + array.RegenerateArray, array.RemoveArray, - array.SelectArrayParent, array.SelectAllArrayObjects, + array.SelectArrayParent, array.Input3DCursorXArray, array.Input3DCursorYArray, array.Input3DCursorZArray, @@ -140,7 +141,6 @@ prop.BIMRailingProperties, prop.BIMRoofProperties, prop.BIMPolylineProperties, - prop.BIMProductPreviewProperties, prop.BIMExternalParametricGeometryProperties, ui.BIM_PT_array, ui.BIM_PT_stair, @@ -263,7 +263,6 @@ def register(): bpy.types.Scene.BIMModelProperties = bpy.props.PointerProperty(type=prop.BIMModelProperties) bpy.types.Scene.BIMPolylineProperties = bpy.props.PointerProperty(type=prop.BIMPolylineProperties) - bpy.types.Scene.BIMProductPreviewProperties = bpy.props.PointerProperty(type=prop.BIMProductPreviewProperties) bpy.types.Object.BIMArrayProperties = bpy.props.PointerProperty(type=prop.BIMArrayProperties) bpy.types.Object.BIMStairProperties = bpy.props.PointerProperty(type=prop.BIMStairProperties) bpy.types.Object.BIMSverchokProperties = bpy.props.PointerProperty(type=prop.BIMSverchokProperties) @@ -288,7 +287,6 @@ def unregister(): del bpy.types.Scene.BIMModelProperties del bpy.types.Scene.BIMPolylineProperties - del bpy.types.Scene.BIMProductPreviewProperties del bpy.types.Object.BIMArrayProperties del bpy.types.Object.BIMStairProperties del bpy.types.Object.BIMSverchokProperties diff --git a/src/bonsai/bonsai/bim/module/model/array.py b/src/bonsai/bonsai/bim/module/model/array.py index ec1bce20965..dd54bf0ab35 100644 --- a/src/bonsai/bonsai/bim/module/model/array.py +++ b/src/bonsai/bonsai/bim/module/model/array.py @@ -16,15 +16,15 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . -import bpy import json -import ifcopenshell -import ifcopenshell.api + +import bpy import ifcopenshell.api.pset import ifcopenshell.util.element import ifcopenshell.util.unit +from mathutils import Matrix + import bonsai.tool as tool -from mathutils import Vector, Matrix class AddArray(bpy.types.Operator, tool.Ifc.Operator): @@ -59,7 +59,6 @@ def _execute(self, context): "y": 0.0, "z": 0.0, "use_local_space": True, - "sync_children": False, "method": "OFFSET", } @@ -78,28 +77,27 @@ def _execute(self, context): pset=pset, properties={"Parent": element.GlobalId, "Data": ifc_file.create_entity("IfcText", json.dumps(data))}, ) - return {"FINISHED"} -class DisableEditingArray(bpy.types.Operator, tool.Ifc.Operator): +class DisableEditingArray(bpy.types.Operator): bl_idname = "bim.disable_editing_array" bl_label = "Disable Editing Array" bl_options = {"REGISTER", "UNDO"} - def _execute(self, context): + def execute(self, context): obj = context.active_object assert obj tool.Model.get_array_props(obj).is_editing = -1 return {"FINISHED"} -class EnableEditingArray(bpy.types.Operator, tool.Ifc.Operator): +class EnableEditingArray(bpy.types.Operator): bl_idname = "bim.enable_editing_array" bl_label = "Enable Editing Array" bl_options = {"REGISTER", "UNDO"} item: bpy.props.IntProperty() - def _execute(self, context): + def execute(self, context): obj = context.active_object assert obj element = tool.Ifc.get_entity(obj) @@ -120,11 +118,9 @@ def _execute(self, context): props.y = data["y"] * si_conversion props.z = data["z"] * si_conversion props.use_local_space = data.get("use_local_space", False) - props.sync_children = data.get("sync_children", False) props.method = data.get("method", "OFFSET") props.is_editing = self.item - return {"FINISHED"} @@ -149,31 +145,25 @@ def _execute(self, context): "y": props.y / si_conversion, "z": props.z / si_conversion, "use_local_space": props.use_local_space, - "sync_children": props.sync_children, "method": props.method, } props.is_editing = -1 try: - parent = tool.Ifc.get_object(tool.Ifc.get().by_guid(pset["Parent"])) + parent_element = tool.Ifc.get().by_guid(pset["Parent"]) + parent = tool.Ifc.get_object(parent_element) except: return {"FINISHED"} + tool.Blender.Modifier.Array.remove_constraints(parent_element) tool.Model.regenerate_array(parent, data) - - pset = tool.Ifc.get().by_id(pset["id"]) - data = tool.Ifc.get().createIfcText(json.dumps(data)) - ifcopenshell.api.pset.edit_pset(tool.Ifc.get(), pset=pset, properties={"Data": data}) - tool.Blender.Modifier.Array.set_children_lock_state(element, self.item, True) tool.Blender.Modifier.Array.constrain_children_to_parent(element) # clears the relating_array_object so it doesn't show again next time props.relating_array_object = None - return {"FINISHED"} - class ApplyArray(bpy.types.Operator, tool.Ifc.Operator): bl_idname = "bim.apply_array" @@ -190,6 +180,33 @@ def _execute(self, context): return {"FINISHED"} +class RegenerateArray(bpy.types.Operator, tool.Ifc.Operator): + bl_idname = "bim.regenerate_array" + bl_label = "Regenerate Array" + bl_options = {"REGISTER", "UNDO"} + + def _execute(self, context): + obj = context.active_object + element = tool.Ifc.get_entity(obj) + pset = ifcopenshell.util.element.get_pset(element, "BBIM_Array") + try: + parent_element = tool.Ifc.get().by_guid(pset["Parent"]) + parent = tool.Ifc.get_object(parent_element) + except: + return {"FINISHED"} + pset = ifcopenshell.util.element.get_pset(parent_element, "BBIM_Array") + arrays = json.loads(pset["Data"]) + pset = tool.Ifc.get().by_id(pset["id"]) + for array in arrays: + for child in set(array["children"]): + if child_obj := tool.Ifc.get_object(tool.Ifc.get().by_guid(child)): + tool.Geometry.delete_ifc_object(child_obj) + array["children"].clear() + print("cleared array", arrays) + tool.Model.regenerate_array(obj, arrays) + tool.Blender.Modifier.Array.constrain_children_to_parent(element) + + class RemoveArray(bpy.types.Operator, tool.Ifc.Operator): bl_idname = "bim.remove_array" bl_label = "Remove Array" @@ -214,7 +231,8 @@ def _execute(self, context): props.is_editing = -1 try: - parent = tool.Ifc.get_object(tool.Ifc.get().by_guid(pset["Parent"])) + parent_element = tool.Ifc.get().by_guid(pset["Parent"]) + parent = tool.Ifc.get_object(parent_element) except: return {"FINISHED"} @@ -224,9 +242,10 @@ def _execute(self, context): if not self.keep_objs: data[self.item]["count"] = 1 + tool.Blender.Modifier.Array.remove_constraints(parent_element) tool.Model.regenerate_array(parent, data, array_layers_to_apply=[self.item] if self.keep_objs else []) - pset = tool.Ifc.get().by_id(pset["id"]) + pset = tool.Pset.get_element_pset(element, "BBIM_Array") if len(data) == 1: ifcopenshell.api.pset.remove_pset(tool.Ifc.get(), product=element, pset=pset) else: @@ -235,8 +254,6 @@ def _execute(self, context): ifcopenshell.api.pset.edit_pset(tool.Ifc.get(), pset=pset, properties={"Data": data}) tool.Blender.Modifier.Array.constrain_children_to_parent(element) - return {"FINISHED"} - class SelectArrayParent(bpy.types.Operator): bl_idname = "bim.select_array_parent" diff --git a/src/bonsai/bonsai/bim/module/model/covering.py b/src/bonsai/bonsai/bim/module/model/covering.py index 72eba944d15..dd3889a7cbe 100644 --- a/src/bonsai/bonsai/bim/module/model/covering.py +++ b/src/bonsai/bonsai/bim/module/model/covering.py @@ -18,10 +18,9 @@ import bpy -import ifcopenshell -import ifcopenshell.util.element -import bonsai.tool as tool + import bonsai.core.covering as core +import bonsai.tool as tool class AddInstanceFlooringCoveringFromCursor(bpy.types.Operator, tool.Ifc.Operator): diff --git a/src/bonsai/bonsai/bim/module/model/data.py b/src/bonsai/bonsai/bim/module/model/data.py index 2c96e429259..10553f1bed5 100644 --- a/src/bonsai/bonsai/bim/module/model/data.py +++ b/src/bonsai/bonsai/bim/module/model/data.py @@ -16,17 +16,19 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . -import bpy -import math import json +import math +from math import degrees +from typing import Any, Optional, Union + +import bpy import ifcopenshell import ifcopenshell.util.element import ifcopenshell.util.schema -from ifcopenshell.util.doc import get_entity_doc, get_predefined_type_doc -import bonsai.tool as tool -from math import degrees +from ifcopenshell.util.doc import get_entity_doc from natsort import natsorted -from typing import Union, Optional, Any + +import bonsai.tool as tool def refresh(): @@ -52,6 +54,11 @@ def load(cls, ifc_element_type: Optional[str] = None): cls.is_loaded = True cls.props = tool.Model.get_model_props() cls.data["default_container"] = cls.default_container() + if tool.Ifc.get().schema == "IFC2X3": + if ifc_element_type == "IfcDoorType": + ifc_element_type = "IfcDoorStyle" + elif ifc_element_type == "IfcWindowType": + ifc_element_type = "IfcWindowStyle" cls.data["ifc_element_type"] = ifc_element_type cls.data["ifc_classes"] = cls.ifc_classes() cls.data["ifc_class_current"] = cls.ifc_class_current() @@ -417,12 +424,12 @@ def pset_data(cls): return tool.Model.get_modeling_bbim_pset_data(bpy.context.active_object, "BBIM_Sverchok") @classmethod - def has_sverchok(cls): + def has_sverchok(cls) -> bool: try: - import sverchok + import sverchok # noqa: F401 return True - except: + except ModuleNotFoundError: return False diff --git a/src/bonsai/bonsai/bim/module/model/decorator.py b/src/bonsai/bonsai/bim/module/model/decorator.py index aad4c647ee2..49090e2c9f9 100644 --- a/src/bonsai/bonsai/bim/module/model/decorator.py +++ b/src/bonsai/bonsai/bim/module/model/decorator.py @@ -17,26 +17,31 @@ # along with Bonsai. If not, see . from __future__ import annotations -import bpy + +import math +from math import cos, pi, radians, sin, tan +from typing import Any, Literal + import blf +import bmesh import bpy import gpu -import bmesh import ifcopenshell -import bonsai.tool as tool -import math +import ifcopenshell.geom +import ifcopenshell.util.element +import ifcopenshell.util.representation +import ifcopenshell.util.unit import mathutils -from math import sin, cos, radians from bpy.types import SpaceView3D from bpy_extras import view3d_utils -from mathutils import Vector, Matrix +from bpy_extras.view3d_utils import location_3d_to_region_2d from gpu_extras.batch import batch_for_shader from gpu_extras.presets import draw_circle_2d -from typing import Union +from mathutils import Matrix, Quaternion, Vector + +import bonsai.core.geometry +import bonsai.tool as tool from bonsai.bim.module.drawing.helper import format_distance -from itertools import chain -from typing import Union, Any -from bpy_extras.view3d_utils import location_3d_to_region_2d def transparent_color(color, alpha=0.1): @@ -465,13 +470,14 @@ def draw_input_ui(self, context: bpy.types.Context) -> None: self.addon_prefs = tool.Blender.get_addon_preferences() self.font_id = 0 - font_size = tool.Blender.scale_font_size(12) + font_size = tool.Blender.scale_font_size() + offset = tool.Blender.scale_font_size() * 1.5 + line_height = tool.Blender.scale_font_size() * 1.25 blf.size(self.font_id, font_size) blf.enable(self.font_id, blf.SHADOW) blf.shadow(self.font_id, 6, 0, 0, 0, 1) color = self.addon_prefs.decorations_colour color_highlight = self.addon_prefs.decorator_color_special - offset = 20 new_line = 0 for i, (key, field_name) in enumerate(texts.items()): formatted_value = None @@ -479,7 +485,7 @@ def draw_input_ui(self, context: bpy.types.Context) -> None: # Controls which options are displayed in the UI if key not in self.input_ui.input_options: continue - new_line += 20 + new_line += line_height if self.tool_state and key != self.tool_state.input_type: formatted_value = self.input_ui.get_formatted_value(key) else: @@ -514,13 +520,16 @@ def draw_measurements_text(self, context): self.addon_prefs = tool.Blender.get_addon_preferences() self.font_id = 1 self.shader = gpu.shader.from_builtin("UNIFORM_COLOR") - font_size = tool.Blender.scale_font_size(12) + font_size = tool.Blender.scale_font_size() blf.size(self.font_id, font_size) blf.enable(self.font_id, blf.SHADOW) blf.shadow(self.font_id, 6, 0, 0, 0, 1) color = self.addon_prefs.decorations_colour blf.color(self.font_id, *color) + + screen_coords = {} + for i in range(len(self.polyline_points)): if i < 1 and self.measure_type == "POLY_AREA": continue @@ -528,40 +537,32 @@ def draw_measurements_text(self, context): continue dim_text_pos = (Vector(self.polyline_points[i].position) + Vector(self.polyline_points[i - 1].position)) / 2 dim_text_coords = view3d_utils.location_3d_to_region_2d(region, rv3d, dim_text_pos) - - formatted_value = self.polyline_points[i].dim - - blf.position(self.font_id, dim_text_coords[0], dim_text_coords[1], 0) - text = "d: " + formatted_value - text_length = blf.dimensions(self.font_id, text) - self.draw_text_background(context, dim_text_coords, text_length) - blf.draw(self.font_id, text) + if dim_text_coords: + formatted_value = self.polyline_points[i].dim + text = "d: " + formatted_value + screen_coords[f"distance_{i}"] = (Vector(dim_text_coords), text) if i == 1: continue angle_text_pos = Vector(self.polyline_points[i - 1].position) angle_text_coords = view3d_utils.location_3d_to_region_2d(region, rv3d, angle_text_pos) - blf.position(self.font_id, angle_text_coords[0], angle_text_coords[1], 0) - text = "a: " + self.polyline_points[i].angle - text_length = blf.dimensions(self.font_id, text) - self.draw_text_background(context, angle_text_coords, text_length) - blf.draw(self.font_id, text) + if angle_text_coords: + text = "a: " + self.polyline_points[i].angle + screen_coords[f"angle_{i}"] = (Vector(angle_text_coords), text) if self.measure_type == "SINGLE": axis_line, axis_line_center = self.calculate_measurement_x_y_and_z(context) for i, dim_text_pos in enumerate(axis_line_center): dim_text_coords = view3d_utils.location_3d_to_region_2d(region, rv3d, dim_text_pos) - pos = blf.position(self.font_id, dim_text_coords[0], dim_text_coords[1], 0) - value = round((axis_line[i][1] - axis_line[i][0]).length, 4) - direction = axis_line[i][1] - axis_line[i][0] - if (i == 0 and direction.x < 0) or (i == 1 and direction.y < 0) or (i == 2 and direction.z < 0): - value = -value - prefix = "xyz"[i] - formatted_value = tool.Polyline.format_input_ui_units(value) - text = f"{prefix}: {formatted_value}" - text_length = blf.dimensions(self.font_id, text) - self.draw_text_background(context, dim_text_coords, text_length) - blf.draw(self.font_id, text) + if dim_text_coords: + value = round((axis_line[i][1] - axis_line[i][0]).length, 4) + direction = axis_line[i][1] - axis_line[i][0] + if (i == 0 and direction.x < 0) or (i == 1 and direction.y < 0) or (i == 2 and direction.z < 0): + value = -value + prefix = "xyz"[i] + formatted_value = tool.Polyline.format_input_ui_units(value) + text = f"{prefix}: {formatted_value}" + screen_coords[f"xyz_{i}"] = (Vector(dim_text_coords), text) # Area and Length text polyline_verts = [Vector((p.x, p.y, p.z)) for p in self.polyline_points] @@ -569,35 +570,107 @@ def draw_measurements_text(self, context): # Area if self.measure_type == "POLY_AREA" and self.polyline_data.area: if len(polyline_verts) < 3: + blf.disable(self.font_id, blf.SHADOW) return - center = sum(polyline_verts, Vector()) / len(polyline_verts) # Center between all polyline points + center = sum(polyline_verts, Vector()) / len(polyline_verts) if polyline_verts[0] == polyline_verts[-1]: - center = sum(polyline_verts[:-1], Vector()) / len( - polyline_verts[:-1] - ) # Doesn't use the last point if is a closed polyline + center = sum(polyline_verts[:-1], Vector()) / len(polyline_verts[:-1]) area_text_coords = view3d_utils.location_3d_to_region_2d(region, rv3d, center) - value = self.polyline_data.area - text = f"area: {value}" - text_length = blf.dimensions(self.font_id, text) - area_text_coords[0] -= text_length[0] / 2 # Center text horizontally - blf.position(self.font_id, area_text_coords[0], area_text_coords[1], 0) - self.draw_text_background(context, area_text_coords, text_length) - blf.draw(self.font_id, text) + if area_text_coords: + value = self.polyline_data.area + text = f"area: {value}" + text_length = blf.dimensions(self.font_id, text) + area_text_coords = list(area_text_coords) + area_text_coords[0] -= text_length[0] / 2 + screen_coords["area"] = (Vector(area_text_coords), text) # Length if self.measure_type in {"POLYLINE", "POLY_AREA"}: if len(polyline_verts) < 3: + blf.disable(self.font_id, blf.SHADOW) return total_length_text_coords = view3d_utils.location_3d_to_region_2d(region, rv3d, polyline_verts[-1]) - blf.position(self.font_id, total_length_text_coords[0], total_length_text_coords[1], 0) - value = self.polyline_data.total_length - text = f"length: {value}" + if total_length_text_coords: + value = self.polyline_data.total_length + text = f"length: {value}" + screen_coords["length"] = (Vector(total_length_text_coords), text) + + self.adjust_overlapping_labels(screen_coords) + + for label_key, (screen_co, text) in screen_coords.items(): + blf.position(self.font_id, screen_co.x, screen_co.y, 0) + blf.color(self.font_id, 1, 1, 1, 1) text_length = blf.dimensions(self.font_id, text) - self.draw_text_background(context, total_length_text_coords, text_length) + self.draw_text_background(context, screen_co, text_length) blf.draw(self.font_id, text) blf.disable(self.font_id, blf.SHADOW) + def adjust_overlapping_labels(self, screen_coords): + font_id = self.font_id + text_dimensions = {} + + for label_key, (screen_co, text) in screen_coords.items(): + text_dimensions[label_key] = blf.dimensions(font_id, text) + + if text_dimensions: + first_height = next(iter(text_dimensions.values()))[1] + min_spacing = max(2, first_height * 0.3) + else: + min_spacing = 2 + + label_keys = list(screen_coords.keys()) + for pass_num in range(3): # 3 passes to try to optimize complex overlaps + for i in range(len(label_keys)): + for j in range(i + 1, len(label_keys)): + key1, key2 = label_keys[i], label_keys[j] + co1, _ = screen_coords[key1] + co2, _ = screen_coords[key2] + dim1 = text_dimensions[key1] + dim2 = text_dimensions[key2] + + bounds1 = { + "left": co1.x - min_spacing, + "right": co1.x + dim1[0] + min_spacing, + "top": co1.y + dim1[1] + min_spacing, + "bottom": co1.y - min_spacing, + } + bounds2 = { + "left": co2.x - min_spacing, + "right": co2.x + dim2[0] + min_spacing, + "top": co2.y + dim2[1] + min_spacing, + "bottom": co2.y - min_spacing, + } + + if ( + bounds1["left"] < bounds2["right"] + and bounds1["right"] > bounds2["left"] + and bounds1["bottom"] < bounds2["top"] + and bounds1["top"] > bounds2["bottom"] + ): + x_overlap = min(bounds1["right"], bounds2["right"]) - max(bounds1["left"], bounds2["left"]) + y_overlap = min(bounds1["top"], bounds2["top"]) - max(bounds1["bottom"], bounds2["bottom"]) + + separation_multiplier = 1.25 + + # Move labels in the direction requiring less movement + if x_overlap < y_overlap: + separation_distance = (x_overlap / 2 + min_spacing) * separation_multiplier + if co1.x < co2.x: + co1.x -= separation_distance + co2.x += separation_distance + else: + co1.x += separation_distance + co2.x -= separation_distance + else: + separation_distance = (y_overlap / 2 + min_spacing) * separation_multiplier + if co1.y < co2.y: + co1.y -= separation_distance + co2.y += separation_distance + else: + co1.y += separation_distance + co2.y -= separation_distance + def draw_measurements_poly(self, context): self.shader_config(context) polyline_verts: list[Vector] = [] @@ -879,13 +952,43 @@ def __call__(self, context): class ProductDecorator: is_installed = False handlers = [] + preview_mode: Literal["PROFILE_VERTICAL", "PROFILE_HORIZONTAL", "LAYER2", "LAYER3", "GENERIC"] relating_type = None + obj_data: dict[str, list] = {} + obj_matrix_i = None @classmethod def install(cls, context): + from bonsai.bim.module.geometry.decorator import ItemDecorator + if cls.is_installed: cls.uninstall() + + props = tool.Model.get_model_props() + handler = cls() + if ( + (props.relating_type_id) + and (relating_type := tool.Ifc.get().by_id(int(props.relating_type_id))) + and (relating_type_obj := tool.Ifc.get_object(relating_type)) + ): + handler.relating_type = relating_type + if tool.Model.get_usage_type(relating_type) == "PROFILE": + if relating_type.is_a() in {"IfcColumnType", "IfcPileType"}: + handler.preview_mode = "PROFILE_VERTICAL" + else: + handler.preview_mode = "PROFILE_HORIZONTAL" + elif tool.Model.get_usage_type(relating_type) == "LAYER2": + handler.preview_mode = "LAYER2" + elif tool.Model.get_usage_type(relating_type) == "LAYER3": + handler.preview_mode = "LAYER3" + else: + handler.preview_mode = "GENERIC" + if relating_type_obj.data: + handler.obj_data = ItemDecorator.get_obj_data(relating_type_obj) + handler.obj_data["raw_verts"] = [Vector(v) for v in handler.obj_data["verts"]] + handler.obj_matrix_i = relating_type_obj.matrix_world.inverted() + cls.handlers.append( SpaceView3D.draw_handler_add(handler.draw_product_preview, (context,), "WINDOW", "POST_VIEW") ) @@ -893,10 +996,6 @@ def install(cls, context): @classmethod def uninstall(cls): - props = tool.Model.get_product_preview_props() # updated by model/polyline.py - props.verts.clear() - props.edges.clear() - props.tris.clear() for handler in cls.handlers: try: SpaceView3D.draw_handler_remove(handler, "WINDOW") @@ -912,14 +1011,6 @@ def draw_batch(self, shader_type, content_pos, color, indices=None): shader.uniform_float("color", color) batch.draw(shader) - def get_product_preview_data(self, context) -> dict[str, Any]: - props = tool.Model.get_product_preview_props() - data: dict[str, Any] = {} - data["verts"] = [(*v.value_3d,) for v in props.verts] - data["edges"] = [(int(e.value_2d[0]), int(e.value_2d[1])) for e in props.edges] - data["tris"] = [(int(t.value_3d[0]), int(t.value_3d[1]), int(t.value_3d[2])) for t in props.tris] - return data - def draw_product_preview(self, context): def transparent_color(color, alpha=0.1): color = [i for i in color] @@ -945,12 +1036,549 @@ def transparent_color(color, alpha=0.1): else: return - product_preview_data = self.get_product_preview_data(context) - if product_preview_data: - self.draw_batch("LINES", product_preview_data["verts"], decorator_color, product_preview_data["edges"]) - self.draw_batch( - "TRIS", product_preview_data["verts"], transparent_color(decorator_color), product_preview_data["tris"] + if self.preview_mode == "LAYER2": + data = self.get_wall_preview_data() + elif self.preview_mode == "LAYER3": + data = self.get_slab_preview_data() + elif self.preview_mode == "PROFILE_VERTICAL": + data = self.get_vertical_profile_preview_data() + elif self.preview_mode == "PROFILE_HORIZONTAL": + data = self.get_horizontal_profile_preview_data() + elif self.preview_mode == "GENERIC": + data = self.get_generic_preview_data() + if data: + self.draw_batch("LINES", data["verts"], decorator_color, data["edges"]) + self.draw_batch("TRIS", data["verts"], transparent_color(decorator_color), data["tris"]) + + def get_wall_preview_data(self): + relating_type = self.relating_type + # Get properties from object type + model_props = tool.Model.get_model_props() + direction_sense = model_props.direction_sense + direction = 1 + if direction_sense == "NEGATIVE": + direction = -1 + + layers = tool.Model.get_material_layer_parameters(relating_type) + if not layers["thickness"]: + return + thickness = layers["thickness"] + thickness *= direction + + offset_type = model_props.offset_type_vertical + unit_scale = ifcopenshell.util.unit.calculate_unit_scale(tool.Ifc.get()) + offset = model_props.offset * unit_scale + + height = float(model_props.extrusion_depth) + rl = float(model_props.rl1) + x_angle = float(model_props.x_angle) + if x_angle > radians(90) or x_angle < radians(-90): + height *= -1 + angle_distance = height * tan(x_angle) + thickness *= 1 / cos(x_angle) + + data = {} + data["verts"] = [] + + # Verts + polyline_vertices: list[Vector] = [] + polyline_props = tool.Model.get_polyline_props() + polyline_data = polyline_props.insertion_polyline + polyline_points = polyline_data[0].polyline_points if polyline_data else [] + if len(polyline_points) < 2: + data = [] + return + for point in polyline_points: + polyline_vertices.append(Vector((point.x, point.y, point.z))) + + is_closed = False + if ( + polyline_vertices[0].x == polyline_vertices[-1].x + and polyline_vertices[0].y == polyline_vertices[-1].y + and polyline_vertices[0].z == polyline_vertices[-1].z + ): + is_closed = True + polyline_vertices.pop(-1) # Remove the last point. The edges are going to inform that the shape is closed. + + bm_base = tool.Model.create_bmesh_from_vertices(polyline_vertices, is_closed) + base_vertices = tool.Cad.offset_edges(bm_base, offset) + offset_base_verts = tool.Cad.offset_edges(bm_base, thickness + offset) + top_vertices = tool.Cad.offset_edges(bm_base, angle_distance + offset) + offset_top_verts = tool.Cad.offset_edges(bm_base, angle_distance + thickness + offset) + if is_closed: + base_vertices.append(base_vertices[0]) + offset_base_verts.append(offset_base_verts[0]) + top_vertices.append(top_vertices[0]) + offset_top_verts.append(offset_top_verts[0]) + + if offset_base_verts is not None: + for v in base_vertices: + data["verts"].append((v.co.x, v.co.y, v.co.z + rl)) + + for v in offset_base_verts[::-1]: + data["verts"].append((v.co.x, v.co.y, v.co.z + rl)) + + for v in top_vertices: + data["verts"].append((v.co.x, v.co.y, v.co.z + rl + height)) + + for v in offset_top_verts[::-1]: + data["verts"].append((v.co.x, v.co.y, v.co.z + rl + height)) + + bm_base.free() + + # Edges and Tris + points = [] + side_edges_1 = [] + side_edges_2 = [] + base_edges = [] + + for i in range(len(data["verts"])): + points.append(Vector(data["verts"][i])) + + n = len(points) // 2 + bottom_side_1 = [[i, (i + 1) % (n)] for i in range((n - 1) // 2)] + bottom_side_2 = [[i, (i + 1) % (n)] for i in range(n // 2, n - 1)] + bottom_connections = [[i, n - i - 1] for i in range(n // 2)] + bottom_loop = bottom_connections + bottom_side_1 + bottom_side_2 + side_edges_1.extend(bottom_side_1) + side_edges_2.extend(bottom_side_2) + base_edges.extend(bottom_loop) + + upper_side_1 = [[i + n for i in edges] for edges in bottom_side_1] + upper_side_2 = [[i + n for i in edges] for edges in bottom_side_2] + upper_loop = [[i + n for i in edges] for edges in bottom_loop] + side_edges_1.extend(upper_side_1) + side_edges_2.extend(upper_side_2) + base_edges.extend(upper_loop) + + loops = [side_edges_1, side_edges_2, base_edges] + + data["edges"] = [] + data["tris"] = [] + for i, group in enumerate(loops): + bm = bmesh.new() + + new_verts = [bm.verts.new(v) for v in points] + new_edges = [bm.edges.new((new_verts[e[0]], new_verts[e[1]])) for e in group] + + bm.verts.index_update() + bm.edges.index_update() + + if i == 2: + new_faces = bmesh.ops.contextual_create(bm, geom=bm.edges) + new_faces = bmesh.ops.bridge_loops(bm, edges=bm.edges, use_pairs=True, use_cyclic=True) + + bm.verts.index_update() + bm.edges.index_update() + edges = [[v.index for v in e.verts] for e in bm.edges] + tris = [[l.vert.index for l in loop] for loop in bm.calc_loop_triangles()] + data["edges"].extend(edges) + data["tris"].extend(tris) + + data["edges"] = list(set(tuple(e) for e in data["edges"])) + data["tris"] = list(set(tuple(t) for t in data["tris"])) + return data + + def get_slab_preview_data(self): + relating_type = self.relating_type + model_props = tool.Model.get_model_props() + x_angle = 0 if tool.Cad.is_x(model_props.x_angle, 0, tolerance=0.001) else model_props.x_angle + direction_sense = model_props.direction_sense + direction = 1 + if direction_sense == "NEGATIVE": + direction = -1 + + layers = tool.Model.get_material_layer_parameters(relating_type) + if not layers["thickness"]: + return + thickness = layers["thickness"] * abs(1 / cos(x_angle)) + thickness *= direction + + offset_type = model_props.offset_type_horizontal + unit_scale = ifcopenshell.util.unit.calculate_unit_scale(tool.Ifc.get()) + offset = model_props.offset * abs(1 / cos(x_angle)) * unit_scale + + data = {} + data["verts"] = [] + # Verts + polyline_vertices: list[Vector] = [] + polyline_props = tool.Model.get_polyline_props() + polyline_data = polyline_props.insertion_polyline + polyline_points = polyline_data[0].polyline_points if polyline_data else [] + if len(polyline_points) < 3: + data = [] + return + for point in polyline_points: + polyline_vertices.append(Vector((point.x, point.y, point.z))) + if x_angle: + # Get vertices relative to the first polyline point as origin + local_vertices = [v - Vector(polyline_vertices[0]) for v in polyline_vertices] + # Make the transformation relative to the x_angle + transformed_vertices = [Vector((v.x, v.y * (1 / cos(x_angle)), v.z)) for v in local_vertices] + # Convert back to world origin + polyline_vertices = [v + Vector(polyline_vertices[0]) for v in transformed_vertices] + if offset != 0: + polyline_vertices = [v + Vector((0, 0, offset)) for v in polyline_vertices] + is_closed = True + if ( + polyline_vertices[0].x == polyline_vertices[-1].x + and polyline_vertices[0].y == polyline_vertices[-1].y + and polyline_vertices[0].z == polyline_vertices[-1].z + ): + polyline_vertices.pop(-1) # Remove the last point. The edges are going to inform that the shape is closed. + bm = tool.Model.create_bmesh_from_vertices(polyline_vertices, is_closed) + bm.verts.ensure_lookup_table() + if x_angle: + rot_mat = Matrix.Rotation(x_angle, 3, "X") + if abs(x_angle) > (pi / 2): + rot_mat = rot_mat @ Matrix.Scale(-1, 3, (0, 1, 0)) + bmesh.ops.rotate(bm, cent=Vector(bm.verts[0].co), verts=bm.verts, matrix=rot_mat) + new_faces = bmesh.ops.contextual_create(bm, geom=bm.edges) + new_faces = bmesh.ops.extrude_face_region(bm, geom=bm.edges[:] + bm.faces[:]) + new_verts = [e for e in new_faces["geom"] if isinstance(e, bmesh.types.BMVert)] + new_faces = bmesh.ops.translate(bm, verts=new_verts, vec=(0.0, 0.0, thickness)) + bm.verts.index_update() + bm.edges.index_update() + verts = [tuple(v.co) for v in bm.verts] + edges = [[v.index for v in e.verts] for e in bm.edges] + tris = [[loop.vert.index for loop in triangles] for triangles in bm.calc_loop_triangles()] + data["verts"] = verts + data["edges"] = edges + data["tris"] = tris + return data + + def get_vertical_profile_preview_data(self) -> dict[str, Any]: + relating_type = self.relating_type + material = ifcopenshell.util.element.get_material(relating_type) + try: + profile = material.MaterialProfiles[0].Profile + except: + return {} + + model_props = tool.Model.get_model_props() + extrusion_depth = model_props.extrusion_depth + cardinal_point = model_props.cardinal_point + rot_mat = Quaternion() + if relating_type.is_a("IfcBeamType"): + y_rot = Quaternion((0.0, 1.0, 0.0), radians(90)) + z_rot = Quaternion((0.0, 0.0, 1.0), radians(90)) + rot_mat = y_rot @ z_rot + # Get profile data + settings = ifcopenshell.geom.settings() + settings.set("dimensionality", ifcopenshell.ifcopenshell_wrapper.CURVES_SURFACES_AND_SOLIDS) + shape = ifcopenshell.geom.create_shape(settings, profile) + + verts = shape.verts + if not verts: + raise RuntimeError(f"Profile shape has no vertices, it probably is invalid: '{profile}'.") + + edges = shape.edges + + grouped_verts = [[verts[i], verts[i + 1], 0] for i in range(0, len(verts), 3)] + grouped_edges = [[edges[i], edges[i + 1]] for i in range(0, len(edges), 2)] + + # Create offsets based on cardinal point + min_x = min(v[0] for v in grouped_verts) + max_x = max(v[0] for v in grouped_verts) + min_y = min(v[1] for v in grouped_verts) + max_y = max(v[1] for v in grouped_verts) + + x_offset = (max_x - min_x) / 2 + y_offset = (max_y - min_y) / 2 + + match cardinal_point: + case "1": + grouped_verts = [(v[0] - x_offset, v[1] + y_offset, v[2]) for v in grouped_verts] + case "2": + grouped_verts = [(v[0], v[1] + y_offset, v[2]) for v in grouped_verts] + case "3": + grouped_verts = [(v[0] + x_offset, v[1] + y_offset, v[2]) for v in grouped_verts] + case "4": + grouped_verts = [(v[0] - x_offset, v[1], v[2]) for v in grouped_verts] + case "5": + grouped_verts = [(v[0], v[1], v[2]) for v in grouped_verts] + case "6": + grouped_verts = [(v[0] + x_offset, v[1], v[2]) for v in grouped_verts] + case "7": + grouped_verts = [(v[0] - x_offset, v[1] - y_offset, v[2]) for v in grouped_verts] + case "8": + grouped_verts = [(v[0], v[1] - y_offset, v[2]) for v in grouped_verts] + case "9": + grouped_verts = [(v[0] + x_offset, v[1] - y_offset, v[2]) for v in grouped_verts] + + # Create extrusion bmesh + bm = bmesh.new() + + grouped_verts.append(grouped_verts[0]) # Close profile + new_verts = [bm.verts.new(v) for v in grouped_verts] + new_edges = [bm.edges.new((new_verts[i], new_verts[i + 1])) for i in range(len(grouped_verts) - 1)] + + bm.verts.index_update() + bm.edges.index_update() + + bmesh.ops.remove_doubles(bm, verts=bm.verts, dist=0.001) + + new_faces = bmesh.ops.contextual_create(bm, geom=bm.edges) + + new_faces = bmesh.ops.extrude_face_region(bm, geom=bm.faces, use_dissolve_ortho_edges=True) + new_verts = [e for e in new_faces["geom"] if isinstance(e, bmesh.types.BMVert)] + new_faces = bmesh.ops.translate(bm, verts=new_verts, vec=(0.0, 0.0, extrusion_depth)) + + bm.verts.index_update() + bm.edges.index_update() + tris = [[loop.vert.index for loop in triangles] for triangles in bm.calc_loop_triangles()] + + # Calculate rotation, mouse position, angle and cardinal point + polyline_props = tool.Model.get_polyline_props() + snap_prop = polyline_props.snap_mouse_point[0] + mouse_point = Vector((snap_prop.x, snap_prop.y, snap_prop.z)) + data = {} + + verts = [tuple(v.co) for v in bm.verts] + verts = [tuple(rot_mat @ Vector(v)) for v in verts] + verts = [tuple(Vector(v) + mouse_point) for v in verts] + min_z = min(v.co.z for v in bm.verts) + max_z = max(v.co.z for v in bm.verts) + # Add axis verts + verts.append(tuple(mouse_point)) + verts.append(tuple(mouse_point + Vector((0, 0, max_z)))) + # Add only profile edges + edges = [] + for edge in bm.edges: + if (edge.verts[0].co.z == min_z and edge.verts[1].co.z == min_z) or ( + edge.verts[0].co.z == max_z and edge.verts[1].co.z == max_z + ): + edges.append(edge) + # Add axis edge + edges = [(edge.verts[0].index, edge.verts[1].index) for edge in edges] + edges.append((len(verts) - 1, len(verts) - 2)) + data["verts"] = verts + data["edges"] = edges + data["tris"] = tris + + bm.free() + return data + + def get_horizontal_profile_preview_data(self) -> dict[str, Any]: + relating_type = self.relating_type + material = ifcopenshell.util.element.get_material(relating_type) + try: + profile_curve = material.MaterialProfiles[0].Profile + except: + return {} + + model_props = tool.Model.get_model_props() + cardinal_point = model_props.cardinal_point + + polyline_verts = [] + polyline_props = tool.Model.get_polyline_props() + polyline_data = polyline_props.insertion_polyline + polyline_points = polyline_data[0].polyline_points if polyline_data else [] + if len(polyline_points) < 2: + return {} + for point in polyline_points: + polyline_verts.append(Vector((point.x, point.y, point.z))) + polyline_edges = [(i, i + 1) for i in range(len(polyline_verts) - 1)] + + # Get profile shape + settings = ifcopenshell.geom.settings() + settings.set("dimensionality", ifcopenshell.ifcopenshell_wrapper.CURVES_SURFACES_AND_SOLIDS) + shape = ifcopenshell.geom.create_shape(settings, profile_curve) + + verts = shape.verts + if not verts: + raise RuntimeError(f"Profile shape has no vertices, it probably is invalid: '{profile_curve}'.") + + edges = shape.edges + + grouped_verts = [[verts[i], verts[i + 1], 0] for i in range(0, len(verts), 3)] + grouped_edges = [[edges[i], edges[i + 1]] for i in range(0, len(edges), 2)] + + # Create offsets based on cardinal point + min_x = min(v[0] for v in grouped_verts) + max_x = max(v[0] for v in grouped_verts) + min_y = min(v[1] for v in grouped_verts) + max_y = max(v[1] for v in grouped_verts) + + x_offset = (max_x - min_x) / 2 + y_offset = (max_y - min_y) / 2 + + match cardinal_point: + case "1": + grouped_verts = [(v[0] - x_offset, v[1] + y_offset, v[2]) for v in grouped_verts] + case "2": + grouped_verts = [(v[0], v[1] + y_offset, v[2]) for v in grouped_verts] + case "3": + grouped_verts = [(v[0] + x_offset, v[1] + y_offset, v[2]) for v in grouped_verts] + case "4": + grouped_verts = [(v[0] - x_offset, v[1], v[2]) for v in grouped_verts] + case "5": + grouped_verts = [(v[0], v[1], v[2]) for v in grouped_verts] + case "6": + grouped_verts = [(v[0] + x_offset, v[1], v[2]) for v in grouped_verts] + case "7": + grouped_verts = [(v[0] - x_offset, v[1] - y_offset, v[2]) for v in grouped_verts] + case "8": + grouped_verts = [(v[0], v[1] - y_offset, v[2]) for v in grouped_verts] + case "9": + grouped_verts = [(v[0] + x_offset, v[1] - y_offset, v[2]) for v in grouped_verts] + + data: dict[str, Any] = {} + data["verts"] = [] + data["edges"] = [] + data["tris"] = [] + + grouped_verts = [(v) for v in grouped_verts] + + all_bm = bmesh.new() + for i in range(len(polyline_verts) - 1): + mesh = bpy.data.meshes.new("TempMesh") + # Create the initial mesh from the profile verts + bm = tool.Model.create_bmesh_from_vertices(grouped_verts, is_closed=True) + bm.verts.ensure_lookup_table() + # Creates the clipping plane formed by two segments. + # The first one is for the profile start, based on the current and previous segment of the polyline. + # The second is for the profile end, based on the current and the next segment. + if i == 0: + d = (polyline_verts[i + 1] - polyline_verts[i]).normalized() + clip_start = d + else: + d1 = (polyline_verts[i] - polyline_verts[i - 1]).normalized() + d2 = (polyline_verts[i] - polyline_verts[i + 1]).normalized() + clip_start = (d1 - d2).normalized() + + if i == len(polyline_verts) - 2: + d = (polyline_verts[i + 1] - polyline_verts[i]).normalized() + clip_end = d + else: + d1 = (polyline_verts[i + 1] - polyline_verts[i]).normalized() + d2 = (polyline_verts[i + 1] - polyline_verts[i + 2]).normalized() + clip_end = (d1 - d2).normalized() + + # Rotates the profile face to the right direction + direction = polyline_verts[i + 1] - polyline_verts[i] + position = polyline_verts[i] + rotation_matrix = direction.to_track_quat("Z", "Y").to_matrix().to_4x4() + bmesh.ops.transform(bm, verts=bm.verts, matrix=rotation_matrix) + bmesh.ops.translate(bm, verts=bm.verts, vec=position) + bmesh.ops.translate(bm, verts=bm.verts, vec=-direction) + + # Extrude and move the new face + last_face = bmesh.ops.extrude_face_region(bm, geom=bm.edges[:] + bm.faces[:]) + new_verts = [e for e in last_face["geom"] if isinstance(e, bmesh.types.BMVert)] + bmesh.ops.translate(bm, verts=new_verts, vec=direction * 3) + # Apply the cutting planes + cut = bmesh.ops.bisect_plane( + bm, + geom=bm.verts[:] + bm.edges[:] + bm.faces[:], + plane_co=polyline_verts[i], + plane_no=clip_start, + clear_inner=True, ) + bm.verts.index_update() + bm.edges.index_update() + cut = bmesh.ops.bisect_plane( + bm, + geom=bm.verts[:] + bm.edges[:] + bm.faces[:], + plane_co=polyline_verts[i + 1], + plane_no=clip_end, + clear_outer=True, + ) + + bm.to_mesh(mesh) + bm.free() + mesh.update() + all_bm.from_mesh(mesh) + bpy.data.meshes.remove(bpy.data.meshes["TempMesh"]) + + # It's necessary to add the mesh to an object to get the expected result. + mesh = bpy.data.meshes.new("TempMesh2") + all_bm.to_mesh(mesh) + all_bm.free() + obj = bpy.data.objects.new("TempObj", mesh) + bm = bmesh.new() + bm.from_mesh(obj.data) + bpy.data.meshes.remove(bpy.data.meshes["TempMesh2"]) + + verts = [tuple(v.co) for v in bm.verts] + edges = [[v.index for v in e.verts] for e in bm.edges] + tris = [[loop.vert.index for loop in triangles] for triangles in bm.calc_loop_triangles()] + data["verts"] = verts + data["edges"] = edges + data["tris"] = tris + bm.free() + return data + + def get_generic_preview_data(self): + if not (data := self.obj_data): + return + relating_type = self.relating_type + model_props = tool.Model.get_model_props() + if relating_type.is_a("IfcDoorType"): + rl = float(model_props.rl1) + elif relating_type.is_a("IfcWindowType"): + rl = float(model_props.rl2) + else: + rl = 0 + polyline_props = tool.Model.get_polyline_props() + snap_prop = polyline_props.snap_mouse_point[0] + default_container_elevation = tool.Root.get_default_container_elevation() + mouse_point = Vector((snap_prop.x, snap_prop.y, default_container_elevation)) + snap_obj = bpy.data.objects.get(snap_prop.snap_object) + snap_element = tool.Ifc.get_entity(snap_obj) + rot_mat = Matrix() + if relating_type.is_a() in ["IfcDoorType", "IfcWindowType"] and snap_element and snap_element.is_a("IfcWall"): + layers = tool.Model.get_material_layer_parameters(snap_element) + axes = tool.Model.get_wall_axis(snap_obj, layers=layers) + axis_base = axes["base"] + axis_side = axes["side"] + point_on_base_axis = tool.Cad.point_on_edge(mouse_point, axis_base) + point_on_side_axis = tool.Cad.point_on_edge(mouse_point, axis_side) + if (point_on_base_axis - mouse_point).length_squared <= (point_on_side_axis - mouse_point).length_squared: + # mouse is snapped to the base axis, the preview looks exactly like the placed door / window + rot_mat = snap_obj.matrix_world + else: + # mouse is snapped to the side axis, the preview is inverted, rotate it now and correct x position later + rot_mat = ( + (snap_obj.matrix_world.to_quaternion() @ Quaternion(Vector((0, 0, 1)), radians(180))) + .to_matrix() + .to_4x4() + ) + + mouse_point.z = snap_obj.matrix_world.translation.z + + if snap_element and (container := ifcopenshell.util.element.get_container(snap_element)): + container_obj = tool.Ifc.get_object(container) + mouse_point.z = container_obj.location.z + + obj_type = tool.Ifc.get_object(relating_type) + + subcontexts = tool.Drawing.get_active_drawing_subcontexts() + if not subcontexts: + subcontexts = [("Model", "Body", "MODEL_VIEW")] + + active_context = tool.Geometry.get_active_representation_context(obj_type) + active_context_params = tool.Geometry.get_subcontext_parameters(active_context) + for subcontext in subcontexts: + if subcontext == active_context_params: + break + + representation = ifcopenshell.util.representation.get_representation(relating_type, *subcontext) + if representation: + bonsai.core.geometry.switch_representation( + tool.Ifc, + tool.Geometry, + obj_type, + representation, + ) + bpy.context.view_layer.update() + break + + translate_mouse = Matrix.Translation(mouse_point) + translate_rl = Matrix.Translation((0.0, 0.0, rl)) + combined_m = translate_mouse @ rot_mat @ translate_rl @ self.obj_matrix_i + data["verts"] = [tuple(combined_m @ v) for v in data["raw_verts"]] + return data class WallAxisDecorator: @@ -1313,7 +1941,7 @@ def draw_dimension_text(self, context): addon_prefs = tool.Blender.get_addon_preferences() font_id = 0 - font_size = tool.Blender.scale_font_size(12) + font_size = tool.Blender.scale_font_size() blf.size(font_id, font_size) blf.enable(font_id, blf.SHADOW) blf.shadow(font_id, 6, 0, 0, 0, 1) diff --git a/src/bonsai/bonsai/bim/module/model/door.py b/src/bonsai/bonsai/bim/module/model/door.py index 26d1a1a7fb8..5a14cde101d 100644 --- a/src/bonsai/bonsai/bim/module/model/door.py +++ b/src/bonsai/bonsai/bim/module/model/door.py @@ -17,30 +17,27 @@ # along with Bonsai. If not, see . -import bpy +import collections.abc +import json +from typing import TYPE_CHECKING + import bmesh +import bpy import ifcopenshell -import ifcopenshell.api import ifcopenshell.api.geometry import ifcopenshell.api.material import ifcopenshell.api.pset import ifcopenshell.util.element import ifcopenshell.util.representation -import ifcopenshell.util.schema import ifcopenshell.util.unit -import bonsai.tool as tool +from mathutils import Matrix, Vector + import bonsai.core.geometry as core import bonsai.core.root -from bonsai.bim.module.model.window import create_bm_window, create_bm_box +import bonsai.tool as tool from bonsai.bim.module.drawing import gizmos as gizmo from bonsai.bim.module.drawing.gizmos import DimensionGizmoConfig - -from mathutils import Vector, Matrix - -import json -import collections -import collections.abc -from typing import get_args, TYPE_CHECKING +from bonsai.bim.module.model.window import create_bm_box, create_bm_window if TYPE_CHECKING: from bonsai.bim.module.model.prop import BIMDoorProperties diff --git a/src/bonsai/bonsai/bim/module/model/external.py b/src/bonsai/bonsai/bim/module/model/external.py index cde84cd5362..5ed99f29e8b 100644 --- a/src/bonsai/bonsai/bim/module/model/external.py +++ b/src/bonsai/bonsai/bim/module/model/external.py @@ -17,9 +17,7 @@ # along with Bonsai. If not, see . import bpy -import bmesh -import ifcopenshell import bonsai.tool as tool @@ -32,9 +30,23 @@ class ApplyExternalParametricGeometry(bpy.types.Operator, tool.Ifc.Operator): def _execute(self, context): obj = context.active_object assert obj - assert (active_representation := tool.Geometry.get_active_representation(obj)) - ifc_context = active_representation.ContextOfItems - tool.Model.add_representation(obj, ifc_context) props = tool.Model.get_epg_props(obj) + + # TODO: consider nodes being empty. + if props.geometry_source == "GEONODES": + assert (active_representation := tool.Geometry.get_active_representation(obj)) + ifc_context = active_representation.ContextOfItems + + tool.Model.add_representation(obj, ifc_context) + elif props.geometry_source == "IFCSVERCHOK": + import ifcsverchok.helper as helper + + nodes = props.sverchok_nodes + assert nodes is not None + tool.Model.run_ifcsverchok_graph_on_bonsai_file(nodes) + output_node = tool.Model.get_ifcsverchok_shape_output(nodes) + representation = helper.get_socket_value(output_node.inputs, "Representation") + tool.Model.replace_object_ifc_representation(representation.ContextOfItems, obj, representation) + props.is_editing = False return {"FINISHED"} diff --git a/src/bonsai/bonsai/bim/module/model/grid.py b/src/bonsai/bonsai/bim/module/model/grid.py index 4bac1b3f946..dd4e919e307 100644 --- a/src/bonsai/bonsai/bim/module/model/grid.py +++ b/src/bonsai/bonsai/bim/module/model/grid.py @@ -16,16 +16,17 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . +from typing import TYPE_CHECKING + import bpy -import ifcopenshell.api import ifcopenshell.api.grid -import bonsai.tool as tool -import bonsai.core.geometry -import bonsai.core.root -from bpy.types import Operator from bpy.props import FloatProperty, IntProperty +from bpy.types import Operator from mathutils import Vector -from typing import TYPE_CHECKING + +import bonsai.core.geometry +import bonsai.core.root +import bonsai.tool as tool def add_object(self: "BIM_OT_add_object", context: bpy.types.Context) -> None: @@ -81,7 +82,7 @@ def add_object(self: "BIM_OT_add_object", context: bpy.types.Context) -> None: class BIM_OT_add_object(Operator, tool.Ifc.Operator): - bl_idname = "mesh.add_grid" + bl_idname = "bim.add_grid" bl_label = "Grid" bl_description = "Add IfcGrid." bl_options = {"REGISTER", "UNDO"} diff --git a/src/bonsai/bonsai/bim/module/model/handler.py b/src/bonsai/bonsai/bim/module/model/handler.py index 76ebbf57ee1..bfa064cda7f 100644 --- a/src/bonsai/bonsai/bim/module/model/handler.py +++ b/src/bonsai/bonsai/bim/module/model/handler.py @@ -16,12 +16,11 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . -import bpy -import ifcopenshell import ifcopenshell.api -from bonsai.bim.module.model import product, wall, slab, profile, opening, task from bpy.app.handlers import persistent +from bonsai.bim.module.model import opening, product, profile, task + @persistent def load_post(*args): @@ -36,24 +35,11 @@ def load_post(*args): "sequence.edit_task_time", "Bonsai.Task.CalculateQuantities", task.calculate_quantities ) - ifcopenshell.api.add_post_listener( - "type.assign_type", "Bonsai.DumbWall.RegenerateFromType", wall.DumbWallPlaner().regenerate_from_type - ) - - ifcopenshell.api.add_post_listener( - "type.assign_type", "Bonsai.DumbSlab.RegenerateFromType", slab.DumbSlabPlaner().regenerate_from_type - ) - ifcopenshell.api.add_post_listener( "material.edit_profile", "Bonsai.DumbProfile.RegenerateFromProfile", profile.DumbProfileRegenerator().regenerate_from_profile, ) - ifcopenshell.api.add_post_listener( - "type.assign_type", - "Bonsai.DumbProfile.RegenerateFromType", - profile.DumbProfileRegenerator().regenerate_from_type, - ) ifcopenshell.api.add_post_listener( "type.assign_type", diff --git a/src/bonsai/bonsai/bim/module/model/mep.py b/src/bonsai/bonsai/bim/module/model/mep.py index ab96e60b0d2..df341662295 100644 --- a/src/bonsai/bonsai/bim/module/model/mep.py +++ b/src/bonsai/bonsai/bim/module/model/mep.py @@ -16,15 +16,13 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . -import bpy -import math -import collections import collections.abc -import bmesh -import re import json -import ifcopenshell -import ifcopenshell.api +import re +from copy import copy +from math import cos, degrees, pi, radians, sin, tan + +import bpy import ifcopenshell.api.geometry import ifcopenshell.api.material import ifcopenshell.api.pset @@ -35,14 +33,11 @@ import ifcopenshell.util.system import ifcopenshell.util.unit import numpy as np -import bonsai.core.type +from ifcopenshell.util.shape_builder import ShapeBuilder +from mathutils import Matrix, Vector + import bonsai.core.root -import bonsai.core.geometry import bonsai.tool as tool -from math import pi, degrees, radians, sin, cos, asin, tan -from copy import copy -from mathutils import Vector, Matrix -from ifcopenshell.util.shape_builder import ShapeBuilder from bonsai.bim.module.model.profile import DumbProfileJoiner from bonsai.tool.cad import VTX_PRECISION @@ -232,7 +227,7 @@ def _execute(self, context): is_parallel21 = tool.Cad.is_x(angle21, (0, 180), tolerance=0.001) is_parallel23 = tool.Cad.is_x(angle23, (0, 180), tolerance=0.001) - if not all(is_parallel12, is_parallel13, is_parallel21, is_parallel23): + if not all([is_parallel12, is_parallel13, is_parallel21, is_parallel23]): fitting_type = "WYE" if not fitting_type: @@ -908,7 +903,7 @@ class MEPAddBend(bpy.types.Operator, tool.Ifc.Operator): start_segment_id: bpy.props.IntProperty(name="Start Segment Element ID", default=0) end_segment_id: bpy.props.IntProperty(name="End Segment Element ID", default=0) radius: bpy.props.FloatProperty( - "Bend Inner Radius", description="Bend inner radius in SI units", default=0.2, subtype="DISTANCE", min=0 + name="Bend Inner Radius", description="Bend inner radius in SI units", default=0.2, subtype="DISTANCE", min=0 ) def _execute(self, context): diff --git a/src/bonsai/bonsai/bim/module/model/opening.py b/src/bonsai/bonsai/bim/module/model/opening.py index b1f91a63984..1c157afe4e9 100644 --- a/src/bonsai/bonsai/bim/module/model/opening.py +++ b/src/bonsai/bonsai/bim/module/model/opening.py @@ -16,38 +16,31 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . +from collections.abc import Sequence +from math import radians +from typing import Any, Optional, Union + +import bmesh import bpy import gpu -import json -import bmesh -import shapely -import logging -import numpy as np import ifcopenshell -import ifcopenshell.api -import ifcopenshell.api.geometry import ifcopenshell.api.feature +import ifcopenshell.api.geometry import ifcopenshell.api.root import ifcopenshell.geom -import ifcopenshell.util.shape import ifcopenshell.util.element -import ifcopenshell.util.shape_builder -import ifcopenshell.util.placement import ifcopenshell.util.representation +import ifcopenshell.util.shape +import ifcopenshell.util.shape_builder import ifcopenshell.util.unit -import bonsai.tool as tool -import bonsai.core.geometry -import bonsai.bim.import_ifc as import_ifc -from collections import defaultdict -from math import pi, radians -from mathutils import Vector, Matrix, Euler -from bpy.types import Operator -from bpy.types import SpaceView3D -from bpy.props import FloatProperty -from bpy_extras.object_utils import AddObjectHelper, object_data_add +import numpy as np +import shapely +from bpy.types import Operator, SpaceView3D from gpu_extras.batch import batch_for_shader -from typing import Union, Optional, Any, cast -from collections.abc import Sequence +from mathutils import Matrix, Vector + +import bonsai.core.geometry +import bonsai.tool as tool from bonsai.bim.module.drawing.decoration import DecoratorData @@ -158,29 +151,11 @@ def generate( existing_opening_occurrence, "Model", "Body", "MODEL_VIEW" ) assert representation - - # Check if mapped representation - PRESERVE the mapping structure - if ( - representation.RepresentationType == "MappedRepresentation" - and len(representation.Items) == 1 - and representation.Items[0].is_a("IfcMappedItem") - ): - # Store the existing RepresentationMap to reuse it - existing_mapping_source = representation.Items[0].MappingSource - reuse_mapped_representation = True - else: - representation = ifcopenshell.util.representation.resolve_representation(representation) - - if not reuse_mapped_representation: - # Check for library template before generating from filling - template_rep = self.get_opening_template_from_type(filling) - - if template_rep: - representation = template_rep - else: - representation = self.generate_opening_from_filling( - filling, filling_obj, opening_thickness_si=opening_thickness_si - ) + representation = ifcopenshell.util.representation.resolve_representation(representation) + else: + representation = self.generate_opening_from_filling( + filling, filling_obj, opening_thickness_si=opening_thickness_si + ) # Create mapped representation if reuse_mapped_representation: @@ -191,25 +166,25 @@ def generate( MappingSource=existing_mapping_source, MappingTarget=tool.Ifc.get().create_entity( "IfcCartesianTransformationOperator3D", - Axis1=tool.Ifc.get().create_entity("IfcDirection", DirectionRatios=(1., 0., 0.)), - Axis2=tool.Ifc.get().create_entity("IfcDirection", DirectionRatios=(0., 1., 0.)), - LocalOrigin=tool.Ifc.get().create_entity("IfcCartesianPoint", Coordinates=(0., 0., 0.)), - Scale=1., - Axis3=tool.Ifc.get().create_entity("IfcDirection", DirectionRatios=(0., 0., 1.)) - ) + Axis1=tool.Ifc.get().create_entity("IfcDirection", DirectionRatios=(1.0, 0.0, 0.0)), + Axis2=tool.Ifc.get().create_entity("IfcDirection", DirectionRatios=(0.0, 1.0, 0.0)), + LocalOrigin=tool.Ifc.get().create_entity("IfcCartesianPoint", Coordinates=(0.0, 0.0, 0.0)), + Scale=1.0, + Axis3=tool.Ifc.get().create_entity("IfcDirection", DirectionRatios=(0.0, 0.0, 1.0)), + ), ) mapped_representation = tool.Ifc.get().create_entity( "IfcShapeRepresentation", ContextOfItems=context, RepresentationIdentifier="Body", RepresentationType="MappedRepresentation", - Items=[new_mapped_item] + Items=[new_mapped_item], ) else: mapped_representation = ifcopenshell.api.geometry.map_representation( tool.Ifc.get(), representation=representation ) - + ifcopenshell.api.geometry.assign_representation( tool.Ifc.get(), product=opening, representation=mapped_representation ) @@ -254,109 +229,38 @@ def _regenerate_from_type(self, related_object: ifcopenshell.entity_instance) -> voided_element = opening.VoidsElements[0].RelatingBuildingElement opening_rep = ifcopenshell.util.representation.get_representation(opening, "Model", "Body", "MODEL_VIEW") - - # ALWAYS preserve the existing opening representation (Tessellation, SweptSolid, etc.) - preserved_representation = None - if opening_rep: - if ( - opening_rep.RepresentationType == "MappedRepresentation" - and len(opening_rep.Items) == 1 - and opening_rep.Items[0].is_a("IfcMappedItem") - ): - # For mapped representations, copy the underlying representation - preserved_representation = ifcopenshell.util.element.copy_deep( - tool.Ifc.get(), - opening_rep.Items[0].MappingSource.MappedRepresentation, - exclude=["IfcGeometricRepresentationContext"], - ) - else: - # For direct representations (non-mapped), copy them too - preserved_representation = ifcopenshell.util.element.copy_deep( - tool.Ifc.get(), opening_rep, exclude=["IfcGeometricRepresentationContext"] - ) - ifcopenshell.api.geometry.unassign_representation(tool.Ifc.get(), product=opening, representation=opening_rep) ifcopenshell.api.geometry.remove_representation(tool.Ifc.get(), representation=opening_rep) existing_opening_occurrence = self.get_existing_opening_occurrence_if_any(filling) - # Priority order for choosing representation: - # 1. Existing occurrence with MappedRepresentation (preserve mapping!) - # 2. Library template with Tessellation - # 3. Preserved representation from old opening (maintain user's work) - # 4. Generate from filling (last resort) - - representation_to_use = None - reuse_mapped_representation = False - existing_mapping_source = None - if existing_opening_occurrence: representation = ifcopenshell.util.representation.get_representation( existing_opening_occurrence, "Model", "Body", "MODEL_VIEW" ) - - if ( - representation - and representation.RepresentationType == "MappedRepresentation" - and len(representation.Items) == 1 - and representation.Items[0].is_a("IfcMappedItem") - ): - # PRESERVE the mapped structure - reuse the same RepresentationMap - existing_mapping_source = representation.Items[0].MappingSource - reuse_mapped_representation = True - else: - representation_to_use = ifcopenshell.util.representation.resolve_representation(representation) - - if not representation_to_use and not reuse_mapped_representation: - template_rep = self.get_opening_template_from_type(filling) - if template_rep and template_rep.RepresentationType == "Tessellation": - representation_to_use = template_rep - - if not representation_to_use and not reuse_mapped_representation and preserved_representation: - representation_to_use = preserved_representation - - if not representation_to_use and not reuse_mapped_representation: + representation = ifcopenshell.util.representation.resolve_representation(representation) + mapped_representation = ifcopenshell.api.geometry.map_representation( + tool.Ifc.get(), representation=representation + ) + ifcopenshell.api.geometry.assign_representation( + tool.Ifc.get(), product=opening, representation=mapped_representation + ) + else: opening_obj = tool.Ifc.get_object(opening) if opening_obj: tool.Ifc.unlink(element=opening) tool.Blender.remove_data_blocks([opening_obj], remove_unused_data=True) filling_obj = tool.Ifc.get_object(filling) - representation_to_use = self.generate_opening_from_filling(filling, filling_obj) - - # Create the mapped representation - if reuse_mapped_representation: - # Reuse existing RepresentationMap - don't create a new one! - context = ifcopenshell.util.representation.get_context(tool.Ifc.get(), "Model", "Body", "MODEL_VIEW") - new_mapped_item = tool.Ifc.get().create_entity( - "IfcMappedItem", - MappingSource=existing_mapping_source, - MappingTarget=tool.Ifc.get().create_entity( - "IfcCartesianTransformationOperator3D", - Axis1=tool.Ifc.get().create_entity("IfcDirection", DirectionRatios=(1., 0., 0.)), - Axis2=tool.Ifc.get().create_entity("IfcDirection", DirectionRatios=(0., 1., 0.)), - LocalOrigin=tool.Ifc.get().create_entity("IfcCartesianPoint", Coordinates=(0., 0., 0.)), - Scale=1., - Axis3=tool.Ifc.get().create_entity("IfcDirection", DirectionRatios=(0., 0., 1.)) - ) - ) - mapped_representation = tool.Ifc.get().create_entity( - "IfcShapeRepresentation", - ContextOfItems=context, - RepresentationIdentifier="Body", - RepresentationType="MappedRepresentation", - Items=[new_mapped_item] - ) - else: + representation = self.generate_opening_from_filling(filling, filling_obj) mapped_representation = ifcopenshell.api.geometry.map_representation( - tool.Ifc.get(), representation=representation_to_use + tool.Ifc.get(), representation=representation + ) + ifcopenshell.api.geometry.assign_representation( + tool.Ifc.get(), product=opening, representation=mapped_representation ) - - ifcopenshell.api.geometry.assign_representation( - tool.Ifc.get(), product=opening, representation=mapped_representation - ) - # update voided object representation... + # update voided object representation or all it's parts if it's an aggregate voided_elements = ifcopenshell.util.element.get_parts(voided_element) or [voided_element] for voided_element in voided_elements: voided_obj = tool.Ifc.get_object(voided_element) @@ -370,36 +274,6 @@ def _regenerate_from_type(self, related_object: ifcopenshell.entity_instance) -> representation=representation, ) - def get_opening_template_from_type( - self, filling: ifcopenshell.entity_instance - ) -> Union[ifcopenshell.entity_instance, None]: - """ - Check if the filling's type has a stored opening template from library import. - """ - element_type = ifcopenshell.util.element.get_type(filling) - - if not element_type: - return None - - desc = element_type.Description - - if not desc or "||BonsaiOpeningTemplate:" not in desc: - return None - - # Extract template ID - marker = desc.split("||BonsaiOpeningTemplate:")[-1] - template_id = int(marker.split("||")[0]) - - try: - template_rep = tool.Ifc.get().by_id(template_id) - # Make a copy so we don't reuse the same representation instance - copied = ifcopenshell.util.element.copy_deep( - tool.Ifc.get(), template_rep, exclude=["IfcGeometricRepresentationContext"] - ) - return copied - except: - return None - def generate_opening_from_filling( self, filling: ifcopenshell.entity_instance, @@ -666,6 +540,16 @@ def _execute(self, context): booleans = ifcopenshell.api.geometry.add_boolean(tool.Ifc.get(), first_item, second_items, props.operator) rep_obj = tool.Geometry.get_geometry_props().representation_obj + if booleans: + # Users typically select two top-level items and expect the + # operand to be absorbed into the boolean, not remain as a + # standalone item alongside it. + representation = tool.Geometry.get_active_representation(rep_obj) + representation = ifcopenshell.util.representation.resolve_representation(representation) + second_items_set = set(second_items) + new_items = [i for i in representation.Items if i not in second_items_set] + if new_items: + representation.Items = new_items rep_element = tool.Ifc.get_entity(rep_obj) tool.Model.mark_manual_booleans(rep_element, booleans) tool.Geometry.reload_representation(rep_obj) diff --git a/src/bonsai/bonsai/bim/module/model/polyline.py b/src/bonsai/bonsai/bim/module/model/polyline.py index edd0b8981ad..be491e756b5 100644 --- a/src/bonsai/bonsai/bim/module/model/polyline.py +++ b/src/bonsai/bonsai/bim/module/model/polyline.py @@ -17,579 +17,16 @@ # along with Bonsai. If not, see . from __future__ import annotations + +from typing import Literal, Union + import bpy -import copy -import math -import bmesh import ifcopenshell -import ifcopenshell.api -import ifcopenshell.geom import ifcopenshell.util.unit -import ifcopenshell.util.element -import ifcopenshell.util.placement -import ifcopenshell.util.representation -import ifcopenshell.util.type -import mathutils.geometry -import bonsai.core.type -import bonsai.core.root -import bonsai.core.geometry -import bonsai.core.model as core +from mathutils import Vector + import bonsai.tool as tool -from math import pi, sin, cos, degrees, tan, radians -from mathutils import Vector, Matrix, Quaternion -from bonsai.bim.module.model.opening import FilledOpeningGenerator from bonsai.bim.module.model.decorator import PolylineDecorator -from bonsai.bim.module.geometry.decorator import ItemDecorator -from typing import Optional, Union, Literal, Any -from lark import Lark, Transformer - - -def create_bmesh_from_vertices(vertices, is_closed=False): - bm = bmesh.new() - - new_verts = [bm.verts.new(v) for v in vertices] - if is_closed: - new_edges = [bm.edges.new((new_verts[i], new_verts[i + 1])) for i in range(len(new_verts) - 1)] - new_edges.append( - bm.edges.new((new_verts[-1], new_verts[0])) - ) # Add an edge between the last an first point to make it closed. - else: - new_edges = [bm.edges.new((new_verts[i], new_verts[i + 1])) for i in range(len(new_verts) - 1)] - - bm.verts.index_update() - bm.edges.index_update() - return bm - - -def get_wall_preview_data(context, relating_type): - # Get properties from object type - model_props = tool.Model.get_model_props() - direction_sense = model_props.direction_sense - direction = 1 - if direction_sense == "NEGATIVE": - direction = -1 - - layers = tool.Model.get_material_layer_parameters(relating_type) - if not layers["thickness"]: - return - thickness = layers["thickness"] - thickness *= direction - - offset_type = model_props.offset_type_vertical - unit_scale = ifcopenshell.util.unit.calculate_unit_scale(tool.Ifc.get()) - offset = model_props.offset * unit_scale - - height = float(model_props.extrusion_depth) - rl = float(model_props.rl1) - x_angle = float(model_props.x_angle) - if x_angle > radians(90) or x_angle < radians(-90): - height *= -1 - angle_distance = height * tan(x_angle) - thickness *= 1 / cos(x_angle) - - data = {} - data["verts"] = [] - - # Verts - polyline_vertices = [] - polyline_props = tool.Model.get_polyline_props() - polyline_data = polyline_props.insertion_polyline - polyline_points = polyline_data[0].polyline_points if polyline_data else [] - if len(polyline_points) < 2: - data = [] - return - for point in polyline_points: - polyline_vertices.append(Vector((point.x, point.y, point.z))) - - is_closed = False - if ( - polyline_vertices[0].x == polyline_vertices[-1].x - and polyline_vertices[0].y == polyline_vertices[-1].y - and polyline_vertices[0].z == polyline_vertices[-1].z - ): - is_closed = True - polyline_vertices.pop(-1) # Remove the last point. The edges are going to inform that the shape is closed. - - bm_base = create_bmesh_from_vertices(polyline_vertices, is_closed) - base_vertices = tool.Cad.offset_edges(bm_base, offset) - offset_base_verts = tool.Cad.offset_edges(bm_base, thickness + offset) - top_vertices = tool.Cad.offset_edges(bm_base, angle_distance + offset) - offset_top_verts = tool.Cad.offset_edges(bm_base, angle_distance + thickness + offset) - if is_closed: - base_vertices.append(base_vertices[0]) - offset_base_verts.append(offset_base_verts[0]) - top_vertices.append(top_vertices[0]) - offset_top_verts.append(offset_top_verts[0]) - - if offset_base_verts is not None: - for v in base_vertices: - data["verts"].append((v.co.x, v.co.y, v.co.z + rl)) - - for v in offset_base_verts[::-1]: - data["verts"].append((v.co.x, v.co.y, v.co.z + rl)) - - for v in top_vertices: - data["verts"].append((v.co.x, v.co.y, v.co.z + rl + height)) - - for v in offset_top_verts[::-1]: - data["verts"].append((v.co.x, v.co.y, v.co.z + rl + height)) - - bm_base.free() - - # Edges and Tris - points = [] - side_edges_1 = [] - side_edges_2 = [] - base_edges = [] - - for i in range(len(data["verts"])): - points.append(Vector(data["verts"][i])) - - n = len(points) // 2 - bottom_side_1 = [[i, (i + 1) % (n)] for i in range((n - 1) // 2)] - bottom_side_2 = [[i, (i + 1) % (n)] for i in range(n // 2, n - 1)] - bottom_connections = [[i, n - i - 1] for i in range(n // 2)] - bottom_loop = bottom_connections + bottom_side_1 + bottom_side_2 - side_edges_1.extend(bottom_side_1) - side_edges_2.extend(bottom_side_2) - base_edges.extend(bottom_loop) - - upper_side_1 = [[i + n for i in edges] for edges in bottom_side_1] - upper_side_2 = [[i + n for i in edges] for edges in bottom_side_2] - upper_loop = [[i + n for i in edges] for edges in bottom_loop] - side_edges_1.extend(upper_side_1) - side_edges_2.extend(upper_side_2) - base_edges.extend(upper_loop) - - loops = [side_edges_1, side_edges_2, base_edges] - - data["edges"] = [] - data["tris"] = [] - for i, group in enumerate(loops): - bm = bmesh.new() - - new_verts = [bm.verts.new(v) for v in points] - new_edges = [bm.edges.new((new_verts[e[0]], new_verts[e[1]])) for e in group] - - bm.verts.index_update() - bm.edges.index_update() - - if i == 2: - new_faces = bmesh.ops.contextual_create(bm, geom=bm.edges) - new_faces = bmesh.ops.bridge_loops(bm, edges=bm.edges, use_pairs=True, use_cyclic=True) - - bm.verts.index_update() - bm.edges.index_update() - edges = [[v.index for v in e.verts] for e in bm.edges] - tris = [[l.vert.index for l in loop] for loop in bm.calc_loop_triangles()] - data["edges"].extend(edges) - data["tris"].extend(tris) - - data["edges"] = list(set(tuple(e) for e in data["edges"])) - data["tris"] = list(set(tuple(t) for t in data["tris"])) - - return data - - -def get_slab_preview_data(context, relating_type): - model_props = tool.Model.get_model_props() - x_angle = 0 if tool.Cad.is_x(model_props.x_angle, 0, tolerance=0.001) else model_props.x_angle - direction_sense = model_props.direction_sense - direction = 1 - if direction_sense == "NEGATIVE": - direction = -1 - - layers = tool.Model.get_material_layer_parameters(relating_type) - if not layers["thickness"]: - return - thickness = layers["thickness"] * abs(1 / cos(x_angle)) - thickness *= direction - - offset_type = model_props.offset_type_horizontal - unit_scale = ifcopenshell.util.unit.calculate_unit_scale(tool.Ifc.get()) - offset = model_props.offset * abs(1 / cos(x_angle)) * unit_scale - - data = {} - data["verts"] = [] - # Verts - polyline_vertices = [] - polyline_props = tool.Model.get_polyline_props() - polyline_data = polyline_props.insertion_polyline - polyline_points = polyline_data[0].polyline_points if polyline_data else [] - if len(polyline_points) < 3: - data = [] - return - for point in polyline_points: - polyline_vertices.append(Vector((point.x, point.y, point.z))) - if x_angle: - # Get vertices relative to the first polyline point as origin - local_vertices = [v - Vector(polyline_vertices[0]) for v in polyline_vertices] - # Make the transformation relative to the x_angle - transformed_vertices = [Vector((v.x, v.y * (1 / cos(x_angle)), v.z)) for v in local_vertices] - # Convert back to world origin - polyline_vertices = [v + Vector(polyline_vertices[0]) for v in transformed_vertices] - if offset != 0: - polyline_vertices = [v + Vector((0, 0, offset)) for v in polyline_vertices] - is_closed = True - if ( - polyline_vertices[0].x == polyline_vertices[-1].x - and polyline_vertices[0].y == polyline_vertices[-1].y - and polyline_vertices[0].z == polyline_vertices[-1].z - ): - polyline_vertices.pop(-1) # Remove the last point. The edges are going to inform that the shape is closed. - bm = create_bmesh_from_vertices(polyline_vertices, is_closed) - bm.verts.ensure_lookup_table() - if x_angle: - rot_mat = Matrix.Rotation(x_angle, 3, "X") - if abs(x_angle) > (pi / 2): - rot_mat = rot_mat @ Matrix.Scale(-1, 3, (0, 1, 0)) - bmesh.ops.rotate(bm, cent=Vector(bm.verts[0].co), verts=bm.verts, matrix=rot_mat) - new_faces = bmesh.ops.contextual_create(bm, geom=bm.edges) - new_faces = bmesh.ops.extrude_face_region(bm, geom=bm.edges[:] + bm.faces[:]) - new_verts = [e for e in new_faces["geom"] if isinstance(e, bmesh.types.BMVert)] - new_faces = bmesh.ops.translate(bm, verts=new_verts, vec=(0.0, 0.0, thickness)) - bm.verts.index_update() - bm.edges.index_update() - verts = [tuple(v.co) for v in bm.verts] - edges = [[v.index for v in e.verts] for e in bm.edges] - tris = [[loop.vert.index for loop in triangles] for triangles in bm.calc_loop_triangles()] - data["verts"] = verts - data["edges"] = edges - data["tris"] = tris - return data - - -def get_vertical_profile_preview_data( - context: bpy.types.Context, relating_type: ifcopenshell.entity_instance -) -> dict[str, Any]: - material = ifcopenshell.util.element.get_material(relating_type) - try: - profile = material.MaterialProfiles[0].Profile - except: - return {} - - model_props = tool.Model.get_model_props() - extrusion_depth = model_props.extrusion_depth - cardinal_point = model_props.cardinal_point - rot_mat = Quaternion() - if relating_type.is_a("IfcBeamType"): - y_rot = Quaternion((0.0, 1.0, 0.0), radians(90)) - z_rot = Quaternion((0.0, 0.0, 1.0), radians(90)) - rot_mat = y_rot @ z_rot - # Get profile data - settings = ifcopenshell.geom.settings() - settings.set("dimensionality", ifcopenshell.ifcopenshell_wrapper.CURVES_SURFACES_AND_SOLIDS) - shape = ifcopenshell.geom.create_shape(settings, profile) - - verts = shape.verts - if not verts: - raise RuntimeError(f"Profile shape has no vertices, it probably is invalid: '{profile}'.") - - edges = shape.edges - - grouped_verts = [[verts[i], verts[i + 1], 0] for i in range(0, len(verts), 3)] - grouped_edges = [[edges[i], edges[i + 1]] for i in range(0, len(edges), 2)] - - # Create offsets based on cardinal point - min_x = min(v[0] for v in grouped_verts) - max_x = max(v[0] for v in grouped_verts) - min_y = min(v[1] for v in grouped_verts) - max_y = max(v[1] for v in grouped_verts) - - x_offset = (max_x - min_x) / 2 - y_offset = (max_y - min_y) / 2 - - match cardinal_point: - case "1": - grouped_verts = [(v[0] - x_offset, v[1] + y_offset, v[2]) for v in grouped_verts] - case "2": - grouped_verts = [(v[0], v[1] + y_offset, v[2]) for v in grouped_verts] - case "3": - grouped_verts = [(v[0] + x_offset, v[1] + y_offset, v[2]) for v in grouped_verts] - case "4": - grouped_verts = [(v[0] - x_offset, v[1], v[2]) for v in grouped_verts] - case "5": - grouped_verts = [(v[0], v[1], v[2]) for v in grouped_verts] - case "6": - grouped_verts = [(v[0] + x_offset, v[1], v[2]) for v in grouped_verts] - case "7": - grouped_verts = [(v[0] - x_offset, v[1] - y_offset, v[2]) for v in grouped_verts] - case "8": - grouped_verts = [(v[0], v[1] - y_offset, v[2]) for v in grouped_verts] - case "9": - grouped_verts = [(v[0] + x_offset, v[1] - y_offset, v[2]) for v in grouped_verts] - - # Create extrusion bmesh - bm = bmesh.new() - - grouped_verts.append(grouped_verts[0]) # Close profile - new_verts = [bm.verts.new(v) for v in grouped_verts] - new_edges = [bm.edges.new((new_verts[i], new_verts[i + 1])) for i in range(len(grouped_verts) - 1)] - - bm.verts.index_update() - bm.edges.index_update() - - bmesh.ops.remove_doubles(bm, verts=bm.verts, dist=0.001) - - new_faces = bmesh.ops.contextual_create(bm, geom=bm.edges) - - new_faces = bmesh.ops.extrude_face_region(bm, geom=bm.faces, use_dissolve_ortho_edges=True) - new_verts = [e for e in new_faces["geom"] if isinstance(e, bmesh.types.BMVert)] - new_faces = bmesh.ops.translate(bm, verts=new_verts, vec=(0.0, 0.0, extrusion_depth)) - - bm.verts.index_update() - bm.edges.index_update() - tris = [[loop.vert.index for loop in triangles] for triangles in bm.calc_loop_triangles()] - - # Calculate rotation, mouse position, angle and cardinal point - polyline_props = tool.Model.get_polyline_props() - snap_prop = polyline_props.snap_mouse_point[0] - mouse_point = Vector((snap_prop.x, snap_prop.y, snap_prop.z)) - data = {} - - verts = [tuple(v.co) for v in bm.verts] - verts = [tuple(rot_mat @ Vector(v)) for v in verts] - verts = [tuple(Vector(v) + mouse_point) for v in verts] - min_z = min(v.co.z for v in bm.verts) - max_z = max(v.co.z for v in bm.verts) - # Add axis verts - verts.append(tuple(mouse_point)) - verts.append(tuple(mouse_point + Vector((0, 0, max_z)))) - # Add only profile edges - edges = [] - for edge in bm.edges: - if (edge.verts[0].co.z == min_z and edge.verts[1].co.z == min_z) or ( - edge.verts[0].co.z == max_z and edge.verts[1].co.z == max_z - ): - edges.append(edge) - # Add axis edge - edges = [(edge.verts[0].index, edge.verts[1].index) for edge in edges] - edges.append((len(verts) - 1, len(verts) - 2)) - data["verts"] = verts - data["edges"] = edges - data["tris"] = tris - - bm.free() - - return data - - -def get_horizontal_profile_preview_data( - context: bpy.types.Context, relating_type: ifcopenshell.entity_instance -) -> dict[str, Any]: - material = ifcopenshell.util.element.get_material(relating_type) - try: - profile_curve = material.MaterialProfiles[0].Profile - except: - return {} - - model_props = tool.Model.get_model_props() - cardinal_point = model_props.cardinal_point - - polyline_verts = [] - polyline_props = tool.Model.get_polyline_props() - polyline_data = polyline_props.insertion_polyline - polyline_points = polyline_data[0].polyline_points if polyline_data else [] - if len(polyline_points) < 2: - return {} - for point in polyline_points: - polyline_verts.append(Vector((point.x, point.y, point.z))) - polyline_edges = [(i, i + 1) for i in range(len(polyline_verts) - 1)] - - # Get profile shape - settings = ifcopenshell.geom.settings() - settings.set("dimensionality", ifcopenshell.ifcopenshell_wrapper.CURVES_SURFACES_AND_SOLIDS) - shape = ifcopenshell.geom.create_shape(settings, profile_curve) - - verts = shape.verts - if not verts: - raise RuntimeError(f"Profile shape has no vertices, it probably is invalid: '{profile_curve}'.") - - edges = shape.edges - - grouped_verts = [[verts[i], verts[i + 1], 0] for i in range(0, len(verts), 3)] - grouped_edges = [[edges[i], edges[i + 1]] for i in range(0, len(edges), 2)] - - # Create offsets based on cardinal point - min_x = min(v[0] for v in grouped_verts) - max_x = max(v[0] for v in grouped_verts) - min_y = min(v[1] for v in grouped_verts) - max_y = max(v[1] for v in grouped_verts) - - x_offset = (max_x - min_x) / 2 - y_offset = (max_y - min_y) / 2 - - match cardinal_point: - case "1": - grouped_verts = [(v[0] - x_offset, v[1] + y_offset, v[2]) for v in grouped_verts] - case "2": - grouped_verts = [(v[0], v[1] + y_offset, v[2]) for v in grouped_verts] - case "3": - grouped_verts = [(v[0] + x_offset, v[1] + y_offset, v[2]) for v in grouped_verts] - case "4": - grouped_verts = [(v[0] - x_offset, v[1], v[2]) for v in grouped_verts] - case "5": - grouped_verts = [(v[0], v[1], v[2]) for v in grouped_verts] - case "6": - grouped_verts = [(v[0] + x_offset, v[1], v[2]) for v in grouped_verts] - case "7": - grouped_verts = [(v[0] - x_offset, v[1] - y_offset, v[2]) for v in grouped_verts] - case "8": - grouped_verts = [(v[0], v[1] - y_offset, v[2]) for v in grouped_verts] - case "9": - grouped_verts = [(v[0] + x_offset, v[1] - y_offset, v[2]) for v in grouped_verts] - - data: dict[str, Any] = {} - data["verts"] = [] - data["edges"] = [] - data["tris"] = [] - - grouped_verts = [(v) for v in grouped_verts] - - all_bm = bmesh.new() - for i in range(len(polyline_verts) - 1): - mesh = bpy.data.meshes.new("TempMesh") - # Create the initial mesh from the profile verts - bm = create_bmesh_from_vertices(grouped_verts, is_closed=True) - bm.verts.ensure_lookup_table() - # Creates the clipping plane formed by two segments. - # The first one is for the profile start, based on the current and previous segment of the polyline. - # The second is for the profile end, based on the current and the next segment. - if i == 0: - d = (polyline_verts[i + 1] - polyline_verts[i]).normalized() - clip_start = d - else: - d1 = (polyline_verts[i] - polyline_verts[i - 1]).normalized() - d2 = (polyline_verts[i] - polyline_verts[i + 1]).normalized() - clip_start = (d1 - d2).normalized() - - if i == len(polyline_verts) - 2: - d = (polyline_verts[i + 1] - polyline_verts[i]).normalized() - clip_end = d - else: - d1 = (polyline_verts[i + 1] - polyline_verts[i]).normalized() - d2 = (polyline_verts[i + 1] - polyline_verts[i + 2]).normalized() - clip_end = (d1 - d2).normalized() - - # Rotates the profile face to the right direction - direction = polyline_verts[i + 1] - polyline_verts[i] - position = polyline_verts[i] - rotation_matrix = direction.to_track_quat("Z", "Y").to_matrix().to_4x4() - bmesh.ops.transform(bm, verts=bm.verts, matrix=rotation_matrix) - bmesh.ops.translate(bm, verts=bm.verts, vec=position) - bmesh.ops.translate(bm, verts=bm.verts, vec=-direction) - - # Extrude and move the new face - last_face = bmesh.ops.extrude_face_region(bm, geom=bm.edges[:] + bm.faces[:]) - new_verts = [e for e in last_face["geom"] if isinstance(e, bmesh.types.BMVert)] - bmesh.ops.translate(bm, verts=new_verts, vec=direction * 3) - # Apply the cutting planes - cut = bmesh.ops.bisect_plane( - bm, - geom=bm.verts[:] + bm.edges[:] + bm.faces[:], - plane_co=polyline_verts[i], - plane_no=clip_start, - clear_inner=True, - ) - bm.verts.index_update() - bm.edges.index_update() - cut = bmesh.ops.bisect_plane( - bm, - geom=bm.verts[:] + bm.edges[:] + bm.faces[:], - plane_co=polyline_verts[i + 1], - plane_no=clip_end, - clear_outer=True, - ) - - bm.to_mesh(mesh) - bm.free() - mesh.update() - all_bm.from_mesh(mesh) - bpy.data.meshes.remove(bpy.data.meshes["TempMesh"]) - - # It's necessary to add the mesh to an object to get the expected result. - mesh = bpy.data.meshes.new("TempMesh2") - all_bm.to_mesh(mesh) - all_bm.free() - obj = bpy.data.objects.new("TempObj", mesh) - bm = bmesh.new() - bm.from_mesh(obj.data) - bpy.data.meshes.remove(bpy.data.meshes["TempMesh2"]) - - verts = [tuple(v.co) for v in bm.verts] - edges = [[v.index for v in e.verts] for e in bm.edges] - tris = [[loop.vert.index for loop in triangles] for triangles in bm.calc_loop_triangles()] - data["verts"] = verts - data["edges"] = edges - data["tris"] = tris - bm.free() - return data - - -def get_generic_product_preview_data(context, relating_type): - model_props = tool.Model.get_model_props() - if relating_type.is_a("IfcDoorType"): - rl = float(model_props.rl1) - elif relating_type.is_a("IfcWindowType"): - rl = float(model_props.rl2) - else: - rl = 0 - polyline_props = tool.Model.get_polyline_props() - snap_prop = polyline_props.snap_mouse_point[0] - default_container_elevation = tool.Root.get_default_container_elevation() - mouse_point = Vector((snap_prop.x, snap_prop.y, default_container_elevation)) - snap_obj = bpy.data.objects.get(snap_prop.snap_object) - snap_element = tool.Ifc.get_entity(snap_obj) - rot_mat = Quaternion() - if relating_type.is_a() in ["IfcDoorType", "IfcWindowType"] and snap_element and snap_element.is_a("IfcWall"): - layers = tool.Model.get_material_layer_parameters(snap_element) - axes = tool.Model.get_wall_axis(snap_obj, layers=layers) - axis_base = axes["base"] - axis_side = axes["side"] - point_on_base_axis = tool.Cad.point_on_edge(mouse_point, axis_base) - point_on_side_axis = tool.Cad.point_on_edge(mouse_point, axis_side) - if (point_on_base_axis - mouse_point).length_squared <= (point_on_side_axis - mouse_point).length_squared: - # mouse is snapped to the base axis, the preview looks exactly like the placed door / window - rot_mat = snap_obj.matrix_world.to_quaternion() - else: - # mouse is snapped to the side axis, the preview is inverted, rotate it now and correct x position later - rot_mat = snap_obj.matrix_world.to_quaternion() @ Quaternion(Vector((0, 0, 1)), radians(180)) - - mouse_point.z = snap_obj.matrix_world.translation.z - - if snap_element and (container := ifcopenshell.util.element.get_container(snap_element)): - container_obj = tool.Ifc.get_object(container) - mouse_point.z = container_obj.location.z - - obj_type = tool.Ifc.get_object(relating_type) - - subcontexts = tool.Drawing.get_active_drawing_subcontexts() - if not subcontexts: - subcontexts = [("Model", "Body", "MODEL_VIEW")] - - active_context = tool.Geometry.get_active_representation_context(obj_type) - active_context_params = tool.Geometry.get_subcontext_parameters(active_context) - for subcontext in subcontexts: - if subcontext == active_context_params: - break - - representation = ifcopenshell.util.representation.get_representation(relating_type, *subcontext) - if representation: - bonsai.core.geometry.switch_representation( - tool.Ifc, - tool.Geometry, - obj_type, - representation, - ) - context.view_layer.update() - break - - if obj_type.data: - data = ItemDecorator.get_obj_data(obj_type) - data["verts"] = [tuple(obj_type.matrix_world.inverted() @ Vector(v)) for v in data["verts"]] - data["verts"] = [tuple(rot_mat @ (Vector((v[0], v[1], (v[2] + rl)))) + mouse_point) for v in data["verts"]] - - return data class PolylineOperator: @@ -759,22 +196,21 @@ def draw_instructions(self: bpy.types.Header, context: bpy.types.Context) -> Non context.workspace.status_text_set(draw_instructions) def handle_lock_axis(self, context: bpy.types.Context, event: bpy.types.Event) -> None: + angle_snap = tool.Snap.get_angle_snap_value(context) if event.value == "PRESS" and event.type == "A": self.tool_state.lock_axis = False if self.tool_state.lock_axis else True if self.tool_state.lock_axis: self.tool_state.snap_angle = self.input_ui.get_number_value("WORLD_ANGLE") - # Round to the closest 5 - self.tool_state.snap_angle = round(self.tool_state.snap_angle / 5) * 5 + self.tool_state.snap_angle = round(self.tool_state.snap_angle / angle_snap) * angle_snap if event.shift and event.type in {"WHEELUPMOUSE", "WHEELDOWNMOUSE"}: self.tool_state.lock_axis = True self.tool_state.snap_angle = self.input_ui.get_number_value("WORLD_ANGLE") - # Round to the closest 5 - self.tool_state.snap_angle = round(self.tool_state.snap_angle / 5) * 5 + self.tool_state.snap_angle = round(self.tool_state.snap_angle / angle_snap) * angle_snap if event.type in {"WHEELUPMOUSE"}: - self.tool_state.snap_angle += 5 + self.tool_state.snap_angle += angle_snap else: - self.tool_state.snap_angle -= 5 + self.tool_state.snap_angle -= angle_snap self.handle_mouse_move(context, event) detected_snaps = tool.Snap.detect_snapping_points(context, event, self.objs_2d_bbox, self.tool_state) self.snapping_points = tool.Snap.select_snapping_points(context, event, self.tool_state, detected_snaps) @@ -985,38 +421,7 @@ def handle_mouse_move( tool.Polyline.calculate_x_y_and_z(context, self.input_ui, self.tool_state) tool.Blender.update_viewport() - return {"RUNNING_MODAL"} - - def get_product_preview_data(self, context: bpy.types.Context, relating_type: ifcopenshell.entity_instance) -> None: - if tool.Model.get_usage_type(relating_type) == "PROFILE": - if relating_type.is_a() in {"IfcColumnType", "IfcPileType"}: - data = get_vertical_profile_preview_data(context, relating_type) - else: - data = get_horizontal_profile_preview_data(context, relating_type) - elif tool.Model.get_usage_type(relating_type) == "LAYER2": - data = get_wall_preview_data(context, relating_type) - elif tool.Model.get_usage_type(relating_type) == "LAYER3": - data = get_slab_preview_data(context, relating_type) - else: - data = get_generic_product_preview_data(context, relating_type) - - # Update properties so it can be used by the decorator - props = tool.Model.get_product_preview_props() - props.verts.clear() - props.edges.clear() - props.tris.clear() - if not data: - return - - for vert in data["verts"]: - v = props.verts.add() - v.value_3d = vert - for edge in data["edges"]: - e = props.edges.add() - e.value_2d = edge - for tri in data["tris"]: - t = props.tris.add() - t.value_3d = tri + return {"RUNNING_MODAL"} def set_offset(self, context: bpy.types.Context, relating_type: ifcopenshell.entity_instance) -> None: props = tool.Model.get_model_props() @@ -1056,6 +461,7 @@ def invoke(self, context: bpy.types.Context, event: bpy.types.Event) -> None: self.tool_state.axis_method = None self.tool_state.plane_method = None self.tool_state.mode = "Mouse" + tool.Raycast.clear_snap_objs() self.visible_objs = tool.Raycast.get_visible_objects(context) for obj in self.visible_objs: if bbox_2d := tool.Raycast.get_on_screen_2d_bounding_boxes(context, obj): diff --git a/src/bonsai/bonsai/bim/module/model/product.py b/src/bonsai/bonsai/bim/module/model/product.py index c08ff9131b3..75f5441827a 100644 --- a/src/bonsai/bonsai/bim/module/model/product.py +++ b/src/bonsai/bonsai/bim/module/model/product.py @@ -18,38 +18,38 @@ # # pyright: reportUnnecessaryTypeIgnoreComment=error -import bpy +import json +from typing import TYPE_CHECKING, Any, Literal, get_args + import bmesh -import mathutils -import numpy as np +import bpy import ifcopenshell -import ifcopenshell.api import ifcopenshell.api.geometry import ifcopenshell.api.system -import ifcopenshell.util.system import ifcopenshell.util.element import ifcopenshell.util.placement import ifcopenshell.util.representation import ifcopenshell.util.shape_builder +import ifcopenshell.util.system import ifcopenshell.util.type import ifcopenshell.util.unit -import bonsai.tool as tool +from bpy_extras.object_utils import AddObjectHelper +from mathutils import Matrix, Vector + import bonsai.core.aggregate -import bonsai.core.type -import bonsai.core.root import bonsai.core.geometry import bonsai.core.model as core +import bonsai.core.root import bonsai.core.spatial -from . import wall, slab, profile, mep -from bonsai.bim.ifc import IfcStore +import bonsai.core.type +import bonsai.tool as tool from bonsai.bim.helper import get_enum_items +from bonsai.bim.ifc import IfcStore from bonsai.bim.module.model.data import AuthoringData -from bonsai.bim.module.model.polyline import PolylineOperator from bonsai.bim.module.model.decorator import PolylineDecorator, ProductDecorator -from mathutils import Vector, Matrix -from bpy_extras.object_utils import AddObjectHelper -import json -from typing import Any, Union, Optional, Literal, get_args, assert_never, TYPE_CHECKING +from bonsai.bim.module.model.polyline import PolylineOperator + +from . import mep, profile, slab, wall class AddEmptyType(bpy.types.Operator, AddObjectHelper): @@ -249,8 +249,6 @@ def _modal(self, context, event): if event.value == "RELEASE" and event.type == "LEFTMOUSE": self.create_occurrence(context, event) - self.get_product_preview_data(context, self.relating_type) - cancel = self.handle_cancelation(context, event) if cancel is not None: ProductDecorator.uninstall() @@ -379,7 +377,7 @@ def _execute(self, context): ifc_class=instance_class, should_add_representation=False, ) - bonsai.core.type.assign_type(tool.Ifc, tool.Type, element=element, type=relating_type) + bonsai.core.type.assign_type(tool.Ifc, tool.Model, tool.Type, element=element, type=relating_type) rprops = tool.Root.get_root_props() ifc_context = None @@ -432,7 +430,7 @@ def _execute(self, context): ) element = tool.Ifc.get_entity(obj) - bonsai.core.type.assign_type(tool.Ifc, tool.Type, element=element, type=relating_type) + bonsai.core.type.assign_type(tool.Ifc, tool.Model, tool.Type, element=element, type=relating_type) if existing_context: representation = ifcopenshell.util.representation.get_representation(element, existing_context) @@ -469,7 +467,7 @@ def _execute(self, context): parent = ifcopenshell.util.element.get_container(building_element) if parent: bonsai.core.spatial.assign_container( - tool.Ifc, tool.Collector, tool.Spatial, container=parent, element_obj=obj + tool.Ifc, tool.Collector, tool.Spatial, container=parent, objs=[obj] ) # set occurrences properties for the types defined with modifiers @@ -492,7 +490,7 @@ def _execute(self, context): else: if self.container_obj: bonsai.core.spatial.assign_container( - tool.Ifc, tool.Collector, tool.Spatial, container=self.container, element_obj=obj + tool.Ifc, tool.Collector, tool.Spatial, container=self.container, objs=[obj] ) if props.rl_mode == "BOTTOM": obj.location.z = self.container_obj.location.z - tool.Blender.get_object_bounding_box(obj)["min_z"] @@ -547,7 +545,7 @@ class ChangeTypePage(bpy.types.Operator, tool.Ifc.Operator): bl_idname = "bim.change_type_page" bl_label = "Change Type Page" bl_options = {"REGISTER"} - page: bpy.props.IntProperty() # pyright: ignore[reportRedeclaration] + page: bpy.props.IntProperty() if TYPE_CHECKING: page: int @@ -696,10 +694,14 @@ def generate_box(usecase_path: str, ifc_file: ifcopenshell.file, settings: dict[ new_settings = settings.copy() new_settings["context"] = box_context - new_box = ifcopenshell.api.geometry.add_representation(ifc_file, should_run_listeners=False, **new_settings) + new_box = ifcopenshell.api.geometry.add_representation( + ifc_file, + should_run_listeners=False, # ty:ignore[unknown-argument] + **new_settings, + ) ifcopenshell.api.geometry.assign_representation( ifc_file, - should_run_listeners=False, + should_run_listeners=False, # ty:ignore[unknown-argument] product=product, representation=new_box, ) diff --git a/src/bonsai/bonsai/bim/module/model/profile.py b/src/bonsai/bonsai/bim/module/model/profile.py index ecc1b861635..e5c0991e8ea 100644 --- a/src/bonsai/bonsai/bim/module/model/profile.py +++ b/src/bonsai/bonsai/bim/module/model/profile.py @@ -16,38 +16,40 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . -import bpy import copy -import bmesh -import mathutils.geometry +from math import atan2, degrees, pi, radians +from typing import TYPE_CHECKING, Any, Literal, Optional, Union + +import bpy import ifcopenshell -import ifcopenshell.api import ifcopenshell.api.geometry import ifcopenshell.api.pset import ifcopenshell.api.type -import ifcopenshell.util.type -import ifcopenshell.util.unit import ifcopenshell.util.element import ifcopenshell.util.placement import ifcopenshell.util.representation -import bonsai.tool as tool -import bonsai.core.type +import ifcopenshell.util.type +import ifcopenshell.util.unit +import mathutils.geometry +from mathutils import Matrix, Vector + import bonsai.core.geometry import bonsai.core.material import bonsai.core.root +import bonsai.tool as tool from bonsai.bim.ifc import IfcStore -from math import pi, degrees, atan2 -from mathutils import Vector, Matrix -from bonsai.bim.module.model.decorator import ProfileDecorator, PolylineDecorator, ProductDecorator +from bonsai.bim.module.model.decorator import ( + PolylineDecorator, + ProductDecorator, + ProfileDecorator, +) from bonsai.bim.module.model.polyline import PolylineOperator -from typing import Union, Any, Optional, Literal - ProfileFrom2PointsReturn = Union[dict[str, Any], None] class DumbProfileGenerator: - def __init__(self, relating_type): + def __init__(self, relating_type: ifcopenshell.entity_instance): self.relating_type = relating_type self.unit_scale = ifcopenshell.util.unit.calculate_unit_scale(tool.Ifc.get()) @@ -190,8 +192,8 @@ def create_profile_from_2_points( if should_round: # Round to nearest 50mm (yes, metric for now) self.length = 0.05 * round(length / 0.05) - # Round to nearest 5 degrees - nearest_degree = (pi / 180) * 5 + angle_snap = tool.Snap.get_angle_snap_value(bpy.context) + nearest_degree = radians(angle_snap) self.rotation = nearest_degree * round(self.rotation / nearest_degree) self.location = coords[0] data["obj"] = self.create_profile() @@ -199,7 +201,7 @@ def create_profile_from_2_points( class DumbProfileRegenerator: - def regenerate_from_profile_def(self, profile): + def regenerate_from_profile_def(self, profile: ifcopenshell.entity_instance) -> None: self.file = tool.Ifc.get() objs = [] if not profile: @@ -219,7 +221,7 @@ def regenerate_from_profile_def(self, profile): for element in self.get_element_types_using_profile(profile): tool.Model.mark_thumbnail_for_update(element) - def regenerate_from_profile(self, usecase_path, ifc_file, settings): + def regenerate_from_profile(self, usecase_path: str, ifc_file: ifcopenshell.file, settings: dict[str, Any]) -> None: self.file = ifc_file objs = [] profile = settings["profile"].Profile @@ -231,7 +233,7 @@ def regenerate_from_profile(self, usecase_path, ifc_file, settings): objs.append(obj) DumbProfileRecalculator().recalculate(objs) - def get_elements_using_profile(self, profile): + def get_elements_using_profile(self, profile: ifcopenshell.entity_instance) -> list[ifcopenshell.entity_instance]: results = [] profile_sets = [ mp.ToMaterialProfileSet[0] for mp in self.file.get_inverse(profile) if mp.is_a("IfcMaterialProfile") @@ -250,7 +252,9 @@ def get_elements_using_profile(self, profile): results.extend(rel.RelatedObjects) return results - def get_element_types_using_profile(self, profile): + def get_element_types_using_profile( + self, profile: ifcopenshell.entity_instance + ) -> list[ifcopenshell.entity_instance]: results = [] profile_sets = [ mp.ToMaterialProfileSet[0] for mp in self.file.get_inverse(profile) if mp.is_a("IfcMaterialProfile") @@ -262,33 +266,23 @@ def get_element_types_using_profile(self, profile): results.extend(inverse.RelatedObjects) return results - def regenerate_from_type(self, usecase_path, ifc_file, settings): - relating_type = settings["relating_type"] - - new_material = ifcopenshell.util.element.get_material(relating_type) - if not new_material or not new_material.is_a("IfcMaterialProfileSet"): - return - - for related_object in settings["related_objects"]: - self._regenerate_from_type(related_object) - - def _regenerate_from_type(self, related_object: ifcopenshell.entity_instance) -> None: - obj = tool.Ifc.get_object(related_object) - if not obj or not tool.Geometry.get_active_representation(obj): - return - DumbProfileRecalculator().recalculate([obj]) - class ExtendProfile(bpy.types.Operator, tool.Ifc.Operator): bl_idname = "bim.extend_profile" bl_label = "Extend Profile" bl_options = {"REGISTER", "UNDO"} - join_type: bpy.props.StringProperty() + join_type: bpy.props.EnumProperty( + items=[("-", "Unjoin", ""), ("L", "L", ""), ("V", "V", ""), ("T", "T", "")], + default="-", + ) + + if TYPE_CHECKING: + join_type: Literal["-", "L", "V", "T"] def _execute(self, context): selected_objs = context.selected_objects joiner = DumbProfileJoiner() - if not self.join_type: + if self.join_type == "-": for obj in selected_objs: joiner.unjoin(obj) return {"FINISHED"} @@ -640,11 +634,15 @@ def join(self, profile1, profile2, connection1, connection2, is_relating=True, d if connection1 == "ATEND": if tool.Cad.is_x(abs(xy_angle), (0, 90, 180), tolerance=0.001) and is_orthogonal: plane = self.get_profile_plane(profile2, furthest_plane) - intersect = mathutils.geometry.intersect_line_plane(*axis1, plane.translation, plane.col[2].to_3d()) + intersect = mathutils.geometry.intersect_line_plane( + axis1[0], axis1[1], plane.translation, plane.col[2].to_3d() + ) self.body[1] = intersect else: plane = self.get_profile_plane(profile2, furthest_plane, z_inwards=False) - intersect = mathutils.geometry.intersect_line_plane(*axis1, plane.translation, plane.col[2].to_3d()) + intersect = mathutils.geometry.intersect_line_plane( + axis1[0], axis1[1], plane.translation, plane.col[2].to_3d() + ) max_dim = self.get_max_bound_box_dimension(profile1) self.body[1] = intersect + profile1.matrix_world.to_quaternion() @ Vector((0, 0, max_dim)) @@ -687,11 +685,15 @@ def join(self, profile1, profile2, connection1, connection2, is_relating=True, d elif connection1 == "ATSTART": if tool.Cad.is_x(abs(xy_angle), (0, 90, 180), tolerance=0.001) and is_orthogonal: plane = self.get_profile_plane(profile2, furthest_plane) - intersect = mathutils.geometry.intersect_line_plane(*axis1, plane.translation, plane.col[2].to_3d()) + intersect = mathutils.geometry.intersect_line_plane( + axis1[0], axis1[1], plane.translation, plane.col[2].to_3d() + ) self.body[0] = intersect else: plane = self.get_profile_plane(profile2, furthest_plane, z_inwards=False) - intersect = mathutils.geometry.intersect_line_plane(*axis1, plane.translation, plane.col[2].to_3d()) + intersect = mathutils.geometry.intersect_line_plane( + axis1[0], axis1[1], plane.translation, plane.col[2].to_3d() + ) max_dim = self.get_max_bound_box_dimension(profile1) self.body[0] = intersect - profile1.matrix_world.to_quaternion() @ Vector((0, 0, max_dim)) @@ -735,7 +737,9 @@ def join(self, profile1, profile2, connection1, connection2, is_relating=True, d if connection1 == "ATEND": if tool.Cad.is_x(abs(xy_angle), (0, 90, 180), tolerance=0.001) and is_orthogonal: plane = self.get_profile_plane(profile2, furthest_plane if is_relating else closest_plane) - intersect = mathutils.geometry.intersect_line_plane(*axis1, plane.translation, plane.col[2].to_3d()) + intersect = mathutils.geometry.intersect_line_plane( + axis1[0], axis1[1], plane.translation, plane.col[2].to_3d() + ) self.body[1] = intersect else: plane = self.get_profile_plane( @@ -743,7 +747,9 @@ def join(self, profile1, profile2, connection1, connection2, is_relating=True, d furthest_plane if is_relating else closest_plane, z_inwards=False if is_relating else True, ) - intersect = mathutils.geometry.intersect_line_plane(*axis1, plane.translation, plane.col[2].to_3d()) + intersect = mathutils.geometry.intersect_line_plane( + axis1[0], axis1[1], plane.translation, plane.col[2].to_3d() + ) max_dim = self.get_max_bound_box_dimension(profile1) self.body[1] = intersect + profile1.matrix_world.to_quaternion() @ Vector((0, 0, max_dim)) self.clippings.append( @@ -756,7 +762,9 @@ def join(self, profile1, profile2, connection1, connection2, is_relating=True, d elif connection1 == "ATSTART": if tool.Cad.is_x(abs(xy_angle), (0, 90, 180), tolerance=0.001) and is_orthogonal: plane = self.get_profile_plane(profile2, furthest_plane if is_relating else closest_plane) - intersect = mathutils.geometry.intersect_line_plane(*axis1, plane.translation, plane.col[2].to_3d()) + intersect = mathutils.geometry.intersect_line_plane( + axis1[0], axis1[1], plane.translation, plane.col[2].to_3d() + ) self.body[0] = intersect else: plane = self.get_profile_plane( @@ -764,7 +772,9 @@ def join(self, profile1, profile2, connection1, connection2, is_relating=True, d furthest_plane if is_relating else closest_plane, z_inwards=False if is_relating else True, ) - intersect = mathutils.geometry.intersect_line_plane(*axis1, plane.translation, plane.col[2].to_3d()) + intersect = mathutils.geometry.intersect_line_plane( + axis1[0], axis1[1], plane.translation, plane.col[2].to_3d() + ) max_dim = self.get_max_bound_box_dimension(profile1) self.body[0] = intersect - profile1.matrix_world.to_quaternion() @ Vector((0, 0, max_dim)) self.clippings.append( @@ -1142,8 +1152,13 @@ def create_profiles_from_polyline(self, context: bpy.types.Context) -> Union[set MEPGenerator().setup_ports(profile1["obj"]) else: + connect_IfcFlowSegments = tool.Ifc.get_entity(profiles[0]["obj"]).is_a("IfcFlowSegment") for profile1, profile2 in zip(profiles[:-1], profiles[1:]): DumbProfileJoiner().join_V(profile2["obj"], profile1["obj"]) + if connect_IfcFlowSegments: + bpy.ops.bim.mep_connect_elements( + obj1_name=profile1["obj"].name, obj2_name=profile2["obj"].name + ) def modal(self, context, event): return IfcStore.execute_ifc_operator(self, context, event, method="MODAL") @@ -1189,11 +1204,8 @@ def _modal(self, context, event): return {"FINISHED"} self.handle_keyboard_input(context, event) - self.handle_inserting_polyline(context, event) - self.get_product_preview_data(context, self.relating_type) - cancel = self.handle_cancelation(context, event) if cancel is not None: ProductDecorator.uninstall() diff --git a/src/bonsai/bonsai/bim/module/model/prop.py b/src/bonsai/bonsai/bim/module/model/prop.py index 5066ceb9b22..ff6ea961309 100644 --- a/src/bonsai/bonsai/bim/module/model/prop.py +++ b/src/bonsai/bonsai/bim/module/model/prop.py @@ -16,22 +16,30 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . +import math +from collections.abc import Callable +from math import pi, radians +from typing import TYPE_CHECKING, Any, Literal, Optional, Union, get_args + import bpy -import ifcopenshell import ifcopenshell.util.element +from bpy.types import NodeTree, PropertyGroup +from mathutils import Vector + import bonsai.tool as tool -import math -from bonsai.bim.prop import ObjProperty +from bonsai.bim.module.drawing.decoration import CutDecorator from bonsai.bim.module.model.data import AuthoringData -from bpy.types import PropertyGroup, NodeTree -from math import pi, radians -from bonsai.bim.module.model.decorator import WallAxisDecorator, SlabDirectionDecorator, BoundingBoxDecorator +from bonsai.bim.module.model.decorator import ( + BoundingBoxDecorator, + SlabDirectionDecorator, + WallAxisDecorator, +) from bonsai.bim.module.model.door import update_door_modifier_bmesh from bonsai.bim.module.model.window import update_window_modifier_bmesh -from bonsai.bim.module.drawing.decoration import CutDecorator -from typing import TYPE_CHECKING, Literal, get_args, Union, Any, Optional -from collections.abc import Callable -from mathutils import Vector +from bonsai.bim.prop import ObjProperty + +if TYPE_CHECKING: + import sverchok.node_tree def get_ifc_class(self: "BIMModelProperties", context: bpy.types.Context) -> list[tuple[str, str, str]]: @@ -378,11 +386,6 @@ class BIMArrayProperties(PropertyGroup): name="Method", default="OFFSET", ) - sync_children: bpy.props.BoolProperty( - name="Sync Children", - description="Regenerate all children based on the parent object", - default=False, - ) relating_array_object: bpy.props.PointerProperty( type=bpy.types.Object, name="Copy Array Properties", @@ -730,6 +733,9 @@ def update_total_length_from_treads(self) -> None: class BIMSverchokProperties(PropertyGroup): node_group: bpy.props.PointerProperty(name="Node Group", type=NodeTree) + if TYPE_CHECKING: + node_group: bpy.types.NodeTree | None + def window_type_prop_update(self, context): number_of_panels, panels_data = self.window_types_panels[self.window_type] @@ -1694,27 +1700,20 @@ class ProductPreviewItem(PropertyGroup): value_2d: tuple[float, float] -class BIMProductPreviewProperties(PropertyGroup): - verts: bpy.props.CollectionProperty(type=ProductPreviewItem) - edges: bpy.props.CollectionProperty(type=ProductPreviewItem) - tris: bpy.props.CollectionProperty(type=ProductPreviewItem) - - if TYPE_CHECKING: - verts: bpy.types.bpy_prop_collection_idprop[ProductPreviewItem] - edges: bpy.types.bpy_prop_collection_idprop[ProductPreviewItem] - tris: bpy.types.bpy_prop_collection_idprop[ProductPreviewItem] - - def update_is_editing(self: "BIMExternalParametricGeometryProperties", context: bpy.types.Context) -> None: if self.is_editing: return + assert isinstance(self.id_data, bpy.types.Object) tool.Model.clean_up_parametric_geometry(self.id_data) - del self["is_editing"] - del self["geo_nodes"] + self.property_unset("is_editing") + self.property_unset("geo_nodes") + self.property_unset("sverchok_nodes") def update_geo_nodes(self: "BIMExternalParametricGeometryProperties", context: bpy.types.Context) -> None: + assert isinstance(self.id_data, bpy.types.Object) + if self.geo_nodes: tool.Model.setup_parametric_geometry(self.id_data) return @@ -1725,6 +1724,10 @@ def update_geo_nodes(self: "BIMExternalParametricGeometryProperties", context: b del self["geo_nodes"] +def poll_sverchok_nodes(self: "BIMExternalParametricGeometryProperties", node_tree: bpy.types.NodeTree) -> bool: + return node_tree.bl_idname == "SverchCustomTreeType" + + class BIMExternalParametricGeometryProperties(bpy.types.PropertyGroup): is_editing: bpy.props.BoolProperty( name="Is Editing Paramteric Geometry", @@ -1732,6 +1735,13 @@ class BIMExternalParametricGeometryProperties(bpy.types.PropertyGroup): default=False, update=update_is_editing, ) + geometry_source: bpy.props.EnumProperty( + name="Geometry Source", + items=[ + ("GEONODES", "Geometry Nodes", ""), + ("IFCSVERCHOK", "IFC Sverchok", ""), + ], + ) geo_nodes: bpy.props.PointerProperty( name="Geometry Nodes", description="Geometry nodes tree to use as a source for representation.", @@ -1740,6 +1750,15 @@ class BIMExternalParametricGeometryProperties(bpy.types.PropertyGroup): poll=lambda self, node_tree: not node_tree.name.startswith("BBIM_EPG"), ) + sverchok_nodes: bpy.props.PointerProperty( + name="Sverchok Nodes", + description="Sverchok node tree to use as a source for representation.", + type=bpy.types.NodeTree, + poll=poll_sverchok_nodes, + ) + if TYPE_CHECKING: is_editing: bool + geometry_source: Literal["GEONODES", "IFCSVERCHOK"] geo_nodes: Union[bpy.types.GeometryNodeTree, None] + sverchok_nodes: Union[sverchok.node_tree.SverchCustomTree, None] diff --git a/src/bonsai/bonsai/bim/module/model/railing.py b/src/bonsai/bonsai/bim/module/model/railing.py index 4f6fc348f0b..7ca66d8dbc7 100644 --- a/src/bonsai/bonsai/bim/module/model/railing.py +++ b/src/bonsai/bonsai/bim/module/model/railing.py @@ -17,24 +17,24 @@ # along with Bonsai. If not, see . -import bpy +import json +from typing import Any + import bmesh +import bpy import ifcopenshell -import ifcopenshell.api import ifcopenshell.api.geometry import ifcopenshell.api.pset import ifcopenshell.util.representation import ifcopenshell.util.unit -import bonsai.core.root +from mathutils import Vector + import bonsai.core.geometry +import bonsai.core.root import bonsai.tool as tool from bonsai.bim.module.model.data import RailingData, refresh from bonsai.bim.module.model.decorator import ProfileDecorator -from mathutils import Vector -import json -from typing import Any - # reference: # https://ifc43-docs.standards.buildingsmart.org/IFC/RELEASE/IFC4x3/HTML/lexical/IfcRailing.htm # https://ifc43-docs.standards.buildingsmart.org/IFC/RELEASE/IFC4x3/HTML/lexical/IfcRailingType.htm diff --git a/src/bonsai/bonsai/bim/module/model/roof.py b/src/bonsai/bonsai/bim/module/model/roof.py index daf41b86dd9..e1f7903299b 100644 --- a/src/bonsai/bonsai/bim/module/model/roof.py +++ b/src/bonsai/bonsai/bim/module/model/roof.py @@ -16,27 +16,25 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . -import bpy -import bmesh +import json +from math import cos, pi, radians, tan +from typing import Any, Literal, Union +import bmesh +import bpy import ifcopenshell -import ifcopenshell.api import ifcopenshell.api.pset import ifcopenshell.util.representation import ifcopenshell.util.unit +import shapely +from bpypolyskel import bpypolyskel +from mathutils import Quaternion, Vector + import bonsai.core.root import bonsai.tool as tool from bonsai.bim.module.model.data import RoofData, refresh from bonsai.bim.module.model.decorator import ProfileDecorator -import json -from math import cos, tan, pi, radians -from mathutils import Vector, Matrix, Quaternion -import mathutils.geometry -from bpypolyskel import bpypolyskel -import shapely -from typing import Literal, Union, Any - # reference: # https://ifc43-docs.standards.buildingsmart.org/IFC/RELEASE/IFC4x3/HTML/lexical/IfcRoof.htm # https://ifc43-docs.standards.buildingsmart.org/IFC/RELEASE/IFC4x3/HTML/lexical/IfcRoofType.htm diff --git a/src/bonsai/bonsai/bim/module/model/slab.py b/src/bonsai/bonsai/bim/module/model/slab.py index ddc7c1d9a86..58a353ab281 100644 --- a/src/bonsai/bonsai/bim/module/model/slab.py +++ b/src/bonsai/bonsai/bim/module/model/slab.py @@ -16,11 +16,11 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . -import bpy import json -import bmesh +from math import cos, pi + +import bpy import ifcopenshell -import ifcopenshell.api import ifcopenshell.api.geometry import ifcopenshell.api.material import ifcopenshell.api.pset @@ -28,18 +28,20 @@ import ifcopenshell.util.element import ifcopenshell.util.placement import ifcopenshell.util.representation -import ifcopenshell.util.unit import ifcopenshell.util.type -import bonsai.core.type +import ifcopenshell.util.unit +from mathutils import Matrix, Vector + import bonsai.core.geometry import bonsai.core.root import bonsai.tool as tool from bonsai.bim.ifc import IfcStore -from math import cos, pi -from mathutils import Vector, Matrix -from bonsai.bim.module.model.decorator import ProfileDecorator, PolylineDecorator, ProductDecorator +from bonsai.bim.module.model.decorator import ( + PolylineDecorator, + ProductDecorator, + ProfileDecorator, +) from bonsai.bim.module.model.polyline import PolylineOperator -from typing import Optional class DumbSlabGenerator: @@ -236,38 +238,6 @@ def regenerate_from_layer_set(self, layer_set: ifcopenshell.entity_instance) -> for element in rel.RelatedObjects: self.change_thickness(element, total_thickness) - def regenerate_from_type(self, usecase_path, ifc_file, settings): - relating_type = settings["relating_type"] - - new_material = ifcopenshell.util.element.get_material(relating_type) - if not new_material or not new_material.is_a("IfcMaterialLayerSet"): - return - - parametric = ifcopenshell.util.element.get_psets(settings["relating_type"]).get("EPset_Parametric") - layer_set_direction = None - if parametric: - layer_set_direction = parametric.get("LayerSetDirection", layer_set_direction) - new_thickness = sum([l.LayerThickness for l in new_material.MaterialLayers]) - - self.unit_scale = ifcopenshell.util.unit.calculate_unit_scale(ifc_file) - for related_object in settings["related_objects"]: - self._regenerate_from_type(related_object, layer_set_direction, new_thickness) - - def _regenerate_from_type( - self, related_object: ifcopenshell.entity_instance, layer_set_direction: Optional[str], new_thickness: float - ) -> None: - obj = tool.Ifc.get_object(related_object) - if not obj or not tool.Geometry.get_active_representation(obj): - return - - material = ifcopenshell.util.element.get_material(related_object) - if not material or not material.is_a("IfcMaterialLayerSetUsage"): - return - if layer_set_direction: - material.LayerSetDirection = layer_set_direction - if material.LayerSetDirection == "AXIS3": - self.change_thickness(related_object, new_thickness) - def regenerate_from_occurence(self, element, material_set_usage): self.unit_scale = ifcopenshell.util.unit.calculate_unit_scale(tool.Ifc.get()) layer_set = material_set_usage.ForLayerSet @@ -277,6 +247,7 @@ def regenerate_from_occurence(self, element, material_set_usage): self.change_thickness(element, total_thickness) def change_thickness(self, element: ifcopenshell.entity_instance, thickness: float) -> None: + self.unit_scale = ifcopenshell.util.unit.calculate_unit_scale(tool.Ifc.get()) if tool.Model.get_usage_type(element) != "LAYER3": return layer_params = tool.Model.get_material_layer_parameters(element) @@ -657,6 +628,8 @@ def _execute(self, context): existing_x_angle = tool.Model.get_existing_x_angle(extrusion) layer_params = tool.Model.get_material_layer_parameters(element) + # TODO: review #7537 properly, this is a quick fix but something doesn't seem right. + original_rotation_x = 0 if extrusion.Position: position = Matrix(ifcopenshell.util.placement.get_axis2placement(extrusion.Position).tolist()) position.translation *= self.unit_scale @@ -706,6 +679,7 @@ def _execute(self, context): extrusion = tool.Model.get_extrusion(body) existing_x_angle = tool.Model.get_existing_x_angle(extrusion) layer_params = tool.Model.get_material_layer_parameters(element) + if extrusion.Position: position = Matrix(ifcopenshell.util.placement.get_axis2placement(extrusion.Position).tolist()) position.translation *= self.unit_scale @@ -976,11 +950,8 @@ def _modal(self, context, event): return {"FINISHED"} self.handle_keyboard_input(context, event) - self.handle_inserting_polyline(context, event) - self.get_product_preview_data(context, self.relating_type) - cancel = self.handle_cancelation(context, event) if cancel is not None: ProductDecorator.uninstall() diff --git a/src/bonsai/bonsai/bim/module/model/space.py b/src/bonsai/bonsai/bim/module/model/space.py index aeebea071b3..baa74013587 100644 --- a/src/bonsai/bonsai/bim/module/model/space.py +++ b/src/bonsai/bonsai/bim/module/model/space.py @@ -18,8 +18,9 @@ import bpy -import bonsai.tool as tool + import bonsai.core.spatial as core +import bonsai.tool as tool class GenerateSpace(bpy.types.Operator, tool.Ifc.Operator): diff --git a/src/bonsai/bonsai/bim/module/model/stair.py b/src/bonsai/bonsai/bim/module/model/stair.py index 91ddeccbc3e..87152c645b7 100644 --- a/src/bonsai/bonsai/bim/module/model/stair.py +++ b/src/bonsai/bonsai/bim/module/model/stair.py @@ -16,25 +16,31 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . -import bpy import json + import bmesh +import bpy import ifcopenshell import ifcopenshell.api.pset import ifcopenshell.util.element -import ifcopenshell.util.representation import ifcopenshell.util.unit +from mathutils import Matrix, Vector + import bonsai.core.root import bonsai.tool as tool from bonsai.bim.module.drawing import gizmos as gizmo from bonsai.bim.module.drawing.gizmos import DimensionGizmoConfig -from bonsai.tool.numeric_input import IntegerInputState, run_integer_input_modal, update_header -from mathutils import Vector, Matrix +from bonsai.tool.numeric_input import ( + IntegerInputState, + run_integer_input_modal, + update_header, +) V_ = tool.Blender.V_ +from typing import TYPE_CHECKING + from bmesh.types import BMVert from bpy.props import IntProperty -from typing import get_args, TYPE_CHECKING if TYPE_CHECKING: from bonsai.bim.module.model.prop import BIMStairProperties diff --git a/src/bonsai/bonsai/bim/module/model/sverchok_modifier.py b/src/bonsai/bonsai/bim/module/model/sverchok_modifier.py index d30852f1ebf..448fb9725cf 100644 --- a/src/bonsai/bonsai/bim/module/model/sverchok_modifier.py +++ b/src/bonsai/bonsai/bim/module/model/sverchok_modifier.py @@ -16,23 +16,22 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . -import bpy -import bmesh +import json +import os.path +import zipfile -import ifcopenshell +import bmesh +import bpy import ifcopenshell.api.pset import ifcopenshell.util.element -import bonsai.tool as tool +from bpy_extras.io_utils import ExportHelper, ImportHelper -import json -import zipfile -import os.path -from bpy_extras.io_utils import ImportHelper, ExportHelper +import bonsai.tool as tool def update_sverchok_modifier(context): obj = context.active_object - props = obj.BIMSverchokProperties + props = tool.Model.get_sverchok_props(obj) element = tool.Ifc.get_entity(obj) psets = ifcopenshell.util.element.get_psets(element) pset = psets.get("BBIM_Sverchok", None) @@ -70,10 +69,10 @@ class CreateNewSverchokGraph(bpy.types.Operator, tool.Ifc.Operator): bl_options = {"REGISTER"} def _execute(self, context): - import sverchok + import sverchok.ui.sv_temporal_viewers obj = context.active_object - props = obj.BIMSverchokProperties + props = tool.Model.get_sverchok_props(obj) node_group = bpy.data.node_groups.new("IfcNodeTree", type="SverchCustomTreeType") plane = node_group.nodes.new(type="SvPlaneNodeMk3") @@ -97,7 +96,7 @@ class DeleteSverchokGraph(bpy.types.Operator, tool.Ifc.Operator): def _execute(self, context): obj = context.active_object element = tool.Ifc.get_entity(obj) - props = obj.BIMSverchokProperties + props = tool.Model.get_sverchok_props(obj) bpy.data.node_groups.remove(props.node_group) return {"FINISHED"} @@ -114,7 +113,8 @@ class UpdateDataFromSverchok(bpy.types.Operator, tool.Ifc.Operator): bl_options = {"REGISTER"} def invoke(self, context, event): - if not context.active_object.BIMSverchokProperties.node_group: + props = tool.Model.get_sverchok_props(context.active_object) + if not props.node_group: return context.window_manager.invoke_props_dialog(self) return self._execute(context) @@ -125,7 +125,7 @@ def draw(self, context): def _execute(self, context): obj = context.active_object element = tool.Ifc.get_entity(obj) - props = obj.BIMSverchokProperties + props = tool.Model.get_sverchok_props(obj) node_group = props.node_group if node_group: @@ -193,11 +193,11 @@ class ImportSverchokGraph(bpy.types.Operator, tool.Ifc.Operator, ImportHelper): filename_ext = ".json" def _execute(self, context): - import sverchok + import sverchok.utils.sv_json_import importer = sverchok.utils.sv_json_import.JSONImporter.init_from_path(self.filepath) obj = context.active_object - props = obj.BIMSverchokProperties + props = tool.Model.get_sverchok_props(obj) node_group = context.scene.io_panel_properties.import_tree if not node_group: @@ -232,10 +232,10 @@ class ExportSverchokGraph(bpy.types.Operator, tool.Ifc.Operator, ExportHelper): compress: bpy.props.BoolProperty() def _execute(self, context): - import sverchok + import sverchok.utils.sv_json_export obj = context.active_object - props = obj.BIMSverchokProperties + props = tool.Model.get_sverchok_props(obj) ng = props.node_group destination_path = self.filepath if not destination_path.lower().endswith(".json"): @@ -274,7 +274,8 @@ def _execute(self, context): return {"FINISHED"} def draw(self, context): - graph_name = context.active_object.BIMSverchokProperties.node_group.name + props = tool.Model.get_sverchok_props(context.active_object) + graph_name = props.node_group.name self.layout.label(text=f'Save node tree "{graph_name}" into json:') col = self.layout.column(heading="Options") # new syntax in >= 2.90 diff --git a/src/bonsai/bonsai/bim/module/model/task.py b/src/bonsai/bonsai/bim/module/model/task.py index 93a361b73cb..72d2ee45560 100644 --- a/src/bonsai/bonsai/bim/module/model/task.py +++ b/src/bonsai/bonsai/bim/module/model/task.py @@ -17,7 +17,6 @@ # along with Bonsai. If not, see . import ifcopenshell -import ifcopenshell.api import ifcopenshell.api.pset import ifcopenshell.util.date @@ -32,11 +31,11 @@ def calculate_quantities(usecase_path, ifc_file: ifcopenshell.file, settings): return task = next(e for e in ifc_file.get_inverse(element) if e.is_a("IfcTask")) qto = ifcopenshell.api.pset.add_qto( - ifc_file, should_run_listeners=False, product=task, name="Qto_TaskBaseQuantities" + ifc_file, should_run_listeners=False, product=task, name="Qto_TaskBaseQuantities" # ty:ignore[unknown-argument] ) ifcopenshell.api.pset.edit_qto( ifc_file, - should_run_listeners=False, + should_run_listeners=False, # ty:ignore[unknown-argument] qto=qto, properties={ "StandardWork": ifcopenshell.util.date.ifc2datetime(element.ScheduleDuration).days, diff --git a/src/bonsai/bonsai/bim/module/model/ui.py b/src/bonsai/bonsai/bim/module/model/ui.py index ad7de65556a..eef71ed4336 100644 --- a/src/bonsai/bonsai/bim/module/model/ui.py +++ b/src/bonsai/bonsai/bim/module/model/ui.py @@ -16,29 +16,36 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . +from __future__ import annotations + +from collections.abc import Iterable +from typing import TYPE_CHECKING, Any + import bpy +from bpy.types import Panel + import bonsai.bim import bonsai.tool as tool -from bpy.types import Panel, Menu from bonsai.bim.helper import prop_with_search from bonsai.bim.module.model.data import ( - AuthoringData, ArrayData, - StairData, - SverchokData, - WindowData, + AuthoringData, DoorData, RailingData, RoofData, + StairData, + SverchokData, + WindowData, ) -from collections.abc import Iterable -from typing import Any, TYPE_CHECKING if TYPE_CHECKING or bpy.app.version >= (5, 0, 0): import _bl_ui_utils.layout as bl_ui_utils_layout else: import bl_ui_utils.layout as bl_ui_utils_layout +if TYPE_CHECKING: + import bonsai.bim.module.model.prop as module_prop + class BIM_MT_type_manager_menu(bpy.types.Menu): bl_label = "Type Manager Menu" @@ -221,6 +228,7 @@ def draw(self, context): if ArrayData.data["parameters"]: row = self.layout.row(align=True) row.label(text=ArrayData.data["parameters"]["parent_name"], icon="CON_CHILDOF") + row.operator("bim.regenerate_array", icon="FILE_REFRESH", text="") row.operator("bim.select_array_parent", icon="OBJECT_DATA", text="") row.operator("bim.select_all_array_objects", icon="RESTRICT_SELECT_OFF", text="") @@ -238,7 +246,6 @@ def draw(self, context): row.prop(props, "method") row = box.row(align=True) row.prop(props, "use_local_space") - row.prop(props, "sync_children") col = box.column() row = col.row(align=True) row.prop(props, "x") @@ -353,7 +360,7 @@ def draw(self, context): self.layout.label(text="Requires Sverchok Add-on", icon="ERROR") return - props = context.active_object.BIMSverchokProperties + props = tool.Model.get_sverchok_props(context.active_object) self.layout.prop_search(props, "node_group", bpy.data, "node_groups") self.layout.operator("bim.create_new_sverchok_graph", icon="ADD") @@ -664,21 +671,41 @@ def draw(self, context): row.operator("bim.apply_external_parametric_geometry", icon="CHECKMARK", text="") row.prop(props, "is_editing", icon="CANCEL", text="") - row = layout.row(align=True) - row.prop_search(props, "geo_nodes", bpy.data, "node_groups") - if props.geo_nodes: - assert (modifier := tool.Model.get_epg_modifier(obj)) - inputs = tool.Model.get_parametric_geometry_inputs(modifier) - # NOTE: users won't be able to see inputs descriptions. - # If we add group node inputs as modifiers inputs, descriptions will be visible. - # But then we need to ensure inputs are up to date - # (e.g. probably just by adding a refresh button). - for input in inputs: - row = layout.row(align=True) - row.prop(input, "default_value", text=input.name) - - -def draw_door_properties(layout: bpy.types.UILayout, props: bpy.types.PropertyGroup) -> None: + layout.prop(props, "geometry_source") + if props.geometry_source == "GEONODES": + row = layout.row(align=True) + row.prop_search(props, "geo_nodes", bpy.data, "node_groups") + if props.geo_nodes: + assert (modifier := tool.Model.get_epg_modifier(obj)) + inputs = tool.Model.get_parametric_geometry_inputs(modifier) + # NOTE: users won't be able to see inputs descriptions. + # If we add group node inputs as modifiers inputs, descriptions will be visible. + # But then we need to ensure inputs are up to date + # (e.g. probably just by adding a refresh button). + for input in inputs: + row = layout.row(align=True) + row.prop(input, "default_value", text=input.name) + elif props.geometry_source == "IFCSVERCHOK": + row = layout.row(align=True) + row.prop(props, "sverchok_nodes") + if props.sverchok_nodes: + # TODO: Updating mesh in `draw` is not ideal, + # should find a way to update only on graph changes. + res = tool.Model.update_mesh_from_sverchok(obj, props.sverchok_nodes) + if res is not None: + layout.label(text=f"Error Updating from Graph, See System Console", icon="ERROR") + + layout.label(text="Parameters:") + box = layout.box() + + group_node = tool.Model.get_ifcsverchok_group_node(props.sverchok_nodes) + node_tree = group_node.node_tree + + for socket, interface_socket in zip(group_node.inputs, node_tree.sockets("INPUT")): + socket.draw_group_property(box, socket.name, interface_socket) + + +def draw_door_properties(layout: bpy.types.UILayout, props: module_prop.BIMDoorProperties) -> None: """Draw door properties UI (shared between properties panel and preferences).""" # General properties general_props = props.get_general_kwargs() @@ -698,7 +725,7 @@ def draw_door_properties(layout: bpy.types.UILayout, props: bpy.types.PropertyGr layout.prop(props, prop) -def draw_window_properties(layout: bpy.types.UILayout, props: bpy.types.PropertyGroup) -> None: +def draw_window_properties(layout: bpy.types.UILayout, props: module_prop.BIMWindowProperties) -> None: """Draw window properties UI (shared between properties panel and preferences).""" number_of_panels, panels_data = props.window_types_panels[props.window_type] @@ -734,7 +761,7 @@ def draw_window_properties(layout: bpy.types.UILayout, props: bpy.types.Property cols[panel_i + 1].prop(props, prop, index=panel_i, text="") -def draw_railing_properties(layout: bpy.types.UILayout, props: bpy.types.PropertyGroup) -> None: +def draw_railing_properties(layout: bpy.types.UILayout, props: module_prop.BIMRailingProperties) -> None: """Draw railing properties UI (shared between properties panel and preferences).""" general_props = props.get_general_kwargs() for prop in general_props: @@ -746,7 +773,7 @@ def draw_railing_properties(layout: bpy.types.UILayout, props: bpy.types.Propert layout.prop(props, prop) -def draw_roof_properties(layout: bpy.types.UILayout, props: bpy.types.PropertyGroup) -> None: +def draw_roof_properties(layout: bpy.types.UILayout, props: module_prop.BIMRoofProperties) -> None: """Draw roof properties UI (shared between properties panel and preferences).""" # General properties general_props = props.get_general_kwargs() @@ -754,7 +781,7 @@ def draw_roof_properties(layout: bpy.types.UILayout, props: bpy.types.PropertyGr layout.prop(props, prop) -def draw_stair_properties(layout: bpy.types.UILayout, props: bpy.types.PropertyGroup) -> None: +def draw_stair_properties(layout: bpy.types.UILayout, props: module_prop.BIMStairProperties) -> None: """Draw stair properties UI (shared between properties panel and preferences).""" for prop_name in props.get_props_kwargs(): # Skip custom_tread_lock as it's handled with custom_first_last_tread_run diff --git a/src/bonsai/bonsai/bim/module/model/wall.py b/src/bonsai/bonsai/bim/module/model/wall.py index 5b858dec835..4d0c9b3de73 100644 --- a/src/bonsai/bonsai/bim/module/model/wall.py +++ b/src/bonsai/bonsai/bim/module/model/wall.py @@ -18,37 +18,36 @@ # # pyright: reportUnnecessaryTypeIgnoreComment=error -import bpy import copy import math -import numpy as np +from math import atan2, cos, degrees, pi, sin +from typing import TYPE_CHECKING, Any, Literal, Union, get_args + +import bpy import ifcopenshell -import ifcopenshell.api import ifcopenshell.api.feature +import ifcopenshell.api.geometry import ifcopenshell.api.material import ifcopenshell.api.pset import ifcopenshell.api.root import ifcopenshell.api.type -import ifcopenshell.api.geometry -import ifcopenshell.util.unit import ifcopenshell.util.element import ifcopenshell.util.placement import ifcopenshell.util.representation import ifcopenshell.util.shape_builder import ifcopenshell.util.type +import ifcopenshell.util.unit import mathutils.geometry -import bonsai.core.type -import bonsai.core.root +import numpy as np +from mathutils import Matrix, Vector + import bonsai.core.geometry import bonsai.core.model as core +import bonsai.core.root import bonsai.tool as tool from bonsai.bim.ifc import IfcStore -from math import pi, sin, cos, degrees, atan2 -from mathutils import Vector, Matrix -from bonsai.bim.module.model.opening import FilledOpeningGenerator from bonsai.bim.module.model.decorator import PolylineDecorator, ProductDecorator from bonsai.bim.module.model.polyline import PolylineOperator -from typing import Optional, assert_never, TYPE_CHECKING, get_args, Literal, Union, Any class UnjoinWalls(bpy.types.Operator, tool.Ifc.Operator): @@ -397,6 +396,7 @@ def _execute(self, context): for obj in selected_objs: element = tool.Ifc.get_entity(obj) assert element + representation = ifcopenshell.util.representation.get_representation(element, "Model", "Body", "MODEL_VIEW") if not representation: continue @@ -712,11 +712,8 @@ def _modal(self, context, event): return {"FINISHED"} self.handle_keyboard_input(context, event) - self.handle_inserting_polyline(context, event) - self.get_product_preview_data(context, self.relating_type) - cancel = self.handle_cancelation(context, event) if cancel is not None: ProductDecorator.uninstall() @@ -916,8 +913,8 @@ def create_wall_from_2_points(self, coords, should_round=False) -> Union[dict[st if should_round: # Round to nearest 50mm (yes, metric for now) self.length = 0.05 * round(length / 0.05) - # Round to nearest 5 degrees - nearest_degree = (math.pi / 180) * 5 + angle_snap = tool.Snap.get_angle_snap_value(bpy.context) + nearest_degree = math.radians(angle_snap) self.rotation = nearest_degree * round(self.rotation / nearest_degree) self.location = coords[0] data["obj"] = self.create_wall() @@ -1057,37 +1054,6 @@ def regenerate_from_layer_set(self, layer_set: ifcopenshell.entity_instance) -> walls.extend([tool.Ifc.get_object(e) for e in rel.RelatedObjects]) tool.Model.recalculate_walls([w for w in set(walls) if w]) - def regenerate_from_type(self, usecase_path, ifc_file, settings): - relating_type = settings["relating_type"] - - new_material = ifcopenshell.util.element.get_material(relating_type) - if not new_material or not new_material.is_a("IfcMaterialLayerSet"): - return - - parametric = ifcopenshell.util.element.get_psets(relating_type).get("EPset_Parametric") - layer_set_direction = None - if parametric: - layer_set_direction = parametric.get("LayerSetDirection", layer_set_direction) - - self.unit_scale = ifcopenshell.util.unit.calculate_unit_scale(ifc_file) - for related_object in settings["related_objects"]: - self._regenerate_from_type(related_object, layer_set_direction) - - def _regenerate_from_type( - self, related_object: ifcopenshell.entity_instance, layer_set_direction: Optional[str] - ) -> None: - obj = tool.Ifc.get_object(related_object) - if not obj or not tool.Geometry.get_active_representation(obj): - return - - material = ifcopenshell.util.element.get_material(related_object) - if not material or not material.is_a("IfcMaterialLayerSetUsage"): - return - if layer_set_direction: - material.LayerSetDirection = layer_set_direction - if material.LayerSetDirection == "AXIS2": - tool.Model.recalculate_walls([obj]) - class DumbWallJoiner: def __init__(self): @@ -1302,27 +1268,6 @@ def duplicate_wall(self, wall1): bonsai.core.root.copy_class(tool.Ifc, tool.Collector, tool.Geometry, tool.Root, obj=wall2) return wall2 - def join_Z(self, wall1, slab2): - element1 = tool.Ifc.get_entity(wall1) - element2 = tool.Ifc.get_entity(slab2) - - for rel in element1.ConnectedFrom: - if rel.is_a() == "IfcRelConnectsElements" and rel.Description == "TOP": - ifcopenshell.api.geometry.disconnect_element( - tool.Ifc.get(), - relating_element=rel.RelatingElement, - related_element=element1, - ) - - ifcopenshell.api.geometry.connect_element( - tool.Ifc.get(), - relating_element=element2, - related_element=element1, - description="TOP", - ) - - tool.Model.recreate_wall(element1, wall1) - def set_axis(self, wall, p1, p2): axis = ifcopenshell.util.representation.get_context(tool.Ifc.get(), "Plan", "Axis", "GRAPH_VIEW") builder = ifcopenshell.util.shape_builder.ShapeBuilder(tool.Ifc.get()) @@ -1367,29 +1312,6 @@ def set_length(self, wall1: bpy.types.Object, si_length: float) -> None: self.set_axis(element1, p1, p2) tool.Model.recreate_wall(element1, wall1) - def join_T(self, wall1: bpy.types.Object, wall2: bpy.types.Object) -> None: - element1 = tool.Ifc.get_entity(wall1) - element2 = tool.Ifc.get_entity(wall2) - axis1 = tool.Model.get_wall_axis(wall1) - axis2 = tool.Model.get_wall_axis(wall2) - intersect = tool.Cad.intersect_edges(axis1["reference"], axis2["reference"]) - if intersect: - intersect, _ = intersect - else: - return - connection = "ATEND" if tool.Cad.edge_percent(intersect, axis1["reference"]) > 0.5 else "ATSTART" - - ifcopenshell.api.geometry.connect_path( - tool.Ifc.get(), - related_element=element1, - relating_element=element2, - relating_connection="ATPATH", - related_connection=connection, - description="BUTT", - ) - - tool.Model.recreate_wall(element1, wall1, axis1["reference"], axis1["reference"]) - def connect(self, obj1: bpy.types.Object, obj2: bpy.types.Object) -> None: wall1 = tool.Ifc.get_entity(obj1) wall2 = tool.Ifc.get_entity(obj2) diff --git a/src/bonsai/bonsai/bim/module/model/window.py b/src/bonsai/bonsai/bim/module/model/window.py index 206f65de08d..30e8d767b59 100644 --- a/src/bonsai/bonsai/bim/module/model/window.py +++ b/src/bonsai/bonsai/bim/module/model/window.py @@ -17,29 +17,28 @@ # along with Bonsai. If not, see . -import bpy +import collections.abc import json +from typing import TYPE_CHECKING + import bmesh -import collections -import collections.abc +import bpy import ifcopenshell import ifcopenshell.api.geometry -import ifcopenshell.api.pset -import bonsai.tool as tool -import bonsai.core.root -import bonsai.core.geometry -from bonsai.bim.module.drawing import gizmos as gizmo -from bonsai.bim.module.drawing.gizmos import DimensionGizmoConfig -from ifcopenshell.api.geometry.add_window_representation import DEFAULT_PANEL_SCHEMAS -import ifcopenshell.api import ifcopenshell.api.material +import ifcopenshell.api.pset import ifcopenshell.util.element import ifcopenshell.util.representation -import ifcopenshell.util.shape_builder import ifcopenshell.util.unit from bmesh.types import BMVert -from mathutils import Vector, Matrix -from typing import get_args, TYPE_CHECKING +from ifcopenshell.api.geometry.add_window_representation import DEFAULT_PANEL_SCHEMAS +from mathutils import Matrix, Vector + +import bonsai.core.geometry +import bonsai.core.root +import bonsai.tool as tool +from bonsai.bim.module.drawing import gizmos as gizmo +from bonsai.bim.module.drawing.gizmos import DimensionGizmoConfig if TYPE_CHECKING: from bonsai.bim.module.model.prop import BIMWindowProperties diff --git a/src/bonsai/bonsai/bim/module/model/workspace.py b/src/bonsai/bonsai/bim/module/model/workspace.py index 30acee46e32..828fc2c21fd 100644 --- a/src/bonsai/bonsai/bim/module/model/workspace.py +++ b/src/bonsai/bonsai/bim/module/model/workspace.py @@ -17,20 +17,20 @@ # along with Bonsai. If not, see . import os -import sys +from functools import partial +from typing import Optional, Union + import bpy import bpy.utils.previews -import bonsai.bim -import bonsai.tool as tool +from bpy.types import Menu, WorkSpaceTool + import bonsai.core.model as core -from bonsai.bim.module.model.wall import DumbWallJoiner, DumbWallAligner -from bonsai.bim.helper import prop_with_search, draw_attribute -from bpy.types import WorkSpaceTool, Menu +import bonsai.tool as tool +from bonsai.bim.helper import draw_attribute, prop_with_search from bonsai.bim.module.model.data import AuthoringData, ItemData -from bonsai.bim.module.system.data import PortData from bonsai.bim.module.model.prop import get_ifc_class -from typing import Optional, Union, Any -from functools import partial +from bonsai.bim.module.model.wall import DumbWallAligner, DumbWallJoiner +from bonsai.bim.module.system.data import PortData def load_custom_icons(): @@ -943,7 +943,7 @@ def draw_operations(cls, context): if "LAYER2" in AuthoringData.data["selected_material_usages"]: row = cls.layout.row(align=True) if ui_context != "TOOL_HEADER" else row add_layout_hotkey_operator( - cls.layout, "Extend To Underside", "S_E", bpy.ops.bim.extend_to_underside.__doc__, ui_context + cls.layout, "Extend To Underside", "S_E", bpy.ops.bim.extend_walls_to_underside.__doc__, ui_context ) if AuthoringData.data["is_flippable_element"]: diff --git a/src/bonsai/bonsai/bim/module/nest/__init__.py b/src/bonsai/bonsai/bim/module/nest/__init__.py index 883fd001864..a4bf3de1819 100644 --- a/src/bonsai/bonsai/bim/module/nest/__init__.py +++ b/src/bonsai/bonsai/bim/module/nest/__init__.py @@ -17,7 +17,8 @@ # along with Bonsai. If not, see . import bpy -from . import ui, prop, operator + +from . import operator, prop, ui classes = ( operator.BIM_OT_nest_assign_object, diff --git a/src/bonsai/bonsai/bim/module/nest/data.py b/src/bonsai/bonsai/bim/module/nest/data.py index 77ec0d020f3..abe94997fe9 100644 --- a/src/bonsai/bonsai/bim/module/nest/data.py +++ b/src/bonsai/bonsai/bim/module/nest/data.py @@ -17,9 +17,10 @@ # along with Bonsai. If not, see . import bpy -import bonsai.tool as tool import ifcopenshell.util.element +import bonsai.tool as tool + def refresh(): NestData.is_loaded = False diff --git a/src/bonsai/bonsai/bim/module/nest/decorator.py b/src/bonsai/bonsai/bim/module/nest/decorator.py index 5a16ef8e44e..28c3835ba74 100644 --- a/src/bonsai/bonsai/bim/module/nest/decorator.py +++ b/src/bonsai/bonsai/bim/module/nest/decorator.py @@ -19,14 +19,13 @@ import blf import bpy import gpu -import ifcopenshell import ifcopenshell.util.element -import bonsai.tool as tool from bpy.types import SpaceView3D from bpy_extras import view3d_utils from gpu_extras.batch import batch_for_shader from mathutils import Vector -from bonsai.bim.module.geometry.decorator import ItemDecorator + +import bonsai.tool as tool def transparent_color(color, alpha=0.1): @@ -216,8 +215,6 @@ def draw_nest(self, context: bpy.types.Context) -> None: self.draw_batch("LINES", line_z, color, [(0, 1)]) else: self.draw_batch("POINTS", [location], color) - # if context.scene.BIMNestProperties.in_aggregate_mode: - # return components = ifcopenshell.util.element.get_components(tool.Ifc.get_entity(nest)) components_objs = [tool.Ifc.get_object(p) for p in components] components_objs.append(nest) diff --git a/src/bonsai/bonsai/bim/module/nest/operator.py b/src/bonsai/bonsai/bim/module/nest/operator.py index 68b6839e798..6961fea0c80 100644 --- a/src/bonsai/bonsai/bim/module/nest/operator.py +++ b/src/bonsai/bonsai/bim/module/nest/operator.py @@ -17,10 +17,10 @@ # along with Bonsai. If not, see . import bpy -import ifcopenshell import ifcopenshell.util.element -import bonsai.tool as tool + import bonsai.core.nest as core +import bonsai.tool as tool class BIM_OT_nest_assign_object(bpy.types.Operator, tool.Ifc.Operator): diff --git a/src/bonsai/bonsai/bim/module/nest/prop.py b/src/bonsai/bonsai/bim/module/nest/prop.py index 6cb787b3d4e..4c7533455ac 100644 --- a/src/bonsai/bonsai/bim/module/nest/prop.py +++ b/src/bonsai/bonsai/bim/module/nest/prop.py @@ -16,23 +16,18 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . +from typing import TYPE_CHECKING, Union + import bpy -import bonsai.tool as tool -from bonsai.bim.prop import StrProperty, Attribute -from bonsai.bim.module.spatial.data import SpatialData -from bpy.types import PropertyGroup from bpy.props import ( - PointerProperty, - StringProperty, - EnumProperty, BoolProperty, - IntProperty, - FloatProperty, - FloatVectorProperty, CollectionProperty, + PointerProperty, ) +from bpy.types import PropertyGroup + +import bonsai.tool as tool from bonsai.bim.module.nest.decorator import NestDecorator, NestModeDecorator -from typing import TYPE_CHECKING, Union def update_relating_object(self: "BIMObjectNestProperties", context: bpy.types.Context) -> None: diff --git a/src/bonsai/bonsai/bim/module/nest/ui.py b/src/bonsai/bonsai/bim/module/nest/ui.py index 2ea33de49a1..6d61c5d66bd 100644 --- a/src/bonsai/bonsai/bim/module/nest/ui.py +++ b/src/bonsai/bonsai/bim/module/nest/ui.py @@ -16,8 +16,9 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . -import bonsai.tool as tool from bpy.types import Panel + +import bonsai.tool as tool from bonsai.bim.module.nest.data import NestData diff --git a/src/bonsai/bonsai/bim/module/owner/__init__.py b/src/bonsai/bonsai/bim/module/owner/__init__.py index 52c1c7cc19d..6d24f2f5dcf 100644 --- a/src/bonsai/bonsai/bim/module/owner/__init__.py +++ b/src/bonsai/bonsai/bim/module/owner/__init__.py @@ -17,7 +17,8 @@ # along with Bonsai. If not, see . import bpy -from . import ui, prop, operator + +from . import operator, prop, ui classes = ( operator.AddActor, diff --git a/src/bonsai/bonsai/bim/module/owner/data.py b/src/bonsai/bonsai/bim/module/owner/data.py index 9eb5b9e4c8e..88a56d4b1f6 100644 --- a/src/bonsai/bonsai/bim/module/owner/data.py +++ b/src/bonsai/bonsai/bim/module/owner/data.py @@ -16,13 +16,15 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . +from typing import Any, Union + import bpy import ifcopenshell -import bonsai.tool as tool -from typing import Any, Union from ifcopenshell.util.doc import get_entity_doc from natsort import natsorted +import bonsai.tool as tool + def refresh(): PeopleData.is_loaded = False diff --git a/src/bonsai/bonsai/bim/module/owner/operator.py b/src/bonsai/bonsai/bim/module/owner/operator.py index 4d3434f00a7..b934337b64a 100644 --- a/src/bonsai/bonsai/bim/module/owner/operator.py +++ b/src/bonsai/bonsai/bim/module/owner/operator.py @@ -16,12 +16,14 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . +from typing import TYPE_CHECKING, get_args + import bpy -import bonsai.tool as tool -import bonsai.core.owner as core import ifcopenshell.api.owner from ifcopenshell.api.owner.add_address import ADDRESS_TYPE -from typing import TYPE_CHECKING, get_args + +import bonsai.core.owner as core +import bonsai.tool as tool if TYPE_CHECKING: import bpy.stub_internal.rna_enums as rna_enums @@ -31,7 +33,7 @@ class EnableEditingPerson(bpy.types.Operator): bl_idname = "bim.enable_editing_person" bl_label = "Enable Editing Person" bl_options = {"REGISTER", "UNDO"} - person: bpy.props.IntProperty() # pyright: ignore[reportRedeclaration] + person: bpy.props.IntProperty() if TYPE_CHECKING: person: int @@ -73,7 +75,7 @@ class RemovePerson(bpy.types.Operator, tool.Ifc.Operator): bl_idname = "bim.remove_person" bl_label = "Remove Person" bl_options = {"REGISTER", "UNDO"} - person: bpy.props.IntProperty() # pyright: ignore[reportRedeclaration] + person: bpy.props.IntProperty() if TYPE_CHECKING: person: int @@ -86,7 +88,7 @@ class AddPersonAttribute(bpy.types.Operator): bl_idname = "bim.add_person_attribute" bl_label = "Add Person Attribute" bl_options = {"REGISTER", "UNDO"} - name: bpy.props.EnumProperty( # pyright: ignore[reportRedeclaration] + name: bpy.props.EnumProperty( items=tuple((i, i, "") for i in get_args(tool.Owner.PersonAttributeType)), ) @@ -102,10 +104,10 @@ class RemovePersonAttribute(bpy.types.Operator): bl_idname = "bim.remove_person_attribute" bl_label = "Remove Person Attribute" bl_options = {"REGISTER", "UNDO"} - name: bpy.props.EnumProperty( # pyright: ignore[reportRedeclaration] + name: bpy.props.EnumProperty( items=tuple((i, i, "") for i in get_args(tool.Owner.PersonAttributeType)), ) - id: bpy.props.IntProperty() # pyright: ignore[reportRedeclaration] + id: bpy.props.IntProperty() if TYPE_CHECKING: name: tool.Owner.PersonAttributeType # pyright: ignore[reportIncompatibleVariableOverride] @@ -120,7 +122,7 @@ class EnableEditingRole(bpy.types.Operator): bl_idname = "bim.enable_editing_role" bl_label = "Enable Editing Role" bl_options = {"REGISTER", "UNDO"} - role: bpy.props.IntProperty() # pyright: ignore[reportRedeclaration] + role: bpy.props.IntProperty() if TYPE_CHECKING: role: int @@ -144,7 +146,7 @@ class AddRole(bpy.types.Operator, tool.Ifc.Operator): bl_idname = "bim.add_role" bl_label = "Add Role" bl_options = {"REGISTER", "UNDO"} - parent: bpy.props.IntProperty() # pyright: ignore[reportRedeclaration] + parent: bpy.props.IntProperty() if TYPE_CHECKING: parent: int @@ -166,7 +168,7 @@ class RemoveRole(bpy.types.Operator, tool.Ifc.Operator): bl_idname = "bim.remove_role" bl_label = "Remove Role" bl_options = {"REGISTER", "UNDO"} - role: bpy.props.IntProperty() # pyright: ignore[reportRedeclaration] + role: bpy.props.IntProperty() if TYPE_CHECKING: role: int @@ -179,8 +181,8 @@ class AddAddress(bpy.types.Operator, tool.Ifc.Operator): bl_idname = "bim.add_address" bl_label = "Add Address" bl_options = {"REGISTER", "UNDO"} - parent: bpy.props.IntProperty() # pyright: ignore[reportRedeclaration] - ifc_class: bpy.props.EnumProperty( # pyright: ignore[reportRedeclaration] + parent: bpy.props.IntProperty() + ifc_class: bpy.props.EnumProperty( items=tuple((i, i, "") for i in get_args(ADDRESS_TYPE)), ) @@ -196,7 +198,7 @@ class AddAddressAttribute(bpy.types.Operator): bl_idname = "bim.add_address_attribute" bl_label = "Add Address Attribute" bl_options = {"REGISTER", "UNDO"} - name: bpy.props.EnumProperty( # pyright: ignore[reportRedeclaration] + name: bpy.props.EnumProperty( items=tuple((i, i, "") for i in get_args(tool.Owner.AddressAttributeType)), ) @@ -212,10 +214,10 @@ class RemoveAddressAttribute(bpy.types.Operator): bl_idname = "bim.remove_address_attribute" bl_label = "Remove Address Attribute" bl_options = {"REGISTER", "UNDO"} - name: bpy.props.EnumProperty( # pyright: ignore[reportRedeclaration] + name: bpy.props.EnumProperty( items=tuple((i, i, "") for i in get_args(tool.Owner.AddressAttributeType)), ) - id: bpy.props.IntProperty() # pyright: ignore[reportRedeclaration] + id: bpy.props.IntProperty() if TYPE_CHECKING: name: tool.Owner.AddressAttributeType # pyright: ignore[reportIncompatibleVariableOverride] @@ -230,7 +232,7 @@ class EnableEditingAddress(bpy.types.Operator): bl_idname = "bim.enable_editing_address" bl_label = "Enable Editing Address" bl_options = {"REGISTER", "UNDO"} - address: bpy.props.IntProperty() # pyright: ignore[reportRedeclaration] + address: bpy.props.IntProperty() if TYPE_CHECKING: address: int @@ -263,7 +265,7 @@ class RemoveAddress(bpy.types.Operator, tool.Ifc.Operator): bl_idname = "bim.remove_address" bl_label = "Remove Address" bl_options = {"REGISTER", "UNDO"} - address: bpy.props.IntProperty() # pyright: ignore[reportRedeclaration] + address: bpy.props.IntProperty() if TYPE_CHECKING: address: int @@ -276,7 +278,7 @@ class EnableEditingOrganisation(bpy.types.Operator): bl_idname = "bim.enable_editing_organisation" bl_label = "Enable Editing Organisation" bl_options = {"REGISTER", "UNDO"} - organisation: bpy.props.IntProperty() # pyright: ignore[reportRedeclaration] + organisation: bpy.props.IntProperty() if TYPE_CHECKING: organisation: int @@ -318,7 +320,7 @@ class RemoveOrganisation(bpy.types.Operator, tool.Ifc.Operator): bl_idname = "bim.remove_organisation" bl_label = "Remove Organisation" bl_options = {"REGISTER", "UNDO"} - organisation: bpy.props.IntProperty() # pyright: ignore[reportRedeclaration] + organisation: bpy.props.IntProperty() if TYPE_CHECKING: organisation: int @@ -331,8 +333,8 @@ class AddPersonAndOrganisation(bpy.types.Operator, tool.Ifc.Operator): bl_idname = "bim.add_person_and_organisation" bl_label = "Add Person And Organisation" bl_options = {"REGISTER", "UNDO"} - person: bpy.props.IntProperty() # pyright: ignore[reportRedeclaration] - organisation: bpy.props.IntProperty() # pyright: ignore[reportRedeclaration] + person: bpy.props.IntProperty() + organisation: bpy.props.IntProperty() if TYPE_CHECKING: person: int @@ -348,7 +350,7 @@ class RemovePersonAndOrganisation(bpy.types.Operator, tool.Ifc.Operator): bl_idname = "bim.remove_person_and_organisation" bl_label = "Remove Person And Organisation" bl_options = {"REGISTER", "UNDO"} - person_and_organisation: bpy.props.IntProperty() # pyright: ignore[reportRedeclaration] + person_and_organisation: bpy.props.IntProperty() if TYPE_CHECKING: person_and_organisation: int @@ -363,7 +365,7 @@ class SetUser(bpy.types.Operator): bl_idname = "bim.set_user" bl_label = "Set User" bl_options = {"REGISTER", "UNDO"} - user: bpy.props.IntProperty() # pyright: ignore[reportRedeclaration] + user: bpy.props.IntProperty() if TYPE_CHECKING: user: int @@ -399,7 +401,7 @@ class EnableEditingActor(bpy.types.Operator): bl_idname = "bim.enable_editing_actor" bl_label = "Enable Editing Actor" bl_options = {"REGISTER", "UNDO"} - actor: bpy.props.IntProperty() # pyright: ignore[reportRedeclaration] + actor: bpy.props.IntProperty() if TYPE_CHECKING: actor: int @@ -432,7 +434,7 @@ class RemoveActor(bpy.types.Operator, tool.Ifc.Operator): bl_idname = "bim.remove_actor" bl_label = "Remove Actor" bl_options = {"REGISTER", "UNDO"} - actor: bpy.props.IntProperty() # pyright: ignore[reportRedeclaration] + actor: bpy.props.IntProperty() if TYPE_CHECKING: actor: int @@ -445,7 +447,7 @@ class AssignActor(bpy.types.Operator, tool.Ifc.Operator): bl_idname = "bim.assign_actor" bl_label = "Assign Actor" bl_options = {"REGISTER", "UNDO"} - actor: bpy.props.IntProperty() # pyright: ignore[reportRedeclaration] + actor: bpy.props.IntProperty() if TYPE_CHECKING: actor: int @@ -460,7 +462,7 @@ class UnassignActor(bpy.types.Operator, tool.Ifc.Operator): bl_idname = "bim.unassign_actor" bl_label = "Unassign Actor" bl_options = {"REGISTER", "UNDO"} - actor: bpy.props.IntProperty() # pyright: ignore[reportRedeclaration] + actor: bpy.props.IntProperty() if TYPE_CHECKING: actor: int @@ -479,7 +481,7 @@ class RemoveApplication(bpy.types.Operator, tool.Ifc.Operator): "Remove provided IfcApplication." "\n\nFor safety will only work on applications without inverses (they are typically marked as '(unused)'." ) - application_id: bpy.props.IntProperty() # pyright: ignore[reportRedeclaration] + application_id: bpy.props.IntProperty() if TYPE_CHECKING: application_id: int @@ -523,7 +525,7 @@ class EnableEditingApplication(bpy.types.Operator): bl_idname = "bim.enable_editing_application" bl_label = "Enable Editing Application" bl_options = {"REGISTER", "UNDO"} - application_id: bpy.props.IntProperty() # pyright: ignore[reportRedeclaration] + application_id: bpy.props.IntProperty() if TYPE_CHECKING: application_id: int diff --git a/src/bonsai/bonsai/bim/module/owner/prop.py b/src/bonsai/bonsai/bim/module/owner/prop.py index ecd8b8f723d..171712e7991 100644 --- a/src/bonsai/bonsai/bim/module/owner/prop.py +++ b/src/bonsai/bonsai/bim/module/owner/prop.py @@ -16,22 +16,19 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . -import bpy -import bonsai.tool as tool -from bonsai.bim.prop import StrProperty, Attribute -from bonsai.bim.module.owner.data import OwnerData, ActorData, ObjectActorData from typing import TYPE_CHECKING, Literal -from bpy.types import PropertyGroup + +import bpy from bpy.props import ( - PointerProperty, - StringProperty, + CollectionProperty, EnumProperty, - BoolProperty, IntProperty, - FloatProperty, - FloatVectorProperty, - CollectionProperty, ) +from bpy.types import PropertyGroup + +import bonsai.tool as tool +from bonsai.bim.module.owner.data import ActorData, ObjectActorData, OwnerData +from bonsai.bim.prop import Attribute, StrProperty def get_user_person(self: "BIMOwnerProperties", context: bpy.types.Context) -> tool.Blender.BLENDER_ENUM_ITEMS: diff --git a/src/bonsai/bonsai/bim/module/owner/ui.py b/src/bonsai/bonsai/bim/module/owner/ui.py index f348804d773..f1e7ae9ea30 100644 --- a/src/bonsai/bonsai/bim/module/owner/ui.py +++ b/src/bonsai/bonsai/bim/module/owner/ui.py @@ -16,17 +16,19 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . +from typing import Any + import bpy + import bonsai.bim.helper import bonsai.tool as tool -from typing import Any from bonsai.bim.module.owner.data import ( - PeopleData, - OrganisationsData, - OwnerData, ActorData, - ObjectActorData, ApplicationsData, + ObjectActorData, + OrganisationsData, + OwnerData, + PeopleData, ) diff --git a/src/bonsai/bonsai/bim/module/patch/__init__.py b/src/bonsai/bonsai/bim/module/patch/__init__.py index 0a35e4b0d8e..fd5de30d388 100644 --- a/src/bonsai/bonsai/bim/module/patch/__init__.py +++ b/src/bonsai/bonsai/bim/module/patch/__init__.py @@ -17,7 +17,8 @@ # along with Bonsai. If not, see . import bpy -from . import ui, prop, operator + +from . import operator, prop, ui classes = ( operator.ExecuteIfcPatch, diff --git a/src/bonsai/bonsai/bim/module/patch/operator.py b/src/bonsai/bonsai/bim/module/patch/operator.py index 5ff7e998ce2..99459b99e9f 100644 --- a/src/bonsai/bonsai/bim/module/patch/operator.py +++ b/src/bonsai/bonsai/bim/module/patch/operator.py @@ -16,17 +16,18 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . -import os -import bpy import json +from pathlib import Path +from typing import TYPE_CHECKING, cast + +import bpy import ifcopenshell import ifcpatch -import bonsai.tool as tool -import bonsai.core.patch as core +from bpy_extras.io_utils import ExportHelper, ImportHelper + import bonsai.bim.handler -from bpy_extras.io_utils import ImportHelper, ExportHelper -from pathlib import Path -from typing import cast, TYPE_CHECKING +import bonsai.core.patch as core +import bonsai.tool as tool if TYPE_CHECKING: from bonsai.bim.prop import AttributeDataType diff --git a/src/bonsai/bonsai/bim/module/patch/prop.py b/src/bonsai/bonsai/bim/module/patch/prop.py index 3d372e5036d..e14bb3b1ef1 100644 --- a/src/bonsai/bonsai/bim/module/patch/prop.py +++ b/src/bonsai/bonsai/bim/module/patch/prop.py @@ -16,25 +16,21 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . -import bpy -import importlib import importlib.util from pathlib import Path +from typing import TYPE_CHECKING, Literal, Union + +import bpy import ifcpatch -from bonsai.bim.prop import StrProperty, Attribute -from bpy.types import PropertyGroup from bpy.props import ( - PointerProperty, - StringProperty, - EnumProperty, BoolProperty, - IntProperty, - FloatProperty, - FloatVectorProperty, CollectionProperty, + EnumProperty, + StringProperty, ) -from typing import TYPE_CHECKING, Literal, Union +from bpy.types import PropertyGroup +from bonsai.bim.prop import Attribute ifcpatchrecipes_enum: list[tuple[str, str, str]] = [] diff --git a/src/bonsai/bonsai/bim/module/patch/ui.py b/src/bonsai/bonsai/bim/module/patch/ui.py index 8c165d692fd..c3101b4705d 100644 --- a/src/bonsai/bonsai/bim/module/patch/ui.py +++ b/src/bonsai/bonsai/bim/module/patch/ui.py @@ -17,11 +17,13 @@ # along with Bonsai. If not, see . from __future__ import annotations + +from typing import TYPE_CHECKING + import bpy + import bonsai.tool as tool -from bonsai.bim.helper import prop_with_search -from bonsai.bim.helper import draw_attributes -from typing import TYPE_CHECKING +from bonsai.bim.helper import draw_attributes, prop_with_search if TYPE_CHECKING: from bonsai.bim.prop import Attribute diff --git a/src/bonsai/bonsai/bim/module/profile/__init__.py b/src/bonsai/bonsai/bim/module/profile/__init__.py index 00a6728d326..d53deebb9ce 100644 --- a/src/bonsai/bonsai/bim/module/profile/__init__.py +++ b/src/bonsai/bonsai/bim/module/profile/__init__.py @@ -17,7 +17,8 @@ # along with Bonsai. If not, see . import bpy -from . import ui, prop, operator, data + +from . import data, operator, prop, ui classes = ( operator.AddProfileDef, diff --git a/src/bonsai/bonsai/bim/module/profile/data.py b/src/bonsai/bonsai/bim/module/profile/data.py index eb21a72f256..09f8eaf3833 100644 --- a/src/bonsai/bonsai/bim/module/profile/data.py +++ b/src/bonsai/bonsai/bim/module/profile/data.py @@ -16,12 +16,13 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . +from typing import Any + import bpy -import bpy.utils import bpy.utils.previews import ifcopenshell.util.doc + import bonsai.tool as tool -from typing import Any def refresh(): diff --git a/src/bonsai/bonsai/bim/module/profile/operator.py b/src/bonsai/bonsai/bim/module/profile/operator.py index 99f47923e46..42a37989a07 100644 --- a/src/bonsai/bonsai/bim/module/profile/operator.py +++ b/src/bonsai/bonsai/bim/module/profile/operator.py @@ -20,14 +20,14 @@ import ifcopenshell.api import ifcopenshell.api.profile import ifcopenshell.util.element + import bonsai.bim.helper -import bonsai.tool as tool import bonsai.bim.module.model.profile as model_profile -import bonsai.core.profile as core +import bonsai.tool as tool +from bonsai.bim.module.geometry.helper import Helper from bonsai.bim.module.model.decorator import ProfileDecorator -from bonsai.bim.module.profile.prop import generate_thumbnail_for_active_profile from bonsai.bim.module.profile.data import refresh -from bonsai.bim.module.geometry.helper import Helper +from bonsai.bim.module.profile.prop import generate_thumbnail_for_active_profile class LoadProfiles(bpy.types.Operator): diff --git a/src/bonsai/bonsai/bim/module/profile/prop.py b/src/bonsai/bonsai/bim/module/profile/prop.py index f69f6a6cd96..3a4a71650e7 100644 --- a/src/bonsai/bonsai/bim/module/profile/prop.py +++ b/src/bonsai/bonsai/bim/module/profile/prop.py @@ -16,25 +16,22 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . +from typing import TYPE_CHECKING, Union + import bpy -import ifcopenshell -import ifcopenshell.util.schema -import ifcopenshell.util.attribute -import bonsai.tool as tool -from bonsai.bim.prop import StrProperty, Attribute -from bonsai.bim.module.profile.data import ProfileData -from bpy.types import PropertyGroup from bpy.props import ( - PointerProperty, - StringProperty, - EnumProperty, BoolProperty, - IntProperty, - FloatProperty, - FloatVectorProperty, CollectionProperty, + EnumProperty, + IntProperty, + PointerProperty, + StringProperty, ) -from typing import TYPE_CHECKING, Union +from bpy.types import PropertyGroup + +import bonsai.tool as tool +from bonsai.bim.module.profile.data import ProfileData +from bonsai.bim.prop import Attribute def get_profile_classes(self: "BIMProfileProperties", context: bpy.types.Context) -> list[tuple[str, str, str]]: diff --git a/src/bonsai/bonsai/bim/module/profile/ui.py b/src/bonsai/bonsai/bim/module/profile/ui.py index 33b8ca7d58b..3128fe82ea9 100644 --- a/src/bonsai/bonsai/bim/module/profile/ui.py +++ b/src/bonsai/bonsai/bim/module/profile/ui.py @@ -17,13 +17,16 @@ # along with Bonsai. If not, see . from __future__ import annotations + +from typing import TYPE_CHECKING + import bpy +from bpy.types import Panel, UIList + import bonsai.bim.helper import bonsai.tool as tool -from bpy.types import Panel, UIList from bonsai.bim.module.profile.data import ProfileData from bonsai.bim.module.profile.prop import generate_thumbnail_for_active_profile -from typing import TYPE_CHECKING if TYPE_CHECKING: from bonsai.bim.module.profile.prop import BIMProfileProperties, Profile diff --git a/src/bonsai/bonsai/bim/module/project/__init__.py b/src/bonsai/bonsai/bim/module/project/__init__.py index 26961b8c649..e83da49c5b2 100644 --- a/src/bonsai/bonsai/bim/module/project/__init__.py +++ b/src/bonsai/bonsai/bim/module/project/__init__.py @@ -17,7 +17,8 @@ # along with Bonsai. If not, see . import bpy -from . import ui, prop, operator, workspace, gizmo, decorator + +from . import decorator, gizmo, operator, prop, ui, workspace classes = ( operator.AddProjectLibrary, @@ -30,27 +31,32 @@ operator.BIM_OT_load_clipping_planes, operator.BIM_OT_save_clipping_planes, operator.ChangeLibraryElement, + operator.ClearMeasurement, operator.ClearRecentIFCProjects, operator.CreateClippingPlane, operator.CreateProject, operator.DisableCulling, operator.DisableEditingHeader, + operator.DisableEditingLink, operator.EditHeader, + operator.EditLink, operator.EditProjectLibrary, operator.EnableCulling, operator.EnableEditingHeader, + operator.EnableEditingLink, operator.ExportIFC, operator.FlipClippingPlane, + operator.HideQueriedLinkedElement, operator.IFCFileHandlerOperator, operator.ImageScalingTool, operator.LinkIfc, + operator.LoadBlendMetadataAndIFC, operator.LoadLink, operator.LoadLinkedProject, operator.LoadProject, operator.LoadProjectElements, - operator.MeasureTool, operator.MeasureFaceAreaTool, - operator.ClearMeasurement, + operator.MeasureTool, operator.NewProject, operator.QueryLinkedElement, operator.RefreshClippingPlanes, @@ -61,6 +67,7 @@ operator.RewindLibrary, operator.SaveLibraryFile, operator.SelectLibraryFile, + operator.SelectLinkedModelElement, operator.SelectLinkHandle, operator.ToggleFilterCategories, operator.ToggleLinkSelectability, @@ -68,8 +75,8 @@ operator.UnassignLibraryDeclaration, operator.UnlinkIfc, operator.UnloadLink, - operator.LoadBlendMetadataAndIFC, workspace.ExploreHotkey, + operator.GenerateUVMap, prop.LibraryBreadcrumb, prop.LibraryElement, prop.FilterCategory, diff --git a/src/bonsai/bonsai/bim/module/project/data.py b/src/bonsai/bonsai/bim/module/project/data.py index 1f517372057..8ecf30eef5e 100644 --- a/src/bonsai/bonsai/bim/module/project/data.py +++ b/src/bonsai/bonsai/bim/module/project/data.py @@ -16,14 +16,14 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . -import os -import bpy -import bonsai.tool as tool +from collections import defaultdict +from pathlib import Path +from typing import Any, Union + import ifcopenshell.util.file + +import bonsai.tool as tool from bonsai.bim.ifc import IfcStore -from pathlib import Path -from collections import defaultdict -from typing import Union, Any def refresh(): @@ -170,6 +170,6 @@ def parent_libraries_enum(cls) -> list[tuple[str, str, str]]: class LinksData: - linked_data = {} + linked_data: dict[str, Any] = {} enable_culling = False is_loaded = False diff --git a/src/bonsai/bonsai/bim/module/project/decorator.py b/src/bonsai/bonsai/bim/module/project/decorator.py index fbb3e9ae974..72090a769ba 100644 --- a/src/bonsai/bonsai/bim/module/project/decorator.py +++ b/src/bonsai/bonsai/bim/module/project/decorator.py @@ -16,17 +16,15 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . -import gpu -import blf -import bpy import bmesh -import bonsai.tool as tool +import bpy +import gpu +from bpy.app.handlers import persistent from bpy.types import SpaceView3D -from bpy_extras import view3d_utils -from mathutils import Vector from gpu_extras.batch import batch_for_shader -from bpy.app.handlers import persistent -from typing import Union +from mathutils import Vector + +import bonsai.tool as tool from bonsai.bim.module.model.decorator import PolylineDecorator @@ -54,7 +52,7 @@ class ProjectDecorator: installed = None @classmethod - def install(cls, context): + def install(cls, context: bpy.types.Context) -> None: if cls.installed: cls.uninstall() handler = cls() @@ -99,26 +97,20 @@ def transparent_color(color, alpha=0.1): # general shader self.shader = gpu.shader.from_builtin("UNIFORM_COLOR") - selected_vertices = [] - selected_edges = [] - selected_tris = [] - props = tool.Project.get_project_props() - try: - obj = props.queried_obj - selected_vertices = obj["selected_vertices"] - selected_edges = obj["selected_edges"] - selected_tris = obj["selected_tris"] - except: + obj = props.queried_obj + if obj is None: return + geom = tool.Project.Link.get_selected_geometry(obj) + selected_vertices = geom.selected_vertices - root_obj: Union[bpy.types.Object, None] = props.queried_obj_root + root_obj = props.queried_obj_root if root_obj and not (m := root_obj.matrix_world).is_identity: selected_vertices = [m @ Vector(v) for v in selected_vertices] - if selected_edges: - self.draw_batch("LINES", selected_vertices, selected_elements_color, selected_edges) - self.draw_batch("TRIS", selected_vertices, transparent_color(selected_elements_color), selected_tris) + if geom.selected_edges: + self.draw_batch("LINES", selected_vertices, selected_elements_color, geom.selected_edges) + self.draw_batch("TRIS", selected_vertices, transparent_color(selected_elements_color), geom.selected_tris) class ClippingPlaneDecorator: diff --git a/src/bonsai/bonsai/bim/module/project/gizmo.py b/src/bonsai/bonsai/bim/module/project/gizmo.py index bb372b9cb7d..fa8edb8c7e8 100644 --- a/src/bonsai/bonsai/bim/module/project/gizmo.py +++ b/src/bonsai/bonsai/bim/module/project/gizmo.py @@ -17,11 +17,11 @@ # along with Bonsai. If not, see . -import bpy -import bonsai.tool as tool from bpy.types import GizmoGroup from mathutils import Matrix +import bonsai.tool as tool + class ClippingPlane(GizmoGroup): bl_idname = "OBJECT_GGT_bim_clipping_plane" diff --git a/src/bonsai/bonsai/bim/module/project/operator.py b/src/bonsai/bonsai/bim/module/project/operator.py index c0dd8c70c1b..d38c4f3b688 100644 --- a/src/bonsai/bonsai/bim/module/project/operator.py +++ b/src/bonsai/bonsai/bim/module/project/operator.py @@ -16,58 +16,65 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . -import os -import bpy -import time +import datetime import json import logging +import os +import subprocess import tempfile +import time import traceback -import subprocess -import datetime -import ifcopenshell.api.attribute -import numpy as np +from collections import defaultdict +from math import radians +from pathlib import Path +from typing import TYPE_CHECKING, Literal, Union, get_args + +import bpy import ifcopenshell -import ifcopenshell.api +import ifcopenshell.api.attribute +import ifcopenshell.api.document import ifcopenshell.api.nest import ifcopenshell.api.project import ifcopenshell.api.root import ifcopenshell.geom import ifcopenshell.ifcopenshell_wrapper as W +import ifcopenshell.util.element import ifcopenshell.util.file -import ifcopenshell.util.selector import ifcopenshell.util.geolocation import ifcopenshell.util.representation -import ifcopenshell.util.element -import ifcopenshell.util.representation +import ifcopenshell.util.selector import ifcopenshell.util.shape import ifcopenshell.util.shape_builder import ifcopenshell.util.unit +import numpy as np +from bpy.app.handlers import persistent +from bpy_extras.io_utils import ExportHelper, ImportHelper +from bpy_extras.view3d_utils import ( + region_2d_to_origin_3d, + region_2d_to_vector_3d, +) +from mathutils import Vector + import bonsai.bim.handler import bonsai.bim.helper -import bonsai.bim.schema -import bonsai.tool as tool import bonsai.core.project as core -from bpy_extras.io_utils import ExportHelper, ImportHelper +import bonsai.tool as tool +from bonsai.bim import export_ifc, import_ifc from bonsai.bim.ifc import IfcStore -from bonsai.bim.ui import IFCFileSelector -from bonsai.bim import import_ifc -from bonsai.bim import export_ifc -from math import radians -from pathlib import Path -from collections import defaultdict -from mathutils import Vector, Matrix -from bpy.app.handlers import persistent -from ifcopenshell.geom import ShapeElementType +from bonsai.bim.module.model.decorator import FaceAreaDecorator, PolylineDecorator +from bonsai.bim.module.model.polyline import PolylineOperator from bonsai.bim.module.project.data import LinksData, ProjectLibraryData -from bonsai.bim.module.project.decorator import ProjectDecorator, ClippingPlaneDecorator, MeasureDecorator +from bonsai.bim.module.project.decorator import ( + ClippingPlaneDecorator, + MeasureDecorator, + ProjectDecorator, +) from bonsai.bim.module.project.prop import BreadcrumbType -from bonsai.bim.module.model.decorator import PolylineDecorator, FaceAreaDecorator -from bonsai.bim.module.model.polyline import PolylineOperator -from typing import Union, TYPE_CHECKING, get_args, Literal +from bonsai.bim.ui import IFCFileSelector if TYPE_CHECKING: import bpy.stub_internal.rna_enums as rna_enums + from bonsai.bim.module.project.prop import Link @@ -79,9 +86,7 @@ class NewProject(bpy.types.Operator): bl_label = "New Project" bl_options = {"REGISTER", "UNDO"} bl_description = "Start a new IFC project in a fresh session" - preset: bpy.props.EnumProperty( # pyright: ignore[reportRedeclaration] - items=[(i, i, "") for i in get_args(PresetType)] - ) + preset: bpy.props.EnumProperty(items=[(i, i, "") for i in get_args(PresetType)]) if TYPE_CHECKING: preset: PresetType @@ -119,8 +124,6 @@ def execute(self, context) -> set["rna_enums.OperatorReturnItems"]: bpy.context.scene.unit_settings.length_unit = "MILLIMETERS" bim_props.area_unit = "SQUARE_METRE" bim_props.volume_unit = "CUBIC_METRE" - bim_props.mass_unit = "KILOGRAM" - bim_props.time_unit = "SECOND" pprops.template_file = "IFC4 Demo Template.ifc" if self.preset != "wizard": @@ -177,6 +180,11 @@ class SelectLibraryFile(bpy.types.Operator, IFCFileSelector, ImportHelper): append_all: bpy.props.BoolProperty(default=False) use_relative_path: bpy.props.BoolProperty(name="Use Relative Path", default=False) + if TYPE_CHECKING: + filter_glob: str + append_all: bool + use_relative_path: bool + reload_previous_file = False def invoke(self, context, event): @@ -553,8 +561,12 @@ def _execute(self, context): class AppendLibraryElementByQuery(bpy.types.Operator, tool.Ifc.Operator): bl_idname = "bim.append_library_element_by_query" bl_label = "Append Library Element By Query" + query: bpy.props.StringProperty(name="Query") + if TYPE_CHECKING: + query: str + @classmethod def poll(cls, context): return tool.Ifc.get() @@ -586,6 +598,11 @@ class AppendLibraryElement(bpy.types.Operator, tool.Ifc.Operator): prop_index: bpy.props.IntProperty() assume_unique_by_name: bpy.props.BoolProperty(name="Assume Unique By Name", default=True, options={"SKIP_SAVE"}) + if TYPE_CHECKING: + definition: int + prop_index: int + assume_unique_by_name: bool + file: ifcopenshell.file @classmethod @@ -613,8 +630,6 @@ def _execute(self, context): if not element: return {"FINISHED"} if element.is_a("IfcTypeProduct"): - # Store opening template from library if it exists - self.store_opening_template_from_library(element, library_file) self.import_type_from_ifc(element, context) elif element.is_a("IfcProduct"): # NOTE: Non-types are not exposed in UI directly @@ -715,53 +730,6 @@ def import_material_styles( if element.is_a("IfcSurfaceStyle") and not tool.Ifc.get_object_by_identifier(element.id()): ifc_importer.create_style(element) - def store_opening_template_from_library( - self, element: ifcopenshell.entity_instance, library_file: ifcopenshell.file - ) -> None: - """ - Find an opening representation in the library and copy it to the current file - as a template. Store the template ID on the type for later retrieval. - """ - try: - library_element = library_file.by_guid(element.GlobalId) - except: - return - - # Find occurrences with openings in the library - library_occurrences = ifcopenshell.util.element.get_types(library_element) - - for occurrence in library_occurrences: - if not getattr(occurrence, "FillsVoids", None): - continue - - library_opening = occurrence.FillsVoids[0].RelatingOpeningElement - library_opening_rep = ifcopenshell.util.representation.get_representation( - library_opening, "Model", "Body", "MODEL_VIEW" - ) - - if not library_opening_rep: - continue - - # Check if mapped representation - if ( - library_opening_rep.RepresentationType == "MappedRepresentation" - and len(library_opening_rep.Items) == 1 - and library_opening_rep.Items[0].is_a("IfcMappedItem") - ): - - mapped_rep = library_opening_rep.Items[0].MappingSource.MappedRepresentation - - # Store ALL representation types (Tessellation, SweptSolid, etc.) - template_rep = ifcopenshell.util.element.copy_deep( - self.file, mapped_rep, exclude=["IfcGeometricRepresentationContext"] - ) - - # Store reference in type's Description - current_desc = element.Description or "" - element.Description = f"{current_desc}||BonsaiOpeningTemplate:{template_rep.id()}" - return - break - class EditProjectLibrary(bpy.types.Operator): bl_idname = "bim.edit_project_library" @@ -1011,6 +979,15 @@ class LoadProject(bpy.types.Operator, IFCFileSelector, ImportHelper): use_detailed_tooltip: bpy.props.BoolProperty(default=False, options={"HIDDEN"}) filename_ext = ".ifc" + if TYPE_CHECKING: + filepath: str + filter_glob: str + is_advanced: bool + use_relative_path: bool + should_start_fresh_session: bool + import_without_ifc_data: bool + use_detailed_tooltip: bool + @classmethod def description(cls, context, properties): tooltip = cls.bl_description @@ -1062,18 +1039,34 @@ def execute(self, context): and not self.is_advanced ): filepath = self.get_filepath() - suffix = tool.Blender.get_addon_preferences().metadata_blend_file_suffix - if str(filepath).lower().endswith(".ifc"): - metadata_path = Path(str(filepath)[:-4] + suffix) - else: - metadata_path = Path(str(filepath) + suffix) - if metadata_path.exists() and metadata_path.is_file(): - try: - bpy.ops.bim.load_blend_metadata_and_ifc(filepath=filepath) - self.report({"INFO"}, f"Loaded metadata file: {metadata_path.name}") - return {"FINISHED"} - except Exception as e: - self.report({"WARNING"}, f"Failed to load metadata file, using regular load: {e}") + + # First, load the IFC file temporarily to check for metadata document + temp_ifc = None + has_metadata_doc = False + try: + temp_ifc = ifcopenshell.open(str(filepath)) + for doc in temp_ifc.by_type("IfcDocumentInformation"): + if getattr(doc, "Scope", None) == "BLEND_METADATA": + has_metadata_doc = True + break + except: + pass + finally: + temp_ifc = None + + if has_metadata_doc: + suffix = tool.Blender.get_addon_preferences().metadata_blend_file_suffix + if str(filepath).lower().endswith(".ifc"): + metadata_path = Path(str(filepath)[:-4] + suffix) + else: + metadata_path = Path(str(filepath) + suffix) + if metadata_path.exists() and metadata_path.is_file(): + try: + bpy.ops.bim.load_blend_metadata_and_ifc(filepath=filepath) + self.report({"INFO"}, f"Loaded metadata file: {metadata_path.name}") + return {"FINISHED"} + except Exception as e: + self.report({"WARNING"}, f"Failed to load metadata file, using regular load: {e}") @persistent def load_handler(*args): @@ -1095,7 +1088,7 @@ def load_handler(*args): else: return self.finish_loading_project(context) - def finish_loading_project(self, context): + def finish_loading_project(self, context: bpy.types.Context) -> set["rna_enums.OperatorReturnItems"]: try: filepath = self.get_filepath() if not self.is_existing_ifc_file(): @@ -1121,6 +1114,10 @@ def finish_loading_project(self, context): props.is_loading = True props.total_elements = len(tool.Ifc.get().by_type("IfcElement")) props.use_relative_project_path = self.use_relative_path + + metadata_doc = tool.Project.get_metadata_document_information() + props.should_save_metadata_for_this_file = metadata_doc is not None + tool.Blender.register_toolbar() tool.Project.add_recent_ifc_project(self.get_filepath_abs()) @@ -1291,6 +1288,9 @@ class ToggleFilterCategories(bpy.types.Operator): bl_options = {"REGISTER", "UNDO"} should_select: bpy.props.BoolProperty(name="Should Select", default=True) + if TYPE_CHECKING: + should_select: bool + def execute(self, context): props = tool.Project.get_project_props() for filter_category in props.filter_categories: @@ -1298,7 +1298,7 @@ def execute(self, context): return {"FINISHED"} -class LinkIfc(bpy.types.Operator, ImportHelper): +class LinkIfc(bpy.types.Operator, ImportHelper, tool.Ifc.Operator): bl_idname = "bim.link_ifc" bl_label = "Link IFC" bl_options = {"REGISTER", "UNDO"} @@ -1313,6 +1313,14 @@ class LinkIfc(bpy.types.Operator, ImportHelper): default=False, ) use_cache: bpy.props.BoolProperty(name="Use Cache", default=True) + query: bpy.props.StringProperty( + name="Query", + description=( + "Custom selector query to use to load element from a linked model. E.g. 'IfcElement'.\n\n" + "Default query - IfcElement, but excluding IfcProxy, IfcSpatialStructureElement, IfcSpatialElement, IfcFeatureElement." + ), + ) + filename_ext = ".ifc" if TYPE_CHECKING: @@ -1322,155 +1330,179 @@ class LinkIfc(bpy.types.Operator, ImportHelper): filter_glob: str use_relative_path: bool use_cache: bool + query: str def draw(self, context): + assert self.layout pprops = tool.Project.get_project_props() row = self.layout.row() row.prop(self, "use_relative_path") row = self.layout.row() row.prop(self, "use_cache") row = self.layout.row() - row.prop(pprops, "false_origin_mode") + row.label(text="False Origin Mode:") + row = self.layout.row() + row.prop(pprops, "false_origin_mode", text="") if pprops.false_origin_mode == "MANUAL": row = self.layout.row() row.prop(pprops, "false_origin") row = self.layout.row() row.prop(pprops, "project_north") + self.layout.prop(self, "query", placeholder="IfcElement") - def execute(self, context): + def _execute(self, context): start = time.time() files = [f.name for f in self.files] if self.files else [self.filepath] + + if not files or all(not f or not f.strip() for f in files): + self.report({"ERROR"}, "No file selected") + return {"CANCELLED"} + + existing_links = tool.Project.get_linked_models_documents() if tool.Ifc.get() else {} for filename in files: + if not filename or not filename.strip(): + continue filepath = Path(self.directory) / filename if bpy.data.filepath and filepath.samefile(bpy.data.filepath): self.report({"INFO"}, "Can't link the current .blend file") continue props = tool.Project.get_project_props() - new = props.links.add() filepath = tool.Ifc.get_uri(filepath, use_relative_path=self.use_relative_path) + + new = props.links.add() + if tool.Ifc.get(): + if not (document := existing_links.get(filepath)): + document = ifcopenshell.api.document.add_information(tool.Ifc.get()) + document.Name = Path(filepath).name + document.Scope = "LINKED_MODEL" + reference = ifcopenshell.api.document.add_reference(tool.Ifc.get(), information=document) + reference[1] = ",".join([str(o) for o in np.eye(4).flatten().tolist()]) + reference.Location = filepath.replace("\\", "/") + new.ifc_definition_id = reference.id() new.name = filepath - status = bpy.ops.bim.load_link(filepath=filepath, use_cache=self.use_cache) - if status == {"CANCELLED"}: - error_msg = ( - f'Error processing IFC file "{filepath}" ' - "was critical and blend file either wasn't saved or wasn't updated. " - "See logs above in system console for details." - ) - print(error_msg) - self.report({"ERROR"}, error_msg) - return {"FINISHED"} - print(f"Finished linking {len(files)} IFCs", time.time() - start) - return {"FINISHED"} + new.filepath = filepath + bpy.ops.bim.load_link(link_index=-1, use_cache=self.use_cache, query=self.query) -class UnlinkIfc(bpy.types.Operator): +class UnlinkIfc(bpy.types.Operator, tool.Ifc.Operator): bl_idname = "bim.unlink_ifc" bl_label = "Unlink IFC" bl_options = {"REGISTER", "UNDO"} bl_description = "Remove the selected file from the link list" - filepath: bpy.props.StringProperty() - def execute(self, context): - filepath = Path(self.filepath).as_posix() - bpy.ops.bim.unload_link(filepath=filepath) + link_index: bpy.props.IntProperty(name="Link Index") + + if TYPE_CHECKING: + link_index: int + + def _execute(self, context): props = tool.Project.get_project_props() - index = props.links.find(filepath) - if index != -1: - props.links.remove(index) - return {"FINISHED"} + link = props.links[self.link_index] + bpy.ops.bim.unload_link(link_index=self.link_index) + if tool.Ifc.get(): + reference = tool.Ifc.get().by_id(link.ifc_definition_id) + document = tool.Document.get_reference_document(reference) + ifcopenshell.api.document.remove_reference(tool.Ifc.get(), reference) + if document and not tool.Document.get_document_references(document): + ifcopenshell.api.document.remove_information(tool.Ifc.get(), document) + props.links.remove(self.link_index) -class UnloadLink(bpy.types.Operator): +class UnloadLink(bpy.types.Operator, tool.Ifc.Operator): bl_idname = "bim.unload_link" bl_label = "Unload Link" bl_options = {"REGISTER", "UNDO"} bl_description = "Unload the selected linked file" - filepath: bpy.props.StringProperty() - def execute(self, context): - filepath = tool.Blender.ensure_blender_path_is_abs(Path(self.filepath)) - if filepath.suffix.lower() == ".ifc": - filepath = filepath.with_suffix(".ifc.cache.blend") + link_index: bpy.props.IntProperty(name="Link Index") - for library in list(bpy.data.libraries): - if tool.Blender.ensure_blender_path_is_abs(Path(library.filepath)) == filepath: - bpy.data.libraries.remove(library) + if TYPE_CHECKING: + link_index: int - props = tool.Project.get_project_props() - links = props.links - link = links[self.filepath] - # Let's assume that user might delete it. - if empty_handle := link.empty_handle: - bpy.data.objects.remove(empty_handle) - - # following lines removes the library also when use_relative_path=True, otherwise it doesn't - libraries = bpy.data.libraries - for library in libraries: - if library.name == self.filepath + ".cache.blend": + def _execute(self, context): + link = tool.Project.get_project_props().links[self.link_index] + if obj := tool.Project.get_link_empty_handle(link): + collection = obj.instance_collection + library = collection.library + tool.Ifc.unlink(obj=obj) + bpy.data.objects.remove(obj) + if collection.users == 0: + bpy.data.collections.remove(collection) + if not len([c for c in bpy.data.collections if c.library == library]): bpy.data.libraries.remove(library) - link.is_loaded = False - - if not any([l.is_loaded for l in links]): - ProjectDecorator.uninstall() - # we make sure we don't draw queried object from the file that was just unlinked - elif queried_obj := props.queried_obj: - queried_filepath = Path(queried_obj["ifc_filepath"]) - if queried_filepath == filepath: - ProjectDecorator.uninstall() - - return {"FINISHED"} + ProjectDecorator.uninstall() -class LoadLink(bpy.types.Operator): +class LoadLink(bpy.types.Operator, tool.Ifc.Operator): bl_idname = "bim.load_link" bl_label = "Load Link" bl_options = {"REGISTER", "UNDO"} bl_description = "Load the selected file" - filepath: bpy.props.StringProperty(name="Link Filepath") + + link_index: bpy.props.IntProperty(name="Link Index") use_cache: bpy.props.BoolProperty(name="Use Cache", default=True) + query: bpy.props.StringProperty() - filepath_: Path + if TYPE_CHECKING: + link_index: int + use_cache: bool + query: str - def execute(self, context): - filepath = Path(tool.Ifc.resolve_uri(self.filepath)) + def _execute(self, context): + self.link = tool.Project.get_project_props().links[self.link_index] + filepath = Path(tool.Ifc.resolve_uri(self.link.filepath)) if not filepath.exists(): self.report({"ERROR"}, f"File does not exist: '{filepath}'") return {"CANCELLED"} self.filepath_ = filepath - if filepath.suffix.lower().endswith(".blend"): - self.link_blend(filepath) - elif filepath.suffix.lower().endswith(".ifc"): - status = self.link_ifc() - if status: - return status - return {"FINISHED"} + if filepath.suffix.lower().endswith(".ifc"): + return self.link_ifc() def link_blend(self, filepath: Path) -> None: with bpy.data.libraries.load(str(filepath), link=True) as (data_from, data_to): - data_to.scenes = data_from.scenes - link = tool.Project.get_project_props().links[self.filepath] - for scene in bpy.data.scenes: - if not scene.library or Path(scene.library.filepath) != filepath: + data_to.collections = [c for c in data_from.collections if "IfcProject" in c] + + # Find the linked collection + for collection in bpy.data.collections: + if not collection.library or Path(collection.library.filepath) != filepath: continue - for child in scene.collection.children: - if "IfcProject" not in child.name: - continue - empty = bpy.data.objects.new(child.name, None) - empty.instance_type = "COLLECTION" - empty.instance_collection = child - link.empty_handle = empty - bpy.context.scene.collection.objects.link(empty) - break + # Create unique empty instance for this link + empty_name = collection.name + empty = bpy.data.objects.new(empty_name, None) + empty.instance_type = "COLLECTION" + empty.instance_collection = collection + empty.matrix_world = tool.Project.calculate_link_matrix(self.link) + + tool.Project.set_link_empty_handle(self.link, empty) + assert bpy.context.scene + bpy.context.scene.collection.objects.link(empty) + self.link.is_loaded = True + if tool.Ifc.get(): # For non-IFC projects, locking has no meaning + tool.Geometry.lock_object(empty) + tool.Blender.select_and_activate_single_object(bpy.context, empty) break - link.is_loaded = True - tool.Blender.select_and_activate_single_object(bpy.context, empty) + else: + print(f"WARNING: No IfcProject collection found in {filepath}") + self.link.is_loaded = False def link_ifc(self) -> Union[set[str], None]: blend_filepath = self.filepath_.with_suffix(".ifc.cache.blend") h5_filepath = self.filepath_.with_suffix(".ifc.cache.h5") + json_filepath = self.filepath_.with_suffix(".ifc.cache.json") - if not self.use_cache and blend_filepath.exists(): + def should_clear_cache() -> bool: + if not self.use_cache: + return True + if not blend_filepath.exists(): + return False + data = json.loads(json_filepath.read_text()) + # Empty 'query' - model loaded without custom query. + # Missing 'query' - model was loaded before custom queries were introduced in Bonsai. + query = data.get("query", "") + return query != self.query + + if should_clear_cache(): os.remove(blend_filepath) if not blend_filepath.exists(): @@ -1479,14 +1511,12 @@ def link_ifc(self) -> Union[set[str], None]: code = f""" import bpy +import sys def run(): import bonsai.tool as tool gprops = tool.Georeference.get_georeference_props() # Our model origin becomes their host model origin - gprops.host_model_origin = "{gprops.model_origin}" - gprops.host_model_origin_si = "{gprops.model_origin_si}" - gprops.host_model_project_north = "{gprops.model_project_north}" gprops.has_blender_offset = {gprops.has_blender_offset} gprops.blender_offset_x = "{gprops.blender_offset_x}" gprops.blender_offset_y = "{gprops.blender_offset_y}" @@ -1499,7 +1529,12 @@ def run(): pprops.false_origin = "{pprops.false_origin}" pprops.project_north = "{pprops.project_north}" # Use absolute path to be safe from cwd changes. - bpy.ops.bim.load_linked_project(filepath=r"{str(self.filepath_)}") + try: + bpy.ops.bim.load_linked_project(filepath=r"{str(self.filepath_)}", query={repr(self.query)}) + except RuntimeError as e: + # Operator failed (returned CANCELLED with error report) + print(f"Failed to load linked project: {{e}}") + sys.exit(1) # Use str instead of as_posix to avoid issues with Windows shared paths. bpy.ops.wm.save_as_mainfile(filepath=r"{str(blend_filepath)}") @@ -1533,14 +1568,17 @@ def run(): if not blend_filepath.exists() or blend_filepath.stat().st_mtime < t: return {"CANCELLED"} - self.set_model_origin_from_link() - + self.set_model_origin_from_link() + self.set_georeferencing_indicator() self.link_blend(blend_filepath) def set_model_origin_from_link(self) -> None: if tool.Ifc.get(): return # The current model's coordinates always take priority. + if len(tool.Project.get_project_props().links) > 1: + return # Only the first link sets the origin + json_filepath = self.filepath_.with_suffix(".ifc.cache.json") if not json_filepath.exists(): return @@ -1553,21 +1591,40 @@ def set_model_origin_from_link(self) -> None: if (value := data.get(prop, None)) is not None: setattr(gprops, prop, value) + def set_georeferencing_indicator(self) -> None: + if not tool.Ifc.get(): + self.link.georeferenced = "NONE" + return + if not (crs_name := (ifcopenshell.util.geolocation.get_crs(tool.Ifc.get()) or {}).get("Name", "")): + self.link.georeferenced = "NONE" + return + reference = tool.Ifc.get().by_id(self.link.ifc_definition_id) + json_filepath = Path(reference.Location).with_suffix(".ifc.cache.json") + if not json_filepath.exists(): + self.link.georeferenced = "NONE" + return + with open(json_filepath, "r") as f: + data = json.load(f) + if not data["model_is_georeferenced"]: + self.link.georeferenced = "NONE" + else: + self.link.georeferenced = "FULL_COMPATIBLE" if crs_name == data["model_crs"] else "NOT_COMPATIBLE" + class ReloadLink(bpy.types.Operator): bl_idname = "bim.reload_link" bl_label = "Reload Link" bl_options = {"REGISTER", "UNDO"} bl_description = "Reload the selected file" - filepath: bpy.props.StringProperty() + + link_index: bpy.props.IntProperty(name="Link Index") + + if TYPE_CHECKING: + link_index: int def execute(self, context): - is_abs = os.path.isabs(Path(self.filepath)) - use_relative_path = not is_abs - bpy.ops.bim.unlink_ifc(filepath=self.filepath) - filepath = tool.Ifc.resolve_uri(self.filepath) - status = bpy.ops.bim.link_ifc(filepath=filepath, use_cache=False, use_relative_path=use_relative_path) - return {"FINISHED"} + bpy.ops.bim.unload_link(link_index=self.link_index) + return bpy.ops.bim.load_link(link_index=self.link_index, use_cache=False) or {"FINISHED"} class ToggleLinkSelectability(bpy.types.Operator): @@ -1575,16 +1632,22 @@ class ToggleLinkSelectability(bpy.types.Operator): bl_label = "Toggle Link Selectability" bl_options = {"REGISTER", "UNDO"} bl_description = "Toggle selectability" - link: bpy.props.StringProperty(name="Linked IFC Filepath") + + link_index: bpy.props.IntProperty(name="Link Index") + + if TYPE_CHECKING: + link_index: int def execute(self, context): props = tool.Project.get_project_props() - link = props.links[self.link] - self.library_filepath = tool.Blender.ensure_blender_path_is_abs(Path(self.link).with_suffix(".ifc.cache.blend")) + link = props.links[self.link_index] + self.library_filepath = tool.Blender.ensure_blender_path_is_abs( + Path(link.filepath).with_suffix(".ifc.cache.blend") + ) link.is_selectable = (is_selectable := not link.is_selectable) for collection in self.get_linked_collections(): collection.hide_select = not is_selectable - if handle := link.empty_handle: + if handle := tool.Project.get_link_empty_handle(link): handle.hide_select = not is_selectable return {"FINISHED"} @@ -1601,13 +1664,23 @@ class ToggleLinkVisibility(bpy.types.Operator): bl_label = "Toggle Link Visibility" bl_options = {"REGISTER", "UNDO"} bl_description = "Toggle visibility between SOLID and WIREFRAME" - link: bpy.props.StringProperty(name="Linked IFC Filepath") - mode: bpy.props.EnumProperty(name="Visibility Mode", items=((i, i, "") for i in ("WIREFRAME", "VISIBLE"))) + + link_index: bpy.props.IntProperty(name="Link Index") + mode: bpy.props.EnumProperty( + name="Visibility Mode", + items=((i, i, "") for i in ("WIREFRAME", "VISIBLE")), + ) + + if TYPE_CHECKING: + link_index: int + mode: Literal["WIREFRAME", "VISIBLE"] def execute(self, context): props = tool.Project.get_project_props() - link = props.links[self.link] - self.library_filepath = tool.Blender.ensure_blender_path_is_abs(Path(self.link).with_suffix(".ifc.cache.blend")) + link = props.links[self.link_index] + self.library_filepath = tool.Blender.ensure_blender_path_is_abs( + Path(link.filepath).with_suffix(".ifc.cache.blend") + ) if self.mode == "WIREFRAME": self.toggle_wireframe(link) elif self.mode == "VISIBLE": @@ -1615,12 +1688,16 @@ def execute(self, context): return {"FINISHED"} def toggle_wireframe(self, link: "Link") -> None: + linked_collections = self.get_linked_collections() + link.is_wireframe = not link.is_wireframe display_type = "WIRE" if link.is_wireframe else "TEXTURED" - for collection in self.get_linked_collections(): + for collection in linked_collections: objs = filter(lambda obj: "IfcOpeningElement" not in obj.name, collection.all_objects) for obj in objs: obj.display_type = display_type + if handle := tool.Project.get_link_empty_handle(link): + handle.display_type = display_type def toggle_visibility(self, link: "Link") -> None: linked_collections = self.get_linked_collections() @@ -1629,7 +1706,7 @@ def toggle_visibility(self, link: "Link") -> None: layer_collections = tool.Blender.get_layer_collections_mapping(linked_collections) for layer_collection in layer_collections.values(): layer_collection.exclude = is_hidden - if handle := link.empty_handle: + if handle := tool.Project.get_link_empty_handle(link): handle.hide_set(is_hidden) def get_linked_collections(self) -> list[bpy.types.Collection]: @@ -1640,17 +1717,105 @@ def get_linked_collections(self) -> list[bpy.types.Collection]: ] +class EnableEditingLink(bpy.types.Operator): + bl_idname = "bim.enable_editing_link" + bl_label = "Enable Editing Link" + bl_options = {"REGISTER", "UNDO"} + bl_description = "Enable editing link location" + + def execute(self, context): + link = tool.Project.get_project_props().active_link + assert link + link.is_editing = True + obj = tool.Project.get_link_empty_handle(link) + assert obj + tool.Geometry.unlock_object(obj) + return {"FINISHED"} + + +class DisableEditingLink(bpy.types.Operator): + bl_idname = "bim.disable_editing_link" + bl_label = "Disable Editing Link" + bl_options = {"REGISTER", "UNDO"} + bl_description = "Disable editing link and restore to previously saved location" + + def execute(self, context): + link = tool.Project.get_project_props().active_link + assert link + link.is_editing = False + obj = tool.Project.get_link_empty_handle(link) + assert obj + obj.matrix_world = tool.Project.calculate_link_matrix(link) + tool.Geometry.lock_object(obj) + return {"FINISHED"} + + +class EditLink(bpy.types.Operator, tool.Ifc.Operator): + bl_idname = "bim.edit_link" + bl_label = "Edit Link" + bl_options = {"REGISTER", "UNDO"} + bl_description = "Disable editing link and restore to previously saved location" + + def _execute(self, context): + link = tool.Project.get_project_props().active_link + assert link + link.is_editing = False + obj = tool.Project.get_link_empty_handle(link) + assert obj + new_obj_matrix = obj.matrix_world + + filepath = Path(tool.Ifc.resolve_uri(link.filepath)) + with open(filepath.with_suffix(".ifc.cache.json"), "r") as f: + metadata = json.load(f) + + rot = ifcopenshell.util.shape_builder.np_rotation_matrix( + radians(-float(metadata["model_project_north"])), 4, "Z" + ) + global_matrix = rot @ np.eye(4) + global_matrix[:, 3][:3] = [float(o) for o in metadata["model_origin_si"].split(",")] + + gprops = tool.Georeference.get_georeference_props() + rot = ifcopenshell.util.shape_builder.np_rotation_matrix(radians(-float(gprops.model_project_north)), 4, "Z") + local_matrix = rot @ np.eye(4) + local_matrix[:, 3][:3] = [float(o) for o in gprops.model_origin_si.split(",")] + + # obj_matrix is typically calculated as: + # obj_matrix = np.linalg.inv(local_matrix) @ transformation @ global_matrix + identity_blender_matrix = np.linalg.inv(local_matrix) @ global_matrix + if np.allclose(np.array(new_obj_matrix), identity_blender_matrix, atol=1e-5): + link.has_transformation = False + transformation = ",".join(map(str, np.eye(4).reshape(-1))) + else: + transformed_global_matrix = local_matrix @ np.array(new_obj_matrix) + transformation = transformed_global_matrix @ np.linalg.inv(global_matrix) + link.has_transformation = True + transformation = ",".join(map(str, transformation.reshape(-1))) + + if tool.Ifc.get(): + reference = tool.Ifc.get().by_id(link.ifc_definition_id) + reference[1] = transformation + else: + link.transformation = transformation + + obj.matrix_world = tool.Project.calculate_link_matrix(link) + tool.Geometry.lock_object(obj) + + class SelectLinkHandle(bpy.types.Operator): bl_idname = "bim.select_link_handle" bl_label = "Select Link Handle" bl_options = {"REGISTER", "UNDO"} bl_description = "Select link empty object handle" - index: bpy.props.IntProperty(name="Link Index") + + link_index: bpy.props.IntProperty(name="Link Index") + + if TYPE_CHECKING: + link_index: int def execute(self, context): props = tool.Project.get_project_props() - link = props.links[self.index] - handle = link.empty_handle + link = props.links[self.link_index] + handle = tool.Project.get_link_empty_handle(link) if not handle: self.report({"ERROR"}, "Link has no empty handle (probably it was deleted).") return {"CANCELLED"} @@ -1658,6 +1823,43 @@ def execute(self, context): return {"FINISHED"} +class SelectLinkedModelElement(bpy.types.Operator): + bl_idname = "bim.select_linked_model_element" + bl_label = "Select Linked Model Element" + bl_options = {"REGISTER"} + bl_description = "Select an element in the currently selected linked model by providing GlobalId." + + guid: bpy.props.StringProperty(name="GlobalId") + + if TYPE_CHECKING: + guid: str + + def invoke(self, context, event): + assert context.window_manager + return context.window_manager.invoke_props_dialog(self) + + def execute(self, context) -> set["rna_enums.OperatorReturnItems"]: + guid = self.guid.strip() + if not guid: + self.report({"ERROR"}, "GlobalId is not provided.") + return {"CANCELLED"} + + props = tool.Project.get_project_props() + active_link = props.active_link + assert active_link is not None + assert active_link.is_loaded + + guid_obj = tool.Project.Link.get_obj_by_guid(active_link, guid) + if not guid_obj: + filepath = active_link.filepath + self.report({"INFO"}, f"Element with GlobalId '{guid}' not found in the linked model at '{filepath}'.") + return {"CANCELLED"} + + tool.Project.Link.select_linked_element(context, guid_obj, guid) + self.report({"INFO"}, f"Element with GlobalId '{guid}' is selected.") + return {"FINISHED"} + + class ExportIFC(bpy.types.Operator, ExportHelper): bl_idname = "bim.save_project" bl_label = "Save IFC" @@ -1672,6 +1874,13 @@ class ExportIFC(bpy.types.Operator, ExportHelper): should_save_as: bpy.props.BoolProperty(name="Should Save As", default=False, options={"HIDDEN"}) use_relative_path: bpy.props.BoolProperty(name="Use Relative Path", default=False) + if TYPE_CHECKING: + filter_glob: str + json_version: str + json_compact: bool + should_save_as: bool + use_relative_path: bool + @classmethod def poll(cls, context): return tool.Ifc.get() @@ -1749,6 +1958,22 @@ def _execute(self, context): settings.json_version = self.json_version settings.json_compact = self.json_compact + pprops = tool.Project.get_project_props() + if tool.Blender.get_addon_preferences().save_metadata_blend_file and pprops.should_save_metadata_for_this_file: + suffix = tool.Blender.get_addon_preferences().metadata_blend_file_suffix + if output_file.lower().endswith(".ifc"): + metadata_filename = os.path.basename(output_file)[:-4] + suffix + else: + metadata_filename = os.path.basename(output_file) + suffix + + if not tool.Project.get_metadata_document_information(): + tool.Project.create_metadata_document_information(metadata_filename) + else: + tool.Project.update_metadata_document_information(metadata_filename) + else: + if not pprops.should_save_metadata_for_this_file: + tool.Project.remove_metadata_document_information() + ifc_exporter = export_ifc.IfcExporter(settings) print("Starting export") settings.logger.info("Starting export") @@ -1765,7 +1990,8 @@ def _execute(self, context): tool.Ifc.set_path(output_file) bim_props.is_dirty = False - if tool.Blender.get_addon_preferences().save_metadata_blend_file: + pprops = tool.Project.get_project_props() + if tool.Blender.get_addon_preferences().save_metadata_blend_file and pprops.should_save_metadata_for_this_file: try: bpy.ops.bim.save_blend_metadata_file() suffix = tool.Blender.get_addon_preferences().metadata_blend_file_suffix @@ -1803,6 +2029,12 @@ class LoadLinkedProject(bpy.types.Operator, ImportHelper): bl_description = "Operator is used to load a project .cache.blend to then link it to the IFC file." bl_options = {"REGISTER", "UNDO"} + query: bpy.props.StringProperty() + """See ``bim.link_ifc``.""" + + if TYPE_CHECKING: + query: str + file: ifcopenshell.file meshes: dict[str, bpy.types.Mesh] # Material names is derived from diffuse as in 'r-g-b-a'. @@ -1813,9 +2045,10 @@ def invoke(self, context, event): return ImportHelper.invoke(self, context, event) def execute(self, context): - import ifcpatch import multiprocessing + import ifcpatch + start = time.time() pprops = tool.Project.get_project_props() @@ -1825,7 +2058,14 @@ def execute(self, context): print("Processing", self.filepath) self.collection = bpy.data.collections.new("IfcProject/" + os.path.basename(self.filepath)) - self.file = ifcopenshell.open(self.filepath) + + try: + self.file = ifcopenshell.open(self.filepath) + except Exception as e: + self.report({"ERROR"}, f"Failed to open IFC file: {str(e)}") + bpy.data.collections.remove(self.collection) + return {"CANCELLED"} + tool.Ifc.set(self.file) print("Finished opening") @@ -1844,32 +2084,28 @@ def execute(self, context): tool.Loader.settings.context_settings = tool.Loader.create_settings() tool.Loader.settings.gross_context_settings = tool.Loader.create_settings(is_gross=True) - self.elements = set(self.file.by_type("IfcElement")) - if self.file.schema in ("IFC2X3", "IFC4"): - self.elements |= set(self.file.by_type("IfcProxy")) - if self.file.schema == "IFC2X3": - self.elements |= set(self.file.by_type("IfcSpatialStructureElement")) + if self.query: + self.elements = ifcopenshell.util.selector.filter_elements(self.file, self.query) else: - self.elements |= set(self.file.by_type("IfcSpatialElement")) - self.elements -= set(self.file.by_type("IfcFeatureElement")) + self.elements = set(self.file.by_type("IfcElement")) + if self.file.schema in ("IFC2X3", "IFC4"): + self.elements |= set(self.file.by_type("IfcProxy")) + if self.file.schema == "IFC2X3": + self.elements |= set(self.file.by_type("IfcSpatialStructureElement")) + else: + self.elements |= set(self.file.by_type("IfcSpatialElement")) + self.elements -= set(self.file.by_type("IfcFeatureElement")) if tool.Loader.settings.false_origin_mode == "MANUAL" and tool.Loader.settings.false_origin: tool.Loader.set_manual_blender_offset(self.file) elif tool.Loader.settings.false_origin_mode == "AUTOMATIC": - if host_model_origin_si := gprops.host_model_origin_si: - host_model_origin_si = [float(o) / self.unit_scale for o in host_model_origin_si.split(",")] - tool.Loader.settings.false_origin = host_model_origin_si - tool.Loader.settings.project_north = float(gprops.host_model_project_north) - tool.Loader.set_manual_blender_offset(self.file) - else: - tool.Loader.guess_false_origin(self.file) + tool.Loader.guess_false_origin(self.file) tool.Georeference.set_model_origin() self.json_filepath = self.filepath + ".cache.json" data = { - "host_model_origin": gprops.host_model_origin, - "host_model_origin_si": gprops.host_model_origin_si, - "host_model_project_north": gprops.host_model_project_north, + "model_is_georeferenced": gprops.model_is_georeferenced, + "model_crs": gprops.model_crs, "model_origin": gprops.model_origin, "model_origin_si": gprops.model_origin_si, "model_project_north": gprops.model_project_north, @@ -1883,6 +2119,7 @@ def execute(self, context): "false_origin_mode": pprops.false_origin_mode, "false_origin": pprops.false_origin, "project_north": pprops.project_north, + "query": self.query, } with open(self.json_filepath, "w") as f: json.dump(data, f) @@ -1944,6 +2181,7 @@ def process_chunk() -> None: if iterator.initialize(): while True: # Main loop. shape = iterator.get() + assert isinstance(shape, W.TriangulationElement) results.add(self.file.by_id(shape.id)) geometry = shape.geometry @@ -2121,17 +2359,16 @@ class QueryLinkedElement(bpy.types.Operator): @classmethod def poll(cls, context): + assert context.area return context.area.type == "VIEW_3D" - def execute(self, context): - import sqlite3 - from bpy_extras.view3d_utils import region_2d_to_vector_3d, region_2d_to_origin_3d - + def execute(self, context) -> set["rna_enums.OperatorReturnItems"]: LinksData.linked_data = {} props = tool.Project.get_project_props() props.queried_obj = None - for area in bpy.context.screen.areas: + assert context.screen + for area in context.screen.areas: if area.type == "PROPERTIES": for region in area.regions: if region.type == "WINDOW": @@ -2139,128 +2376,112 @@ def execute(self, context): elif area.type == "VIEW_3D": area.tag_redraw() + assert context.region and context.region_data region = context.region rv3d = context.region_data coord = (self.mouse_x, self.mouse_y) origin = region_2d_to_origin_3d(region, rv3d, coord) direction = region_2d_to_vector_3d(region, rv3d, coord) - hit, location, normal, face_index, obj, instance_matrix = self.ray_cast(context, origin, direction) + hit, location, normal, face_index, obj, instance_matrix = tool.Blender.ray_cast_scene( + context, origin, direction + ) if not hit: self.report({"INFO"}, "No object found.") return {"FINISHED"} - if "guids" not in obj: + if not tool.Project.Link.is_linked_element(obj): self.report({"INFO"}, "Object is not a linked IFC element.") return {"FINISHED"} - guid = None - guid_start_index = 0 - for i, guid_end_index in enumerate(obj["guid_ids"]): - if face_index < guid_end_index: - guid = obj["guids"][i] - props.queried_obj = obj - props.queried_obj_root = self.find_obj_root(obj, instance_matrix) - - selected_tris = [] - selected_edges = [] - vert_indices = set() - for polygon in obj.data.polygons[guid_start_index:guid_end_index]: - vert_indices.update(polygon.vertices) - vert_indices = list(vert_indices) - vert_map = {k: v for v, k in enumerate(vert_indices)} - selected_vertices = [tuple(obj.matrix_world @ obj.data.vertices[vi].co) for vi in vert_indices] - for polygon in obj.data.polygons[guid_start_index:guid_end_index]: - selected_tris.append(tuple(vert_map[v] for v in polygon.vertices)) - selected_edges.extend(tuple([vert_map[vi] for vi in e] for e in polygon.edge_keys)) - - obj["selected_vertices"] = selected_vertices - obj["selected_edges"] = selected_edges - obj["selected_tris"] = selected_tris + guid = tool.Project.Link.get_guid_by_face_index(obj, face_index) + assert guid is not None + tool.Project.Link.select_linked_element(context, obj, guid) - break - guid_start_index = guid_end_index - - self.db = sqlite3.connect(obj["db"]) - self.c = self.db.cursor() + self.report({"INFO"}, f"Loaded data for {guid}") + ProjectDecorator.install(bpy.context) + return {"FINISHED"} - self.c.execute(f"SELECT * FROM elements WHERE global_id = '{guid}' LIMIT 1") - element = self.c.fetchone() + def invoke(self, context, event): + self.mouse_x = event.mouse_region_x + self.mouse_y = event.mouse_region_y + return self.execute(context) - attributes = {} - for i, attr in enumerate(["GlobalId", "IFC Class", "Predefined Type", "Name", "Description"]): - if element[i + 1] is not None: - attributes[attr] = element[i + 1] - self.c.execute("SELECT * FROM properties WHERE element_id = ?", (element[0],)) - rows = self.c.fetchall() +class HideQueriedLinkedElement(bpy.types.Operator): + bl_idname = "bim.hide_queried_linked_element" + bl_label = "Hide Queried Linked Element" + bl_description = ( + "Hide geometry for currently queried linked element.\n\n" + "SHIFT+Click (or SHIFT+H in Explore Tool) to hide everything " + "in the currently selected model, but the queried element.\n" + "ALT+Click (or ALT+H in Explore Tool) to unhide all geometry for currently selected linked model.\n\n" + "Known limitation: doesn't work with UNDO." + ) + bl_options = {"REGISTER", "UNDO"} - properties = {} - for row in rows: - properties.setdefault(row[1], {})[row[2]] = row[3] + unhide_all: bpy.props.BoolProperty(options={"SKIP_SAVE"}) + hide_all_except: bpy.props.BoolProperty(options={"SKIP_SAVE"}) - self.c.execute("SELECT * FROM relationships WHERE from_id = ?", (element[0],)) - relationships = self.c.fetchall() + if TYPE_CHECKING: + unhide_all: bool + hide_all_except: bool - relating_type_id = None + def invoke(self, context, event): + self.unhide_all = event.alt + self.hide_all_except = event.shift + return self.execute(context) - for relationship in relationships: - if relationship[1] == "IfcRelDefinesByType": - relating_type_id = relationship[2] + def execute(self, context) -> set["rna_enums.OperatorReturnItems"]: + props = tool.Project.get_project_props() - type_properties = {} - if relating_type_id is not None: - self.c.execute("SELECT * FROM properties WHERE element_id = ?", (relating_type_id,)) - rows = self.c.fetchall() - for row in rows: - type_properties.setdefault(row[1], {})[row[2]] = row[3] + if self.unhide_all: + return self.run_unhide_all() - LinksData.linked_data = { - "attributes": attributes, - "properties": [(k, properties[k]) for k in sorted(properties.keys())], - "type_properties": [(k, type_properties[k]) for k in sorted(type_properties.keys())], - } - self.db.close() + if self.hide_all_except: + return self.run_hide_all_except() - for area in bpy.context.screen.areas: - if area.type == "PROPERTIES": - for region in area.regions: - if region.type == "WINDOW": - region.tag_redraw() - elif area.type == "VIEW_3D": - area.tag_redraw() + obj = props.queried_obj + if not obj: + self.report({"INFO"}, "No object is queried to hide.") + return {"FINISHED"} + guid = props.queried_guid + tool.Project.Link.hide_linked_element(obj, guid) + tool.Project.Link.deselect_queried_linked_element() - self.report({"INFO"}, f"Loaded data for {guid}") - ProjectDecorator.install(bpy.context) + self.report({"INFO"}, "Queried object is now hidden.") return {"FINISHED"} - def ray_cast(self, context: bpy.types.Context, origin: Vector, direction: Vector): - depsgraph = context.evaluated_depsgraph_get() - result = context.scene.ray_cast(depsgraph, origin, direction) - return result - - def find_obj_root(self, obj: bpy.types.Object, matrix: Matrix) -> Union[bpy.types.Object, None]: - collections = set(obj.users_collection) - for o in bpy.data.objects: - if ( - o.type != "EMPTY" - or o.instance_type != "COLLECTION" - or o.instance_collection not in collections - or not np.allclose(matrix, o.matrix_world, atol=1e-4) - ): - continue - return o + def run_unhide_all(self) -> set["rna_enums.OperatorReturnItems"]: + props = tool.Project.get_project_props() + link = props.active_link + if not link: + self.report({"INFO"}, "No linked model is currently selected.") + return {"FINISHED"} + tool.Project.Link.unhide_all_elements(link) + self.report({"INFO"}, "All linked model geometry is unhidden.") + return {"FINISHED"} - def invoke(self, context, event): - self.mouse_x = event.mouse_region_x - self.mouse_y = event.mouse_region_y - return self.execute(context) + def run_hide_all_except(self) -> set["rna_enums.OperatorReturnItems"]: + props = tool.Project.get_project_props() + obj = props.queried_obj + if not obj: + self.report({"INFO"}, "No object is queried.") + return {"FINISHED"} + link = props.active_link + if not link: + self.report({"INFO"}, "No linked model is currently selected.") + return {"FINISHED"} + guid = props.queried_guid + tool.Project.Link.hide_all_elements_except(link, obj, guid) + self.report({"INFO"}, "All other linked model geometry is now hidden.") + return {"FINISHED"} class AppendInspectedLinkedElement(AppendLibraryElement): bl_idname = "bim.append_inspected_linked_element" bl_label = "Append Inspected Linked Element" bl_description = "Append inspected linked element" - bl_options = {"REGISTER"} + bl_options = {"REGISTER", "UNDO"} def _execute(self, context): from bonsai.bim.module.project.data import LinksData @@ -2276,6 +2497,7 @@ def _execute(self, context): return {"CANCELLED"} queried_obj = props.queried_obj + assert queried_obj ifc_file = tool.Ifc.get() linked_ifc_file: ifcopenshell.file @@ -2312,7 +2534,7 @@ def __init__(self, *args, **kwargs): self.total_mousemoves = 0 self.cullable_objects = [] - def modal(self, context, event): + def modal(self, context, event) -> set["rna_enums.OperatorReturnItems"]: if not LinksData.enable_culling: for obj in bpy.context.visible_objects: if obj.type == "MESH" and obj.name.startswith("Ifc"): @@ -2343,7 +2565,7 @@ def modal(self, context, event): return {"PASS_THROUGH"} - def is_view_changed(self, context): + def is_view_changed(self, context: bpy.types.Context) -> bool: view_matrix = context.region_data.view_matrix projection_matrix = context.region_data.window_matrix vp_matrix = projection_matrix @ view_matrix @@ -2358,7 +2580,7 @@ def is_view_changed(self, context): return True return False - def is_object_in_view(self, obj, context, camera_position): + def is_object_in_view(self, obj: bpy.types.Object, context: bpy.types.Context, camera_position: Vector) -> bool: # Get the view matrix and the projection matrix from the active viewport view_matrix = context.region_data.view_matrix projection_matrix = context.region_data.window_matrix @@ -2385,7 +2607,7 @@ def is_object_in_view(self, obj, context, camera_position): return False return True - def invoke(self, context, event): + def invoke(self, context: bpy.types.Context, event: bpy.types.Event) -> set["rna_enums.OperatorReturnItems"]: LinksData.enable_culling = True self.cullable_objects = [] for obj in bpy.context.visible_objects: @@ -2470,9 +2692,10 @@ def clean_deleted_planes(self, context: bpy.types.Context) -> None: break def refresh_clipping_planes(self, context): - import bmesh from itertools import cycle + import bmesh + area = next(a for a in bpy.context.screen.areas if a.type == "VIEW_3D") region = next(r for r in area.regions if r.type == "WINDOW") data = region.data @@ -2532,25 +2755,22 @@ class CreateClippingPlane(bpy.types.Operator): bl_options = {"REGISTER", "UNDO"} def execute(self, context): - from bpy_extras.view3d_utils import region_2d_to_vector_3d, region_2d_to_origin_3d - # Clean up deleted planes props = tool.Project.get_project_props() if len(props.clipping_planes) > 5: self.report({"INFO"}, "Maximum of six clipping planes allowed.") return {"FINISHED"} - for area in context.screen.areas: - if area.type == "VIEW_3D": - area.tag_redraw() + tool.Blender.update_all_viewports(context) + assert context.region and context.region_data region = context.region rv3d = context.region_data if rv3d: # Called from a 3D viewport coord = (self.mouse_x, self.mouse_y) origin = region_2d_to_origin_3d(region, rv3d, coord) direction = region_2d_to_vector_3d(region, rv3d, coord) - hit, location, normal, face_index, obj, matrix = self.ray_cast(context, origin, direction) + hit, location, normal, face_index, obj, matrix = tool.Blender.ray_cast_scene(context, origin, direction) if not hit: self.report({"INFO"}, "No object found.") return {"FINISHED"} @@ -2585,11 +2805,6 @@ def execute(self, context): bpy.ops.bim.refresh_clipping_planes("INVOKE_DEFAULT") return {"FINISHED"} - def ray_cast(self, context, origin, direction): - depsgraph = context.evaluated_depsgraph_get() - result = context.scene.ray_cast(depsgraph, origin, direction) - return result - def invoke(self, context, event): self.mouse_x = event.mouse_region_x self.mouse_y = event.mouse_region_y @@ -2682,21 +2897,35 @@ class IFCFileHandlerOperator(bpy.types.Operator): directory: bpy.props.StringProperty(subtype="FILE_PATH", options={"SKIP_SAVE", "HIDDEN"}) files: bpy.props.CollectionProperty(type=bpy.types.OperatorFileListElement, options={"SKIP_SAVE", "HIDDEN"}) + if TYPE_CHECKING: + directory: str + files: list[bpy.types.OperatorFileListElement] + def invoke(self, context, event): # Keeping code in .invoke() as we'll probably add some # popup windows later. + def clean_up_path(path: str) -> str: + # In Blender 4.5.6 there was a bug producing unncesseary double slash prefix + # breaking the paths. Issue is not present in 5.0+ and is fixed in 4.5.7. + # https://projects.blender.org/blender/blender/issues/153822 + if bpy.app.version == (4, 5, 6): + blender_prefix = "//" + if path.startswith(blender_prefix): + return path.removeprefix(blender_prefix) + return path + # `files` contain only .ifc files. filepath = Path(self.directory) # If user is just drag'n'dropping a single file -> load it as a new project, # if they're holding ALT -> link the file/files to the current project. if event.alt: # Passing self.files directly results in TypeError. - serialized_files = [{"name": f.name} for f in self.files] + serialized_files = [{"name": clean_up_path(f.name)} for f in self.files] return bpy.ops.bim.link_ifc(directory=self.directory, files=serialized_files) else: if len(self.files) == 1: - return bpy.ops.bim.load_project(filepath=(filepath / self.files[0].name).as_posix()) + return bpy.ops.bim.load_project(filepath=(filepath / clean_up_path(self.files[0].name)).as_posix()) else: self.report( {"INFO"}, @@ -2723,6 +2952,9 @@ class MeasureTool(bpy.types.Operator, PolylineOperator): measure_type: bpy.props.StringProperty() + if TYPE_CHECKING: + measure_type: str + @classmethod def poll(cls, context): return context.space_data.type == "VIEW_3D" @@ -2819,6 +3051,9 @@ class MeasureFaceAreaTool(bpy.types.Operator, PolylineOperator): measure_type: bpy.props.StringProperty() + if TYPE_CHECKING: + measure_type: str + @classmethod def poll(cls, context): return context.space_data.type == "VIEW_3D" @@ -2921,7 +3156,10 @@ class ClearMeasurement(bpy.types.Operator): @classmethod def poll(cls, context): polyline_props = tool.Model.get_polyline_props() - return len(polyline_props.measurement_polyline) > 0 + if len(polyline_props.measurement_polyline) > 0: + return True + cls.poll_message_set("No measurement to clear.") + return False def execute(self, context): polyline_props = tool.Model.get_polyline_props() @@ -3025,7 +3263,7 @@ def invoke(self, context, event): super().invoke(context, event) return {"RUNNING_MODAL"} - def cancel_tool(self, context): + def cancel_tool(self, context: bpy.types.Context) -> set["rna_enums.OperatorReturnItems"]: context.workspace.status_text_set(text=None) if hasattr(self, "tool_state"): self.tool_state.plane_method = None @@ -3033,7 +3271,7 @@ def cancel_tool(self, context): tool.Blender.update_viewport() return {"CANCELLED"} - def handle_custom_instructions(self, context): + def handle_custom_instructions(self, context: bpy.types.Context) -> None: if len(self.selected_points) == 0: instruction_text = "Click First Point on Image" elif len(self.selected_points) == 1: @@ -3048,14 +3286,14 @@ def handle_custom_instructions(self, context): context.workspace.status_text_set(text=instruction_text) - def calculate_distance(self): + def calculate_distance(self) -> None: if len(self.selected_points) == 2: point1 = self.selected_points[0] point2 = self.selected_points[1] distance_3d = (point2 - point1).length self.calculated_distance = distance_3d / self.unit_scale - def apply_scaling(self, context): + def apply_scaling(self, context: bpy.types.Context) -> set["rna_enums.OperatorReturnItems"]: if len(self.selected_points) != 2: self.report({"ERROR"}, "Two points must be selected") return {"CANCELLED"} @@ -3082,29 +3320,9 @@ def apply_scaling(self, context): bmesh.ops.scale(bm, vec=(scale_factor, scale_factor, 1.0), verts=bm.verts) - if bm.loops.layers.uv: - uv_layer = bm.loops.layers.uv.active - - min_x = min(v.co.x for v in bm.verts) - max_x = max(v.co.x for v in bm.verts) - min_y = min(v.co.y for v in bm.verts) - max_y = max(v.co.y for v in bm.verts) - - width = max_x - min_x - height = max_y - min_y - - for face in bm.faces: - for loop in face.loops: - vert = loop.vert - u = (vert.co.x - min_x) / width if width > 0 else 0.5 - v = (vert.co.y - min_y) / height if height > 0 else 0.5 - - u = max(0.0, min(1.0, u)) - v = max(0.0, min(1.0, v)) - loop[uv_layer].uv = (u, v) - bm.to_mesh(mesh) bm.free() + tool.Loader.load_generated_uv_map(mesh) mesh.update() element = tool.Ifc.get_entity(self.target_object) @@ -3128,12 +3346,16 @@ def apply_scaling(self, context): return {"FINISHED"} + class LoadBlendMetadataAndIFC(bpy.types.Operator): bl_idname = "bim.load_blend_metadata_and_ifc" bl_label = "Load Blend Metadata and IFC" bl_options = {"REGISTER", "UNDO"} filepath: bpy.props.StringProperty(name="IFC File Path", default="") + if TYPE_CHECKING: + filepath: str + def execute(self, context): ifc_file = self.filepath if not ifc_file: @@ -3165,4 +3387,20 @@ def load_handler(*args): bpy.app.handlers.load_post.append(load_handler) bpy.ops.wm.open_mainfile(filepath=metadata_path) - return {"FINISHED"} \ No newline at end of file + return {"FINISHED"} + + +class GenerateUVMap(bpy.types.Operator): + bl_idname = "bim.generate_uv_map" + bl_label = "Generate UV Map" + bl_description = "Generate UV map for selected mesh." + bl_options = {"REGISTER", "UNDO", "INTERNAL"} + + def execute(self, context): + obj = context.active_object + if not obj or not isinstance(obj.data, bpy.types.Mesh): + self.report({"ERROR"}, "No valid mesh selected.") + return {"CANCELLED"} + tool.Loader.load_generated_uv_map(obj.data) + self.report({"INFO"}, "Generated UV map for selected mesh.") + return {"FINISHED"} diff --git a/src/bonsai/bonsai/bim/module/project/prop.py b/src/bonsai/bonsai/bim/module/project/prop.py index 2cbdeb6e7b5..1408d2f7861 100644 --- a/src/bonsai/bonsai/bim/module/project/prop.py +++ b/src/bonsai/bonsai/bim/module/project/prop.py @@ -16,27 +16,28 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . -import os +from collections.abc import Generator +from typing import TYPE_CHECKING, Literal, Union, assert_never, get_args + import bpy import ifcopenshell.util.element import ifcopenshell.util.placement -import bonsai.tool as tool -import bonsai.bim.helper -from bonsai.bim.module.project.data import ProjectData, ProjectLibraryData -from bonsai.bim.ifc import IfcStore -from bonsai.bim.prop import StrProperty, ObjProperty, Attribute -from bpy.types import PropertyGroup from bpy.props import ( - PointerProperty, BoolProperty, CollectionProperty, EnumProperty, FloatProperty, IntProperty, + PointerProperty, StringProperty, ) -from typing import TYPE_CHECKING, Literal, Union, get_args, assert_never -from collections.abc import Generator +from bpy.types import PropertyGroup + +import bonsai.bim.helper +import bonsai.tool as tool +from bonsai.bim.ifc import IfcStore +from bonsai.bim.module.project.data import ProjectData, ProjectLibraryData +from bonsai.bim.prop import Attribute, ObjProperty def get_export_schema(self: "BIMProjectProperties", context: bpy.types.Context) -> list[tuple[str, str, str]]: @@ -217,29 +218,62 @@ class FilterCategory(PropertyGroup): class Link(PropertyGroup): - name: StringProperty( - name="Name", + name: StringProperty(name="Name") + filepath: StringProperty( + name="Filepath", description="Filepath to linked .ifc file, stored in posix format (could be relative to .ifc file, not to .blend)", ) + transformation: StringProperty( + name="Transformation", + description="4x4 matrix transformation as a flattened comma separated list for the linked model", + default="", + ) + georeferenced: EnumProperty( + name="Georeferenced", + description="Georeferencing status, compatibility between host and linked model", + items=[ + ("NONE", "No Georef", "Linked model has no georeferencing", "QUESTION", 0), + ("NOT_COMPATIBLE", "Not Compatible", "Has geo data but CRS differ from host", "ERROR", 1), + ("FULL_COMPATIBLE", "Full Compatible", "Both CRS name and vertical datum match host", "WORLD", 2), + ], + default="NONE", + ) + has_transformation: BoolProperty( + name="Has Transformation", + description="Whether there is a transformation from its global coordinates", + default=False, + ) is_loaded: BoolProperty(name="Is Loaded", default=False) + is_editing: BoolProperty(name="Is Editing", description="Whether the link is being transformed", default=False) is_selectable: BoolProperty(name="Is Selectable", default=True) is_wireframe: BoolProperty(name="Is Wireframe", default=False) is_hidden: BoolProperty(name="Is Hidden", default=False) include_in_drawings: BoolProperty(name="Include in Drawings", default=True, options=set()) empty_handle: PointerProperty( name="Empty Object Handle", - description="We use empty object handle to allow simple manipulations with a linked model (moving, scaling, rotating)", + description="Storage for empty handle. Used in non-IFC scenarios or temporarily during link creation", type=bpy.types.Object, ) + ifc_definition_id: IntProperty( + name="IFC Definition ID", + description="STEP ID of the IfcDocumentReference when linked to a parent IFC project. Zero when no parent IFC exists", + default=0, + ) if TYPE_CHECKING: name: str + filepath: str + transformation: str + georeferenced: Literal["NONE", "NOT_COMPATIBLE", "FULL_COMPATIBLE"] + has_transformation: bool is_loaded: bool + is_editing: bool is_selectable: bool is_wireframe: bool is_hidden: bool include_in_drawings: bool empty_handle: Union[bpy.types.Object, None] + ifc_definition_id: int class EditedObj(PropertyGroup): @@ -311,7 +345,7 @@ class BIMProjectProperties(PropertyGroup): ), default=False, ) - should_cache: BoolProperty( # pyright: ignore[reportRedeclaration] + should_cache: BoolProperty( name="Cache", description=( "Cache loaded geometry to .h5 file in your cache directory (see in preferences) " @@ -319,7 +353,7 @@ class BIMProjectProperties(PropertyGroup): ), default=False, ) - deflection_tolerance: FloatProperty(name="Deflection Tolerance", default=0.001) + deflection_tolerance: FloatProperty(name="Deflection Tolerance", default=0.05) angular_tolerance: FloatProperty(name="Angular Tolerance", default=0.5) void_limit: IntProperty( name="Void Limit", @@ -368,7 +402,7 @@ class BIMProjectProperties(PropertyGroup): load_indexed_maps: BoolProperty( name="Load Indexed Maps", description="Load indexed maps (UV and color maps)", - default=True, + default=False, # Very slow and hackishly implemented ) links: CollectionProperty(name="Links", type=Link) active_link_index: IntProperty(name="Active Link Index") @@ -411,12 +445,22 @@ class BIMProjectProperties(PropertyGroup): ) use_relative_project_path: BoolProperty(name="Use Relative Project Path", default=False) + should_save_metadata_for_this_file: BoolProperty( + name="Save Session Data for This File", + description="Enable saving session data (window layout, settings) to a metadata blend file for this specific IFC file", + default=False, + ) queried_obj: bpy.props.PointerProperty(type=bpy.types.Object) queried_obj_root: bpy.props.PointerProperty(type=bpy.types.Object) + queried_guid: bpy.props.StringProperty() clipping_planes: bpy.props.CollectionProperty(type=ObjProperty) clipping_planes_active_index: bpy.props.IntProperty(min=0, default=0, max=5) edited_objs: bpy.props.CollectionProperty(type=EditedObj) + @property + def active_link(self) -> Union[Link, None]: + return tool.Blender.get_active_uilist_element(self.links, self.active_link_index) + @property def active_clipping_plane(self) -> ObjProperty | None: return tool.Blender.get_active_uilist_element(self.clipping_planes, self.clipping_planes_active_index) @@ -504,8 +548,10 @@ def load_header_data(self, header_data: tool.Project.HeaderData) -> None: parent_library: str use_relative_project_path: bool + should_save_metadata_for_this_file: bool queried_obj: Union[bpy.types.Object, None] queried_obj_root: Union[bpy.types.Object, None] + queried_guid: str clipping_planes: bpy.types.bpy_prop_collection_idprop[ObjProperty] clipping_planes_active_index: int edited_objs: bpy.types.bpy_prop_collection_idprop[EditedObj] diff --git a/src/bonsai/bonsai/bim/module/project/ui.py b/src/bonsai/bonsai/bim/module/project/ui.py index 5d4f3f695ba..5e828ddd9b2 100644 --- a/src/bonsai/bonsai/bim/module/project/ui.py +++ b/src/bonsai/bonsai/bim/module/project/ui.py @@ -17,19 +17,27 @@ # along with Bonsai. If not, see . from __future__ import annotations -import bpy + import os -import ifcopenshell +import shutil +from typing import TYPE_CHECKING + +import bpy +from bpy.types import Menu, Panel, UIList + import bonsai.bim import bonsai.tool as tool -from bonsai.bim.helper import prop_with_search, draw_attributes -from bpy.types import Panel, Menu, UIList +from bonsai.bim.helper import draw_attributes, prop_with_search from bonsai.bim.ifc import IfcStore -from bonsai.bim.module.project.data import ProjectData, LinksData -from typing import TYPE_CHECKING +from bonsai.bim.module.project.data import LinksData, ProjectData if TYPE_CHECKING: - from bonsai.bim.module.project.prop import LibraryElement, BIMProjectProperties, FilterCategory, Link + from bonsai.bim.module.project.prop import ( + BIMProjectProperties, + FilterCategory, + LibraryElement, + Link, + ) def file_import_menu(self, context): @@ -248,7 +256,7 @@ def draw_advanced_loading_ui(self, context): row = self.layout.row(align=True) row.operator("bim.load_project_elements") - def draw_editing_buttons(self, context, row): + def draw_editing_buttons(self, context: object, row: bpy.types.UILayout) -> None: pprops = self.props if tool.Ifc.get(): if pprops.is_editing: @@ -338,9 +346,9 @@ def draw_loaded_project_ui(self, context): else: metadata_filename = os.path.basename(props.ifc_file) + suffix row = self.layout.row(align=True) - col = row.column() - col.enabled = False - col.label(text=f"Saving session data to: {metadata_filename}") + row.use_property_split = False + pprops = tool.Project.get_project_props() + row.prop(pprops, "should_save_metadata_for_this_file", text=f"Save session data to: {metadata_filename}") class BIM_PT_new_project_wizard(Panel): @@ -368,25 +376,27 @@ def draw(self, context): row = self.layout.row() row.prop(props, "volume_unit", text="Volume Unit") row = self.layout.row() + row.prop(props, "mass_unit", text="Mass Unit") + row = self.layout.row() + row.prop(props, "time_unit", text="Time Unit") prop_with_search(self.layout, pprops, "template_file", text="Template") - if tool.Blender.get_addon_preferences().mass_time_units_in_wizard: - header, body = self.layout.panel("Mass and Time Units", default_closed=True) - if header: - header.label(text="Mass and Time Units") - if body: - label = "Add Mass and Time Units" if not props.add_mass_time_units else "Remove Mass and Time Units" - body.prop(props, "add_mass_time_units", toggle=True, text=label) - if props.add_mass_time_units: - row = body.row() - row.prop(props, "mass_unit", text="Mass Unit") - row = body.row() - row.prop(props, "time_unit", text="Time Unit") - self.layout.use_property_split = True row = self.layout.row() row.operator("bim.create_project") + if shutil.which("git"): + git_props = context.scene.IfcGitProperties + box = self.layout.box() + row = box.row() + row.label(text="Clone a remote Git repository") + row = box.row() + row.prop(git_props, "remote_url") + row = box.row() + row.prop(git_props, "local_folder") + row = box.row() + row.operator("ifcgit.clone_repo", icon="IMPORT") + class BIM_PT_project_library(Panel): bl_label = "Project Library" @@ -479,17 +489,28 @@ class BIM_PT_links(Panel): def draw(self, context): self.props = tool.Project.get_project_props() + row = self.layout.row(align=True) row.operator("bim.link_ifc") if self.props.links: - self.layout.template_list( - "BIM_UL_links", - "", - self.props, - "links", - self.props, - "active_link_index", - ) + if self.props.active_link: + row = self.layout.row(align=True) + row.alignment = "RIGHT" + index = self.props.active_link_index + if self.props.active_link.is_loaded: + if self.props.active_link.is_editing: + row.operator("bim.edit_link", text="", icon="CHECKMARK") + row.operator("bim.disable_editing_link", text="", icon="CANCEL") + else: + row.operator("bim.enable_editing_link", text="", icon="GREASEPENCIL") + row.operator("bim.select_linked_model_element", icon="VIEWZOOM", text="") + row.operator("bim.select_link_handle", text="", icon="OBJECT_DATA").link_index = index + row.operator("bim.unload_link", text="", icon="UNLINKED").link_index = index + row.operator("bim.reload_link", text="", icon="FILE_REFRESH").link_index = index + else: + row.operator("bim.load_link", text="", icon="LINKED").link_index = index + row.operator("bim.unlink_ifc", text="", icon="X").link_index = index + self.layout.template_list("BIM_UL_links", "", self.props, "links", self.props, "active_link_index") if LinksData.enable_culling: row = self.layout.row(align=True) @@ -609,47 +630,32 @@ def draw_item( active_propname, index, ): - if item: - row = layout.row(align=True) - if item.is_loaded: - row.label(text=item.name) - op = row.operator( - "bim.toggle_link_selectability", - text="", - icon="RESTRICT_SELECT_OFF" if item.is_selectable else "RESTRICT_SELECT_ON", - emboss=False, - ) - op.link = item.name - op = row.operator( - "bim.toggle_link_visibility", - text="", - icon="CUBE" if item.is_wireframe else "MESH_CUBE", - emboss=False, - ) - op.link = item.name - op.mode = "WIREFRAME" - op = row.operator( - "bim.toggle_link_visibility", - text="", - icon="HIDE_ON" if item.is_hidden else "HIDE_OFF", - emboss=False, - ) - op.link = item.name - op.mode = "VISIBLE" - op = row.operator("bim.select_link_handle", text="", icon="OBJECT_DATA") - op.index = index - op = row.operator("bim.unload_link", text="", icon="UNLINKED") - op.filepath = item.name - op = row.operator("bim.reload_link", text="", icon="FILE_REFRESH") - op.filepath = item.name - else: - row.prop(item, "name", text="") - op = row.operator("bim.select_uri_attribute", text="", icon="FILE_FOLDER") - op.attribute_data_path = tool.Blender.get_full_data_path(item, "name") - op = row.operator("bim.load_link", text="", icon="LINKED") - op.filepath = item.name - op = row.operator("bim.unlink_ifc", text="", icon="X") - op.filepath = item.name + row = layout.row(align=True) + if item.is_loaded: + from bonsai.bim.module.project.prop import Link + + s = Link.bl_rna + geo_prop = s.properties["georeferenced"] + assert isinstance(geo_prop, bpy.types.EnumProperty) + enum_item = geo_prop.enum_items[item.georeferenced] + op = row.operator("bim.show_description", text="", icon=enum_item.icon, emboss=False) + op.description = f"{geo_prop.description}\n{enum_item.name}: {enum_item.description}" + if item.has_transformation: + row.label(text="", icon="OBJECT_ORIGIN") + + row.label(text=item.filepath) + icon = "RESTRICT_SELECT_OFF" if item.is_selectable else "RESTRICT_SELECT_ON" + row.operator("bim.toggle_link_selectability", text="", icon=icon, emboss=False).link_index = index + icon = "CUBE" if item.is_wireframe else "MESH_CUBE" + op = row.operator("bim.toggle_link_visibility", text="", icon=icon, emboss=False) + op.link_index = index + op.mode = "WIREFRAME" + icon = "HIDE_ON" if item.is_hidden else "HIDE_OFF" + op = row.operator("bim.toggle_link_visibility", text="", icon=icon, emboss=False) + op.link_index = index + op.mode = "VISIBLE" + else: + row.label(text=item.filepath) class BIM_PT_purge(Panel): diff --git a/src/bonsai/bonsai/bim/module/project/workspace.py b/src/bonsai/bonsai/bim/module/project/workspace.py index 59b86e431d7..bd60f4975a4 100644 --- a/src/bonsai/bonsai/bim/module/project/workspace.py +++ b/src/bonsai/bonsai/bim/module/project/workspace.py @@ -17,9 +17,10 @@ # along with Bonsai. If not, see . import os + import bpy + import bonsai.tool as tool -from bpy.types import WorkSpaceTool from bonsai.bim.module.project.data import LinksData @@ -39,9 +40,12 @@ class ExploreTool(bpy.types.WorkSpaceTool): ("bim.explore_hotkey", {"type": "C", "value": "PRESS", "alt": True}, {"properties": [("hotkey", "A_C")]}), ("bim.explore_hotkey", {"type": "M", "value": "PRESS", "shift": True}, {"properties": [("hotkey", "S_M")]}), ("bim.explore_hotkey", {"type": "S", "value": "PRESS", "shift": True}, {"properties": [("hotkey", "S_S")]}), + ("bim.explore_hotkey", {"type": "H", "value": "PRESS"}, {"properties": [("hotkey", "H")]}), + ("bim.explore_hotkey", {"type": "H", "value": "PRESS", "shift": True}, {"properties": [("hotkey", "S_H")]}), + ("bim.explore_hotkey", {"type": "H", "value": "PRESS", "alt": True}, {"properties": [("hotkey", "A_H")]}), ) - def draw_settings(context, layout, ws_tool): + def draw_settings(context: bpy.types.Context, layout: bpy.types.UILayout, ws_tool) -> None: row = layout.row(align=True) row.label(text="Query Object", icon="MOUSE_RMB") row = layout.row(align=True) @@ -60,31 +64,40 @@ def draw_settings(context, layout, ws_tool): row.label(text="", icon="EVENT_ALT") row.label(text="Disable Culling" if LinksData.enable_culling else "Enable Culling", icon="EVENT_C") + row = layout.row(align=True) + row.operator("bim.hide_queried_linked_element", text="Hide Queried Element", icon="EVENT_H") + prop = tool.Project.get_measure_tool_settings() row = layout.row(align=True) row.label(text="", icon="EVENT_SHIFT") row.label(text="", icon="EVENT_M") - row = layout.row(align=True) op = row.operator("bim.explore_hotkey", text="Measure Tool", icon="CON_DISTLIMIT") op.hotkey = "S_M" row = layout.row(align=True) row.prop(prop, "measurement_type", text="Measure Type", expand=True, icon_only=True, emboss=True) - row = layout.row(align=True) op = row.operator("bim.clear_measurement", text="", icon="X") row = layout.row(align=True) row.label(text="", icon="EVENT_SHIFT") row.label(text="", icon="EVENT_S") - row = layout.row(align=True) op = row.operator("bim.explore_hotkey", text="Image Scaling Tool", icon="IMAGE_PLANE") op.hotkey = "S_S" - op.description = "Scale Image Annotation. Allows to scale an IfcReferenceImage. Select image, select tool. Check lower left corner instructions to select two points and provide real distance between them" + op.description = ( + "Scale Image Annotation.\n\n" + "Allows to scale an IfcReferenceImage.\n\n" + "Select image, select tool. " + "Check lower left corner instructions to select two points and provide real distance between them" + ) + + row = layout.row(align=True) + row.operator("bim.generate_uv_map", icon="UV") class ExploreHotkey(bpy.types.Operator): bl_idname = "bim.explore_hotkey" bl_label = "" bl_options = {"REGISTER", "UNDO", "INTERNAL"} + hotkey: bpy.props.StringProperty() description: bpy.props.StringProperty() @@ -136,3 +149,12 @@ def hotkey_S_S(self): return bpy.ops.bim.image_scaling_tool("INVOKE_DEFAULT") + + def hotkey_H(self) -> None: + bpy.ops.bim.hide_queried_linked_element() + + def hotkey_S_H(self) -> None: + bpy.ops.bim.hide_queried_linked_element(hide_all_except=True) + + def hotkey_A_H(self) -> None: + bpy.ops.bim.hide_queried_linked_element(unhide_all=True) diff --git a/src/bonsai/bonsai/bim/module/pset/__init__.py b/src/bonsai/bonsai/bim/module/pset/__init__.py index 7e0d72061ba..5284e88f36c 100644 --- a/src/bonsai/bonsai/bim/module/pset/__init__.py +++ b/src/bonsai/bonsai/bim/module/pset/__init__.py @@ -17,7 +17,8 @@ # along with Bonsai. If not, see . import bpy -from . import ui, prop, operator + +from . import operator, prop, ui classes = ( operator.AddProposedProp, diff --git a/src/bonsai/bonsai/bim/module/pset/data.py b/src/bonsai/bonsai/bim/module/pset/data.py index 12b38efc989..969f54f3877 100644 --- a/src/bonsai/bonsai/bim/module/pset/data.py +++ b/src/bonsai/bonsai/bim/module/pset/data.py @@ -23,9 +23,9 @@ import ifcopenshell.util.attribute import ifcopenshell.util.doc import ifcopenshell.util.element -import bonsai.tool as tool -import bonsai.bim.schema +import bonsai.bim.schema +import bonsai.tool as tool # TODO: Should this cache belong here? Dunno. Maybe. is_expanded: dict[int, bool] = {} diff --git a/src/bonsai/bonsai/bim/module/pset/operator.py b/src/bonsai/bonsai/bim/module/pset/operator.py index cbd7a7fe77c..ea1d39fb96d 100644 --- a/src/bonsai/bonsai/bim/module/pset/operator.py +++ b/src/bonsai/bonsai/bim/module/pset/operator.py @@ -16,21 +16,23 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . -import bpy import json +from collections import defaultdict +from typing import TYPE_CHECKING + +import bpy import ifcopenshell.api import ifcopenshell.api.pset import ifcopenshell.util.element + +import bonsai.bim.module.pset.data import bonsai.bim.schema -import bonsai.tool as tool import bonsai.core.pset as core -import bonsai.bim.module.pset.data +import bonsai.tool as tool from bonsai.bim.ifc import IfcStore -from collections import defaultdict -from typing import TYPE_CHECKING if TYPE_CHECKING: - from bonsai.bim.module.pset.prop import RenamePropertyEntry, AddEditPropertyEntry + from bonsai.bim.module.pset.prop import AddEditPropertyEntry class TogglePsetExpansion(bpy.types.Operator, tool.Ifc.Operator): @@ -238,7 +240,7 @@ class CopyPropertyToSelection(bpy.types.Operator, tool.Ifc.Operator): bl_label = "Copy Property To Selection" bl_options = {"REGISTER", "UNDO"} - name: bpy.props.StringProperty() # pyright: ignore[reportRedeclaration] + name: bpy.props.StringProperty() if TYPE_CHECKING: name: str @@ -278,10 +280,10 @@ class BIM_OT_add_property_to_edit(bpy.types.Operator): bl_label = "Add Property to Edit" bl_idname = "bim.add_property_to_edit" bl_options = {"REGISTER", "UNDO"} - option: bpy.props.EnumProperty( # pyright: ignore[reportRedeclaration] + option: bpy.props.EnumProperty( items=[(t, t, "") for t in tool.Pset.BULK_OPERATION_TYPES], ) - index: bpy.props.IntProperty(default=-1) # pyright: ignore[reportRedeclaration] + index: bpy.props.IntProperty(default=-1) if TYPE_CHECKING: option: tool.Pset.BulkOperationType @@ -305,9 +307,9 @@ class BIM_OT_remove_property_to_edit(bpy.types.Operator): bl_label = "Remove Property from Editing" bl_idname = "bim.remove_property_to_edit" bl_options = {"REGISTER", "UNDO"} - index: bpy.props.IntProperty() # pyright: ignore[reportRedeclaration] - index2: bpy.props.IntProperty(default=-1) # pyright: ignore[reportRedeclaration] - option: bpy.props.EnumProperty( # pyright: ignore[reportRedeclaration] + index: bpy.props.IntProperty() + index2: bpy.props.IntProperty(default=-1) + option: bpy.props.EnumProperty( items=[(t, t, "") for t in tool.Pset.BULK_OPERATION_TYPES], ) @@ -334,7 +336,7 @@ class BIM_OT_bulk_edit_clear_list(bpy.types.Operator): bl_label = "Clear List of Properties" bl_idname = "bim.pset_bulk_edit_clear_list" bl_options = {"REGISTER", "UNDO"} - option: bpy.props.EnumProperty( # pyright: ignore[reportRedeclaration] + option: bpy.props.EnumProperty( items=[(t, t, "") for t in tool.Pset.BULK_OPERATION_TYPES], ) @@ -569,7 +571,7 @@ def _execute(self, context): template_file = IfcStore.pset_template_file assert template_file - tool.PsetTemplate.add_pset_as_template(pset, template_file) + tool.PsetTemplate.add_pset_as_template(pset.Name, template_file) template_file.write(IfcStore.pset_template_path) bonsai.bim.handler.refresh_ui_data() diff --git a/src/bonsai/bonsai/bim/module/pset/prop.py b/src/bonsai/bonsai/bim/module/pset/prop.py index d89ba62be1b..786e6a62a28 100644 --- a/src/bonsai/bonsai/bim/module/pset/prop.py +++ b/src/bonsai/bonsai/bim/module/pset/prop.py @@ -16,33 +16,33 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . +from typing import TYPE_CHECKING, Literal, Union, get_args + import bpy -import bonsai.bim.schema import ifcopenshell import ifcopenshell.util.attribute import ifcopenshell.util.doc -import ifcopenshell.util.element +from bpy.props import ( + BoolProperty, + CollectionProperty, + EnumProperty, + FloatProperty, + IntProperty, + PointerProperty, + StringProperty, +) +from bpy.types import PropertyGroup + +import bonsai.bim.schema import bonsai.tool as tool -from bonsai.bim.prop import Attribute, StrProperty +from bonsai.bim.module.material.data import ObjectMaterialData from bonsai.bim.module.pset.data import ( AddEditCustomPropertiesData, - ObjectPsetsData, MaterialPsetsData, + ObjectPsetsData, PsetsGeneralData, ) -from bonsai.bim.module.material.data import ObjectMaterialData -from bpy.types import PropertyGroup -from bpy.props import ( - PointerProperty, - StringProperty, - EnumProperty, - BoolProperty, - IntProperty, - FloatProperty, - FloatVectorProperty, - CollectionProperty, -) -from typing import Union, Literal, TYPE_CHECKING, get_args, Literal +from bonsai.bim.prop import Attribute psetnames = {} qtonames = {} @@ -368,9 +368,9 @@ class GlobalPsetProperties(PropertyGroup): qto_filter: StringProperty(name="Qto Filter", options={"TEXTEDIT_UPDATE"}) # Bulk operations. - psets_to_delete: CollectionProperty(type=DeletePsetEntry) # pyright: ignore[reportRedeclaration] - psets_to_rename: CollectionProperty(type=RenamePropertyEntry) # pyright: ignore[reportRedeclaration] - psets_to_add_edit: CollectionProperty(type=AddEditPropertyEntry) # pyright: ignore[reportRedeclaration] + psets_to_delete: CollectionProperty(type=DeletePsetEntry) + psets_to_rename: CollectionProperty(type=RenamePropertyEntry) + psets_to_add_edit: CollectionProperty(type=AddEditPropertyEntry) if TYPE_CHECKING: pset_filter: str diff --git a/src/bonsai/bonsai/bim/module/pset/ui.py b/src/bonsai/bonsai/bim/module/pset/ui.py index abd3a8b90f0..addd03a504f 100644 --- a/src/bonsai/bonsai/bim/module/pset/ui.py +++ b/src/bonsai/bonsai/bim/module/pset/ui.py @@ -17,26 +17,29 @@ # along with Bonsai. If not, see . from __future__ import annotations + +from typing import TYPE_CHECKING, Any, Literal, Optional, assert_never + import bpy -import bonsai.tool as tool from bpy.types import Panel -from bonsai.bim.helper import prop_with_search, get_display_value, draw_attribute + +import bonsai.tool as tool +from bonsai.bim.helper import draw_attribute, get_display_value, prop_with_search +from bonsai.bim.module.material.data import ObjectMaterialData from bonsai.bim.module.pset.data import ( - ObjectPsetsData, - ObjectQtosData, + GroupPsetData, + GroupQtosData, MaterialPsetsData, MaterialSetItemPsetsData, - TaskQtosData, - ResourceQtosData, - ResourcePsetsData, - GroupQtosData, - GroupPsetData, + ObjectPsetsData, + ObjectQtosData, ProfilePsetsData, + ResourcePsetsData, + ResourceQtosData, + TaskQtosData, WorkSchedulePsetsData, ZonePsetsData, ) -from bonsai.bim.module.material.data import ObjectMaterialData -from typing import Any, Optional, TYPE_CHECKING, assert_never, Literal if TYPE_CHECKING: from bonsai.bim.module.pset.prop import IfcProperty, PsetProperties @@ -259,7 +262,7 @@ def draw(self, context): row = self.layout.row(align=True) prop_with_search(row, props, "pset_name", text="") - if props.pset_name != "BBIM_BSDD" and not props.pset_name.startswith(tool.Bsdd.identifier_url): + if props.pset_name != "BBIM_BSDD" and not props.pset_name.startswith(tool.Bsdd.identifier_url()): op = row.operator("bim.add_pset", icon="ADD", text="") op.obj = obj.name op.obj_type = "Object" diff --git a/src/bonsai/bonsai/bim/module/pset_template/__init__.py b/src/bonsai/bonsai/bim/module/pset_template/__init__.py index 204824cb119..dc67e900fbb 100644 --- a/src/bonsai/bonsai/bim/module/pset_template/__init__.py +++ b/src/bonsai/bonsai/bim/module/pset_template/__init__.py @@ -17,7 +17,8 @@ # along with Bonsai. If not, see . import bpy -from . import ui, prop, operator + +from . import operator, prop, ui classes = ( operator.AddPropEnum, diff --git a/src/bonsai/bonsai/bim/module/pset_template/data.py b/src/bonsai/bonsai/bim/module/pset_template/data.py index 84d65f25f14..0d922fe2aed 100644 --- a/src/bonsai/bonsai/bim/module/pset_template/data.py +++ b/src/bonsai/bonsai/bim/module/pset_template/data.py @@ -16,15 +16,14 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . -import os -import bpy -import pathlib +from typing import Any + import ifcopenshell import ifcopenshell.util.attribute import ifcopenshell.util.doc + import bonsai.tool as tool from bonsai.bim.ifc import IfcStore -from typing import Any def refresh(): diff --git a/src/bonsai/bonsai/bim/module/pset_template/operator.py b/src/bonsai/bonsai/bim/module/pset_template/operator.py index 07113764392..0ae20ce0ea9 100644 --- a/src/bonsai/bonsai/bim/module/pset_template/operator.py +++ b/src/bonsai/bonsai/bim/module/pset_template/operator.py @@ -17,12 +17,13 @@ # along with Bonsai. If not, see . import os + import bpy import ifcopenshell -import ifcopenshell.api import ifcopenshell.api.pset_template -import bonsai.bim.schema + import bonsai.bim.handler +import bonsai.bim.schema import bonsai.tool as tool from bonsai.bim.ifc import IfcStore diff --git a/src/bonsai/bonsai/bim/module/pset_template/prop.py b/src/bonsai/bonsai/bim/module/pset_template/prop.py index fdd6188a761..3b2d6c5d9e7 100644 --- a/src/bonsai/bonsai/bim/module/pset_template/prop.py +++ b/src/bonsai/bonsai/bim/module/pset_template/prop.py @@ -16,27 +16,25 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . -import os +from typing import TYPE_CHECKING + import bpy -import ifcopenshell import ifcopenshell.util.attribute -from ifcopenshell.util.doc import get_attribute_doc -import bonsai.tool as tool -from bonsai.bim.module.pset_template.data import PsetTemplatesData -from bonsai.bim.prop import StrProperty, Attribute -from bonsai.bim.ifc import IfcStore -from bpy.types import PropertyGroup from bpy.props import ( - PointerProperty, - StringProperty, - EnumProperty, BoolProperty, - IntProperty, - FloatProperty, - FloatVectorProperty, CollectionProperty, + EnumProperty, + FloatProperty, + IntProperty, + PointerProperty, + StringProperty, ) -from typing import TYPE_CHECKING +from bpy.types import PropertyGroup +from ifcopenshell.util.doc import get_attribute_doc + +import bonsai.tool as tool +from bonsai.bim.ifc import IfcStore +from bonsai.bim.module.pset_template.data import PsetTemplatesData def updatePsetTemplateFiles(self, context): diff --git a/src/bonsai/bonsai/bim/module/pset_template/ui.py b/src/bonsai/bonsai/bim/module/pset_template/ui.py index af46fdc0e7c..92cd78e4ba2 100644 --- a/src/bonsai/bonsai/bim/module/pset_template/ui.py +++ b/src/bonsai/bonsai/bim/module/pset_template/ui.py @@ -16,9 +16,9 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . -import bpy -import bonsai.tool as tool from bpy.types import Panel + +import bonsai.tool as tool from bonsai.bim.helper import prop_with_search from bonsai.bim.module.pset_template.data import PsetTemplatesData diff --git a/src/bonsai/bonsai/bim/module/qto/__init__.py b/src/bonsai/bonsai/bim/module/qto/__init__.py index f372462f73a..f4d5becb73a 100644 --- a/src/bonsai/bonsai/bim/module/qto/__init__.py +++ b/src/bonsai/bonsai/bim/module/qto/__init__.py @@ -17,7 +17,8 @@ # along with Bonsai. If not, see . import bpy -from . import ui, prop, operator + +from . import operator, prop, ui classes = ( operator.CalculateCircleRadius, diff --git a/src/bonsai/bonsai/bim/module/qto/calculator.py b/src/bonsai/bonsai/bim/module/qto/calculator.py index 091d7e1f9fd..638d603f890 100644 --- a/src/bonsai/bonsai/bim/module/qto/calculator.py +++ b/src/bonsai/bonsai/bim/module/qto/calculator.py @@ -16,21 +16,22 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . -import bpy import math +from typing import Literal, Optional, Union, assert_never + import bmesh -import mathutils -import bonsai.tool as tool +import bpy +import ifc5d.qto import ifcopenshell import ifcopenshell.geom import ifcopenshell.util.element -import ifc5d.qto -from mathutils import Vector, Matrix +import mathutils +from mathutils import Matrix, Vector from mathutils.bvhtree import BVHTree from shapely.geometry import Polygon from shapely.ops import unary_union -from typing import Literal, Union, Optional, assert_never +import bonsai.tool as tool AxisType = Literal["x", "y", "z"] VectorTuple = tuple[float, float, float] @@ -320,7 +321,7 @@ def get_gross_perimeter(o: bpy.types.Object) -> float: return gross_perimeter -def get_space_net_perimeter(obj: bpy.types.Object) -> float: +def get_space_net_perimeter(obj: bpy.types.Object) -> None: pass diff --git a/src/bonsai/bonsai/bim/module/qto/data.py b/src/bonsai/bonsai/bim/module/qto/data.py index ef780d749fd..162a4bf7c6b 100644 --- a/src/bonsai/bonsai/bim/module/qto/data.py +++ b/src/bonsai/bonsai/bim/module/qto/data.py @@ -17,6 +17,7 @@ # along with Bonsai. If not, see . import bpy + import bonsai.tool as tool diff --git a/src/bonsai/bonsai/bim/module/qto/helper.py b/src/bonsai/bonsai/bim/module/qto/helper.py index 50253cbb63a..d4f94c491fe 100644 --- a/src/bonsai/bonsai/bim/module/qto/helper.py +++ b/src/bonsai/bonsai/bim/module/qto/helper.py @@ -16,10 +16,12 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . -import bpy +from collections.abc import Callable + import bmesh +import bpy + import bonsai.tool as tool -from collections.abc import Callable def calculate_height(obj: bpy.types.Object) -> float: diff --git a/src/bonsai/bonsai/bim/module/qto/operator.py b/src/bonsai/bonsai/bim/module/qto/operator.py index 47b0f5059a8..6aa10c9beb8 100644 --- a/src/bonsai/bonsai/bim/module/qto/operator.py +++ b/src/bonsai/bonsai/bim/module/qto/operator.py @@ -18,11 +18,11 @@ import bpy import ifcopenshell -import ifcopenshell.api -import bonsai.tool as tool +from ifcopenshell.util.profiler import Profiler + import bonsai.core.qto as core +import bonsai.tool as tool from bonsai.bim.module.qto import helper -from ifcopenshell.util.profiler import Profiler class CalculateCircleRadius(bpy.types.Operator): diff --git a/src/bonsai/bonsai/bim/module/qto/prop.py b/src/bonsai/bonsai/bim/module/qto/prop.py index 57e04d4cc1b..7ffbfcdfa79 100644 --- a/src/bonsai/bonsai/bim/module/qto/prop.py +++ b/src/bonsai/bonsai/bim/module/qto/prop.py @@ -16,23 +16,18 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . +from typing import TYPE_CHECKING, Union + import bpy -import bonsai.tool as tool import ifc5d.qto -from bonsai.bim.prop import StrProperty, Attribute -from bpy.types import PropertyGroup from bpy.props import ( - PointerProperty, - StringProperty, - EnumProperty, BoolProperty, - IntProperty, - FloatProperty, - FloatVectorProperty, - CollectionProperty, + EnumProperty, + StringProperty, ) -from typing import TYPE_CHECKING, Union +from bpy.types import PropertyGroup +import bonsai.tool as tool CALCULATOR_FUNCTION_ENUM_ITEMS: list[Union[tuple[str, str, str], None]] = [] diff --git a/src/bonsai/bonsai/bim/module/qto/ui.py b/src/bonsai/bonsai/bim/module/qto/ui.py index 9029a630661..032df25b20c 100644 --- a/src/bonsai/bonsai/bim/module/qto/ui.py +++ b/src/bonsai/bonsai/bim/module/qto/ui.py @@ -17,6 +17,7 @@ # along with Bonsai. If not, see . import bpy + import bonsai.tool as tool from bonsai.bim.module.qto.data import QtoData diff --git a/src/bonsai/bonsai/bim/module/resource/__init__.py b/src/bonsai/bonsai/bim/module/resource/__init__.py index ae08660afd8..89f21f4e29f 100644 --- a/src/bonsai/bonsai/bim/module/resource/__init__.py +++ b/src/bonsai/bonsai/bim/module/resource/__init__.py @@ -17,7 +17,8 @@ # along with Bonsai. If not, see . import bpy -from . import ui, prop, operator + +from . import operator, prop, ui classes = ( operator.AddResource, diff --git a/src/bonsai/bonsai/bim/module/resource/data.py b/src/bonsai/bonsai/bim/module/resource/data.py index 601b61eb7bb..cc862cf1dd5 100644 --- a/src/bonsai/bonsai/bim/module/resource/data.py +++ b/src/bonsai/bonsai/bim/module/resource/data.py @@ -16,14 +16,16 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . +from typing import Any + import bpy -import bonsai.tool as tool import ifcopenshell import ifcopenshell.util.constraint import ifcopenshell.util.cost import ifcopenshell.util.date import ifcopenshell.util.resource -from typing import Any + +import bonsai.tool as tool def refresh(): diff --git a/src/bonsai/bonsai/bim/module/resource/operator.py b/src/bonsai/bonsai/bim/module/resource/operator.py index 4d9a28c0615..a82cc22918b 100644 --- a/src/bonsai/bonsai/bim/module/resource/operator.py +++ b/src/bonsai/bonsai/bim/module/resource/operator.py @@ -18,10 +18,11 @@ import bpy import ifcopenshell.api.pset -from bpy_extras.io_utils import ImportHelper, ExportHelper -from bonsai.bim.module.resource.ui import draw_productivity_ui +from bpy_extras.io_utils import ExportHelper, ImportHelper + import bonsai.core.resource as core import bonsai.tool as tool +from bonsai.bim.module.resource.ui import draw_productivity_ui class LoadResources(bpy.types.Operator): diff --git a/src/bonsai/bonsai/bim/module/resource/prop.py b/src/bonsai/bonsai/bim/module/resource/prop.py index 350417aa698..f08bacbab57 100644 --- a/src/bonsai/bonsai/bim/module/resource/prop.py +++ b/src/bonsai/bonsai/bim/module/resource/prop.py @@ -16,27 +16,26 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . +from typing import TYPE_CHECKING, Literal, get_args + import bpy -import ifcopenshell.api import ifcopenshell.api.resource import ifcopenshell.util.resource -import bonsai.tool as tool -import bonsai.bim.module.pset.data -import bonsai.bim.module.resource.data -import bonsai.bim.module.sequence.data -from bonsai.bim.prop import Attribute, ISODuration -from bpy.types import PropertyGroup from bpy.props import ( - PointerProperty, - StringProperty, - EnumProperty, BoolProperty, - IntProperty, - FloatProperty, - FloatVectorProperty, CollectionProperty, + EnumProperty, + FloatProperty, + IntProperty, + StringProperty, ) -from typing import TYPE_CHECKING, Literal, get_args +from bpy.types import PropertyGroup + +import bonsai.bim.module.pset.data +import bonsai.bim.module.resource.data +import bonsai.bim.module.sequence.data +import bonsai.tool as tool +from bonsai.bim.prop import Attribute, ISODuration quantitytypes_enum: dict[str, tool.Blender.BLENDER_ENUM_ITEMS] = {} @@ -189,7 +188,7 @@ def tree(self) -> "BIMResourceTreeProperties": @property def productivity(self) -> "BIMResourceProductivity": assert bpy.context.scene - productivity = bpy.context.scene.BIMResourceProductivity + productivity = bpy.context.scene.BIMResourceProductivity # pyright: ignore[reportAttributeAccessIssue] assert isinstance(productivity, BIMResourceProductivity) return productivity diff --git a/src/bonsai/bonsai/bim/module/resource/ui.py b/src/bonsai/bonsai/bim/module/resource/ui.py index b061600978d..679eed87822 100644 --- a/src/bonsai/bonsai/bim/module/resource/ui.py +++ b/src/bonsai/bonsai/bim/module/resource/ui.py @@ -17,16 +17,19 @@ # along with Bonsai. If not, see . from __future__ import annotations + +from typing import TYPE_CHECKING, Any + import bpy -import bonsai.tool as tool -import bonsai.bim.helper from bpy.types import Panel, UIList + +import bonsai.bim.helper +import bonsai.tool as tool from bonsai.bim.module.resource.data import ResourceData -from typing import Any, TYPE_CHECKING if TYPE_CHECKING: + from bonsai.bim.module.resource.prop import BIMResourceTreeProperties, Resource from bonsai.bim.prop import ISODuration - from bonsai.bim.module.resource.prop import Resource, BIMResourceTreeProperties class BIM_PT_resources(Panel): diff --git a/src/bonsai/bonsai/bim/module/root/__init__.py b/src/bonsai/bonsai/bim/module/root/__init__.py index 3e6f280eb29..7192dcdff4c 100644 --- a/src/bonsai/bonsai/bim/module/root/__init__.py +++ b/src/bonsai/bonsai/bim/module/root/__init__.py @@ -17,7 +17,8 @@ # along with Bonsai. If not, see . import bpy -from . import ui, prop, operator + +from . import operator, prop, ui classes = ( operator.AddElement, diff --git a/src/bonsai/bonsai/bim/module/root/data.py b/src/bonsai/bonsai/bim/module/root/data.py index 7690210c9b8..c1988c8b825 100644 --- a/src/bonsai/bonsai/bim/module/root/data.py +++ b/src/bonsai/bonsai/bim/module/root/data.py @@ -17,13 +17,18 @@ # along with Bonsai. If not, see . from collections import defaultdict -import bpy +from typing import Union + import ifcopenshell.util.attribute import ifcopenshell.util.element import ifcopenshell.util.schema -from ifcopenshell.util.doc import get_entity_doc, get_predefined_type_doc, get_class_suggestions +from ifcopenshell.util.doc import ( + get_class_suggestions, + get_entity_doc, + get_predefined_type_doc, +) + import bonsai.tool as tool -from typing import Union def refresh(): @@ -128,44 +133,8 @@ def representation_template(cls): return [("FACE", "Face", "A planar face surface")] templates = [ ("EMPTY", "No Geometry", "Start with an empty object"), - None, - ( - "OBJ", - "Tessellation From Object", - "Use an object as a template to create a new tessellation", - ), - ( - "MESH", - "Custom Tessellation", - "Create a basic tessellated or faceted cube", - ), - ( - "EXTRUSION", - "Custom Extruded Solid", - "An extrusion from an arbitrary profile", - ), ] - if ifc_class.endswith("Type") or ifc_class.endswith("Style"): - templates.extend( - [ - None, - ( - "LAYERSET_AXIS2", - "Vertical Layers", - "For objects similar to walls, will automatically add IfcMaterialLayerSet", - ), - ( - "LAYERSET_AXIS3", - "Horizontal Layers", - "For objects similar to slabs, will automatically add IfcMaterialLayerSet", - ), - ( - "PROFILESET", - "Extruded Profile", - "Create profile type object, automatically defines IfcMaterialProfileSet with the first profile from library", - ), - ] - ) + if ifc_class in ("IfcWindowType", "IfcWindowStyle", "IfcWindow"): templates.extend([None, ("WINDOW", "Window", "Parametric window")]) elif ifc_class in ("IfcDoorType", "IfcDoorStyle", "IfcDoor"): @@ -185,6 +154,11 @@ def representation_template(cls): "Rectangular Distribution Segment", "Works similarly to Profile, has distribution ports", ), + ( + "FLOW_SEGMENT_RECTANGULAR_HOLLOW", + "Rectangular Hollow Distribution Segment", + "Works similarly to Profile, has distribution ports", + ), ( "FLOW_SEGMENT_CIRCULAR", "Circular Distribution Segment", @@ -197,7 +171,58 @@ def representation_template(cls): ), ) ) + if ifc_class and "IfcCableCarrierSegment" in ifc_class: + templates.extend( + ( + ( + "FLOW_SEGMENT_U_SHAPE", + "U-Shape Distribution Segment", + "Uses IfcUShapeProfileDef, has distribution ports", + ), + ) + ) + if ifc_class.endswith("Type") or ifc_class.endswith("Style"): + templates.extend( + [ + None, + ( + "LAYERSET_AXIS2", + "Vertical Layers", + "For objects similar to walls, will automatically add IfcMaterialLayerSet", + ), + ( + "LAYERSET_AXIS3", + "Horizontal Layers", + "For objects similar to slabs, will automatically add IfcMaterialLayerSet", + ), + ( + "PROFILESET", + "Extruded Profile", + "Create profile type object, automatically defines IfcMaterialProfileSet with the first profile from library", + ), + ] + ) + templates.extend( + [ + None, + ( + "OBJ", + "Tessellation From Object", + "Use an object as a template to create a new tessellation", + ), + ( + "MESH", + "Custom Tessellation", + "Create a basic tessellated or faceted cube", + ), + ( + "EXTRUSION", + "Custom Extruded Solid", + "An extrusion from an arbitrary profile", + ), + ] + ) return templates @classmethod diff --git a/src/bonsai/bonsai/bim/module/root/operator.py b/src/bonsai/bonsai/bim/module/root/operator.py index a5bf766ae2e..159f157d448 100644 --- a/src/bonsai/bonsai/bim/module/root/operator.py +++ b/src/bonsai/bonsai/bim/module/root/operator.py @@ -16,29 +16,29 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . -import bpy +from typing import TYPE_CHECKING + import bmesh +import bpy import idprop import ifcopenshell -import ifcopenshell.api import ifcopenshell.api.geometry import ifcopenshell.api.material import ifcopenshell.api.pset import ifcopenshell.api.root -import ifcopenshell.util.schema import ifcopenshell.util.element +import ifcopenshell.util.schema import ifcopenshell.util.shape_builder import ifcopenshell.util.type import ifcopenshell.util.unit -import bonsai.bim.handler -import bonsai.core.root as core +from mathutils import Vector + +import bonsai.bim.module.root.prop as root_prop import bonsai.core.geometry +import bonsai.core.root as core import bonsai.tool as tool -import bonsai.bim.module.root.prop as root_prop -from bonsai.bim.ifc import IfcStore from bonsai.bim.helper import get_enum_items, prop_with_search -from mathutils import Vector -from typing import TYPE_CHECKING +from bonsai.bim.ifc import IfcStore class EnableReassignClass(bpy.types.Operator): @@ -307,7 +307,7 @@ def ensure_single_user_mesh(mesh: bpy.types.Mesh) -> None: with context.temp_override(selected_editable_objects=[obj]): bpy.ops.object.transform_apply(location=False, rotation=False, scale=True, properties=False) # object.transform_apply is losing normals. - if is_negative: + if is_negative and bpy.app.version >= (5, 1, 0): for polygon in obj.data.polygons: polygon.flip() @@ -695,6 +695,26 @@ def _execute(self, context): XDim=default_x_dim / unit_scale, YDim=default_y_dim / unit_scale, ) + elif representation_template == "FLOW_SEGMENT_RECTANGULAR_HOLLOW": + default_x_dim = 0.4 + default_y_dim = 0.2 + default_thickness = 0.005 + default_inner_fillet_radius = 0.005 + default_outer_fillet_radius = 0.005 + profile_name = ( + f"{props.ifc_class}-{default_x_dim*1000}x{default_y_dim*1000}x{default_thickness*1000}" + ) + profile = tool.Ifc.get().create_entity( + "IfcRectangleHollowProfileDef", + ProfileName=profile_name, + ProfileType="AREA", + XDim=default_x_dim / unit_scale, + YDim=default_y_dim / unit_scale, + WallThickness=default_thickness / unit_scale, + InnerFilletRadius=default_inner_fillet_radius / unit_scale, + OuterFilletRadius=default_outer_fillet_radius / unit_scale, + ) + elif representation_template == "FLOW_SEGMENT_CIRCULAR": default_diameter = 0.1 profile_name = f"{props.ifc_class}-{default_diameter*1000}" @@ -715,6 +735,21 @@ def _execute(self, context): Radius=(default_diameter / 2) / unit_scale, WallThickness=default_thickness, ) + elif representation_template == "FLOW_SEGMENT_U_SHAPE": + default_depth = 0.4 + default_flange_width = 0.2 + default_web_thickness = 0.005 + default_flange_thickness = 0.005 + profile_name = f"{props.ifc_class}-{default_depth*1000}x{default_flange_width*1000}x{default_web_thickness*1000}x{default_flange_thickness*1000}" + profile = tool.Ifc.get().create_entity( + "IfcUShapeProfileDef", + ProfileName=profile_name, + ProfileType="AREA", + Depth=default_depth / unit_scale, + FlangeWidth=default_flange_width / unit_scale, + WebThickness=default_web_thickness / unit_scale, + FlangeThickness=default_flange_thickness / unit_scale, + ) rel = ifcopenshell.api.material.assign_material( tool.Ifc.get(), products=[element], type="IfcMaterialProfileSet" diff --git a/src/bonsai/bonsai/bim/module/root/prop.py b/src/bonsai/bonsai/bim/module/root/prop.py index 9bd00c4c681..35b7b9f4030 100644 --- a/src/bonsai/bonsai/bim/module/root/prop.py +++ b/src/bonsai/bonsai/bim/module/root/prop.py @@ -16,25 +16,20 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . +from typing import TYPE_CHECKING, Union + import bpy -import ifcopenshell import ifcopenshell.util.element -import ifcopenshell.util.schema import ifcopenshell.util.type -import bonsai.tool as tool -from bonsai.bim.module.root.data import IfcClassData -from bpy.types import PropertyGroup from bpy.props import ( + EnumProperty, PointerProperty, StringProperty, - EnumProperty, - BoolProperty, - IntProperty, - FloatProperty, - FloatVectorProperty, - CollectionProperty, ) -from typing import TYPE_CHECKING, Union +from bpy.types import PropertyGroup + +import bonsai.tool as tool +from bonsai.bim.module.root.data import IfcClassData def get_ifc_predefined_types(self: "BIMRootProperties", context: bpy.types.Context) -> list[tuple[str, str]]: diff --git a/src/bonsai/bonsai/bim/module/root/ui.py b/src/bonsai/bonsai/bim/module/root/ui.py index facf619ad8d..f9eae350e48 100644 --- a/src/bonsai/bonsai/bim/module/root/ui.py +++ b/src/bonsai/bonsai/bim/module/root/ui.py @@ -16,13 +16,13 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . -import bpy -import bonsai.tool as tool -import bonsai.bim.module.root.prop as root_prop from bpy.types import Panel + +import bonsai.bim.module.root.prop as root_prop +import bonsai.tool as tool from bonsai.bim.helper import prop_with_search -from bonsai.bim.module.root.data import IfcClassData from bonsai.bim.module.model.data import AuthoringData +from bonsai.bim.module.root.data import IfcClassData class BIM_PT_class(Panel): diff --git a/src/bonsai/bonsai/bim/module/search/__init__.py b/src/bonsai/bonsai/bim/module/search/__init__.py index 88cb2f6ed46..b6c76733a14 100644 --- a/src/bonsai/bonsai/bim/module/search/__init__.py +++ b/src/bonsai/bonsai/bim/module/search/__init__.py @@ -17,7 +17,8 @@ # along with Bonsai. If not, see . import bpy -from . import ui, prop, operator + +from . import operator, prop, ui classes = ( operator.ActivateContainerFilter, @@ -40,6 +41,7 @@ operator.SelectByProperty, operator.SelectFilterElements, operator.SelectGlobalId, + operator.SelectQueryElements, operator.SelectIfcClass, operator.SelectSimilar, operator.ShowAllElements, diff --git a/src/bonsai/bonsai/bim/module/search/data.py b/src/bonsai/bonsai/bim/module/search/data.py index 4bde0aa3593..8c2fad00b0d 100644 --- a/src/bonsai/bonsai/bim/module/search/data.py +++ b/src/bonsai/bonsai/bim/module/search/data.py @@ -16,12 +16,14 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . -import bpy import json + +import bpy import ifcopenshell.util.element -import bonsai.tool as tool from natsort import natsorted +import bonsai.tool as tool + def refresh(): SearchData.is_loaded = False diff --git a/src/bonsai/bonsai/bim/module/search/operator.py b/src/bonsai/bonsai/bim/module/search/operator.py index 2c7a506e788..f55dcf31b72 100644 --- a/src/bonsai/bonsai/bim/module/search/operator.py +++ b/src/bonsai/bonsai/bim/module/search/operator.py @@ -16,35 +16,39 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . -import bpy -import json import bisect +import json import traceback +from typing import TYPE_CHECKING, Any, Literal, assert_never, get_args + +import bpy import ifcopenshell -import ifcopenshell.api import ifcopenshell.api.group import ifcopenshell.util.element import ifcopenshell.util.selector -import bonsai.tool as tool -import bonsai.core.search as core -from bonsai.bim.ifc import IfcStore -from natsort import natsorted -from bpy.types import PropertyGroup, Operator from bpy.props import ( - PointerProperty, - StringProperty, - EnumProperty, BoolProperty, - IntProperty, - FloatProperty, - FloatVectorProperty, CollectionProperty, + EnumProperty, + IntProperty, + StringProperty, ) +from bpy.types import Operator +from natsort import natsorted + +import bonsai.core.search as core +import bonsai.tool as tool +from bonsai.bim.ifc import IfcStore from bonsai.bim.prop import StrProperty -from typing import TYPE_CHECKING, Literal, get_args, assert_never +if TYPE_CHECKING: + from bpy.stub_internal import rna_enums -def draw_text_editor_header(self, context): + from bonsai.bim.prop import BIMFacet + + +def draw_text_editor_header(self: bpy.types.TEXT_HT_header, context: bpy.types.Context) -> None: + assert isinstance(context.space_data, bpy.types.SpaceTextEditor) if context.space_data.text and context.space_data.text.name.startswith("FilterQuery_"): layout = self.layout layout.separator() @@ -158,6 +162,7 @@ def invoke(self, context, event): def draw(self, context): layout = self.layout + assert layout filter_groups = tool.Search.get_filter_groups(self.module) ifc_filter = filter_groups[self.group_index].filters[self.filter_index] @@ -200,8 +205,8 @@ def draw(self, context): results_are_suggestions=True, ) - def get_suggestions(self, ifc_file, ifc_filter): - suggestions = set() + def get_suggestions(self, ifc_file: ifcopenshell.file, ifc_filter: "BIMFacet") -> set[str]: + suggestions: set[str] = set() if ifc_filter.type == "entity": suggestions = self.get_entity_suggestions(ifc_file) @@ -234,8 +239,8 @@ def get_suggestions(self, ifc_file, ifc_filter): return suggestions - def build_hierarchy_path(self, element): - path = [] + def build_hierarchy_path(self, element: ifcopenshell.entity_instance) -> list[str]: + path: list[str] = [] current = element while current: @@ -260,8 +265,8 @@ def build_hierarchy_path(self, element): return path - def get_entity_suggestions(self, ifc_file): - all_classes = set() + def get_entity_suggestions(self, ifc_file: ifcopenshell.file) -> set[str]: + all_classes: set[str] = set() schema = tool.Ifc.schema() for element_id in IfcStore.id_map.keys(): @@ -271,11 +276,13 @@ def get_entity_suggestions(self, ifc_file): try: entity = schema.declaration_by_name(class_name).as_entity() + assert entity current = entity chain_names = [class_name] while current.supertype(): supertype = current.supertype() + assert supertype chain_names.insert(0, supertype.name()) current = supertype @@ -293,8 +300,8 @@ def get_entity_suggestions(self, ifc_file): return all_classes - def get_type_suggestions(self, ifc_file): - suggestions = set() + def get_type_suggestions(self, ifc_file: ifcopenshell.file) -> set[str]: + suggestions: set[str] = set() for element_type in ifc_file.by_type("IfcTypeObject"): if element_type.Name: hierarchy_path = self.build_hierarchy_path(element_type) @@ -304,15 +311,15 @@ def get_type_suggestions(self, ifc_file): suggestions.add(element_type.Name) return suggestions - def get_material_suggestions(self, ifc_file): + def get_material_suggestions(self, ifc_file: ifcopenshell.file) -> set[str]: suggestions = set() for material in ifc_file.by_type("IfcMaterial"): if material.Name: suggestions.add(material.Name) return suggestions - def get_location_suggestions(self, ifc_file): - suggestions = set() + def get_location_suggestions(self, ifc_file: ifcopenshell.file) -> set[str]: + suggestions: set[str] = set() for spatial in ifc_file.by_type("IfcSpatialStructureElement"): if spatial.Name: hierarchy_path = self.build_hierarchy_path(spatial) @@ -322,8 +329,8 @@ def get_location_suggestions(self, ifc_file): suggestions.add(spatial.Name) return suggestions - def get_group_suggestions(self, ifc_file): - suggestions = set() + def get_group_suggestions(self, ifc_file: ifcopenshell.file) -> set[str]: + suggestions: set[str] = set() for group in ifc_file.by_type("IfcGroup"): if group.Name: hierarchy_path = self.build_hierarchy_path(group) @@ -333,15 +340,15 @@ def get_group_suggestions(self, ifc_file): suggestions.add(group.Name) return suggestions - def get_classification_suggestions(self, ifc_file): - suggestions = set() + def get_classification_suggestions(self, ifc_file: ifcopenshell.file) -> set[str]: + suggestions: set[str] = set() for ref in ifc_file.by_type("IfcClassificationReference"): if ref.Identification: suggestions.add(ref.Identification) return suggestions - def get_parent_suggestions(self, ifc_file): - suggestions = set() + def get_parent_suggestions(self, ifc_file: ifcopenshell.file) -> set[str]: + suggestions: set[str] = set() for element_id in IfcStore.id_map.keys(): try: element = ifc_file.by_id(element_id) @@ -369,9 +376,9 @@ def get_parent_suggestions(self, ifc_file): return suggestions - def get_instance_suggestions(self, ifc_file): - suggestions = set() - element_data = [] + def get_instance_suggestions(self, ifc_file: ifcopenshell.file) -> set[str]: + suggestions: set[str] = set() + element_data: list[tuple[str, str]] = [] for element_id in IfcStore.id_map.keys(): try: @@ -390,7 +397,7 @@ def get_instance_suggestions(self, ifc_file): except: continue - display_counts = {} + display_counts: dict[str, int] = {} for display_str, global_id in element_data: display_counts[display_str] = display_counts.get(display_str, 0) + 1 @@ -402,8 +409,8 @@ def get_instance_suggestions(self, ifc_file): return suggestions - def get_property_sets(self, ifc_file): - psets = set() + def get_property_sets(self, ifc_file: ifcopenshell.file) -> set[str]: + psets: set[str] = set() for element_id in IfcStore.id_map.keys(): try: element = ifc_file.by_id(element_id) @@ -416,8 +423,8 @@ def get_property_sets(self, ifc_file): continue return psets - def get_property_names(self, ifc_file, pset_name): - property_names = set() + def get_property_names(self, ifc_file: ifcopenshell.file, pset_name: str) -> set[str]: + property_names: set[str] = set() for element_id in IfcStore.id_map.keys(): try: element = ifc_file.by_id(element_id) @@ -433,8 +440,8 @@ def get_property_names(self, ifc_file, pset_name): continue return property_names - def get_property_values(self, ifc_file, pset_name, property_name): - property_values = set() + def get_property_values(self, ifc_file: ifcopenshell.file, pset_name: str, property_name: str) -> set[str]: + property_values: set[str] = set() for element_id in IfcStore.id_map.keys(): try: element = ifc_file.by_id(element_id) @@ -445,26 +452,23 @@ def get_property_values(self, ifc_file, pset_name, property_name): if pset.HasProperties: for prop in pset.HasProperties: if hasattr(prop, "Name") and prop.Name == property_name: - if hasattr(prop, "NominalValue") and prop.NominalValue: - try: - value = prop.NominalValue.wrappedValue - if value is not None and value != "": - if not hasattr(value, "is_a") and not isinstance( - value, (tuple, list) - ): - str_value = str(value) - if not str_value.startswith("#") and not str_value.startswith( - "(" - ): - property_values.add(str_value) - except: - continue + if prop.is_a("IfcPropertyEnumeratedValue"): + if hasattr(prop, "EnumerationReference") and prop.EnumerationReference: + enum_reference = prop.EnumerationReference + if hasattr(enum_reference, "EnumerationValues"): + for enum_value in enum_reference.EnumerationValues: + property_values.add(str(enum_value.wrappedValue)) + if hasattr(prop, "EnumerationValues") and prop.EnumerationValues: + for enum_value in prop.EnumerationValues: + property_values.add(str(enum_value.wrappedValue)) + elif hasattr(prop, "NominalValue") and prop.NominalValue: + property_values.add(str(prop.NominalValue.wrappedValue)) except: continue return property_values - def get_attribute_names(self, ifc_file): - attribute_names = set() + def get_attribute_names(self, ifc_file: ifcopenshell.file) -> set[str]: + attribute_names: set[str] = set() schema = tool.Ifc.schema() ifc_classes = set() @@ -478,6 +482,7 @@ def get_attribute_names(self, ifc_file): for ifc_class in ifc_classes: try: entity = schema.declaration_by_name(ifc_class).as_entity() + assert entity attributes = entity.all_attributes() for attr in attributes: attribute_names.add(attr.name()) @@ -486,8 +491,8 @@ def get_attribute_names(self, ifc_file): return attribute_names - def get_attribute_values(self, ifc_file, attribute_name): - attribute_values = set() + def get_attribute_values(self, ifc_file: ifcopenshell.file, attribute_name: str) -> set[str]: + attribute_values: set[str] = set() for element_id in IfcStore.id_map.keys(): try: @@ -614,7 +619,7 @@ def execute(self, context): return {"FINISHED"} -class ApplyFilterFromText(Operator, tool.Ifc.Operator): +class ApplyFilterFromText(Operator): bl_idname = "bim.apply_filter_from_text" bl_label = "Apply Filter Configuration" bl_description = "Apply the JSON filter configuration from the current text block" @@ -688,9 +693,9 @@ def invoke(self, context, event): filter_groups = tool.Search.get_filter_groups(module) if tool.Blender.get_addon_preferences().chain_filter_with_set_operations: - filter_structure = [] + filter_structure: list[list[dict[str, Any]]] = [] for filter_group in filter_groups: - group_data = [] + group_data: list[dict[str, Any]] = [] for ifc_filter in filter_group.filters: filter_data = { "type": ifc_filter.type, @@ -765,10 +770,7 @@ def execute(self, context): preferences = tool.Blender.get_addon_preferences() # Migrate old ! prefix filters to new filter_mode system when preferences are enabled - if ( - preferences.chain_filter_with_set_operations - or preferences.default_filter_with_set_operations_for_globalid_and_class - ): + if preferences.chain_filter_with_set_operations: for filter_group in props.filter_groups: for ifc_filter in filter_group.filters: if ifc_filter.type not in ["entity", "instance"]: @@ -784,11 +786,31 @@ def execute(self, context): ) objs = [obj for e in results if isinstance(obj := tool.Ifc.get_object(e), bpy.types.Object)] - for obj in objs: - tool.Blender.set_object_selection(obj) - if objs: - tool.Blender.set_active_object(objs[0]) - self.report({"INFO"}, f"{len(results)} Results.") + active_object = next(iter(objs), None) + selection = tool.Blender.validate_object_selection(context, active_object, objs) + tool.Blender.set_objects_selection(*selection, clear_previous_selection=False) + self.report({"INFO"}, f"{len(results)} Results, {len(selection.selected_objects)} Objects Selected") + return {"FINISHED"} + + +class SelectQueryElements(Operator): + bl_idname = "bim.select_query_elements" + bl_label = "Select Query Elements" + bl_description = "Select elements matching an provided selector query" + bl_options = {"REGISTER", "UNDO"} + + query: StringProperty(name="Query") + + if TYPE_CHECKING: + query: str + + def execute(self, context) -> set["rna_enums.OperatorReturnItems"]: + results = ifcopenshell.util.selector.filter_elements(tool.Ifc.get(), self.query) + objs = [obj for e in results if isinstance(obj := tool.Ifc.get_object(e), bpy.types.Object)] + active_object = context.active_object or next(iter(objs), None) + selection = tool.Blender.validate_object_selection(context, active_object, objs) + tool.Blender.set_objects_selection(*selection, clear_previous_selection=False) + self.report({"INFO"}, f"{len(results)} Results, {len(selection.selected_objects)} Objects Selected") return {"FINISHED"} @@ -807,12 +829,12 @@ def get_name_search_items(self, context: object, text: str) -> list[str]: # Extra item so it will be easy to select current text. return [text] + SaveSearch.name_search_items - name: StringProperty( # pyright: ignore[reportRedeclaration] + name: StringProperty( name="Name", search=get_name_search_items, search_options={"SORT"}, ) - module: StringProperty() # pyright: ignore[reportRedeclaration] + module: StringProperty() def update_use_all_ifcgroups(self, context: object = None) -> None: ifc_file = tool.Ifc.get() @@ -823,7 +845,7 @@ def update_use_all_ifcgroups(self, context: object = None) -> None: } self.name_search_items[:] = natsorted(groups) - use_all_ifcgroups: BoolProperty( # pyright: ignore[reportRedeclaration] + use_all_ifcgroups: BoolProperty( name="Use Any IfcGroup", description=( "By default we're targeting only IfcGroups with SEARCH ObjectType " @@ -849,9 +871,9 @@ def _execute(self, context): query = tool.Search.export_filter_query(filter_groups) results = tool.Search.execute_filter_groups(filter_groups) - filter_structure = [] + filter_structure: list[list[dict[str, Any]]] = [] for filter_group in filter_groups: - group_data = [] + group_data: list[dict[str, Any]] = [] for ifc_filter in filter_group.filters: filter_data = { "type": ifc_filter.type, @@ -1054,8 +1076,8 @@ def _execute(self, context): colourscheme[str(values[index])]["total"] += 1 obj.color = (*tool.Search.get_quantitative_palette(palette, value, min_value, max_value), 1) - if areas := [a for a in context.screen.areas if a.type == "VIEW_3D"]: - areas[0].spaces[0].shading.color_type = "OBJECT" + assert (space := tool.Blender.get_view3d_space()) + space.shading.color_type = "OBJECT" props.colourscheme.clear() @@ -1079,16 +1101,18 @@ def sort_quantitative_key(self, value): return (1, value) def store_state(self, context): - if areas := [a for a in context.screen.areas if a.type == "VIEW_3D"]: - self.transaction_data = {"area": areas[0], "color_type": areas[0].spaces[0].shading.color_type} + if space := tool.Blender.get_view3d_space(): + self.transaction_data = {"color_type": space.shading.color_type} def rollback(self, data): if data: - data["area"].spaces[0].shading.color_type = data["color_type"] + assert (space := tool.Blender.get_view3d_space()) + space.shading.color_type = data["color_type"] def commit(self, data): if data: - data["area"].spaces[0].shading.color_type = "OBJECT" + assert (space := tool.Blender.get_view3d_space()) + space.shading.color_type = "OBJECT" class SelectByProperty(Operator): @@ -1416,7 +1440,7 @@ def execute(self, context): return {"FINISHED"} -class SelectSimilar(Operator, tool.Ifc.Operator): +class SelectSimilar(Operator): bl_idname = "bim.select_similar" bl_label = "Select Similar" bl_options = {"REGISTER", "UNDO"} diff --git a/src/bonsai/bonsai/bim/module/search/prop.py b/src/bonsai/bonsai/bim/module/search/prop.py index 3cb8a122522..0f451124208 100644 --- a/src/bonsai/bonsai/bim/module/search/prop.py +++ b/src/bonsai/bonsai/bim/module/search/prop.py @@ -16,24 +16,27 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . +from typing import TYPE_CHECKING, Literal, get_args + import bpy -import bonsai.tool as tool -import ifcopenshell.util.schema -from bonsai.bim.prop import ObjProperty, BIMFilterGroup -from bonsai.bim.module.search.data import SearchData, ColourByPropertyData, SelectSimilarData -from bpy.types import PropertyGroup -from . import ui, prop, operator from bpy.props import ( - PointerProperty, - StringProperty, - EnumProperty, BoolProperty, - IntProperty, + CollectionProperty, + EnumProperty, FloatProperty, FloatVectorProperty, - CollectionProperty, + IntProperty, + StringProperty, ) -from typing import TYPE_CHECKING, Literal, get_args +from bpy.types import PropertyGroup + +import bonsai.tool as tool +from bonsai.bim.module.search.data import ( + ColourByPropertyData, + SearchData, + SelectSimilarData, +) +from bonsai.bim.prop import BIMFilterGroup, ObjProperty def get_element_key(self: "BIMSearchProperties", context: bpy.types.Context) -> list[tuple[str, str, str]]: diff --git a/src/bonsai/bonsai/bim/module/search/ui.py b/src/bonsai/bonsai/bim/module/search/ui.py index 3481e3709bf..3b01fdcbbef 100644 --- a/src/bonsai/bonsai/bim/module/search/ui.py +++ b/src/bonsai/bonsai/bim/module/search/ui.py @@ -17,15 +17,26 @@ # along with Bonsai. If not, see . from __future__ import annotations + +from typing import TYPE_CHECKING + import bpy -import bonsai.tool as tool -import bonsai.bim.helper from bpy.types import Panel -from bonsai.bim.module.search.data import SearchData, ColourByPropertyData, SelectSimilarData -from typing import TYPE_CHECKING + +import bonsai.bim.helper +import bonsai.tool as tool +from bonsai.bim.module.search.data import ( + ColourByPropertyData, + SearchData, + SelectSimilarData, +) if TYPE_CHECKING: - from bonsai.bim.module.search.prop import BIMSearchProperties, BIMColour, BIMFilterItem + from bonsai.bim.module.search.prop import ( + BIMColour, + BIMFilterItem, + BIMSearchProperties, + ) class BIM_PT_search(Panel): diff --git a/src/bonsai/bonsai/bim/module/sequence/__init__.py b/src/bonsai/bonsai/bim/module/sequence/__init__.py index 3262b645272..e15d4e80ee8 100644 --- a/src/bonsai/bonsai/bim/module/sequence/__init__.py +++ b/src/bonsai/bonsai/bim/module/sequence/__init__.py @@ -19,7 +19,8 @@ # pyright: reportAttributeAccessIssue=false import bpy -from . import ui, prop, operator + +from . import operator, prop, ui classes = ( operator.AddAnimationCamera, diff --git a/src/bonsai/bonsai/bim/module/sequence/data.py b/src/bonsai/bonsai/bim/module/sequence/data.py index 94df71eacd4..20027281eb9 100644 --- a/src/bonsai/bonsai/bim/module/sequence/data.py +++ b/src/bonsai/bonsai/bim/module/sequence/data.py @@ -16,14 +16,15 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . +import json +from typing import Any + import bpy -import bonsai.tool as tool -import ifcopenshell import ifcopenshell.util.attribute import ifcopenshell.util.date from ifcopenshell.util.doc import get_predefined_type_doc -import json -from typing import Any + +import bonsai.tool as tool def refresh(): diff --git a/src/bonsai/bonsai/bim/module/sequence/helper.py b/src/bonsai/bonsai/bim/module/sequence/helper.py index 43dcd1d59b4..9e16e384021 100644 --- a/src/bonsai/bonsai/bim/module/sequence/helper.py +++ b/src/bonsai/bonsai/bim/module/sequence/helper.py @@ -18,12 +18,12 @@ from __future__ import annotations -import isodate +from datetime import datetime, timedelta +from typing import Any, Union + import bpy -from dateutil import parser import ifcopenshell.util.date -from datetime import timedelta, datetime -from typing import Union, Any +from dateutil import parser from bonsai.bim.prop import ISODuration diff --git a/src/bonsai/bonsai/bim/module/sequence/operator.py b/src/bonsai/bonsai/bim/module/sequence/operator.py index c07b9a0496e..fb97d7152a8 100644 --- a/src/bonsai/bonsai/bim/module/sequence/operator.py +++ b/src/bonsai/bonsai/bim/module/sequence/operator.py @@ -18,23 +18,23 @@ # pyright: reportUnnecessaryTypeIgnoreComment=error +import calendar +import time import types - from collections import Counter +from datetime import datetime from functools import cache +from typing import TYPE_CHECKING, Union, assert_never, get_args import bpy -import time -import calendar import ifcopenshell.api.pset import ifcopenshell.util.element +from bpy_extras.io_utils import ExportHelper, ImportHelper +from dateutil import parser, relativedelta + import bonsai.bim.schema import bonsai.core.sequence as core import bonsai.tool as tool -from datetime import datetime -from dateutil import parser, relativedelta -from bpy_extras.io_utils import ImportHelper, ExportHelper -from typing import Union, get_args, TYPE_CHECKING, assert_never if TYPE_CHECKING: from bpy.stub_internal.rna_enums import OperatorReturnItems @@ -106,7 +106,7 @@ class ActivateStatusFilters(bpy.types.Operator): bl_description = "Filter and display objects based on currently selected IFC statuses" bl_options = {"REGISTER", "UNDO"} - only_if_enabled: bpy.props.BoolProperty( # pyright: ignore[reportRedeclaration] + only_if_enabled: bpy.props.BoolProperty( name="Only If Filters are Enabled", description="Activate status filters only in case if they were enabled from the UI before.", default=False, @@ -137,7 +137,7 @@ class SelectStatusFilter(bpy.types.Operator): bl_description = "Select elements with currently selected status" bl_options = {"REGISTER", "UNDO"} - status: bpy.props.StringProperty() # pyright: ignore[reportRedeclaration] + status: bpy.props.StringProperty() if TYPE_CHECKING: status: tool.Sequence.ElementStatusUI @@ -156,7 +156,7 @@ class AssignStatus(bpy.types.Operator, tool.Ifc.Operator): bl_description = "Assign status to the selected elements.\n\nAlt+CLICK to unassign the status." bl_options = {"REGISTER", "UNDO"} - should_override_previous_status: bpy.props.BoolProperty( # pyright: ignore[reportRedeclaration] + should_override_previous_status: bpy.props.BoolProperty( name="Override Previous Status", description=( "Whether assigning new status should override previous one.\n\n" @@ -165,8 +165,8 @@ class AssignStatus(bpy.types.Operator, tool.Ifc.Operator): ), default=True, ) - status: bpy.props.StringProperty() # pyright: ignore[reportRedeclaration] - should_unassign_status: bpy.props.BoolProperty( # pyright: ignore[reportRedeclaration] + status: bpy.props.StringProperty() + should_unassign_status: bpy.props.BoolProperty( options={"SKIP_SAVE"}, ) @@ -415,7 +415,7 @@ class CopyWorkSchedule(bpy.types.Operator, tool.Ifc.Operator): bl_label = "Copy Work Schedule" bl_description = "Create a duplicate of the provided work schedule." bl_options = {"REGISTER", "UNDO"} - work_schedule: bpy.props.IntProperty() # pyright: ignore[reportRedeclaration] + work_schedule: bpy.props.IntProperty() if TYPE_CHECKING: work_schedule: int diff --git a/src/bonsai/bonsai/bim/module/sequence/prop.py b/src/bonsai/bonsai/bim/module/sequence/prop.py index 1c35910e6c1..97f274c421d 100644 --- a/src/bonsai/bonsai/bim/module/sequence/prop.py +++ b/src/bonsai/bonsai/bim/module/sequence/prop.py @@ -16,32 +16,31 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . +from typing import TYPE_CHECKING, Literal, get_args + import bpy -import isodate -import ifcopenshell.api import ifcopenshell.api.sequence -import ifcopenshell.util.attribute import ifcopenshell.util.date -import bonsai.tool as tool -import bonsai.core.sequence as core -from bonsai.bim.module.sequence.data import SequenceData, AnimationColorSchemeData, refresh as refresh_sequence_data -import bonsai.bim.module.resource.data -import bonsai.bim.module.pset.data -from mathutils import Color -from bonsai.bim.prop import Attribute, ISODuration -from dateutil import parser -from bpy.types import PropertyGroup from bpy.props import ( - PointerProperty, - StringProperty, - EnumProperty, BoolProperty, - IntProperty, + CollectionProperty, + EnumProperty, FloatProperty, FloatVectorProperty, - CollectionProperty, + IntProperty, + StringProperty, ) -from typing import TYPE_CHECKING, Literal, Union, get_args +from bpy.types import PropertyGroup +from dateutil import parser +from mathutils import Color + +import bonsai.bim.module.pset.data +import bonsai.bim.module.resource.data +import bonsai.core.sequence as core +import bonsai.tool as tool +from bonsai.bim.module.sequence.data import AnimationColorSchemeData, SequenceData +from bonsai.bim.module.sequence.data import refresh as refresh_sequence_data +from bonsai.bim.prop import Attribute, ISODuration def getTaskColumns(self, context): @@ -413,7 +412,7 @@ class TaskProduct(PropertyGroup): class BIMWorkPlanProperties(PropertyGroup): work_plan_attributes: CollectionProperty(name="Work Plan Attributes", type=Attribute) - editing_type: EnumProperty( # pyright: ignore[reportRedeclaration] + editing_type: EnumProperty( items=[(i, i, "") for i in get_args(WorkPlanEditingType)], ) work_plans: CollectionProperty(name="Work Plans", type=WorkPlan) @@ -431,8 +430,8 @@ class BIMWorkPlanProperties(PropertyGroup): class IFCStatus(PropertyGroup): - name: StringProperty() # pyright: ignore[reportRedeclaration] - is_visible: BoolProperty( # pyright: ignore[reportRedeclaration] + name: StringProperty() + is_visible: BoolProperty( name="Is Visible", default=True, update=lambda x, y: (None, bpy.ops.bim.activate_status_filters())[0] ) diff --git a/src/bonsai/bonsai/bim/module/sequence/ui.py b/src/bonsai/bonsai/bim/module/sequence/ui.py index 9178268c3ab..56847fa750f 100644 --- a/src/bonsai/bonsai/bim/module/sequence/ui.py +++ b/src/bonsai/bonsai/bim/module/sequence/ui.py @@ -16,26 +16,36 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . +from __future__ import annotations + +from typing import TYPE_CHECKING, Any, Optional + import bpy -import ifcopenshell import isodate -import bonsai.tool as tool -import bonsai.bim.helper from bpy.types import Panel, UIList + +import bonsai.bim.helper +import bonsai.tool as tool from bonsai.bim.helper import draw_attributes from bonsai.bim.module.sequence.data import ( - WorkPlansData, - WorkScheduleData, - SequenceData, - TaskICOMData, AnimationColorSchemeData, + SequenceData, StatusData, + TaskICOMData, + WorkPlansData, + WorkScheduleData, ) -from typing import Any, Optional, TYPE_CHECKING if TYPE_CHECKING: + from bonsai.bim.module.sequence.prop import ( + BIMTaskTreeProperties, + BIMTaskTypeColor, + BIMWorkScheduleProperties, + Task, + TaskProduct, + TaskResource, + ) from bonsai.bim.prop import Attribute - from bonsai.bim.module.sequence.prop import BIMWorkScheduleProperties, BIMTaskTreeProperties, Task class BIM_PT_status(Panel): @@ -794,23 +804,24 @@ def draw_item( self, context, layout: bpy.types.UILayout, - data: "BIMWorkScheduleProperties", - item: "Attribute", + data: BIMWorkScheduleProperties, + item: Attribute, icon, active_data, active_propname, ): - props = tool.Sequence.get_work_schedule_props() if item: row = layout.row(align=True) row.prop(item, "name", emboss=False, text="") - if props.sort_column == item.name: + if data.sort_column == item.name: row.label(text="", icon="SORTALPHA") row.operator("bim.remove_task_column", text="", icon="X").name = item.name class BIM_UL_task_inputs(UIList): - def draw_item(self, context, layout, data, item, icon, active_data, active_propname): + def draw_item( + self, context, layout: bpy.types.UILayout, data, item: TaskProduct, icon, active_data, active_propname + ) -> None: if item: row = layout.row(align=True) op = row.operator("bim.select_product", text="", icon="RESTRICT_SELECT_OFF") @@ -820,7 +831,9 @@ def draw_item(self, context, layout, data, item, icon, active_data, active_propn class BIM_UL_task_resources(UIList): - def draw_item(self, context, layout, data, item, icon, active_data, active_propname): + def draw_item( + self, context, layout: bpy.types.UILayout, data, item: TaskResource, icon, active_data, active_propname + ) -> None: if item: row = layout.row(align=True) row.operator("bim.go_to_resource", text="", icon="STYLUS_PRESSURE").resource = item.ifc_definition_id @@ -829,7 +842,9 @@ def draw_item(self, context, layout, data, item, icon, active_data, active_propn class BIM_UL_animation_colors(UIList): - def draw_item(self, context, layout, data, item, icon, active_data, active_propname): + def draw_item( + self, context, layout: bpy.types.UILayout, data, item: BIMTaskTypeColor, icon, active_data, active_propname + ) -> None: if item: row = layout.row() row.prop(item, "color", text="") @@ -837,7 +852,9 @@ def draw_item(self, context, layout, data, item, icon, active_data, active_propn class BIM_UL_task_outputs(UIList): - def draw_item(self, context, layout, data, item, icon, active_data, active_propname): + def draw_item( + self, context, layout: bpy.types.UILayout, data, item: TaskProduct, icon, active_data, active_propname + ) -> None: if item: row = layout.row(align=True) op = row.operator("bim.select_product", text="", icon="RESTRICT_SELECT_OFF") @@ -846,7 +863,9 @@ def draw_item(self, context, layout, data, item, icon, active_data, active_propn class BIM_UL_product_input_tasks(UIList): - def draw_item(self, context, layout, data, item, icon, active_data, active_propname): + def draw_item( + self, context, layout: bpy.types.UILayout, data, item: TaskProduct, icon, active_data, active_propname + ) -> None: if item: row = layout.row(align=True) op = row.operator("bim.go_to_task", text="", icon="STYLUS_PRESSURE") @@ -856,7 +875,9 @@ def draw_item(self, context, layout, data, item, icon, active_data, active_propn class BIM_UL_product_output_tasks(UIList): - def draw_item(self, context, layout, data, item, icon, active_data, active_propname): + def draw_item( + self, context, layout: bpy.types.UILayout, data, item: TaskProduct, icon, active_data, active_propname + ) -> None: if item: row = layout.row(align=True) op = row.operator("bim.go_to_task", text="", icon="STYLUS_PRESSURE") @@ -881,8 +902,8 @@ def draw_item( self, context, layout: bpy.types.UILayout, - data: "BIMTaskTreeProperties", - item: "Task", + data: BIMTaskTreeProperties, + item: Task, icon, active_data, active_propname, diff --git a/src/bonsai/bonsai/bim/module/spatial/__init__.py b/src/bonsai/bonsai/bim/module/spatial/__init__.py index 6c622185322..57cc84a8f13 100644 --- a/src/bonsai/bonsai/bim/module/spatial/__init__.py +++ b/src/bonsai/bonsai/bim/module/spatial/__init__.py @@ -17,7 +17,8 @@ # along with Bonsai. If not, see . import bpy -from . import ui, prop, operator, workspace + +from . import operator, prop, ui, workspace classes = ( operator.AssignContainer, diff --git a/src/bonsai/bonsai/bim/module/spatial/data.py b/src/bonsai/bonsai/bim/module/spatial/data.py index baed31f49d2..5885a9a76ed 100644 --- a/src/bonsai/bonsai/bim/module/spatial/data.py +++ b/src/bonsai/bonsai/bim/module/spatial/data.py @@ -16,10 +16,12 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . +from typing import Any + import bpy -import bonsai.tool as tool import ifcopenshell.util.element -from typing import Any + +import bonsai.tool as tool def refresh(): diff --git a/src/bonsai/bonsai/bim/module/spatial/decorator.py b/src/bonsai/bonsai/bim/module/spatial/decorator.py index 824fafec1fe..047a9ff5552 100644 --- a/src/bonsai/bonsai/bim/module/spatial/decorator.py +++ b/src/bonsai/bonsai/bim/module/spatial/decorator.py @@ -18,12 +18,12 @@ import blf import gpu -import bmesh -import bonsai.tool as tool from bpy.types import SpaceView3D -from mathutils import Vector -from gpu_extras.batch import batch_for_shader from bpy_extras.view3d_utils import location_3d_to_region_2d +from gpu_extras.batch import batch_for_shader +from mathutils import Vector + +import bonsai.tool as tool class GridDecorator: diff --git a/src/bonsai/bonsai/bim/module/spatial/operator.py b/src/bonsai/bonsai/bim/module/spatial/operator.py index e79cfc7d475..cd6bc6cab23 100644 --- a/src/bonsai/bonsai/bim/module/spatial/operator.py +++ b/src/bonsai/bonsai/bim/module/spatial/operator.py @@ -16,12 +16,14 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . +from typing import TYPE_CHECKING + import bpy import ifcopenshell.util.element -import bonsai.tool as tool -import bonsai.core.spatial as core + import bonsai.bim.handler -from typing import TYPE_CHECKING +import bonsai.core.spatial as core +import bonsai.tool as tool class ReferenceStructure(bpy.types.Operator, tool.Ifc.Operator): @@ -151,16 +153,10 @@ class AssignContainer(bpy.types.Operator, tool.Ifc.Operator): "Assign the selected objects to the container selected in Spatial Manager.\n\n" "All elements-parts of an aggregate will be skipped.\n" "To assign a container, they should be unassigned from an aggregate first.\n\n" - "This will also move objects to the container collection in the outliner.\n" - "ALT + Click to ensure objects are only linked in the container collection" + "This will also move objects to the container collection in the outliner." ) bl_options = {"REGISTER", "UNDO"} container: bpy.props.IntProperty(options={"SKIP_SAVE"}) - remove_from_other_containers: bpy.props.BoolProperty(default=False, options={"SKIP_SAVE"}) - - def invoke(self, context, event): - self.remove_from_other_containers = event.alt - return self.execute(context) def _execute(self, context): if self.container: @@ -175,31 +171,9 @@ def _execute(self, context): else: return - objs: list[bpy.types.Object] = [] - # In IFC element can be either contained of aggregated, - # tehrefore we skip aggregated elements here to prevent confusion. - # Can't handle it in `poll` since user might just select bunch of elements - # and try to assign a container to them - # and excluding aggregates because of the `poll` failing might get awkward. - skipped_aggregates = 0 - for obj in tool.Blender.get_selected_objects(): - if not (element := tool.Ifc.get_entity(obj)): - continue - if ifcopenshell.util.element.get_aggregate(element): - skipped_aggregates += 1 - continue - objs.append(obj) - - for element_obj in objs: - if self.remove_from_other_containers: - for col in element_obj.users_collection[:]: - col.objects.unlink(element_obj) - core.assign_container(tool.Ifc, tool.Collector, tool.Spatial, container=container, element_obj=element_obj) - - aggregates_msg = "" - if skipped_aggregates: - aggregates_msg = f" {skipped_aggregates} aggregated elements skipped." - self.report({"INFO"}, f"{len(objs)} elements assigned.{aggregates_msg}") + core.assign_container( + tool.Ifc, tool.Collector, tool.Spatial, container=container, objs=tool.Blender.get_selected_objects() + ) class EnableEditingContainer(bpy.types.Operator): @@ -246,7 +220,7 @@ class CopyToContainer(bpy.types.Operator, tool.Ifc.Operator): bl_label = "Copy to Container" bl_options = {"REGISTER", "UNDO"} - container: bpy.props.IntProperty() # pyright: ignore[reportRedeclaration] + container: bpy.props.IntProperty() if TYPE_CHECKING: container: int @@ -538,7 +512,7 @@ def execute(self, context): containers -= set(tool.Ifc.get().by_type("IfcSpatialZone")) for container in containers: if obj := tool.Ifc.get_object(container): - if collection := obj.BIMObjectProperties.collection: + if collection := tool.Blender.get_object_bim_props(obj).collection: collection.hide_viewport = True should_hide = False else: @@ -549,7 +523,7 @@ def execute(self, context): while queue: container = queue.pop() if obj := tool.Ifc.get_object(container): - if collection := obj.BIMObjectProperties.collection: + if collection := tool.Blender.get_object_bim_props(obj).collection: collection.hide_viewport = should_hide if self.should_include_children: queue.extend(ifcopenshell.util.element.get_parts(container)) diff --git a/src/bonsai/bonsai/bim/module/spatial/prop.py b/src/bonsai/bonsai/bim/module/spatial/prop.py index b7ae727a262..b0d393b2658 100644 --- a/src/bonsai/bonsai/bim/module/spatial/prop.py +++ b/src/bonsai/bonsai/bim/module/spatial/prop.py @@ -16,28 +16,25 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . +from typing import TYPE_CHECKING, Literal, Union + import bpy -from bonsai.bim.prop import ObjProperty -from bonsai.bim.module.spatial.data import SpatialDecompositionData -from bpy.types import PropertyGroup +import ifcopenshell.api.attribute from bpy.props import ( - PointerProperty, - StringProperty, - EnumProperty, BoolProperty, - IntProperty, - FloatProperty, - FloatVectorProperty, CollectionProperty, + EnumProperty, + IntProperty, + PointerProperty, + StringProperty, ) -import bonsai.tool as tool +from bpy.types import PropertyGroup + import bonsai.bim.handler import bonsai.core.geometry -import ifcopenshell -import ifcopenshell.api.attribute -import ifcopenshell.util.unit -from bonsai.tool.unit import parse_distance_string -from typing import TYPE_CHECKING, Union, Literal +import bonsai.tool as tool +from bonsai.bim.module.spatial.data import SpatialDecompositionData +from bonsai.bim.prop import ObjProperty def get_subelement_class( @@ -50,7 +47,7 @@ def get_subelement_class( def update_elevation(self: "BIMContainer", context: bpy.types.Context) -> None: # Try to parse the input string with unit support first - is_valid, parsed_elevation = parse_distance_string(self.elevation, use_project_unit=True) + is_valid, parsed_elevation = tool.Unit.parse_distance_string(self.elevation, use_project_unit=True) if is_valid: elevation = parsed_elevation @@ -98,6 +95,7 @@ def update_name(self: "BIMContainer", context: bpy.types.Context) -> None: tool.Spatial.edit_container_name(element, self.name) if obj := tool.Ifc.get_object(element): tool.Root.set_object_name(obj, element) + tool.Collector.assign(obj) bonsai.bim.handler.refresh_ui_data() @@ -172,8 +170,8 @@ def poll_container_obj(self: "BIMObjectSpatialProperties", container_obj: bpy.ty obj = self.id_data if ( (container := tool.Ifc.get_entity(container_obj)) - and (tool.Ifc.get_entity(obj)) - and tool.Spatial.can_contain(container, obj) + and (element := tool.Ifc.get_entity(obj)) + and tool.Spatial.can_contain(container, element) ): return True return False diff --git a/src/bonsai/bonsai/bim/module/spatial/ui.py b/src/bonsai/bonsai/bim/module/spatial/ui.py index acc604f992d..3a4a771e018 100644 --- a/src/bonsai/bonsai/bim/module/spatial/ui.py +++ b/src/bonsai/bonsai/bim/module/spatial/ui.py @@ -17,14 +17,21 @@ # along with Bonsai. If not, see . from __future__ import annotations + +from typing import TYPE_CHECKING, Any, cast + import bpy from bpy.types import Panel, UIList -from bonsai.bim.module.spatial.data import SpatialData, SpatialDecompositionData + import bonsai.tool as tool -from typing import TYPE_CHECKING, cast, Any +from bonsai.bim.module.spatial.data import SpatialData, SpatialDecompositionData if TYPE_CHECKING: - from bonsai.bim.module.spatial.prop import BIMSpatialDecompositionProperties, BIMContainer, Element + from bonsai.bim.module.spatial.prop import ( + BIMContainer, + BIMSpatialDecompositionProperties, + Element, + ) class BIM_PT_spatial(Panel): @@ -244,7 +251,7 @@ class BIM_PT_grids(Panel): bl_options = {"HEADER_LAYOUT_EXPAND"} def draw(self, context): - self.layout.row().operator("mesh.add_grid", icon="ADD", text="Add Grids") + self.layout.row().operator("bim.add_grid", icon="ADD", text="Add Grids") def draw_header(self, context): props = tool.Spatial.get_grid_props() @@ -350,7 +357,7 @@ def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.use_filter_show = True - def draw_toggle(self, row: bpy.types.UILayout, is_expanded: bool, index: int): + def draw_toggle(self, row: bpy.types.UILayout, is_expanded: bool, index: int) -> None: icon_id = "DISCLOSURE_TRI_DOWN" if is_expanded else "DISCLOSURE_TRI_RIGHT" row.operator("bim.toggle_container_element", text="", emboss=False, icon=icon_id).element_index = index diff --git a/src/bonsai/bonsai/bim/module/spatial/workspace.py b/src/bonsai/bonsai/bim/module/spatial/workspace.py index aa57b036316..6f340998610 100644 --- a/src/bonsai/bonsai/bim/module/spatial/workspace.py +++ b/src/bonsai/bonsai/bim/module/spatial/workspace.py @@ -18,12 +18,14 @@ import os +from functools import partial + import bpy -import bonsai.tool as tool -from bonsai.bim.module.model.data import AuthoringData from bpy.types import WorkSpaceTool + import bonsai.core.spatial -from functools import partial +import bonsai.tool as tool +from bonsai.bim.module.model.data import AuthoringData class SpatialTool(WorkSpaceTool): diff --git a/src/bonsai/bonsai/bim/module/structural/__init__.py b/src/bonsai/bonsai/bim/module/structural/__init__.py index db72ad497c0..3fa0cb9497b 100644 --- a/src/bonsai/bonsai/bim/module/structural/__init__.py +++ b/src/bonsai/bonsai/bim/module/structural/__init__.py @@ -17,7 +17,8 @@ # along with Bonsai. If not, see . import bpy -from . import ui, prop, operator, workspace + +from . import operator, prop, ui, workspace classes = ( operator.ShowLoads, diff --git a/src/bonsai/bonsai/bim/module/structural/data.py b/src/bonsai/bonsai/bim/module/structural/data.py index f3215ddff3e..1cdfcc22970 100644 --- a/src/bonsai/bonsai/bim/module/structural/data.py +++ b/src/bonsai/bonsai/bim/module/structural/data.py @@ -17,9 +17,10 @@ # along with Bonsai. If not, see . import bpy -import bonsai.tool as tool import ifcopenshell.util.doc +import bonsai.tool as tool + def refresh(): StructuralBoundaryConditionsData.is_loaded = False diff --git a/src/bonsai/bonsai/bim/module/structural/decorator.py b/src/bonsai/bonsai/bim/module/structural/decorator.py index 2bcc90c647e..32925be61cc 100644 --- a/src/bonsai/bonsai/bim/module/structural/decorator.py +++ b/src/bonsai/bonsai/bim/module/structural/decorator.py @@ -16,16 +16,18 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . -from mathutils import Vector -import numpy as np +from collections.abc import Iterable +from typing import Union + +import blf import bpy import gpu -import blf -import bonsai.tool as tool +import numpy as np from bpy.types import SpaceView3D from gpu_extras.batch import batch_for_shader -from typing import Union -from collections.abc import Iterable +from mathutils import Vector + +import bonsai.tool as tool from bonsai.bim.module.structural.load_decoration_data import ShaderInfo diff --git a/src/bonsai/bonsai/bim/module/structural/load_decoration_data.py b/src/bonsai/bonsai/bim/module/structural/load_decoration_data.py index 7df67e82d4a..dc05fab89c5 100644 --- a/src/bonsai/bonsai/bim/module/structural/load_decoration_data.py +++ b/src/bonsai/bonsai/bim/module/structural/load_decoration_data.py @@ -16,20 +16,23 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . -import bpy -import bmesh -import numpy as np +from collections.abc import Iterable from math import sin -from mathutils import Vector +from typing import Literal, TypedDict + +import bmesh +import bpy import ifcopenshell import ifcopenshell.util.placement import ifcopenshell.util.representation import ifcopenshell.util.unit import ifcopenshell.util.unit as ifcunit +import numpy as np +import numpy.typing as npt +from mathutils import Vector + import bonsai.tool as tool from bonsai.bim.module.structural.shader import DecorationShader -from typing import Literal, TypedDict -from collections.abc import Iterable class MemberInfo(TypedDict): @@ -476,7 +479,7 @@ def get_point_shader_args(self, loads: Iterable, location: np.ndarray, rotation: """get the args to the point shader""" location = np.array(location) indices = [] - direction_dict = { + direction_dict: dict[str, tuple[npt.NDArray, ...]] = { "fx": (np.array((1, 0, 0)), np.array((0, 1, 0)), np.array((0, 0, 1))), "fy": (np.array((0, 1, 0)), np.array((1, 0, 0)), np.array((0, 0, 1))), "fz": (np.array((0, 0, 1)), np.array((0, 1, 0)), np.array((1, 0, 0))), diff --git a/src/bonsai/bonsai/bim/module/structural/operator.py b/src/bonsai/bonsai/bim/module/structural/operator.py index 9840f87c1ea..825f52e9540 100644 --- a/src/bonsai/bonsai/bim/module/structural/operator.py +++ b/src/bonsai/bonsai/bim/module/structural/operator.py @@ -16,20 +16,19 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . +from math import degrees +from typing import TYPE_CHECKING, Literal + import bpy -import json -import ifcopenshell -import ifcopenshell.api import ifcopenshell.api.aggregate import ifcopenshell.api.group import ifcopenshell.api.structural +from mathutils import Matrix, Vector + import bonsai.bim.helper import bonsai.core.structural as core import bonsai.tool as tool -from math import degrees -from mathutils import Vector, Matrix from bonsai.bim.module.structural.decorator import LoadsDecorator -from typing import Literal, Any, TYPE_CHECKING class ShowLoads(bpy.types.Operator): @@ -43,14 +42,10 @@ def modal(self, context, event): assert context.screen if event.type == "F5": LoadsDecorator.update() - for area in context.screen.areas: - if area.type == "VIEW_3D": - area.tag_redraw() + tool.Blender.update_all_viewports(context) if event.type == "ESC": LoadsDecorator.uninstall() - for area in context.screen.areas: - if area.type == "VIEW_3D": - area.tag_redraw() + tool.Blender.update_all_viewports(context) return {"FINISHED"} return {"PASS_THROUGH"} @@ -70,9 +65,7 @@ def invoke(self, context, event): raise exc context.window.cursor_modal_restore() context.window_manager.modal_handler_add(self) - for area in context.screen.areas: - if area.type == "VIEW_3D": - area.tag_redraw() + tool.Blender.update_all_viewports(context) return {"RUNNING_MODAL"} @@ -174,7 +167,7 @@ class EnableEditingStructuralBoundaryCondition(bpy.types.Operator): bl_idname = "bim.enable_editing_structural_boundary_condition" bl_label = "Enable Editing Structural Boundary Condition" bl_options = {"REGISTER", "UNDO"} - boundary_condition: bpy.props.IntProperty() # pyright: ignore[reportRedeclaration] + boundary_condition: bpy.props.IntProperty() if TYPE_CHECKING: boundary_condition: int @@ -193,7 +186,7 @@ class EditStructuralBoundaryCondition(bpy.types.Operator, tool.Ifc.Operator): bl_idname = "bim.edit_structural_boundary_condition" bl_label = "Edit Structural Boundary Condition" bl_options = {"REGISTER", "UNDO"} - connection: bpy.props.IntProperty() # pyright: ignore[reportRedeclaration] + connection: bpy.props.IntProperty() if TYPE_CHECKING: connection: int @@ -924,7 +917,7 @@ class EnableEditingBoundaryCondition(bpy.types.Operator): bl_idname = "bim.enable_editing_boundary_condition" bl_label = "Enable Editing Boundary Condition" bl_options = {"REGISTER", "UNDO"} - boundary_condition: bpy.props.IntProperty() # pyright: ignore[reportRedeclaration] + boundary_condition: bpy.props.IntProperty() if TYPE_CHECKING: boundary_condition: int diff --git a/src/bonsai/bonsai/bim/module/structural/prop.py b/src/bonsai/bonsai/bim/module/structural/prop.py index c0db44fac64..e1e658ce7a0 100644 --- a/src/bonsai/bonsai/bim/module/structural/prop.py +++ b/src/bonsai/bonsai/bim/module/structural/prop.py @@ -17,27 +17,27 @@ # along with Bonsai. If not, see . from math import radians +from typing import TYPE_CHECKING, Union + import bpy -import bonsai.tool as tool -from bonsai.bim.prop import StrProperty, Attribute -from bonsai.bim.module.structural.data import ( - StructuralLoadCasesData, - StructuralLoadsData, - BoundaryConditionsData, - LoadGroupDecorationData, -) -from bpy.types import PropertyGroup from bpy.props import ( - PointerProperty, - StringProperty, - EnumProperty, BoolProperty, - IntProperty, - FloatProperty, - FloatVectorProperty, CollectionProperty, + EnumProperty, + FloatProperty, + IntProperty, + PointerProperty, + StringProperty, ) -from typing import TYPE_CHECKING, Union +from bpy.types import PropertyGroup + +from bonsai.bim.module.structural.data import ( + BoundaryConditionsData, + LoadGroupDecorationData, + StructuralLoadCasesData, + StructuralLoadsData, +) +from bonsai.bim.prop import Attribute def get_load_groups_to_show(self: "BIMStructuralProperties", context: bpy.types.Context) -> list[tuple[str, str, str]]: diff --git a/src/bonsai/bonsai/bim/module/structural/shader.py b/src/bonsai/bonsai/bim/module/structural/shader.py index 389ed348391..b9b5a5c7bc6 100644 --- a/src/bonsai/bonsai/bim/module/structural/shader.py +++ b/src/bonsai/bonsai/bim/module/structural/shader.py @@ -16,9 +16,10 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . -import gpu from typing import Literal +import gpu + class DecorationShader: "shader for the load decorations" @@ -57,15 +58,13 @@ def new( "PLANAR LOAD", } if pattern not in valid_patterns: - raise ValueError( - """pattern must be one of: + raise ValueError("""pattern must be one of: PERPENDICULAR DISTRIBUTED FORCE PARALLEL DISTRIBUTED FORCE, DISTRIBUTED MOMENT, SINGLE FORCE, SINGLE MOMENT, - PLANAR LOAD""" - ) + PLANAR LOAD""") if "DISTRIBUTED" in pattern.upper(): shader = self.get_linear_shader(pattern) return shader diff --git a/src/bonsai/bonsai/bim/module/structural/ui.py b/src/bonsai/bonsai/bim/module/structural/ui.py index 44b56633a19..6d93bd3ffdb 100644 --- a/src/bonsai/bonsai/bim/module/structural/ui.py +++ b/src/bonsai/bonsai/bim/module/structural/ui.py @@ -17,31 +17,34 @@ # along with Bonsai. If not, see . from __future__ import annotations + +from typing import TYPE_CHECKING, Any, Union + import bpy -import bonsai.tool as tool -import bonsai.bim.helper from bpy.types import Panel, UIList + +import bonsai.bim.helper +import bonsai.tool as tool from bonsai.bim.helper import draw_attributes, prop_with_search from bonsai.bim.module.structural.data import ( - StructuralBoundaryConditionsData, + BoundaryConditionsData, ConnectedStructuralMembersData, - StructuralMemberData, StructuralAnalysisModelsData, + StructuralBoundaryConditionsData, + StructuralConnectionData, StructuralLoadCasesData, StructuralLoadsData, - StructuralConnectionData, - BoundaryConditionsData, + StructuralMemberData, ) -from typing import TYPE_CHECKING, Any, Union if TYPE_CHECKING: from bonsai.bim.module.structural.prop import ( - BIMStructuralProperties, BIMObjectStructuralProperties, + BIMStructuralProperties, BoundaryCondition, - StructuralLoad, StructuralActivity, StructuralAnalysisModel, + StructuralLoad, ) diff --git a/src/bonsai/bonsai/bim/module/structural/workspace.py b/src/bonsai/bonsai/bim/module/structural/workspace.py index fbacac3e1a0..407f0178345 100644 --- a/src/bonsai/bonsai/bim/module/structural/workspace.py +++ b/src/bonsai/bonsai/bim/module/structural/workspace.py @@ -18,10 +18,12 @@ import os +from functools import partial + import bpy -import bonsai.tool as tool from bpy.types import WorkSpaceTool -from functools import partial + +import bonsai.tool as tool class StructuralTool(WorkSpaceTool): diff --git a/src/bonsai/bonsai/bim/module/style/__init__.py b/src/bonsai/bonsai/bim/module/style/__init__.py index ba44a727b18..6f13fd6f2d6 100644 --- a/src/bonsai/bonsai/bim/module/style/__init__.py +++ b/src/bonsai/bonsai/bim/module/style/__init__.py @@ -17,7 +17,8 @@ # along with Bonsai. If not, see . import bpy -from . import ui, prop, operator + +from . import operator, prop, ui classes = ( operator.ActivateExternalStyle, diff --git a/src/bonsai/bonsai/bim/module/style/data.py b/src/bonsai/bonsai/bim/module/style/data.py index 83e453d7a56..dabf6f3ba7d 100644 --- a/src/bonsai/bonsai/bim/module/style/data.py +++ b/src/bonsai/bonsai/bim/module/style/data.py @@ -16,12 +16,14 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . +from typing import Union + import bpy import ifcopenshell import ifcopenshell.util.schema -import bonsai.tool as tool from ifcopenshell.util.doc import get_entity_doc -from typing import Union + +import bonsai.tool as tool def refresh(): diff --git a/src/bonsai/bonsai/bim/module/style/operator.py b/src/bonsai/bonsai/bim/module/style/operator.py index 4a036652f2f..e7d1d05e0ab 100644 --- a/src/bonsai/bonsai/bim/module/style/operator.py +++ b/src/bonsai/bonsai/bim/module/style/operator.py @@ -17,19 +17,21 @@ # along with Bonsai. If not, see . import os +from pathlib import Path +from typing import Any, Union + import bpy -import bonsai.bim.helper -import bonsai.tool as tool -import bonsai.core.style as core import ifcopenshell.api import ifcopenshell.api.style import ifcopenshell.util.representation import ifcopenshell.util.unit -from bonsai.bim.module.style.prop import ColourRgb from bpy_extras.io_utils import ImportHelper -from pathlib import Path from mathutils import Vector -from typing import Any, Union + +import bonsai.bim.helper +import bonsai.core.style as core +import bonsai.tool as tool +from bonsai.bim.module.style.prop import ColourRgb # TODO: is this still relevant or can it be deleted? @@ -85,6 +87,7 @@ def _execute(self, context): core.remove_style(tool.Ifc, tool.Style, style=tool.Ifc.get().by_id(self.style), reload_styles_ui=True) +# TODO: remove completely class AddStyle(bpy.types.Operator, tool.Ifc.Operator): bl_idname = "bim.add_style" bl_label = "Add Style" diff --git a/src/bonsai/bonsai/bim/module/style/prop.py b/src/bonsai/bonsai/bim/module/style/prop.py index 42866486c2d..a4cfb2cb9ea 100644 --- a/src/bonsai/bonsai/bim/module/style/prop.py +++ b/src/bonsai/bonsai/bim/module/style/prop.py @@ -16,25 +16,24 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . +import gettext +from typing import TYPE_CHECKING, Literal, Union, get_args + import bpy -import bonsai.tool as tool -from bonsai.bim.prop import StrProperty, Attribute -from bonsai.bim.module.style.data import StylesData -from bpy.types import PropertyGroup from bpy.props import ( - PointerProperty, - StringProperty, - EnumProperty, BoolProperty, - IntProperty, - FloatProperty, - FloatVectorProperty, CollectionProperty, + EnumProperty, + FloatVectorProperty, + IntProperty, + PointerProperty, + StringProperty, ) +from bpy.types import PropertyGroup -import gettext -from typing import Literal, Union, TYPE_CHECKING, get_args - +import bonsai.tool as tool +from bonsai.bim.module.style.data import StylesData +from bonsai.bim.prop import Attribute, StrProperty _ = gettext.gettext @@ -103,7 +102,10 @@ def update_shading_styles(self: "BIMStylesProperties", context: bpy.types.Contex def update_shader_graph(self: Union["Texture", "BIMStylesProperties"], context: bpy.types.Context) -> None: - props = self.id_data.BIMStylesProperties if isinstance(self, Texture) else self + if isinstance(self, Texture): + props = tool.Style.get_style_props() + else: + props = self if not props.update_graph: return @@ -116,6 +118,19 @@ def update_shader_graph(self: Union["Texture", "BIMStylesProperties"], context: tool.Loader.create_surface_style_with_textures(material, shading_data, textures_data) +def _make_clear_null_updater(null_prop: str): + def _update(self: "BIMStylesProperties", context: bpy.types.Context) -> None: + self[null_prop] = False + update_shader_graph(self, context) + + return _update + + +update_diffuse_colour = _make_clear_null_updater("is_diffuse_colour_null") +update_specular_colour = _make_clear_null_updater("is_specular_colour_null") +update_specular_highlight_value = _make_clear_null_updater("is_specular_highlight_null") + + UV_MODES = [ ("UV", "UV", _("Actual UV data presented on the geometry")), ("Generated", "Generated", _("Automatically-generated UV from the vertex positions of the mesh")), @@ -219,24 +234,29 @@ class BIMStylesProperties(PropertyGroup): transparency: bpy.props.FloatProperty( name="Transparency", default=0.0, min=0.0, max=1.0, update=update_shader_graph ) - # TODO: do something on null? - is_diffuse_colour_null: BoolProperty(name="Is Null") + is_diffuse_colour_null: BoolProperty(name="Is Null", update=update_shader_graph) diffuse_colour_class: EnumProperty( items=[(x, x, "") for x in get_args(ColourClass)], name="Diffuse Colour Class", - update=update_shader_graph, + update=update_diffuse_colour, ) diffuse_colour: bpy.props.FloatVectorProperty( - name="Diffuse Colour", subtype="COLOR", default=(1, 1, 1), min=0.0, max=1.0, size=3, update=update_shader_graph + name="Diffuse Colour", + subtype="COLOR", + default=(1, 1, 1), + min=0.0, + max=1.0, + size=3, + update=update_diffuse_colour, ) diffuse_colour_ratio: bpy.props.FloatProperty( - name="Diffuse Ratio", default=0.0, min=0.0, max=1.0, update=update_shader_graph + name="Diffuse Ratio", default=0.0, min=0.0, max=1.0, update=update_diffuse_colour ) - is_specular_colour_null: BoolProperty(name="Is Null") + is_specular_colour_null: BoolProperty(name="Is Null", update=update_shader_graph) specular_colour_class: EnumProperty( items=[(x, x, "") for x in get_args(ColourClass)], name="Specular Colour Class", - update=update_shader_graph, + update=update_specular_colour, default="IfcNormalisedRatioMeasure", ) specular_colour: bpy.props.FloatVectorProperty( @@ -246,7 +266,7 @@ class BIMStylesProperties(PropertyGroup): min=0.0, max=1.0, size=3, - update=update_shader_graph, + update=update_specular_colour, ) specular_colour_ratio: bpy.props.FloatProperty( name="Specular Ratio", @@ -254,16 +274,16 @@ class BIMStylesProperties(PropertyGroup): default=0.0, min=0.0, max=1.0, - update=update_shader_graph, + update=update_specular_colour, ) - is_specular_highlight_null: BoolProperty(name="Is Null") + is_specular_highlight_null: BoolProperty(name="Is Null", update=update_shader_graph) specular_highlight: bpy.props.FloatProperty( name="Specular Highlight", description="Used as Roughness value in PHYSICAL Reflectance Method", default=0.0, min=0.0, max=1.0, - update=update_shader_graph, + update=update_specular_highlight_value, ) reflectance_method: EnumProperty( name="Reflectance Method", diff --git a/src/bonsai/bonsai/bim/module/style/ui.py b/src/bonsai/bonsai/bim/module/style/ui.py index 37c46b6d630..54ca4f5aa48 100644 --- a/src/bonsai/bonsai/bim/module/style/ui.py +++ b/src/bonsai/bonsai/bim/module/style/ui.py @@ -17,12 +17,15 @@ # along with Bonsai. If not, see . from __future__ import annotations + +from typing import TYPE_CHECKING + import bpy +from bpy.types import Panel, UIList + import bonsai.bim.helper import bonsai.tool as tool -from bpy.types import Panel, UIList -from bonsai.bim.module.style.data import StylesData, BlenderMaterialStyleData -from typing import TYPE_CHECKING +from bonsai.bim.module.style.data import BlenderMaterialStyleData, StylesData if TYPE_CHECKING: from bonsai.bim.module.style.prop import BIMStylesProperties, Style diff --git a/src/bonsai/bonsai/bim/module/system/__init__.py b/src/bonsai/bonsai/bim/module/system/__init__.py index 92782ae6fe3..36901100f62 100644 --- a/src/bonsai/bonsai/bim/module/system/__init__.py +++ b/src/bonsai/bonsai/bim/module/system/__init__.py @@ -17,15 +17,18 @@ # along with Bonsai. If not, see . import bpy -from . import ui, prop, operator, decorator + +from . import decorator, operator, prop, ui classes = ( operator.AddPort, + operator.AddRelatedPortConnection, operator.AddSystem, operator.AddZone, operator.AssignSystem, operator.AssignUnassignFlowControl, operator.ConnectPort, + operator.CycleFlowDirection, operator.DisableEditingSystem, operator.DisableEditingZone, operator.DisableSystemEditingUI, @@ -34,6 +37,7 @@ operator.EditZone, operator.EnableEditingSystem, operator.EnableEditingZone, + operator.EstablishPathDirection, operator.HidePorts, operator.LoadSystems, operator.LoadZones, diff --git a/src/bonsai/bonsai/bim/module/system/data.py b/src/bonsai/bonsai/bim/module/system/data.py index 5db3d60114a..65faca50d50 100644 --- a/src/bonsai/bonsai/bim/module/system/data.py +++ b/src/bonsai/bonsai/bim/module/system/data.py @@ -16,14 +16,15 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . +from typing import Any, Union + import bpy -import ifcopenshell import ifcopenshell.util.schema import ifcopenshell.util.system import ifcopenshell.util.unit from ifcopenshell.util.doc import get_entity_doc + import bonsai.tool as tool -from typing import Any, Union def refresh(): diff --git a/src/bonsai/bonsai/bim/module/system/decorator.py b/src/bonsai/bonsai/bim/module/system/decorator.py index c77b2f68798..13ac7519f12 100644 --- a/src/bonsai/bonsai/bim/module/system/decorator.py +++ b/src/bonsai/bonsai/bim/module/system/decorator.py @@ -16,18 +16,15 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . + +import bmesh import bpy import gpu -import bmesh -import bonsai.tool as tool -from math import sin, cos, radians +from bpy.app.handlers import persistent from bpy.types import SpaceView3D -from mathutils import Vector, Matrix from gpu_extras.batch import batch_for_shader -import ifcopenshell -from bonsai.bim.module.system.data import SystemDecorationData -from bpy.app.handlers import persistent +import bonsai.tool as tool ERROR_ELEMENTS_COLOR = (1, 0.2, 0.322, 1) # RED UNSPECIAL_ELEMENT_COLOR = (0.2, 0.2, 0.2, 1) # GREY diff --git a/src/bonsai/bonsai/bim/module/system/operator.py b/src/bonsai/bonsai/bim/module/system/operator.py index add214c09d6..5fe47564c0d 100644 --- a/src/bonsai/bonsai/bim/module/system/operator.py +++ b/src/bonsai/bonsai/bim/module/system/operator.py @@ -16,15 +16,17 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . +from typing import TYPE_CHECKING + import bpy -import ifcopenshell.api +import ifcopenshell.api.attribute import ifcopenshell.api.system import ifcopenshell.util.system -import bonsai.tool as tool -import bonsai.core.system as core + import bonsai.bim.helper +import bonsai.core.system as core +import bonsai.tool as tool from bonsai.bim.module.system.data import PortData, SystemData -from typing import TYPE_CHECKING class LoadSystems(bpy.types.Operator): @@ -52,7 +54,7 @@ class AddSystem(bpy.types.Operator, tool.Ifc.Operator): bl_label = "Add System" bl_options = {"REGISTER", "UNDO"} - parent_system_id: bpy.props.IntProperty() # pyright: ignore[reportRedeclaration] + parent_system_id: bpy.props.IntProperty() if TYPE_CHECKING: parent_system_id: int @@ -198,7 +200,16 @@ def poll(cls, context): def _execute(self, context): # Ifc.Operator - as operator will sync object's position with IFC. - core.show_ports(tool.Ifc, tool.System, tool.Spatial, element=tool.Ifc.get_entity(context.active_object)) + element = tool.Ifc.get_entity(context.active_object) + core.show_ports(tool.Ifc, tool.System, tool.Spatial, element=element) + + for port in tool.System.get_ports(element): + connected_port = tool.System.get_connected_port(port) + if connected_port: + connected_port_obj = tool.Ifc.get_object(connected_port) + if not connected_port_obj: + parent_element = tool.System.get_port_relating_element(connected_port) + core.show_ports(tool.Ifc, tool.System, tool.Spatial, element=parent_element) class HidePorts(bpy.types.Operator, tool.Ifc.Operator): @@ -217,7 +228,7 @@ def _execute(self, context): class AddPort(bpy.types.Operator, tool.Ifc.Operator): bl_idname = "bim.add_port" - bl_description = "Add port at current cursor position" + bl_description = "Add USERDEFINED port at current cursor position" bl_label = "Add Port" bl_options = {"REGISTER", "UNDO"} @@ -246,7 +257,41 @@ def poll(cls, context): def _execute(self, context): obj1 = context.active_object obj2 = context.selected_objects[0] if context.selected_objects[1] == obj1 else context.selected_objects[1] - core.connect_port(tool.Ifc, port1=tool.Ifc.get_entity(obj1), port2=tool.Ifc.get_entity(obj2)) + direction = tool.Ifc.get_entity(obj1).FlowDirection or "NOTDEFINED" + core.connect_port( + tool.Ifc, port1=tool.Ifc.get_entity(obj1), port2=tool.Ifc.get_entity(obj2), direction=direction + ) + + +class AddRelatedPortConnection(bpy.types.Operator, tool.Ifc.Operator): + bl_idname = "bim.add_related_port_connection" + bl_label = "Connect Port" + bl_options = {"REGISTER", "UNDO"} + + relating_port_id: bpy.props.IntProperty() + + def invoke(self, context, event): + return context.window_manager.invoke_props_dialog(self) + + def draw(self, context): + props = tool.System.get_system_props() + self.layout.prop(props, "related_port", text="Select Port") + + def _execute(self, context): + props = tool.System.get_system_props() + + if not props.related_port or props.related_port == "NONE": + return {"CANCELLED"} + + port_obj = bpy.data.objects.get(props.related_port) + related_port = tool.Ifc.get_entity(port_obj) + relating_port = tool.Ifc.get().by_id(self.relating_port_id) + + direction = relating_port.FlowDirection or "NOTDEFINED" + core.connect_port(tool.Ifc, port1=relating_port, port2=related_port, direction=direction) + PortData.is_loaded = False + + return {"FINISHED"} class DisconnectPort(bpy.types.Operator, tool.Ifc.Operator): @@ -256,6 +301,9 @@ class DisconnectPort(bpy.types.Operator, tool.Ifc.Operator): element_id: bpy.props.IntProperty(default=0, options={"SKIP_SAVE"}) + def invoke(self, context, event): + return context.window_manager.invoke_confirm(self, event) + def _execute(self, context): if self.element_id != 0: element = tool.Ifc.get().by_id(self.element_id) @@ -269,17 +317,19 @@ class MEPConnectElements(bpy.types.Operator, tool.Ifc.Operator): bl_label = "Connect MEP Elements" bl_description = "Connects two selected elements by their closest located ports and adjusts them" bl_options = {"REGISTER", "UNDO"} - - @classmethod - def poll(cls, context): - if not len(context.selected_objects) == 2: - cls.poll_message_set("Need to select 2 objects.") - return False - return True + obj1_name: bpy.props.StringProperty(name="Object 1") + obj2_name: bpy.props.StringProperty(name="Object 2") def _execute(self, context): - obj1 = context.active_object - obj2 = next(o for o in context.selected_objects if o != obj1) + if self.obj1_name and self.obj2_name: + obj1 = bpy.data.objects.get(self.obj1_name) + obj2 = bpy.data.objects.get(self.obj2_name) + else: + if not context.selected_objects or len(context.selected_objects) != 2: + self.report({"ERROR"}, "Need to select 2 objects.") + return {"CANCELLED"} + obj1 = context.active_object + obj2 = next(o for o in context.selected_objects if o != obj1) tool.Model.sync_object_ifc_position(obj1) tool.Model.sync_object_ifc_position(obj2) @@ -310,7 +360,8 @@ def _execute(self, context): ports_distance[(port1, port2)] = distance closest_ports = min(ports_distance, key=lambda x: ports_distance[x]) - core.connect_port(tool.Ifc, *closest_ports) + direction = closest_ports[0].FlowDirection or "NOTDEFINED" + core.connect_port(tool.Ifc, *closest_ports, direction=direction) bpy.ops.bim.regenerate_distribution_element() return {"FINISHED"} @@ -379,6 +430,105 @@ def _execute(self, context): return {"CANCELLED"} +class CycleFlowDirection(bpy.types.Operator, tool.Ifc.Operator): + bl_idname = "bim.cycle_flow_direction" + bl_label = "Cycle Flow Direction" + bl_options = {"REGISTER", "UNDO"} + port_id: bpy.props.IntProperty() + + @classmethod + def description(cls, context, operator): + port = tool.Ifc.get().by_id(operator.port_id) + if port and port.is_a("IfcDistributionPort"): + current_direction = port.FlowDirection or "NOTDEFINED" + return f"Current flow direction: {current_direction}. Click to cycle: SOURCE → SINK → SOURCEANDSINK → NOTDEFINED" + return "Cycle through flow directions: SOURCE → SINK → SOURCEANDSINK → NOTDEFINED → SOURCE..." + + def _execute(self, context): + ifc_file = tool.Ifc.get() + port = tool.Ifc.get().by_id(self.port_id) + if not port or not port.is_a("IfcDistributionPort"): + return {"CANCELLED"} + + current_direction = port.FlowDirection or "NOTDEFINED" + + flow_cycle_map = { + "SOURCE": "SINK", + "SINK": "SOURCEANDSINK", + "SOURCEANDSINK": "NOTDEFINED", + "NOTDEFINED": "SOURCE", + } + next_direction = flow_cycle_map.get(current_direction, "SOURCE") + + ifcopenshell.api.attribute.edit_attributes(ifc_file, product=port, attributes={"FlowDirection": next_direction}) + + connected_port = tool.System.get_connected_port(port) + if connected_port: + connected_direction_map = { + "SOURCE": "SINK", + "SINK": "SOURCE", + "SOURCEANDSINK": "SOURCEANDSINK", + "NOTDEFINED": "NOTDEFINED", + } + connected_direction = connected_direction_map.get(next_direction, "NOTDEFINED") + ifcopenshell.api.attribute.edit_attributes( + ifc_file, product=connected_port, attributes={"FlowDirection": connected_direction} + ) + + PortData.is_loaded = False + + return {"FINISHED"} + + +class EstablishPathDirection(bpy.types.Operator, tool.Ifc.Operator): + bl_idname = "bim.establish_path_direction" + bl_label = "Establish Path Direction" + bl_description = "Propagates flow direction through connected flow segments with two ports" + bl_options = {"REGISTER", "UNDO"} + port_id: bpy.props.IntProperty() + + def _execute(self, context): + connected_port = tool.Ifc.get().by_id(self.port_id) + + if not connected_port or not connected_port.is_a("IfcDistributionPort"): + self.report({"ERROR"}, "Invalid port specified.") + return {"CANCELLED"} + + direction_map = { + "SOURCE": "SINK", + "SINK": "SOURCE", + "SOURCEANDSINK": "SOURCEANDSINK", + "NOTDEFINED": "NOTDEFINED", + } + next_element = tool.System.get_port_relating_element(connected_port) + ports = tool.System.get_ports(next_element) + segments_processed = 0 + while len(ports) == 2: + if ports[0].id() == connected_port.id(): + other_port = ports[1] + else: + other_port = ports[0] + + new_direction = direction_map.get(connected_port.FlowDirection, "NOTDEFINED") + other_port.FlowDirection = new_direction + segments_processed += 1 + + connected_port = tool.System.get_connected_port(other_port) + if not connected_port: + break + connected_port.FlowDirection = direction_map.get(other_port.FlowDirection, "NOTDEFINED") + next_element = tool.System.get_port_relating_element(connected_port) + + if not next_element.is_a("IfcFlowSegment"): + print(f"DEBUG: next_element is not IfcFlowSegment, stopping") + break + + ports = tool.System.get_ports(next_element) + + self.report({"INFO"}, f"Established path direction through {segments_processed} flow segment(s).") + return {"FINISHED"} + + class LoadZones(bpy.types.Operator): bl_idname = "bim.load_zones" bl_label = "Load Zones" diff --git a/src/bonsai/bonsai/bim/module/system/prop.py b/src/bonsai/bonsai/bim/module/system/prop.py index a603446c9f4..a03b2a0cfba 100644 --- a/src/bonsai/bonsai/bim/module/system/prop.py +++ b/src/bonsai/bonsai/bim/module/system/prop.py @@ -16,24 +16,23 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . +from typing import TYPE_CHECKING, Union + import bpy -import bonsai.bim.handler -import bonsai.tool as tool -from bonsai.bim.module.system.data import SystemData -import bonsai.bim.module.system.decorator as decorator -from bonsai.bim.prop import StrProperty, Attribute -from bpy.types import PropertyGroup from bpy.props import ( - PointerProperty, - StringProperty, - EnumProperty, BoolProperty, - IntProperty, - FloatProperty, - FloatVectorProperty, CollectionProperty, + EnumProperty, + IntProperty, + StringProperty, ) -from typing import TYPE_CHECKING, Union +from bpy.types import PropertyGroup + +import bonsai.bim.handler +import bonsai.bim.module.system.decorator as decorator +import bonsai.tool as tool +from bonsai.bim.module.system.data import SystemData +from bonsai.bim.prop import Attribute def get_system_class(self: "BIMSystemProperties", context: bpy.types.Context) -> list[tuple[str, str, str]]: @@ -92,6 +91,28 @@ def toggle_decorations(self: "BIMSystemProperties", context: bpy.types.Context) decorator.SystemDecorator.uninstall() +def get_available_ports_for_connection( + self: "BIMSystemProperties", context: bpy.types.Context +) -> list[tuple[str, str, str]]: + items = [] + active_object_ports = set(tool.System.get_ports(tool.Ifc.get_entity(context.active_object))) + + ifc_file = tool.Ifc.get() + for ifc_port in ifc_file.by_type("IfcDistributionPort"): + port = tool.Ifc.get_object(ifc_port) + if not port: + continue + + if tool.System.get_connected_port(ifc_port) is not None or ifc_port in active_object_ports: + continue + + port_object = tool.Ifc.get_object(tool.System.get_port_relating_element(ifc_port)) + suggestion = f"{port_object.name} > {port.name}" + items.append((port.name, suggestion, "")) + + return items if items else [("NONE", "Ports are hidden or not available", "")] + + class BIMSystemProperties(PropertyGroup): system_attributes: CollectionProperty(name="System Attributes", type=Attribute) is_editing: BoolProperty(name="Is Editing", default=False) @@ -107,6 +128,11 @@ class BIMSystemProperties(PropertyGroup): should_draw_decorations: BoolProperty( name="Should Draw Decorations", description="Toggle system decorations", update=toggle_decorations ) + related_port: EnumProperty( + name="Connect To Port", + description="Select a port to connect to", + items=get_available_ports_for_connection, + ) if TYPE_CHECKING: system_attributes: bpy.types.bpy_prop_collection_idprop[Attribute] @@ -119,6 +145,7 @@ class BIMSystemProperties(PropertyGroup): edited_system_id: int system_class: str should_draw_decorations: bool + related_port: str @property def active_system_ui_item(self) -> Union[System, None]: diff --git a/src/bonsai/bonsai/bim/module/system/ui.py b/src/bonsai/bonsai/bim/module/system/ui.py index 2d555f24c20..e8f8b7daeb7 100644 --- a/src/bonsai/bonsai/bim/module/system/ui.py +++ b/src/bonsai/bonsai/bim/module/system/ui.py @@ -17,23 +17,37 @@ # along with Bonsai. If not, see . from __future__ import annotations + +from typing import TYPE_CHECKING + import bpy +from bpy.types import Panel, UIList + import bonsai.bim.helper import bonsai.tool as tool -from bonsai.bim.helper import prop_with_search, draw_attributes -from bpy.types import Panel, UIList -from bonsai.bim.module.system.data import SystemData, ZonesData, ActiveObjectZonesData, ObjectSystemData, PortData -from typing import TYPE_CHECKING +from bonsai.bim.helper import draw_attributes, prop_with_search +from bonsai.bim.module.system.data import ( + ActiveObjectZonesData, + ObjectSystemData, + PortData, + SystemData, + ZonesData, +) if TYPE_CHECKING: - from bonsai.bim.module.system.prop import BIMSystemProperties, System, BIMZoneProperties, Zone + from bonsai.bim.module.system.prop import ( + BIMSystemProperties, + BIMZoneProperties, + System, + Zone, + ) FLOW_DIRECTION_TO_ICON = { - "SOURCE": "FORWARD", - "SINK": "BACK", - "SOURCEANDSINK": "ARROW_LEFTRIGHT", - "NOTDEFINED": "CHECKBOX_DEHLT", + "SOURCE": "FULLSCREEN_ENTER", + "SINK": "FULLSCREEN_EXIT", + "SOURCEANDSINK": "CHECKBOX_DEHLT", + "NOTDEFINED": "QUESTION", } @@ -163,44 +177,87 @@ def draw(self, context): return row = self.layout.row(align=True) - row.label(text="Change Flow Direction:") - - current_flow_direction = PortData.data["selected_objects_flow_direction"] - for flow_direction in FLOW_DIRECTION_TO_ICON.keys(): - row.operator( - "bim.set_flow_direction", - icon=FLOW_DIRECTION_TO_ICON[flow_direction], - depress=flow_direction == current_flow_direction, - text="", - ).direction = flow_direction - row.enabled = len(context.selected_objects) == 2 + row.label(text=f"Ports located in: {context.active_object.name} and connected Port/Objects:") row = self.layout.row(align=True) - row.label(text="Ports located on object and connected objects:") - row = self.layout.row(align=True) - cols = [row.column(align=True) for i in range(6)] + cols = [row.column(align=True) for i in range(9)] + cols[3].scale_x = 1.0 + cols[6].scale_x = 1.0 + cols[8].scale_x = 1.33 for port_data in PortData.data["located_ports_data"]: flow_direction_icon = FLOW_DIRECTION_TO_ICON[port_data["FlowDirection"] or "NOTDEFINED"] + + if port_data["connected_obj_name"]: + cols[0].operator("bim.disconnect_port", text="", icon="UNLINKED").element_id = port_data["id"] + op = cols[1].operator("bim.cycle_flow_direction", text="", icon=flow_direction_icon, emboss=True) + op.port_id = port_data["id"] + else: + op = cols[0].operator("bim.add_related_port_connection", text="", icon="PLUGIN") + op.relating_port_id = port_data["id"] + op = cols[1].operator("bim.cycle_flow_direction", text="", icon=flow_direction_icon, emboss=True) + op.port_id = port_data["id"] + if port_data["port_obj_name"]: - cols[0].label(text="", icon=flow_direction_icon) - cols[1].operator("bim.select_entity", text="", icon="RESTRICT_SELECT_OFF").ifc_id = port_data["id"] - cols[2].label(text=port_data["port_obj_name"]) + cols[2].operator("bim.select_entity", text="", icon="RESTRICT_SELECT_OFF").ifc_id = port_data["id"] + cols[3].label(text=port_data["port_obj_name"]) else: - cols[0].label(text="", icon=flow_direction_icon) - cols[1].label(text="", icon="HIDE_ON") - cols[2].label(text="Port is hidden") + cols[2].label(text="", icon="HIDE_ON") + cols[3].label(text="Port is hidden") if port_data["connected_obj_name"]: connected_obj = bpy.data.objects[port_data["connected_obj_name"]] - cols[3].operator("bim.disconnect_port", text="", icon="UNLINKED").element_id = port_data["id"] + + port = tool.Ifc.get().by_id(port_data["id"]) + connected_port = tool.System.get_connected_port(port) + if connected_port: + connected_port_obj = tool.Ifc.get_object(connected_port) + if connected_port_obj: + connected_port_flow_dir = FLOW_DIRECTION_TO_ICON[connected_port.FlowDirection or "NOTDEFINED"] + op = cols[4].operator( + "bim.cycle_flow_direction", text="", icon=connected_port_flow_dir, emboss=True + ) + op.port_id = connected_port.id() + cols[5].operator("bim.select_entity", text="", icon="RESTRICT_SELECT_OFF").ifc_id = ( + connected_port.id() + ) + cols[6].label(text=connected_port_obj.name) + else: + blank4 = cols[4].column(align=True) + blank4.scale_x = 0.1 + blank4.label(text="", icon="BLANK1") + blank5 = cols[5].column(align=True) + blank5.scale_x = 0.1 + blank5.label(text="", icon="BLANK1") + cols[6].label(text="Port is hidden") + else: + blank4 = cols[4].column(align=True) + blank4.scale_x = 0.1 + blank4.label(text="", icon="BLANK1") + blank5 = cols[5].column(align=True) + blank5.scale_x = 0.1 + blank5.label(text="", icon="BLANK1") + cols[6].label(text="") + ifc_id = tool.Blender.get_ifc_definition_id(connected_obj) - cols[4].operator("bim.select_entity", text="", icon="RESTRICT_SELECT_OFF").ifc_id = ifc_id - cols[5].label(text=port_data["connected_obj_name"]) + cols[7].operator("bim.select_entity", text="", icon="RESTRICT_SELECT_OFF").ifc_id = ifc_id + cols[8].label(text=port_data["connected_obj_name"]) else: - cols[3].label(text="", icon="UNLINKED") - cols[4].label(text="", icon="BLANK1") - cols[5].label(text="Port is disconnected") + blank4 = cols[4].column(align=True) + blank4.scale_x = 0.1 + blank4.label(text="", icon="BLANK1") + blank5 = cols[5].column(align=True) + blank5.scale_x = 0.1 + blank5.label(text="", icon="BLANK1") + + cols[6].label(text="Port is disconnected") + + blank7 = cols[7].column(align=True) + blank7.scale_x = 0.1 + blank7.label(text="", icon="BLANK1") + blank8 = cols[8].column(align=True) + blank8.scale_x = 0.1 + blank8.label(text="", icon="BLANK1") class BIM_PT_port(Panel): @@ -223,14 +280,8 @@ def poll(cls, context): return True def draw(self, context): - self.props = tool.System.get_system_props() - layout = self.layout row = layout.row(align=True) - row.label(text="IfcDistributionPort") - row.operator("bim.connect_port", icon="PLUGIN", text="") - row.operator("bim.disconnect_port", icon="UNLINKED", text="") - row.operator("bim.remove_port", icon="X", text="") if not PortData.is_loaded: PortData.load() @@ -238,42 +289,60 @@ def draw(self, context): if not PortData.data["is_port"]: return - element = tool.Ifc.get_entity(context.active_object) - current_flow_direction = str(element.FlowDirection) - row = layout.row(align=True) - row.label(text="Flow Direction:") - row.label(text=current_flow_direction) - - # port located on - row = layout.row(align=True) relating_object_name = PortData.data["port_relating_object_name"] - relating_object = bpy.data.objects[relating_object_name] - row.label(text="Port located on:") - row.label(text=relating_object_name) - ifc_id = tool.Blender.get_ifc_definition_id(relating_object) - row.operator("bim.select_entity", text="", icon="RESTRICT_SELECT_OFF").ifc_id = ifc_id + row.label(text=f"IfcDistributionPort located in: {relating_object_name}") + row.operator("bim.remove_port", icon="X", text="") - # object connected to the port - row = layout.row(align=True) - connected_object_name = PortData.data["port_connected_object_name"] - if connected_object_name: - connected_object = bpy.data.objects[connected_object_name] - row.label(text="Port connected to:") - row.label(text=connected_object_name) - ifc_id = tool.Blender.get_ifc_definition_id(connected_object) - row.operator("bim.select_entity", text="", icon="RESTRICT_SELECT_OFF").ifc_id = ifc_id - else: - row.label(text="Port is not connected to any element") + element = tool.Ifc.get_entity(context.active_object) row = layout.row(align=True) - row.label(text="Change Flow Direction:") - for flow_direction in FLOW_DIRECTION_TO_ICON.keys(): - row.operator( - "bim.set_flow_direction", - icon=FLOW_DIRECTION_TO_ICON[flow_direction], - depress=flow_direction == current_flow_direction, - text="", - ).direction = flow_direction + cols = [row.column(align=True) for i in range(10)] + cols[3].scale_x = 1.0 + cols[6].scale_x = 1.0 + cols[8].scale_x = 1.33 + + flow_direction_icon = FLOW_DIRECTION_TO_ICON[element.FlowDirection or "NOTDEFINED"] + connected_port = tool.System.get_connected_port(element) + + if connected_port: + cols[0].operator("bim.disconnect_port", text="", icon="UNLINKED") + op = cols[1].operator("bim.cycle_flow_direction", text="", icon=flow_direction_icon, emboss=True) + op.port_id = element.id() + else: + cols[0].operator("bim.connect_port", icon="PLUGIN", text="") + op = cols[1].operator("bim.cycle_flow_direction", text="", icon=flow_direction_icon, emboss=True) + op.port_id = element.id() + + cols[2].operator("bim.select_entity", text="", icon="RESTRICT_SELECT_OFF").ifc_id = element.id() + cols[3].label(text=context.active_object.name) + + if connected_port: + connected_port_flow_dir = FLOW_DIRECTION_TO_ICON[connected_port.FlowDirection or "NOTDEFINED"] + op = cols[4].operator("bim.cycle_flow_direction", text="", icon=connected_port_flow_dir, emboss=True) + op.port_id = connected_port.id() + cols[5].operator("bim.select_entity", text="", icon="RESTRICT_SELECT_OFF").ifc_id = connected_port.id() + connected_port_obj = tool.Ifc.get_object(connected_port) + cols[6].label(text=connected_port_obj.name if connected_port_obj else "Hidden Port") + + connected_object_name = PortData.data["port_connected_object_name"] + if connected_object_name: + connected_obj = bpy.data.objects[connected_object_name] + ifc_id = tool.Blender.get_ifc_definition_id(connected_obj) + cols[7].operator("bim.select_entity", text="", icon="RESTRICT_SELECT_OFF").ifc_id = ifc_id + cols[8].label(text=connected_object_name) + else: + cols[7].label(text="", icon="BLANK1") + cols[8].label(text="") + cols[9].operator("bim.establish_path_direction", text="", icon="CON_FOLLOWPATH").port_id = ( + connected_port.id() + ) + else: + cols[4].label(text="", icon="BLANK1") + cols[5].label(text="", icon="BLANK1") + cols[6].label(text="Port is disconnected") + cols[7].label(text="", icon="BLANK1") + cols[8].label(text="") + cols[9].label(text="", icon="BLANK1") class BIM_PT_flow_controls(Panel): diff --git a/src/bonsai/bonsai/bim/module/tester/__init__.py b/src/bonsai/bonsai/bim/module/tester/__init__.py index f31ac5e69a6..db63d97b55f 100644 --- a/src/bonsai/bonsai/bim/module/tester/__init__.py +++ b/src/bonsai/bonsai/bim/module/tester/__init__.py @@ -17,7 +17,8 @@ # along with Bonsai. If not, see . import bpy -from . import ui, prop, operator + +from . import operator, prop, ui classes = ( operator.ExecuteIfcTester, diff --git a/src/bonsai/bonsai/bim/module/tester/data.py b/src/bonsai/bonsai/bim/module/tester/data.py index d845c210f91..8535d879c69 100644 --- a/src/bonsai/bonsai/bim/module/tester/data.py +++ b/src/bonsai/bonsai/bim/module/tester/data.py @@ -16,10 +16,10 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . -import bpy -import bonsai.tool as tool import ifctester.reporter +import bonsai.tool as tool + def refresh(): TesterData.is_loaded = False diff --git a/src/bonsai/bonsai/bim/module/tester/operator.py b/src/bonsai/bonsai/bim/module/tester/operator.py index 822ffd571c7..c8485d33396 100644 --- a/src/bonsai/bonsai/bim/module/tester/operator.py +++ b/src/bonsai/bonsai/bim/module/tester/operator.py @@ -16,28 +16,29 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . +import asyncio import os -import bpy -import time -import tempfile -import webbrowser -import traceback -import subprocess import socket +import subprocess import sys +import tempfile import threading -import asyncio -import socketio -from aiohttp import web -import ifctester +import time +import traceback +import webbrowser +from pathlib import Path +from typing import Union + +import bpy +import ifcopenshell import ifctester.ids import ifctester.reporter -import ifcopenshell -import bonsai.tool as tool -import bonsai.bim.handler +import socketio +from aiohttp import web from bpy_extras.io_utils import ExportHelper -from pathlib import Path -from typing import Union + +import bonsai.bim.handler +import bonsai.tool as tool webapp_process = None websocket_server_thread = None diff --git a/src/bonsai/bonsai/bim/module/tester/prop.py b/src/bonsai/bonsai/bim/module/tester/prop.py index fb20a0d4cd9..1bfa32c1ebf 100644 --- a/src/bonsai/bonsai/bim/module/tester/prop.py +++ b/src/bonsai/bonsai/bim/module/tester/prop.py @@ -19,19 +19,17 @@ from typing import TYPE_CHECKING import bpy -from bonsai.bim.module.tester.data import TesterData -from bonsai.bim.prop import StrProperty, MultipleFileSelect -from bpy.types import PropertyGroup from bpy.props import ( - PointerProperty, - StringProperty, - EnumProperty, BoolProperty, - IntProperty, - FloatProperty, - FloatVectorProperty, CollectionProperty, + IntProperty, + PointerProperty, + StringProperty, ) +from bpy.types import PropertyGroup + +from bonsai.bim.module.tester.data import TesterData +from bonsai.bim.prop import MultipleFileSelect def update_active_specification_index(self: "IfcTesterProperties", context: bpy.types.Context) -> None: diff --git a/src/bonsai/bonsai/bim/module/tester/ui.py b/src/bonsai/bonsai/bim/module/tester/ui.py index 66648f4e43e..e20bfde1c12 100644 --- a/src/bonsai/bonsai/bim/module/tester/ui.py +++ b/src/bonsai/bonsai/bim/module/tester/ui.py @@ -20,12 +20,12 @@ from typing import TYPE_CHECKING -from bonsai.bim.ui import draw_multiline_text - import bpy from bpy.types import Panel, UIList + import bonsai.tool as tool from bonsai.bim.module.tester.data import TesterData +from bonsai.bim.ui import draw_multiline_text if TYPE_CHECKING: from bonsai.bim.module.tester.prop import ( diff --git a/src/bonsai/bonsai/bim/module/type/__init__.py b/src/bonsai/bonsai/bim/module/type/__init__.py index b77bcbfb8ea..0aa61167d66 100644 --- a/src/bonsai/bonsai/bim/module/type/__init__.py +++ b/src/bonsai/bonsai/bim/module/type/__init__.py @@ -17,7 +17,8 @@ # along with Bonsai. If not, see . import bpy -from . import ui, prop, operator + +from . import operator, prop, ui classes = ( operator.AssignType, diff --git a/src/bonsai/bonsai/bim/module/type/data.py b/src/bonsai/bonsai/bim/module/type/data.py index 3d0f5069867..25beb2d36de 100644 --- a/src/bonsai/bonsai/bim/module/type/data.py +++ b/src/bonsai/bonsai/bim/module/type/data.py @@ -17,9 +17,10 @@ # along with Bonsai. If not, see . import bpy -import ifcopenshell.util.type import ifcopenshell.util.element +import ifcopenshell.util.type from ifcopenshell.util.doc import get_entity_doc + import bonsai.tool as tool diff --git a/src/bonsai/bonsai/bim/module/type/operator.py b/src/bonsai/bonsai/bim/module/type/operator.py index c078d66f67e..4a6ce053fc8 100644 --- a/src/bonsai/bonsai/bim/module/type/operator.py +++ b/src/bonsai/bonsai/bim/module/type/operator.py @@ -16,22 +16,19 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . +from typing import TYPE_CHECKING + import bpy -import bmesh -import ifcopenshell.util.element -import ifcopenshell.util.schema -import ifcopenshell.util.representation -import ifcopenshell.util.type -import ifcopenshell.util.unit -import ifcopenshell.api import ifcopenshell.api.attribute import ifcopenshell.api.type +import ifcopenshell.util.element +import ifcopenshell.util.representation + import bonsai.bim.helper -import bonsai.tool as tool import bonsai.core.geometry -import bonsai.core.type as core import bonsai.core.root -from typing import TYPE_CHECKING +import bonsai.core.type as core +import bonsai.tool as tool class AssignType(bpy.types.Operator, tool.Ifc.Operator): @@ -72,7 +69,7 @@ def _execute(self, context): element = tool.Ifc.get_entity(obj) if not element or not element.is_a("IfcObject"): continue - core.assign_type(tool.Ifc, tool.Type, element=element, type=relating_type) + core.assign_type(tool.Ifc, tool.Model, tool.Type, element=element, type=relating_type) # Switch to the drawing's target view if available if active_target_view and element.Representation: @@ -239,7 +236,7 @@ def execute(self, context): for related_object in objects: relating_type = ifcopenshell.util.element.get_type(tool.Ifc.get_entity(related_object)) if not relating_type: - related_object.select_set(False) + # Keep objects without a type selected (retain current selection) continue relating_types.add(relating_type) @@ -382,7 +379,7 @@ def _execute(self, context): for selected_obj in selected_objects: selected_element = tool.Ifc.get_entity(selected_obj) if selected_element and selected_element.is_a("IfcObject"): - core.assign_type(tool.Ifc, tool.Type, element=selected_element, type=new) + core.assign_type(tool.Ifc, tool.Model, tool.Type, element=selected_element, type=new) if prefs.occurrence_name_style == "TYPE": selected_obj.name = tool.Model.generate_occurrence_name(new, selected_element.is_a()) diff --git a/src/bonsai/bonsai/bim/module/type/prop.py b/src/bonsai/bonsai/bim/module/type/prop.py index 2786636404c..d624fd59a0f 100644 --- a/src/bonsai/bonsai/bim/module/type/prop.py +++ b/src/bonsai/bonsai/bim/module/type/prop.py @@ -16,24 +16,21 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . +from typing import TYPE_CHECKING, Union + import bpy import ifcopenshell.util.element -import ifcopenshell.util.type -from bonsai.bim.module.type.data import TypeData -from bonsai.bim.prop import Attribute -import bonsai.tool as tool -from typing import TYPE_CHECKING, Union -from bpy.types import PropertyGroup from bpy.props import ( - PointerProperty, - StringProperty, - EnumProperty, BoolProperty, - IntProperty, - FloatProperty, - FloatVectorProperty, CollectionProperty, + EnumProperty, + PointerProperty, ) +from bpy.types import PropertyGroup + +import bonsai.tool as tool +from bonsai.bim.module.type.data import TypeData +from bonsai.bim.prop import Attribute def get_relating_type_class(self: "BIMTypeProperties", context: bpy.types.Context) -> list[tuple[str, str, str]]: diff --git a/src/bonsai/bonsai/bim/module/type/ui.py b/src/bonsai/bonsai/bim/module/type/ui.py index d596997d5a9..fbd1edd4469 100644 --- a/src/bonsai/bonsai/bim/module/type/ui.py +++ b/src/bonsai/bonsai/bim/module/type/ui.py @@ -17,10 +17,11 @@ # along with Bonsai. If not, see . import bpy -import bonsai.tool as tool -import bonsai.bim.module.type.prop as type_prop from bpy.types import Panel -from bonsai.bim.helper import prop_with_search, get_display_value + +import bonsai.bim.module.type.prop as type_prop +import bonsai.tool as tool +from bonsai.bim.helper import get_display_value, prop_with_search from bonsai.bim.module.type.data import TypeData diff --git a/src/bonsai/bonsai/bim/module/unit/__init__.py b/src/bonsai/bonsai/bim/module/unit/__init__.py index 29f209dcd37..a6e65f605e3 100644 --- a/src/bonsai/bonsai/bim/module/unit/__init__.py +++ b/src/bonsai/bonsai/bim/module/unit/__init__.py @@ -17,7 +17,8 @@ # along with Bonsai. If not, see . import bpy -from . import ui, prop, operator + +from . import operator, prop, ui classes = ( operator.AddContextDependentUnit, diff --git a/src/bonsai/bonsai/bim/module/unit/data.py b/src/bonsai/bonsai/bim/module/unit/data.py index 22977988bf9..6d83bb4e167 100644 --- a/src/bonsai/bonsai/bim/module/unit/data.py +++ b/src/bonsai/bonsai/bim/module/unit/data.py @@ -16,11 +16,11 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . -import ifcopenshell -import ifcopenshell.util.unit -import ifcopenshell.util.schema import ifcopenshell.util.attribute +import ifcopenshell.util.schema +import ifcopenshell.util.unit from ifcopenshell.util.doc import get_entity_doc + import bonsai.tool as tool diff --git a/src/bonsai/bonsai/bim/module/unit/operator.py b/src/bonsai/bonsai/bim/module/unit/operator.py index f7c129aba13..f0cee9a6be5 100644 --- a/src/bonsai/bonsai/bim/module/unit/operator.py +++ b/src/bonsai/bonsai/bim/module/unit/operator.py @@ -16,12 +16,12 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . +from typing import TYPE_CHECKING + import bpy -import ifcopenshell.api -import ifcopenshell.util.unit -import bonsai.tool as tool + import bonsai.core.unit as core -from typing import TYPE_CHECKING +import bonsai.tool as tool if TYPE_CHECKING: from bpy.stub_internal import rna_enums diff --git a/src/bonsai/bonsai/bim/module/unit/prop.py b/src/bonsai/bonsai/bim/module/unit/prop.py index a335532294b..60639ac3a10 100644 --- a/src/bonsai/bonsai/bim/module/unit/prop.py +++ b/src/bonsai/bonsai/bim/module/unit/prop.py @@ -16,21 +16,20 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . +from typing import TYPE_CHECKING + import bpy -from bonsai.bim.prop import StrProperty, Attribute -from bonsai.bim.module.unit.data import UnitsData -from bpy.types import PropertyGroup from bpy.props import ( - PointerProperty, - StringProperty, - EnumProperty, BoolProperty, - IntProperty, - FloatProperty, - FloatVectorProperty, CollectionProperty, + EnumProperty, + IntProperty, + StringProperty, ) -from typing import TYPE_CHECKING +from bpy.types import PropertyGroup + +from bonsai.bim.module.unit.data import UnitsData +from bonsai.bim.prop import Attribute def get_unit_classes(self: "BIMUnitProperties", context: bpy.types.Context) -> list[tuple[str, str, str]]: diff --git a/src/bonsai/bonsai/bim/module/unit/ui.py b/src/bonsai/bonsai/bim/module/unit/ui.py index 9407ef01ac9..848425cd4e1 100644 --- a/src/bonsai/bonsai/bim/module/unit/ui.py +++ b/src/bonsai/bonsai/bim/module/unit/ui.py @@ -17,13 +17,16 @@ # along with Bonsai. If not, see . from __future__ import annotations -import bonsai.bim.helper -import bonsai.tool as tool + +from typing import TYPE_CHECKING + import bpy from bpy.types import Panel, UIList + +import bonsai.bim.helper +import bonsai.tool as tool from bonsai.bim.helper import prop_with_search from bonsai.bim.module.unit.data import UnitsData -from typing import TYPE_CHECKING if TYPE_CHECKING: from bonsai.bim.module.unit.prop import BIMUnitProperties, Unit @@ -120,7 +123,6 @@ def draw_item( active_data, active_propname, ) -> None: - props = tool.Unit.get_unit_props() if item: icon = tool.Unit.get_icon_for_unit_class(item.ifc_class) row = layout.row(align=True) @@ -134,10 +136,10 @@ def draw_item( op = row.operator("bim.assign_unit", text="", icon="KEYFRAME", emboss=False) op.unit = item.ifc_definition_id - if props.active_unit_id == item.ifc_definition_id: + if data.active_unit_id == item.ifc_definition_id: row.operator("bim.edit_unit", text="", icon="CHECKMARK").unit = item.ifc_definition_id row.operator("bim.disable_editing_unit", text="", icon="CANCEL") - elif props.active_unit_id: + elif data.active_unit_id: row.operator("bim.remove_unit", text="", icon="X").unit = item.ifc_definition_id else: op = row.operator("bim.enable_editing_unit", text="", icon="GREASEPENCIL") diff --git a/src/bonsai/bonsai/bim/module/void/__init__.py b/src/bonsai/bonsai/bim/module/void/__init__.py index f89d514ad00..1fef345a897 100644 --- a/src/bonsai/bonsai/bim/module/void/__init__.py +++ b/src/bonsai/bonsai/bim/module/void/__init__.py @@ -17,7 +17,8 @@ # along with Bonsai. If not, see . import bpy -from . import ui, prop, operator + +from . import operator, prop, ui classes = ( operator.AddFilling, diff --git a/src/bonsai/bonsai/bim/module/void/data.py b/src/bonsai/bonsai/bim/module/void/data.py index a1999e8d214..02531406514 100644 --- a/src/bonsai/bonsai/bim/module/void/data.py +++ b/src/bonsai/bonsai/bim/module/void/data.py @@ -16,11 +16,12 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . +from typing import Any, Union + import bpy import ifcopenshell + import bonsai.tool as tool -from typing import Any, Union -from collections.abc import Generator def refresh(): diff --git a/src/bonsai/bonsai/bim/module/void/operator.py b/src/bonsai/bonsai/bim/module/void/operator.py index 0d2136d1d79..8c584e0b143 100644 --- a/src/bonsai/bonsai/bim/module/void/operator.py +++ b/src/bonsai/bonsai/bim/module/void/operator.py @@ -21,10 +21,11 @@ import ifcopenshell.api.feature import ifcopenshell.util.element import ifcopenshell.util.representation -import bonsai.tool as tool + +import bonsai.bim.handler import bonsai.core.geometry import bonsai.core.root -import bonsai.bim.handler +import bonsai.tool as tool from bonsai.bim.module.model.opening import FilledOpeningGenerator diff --git a/src/bonsai/bonsai/bim/module/void/prop.py b/src/bonsai/bonsai/bim/module/void/prop.py index 0170dbd6063..1c6bf088d9a 100644 --- a/src/bonsai/bonsai/bim/module/void/prop.py +++ b/src/bonsai/bonsai/bim/module/void/prop.py @@ -16,10 +16,18 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . +from typing import TYPE_CHECKING, Literal, Union, get_args + import bpy +from bpy.props import ( + BoolProperty, + CollectionProperty, + EnumProperty, + IntProperty, + PointerProperty, + StringProperty, +) from bpy.types import PropertyGroup -from bpy.props import PointerProperty, StringProperty, IntProperty, BoolProperty, CollectionProperty, EnumProperty -from typing import Union, TYPE_CHECKING, Literal, get_args OperatorType = Literal["DIFFERENCE", "INTERSECTION", "UNION"] diff --git a/src/bonsai/bonsai/bim/module/void/ui.py b/src/bonsai/bonsai/bim/module/void/ui.py index 8c80adca078..5fec870891a 100644 --- a/src/bonsai/bonsai/bim/module/void/ui.py +++ b/src/bonsai/bonsai/bim/module/void/ui.py @@ -17,15 +17,20 @@ # along with Bonsai. If not, see . from __future__ import annotations + +from typing import TYPE_CHECKING, Any + import bpy -import bonsai.tool as tool from bpy.types import Panel, UIList + +import bonsai.tool as tool from bonsai.bim.module.void.data import BooleansData, VoidsData -from typing import Any, TYPE_CHECKING if TYPE_CHECKING: import bpy.stub_internal.rna_enums as rna_enums + from bonsai.bim.module.void.prop import Boolean + OPENING_ICON = "SELECT_SUBTRACT" FILLING_ICON = "SELECT_INTERSECT" @@ -172,7 +177,9 @@ def draw(self, context): class BIM_UL_booleans(UIList): - def draw_item(self, context, layout, data, item, icon, active_data, active_propname): + def draw_item( + self, context, layout: bpy.types.UILayout, data, item: Boolean, icon, active_data, active_propname + ) -> None: if item: if item.operator == "DIFFERENCE": icon = "SELECT_DIFFERENCE" diff --git a/src/bonsai/bonsai/bim/module/web/__init__.py b/src/bonsai/bonsai/bim/module/web/__init__.py index de3f7015a4a..d2d28e0f629 100644 --- a/src/bonsai/bonsai/bim/module/web/__init__.py +++ b/src/bonsai/bonsai/bim/module/web/__init__.py @@ -17,7 +17,8 @@ # along with Bonsai. If not, see . import bpy -from . import ui, prop, operator + +from . import operator, prop, ui classes = ( operator.ConnectToWebsocketServer, diff --git a/src/bonsai/bonsai/bim/module/web/data.py b/src/bonsai/bonsai/bim/module/web/data.py index db939cadfa4..652d5f7169b 100644 --- a/src/bonsai/bonsai/bim/module/web/data.py +++ b/src/bonsai/bonsai/bim/module/web/data.py @@ -16,10 +16,10 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . -import bpy -import bonsai.tool as tool import os +import bonsai.tool as tool + def refresh(): WebData.is_loaded = False diff --git a/src/bonsai/bonsai/bim/module/web/operator.py b/src/bonsai/bonsai/bim/module/web/operator.py index 1c8bb21e9b3..a2910b98051 100644 --- a/src/bonsai/bonsai/bim/module/web/operator.py +++ b/src/bonsai/bonsai/bim/module/web/operator.py @@ -16,8 +16,9 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . -import os + import bpy + import bonsai.core.web as core import bonsai.tool as tool diff --git a/src/bonsai/bonsai/bim/module/web/prop.py b/src/bonsai/bonsai/bim/module/web/prop.py index 66ffdd49951..e9e5a331850 100644 --- a/src/bonsai/bonsai/bim/module/web/prop.py +++ b/src/bonsai/bonsai/bim/module/web/prop.py @@ -17,31 +17,25 @@ # along with Bonsai. If not, see . from typing import TYPE_CHECKING -import bpy -from bpy.types import PropertyGroup + from bpy.props import ( - PointerProperty, - StringProperty, - EnumProperty, BoolProperty, IntProperty, - FloatProperty, - FloatVectorProperty, - CollectionProperty, ) +from bpy.types import PropertyGroup class WebProperties(PropertyGroup): - webserver_port: IntProperty( # pyright: ignore[reportRedeclaration] + webserver_port: IntProperty( name="Webserver Port", min=0, max=65535, ) - is_running: BoolProperty( # pyright: ignore[reportRedeclaration] + is_running: BoolProperty( name="Webserver Running Status", default=False, ) - is_connected: BoolProperty( # pyright: ignore[reportRedeclaration] + is_connected: BoolProperty( name="Connection Status", default=False, ) diff --git a/src/bonsai/bonsai/bim/module/web/ui.py b/src/bonsai/bonsai/bim/module/web/ui.py index 0a6fca55ae3..88bd0e6e6f1 100644 --- a/src/bonsai/bonsai/bim/module/web/ui.py +++ b/src/bonsai/bonsai/bim/module/web/ui.py @@ -17,6 +17,7 @@ # along with Bonsai. If not, see . from bpy.types import Panel + import bonsai.tool as tool from bonsai.bim.module.web.data import WebData diff --git a/src/bonsai/bonsai/bim/operator.py b/src/bonsai/bonsai/bim/operator.py index d8c1cab7d16..f1ab24c7b0e 100644 --- a/src/bonsai/bonsai/bim/operator.py +++ b/src/bonsai/bonsai/bim/operator.py @@ -16,49 +16,43 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . -import os import contextlib -import bpy -import bmesh -import time import logging -import textwrap -import shutil +import os import platform +import shutil import subprocess import tempfile +import textwrap +import time import webbrowser +from collections import namedtuple +from collections.abc import Iterable +from enum import Enum +from math import radians +from pathlib import Path +from typing import TYPE_CHECKING, Literal, Union, get_args + +import bmesh +import bpy import ifcopenshell +from bpy_extras.io_utils import ImportHelper +from mathutils import Euler, Vector +from natsort import natsorted + import bonsai.bim -import bonsai.tool as tool import bonsai.bim.handler -from enum import Enum -from bonsai.bim.helper import ( - get_all_tab_panels, - get_tab_visibility, - set_tab_visibility, - get_tab_names, - get_panel_config, - initialize_panel_properties, - initialize_tab_visibilities, -) -from bpy_extras.io_utils import ImportHelper +import bonsai.tool as tool from bonsai.bim import import_ifc +from bonsai.bim.helper import get_enum_items from bonsai.bim.prop import StrProperty from bonsai.bim.ui import IFCFileSelector -from bonsai.bim.helper import get_enum_items -from mathutils import Vector, Euler -from math import radians -from pathlib import Path -from collections import namedtuple -from typing import Union, TYPE_CHECKING, Literal, get_args -from collections.abc import Iterable -from natsort import natsorted if TYPE_CHECKING: - from bonsai.bim.prop import MultipleFileSelect, Attribute from bpy.stub_internal import rna_enums + from bonsai.bim.prop import Attribute, MultipleFileSelect + class SetTab(bpy.types.Operator): bl_idname = "bim.set_tab" @@ -76,7 +70,7 @@ def execute(self, context): if context.area.spaces.active.search_filter: return {"FINISHED"} tool.Blender.setup_tabs() - aprops = tool.Blender.get_area_props(context) + aprops = tool.Blender.get_active_area_props(context) aprops.tab = self.tab return {"FINISHED"} @@ -91,7 +85,7 @@ def execute(self, context): if context.area.spaces.active.search_filter: return {"FINISHED"} tool.Blender.setup_tabs() - aprops = tool.Blender.get_area_props(context) + aprops = tool.Blender.get_active_area_props(context) aprops.tab = aprops.alt_tab return {"FINISHED"} @@ -165,9 +159,9 @@ class SelectURIAttribute(bpy.types.Operator, ImportHelper): bl_label = "Select URI Attribute" bl_options = {"REGISTER", "UNDO"} bl_description = "Select a local file" - attribute_data_path: bpy.props.StringProperty(name="Data Path") # pyright: ignore[reportRedeclaration] + attribute_data_path: bpy.props.StringProperty(name="Data Path") """Full data path to `Attribute`/string property.""" - use_relative_path: bpy.props.BoolProperty( # pyright: ignore[reportRedeclaration] + use_relative_path: bpy.props.BoolProperty( name="Use Relative Path", default=False, ) @@ -274,63 +268,45 @@ def execute(self, context): import bpy # Ensure all styles are loaded before attempting to remove them -try: - bpy.ops.bim.load_styles() -except Exception: - pass +bpy.ops.bim.load_styles() # 1. Collect all IfcStyle material names ifcstyle_material_names = [] -try: - styles_props = getattr(bpy.context.scene, "BIMStylesProperties", None) - if styles_props is None and bpy.data.scenes: - styles_props = getattr(bpy.data.scenes[0], "BIMStylesProperties", None) - if styles_props: - for style in list(styles_props.styles): - material = getattr(style, "blender_material", None) - if material and material.name: - ifcstyle_material_names.append(material.name) -except Exception: - pass +styles_props = getattr(bpy.context.scene, "BIMStylesProperties", None) +if styles_props is None and bpy.data.scenes: + styles_props = getattr(bpy.data.scenes[0], "BIMStylesProperties", None) +if styles_props: + for style in list(styles_props.styles): + material = getattr(style, "blender_material", None) + if material and material.name: + ifcstyle_material_names.append(material.name) # 2. Purge IfcStore -try: - from bonsai.bim.ifc import IfcStore -except ImportError: - IfcStore = None - -if IfcStore: - try: - IfcStore.purge() - except Exception: - pass +from bonsai.bim.ifc import IfcStore +IfcStore.purge() # 3. Remove all collections named IfcProject* for collection in list(bpy.data.collections): if collection.name.startswith('IfcProject'): - try: - bpy.data.collections.remove(collection, do_unlink=True) - except Exception: - pass + bpy.data.collections.remove(collection, do_unlink=True) -# 4. Purge orphaned data blocks after removing IfcProject collections -try: - bpy.ops.outliner.orphans_purge(do_local_ids=True, do_linked_ids=True, do_recursive=True) -except Exception: - pass - -# 5. Remove all materials corresponding to the IfcStyles we collected -materials_removed = 0 -try: - for mat_name in ifcstyle_material_names: - if mat_name in bpy.data.materials: - try: - bpy.data.materials.remove(bpy.data.materials[mat_name], do_unlink=True) - materials_removed += 1 - except Exception: - pass -except Exception: - pass +# 4.1 Remove all collections from linked libraries (they will be recreated by bonsai) +for collection in list(bpy.data.collections): + if collection.library: + bpy.data.collections.remove(collection, do_unlink=True) + +# 4.2. Remove all empty objects that are collection instances for linked models +for obj in list(bpy.data.objects): + if obj.type == 'EMPTY' and obj.instance_type == 'COLLECTION' and obj.name.startswith('IfcProject/'): + bpy.data.objects.remove(obj, do_unlink=True) + +# 5. Purge orphaned data blocks after removing IfcProject collections +bpy.ops.outliner.orphans_purge(do_local_ids=True, do_linked_ids=True, do_recursive=True) + +# 6. Remove all materials corresponding to the IfcStyles we collected +for mat_name in ifcstyle_material_names: + if mat_name in bpy.data.materials: + bpy.data.materials.remove(bpy.data.materials[mat_name], do_unlink=True) bpy.ops.wm.save_as_mainfile(filepath=r'{blendmetadata_path}') """ @@ -364,8 +340,6 @@ def execute(self, context): return {"FINISHED"} - - # TODO: Unused operator. # Is there a need for this or 'DIR_PATH' propety subtype does almost the same, # but also has alt+click? @@ -627,7 +601,7 @@ class CreateMacBonsaiApp(bpy.types.Operator): "ALT+click to uninstall Bonsai app if it was installed previously." ) - uninstall: bpy.props.BoolProperty(options={"SKIP_SAVE"}) # pyright: ignore[reportRedeclaration] + uninstall: bpy.props.BoolProperty(options={"SKIP_SAVE"}) if TYPE_CHECKING: uninstall: bool @@ -1693,7 +1667,7 @@ class BIM_OT_attribute_add_subitem(bpy.types.Operator): bl_description = "Add subitem to the current attribute" bl_options = {"REGISTER", "UNDO"} - data_path: bpy.props.StringProperty() # pyright: ignore[reportRedeclaration] + data_path: bpy.props.StringProperty() """Full data path.""" if TYPE_CHECKING: @@ -1717,9 +1691,9 @@ class BIM_OT_attribute_remove_subitem(bpy.types.Operator): bl_description = "Add subitem to the current attribute" bl_options = {"REGISTER", "UNDO"} - data_path: bpy.props.StringProperty() # pyright: ignore[reportRedeclaration] + data_path: bpy.props.StringProperty() """Full data path.""" - index: bpy.props.IntProperty() # pyright: ignore[reportRedeclaration] + index: bpy.props.IntProperty() if TYPE_CHECKING: data_path: str @@ -1737,156 +1711,6 @@ def execute(self, context) -> set["rna_enums.OperatorReturnItems"]: return {"FINISHED"} -class BIM_UL_tab_panels(bpy.types.UIList): - """UIList for Tab Panels""" - - def draw_item(self, context, layout, data, item, icon, active_data, active_propname, index): - row = layout.row(align=True) - row.label(text=item["bl_label"]) - - row.operator( - "bim.toggle_panel_visibility", - text="", - icon="HIDE_OFF" if item.get("visible", True) else "HIDE_ON", - ).action = f"TOGGLE_VISIBILITY_{item.name}" - - row.operator( - "bim.bookmark_panel", - text="", - icon="SOLO_ON" if item.get("bookmarked", False) else "SOLO_OFF", - ).action = f"BOOKMARK_{item.name}" - - -class BIM_OT_toggle_panel_visibility(bpy.types.Operator): - """Toggle Panel Visibility""" - - bl_idname = "bim.toggle_panel_visibility" - bl_label = "Toggle Panel Visibility" - bl_options = {"REGISTER", "UNDO"} - - action: bpy.props.StringProperty() - - def execute(self, context): - panel_name = self.action.replace("TOGGLE_VISIBILITY_", "") - active_tab = getattr(context.scene, "active_tab_name", None) or getattr( - tool.Blender.get_bim_props(), "tab", None - ) - is_bookmark_tab = active_tab == "BOOKMARK" - - panel_config = get_panel_config(panel_name, create_if_missing=True) - if panel_config: - if is_bookmark_tab: - panel_config.is_visible_in_bookmarks = not panel_config.is_visible_in_bookmarks - new_value = panel_config.is_visible_in_bookmarks - else: - panel_config.is_visible_in_tab = not panel_config.is_visible_in_tab - new_value = panel_config.is_visible_in_tab - - for item in context.scene.tab_panels: - if item.name == panel_name: - item["visible"] = new_value - break - - for area in bpy.context.window.screen.areas: - if area.type == "PROPERTIES": - area.tag_redraw() - - tab_context = "Bookmarks" if is_bookmark_tab else "Tab" - self.report({"INFO"}, f"Toggled visibility for {panel_name} in {tab_context}.") - return {"FINISHED"} - - -class BIM_OT_bookmark_panel(bpy.types.Operator): - """Bookmark Panel""" - - bl_idname = "bim.bookmark_panel" - bl_label = "Bookmark Panel" - bl_options = {"REGISTER", "UNDO"} - - action: bpy.props.StringProperty() - - def execute(self, context): - panel_name = self.action.replace("BOOKMARK_", "") - panel_config = get_panel_config(panel_name, create_if_missing=True) - - if panel_config: - panel_config.is_bookmarked = not panel_config.is_bookmarked - - for item in context.scene.tab_panels: - if item.name == panel_name: - item["bookmarked"] = panel_config.is_bookmarked - break - - for area in bpy.context.window.screen.areas: - if area.type == "PROPERTIES": - area.tag_redraw() - - self.report({"INFO"}, f"Toggled bookmark for {panel_name}.") - return {"FINISHED"} - - -class BIM_OT_manage_tab_panels(bpy.types.Operator): - """Manage Tab Panels""" - - bl_idname = "bim.manage_tab_panels" - bl_label = "Manage Tab Panels" - bl_options = {"REGISTER", "UNDO"} - - tab_name: bpy.props.StringProperty() - - def invoke(self, context, event): - - context.scene.active_tab_name = self.tab_name - context.scene.tab_panels.clear() - - initialize_tab_visibilities() - initialize_panel_properties() - all_panels = get_all_tab_panels(force_refresh=True) - - for panel_data in all_panels.get(self.tab_name, []): - panel_name = panel_data.get("bl_idname", "") - panel_label = panel_data.get("bl_label", "") - if not panel_name or not panel_label: - continue - - item = context.scene.tab_panels.add() - item.name = panel_name - item["bl_label"] = panel_label - - panel_config = get_panel_config(panel_name, create_if_missing=True) - if panel_config: - if self.tab_name == "BOOKMARK": - item["visible"] = panel_config.is_visible_in_bookmarks - else: - item["visible"] = panel_config.is_visible_in_tab - item["bookmarked"] = panel_config.is_bookmarked - else: - item["visible"] = True - item["bookmarked"] = False - - return context.window_manager.invoke_popup(self) - - def draw(self, context): - layout = self.layout - layout.label(text=f"Manage Panels for {self.tab_name} Tab") - - row = layout.row() - row.template_list("BIM_UL_tab_panels", "", context.scene, "tab_panels", context.scene, "active_tab_panel_index") - - def execute(self, context): - for item in context.scene.tab_panels: - panel_config = get_panel_config(item.name, create_if_missing=True) - if panel_config: - if self.tab_name == "BOOKMARK": - panel_config.is_visible_in_bookmarks = item["visible"] - else: - panel_config.is_visible_in_tab = item["visible"] - panel_config.is_bookmarked = item["bookmarked"] - - self.report({"INFO"}, f"Panels for {self.tab_name} managed successfully.") - return {"FINISHED"} - - class BIM_OT_manage_tab_visibility(bpy.types.Operator): """Manage Tab Visibility""" @@ -1894,51 +1718,26 @@ class BIM_OT_manage_tab_visibility(bpy.types.Operator): bl_label = "Manage Tab Visibility" bl_options = {"REGISTER", "UNDO"} - def draw(self, context): - layout = self.layout - row = layout.row() - row = self.layout.row(align=True) - row.alignment = "RIGHT" - - row.operator("bim.reset_ui_layout", icon="FILE_REFRESH", text="") - row = layout.row() - row = self.layout.row(align=True) - row.alignment = "CENTER" - - for tab_name in get_tab_names(): - row = layout.row() - row.label(text=tab_name) - is_visible = get_tab_visibility(tab_name) - icon = "HIDE_OFF" if is_visible else "HIDE_ON" - op = row.operator("bim.toggle_tab_visibility", text="", icon=icon) - op.tab_name = tab_name - - def execute(self, context): - return {"FINISHED"} - - def invoke(self, context, event): - return context.window_manager.invoke_popup(self) - - -class BIM_OT_toggle_tab_visibility(bpy.types.Operator): - """Toggle Tab Visibility""" - - bl_idname = "bim.toggle_tab_visibility" - bl_label = "Toggle Tab Visibility" - bl_options = {"REGISTER", "UNDO"} - - tab_name: bpy.props.StringProperty() - def execute(self, context): - if self.tab_name in get_tab_names(): - current_visibility = get_tab_visibility(self.tab_name) - set_tab_visibility(self.tab_name, not current_visibility) - - for area in bpy.context.window.screen.areas: - if area.type == "PROPERTIES": - area.tag_redraw() - - self.report({"INFO"}, f"Toggled visibility for {self.tab_name}.") + from bonsai.bim.prop import get_tab + + bprops = tool.Blender.get_bim_props() + bprops.tab_visibilities.clear() + bprops.panel_visibilities.clear() + tabs = [item[0] for item in get_tab(None, None) if item and item[0] != "BLENDER"] + for tab in tabs: + new = bprops.tab_visibilities.add() + new.name = tab + + for attr_name in dir(bpy.types): + if attr_name.startswith("BIM_PT_tab_"): + panel_class = getattr(bpy.types, attr_name) + if not hasattr(panel_class, "bl_idname"): + assert False, panel_class + new = bprops.panel_visibilities.add() + new.name = panel_class.bl_idname + new.label = panel_class.bl_label + new.tab_name = panel_class.bim_tab_name return {"FINISHED"} @@ -1950,29 +1749,8 @@ class BIM_OT_reset_ui_layout(bpy.types.Operator): bl_options = {"REGISTER", "UNDO"} def execute(self, context): - - for tab_name in get_tab_names(): - set_tab_visibility(tab_name, True) - - get_all_tab_panels()["BOOKMARK"] = [{}] - - for tab_name, panels in get_all_tab_panels().items(): - for panel in panels: - panel_name = panel.get("bl_idname", "") - if not panel_name: - continue - - show_prop_name = f"show_{panel_name.lower()}" - if hasattr(context.scene, show_prop_name): - setattr(context.scene, show_prop_name, True) - - bookmark_prop_name = f"bookmark_{panel_name.lower()}" - if hasattr(context.scene, bookmark_prop_name): - setattr(context.scene, bookmark_prop_name, False) - - for area in bpy.context.window.screen.areas: - if area.type == "PROPERTIES": - area.tag_redraw() - - self.report({"INFO"}, "UI layout reset to default.") + bprops = tool.Blender.get_bim_props() + bprops.tab_visibilities.clear() + bprops.panel_visibilities.clear() + bonsai.bim.handler.refresh_ui_data() return {"FINISHED"} diff --git a/src/bonsai/bonsai/bim/prop.py b/src/bonsai/bonsai/bim/prop.py index d4ed4f8a9b7..e10243d266e 100644 --- a/src/bonsai/bonsai/bim/prop.py +++ b/src/bonsai/bonsai/bim/prop.py @@ -16,35 +16,27 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . +import json import os +from typing import TYPE_CHECKING, Any, Literal, Union, assert_never, get_args + import bpy -import json -import ifcopenshell -import ifcopenshell.util.pset import ifcopenshell.util.unit -from ifcopenshell.util.doc import ( - get_entity_doc, - get_attribute_doc, - get_property_set_doc, - get_property_doc, - get_predefined_type_doc, -) -import bonsai.bim -import bonsai.bim.schema -import bonsai.bim.handler -import bonsai.tool as tool -from bpy.types import PropertyGroup from bpy.props import ( - PointerProperty, - StringProperty, - EnumProperty, BoolProperty, - IntProperty, + CollectionProperty, + EnumProperty, FloatProperty, FloatVectorProperty, - CollectionProperty, + IntProperty, + PointerProperty, + StringProperty, ) -from typing import Any, Union, Literal, get_args, TYPE_CHECKING, assert_never +from bpy.types import PropertyGroup + +import bonsai.bim +import bonsai.bim.handler +import bonsai.tool as tool cwd = os.path.dirname(os.path.realpath(__file__)) @@ -60,10 +52,15 @@ def update_tab(self: "BIMAreaProperties", context: bpy.types.Context) -> None: self.previous_tab = self.tab +def update_is_visible(self: "BIMTabVisibility", context: bpy.types.Context) -> None: + bonsai.bim.handler.refresh_ui_data() + + def update_global_tab(self: "BIMTabProperties", context: bpy.types.Context) -> None: tool.Blender.setup_tabs() screen = context.id_data - aprops = screen.BIMAreaProperties[screen.areas[:].index(context.area)] + assert isinstance(screen, bpy.types.Screen) + aprops = tool.Blender.get_area_props(screen)[screen.areas[:].index(context.area)] aprops.tab = self.tab @@ -336,7 +333,7 @@ class Attribute(PropertyGroup): filter_glob: StringProperty() is_null: BoolProperty(name="Is Null", update=update_is_null) is_selected: BoolProperty(name="Is Selected", default=False) - subitems_values: CollectionProperty(type=StrProperty) # pyright: ignore[reportRedeclaration] + subitems_values: CollectionProperty(type=StrProperty) # Attribute parameters. is_optional: BoolProperty(name="Is Optional") @@ -345,7 +342,7 @@ class Attribute(PropertyGroup): value_max: FloatProperty(description="This is used to validate int_value and float_value") value_max_constraint: BoolProperty(default=False, description="True if the numerical value has an upper bound") special_type: StringProperty(name="Special Value Type", default="") - use_explorer_ui: BoolProperty() # pyright: ignore[reportRedeclaration] + use_explorer_ui: BoolProperty() metadata: StringProperty(name="Metadata", description="For storing some additional information about the attribute") update: StringProperty(name="Update", description="Custom update function to be executed") @@ -537,21 +534,24 @@ class BIMTabProperties(PropertyGroup): class BIMTabVisibility(PropertyGroup): name: StringProperty(name="Tab Name") - is_visible: BoolProperty(name="Is Visible", default=True) + is_visible: BoolProperty(name="Is Visible", default=True, update=update_is_visible) if TYPE_CHECKING: name: str is_visible: bool -class BIMPanelProperties(PropertyGroup): - is_visible_in_tab: BoolProperty(name="Is Visible in Tab", default=True) - is_visible_in_bookmarks: BoolProperty(name="Is Visible in Bookmarks", default=True) - is_bookmarked: BoolProperty(name="Is Bookmarked", default=False) +class BIMPanelVisibility(PropertyGroup): + name: StringProperty(name="Name") + label: StringProperty(name="Label") + tab_name: StringProperty(name="Tab Name") + is_visible: BoolProperty(name="Is Visible in Tab", default=True, update=update_is_visible) + is_bookmarked: BoolProperty(name="Is Bookmarked", default=False, update=update_is_visible) if TYPE_CHECKING: - is_visible_in_tab: bool - is_visible_in_bookmarks: bool + name: str + tab_name: str + is_visible: bool is_bookmarked: bool @@ -582,6 +582,7 @@ class BIMProperties(PropertyGroup): area_unit: EnumProperty( default="SQUARE_METRE", items=[ + ("NONE", "None", ""), ("NANO/SQUARE_METRE", "Square Nanometre", ""), ("MICRO/SQUARE_METRE", "Square Micrometre", ""), ("MILLI/SQUARE_METRE", "Square Millimetre", ""), @@ -599,6 +600,7 @@ class BIMProperties(PropertyGroup): volume_unit: EnumProperty( default="CUBIC_METRE", items=[ + ("NONE", "None", ""), ("NANO/CUBIC_METRE", "Cubic Nanometre", ""), ("MICRO/CUBIC_METRE", "Cubic Micrometre", ""), ("MILLI/CUBIC_METRE", "Cubic Millimetre", ""), @@ -612,35 +614,33 @@ class BIMProperties(PropertyGroup): ], name="IFC Volume Unit", ) - add_mass_time_units: bpy.props.BoolProperty( - name="Add Mass and Time Units", - description="Enable to define mass and time units for the project", - default=False, - ) mass_unit: EnumProperty( items=[ - ("KILOGRAM", "Kilogram", "Kilograms"), + ("NONE", "None", ""), ("GRAM", "Gram", "Grams"), - ("POUND", "Pound", "Pounds"), - ("OUNCE", "Ounce", "Ounces"), - ("TONNE", "Tonne", "Metric Tons"), + ("KILO/GRAM", "Kilogram", "Kilograms"), + ("MEGA/GRAM", "Tonne", "Metric Tons"), + ("pound", "Pound", "Pounds"), + ("ounce", "Ounce", "Ounces"), ], name="Mass Unit", - default="KILOGRAM", + default="NONE", ) - time_unit: EnumProperty( items=[ + ("NONE", "None", ""), ("SECOND", "Second", "Seconds"), - ("MINUTE", "Minute", "Minutes"), - ("HOUR", "Hour", "Hours"), - ("DAY", "Day", "Days"), + ("minute", "Minute", "Minutes"), + ("hour", "Hour", "Hours"), + ("day", "Day", "Days"), ], name="Time Unit", - default="HOUR", - ) + default="NONE", + ) tab_visibilities: CollectionProperty(type=BIMTabVisibility, name="Tab Visibilities") - panel_properties: CollectionProperty(type=BIMPanelProperties, name="Panel Properties") + active_tab_visibility_index: IntProperty(name="Active Tab Visibility Index") + panel_visibilities: CollectionProperty(type=BIMPanelVisibility, name="Panel Properties") + active_panel_visibility_index: IntProperty(name="Active Panel Property Index") if TYPE_CHECKING: is_dirty: bool @@ -656,8 +656,10 @@ class BIMProperties(PropertyGroup): volume_unit: str mass_unit: str time_unit: str - tab_visibilities: bpy.types.bpy_prop_collection[BIMTabVisibility] - panel_properties: bpy.types.bpy_prop_collection[BIMPanelProperties] + tab_visibilities: bpy.types.bpy_prop_collection_idprop[BIMTabVisibility] + active_tab_visibility_index: int + panel_visibilities: bpy.types.bpy_prop_collection_idprop[BIMPanelVisibility] + active_panel_visibility_index: int class IfcParameter(PropertyGroup): @@ -791,12 +793,21 @@ class BIMFacet(PropertyGroup): ("!*=", "does not contain", ""), ], ) + filter_mode: EnumProperty( + items=[ + ("ADD", "Add", "Add results to the current selection"), + ("SUBTRACT", "Subtract", "Remove results from the current selection"), + ("FILTER", "Filter", "Filter the current selection"), + ], + default="ADD", + ) if TYPE_CHECKING: pset: str value: str type: str comparison: Literal["=", "!=", ">=", "<=", ">", "<", "*=", "!*="] + filter_mode: Literal["ADD", "SUBTRACT", "FILTER"] class BIMFilterGroup(PropertyGroup): diff --git a/src/bonsai/bonsai/bim/schema.py b/src/bonsai/bonsai/bim/schema.py index 7890f90006a..15dfa87a590 100644 --- a/src/bonsai/bonsai/bim/schema.py +++ b/src/bonsai/bonsai/bim/schema.py @@ -18,14 +18,9 @@ import ifcopenshell import ifcopenshell.util.pset -import bonsai.tool as tool -import bpy -from typing import TYPE_CHECKING -if TYPE_CHECKING or bpy.app.version >= (5, 0, 0): - import _bpy_restrict_state as bpy_restrict_state -else: - import bpy_restrict_state +import bonsai +import bonsai.tool as tool class IfcSchema: @@ -60,7 +55,7 @@ def load_pset_templates(self): self.psetqto.get_by_name.cache_clear() # During register we cannot access the context either way. - if isinstance(bpy.context, bpy_restrict_state._RestrictContext): + if bonsai.is_registering(): return for path in tool.Blender.get_data_dir_paths("pset", "*.ifc"): self.psetqto.templates.append(ifcopenshell.open(path)) diff --git a/src/bonsai/bonsai/bim/ui.py b/src/bonsai/bonsai/bim/ui.py index e9ab0b446ce..97980d92dda 100644 --- a/src/bonsai/bonsai/bim/ui.py +++ b/src/bonsai/bonsai/bim/ui.py @@ -17,62 +17,47 @@ # along with Bonsai. If not, see . import os -import bpy import platform -import platformdirs -import bonsai.bim.helper +import textwrap from pathlib import Path +from typing import TYPE_CHECKING, Literal, Optional + +import bpy +import platformdirs +from bpy.props import BoolProperty, StringProperty from bpy.types import Panel -from bpy.props import StringProperty, IntProperty, BoolProperty from ifcopenshell.util.doc import ( get_entity_doc, get_property_set_doc, get_type_doc, - get_attribute_doc, ) -from . import ifc -from bonsai import get_debug_info +from ifcopenshell.util.file import IfcHeaderExtractor +from natsort import natsorted + import bonsai.bim +import bonsai.bim.helper import bonsai.tool as tool -from ifcopenshell.util.file import IfcHeaderExtractor -from bonsai.bim.prop import Attribute -from bonsai.bim.helper import ( - get_tab_names, - get_panel_tab_name, - should_show_panel, - get_tab_visibility, - set_tab_visibility, - get_panel_visibility, - is_panel_bookmarked, - get_panel_config, - get_all_tab_panels, - initialize_tab_visibilities, - initialize_panel_properties, -) from bonsai.bim.module.bsdd.prop import BIMBSDDProperties, BSDDProperty -from bonsai.bim.module.pset.prop import IfcProperty from bonsai.bim.module.model.prop import ( BIMDoorProperties, - BIMWindowProperties, BIMRailingProperties, BIMRoofProperties, BIMStairProperties, + BIMWindowProperties, ) from bonsai.bim.module.model.ui import ( draw_door_properties, - draw_window_properties, draw_railing_properties, draw_roof_properties, draw_stair_properties, + draw_window_properties, ) -from typing import Optional, TYPE_CHECKING, Literal -from natsort import natsorted -import textwrap - +from bonsai.bim.module.pset.prop import IfcProperty +from bonsai.bim.prop import Attribute if TYPE_CHECKING: - from bonsai.bim.prop import ObjProperty from bonsai.bim.module.project.prop import BIMProjectProperties + from bonsai.bim.prop import ObjProperty class IFCFileSelector: @@ -255,6 +240,39 @@ def draw_item( layout.label(text="", translate=False) +class BIM_UL_tab_visibilities(bpy.types.UIList): + def draw_item( + self, + context, + layout: bpy.types.UILayout, + data: bpy.types.PropertyGroup, + item: bpy.types.PropertyGroup, + icon, + active_data, + active_propname, + ) -> None: + row = layout.row() + row.prop(item, "name", text="", emboss=False) + row.prop(item, "is_visible", text="", icon="HIDE_OFF" if item.is_visible else "HIDE_ON", emboss=False) + + +class BIM_UL_panel_visibilities(bpy.types.UIList): + def draw_item( + self, + context, + layout: bpy.types.UILayout, + data: bpy.types.PropertyGroup, + item: bpy.types.PropertyGroup, + icon, + active_data, + active_propname, + ) -> None: + row = layout.row() + row.prop(item, "label", text="", emboss=False) + row.prop(item, "is_visible", text="", icon="HIDE_OFF" if item.is_visible else "HIDE_ON", emboss=False) + row.prop(item, "is_bookmarked", text="", icon="SOLO_ON" if item.is_bookmarked else "SOLO_OFF", emboss=False) + + class GizmoPreferencesDoor(bpy.types.PropertyGroup): """Property group for door gizmo visibility settings.""" @@ -445,12 +463,12 @@ class DocPreferences(bpy.types.PropertyGroup): classes_to_wireframe: StringProperty( default="IfcVirtualElement", name="Classes to Wireframe", - description="Upon import, these classes will display as wireframe.\nEx: IfcVirtualelement, IfcSpace", + description="Upon import, these classes will display as wireframe.\nEx: IfcVirtualElement, IfcSpace", ) classes_no_cut: StringProperty( default="IfcVirtualElement, IfcSpace", name="Classes that are not cut", - description="The cut decoractor will be turned off for these classes\nEx: IfcVirtualelement, IfcSpace", + description="The cut decorator will be turned off for these classes\nEx: IfcVirtualElement, IfcSpace", ) if TYPE_CHECKING: @@ -638,11 +656,16 @@ class BIM_ADDON_preferences(bpy.types.AddonPreferences): bsdd_load_test_dictionaries: BoolProperty( name="Load Test Dictionaries", description="Load dictionaries that are for testing only", default=False ) + bsdd_baseurl: StringProperty( + name="bSDD API Base URL", + description="Base URL for data dictionary API requests, e.g. https://api.bsdd.buildingsmart.org/api/", + default="https://api.bsdd.buildingsmart.org/api/", + ) should_disable_undo_on_save: BoolProperty( name="Disable Undo When Saving (Faster saves, no undo for you!)", default=False ) should_stream: BoolProperty(name="Stream Data From IFC-SPF (Only for advanced users)", default=False) - should_always_cache: BoolProperty( # pyright: ignore[reportRedeclaration] + should_always_cache: BoolProperty( name="Always Cache Geometry", description="Whether to always cache geometry regardless of 'Cache' setting during Advanced Project Load.", ) @@ -697,26 +720,22 @@ def update_cache_dir(self, context: bpy.types.Context) -> None: default=False, ) - mass_time_units_in_wizard: BoolProperty( - name="Mass and time units in project wizard", - description="Show mass and time units section in the new project wizard panel", - default=False, - ) - chain_filter_with_set_operations: BoolProperty( - name="NEW filter mode: Enable chained filters with set operations", - description="Enable chaining search filters with set operations: ADD (union: combine sets), SUBTRACT (difference: remove from set), FILTER (intersection: only elements in both sets), with autocomplete suggestions for filter values", - default=False, - ) - default_filter_with_set_operations_for_globalid_and_class: BoolProperty( - name="DEFAULT filter mode: Enable set operations for GlobalId/Class", - description="Enable ADD/SUBTRACT/FILTER toggle buttons on entity (Class) and instance (GlobalId) filters for the DEFAULT filter mode", + name="NEW Filter mode: Enable chained filters with set operations", + description=( + "Enable chaining search filters with set operations: " + "ADD (union: combine sets), SUBTRACT (difference: remove from set), " + "FILTER (intersection: only elements in both sets), with autocomplete suggestions for filter values" + ), default=False, ) save_metadata_blend_file: BoolProperty( name="Save non ifc data to metadata blend File", - description="Save session data (window layout, settings) to a metadata blend file alongside the IFC file. This file is automatically loaded when opening the project.", + description=( + "Save session data (window layout, settings) to a metadata blend file alongside the IFC file. " + "This file is automatically loaded when opening the project." + ), default=False, ) metadata_blend_file_suffix: StringProperty( @@ -724,10 +743,11 @@ def update_cache_dir(self, context: bpy.types.Context) -> None: description="Custom suffix for the metadata blend file. Will be appended to the filename (without .ifc).", default=".ifc.metadata.blend", ) - user_ui_customization: BoolProperty( - name="User UI Customization", - description="Enable user interface customization features (hide/show tabs and panels, bookmark panels) and save the session settings as part of the metadata blend file", - default=False, + + decorator_font_scale: bpy.props.FloatProperty( + name="Decorator Font Scale", + description="Scale factor for decorator font size.", + default=1.0, ) if TYPE_CHECKING: @@ -754,6 +774,7 @@ def update_cache_dir(self, context: bpy.types.Context) -> None: bsdd_load_preview_dictionaries: bool bsdd_load_inactive_dictionaries: bool bsdd_load_test_dictionaries: bool + bsdd_baseurl: str should_disable_undo_on_save: bool should_stream: bool should_always_cache: bool @@ -766,11 +787,10 @@ def update_cache_dir(self, context: bpy.types.Context) -> None: doc: DocPreferences default_parameters: DefaultParameters container_hide_show_isolate: bool - mass_time_units_in_wizard: bool chain_filter_with_set_operations: bool - default_filter_with_set_operations_for_globalid_and_class: bool save_metadata_blend_file: bool - user_ui_customization: bool + metadata_blend_file_suffix: str + decorator_font_scale: float def draw(self, context: bpy.types.Context) -> None: layout = self.layout @@ -837,7 +857,11 @@ def draw_door_gizmo_parameters(self, layout: bpy.types.UILayout, context: bpy.ty gizmo_prop_names = {p.attr_name for p in GizmoDoorEdition.dimension_gizmo_props} # Add special gizmos not in dimension_gizmo_props gizmo_prop_names.update(("swing_arc", "flip_arc")) - for prop in door_gizmos.__annotations__: + try: + annotations = door_gizmos.__annotations__ + except AttributeError: + annotations = type(door_gizmos).__annotations__ + for prop in annotations: if prop in gizmo_prop_names: layout.prop(door_gizmos, prop) @@ -846,7 +870,11 @@ def draw_window_gizmo_parameters(self, layout: bpy.types.UILayout, context: bpy. window_gizmos = self.gizmos.window gizmo_prop_names = {p.attr_name for p in GizmoWindowEdition.dimension_gizmo_props} - for prop in window_gizmos.__annotations__: + try: + annotations = window_gizmos.__annotations__ + except AttributeError: + annotations = type(window_gizmos).__annotations__ + for prop in annotations: if prop in gizmo_prop_names: layout.prop(window_gizmos, prop) @@ -857,7 +885,11 @@ def draw_stair_gizmo_parameters(self, layout: bpy.types.UILayout, context: bpy.t gizmo_prop_names = {p.attr_name for p in GizmoStairEdition.dimension_gizmo_props} # Add special gizmos not in dimension_gizmo_props special_gizmo_names = {"lock", "plus", "minus", "cycle"} - for prop in stair_gizmos.__annotations__: + try: + annotations = stair_gizmos.__annotations__ + except AttributeError: + annotations = type(stair_gizmos).__annotations__ + for prop in annotations: if prop in gizmo_prop_names or prop in special_gizmo_names: layout.prop(stair_gizmos, prop) @@ -949,26 +981,39 @@ def draw_other_settings(self, layout: bpy.types.UILayout, context: bpy.types.Con layout.prop(self, "bsdd_load_preview_dictionaries") layout.prop(self, "bsdd_load_inactive_dictionaries") layout.prop(self, "bsdd_load_test_dictionaries") + layout.prop(self, "bsdd_baseurl") def draw_extras_settings(self, layout: bpy.types.UILayout, context: bpy.types.Context) -> None: layout.prop(self, "container_hide_show_isolate") - layout.prop(self, "mass_time_units_in_wizard") - layout.label(text="Filtering modes:") - box = layout.box() - row = box.row(align=True) + row = layout.row(align=True) row.prop(self, "chain_filter_with_set_operations") row.operator("bim.open_uri", text="", icon="HELP").uri = "https://community.osarch.org/discussion/3270" - row = box.row(align=True) - row.prop(self, "default_filter_with_set_operations_for_globalid_and_class") - row.operator("bim.open_uri", text="", icon="HELP").uri = "https://community.osarch.org/discussion/comment/27030" layout.prop(self, "save_metadata_blend_file") if self.save_metadata_blend_file: row = layout.row() row.separator() row.prop(self, "metadata_blend_file_suffix") - row = layout.row() - row.separator() - row.prop(self, "user_ui_customization") + + bprops = tool.Blender.get_bim_props() + if tab_visibilities := bprops.tab_visibilities: + row = layout.row() + row.operator("bim.reset_ui_layout", icon="LOOP_BACK") + row = layout.row(align=True) + row.template_list( + "BIM_UL_tab_visibilities", "", bprops, "tab_visibilities", bprops, "active_tab_visibility_index" + ) + row.template_list( + "BIM_UL_panel_visibilities", + "", + bprops, + "panel_visibilities", + bprops, + "active_panel_visibility_index", + ) + else: + row = layout.row() + row.operator("bim.manage_tab_visibility", icon="PREFERENCES") + layout.prop(self, "decorator_font_scale") # Scene panel groups @@ -984,78 +1029,30 @@ class BIM_PT_tabs(Panel): def draw(self, context): if not UIData.is_loaded: UIData.load() - is_ifc_project = bool(tool.Ifc.get()) - aprops = tool.Blender.get_area_props(context) - addon_prefs = tool.Blender.get_addon_preferences() - ifc_icon = f"{UIData.data['tabs_icon_color_mode']}_ifc" - - split = self.layout.split(factor=0.9) - col_left = split.column(align=True) - row_left = col_left.row(align=True) - row_left.alignment = "CENTER" - if get_tab_visibility("PROJECT"): - row_left.operator( - "bim.set_tab", - text="", - emboss=aprops.tab == "PROJECT", - icon_value=bonsai.bim.icons[ifc_icon].icon_id, - ).tab = "PROJECT" - if get_tab_visibility("OBJECT"): - self.draw_tab_entry(row_left, "FILE_3D", "OBJECT", is_ifc_project, aprops.tab == "OBJECT") - if get_tab_visibility("GEOMETRY"): - self.draw_tab_entry(row_left, "MATERIAL", "GEOMETRY", is_ifc_project, aprops.tab == "GEOMETRY") - if get_tab_visibility("DRAWINGS"): - self.draw_tab_entry(row_left, "DOCUMENTS", "DRAWINGS", is_ifc_project, aprops.tab == "DRAWINGS") - if get_tab_visibility("SERVICES"): - self.draw_tab_entry(row_left, "NETWORK_DRIVE", "SERVICES", is_ifc_project, aprops.tab == "SERVICES") - if get_tab_visibility("STRUCTURE"): - self.draw_tab_entry(row_left, "EDITMODE_HLT", "STRUCTURE", is_ifc_project, aprops.tab == "STRUCTURE") - if get_tab_visibility("SCHEDULING"): - self.draw_tab_entry(row_left, "NLA", "SCHEDULING", is_ifc_project, aprops.tab == "SCHEDULING") - if get_tab_visibility("FM"): - self.draw_tab_entry(row_left, "PACKAGE", "FM", True, aprops.tab == "FM") - if get_tab_visibility("QUALITY"): - self.draw_tab_entry(row_left, "COMMUNITY", "QUALITY", True, aprops.tab == "QUALITY") - if ( - addon_prefs.save_metadata_blend_file - and addon_prefs.user_ui_customization - and get_tab_visibility("BOOKMARK") - ): - self.draw_tab_entry(row_left, "SOLO_ON", "BOOKMARK", True, aprops.tab == "BOOKMARK") - row_left.operator("bim.switch_tab", text="", emboss=False, icon="UV_SYNC_SELECT") + aprops = tool.Blender.get_active_area_props(context) - row_left = col_left.row(align=True) - # Yes, that's right. - row_left.alignment = "CENTER" - row_left.scale_y = 0.2 + row = self.layout.row() + row.alignment = "CENTER" + for tab in UIData.data["tabs"]: + self.draw_tab_entry(row, tab[1], tab[0], tab[2], aprops.tab == tab[0]) + row.operator("bim.switch_tab", text="", emboss=False, icon="UV_SYNC_SELECT") - if not (addon_prefs.save_metadata_blend_file and addon_prefs.user_ui_customization): - row_left.prop(aprops, "inactive_tab", text="", icon="BLANK1", emboss=False) + row = self.layout.row() + # Yes, that's right. + row.alignment = "CENTER" + row.scale_y = 0.2 - for tab in get_tab_names(): + for tab in UIData.data["tabs"]: # Draw a little underscore below the active tab icon. - if get_tab_visibility(tab): - if aprops.tab == tab: - row_left.prop(aprops, "active_tab", text="", icon="BLANK1") - else: - row_left.prop(aprops, "inactive_tab", text="", icon="BLANK1", emboss=False) - row_left.prop(aprops, "inactive_tab", text="", icon="BLANK1", emboss=False) # space for Switch - col_right = split.column(align=True) - row_right = col_right.row(align=True) - row_right.alignment = "RIGHT" - - if addon_prefs.save_metadata_blend_file and addon_prefs.user_ui_customization: - row_right.operator("bim.manage_tab_visibility", icon="PREFERENCES", text="") + if aprops.tab == tab[0]: + row.prop(aprops, "active_tab", text="", icon="BLANK1") + else: + row.prop(aprops, "inactive_tab", text="", icon="BLANK1", emboss=False) + row.prop(aprops, "inactive_tab", text="", icon="BLANK1", emboss=False) # space for Switch - row = self.layout.row(align=True) + row = self.layout.row() row.prop(aprops, "tab", text="") - if addon_prefs.save_metadata_blend_file and addon_prefs.user_ui_customization: - for tab in get_tab_names(): - if get_tab_visibility(tab): - if aprops.tab == tab: - row.operator("bim.manage_tab_panels", text="", icon="PREFERENCES").tab_name = tab - if bonsai.REINSTALLED_BBIM_VERSION: box = self.layout.box() box.alert = True @@ -1119,9 +1116,14 @@ def draw(self, context): op = row.operator("bim.open_uri", text="", icon="QUESTION") op.uri = "https://docs.bonsaibim.org/guides/troubleshooting.html#incompatible-blender-features" - def draw_tab_entry(self, row, icon, tab_name, enabled=True, highlight=True): + def draw_tab_entry( + self, row: bpy.types.UILayout, icon: int | str, tab_name: str, enabled: bool = True, highlight: bool = True + ) -> None: tab_entry = row.row(align=True) - tab_entry.operator("bim.set_tab", text="", emboss=highlight, icon=icon).tab = tab_name + if isinstance(icon, int): + tab_entry.operator("bim.set_tab", text="", emboss=highlight, icon_value=icon).tab = tab_name + else: + tab_entry.operator("bim.set_tab", text="", emboss=highlight, icon=icon).tab = tab_name tab_entry.enabled = enabled @@ -1135,9 +1137,7 @@ class BIM_PT_tab_new_project_wizard(Panel): @classmethod def poll(cls, context): - if not should_show_panel(cls.bl_idname, cls.bim_tab_name, context): - return False - if not tool.Blender.is_tab(context, cls.bim_tab_name): + if not tool.Blender.should_show_panel(context, cls.bim_tab_name, cls.bl_idname): return False bim_props = tool.Blender.get_bim_props() pprops = tool.Project.get_project_props() @@ -1161,20 +1161,16 @@ class BIM_PT_tab_project_info(Panel): @classmethod def poll(cls, context): - if not should_show_panel(cls.bl_idname, cls.bim_tab_name, context): - return False - if tool.Blender.is_tab(context, cls.bim_tab_name): + if tool.Blender.should_show_panel(context, cls.bim_tab_name, cls.bl_idname): bim_props = tool.Blender.get_bim_props() pprops = tool.Project.get_project_props() if pprops.is_loading: return True elif tool.Ifc.get() or bim_props.ifc_file: return True - return tool.Blender.is_tab(context, "BOOKMARK") def draw(self, context): - layout = self.layout - layout.label(text="This is the Project Info panel.") + pass class BIM_PT_tab_spatial(Panel): @@ -1187,11 +1183,8 @@ class BIM_PT_tab_spatial(Panel): @classmethod def poll(cls, context): - if not should_show_panel(cls.bl_idname, cls.bim_tab_name, context): - return False - if tool.Blender.is_tab(context, cls.bim_tab_name) and tool.Ifc.get(): + if tool.Blender.should_show_panel(context, cls.bim_tab_name, cls.bl_idname) and tool.Ifc.get(): return True - return tool.Blender.is_tab(context, "BOOKMARK") def draw(self, context): pass @@ -1207,11 +1200,8 @@ class BIM_PT_tab_project_setup(Panel): @classmethod def poll(cls, context): - if not should_show_panel(cls.bl_idname, cls.bim_tab_name, context): - return False - if tool.Blender.is_tab(context, cls.bim_tab_name): + if tool.Blender.should_show_panel(context, cls.bim_tab_name, cls.bl_idname): return True - return tool.Blender.is_tab(context, "BOOKMARK") def draw(self, context): pass @@ -1228,11 +1218,8 @@ class BIM_PT_tab_stakeholders(Panel): @classmethod def poll(cls, context): - if not should_show_panel(cls.bl_idname, cls.bim_tab_name, context): - return False - if tool.Blender.is_tab(context, cls.bim_tab_name) and tool.Ifc.get(): + if tool.Blender.should_show_panel(context, cls.bim_tab_name, cls.bl_idname) and tool.Ifc.get(): return True - return tool.Blender.is_tab(context, "BOOKMARK") def draw(self, context): pass @@ -1248,11 +1235,8 @@ class BIM_PT_tab_collaboration(Panel): @classmethod def poll(cls, context): - if not should_show_panel(cls.bl_idname, cls.bim_tab_name, context): - return False - if tool.Blender.is_tab(context, cls.bim_tab_name): + if tool.Blender.should_show_panel(context, cls.bim_tab_name, cls.bl_idname): return True - return tool.Blender.is_tab(context, "BOOKMARK") def draw(self, context): pass @@ -1269,11 +1253,8 @@ class BIM_PT_tab_grouping_and_filtering(Panel): @classmethod def poll(cls, context): - if not should_show_panel(cls.bl_idname, cls.bim_tab_name, context): - return False - if tool.Blender.is_tab(context, cls.bim_tab_name) and tool.Ifc.get(): + if tool.Blender.should_show_panel(context, cls.bim_tab_name, cls.bl_idname) and tool.Ifc.get(): return True - return tool.Blender.is_tab(context, "BOOKMARK") def draw(self, context): pass @@ -1297,11 +1278,8 @@ class BIM_PT_tab_geometry(Panel): @classmethod def poll(cls, context): - if not should_show_panel(cls.bl_idname, cls.bim_tab_name, context): - return False - if tool.Blender.is_tab(context, cls.bim_tab_name) and tool.Ifc.get(): + if tool.Blender.should_show_panel(context, cls.bim_tab_name, cls.bl_idname) and tool.Ifc.get(): return True - return tool.Blender.is_tab(context, "BOOKMARK") def draw(self, context): pass @@ -1317,11 +1295,8 @@ class BIM_PT_tab_status(Panel): @classmethod def poll(cls, context): - if not should_show_panel(cls.bl_idname, cls.bim_tab_name, context): - return False - if tool.Blender.is_tab(context, cls.bim_tab_name) and tool.Ifc.get(): + if tool.Blender.should_show_panel(context, cls.bim_tab_name, cls.bl_idname) and tool.Ifc.get(): return True - return tool.Blender.is_tab(context, "BOOKMARK") def draw(self, context): pass @@ -1337,11 +1312,8 @@ class BIM_PT_tab_qto(Panel): @classmethod def poll(cls, context): - if not should_show_panel(cls.bl_idname, cls.bim_tab_name, context): - return False - if tool.Blender.is_tab(context, cls.bim_tab_name) and tool.Ifc.get(): + if tool.Blender.should_show_panel(context, cls.bim_tab_name, cls.bl_idname) and tool.Ifc.get(): return True - return tool.Blender.is_tab(context, "BOOKMARK") def draw(self, context): pass @@ -1357,11 +1329,8 @@ class BIM_PT_tab_resources(Panel): @classmethod def poll(cls, context): - if not should_show_panel(cls.bl_idname, cls.bim_tab_name, context): - return False - if tool.Blender.is_tab(context, cls.bim_tab_name) and tool.Ifc.get(): + if tool.Blender.should_show_panel(context, cls.bim_tab_name, cls.bl_idname) and tool.Ifc.get(): return True - return tool.Blender.is_tab(context, "BOOKMARK") def draw(self, context): pass @@ -1377,11 +1346,8 @@ class BIM_PT_tab_cost(Panel): @classmethod def poll(cls, context): - if not should_show_panel(cls.bl_idname, cls.bim_tab_name, context): - return False - if tool.Blender.is_tab(context, cls.bim_tab_name) and tool.Ifc.get(): + if tool.Blender.should_show_panel(context, cls.bim_tab_name, cls.bl_idname) and tool.Ifc.get(): return True - return tool.Blender.is_tab(context, "BOOKMARK") def draw(self, context): pass @@ -1397,11 +1363,8 @@ class BIM_PT_tab_sequence(Panel): @classmethod def poll(cls, context): - if not should_show_panel(cls.bl_idname, cls.bim_tab_name, context): - return False - if tool.Blender.is_tab(context, cls.bim_tab_name) and tool.Ifc.get(): + if tool.Blender.should_show_panel(context, cls.bim_tab_name, cls.bl_idname) and tool.Ifc.get(): return True - return tool.Blender.is_tab(context, "BOOKMARK") def draw(self, context): pass @@ -1417,11 +1380,8 @@ class BIM_PT_tab_structural(Panel): @classmethod def poll(cls, context): - if not should_show_panel(cls.bl_idname, cls.bim_tab_name, context): - return False - if tool.Blender.is_tab(context, cls.bim_tab_name) and tool.Ifc.get(): + if tool.Blender.should_show_panel(context, cls.bim_tab_name, cls.bl_idname) and tool.Ifc.get(): return True - return tool.Blender.is_tab(context, "BOOKMARK") def draw(self, context): pass @@ -1437,11 +1397,8 @@ class BIM_PT_tab_services(Panel): @classmethod def poll(cls, context): - if not should_show_panel(cls.bl_idname, cls.bim_tab_name, context): - return False - if tool.Blender.is_tab(context, cls.bim_tab_name) and tool.Ifc.get(): + if tool.Blender.should_show_panel(context, cls.bim_tab_name, cls.bl_idname) and tool.Ifc.get(): return True - return tool.Blender.is_tab(context, "BOOKMARK") def draw(self, context): pass @@ -1457,11 +1414,8 @@ class BIM_PT_tab_lighting(Panel): @classmethod def poll(cls, context): - if not should_show_panel(cls.bl_idname, cls.bim_tab_name, context): - return False - if tool.Blender.is_tab(context, cls.bim_tab_name) and tool.Ifc.get(): + if tool.Blender.should_show_panel(context, cls.bim_tab_name, cls.bl_idname) and tool.Ifc.get(): return True - return tool.Blender.is_tab(context, "BOOKMARK") def draw(self, context): pass @@ -1477,11 +1431,8 @@ class BIM_PT_tab_zones(Panel): @classmethod def poll(cls, context): - if not should_show_panel(cls.bl_idname, cls.bim_tab_name, context): - return False - if tool.Blender.is_tab(context, cls.bim_tab_name) and tool.Ifc.get(): + if tool.Blender.should_show_panel(context, cls.bim_tab_name, cls.bl_idname) and tool.Ifc.get(): return True - return tool.Blender.is_tab(context, "BOOKMARK") def draw(self, context): pass @@ -1497,11 +1448,8 @@ class BIM_PT_tab_solar_analysis(Panel): @classmethod def poll(cls, context): - if not should_show_panel(cls.bl_idname, cls.bim_tab_name, context): - return False - if tool.Blender.is_tab(context, cls.bim_tab_name) and tool.Ifc.get(): + if tool.Blender.should_show_panel(context, cls.bim_tab_name, cls.bl_idname) and tool.Ifc.get(): return True - return tool.Blender.is_tab(context, "BOOKMARK") def draw(self, context): pass @@ -1517,11 +1465,8 @@ class BIM_PT_tab_quality_control(Panel): @classmethod def poll(cls, context): - if not should_show_panel(cls.bl_idname, cls.bim_tab_name, context): - return False - if tool.Blender.is_tab(context, cls.bim_tab_name): + if tool.Blender.should_show_panel(context, cls.bim_tab_name, cls.bl_idname): return True - return tool.Blender.is_tab(context, "BOOKMARK") def draw(self, context): pass @@ -1537,11 +1482,8 @@ class BIM_PT_tab_clash_detection(Panel): @classmethod def poll(cls, context): - if not should_show_panel(cls.bl_idname, cls.bim_tab_name, context): - return False - if tool.Blender.is_tab(context, cls.bim_tab_name): + if tool.Blender.should_show_panel(context, cls.bim_tab_name, cls.bl_idname): return True - return tool.Blender.is_tab(context, "BOOKMARK") def draw(self, context): pass @@ -1558,11 +1500,8 @@ class BIM_PT_tab_sandbox(Panel): @classmethod def poll(cls, context): - if not should_show_panel(cls.bl_idname, cls.bim_tab_name, context): - return False - if tool.Blender.is_tab(context, cls.bim_tab_name): + if tool.Blender.should_show_panel(context, cls.bim_tab_name, cls.bl_idname): return True - return tool.Blender.is_tab(context, "BOOKMARK") def draw(self, context): row = self.layout.row() @@ -1581,11 +1520,9 @@ class BIM_PT_tab_object_metadata(Panel): @classmethod def poll(cls, context): - if not should_show_panel(cls.bl_idname, cls.bim_tab_name, context): - return False props = tool.Project.get_project_props() if ( - tool.Blender.is_tab(context, cls.bim_tab_name) + tool.Blender.should_show_panel(context, cls.bim_tab_name, cls.bl_idname) and tool.Ifc.get() and (obj := context.active_object) # Hide links empty handles. @@ -1596,7 +1533,6 @@ def poll(cls, context): ) ): return True - return tool.Blender.is_tab(context, "BOOKMARK") def draw(self, context): pass @@ -1613,16 +1549,13 @@ class BIM_PT_tab_placement(Panel): @classmethod def poll(cls, context): - if not should_show_panel(cls.bl_idname, cls.bim_tab_name, context): - return False if ( - tool.Blender.is_tab(context, cls.bim_tab_name) + tool.Blender.should_show_panel(context, cls.bim_tab_name, cls.bl_idname) and tool.Ifc.get() and (obj := context.active_object) and tool.Ifc.get_entity(obj) ): return True - return tool.Blender.is_tab(context, "BOOKMARK") def draw(self, context): pass @@ -1639,11 +1572,8 @@ class BIM_PT_tab_representations(Panel): @classmethod def poll(cls, context): - if not should_show_panel(cls.bl_idname, cls.bim_tab_name, context): - return False - if tool.Blender.is_tab(context, cls.bim_tab_name) and tool.Ifc.get(): + if tool.Blender.should_show_panel(context, cls.bim_tab_name, cls.bl_idname) and tool.Ifc.get(): return True - return tool.Blender.is_tab(context, "BOOKMARK") def draw(self, context): pass @@ -1661,11 +1591,8 @@ class BIM_PT_tab_geometric_relationships(Panel): @classmethod def poll(cls, context): - if not should_show_panel(cls.bl_idname, cls.bim_tab_name, context): - return False - if tool.Blender.is_tab(context, cls.bim_tab_name) and tool.Ifc.get(): + if tool.Blender.should_show_panel(context, cls.bim_tab_name, cls.bl_idname) and tool.Ifc.get(): return True - return tool.Blender.is_tab(context, "BOOKMARK") def draw(self, context): pass @@ -1683,11 +1610,8 @@ class BIM_PT_tab_parametric_geometry(Panel): @classmethod def poll(cls, context): - if not should_show_panel(cls.bl_idname, cls.bim_tab_name, context): - return False - if tool.Blender.is_tab(context, cls.bim_tab_name) and tool.Ifc.get(): + if tool.Blender.should_show_panel(context, cls.bim_tab_name, cls.bl_idname) and tool.Ifc.get(): return True - return tool.Blender.is_tab(context, "BOOKMARK") def draw(self, context): pass @@ -1704,11 +1628,8 @@ class BIM_PT_tab_object_materials(Panel): @classmethod def poll(cls, context): - if not should_show_panel(cls.bl_idname, cls.bim_tab_name, context): - return False - if tool.Blender.is_tab(context, cls.bim_tab_name) and tool.Ifc.get(): + if tool.Blender.should_show_panel(context, cls.bim_tab_name, cls.bl_idname) and tool.Ifc.get(): return True - return tool.Blender.is_tab(context, "BOOKMARK") def draw(self, context): pass @@ -1725,11 +1646,8 @@ class BIM_PT_tab_materials(Panel): @classmethod def poll(cls, context): - if not should_show_panel(cls.bl_idname, cls.bim_tab_name, context): - return False - if tool.Blender.is_tab(context, cls.bim_tab_name) and tool.Ifc.get(): + if tool.Blender.should_show_panel(context, cls.bim_tab_name, cls.bl_idname) and tool.Ifc.get(): return True - return tool.Blender.is_tab(context, "BOOKMARK") def draw(self, context): pass @@ -1746,11 +1664,8 @@ class BIM_PT_tab_styles(Panel): @classmethod def poll(cls, context): - if not should_show_panel(cls.bl_idname, cls.bim_tab_name, context): - return False - if tool.Blender.is_tab(context, cls.bim_tab_name) and tool.Ifc.get(): + if tool.Blender.should_show_panel(context, cls.bim_tab_name, cls.bl_idname) and tool.Ifc.get(): return True - return tool.Blender.is_tab(context, "BOOKMARK") def draw(self, context): pass @@ -1767,11 +1682,8 @@ class BIM_PT_tab_profiles(Panel): @classmethod def poll(cls, context): - if not should_show_panel(cls.bl_idname, cls.bim_tab_name, context): - return False - if tool.Blender.is_tab(context, cls.bim_tab_name) and tool.Ifc.get(): + if tool.Blender.should_show_panel(context, cls.bim_tab_name, cls.bl_idname) and tool.Ifc.get(): return True - return tool.Blender.is_tab(context, "BOOKMARK") def draw(self, context): pass @@ -1788,11 +1700,8 @@ class BIM_PT_tab_sheets(Panel): @classmethod def poll(cls, context): - if not should_show_panel(cls.bl_idname, cls.bim_tab_name, context): - return False - if tool.Blender.is_tab(context, cls.bim_tab_name) and tool.Ifc.get(): + if tool.Blender.should_show_panel(context, cls.bim_tab_name, cls.bl_idname) and tool.Ifc.get(): return True - return tool.Blender.is_tab(context, "BOOKMARK") def draw(self, context): pass @@ -1809,11 +1718,8 @@ class BIM_PT_tab_drawings(Panel): @classmethod def poll(cls, context): - if not should_show_panel(cls.bl_idname, cls.bim_tab_name, context): - return False - if tool.Blender.is_tab(context, cls.bim_tab_name) and tool.Ifc.get(): + if tool.Blender.should_show_panel(context, cls.bim_tab_name, cls.bl_idname) and tool.Ifc.get(): return True - return tool.Blender.is_tab(context, "BOOKMARK") def draw(self, context): pass @@ -1830,11 +1736,8 @@ class BIM_PT_tab_schedules(Panel): @classmethod def poll(cls, context): - if not should_show_panel(cls.bl_idname, cls.bim_tab_name, context): - return False - if tool.Blender.is_tab(context, cls.bim_tab_name) and tool.Ifc.get(): + if tool.Blender.should_show_panel(context, cls.bim_tab_name, cls.bl_idname) and tool.Ifc.get(): return True - return tool.Blender.is_tab(context, "BOOKMARK") def draw(self, context): pass @@ -1851,11 +1754,8 @@ class BIM_PT_tab_references(Panel): @classmethod def poll(cls, context): - if not should_show_panel(cls.bl_idname, cls.bim_tab_name, context): - return False - if tool.Blender.is_tab(context, cls.bim_tab_name) and tool.Ifc.get(): + if tool.Blender.should_show_panel(context, cls.bim_tab_name, cls.bl_idname) and tool.Ifc.get(): return True - return tool.Blender.is_tab(context, "BOOKMARK") def draw(self, context): pass @@ -1873,11 +1773,8 @@ class BIM_PT_tab_misc(Panel): @classmethod def poll(cls, context): - if not should_show_panel(cls.bl_idname, cls.bim_tab_name, context): - return False - if tool.Blender.is_tab(context, cls.bim_tab_name) and tool.Ifc.get(): + if tool.Blender.should_show_panel(context, cls.bim_tab_name, cls.bl_idname) and tool.Ifc.get(): return True - return tool.Blender.is_tab(context, "BOOKMARK") def draw(self, context): pass @@ -1894,11 +1791,8 @@ class BIM_PT_tab_handover(Panel): @classmethod def poll(cls, context): - if not should_show_panel(cls.bl_idname, cls.bim_tab_name, context): - return False - if tool.Blender.is_tab(context, cls.bim_tab_name): + if tool.Blender.should_show_panel(context, cls.bim_tab_name, cls.bl_idname): return True - return tool.Blender.is_tab(context, "BOOKMARK") def draw(self, context): pass @@ -1915,11 +1809,8 @@ class BIM_PT_tab_operations(Panel): @classmethod def poll(cls, context): - if not should_show_panel(cls.bl_idname, cls.bim_tab_name, context): - return False - if tool.Blender.is_tab(context, cls.bim_tab_name): + if tool.Blender.should_show_panel(context, cls.bim_tab_name, cls.bl_idname): return True - return tool.Blender.is_tab(context, "BOOKMARK") def draw(self, context): pass @@ -1960,8 +1851,8 @@ class UIData: def load(cls): cls.data = { "version": cls.version(), - "tabs_icon_color_mode": cls.icon_color_mode("user_interface.wcol_regular.text"), "menu_icon_color_mode": cls.icon_color_mode("user_interface.wcol_menu.text"), + "tabs": cls.tabs(), } cls.is_loaded = True @@ -1973,6 +1864,28 @@ def version(cls): def icon_color_mode(cls, color_path): return tool.Blender.detect_icon_color_mode(color_path) + @classmethod + def tabs(cls): + hidden_tabs = [t.name for t in tool.Blender.get_bim_props().tab_visibilities if not t.is_visible] + color_mode = cls.icon_color_mode("user_interface.wcol_regular.text") + is_ifc_project = bool(tool.Ifc.get()) + return [ + tab + for tab in [ + ("PROJECT", bonsai.bim.icons[f"{color_mode}_ifc"].icon_id, True), + ("OBJECT", "FILE_3D", is_ifc_project), + ("GEOMETRY", "MATERIAL", is_ifc_project), + ("DRAWINGS", "DOCUMENTS", is_ifc_project), + ("SERVICES", "NETWORK_DRIVE", is_ifc_project), + ("STRUCTURE", "EDITMODE_HLT", is_ifc_project), + ("SCHEDULING", "NLA", is_ifc_project), + ("FM", "PACKAGE", True), + ("QUALITY", "COMMUNITY", True), + ("BOOKMARK", "SOLO_ON", is_ifc_project), + ] + if tab[0] not in hidden_tabs + ] + def draw_statusbar(self, context): if not UIData.is_loaded: diff --git a/src/bonsai/bonsai/core/aggregate.py b/src/bonsai/bonsai/core/aggregate.py index a1f27233381..0b6719a1801 100644 --- a/src/bonsai/bonsai/core/aggregate.py +++ b/src/bonsai/bonsai/core/aggregate.py @@ -17,11 +17,13 @@ # along with Bonsai. If not, see . from __future__ import annotations + from typing import TYPE_CHECKING, Optional, Union if TYPE_CHECKING: import bpy import ifcopenshell + import bonsai.tool as tool diff --git a/src/bonsai/bonsai/core/attribute.py b/src/bonsai/bonsai/core/attribute.py index fd41beda7a9..803cc353bf8 100644 --- a/src/bonsai/bonsai/core/attribute.py +++ b/src/bonsai/bonsai/core/attribute.py @@ -17,11 +17,11 @@ # along with Bonsai. If not, see . from __future__ import annotations + from typing import TYPE_CHECKING, Union if TYPE_CHECKING: - import bpy - import ifcopenshell + import bonsai.tool as tool diff --git a/src/bonsai/bonsai/core/brick.py b/src/bonsai/bonsai/core/brick.py index b285377d862..95b673f88b0 100644 --- a/src/bonsai/bonsai/core/brick.py +++ b/src/bonsai/bonsai/core/brick.py @@ -17,11 +17,12 @@ # along with Bonsai. If not, see . from __future__ import annotations -from typing import TYPE_CHECKING, Optional, Union + +from typing import TYPE_CHECKING, Union if TYPE_CHECKING: - import bpy import ifcopenshell + import bonsai.tool as tool diff --git a/src/bonsai/bonsai/core/bsdd.py b/src/bonsai/bonsai/core/bsdd.py index 3bb4513d403..55268c131f4 100644 --- a/src/bonsai/bonsai/core/bsdd.py +++ b/src/bonsai/bonsai/core/bsdd.py @@ -17,12 +17,11 @@ # along with Bonsai. If not, see . from __future__ import annotations -from typing import TYPE_CHECKING, Optional, Any + +from typing import TYPE_CHECKING if TYPE_CHECKING: - import bpy - import ifcopenshell - import bsdd + import bonsai.tool as tool diff --git a/src/bonsai/bonsai/core/context.py b/src/bonsai/bonsai/core/context.py index 626720fb339..7ea77fc2e82 100644 --- a/src/bonsai/bonsai/core/context.py +++ b/src/bonsai/bonsai/core/context.py @@ -17,11 +17,12 @@ # along with Bonsai. If not, see . from __future__ import annotations + from typing import TYPE_CHECKING, Optional if TYPE_CHECKING: - import bpy import ifcopenshell + import bonsai.tool as tool diff --git a/src/bonsai/bonsai/core/cost.py b/src/bonsai/bonsai/core/cost.py index fe55d3c31cb..66067cf36e5 100644 --- a/src/bonsai/bonsai/core/cost.py +++ b/src/bonsai/bonsai/core/cost.py @@ -17,12 +17,13 @@ # along with Bonsai. If not, see . from __future__ import annotations -from typing import TYPE_CHECKING, Optional, Union, Literal + +from typing import TYPE_CHECKING, Literal, Optional, Union if TYPE_CHECKING: - import bpy import ifcopenshell import ifcopenshell.util.cost + import bonsai.tool as tool diff --git a/src/bonsai/bonsai/core/covering.py b/src/bonsai/bonsai/core/covering.py index ffc140dac65..2ab0d39cc4f 100644 --- a/src/bonsai/bonsai/core/covering.py +++ b/src/bonsai/bonsai/core/covering.py @@ -17,11 +17,11 @@ # along with Bonsai. If not, see . from __future__ import annotations -from typing import TYPE_CHECKING, Optional + +from typing import TYPE_CHECKING if TYPE_CHECKING: - import bpy - import ifcopenshell + import bonsai.tool as tool @@ -51,21 +51,11 @@ def add_instance_flooring_covering_from_cursor( if isinstance(space_polygon, str): return - bm = spatial.get_bmesh_from_polygon(space_polygon, h=0, polygon_is_si=True) - name = "Covering" - mesh = spatial.get_named_mesh_from_bmesh(name=name, bmesh=bm) - - obj = spatial.get_named_obj_from_mesh(name, mesh) - + obj = spatial.create_object("Covering") spatial.set_obj_origin_to_cursor_position_and_zero_elevation(obj) spatial.translate_obj_to_z_location(obj, z) - points = spatial.get_2d_vertices_from_obj(obj) - points = spatial.get_scaled_2d_vertices(points) spatial.assign_type_to_obj(obj) - - spatial.assign_swept_area_outer_curve_from_2d_vertices(obj, vertices=points) - body = spatial.get_body_representation(obj) - spatial.regen_obj_representation(obj, body) + spatial.set_covering_representation_from_polygon(obj, space_polygon, polygon_is_si=True) def add_instance_ceiling_covering_from_cursor( @@ -95,21 +85,11 @@ def add_instance_ceiling_covering_from_cursor( if isinstance(space_polygon, str): return - bm = spatial.get_bmesh_from_polygon(space_polygon, h=0, polygon_is_si=True) - name = "Covering" - mesh = spatial.get_named_mesh_from_bmesh(name=name, bmesh=bm) - - obj = spatial.get_named_obj_from_mesh(name, mesh) - + obj = spatial.create_object("Covering") spatial.set_obj_origin_to_cursor_position_and_zero_elevation(obj) spatial.translate_obj_to_z_location(obj, z + ceiling_height) - points = spatial.get_2d_vertices_from_obj(obj) - points = spatial.get_scaled_2d_vertices(points) spatial.assign_type_to_obj(obj) - - spatial.assign_swept_area_outer_curve_from_2d_vertices(obj, vertices=points) - body = spatial.get_body_representation(obj) - spatial.regen_obj_representation(obj, body) + spatial.set_covering_representation_from_polygon(obj, space_polygon, polygon_is_si=True) def regen_selected_covering_object(root: type[tool.Root], spatial: type[tool.Spatial]) -> None: @@ -127,19 +107,7 @@ def regen_selected_covering_object(root: type[tool.Root], spatial: type[tool.Spa if isinstance(space_polygon, str): return - bm = spatial.get_bmesh_from_polygon(space_polygon, h=0, polygon_is_si=True) - - name = "Aux" - mesh = spatial.get_named_mesh_from_bmesh(name=name, bmesh=bm) - mesh = spatial.get_transformed_mesh_from_local_to_global(mesh) - obj = spatial.get_named_obj_from_mesh(name, mesh) - - points = spatial.get_2d_vertices_from_obj(obj) - points = spatial.get_scaled_2d_vertices(points) - - spatial.assign_swept_area_outer_curve_from_2d_vertices(active_obj, vertices=points) - body = spatial.get_body_representation(active_obj) - spatial.regen_obj_representation(active_obj, body) + spatial.set_covering_representation_from_polygon(active_obj, space_polygon, polygon_is_si=True) # TODO CHECK IF IT IS POSSIBLE TO CREATE ONLY ONE CORE FUNCTION FOR _FROM_WALLS @@ -151,22 +119,13 @@ def add_instance_flooring_coverings_from_walls(root: type[tool.Root], spatial: t union = spatial.get_union_shape_from_selected_objects() for i, linear_ring in enumerate(union.interiors): poly = spatial.get_buffered_poly_from_linear_ring(linear_ring) - bm = spatial.get_bmesh_from_polygon(poly, h=0, polygon_is_si=False) name = "Covering" + str(i) - obj = spatial.get_named_obj_from_bmesh(name, bmesh=bm) - - spatial.set_obj_origin_to_bboxcenter(obj) + obj = spatial.create_object(name) + spatial.set_obj_origin_to_polygon_center(obj, poly, polygon_is_si=False) spatial.translate_obj_to_z_location(obj, z) - - points = spatial.get_2d_vertices_from_obj(obj) - points = spatial.get_scaled_2d_vertices(points) - spatial.assign_type_to_obj(obj) - - spatial.assign_swept_area_outer_curve_from_2d_vertices(obj, vertices=points) - body = spatial.get_body_representation(obj) - spatial.regen_obj_representation(obj, body) + spatial.set_covering_representation_from_polygon(obj, poly, polygon_is_si=False) def add_instance_ceiling_coverings_from_walls( @@ -179,22 +138,13 @@ def add_instance_ceiling_coverings_from_walls( union = spatial.get_union_shape_from_selected_objects() for i, linear_ring in enumerate(union.interiors): poly = spatial.get_buffered_poly_from_linear_ring(linear_ring) - bm = spatial.get_bmesh_from_polygon(poly, h=0, polygon_is_si=False) name = "Covering" + str(i) - obj = spatial.get_named_obj_from_bmesh(name, bmesh=bm) - - spatial.set_obj_origin_to_bboxcenter(obj) + obj = spatial.create_object(name) + spatial.set_obj_origin_to_polygon_center(obj, poly, polygon_is_si=False) spatial.translate_obj_to_z_location(obj, z) - - points = spatial.get_2d_vertices_from_obj(obj) - points = spatial.get_scaled_2d_vertices(points) - spatial.assign_type_to_obj(obj) - - spatial.assign_swept_area_outer_curve_from_2d_vertices(obj, vertices=points) - body = spatial.get_body_representation(obj) - spatial.regen_obj_representation(obj, body) + spatial.set_covering_representation_from_polygon(obj, poly, polygon_is_si=False) class NoDefaultContainer(Exception): diff --git a/src/bonsai/bonsai/core/debug.py b/src/bonsai/bonsai/core/debug.py index 2446a6e148a..3702a9cca3e 100644 --- a/src/bonsai/bonsai/core/debug.py +++ b/src/bonsai/bonsai/core/debug.py @@ -18,11 +18,11 @@ from __future__ import annotations -from typing import TYPE_CHECKING, Optional + +from typing import TYPE_CHECKING if TYPE_CHECKING: - import bpy - import ifcopenshell + import bonsai.tool as tool diff --git a/src/bonsai/bonsai/core/document.py b/src/bonsai/bonsai/core/document.py index e82360dbb9b..b7fe4ef2e54 100644 --- a/src/bonsai/bonsai/core/document.py +++ b/src/bonsai/bonsai/core/document.py @@ -17,113 +17,94 @@ # along with Bonsai. If not, see . from __future__ import annotations -from typing import TYPE_CHECKING, Optional + +from typing import TYPE_CHECKING if TYPE_CHECKING: - import bpy import ifcopenshell + import bonsai.tool as tool def load_project_documents(document: tool.Document) -> None: document.clear_document_tree() document.import_project_documents() - document.clear_breadcrumbs() document.enable_editing_ui() -def load_document(document_tool: tool.Document, document: ifcopenshell.entity_instance) -> None: - document_tool.clear_document_tree() - document_tool.import_subdocuments(document) - document_tool.import_references(document) - document_tool.disable_editing_document() - document_tool.add_breadcrumb(document) - - -def load_parent_document(document: tool.Document) -> None: - document.clear_document_tree() - document.remove_latest_breadcrumb() - parent = document.get_active_breadcrumb() - if parent: - document.import_subdocuments(parent) - document.import_references(parent) - document.disable_editing_document() - else: - document.import_project_documents() - - def disable_document_editing_ui(document: tool.Document) -> None: document.disable_editing_ui() document.disable_editing_document() -def enable_editing_document(document_tool: tool.Document, document: ifcopenshell.entity_instance) -> None: - document_tool.import_document_attributes(document) - document_tool.set_active_document(document) +def disable_object_document_editing_ui(document: tool.Document) -> None: + document.disable_object_editing_ui() + + +def enable_editing_document(document: tool.Document, ifc_document: ifcopenshell.entity_instance) -> None: + document.set_active_document(ifc_document) + document.import_document_attributes(ifc_document) def disable_editing_document(document: tool.Document) -> None: - document.disable_editing_document() + document.clear_active_document() + document.clear_document_attributes() -def add_information(ifc: tool.Ifc, document: tool.Document) -> None: +def add_information(ifc: tool.Ifc, document: tool.Document, parent=None) -> ifcopenshell.entity_instance: document.clear_document_tree() - parent = document.get_active_breadcrumb() + + if parent is None: + parent = document.get_default_parent_for_information() + information = ifc.run("document.add_information", parent=parent) ifc.run("document.add_reference", information=information) - if parent: - document.import_subdocuments(parent) - document.import_references(parent) - else: - document.import_project_documents() + if document.is_document_information(parent): + document.expand_document(parent) -def add_reference(ifc: tool.Ifc, document: tool.Document) -> None: - parent = document.get_active_breadcrumb() - assert parent - ifc.run("document.add_reference", information=parent) - document.clear_document_tree() - document.import_subdocuments(parent) - document.import_references(parent) + document.import_project_documents() + return information -def edit_document(ifc: tool.Ifc, document_tool: tool.Document, document: ifcopenshell.entity_instance) -> None: - attributes = document_tool.export_document_attributes() - if document_tool.is_document_information(document): - ifc.run("document.edit_information", information=document, attributes=attributes) - else: - ifc.run("document.edit_reference", reference=document, attributes=attributes) - document_tool.disable_editing_document() - document_tool.clear_document_tree() - parent = document_tool.get_active_breadcrumb() +def add_reference(ifc: tool.Ifc, document: tool.Document) -> None: + parent = document.get_selected_document_information() + if parent: - document_tool.import_subdocuments(parent) - document_tool.import_references(parent) - else: - document_tool.import_project_documents() + reference = ifc.run("document.add_reference", information=parent) + reference.Location = "" + document.expand_document(parent) + + document.import_project_documents() -def remove_document(ifc: tool.Ifc, document_tool: tool.Document, document: ifcopenshell.entity_instance) -> None: - document_tool.clear_document_tree() - if document_tool.is_document_information(document): - ifc.run("document.remove_information", information=document) +def edit_document(ifc: tool.Ifc, document: tool.Document, ifc_document: ifcopenshell.entity_instance) -> None: + attributes = document.export_document_attributes() + if document.is_document_information(ifc_document): + ifc.run("document.edit_information", information=ifc_document, attributes=attributes) else: - ifc.run("document.remove_reference", reference=document) - parent = document_tool.get_active_breadcrumb() - if parent: - document_tool.import_subdocuments(parent) - document_tool.import_references(parent) + ifc.run("document.edit_reference", reference=ifc_document, attributes=attributes) + document.disable_editing_document() + document.clear_document_tree() + document.import_project_documents() + + +def remove_document(ifc: tool.Ifc, document: tool.Document, ifc_document: ifcopenshell.entity_instance) -> None: + document.clear_document_tree() + if document.is_document_information(ifc_document): + ifc.run("document.remove_information", information=ifc_document) else: - document_tool.import_project_documents() + ifc.run("document.remove_reference", reference=ifc_document) + document.import_project_documents() def assign_document( - ifc: tool.Ifc, product: ifcopenshell.entity_instance, document: ifcopenshell.entity_instance + ifc: tool.Ifc, product: ifcopenshell.entity_instance, ifc_document: ifcopenshell.entity_instance ) -> None: - ifc.run("document.assign_document", products=[product], document=document) + ifc.run("document.assign_document", products=[product], document=ifc_document) def unassign_document( - ifc: tool.Ifc, product: ifcopenshell.entity_instance, document: ifcopenshell.entity_instance + ifc: tool.Ifc, product: ifcopenshell.entity_instance, ifc_document: ifcopenshell.entity_instance ) -> None: - ifc.run("document.unassign_document", products=[product], document=document) + ifc.run("document.unassign_document", products=[product], document=ifc_document) diff --git a/src/bonsai/bonsai/core/drawing.py b/src/bonsai/bonsai/core/drawing.py index 407bb19cb01..5db2ced03e0 100644 --- a/src/bonsai/bonsai/core/drawing.py +++ b/src/bonsai/bonsai/core/drawing.py @@ -17,13 +17,15 @@ # along with Bonsai. If not, see . from __future__ import annotations + from pathlib import Path -from typing import TYPE_CHECKING, Optional, Union, Literal +from typing import TYPE_CHECKING, Literal, Optional, Union if TYPE_CHECKING: import bpy import ifcopenshell import ifcopenshell.util.representation + import bonsai.tool as tool @@ -37,12 +39,44 @@ def disable_editing_text(drawing: type[tool.Drawing], obj: bpy.types.Object) -> def edit_text(drawing: type[tool.Drawing], obj: bpy.types.Object) -> None: - drawing.synchronise_ifc_and_text_attributes(obj) - drawing.update_text_size_pset(obj) - drawing.update_text_annotation_properties(obj) + literal_attributes = drawing.export_text_literal_attributes(obj) + drawing.edit_text_font_size(obj, drawing.export_font_size(obj)) + drawing.edit_text_wrap_length(obj, drawing.export_wrap_length(obj)) + drawing.edit_text_symbol(obj, drawing.export_symbol(obj)) + drawing.edit_text_literals(obj, literal_attributes) drawing.disable_editing_text(obj) +def copy_text_to_selection( + drawing: type[tool.Drawing], + attribute: Literal["FONT_SIZE", "ALIGNMENT", "WRAP_LENGTH", "SYMBOL", "LITERALS"], + attribute_obj: bpy.types.Object, + apply_objs: list[bpy.types.Object], +) -> None: + if attribute == "FONT_SIZE": + data = drawing.export_font_size(attribute_obj) + elif attribute == "ALIGNMENT": + data = drawing.export_alignment(attribute_obj) + elif attribute == "WRAP_LENGTH": + data = drawing.export_wrap_length(attribute_obj) + elif attribute == "SYMBOL": + data = drawing.export_symbol(attribute_obj) + elif attribute == "LITERALS": + data = drawing.export_text_literal_attributes(attribute_obj) + for obj in apply_objs: + if attribute == "FONT_SIZE": + drawing.edit_text_font_size(obj, data) + elif attribute == "ALIGNMENT": + drawing.edit_text_alignment(obj, data) + elif attribute == "WRAP_LENGTH": + drawing.edit_text_wrap_length(obj, data) + elif attribute == "SYMBOL": + drawing.edit_text_symbol(obj, data) + elif attribute == "LITERALS": + drawing.edit_text_literals(obj, data) + drawing.disable_editing_text(obj) + + def enable_editing_assigned_product(drawing: type[tool.Drawing], obj: bpy.types.Object) -> None: drawing.enable_editing_assigned_product(obj) drawing.import_assigned_product(obj) @@ -398,11 +432,8 @@ def update_drawing_name( if drawing_tool.get_name(drawing) != name: ifc.run("attribute.edit_attributes", product=drawing, attributes={"Name": name}) - # Update the camera object name - camera = ifc.get_object(drawing) - if camera and camera.name != name: - camera.name = name - + drawing_tool.set_camera_name(drawing, name) + group = drawing_tool.get_drawing_group(drawing) if drawing_tool.get_name(group) != name: ifc.run("attribute.edit_attributes", product=group, attributes={"Name": name}) diff --git a/src/bonsai/bonsai/core/geometry.py b/src/bonsai/bonsai/core/geometry.py index 99512f75b84..83ba921d300 100644 --- a/src/bonsai/bonsai/core/geometry.py +++ b/src/bonsai/bonsai/core/geometry.py @@ -17,12 +17,14 @@ # along with Bonsai. If not, see . from __future__ import annotations -from typing import TYPE_CHECKING, Optional, Union + from collections.abc import Sequence +from typing import TYPE_CHECKING, Optional, Union if TYPE_CHECKING: import bpy import ifcopenshell + import bonsai.tool as tool diff --git a/src/bonsai/bonsai/core/georeference.py b/src/bonsai/bonsai/core/georeference.py index 419f4218ba8..f594f414168 100644 --- a/src/bonsai/bonsai/core/georeference.py +++ b/src/bonsai/bonsai/core/georeference.py @@ -17,16 +17,17 @@ # along with Bonsai. If not, see . from __future__ import annotations -from typing import TYPE_CHECKING, Optional + +from typing import TYPE_CHECKING if TYPE_CHECKING: - import bpy - import ifcopenshell + import bonsai.tool as tool def add_georeferencing(georeference: type[tool.Georeference]) -> None: georeference.add_georeferencing() + georeference.set_model_origin() def enable_editing_georeferencing(georeference: type[tool.Georeference]) -> None: @@ -35,8 +36,9 @@ def enable_editing_georeferencing(georeference: type[tool.Georeference]) -> None georeference.enable_editing() -def remove_georeferencing(ifc: type[tool.Ifc]) -> None: +def remove_georeferencing(ifc: type[tool.Ifc], georeference: type[tool.Georeference]) -> None: ifc.run("georeference.remove_georeferencing") + georeference.set_model_origin() def disable_editing_georeferencing(georeference: type[tool.Georeference]) -> None: diff --git a/src/bonsai/bonsai/core/ifcgit.py b/src/bonsai/bonsai/core/ifcgit.py index f3a2ead14a6..875a37f8c04 100644 --- a/src/bonsai/bonsai/core/ifcgit.py +++ b/src/bonsai/bonsai/core/ifcgit.py @@ -17,15 +17,16 @@ # along with Bonsai. If not, see . from __future__ import annotations + import platform -from typing import TYPE_CHECKING, Optional +from typing import TYPE_CHECKING if TYPE_CHECKING: import bpy - import ifcopenshell - import bonsai.tool as tool import git + import bonsai.tool as tool + def create_repo(ifcgit: type[tool.IfcGit], ifc: type[tool.Ifc]) -> None: path_ifc = ifc.get_path() @@ -55,42 +56,50 @@ def discard_uncommitted(ifcgit: type[tool.IfcGit], ifc: type[tool.Ifc]) -> None: ifcgit.load_project(path_ifc) -def commit_changes(ifcgit: type[tool.IfcGit], ifc: type[tool.Ifc], repo: git.Repo) -> None: +def commit_changes( + ifcgit: type[tool.IfcGit], ifc: type[tool.Ifc], commit_message: str, new_branch_name: str = "" +) -> None: """Commit and create new branches as required""" path_ifc = ifc.get_path() - if repo.head.is_detached: - ifcgit.git_commit(path_ifc) - ifcgit.create_new_branch() + if ifcgit.is_head_detached(): + ifcgit.git_commit(path_ifc, commit_message) + ifcgit.create_new_branch(new_branch_name) else: - ifcgit.checkout_new_branch(path_ifc) - ifcgit.git_commit(path_ifc) + if new_branch_name: + ifcgit.checkout_new_branch(path_ifc, new_branch_name) + ifcgit.git_commit(path_ifc, commit_message) -def add_tag(ifcgit: type[tool.IfcGit], repo: git.Repo) -> None: - ifcgit.add_tag(repo) +def add_tag(ifcgit: type[tool.IfcGit], repo: git.Repo, hexsha: str, tag_name: str, tag_message: str = "") -> None: + ifcgit.add_tag(repo, hexsha, tag_name, tag_message) def delete_tag(ifcgit: type[tool.IfcGit], repo: git.Repo, tag_name: git.TagReference) -> None: ifcgit.delete_tag(repo, tag_name) -def add_remote(ifcgit: type[tool.IfcGit], repo: git.Repo) -> None: - ifcgit.add_remote(repo) +def add_remote(ifcgit: type[tool.IfcGit], repo: git.Repo, remote_name: str, remote_url: str) -> None: + ifcgit.add_remote(repo, remote_name, remote_url) -def delete_remote(ifcgit: type[tool.IfcGit], repo: git.Repo) -> None: - ifcgit.delete_remote(repo) +def delete_remote(ifcgit: type[tool.IfcGit], repo: git.Repo, remote_name: str) -> None: + ifcgit.delete_remote(repo, remote_name) + + +def rename_branch(ifcgit: type[tool.IfcGit], repo: git.Repo, new_name: str) -> None: + ifcgit.rename_branch(repo, new_name) def push(ifcgit: type[tool.IfcGit], repo: git.Repo, remote_name: str, operator: bpy.types.Operator) -> None: - error_message = ifcgit.push(repo, remote_name, repo.active_branch.name) + error_message = ifcgit.push(repo, remote_name, ifcgit.get_active_branch_name()) if error_message: operator.report({"ERROR"}, error_message) -def refresh_revision_list(ifcgit: type[tool.IfcGit], repo: git.Repo, ifc: type[tool.Ifc]) -> None: - if repo.heads: +def refresh_revision_list(ifcgit: type[tool.IfcGit], ifc: type[tool.Ifc]) -> None: + ifcgit.clear_merge_conflicts() + if ifcgit.repo_has_commits(): ifcgit.refresh_revision_list(ifc.get_path()) @@ -124,10 +133,76 @@ def switch_revision(ifcgit: type[tool.IfcGit], ifc: type[tool.Ifc]) -> None: ifcgit.decolourise() -def merge_branch(ifcgit: type[tool.IfcGit], ifc: type[tool.Ifc], operator: bpy.types.Operator) -> None: +def merge_branch(ifcgit: type[tool.IfcGit], ifc: type[tool.Ifc], operator: bpy.types.Operator) -> bool | None: + path_ifc = ifc.get_path() + ifcgit.config_ifcmerge() + + branch_name = ifcgit.get_selected_branch() + if branch_name is None: + return + + mergetool = ifcgit.get_merge_tool(branch_name) + merge_result = ifcgit.git_merge(branch_name) + + if merge_result == "error": + operator.report({"ERROR"}, "Unknown IFC Merge failure") + return False + elif merge_result == "conflict": + conflicts = ifcgit.git_mergetool(mergetool, path_ifc) + if conflicts is not None: + ifcgit.git_merge_abort() + if conflicts: + ifcgit.store_merge_conflicts(conflicts) + operator.report({"WARNING"}, "Merge failed — see the conflict report in the panel below") + else: + operator.report({"ERROR"}, "Merge tool failed — check that ifcmerge is installed correctly") + return False + ifcgit.commit_merge(path_ifc) + + ifcgit.clear_merge_conflicts() + ifcgit.set_display_branch() + ifcgit.git_checkout(path_ifc) + ifcgit.load_project(path_ifc) + ifcgit.refresh_revision_list(path_ifc) + ifcgit.decolourise() + + +def dry_run_merge(ifcgit: type[tool.IfcGit], ifc: type[tool.Ifc], operator: bpy.types.Operator) -> None: path_ifc = ifc.get_path() ifcgit.config_ifcmerge() - ifcgit.execute_merge(path_ifc, operator) + + branch_name = ifcgit.get_selected_branch() + if branch_name is None: + return + + mergetool = ifcgit.get_merge_tool(branch_name) + merge_result = ifcgit.git_merge_no_commit(branch_name) + + if merge_result == "error": + try: + ifcgit.git_merge_abort() + except Exception: + pass + operator.report({"ERROR"}, "Unknown IFC Merge failure") + return + + if merge_result == "conflict": + conflicts = ifcgit.git_mergetool(mergetool, path_ifc) + ifcgit.git_merge_abort() + if conflicts is not None: + ifcgit.store_merge_conflicts(conflicts) + operator.report({"WARNING"}, "Merge preview: conflicts found — see the panel below") + else: + ifcgit.clear_merge_conflicts() + operator.report({"INFO"}, "Merge preview: no conflicts") + else: + # Clean merge or already up to date — abort the pending merge state if any + try: + ifcgit.git_merge_abort() + except Exception: + pass + ifcgit.clear_merge_conflicts() + operator.report({"INFO"}, "Merge preview: no conflicts") def entity_log(ifcgit: type[tool.IfcGit], ifc: type[tool.Ifc], step_id: int, operator: bpy.types.Operator) -> None: @@ -144,5 +219,9 @@ def install_git(ifcgit: type[tool.IfcGit], operator: bpy.types.Operator) -> None print("install_git() not implemented") +def fetch(ifcgit: type[tool.IfcGit], remote_name: str) -> None: + ifcgit.fetch(remote_name) + + def run_git_diff(ifcgit: type[tool.IfcGit], operator: bpy.types.Operator, save_to_temp: bool) -> None: ifcgit.run_git_diff(operator, save_to_temp) diff --git a/src/bonsai/bonsai/core/library.py b/src/bonsai/bonsai/core/library.py index 53f5f8ce8c1..e006db797ec 100644 --- a/src/bonsai/bonsai/core/library.py +++ b/src/bonsai/bonsai/core/library.py @@ -17,11 +17,13 @@ # along with Bonsai. If not, see . from __future__ import annotations -from typing import TYPE_CHECKING, Optional + +from typing import TYPE_CHECKING if TYPE_CHECKING: import bpy import ifcopenshell + import bonsai.tool as tool diff --git a/src/bonsai/bonsai/core/material.py b/src/bonsai/bonsai/core/material.py index 25a1df3e890..0a08f5e0bf5 100644 --- a/src/bonsai/bonsai/core/material.py +++ b/src/bonsai/bonsai/core/material.py @@ -17,11 +17,13 @@ # along with Bonsai. If not, see . from __future__ import annotations + from typing import TYPE_CHECKING, Optional, Union if TYPE_CHECKING: import bpy import ifcopenshell + import bonsai.tool as tool @@ -111,6 +113,7 @@ def assign_material( material_type: Union[str, None], objects: list[bpy.types.Object], material: Optional[ifcopenshell.entity_instance] = None, + should_auto_assign_usage: bool = True, ) -> None: """Assign material to the provided objects. @@ -119,12 +122,18 @@ def assign_material( """ material_type = material_type or material_tool.get_object_ui_material_type() material = material or material_tool.get_object_ui_active_material() + can_be_usage = should_auto_assign_usage and material_type in ("IfcMaterialLayerSet", "IfcMaterialProfileSet") for obj in objects: element = ifc.get_entity(obj) if not element: continue - ifc.run("material.assign_material", products=[element], type=material_type, material=material) + if can_be_usage and not material_tool.is_type_product(element): + element_material_type = material_type + "Usage" + else: + element_material_type = material_type + + ifc.run("material.assign_material", products=[element], type=element_material_type, material=material) assigned_material = material_tool.get_material(element) assert assigned_material # Type checker. @@ -134,7 +143,9 @@ def assign_material( material_tool.add_material_to_set(material_set=material, material=default_material) elif material_tool.is_a_material_set(assigned_material): material_tool.add_material_to_set(material_set=assigned_material, material=material) - material_tool.ensure_material_assigned(elements=[element], material_type=material_type, material=material) + material_tool.ensure_material_assigned( + elements=[element], material_type=element_material_type, material=material + ) def unassign_material(ifc: type[tool.Ifc], material_tool: type[tool.Material], objects: list[bpy.types.Object]) -> None: diff --git a/src/bonsai/bonsai/core/misc.py b/src/bonsai/bonsai/core/misc.py index a69ffb2180a..a5f0deb2f35 100644 --- a/src/bonsai/bonsai/core/misc.py +++ b/src/bonsai/bonsai/core/misc.py @@ -17,11 +17,12 @@ # along with Bonsai. If not, see . from __future__ import annotations -from typing import TYPE_CHECKING, Optional + +from typing import TYPE_CHECKING if TYPE_CHECKING: import bpy - import ifcopenshell + import bonsai.tool as tool diff --git a/src/bonsai/bonsai/core/model.py b/src/bonsai/bonsai/core/model.py index c82de50e0e1..e9755053819 100644 --- a/src/bonsai/bonsai/core/model.py +++ b/src/bonsai/bonsai/core/model.py @@ -17,15 +17,15 @@ # along with Bonsai. If not, see . from __future__ import annotations -from typing import TYPE_CHECKING, Optional, Literal + +from typing import TYPE_CHECKING, Literal, Optional if TYPE_CHECKING: import bpy - import ifcopenshell - import bonsai.tool as tool - from mathutils import Vector - from bonsai.bim.module.model.wall import DumbWallJoiner, DumbWallAligner + + import bonsai.tool as tool + from bonsai.bim.module.model.wall import DumbWallAligner, DumbWallJoiner AlignType = Literal["CENTER", "EXTERIOR", "INTERIOR"] OffsetType = Literal["CENTER", "EXTERIOR", "INTERIOR"] @@ -109,7 +109,7 @@ def align_walls( align_type: AlignType, ): reference_obj = blender.get_active_object(is_selected=True) - if not (e := ifc.get_entity(reference_obj) or not model.get_usage_type(e) == "LAYER2"): + if not reference_obj or not (e := ifc.get_entity(reference_obj)) or not model.get_usage_type(e) == "LAYER2": reference_obj = None objs = [ o @@ -159,48 +159,6 @@ def extend_wall_to_slab( model.reload_body_representation(wall_objs) -def join_walls_TZ( - ifc: type[tool.Ifc], - blender: type[tool.Blender], - geometry: type[tool.Geometry], - joiner: DumbWallJoiner, - model: type[tool.Model], -) -> None: - selected_objs = [ - o - for o in blender.get_selected_objects() - if (e := ifc.get_entity(o)) and model.get_usage_type(e) in ("LAYER2", "LAYER3") - ] - if len(selected_objs) < 2: - raise RequireAtLeastTwoLayeredElements( - "Two or more vertically or horizontally layered elements must be selected to connect their paths together" - ) - - for obj in selected_objs: - geometry.clear_scale(obj) - - elements = [ifc.get_entity(o) for o in blender.get_selected_objects()] - layer2_elements = [] - layer3_elements = [] - for element in elements: - usage = model.get_usage_type(element) - if usage == "LAYER2": - layer2_elements.append(element) - elif usage == "LAYER3": - layer3_elements.append(element) - if layer3_elements: - target = ifc.get_object(layer3_elements[0]) - for element in layer2_elements: - joiner.join_Z(ifc.get_object(element), target) - else: - if not (active_obj := blender.get_active_object()): - active_obj = selected_objs[0] - for obj in selected_objs: - if obj == active_obj: - continue - joiner.join_T(obj, active_obj) - - class RequireTwoWallsError(Exception): pass diff --git a/src/bonsai/bonsai/core/nest.py b/src/bonsai/bonsai/core/nest.py index 645efa0eb69..ffa594e7316 100644 --- a/src/bonsai/bonsai/core/nest.py +++ b/src/bonsai/bonsai/core/nest.py @@ -17,11 +17,13 @@ # along with Bonsai. If not, see . from __future__ import annotations -from typing import TYPE_CHECKING, Optional, Union + +from typing import TYPE_CHECKING, Union if TYPE_CHECKING: import bpy import ifcopenshell + import bonsai.tool as tool diff --git a/src/bonsai/bonsai/core/owner.py b/src/bonsai/bonsai/core/owner.py index f2dd366138a..aeecb93a640 100644 --- a/src/bonsai/bonsai/core/owner.py +++ b/src/bonsai/bonsai/core/owner.py @@ -17,14 +17,15 @@ # along with Bonsai. If not, see . from __future__ import annotations -from typing import TYPE_CHECKING, Optional, Union + +from typing import TYPE_CHECKING, Union if TYPE_CHECKING: - import bpy import ifcopenshell - import bonsai.tool as tool - from ifcopenshell.api.owner.add_address import ADDRESS_TYPE from ifcopenshell.api.owner.add_actor import ACTOR_TYPE + from ifcopenshell.api.owner.add_address import ADDRESS_TYPE + + import bonsai.tool as tool def add_person(ifc: type[tool.Ifc]) -> ifcopenshell.entity_instance: diff --git a/src/bonsai/bonsai/core/patch.py b/src/bonsai/bonsai/core/patch.py index a715f11f743..1ea0a71d4ac 100644 --- a/src/bonsai/bonsai/core/patch.py +++ b/src/bonsai/bonsai/core/patch.py @@ -18,11 +18,11 @@ from __future__ import annotations -from typing import TYPE_CHECKING, Optional + +from typing import TYPE_CHECKING if TYPE_CHECKING: - import bpy - import ifcopenshell + import bonsai.tool as tool diff --git a/src/bonsai/bonsai/core/profile.py b/src/bonsai/bonsai/core/profile.py index 46e179229c5..77f64c46065 100644 --- a/src/bonsai/bonsai/core/profile.py +++ b/src/bonsai/bonsai/core/profile.py @@ -17,11 +17,11 @@ # along with Bonsai. If not, see . from __future__ import annotations -from typing import TYPE_CHECKING, Optional + +from typing import TYPE_CHECKING if TYPE_CHECKING: - import bpy - import ifcopenshell + import bonsai.tool as tool diff --git a/src/bonsai/bonsai/core/project.py b/src/bonsai/bonsai/core/project.py index f699c8bfe98..0e4b044b5e4 100644 --- a/src/bonsai/bonsai/core/project.py +++ b/src/bonsai/bonsai/core/project.py @@ -17,11 +17,11 @@ # along with Bonsai. If not, see . from __future__ import annotations + from typing import TYPE_CHECKING, Optional if TYPE_CHECKING: - import bpy - import ifcopenshell + import bonsai.tool as tool diff --git a/src/bonsai/bonsai/core/pset.py b/src/bonsai/bonsai/core/pset.py index 6a92f3d4007..62517b7ab21 100644 --- a/src/bonsai/bonsai/core/pset.py +++ b/src/bonsai/bonsai/core/pset.py @@ -18,11 +18,13 @@ from __future__ import annotations -from typing import TYPE_CHECKING, Optional, Union, Any + +from typing import TYPE_CHECKING, Any, Union if TYPE_CHECKING: import bpy import ifcopenshell + import bonsai.tool as tool diff --git a/src/bonsai/bonsai/core/qto.py b/src/bonsai/bonsai/core/qto.py index d56130962b1..40a866ac33c 100644 --- a/src/bonsai/bonsai/core/qto.py +++ b/src/bonsai/bonsai/core/qto.py @@ -17,10 +17,12 @@ # along with Bonsai. If not, see . from __future__ import annotations + from typing import TYPE_CHECKING if TYPE_CHECKING: import bpy + import bonsai.tool as tool diff --git a/src/bonsai/bonsai/core/resource.py b/src/bonsai/bonsai/core/resource.py index a3423c98db7..63f2e02b90a 100644 --- a/src/bonsai/bonsai/core/resource.py +++ b/src/bonsai/bonsai/core/resource.py @@ -19,12 +19,13 @@ # ############################################################################ # from __future__ import annotations -from typing import TYPE_CHECKING, Optional + from collections.abc import Iterable +from typing import TYPE_CHECKING, Optional if TYPE_CHECKING: - import bpy import ifcopenshell + import bonsai.tool as tool diff --git a/src/bonsai/bonsai/core/root.py b/src/bonsai/bonsai/core/root.py index 957298c0441..3a283a6a65b 100644 --- a/src/bonsai/bonsai/core/root.py +++ b/src/bonsai/bonsai/core/root.py @@ -17,12 +17,15 @@ # along with Bonsai. If not, see . from __future__ import annotations + from typing import TYPE_CHECKING, Optional + import ifcopenshell.util.element if TYPE_CHECKING: import bpy import ifcopenshell + import bonsai.tool as tool @@ -63,20 +66,20 @@ def copy_class( def _has_material_styles(ifc: type[tool.Ifc], element: ifcopenshell.entity_instance) -> bool: """Check if element has styles defined through its material. - + Returns True if any constituent material has a style representation, which means styles should NOT be applied directly to the geometry. """ materials = ifcopenshell.util.element.get_materials(element) - + if not materials: return False - + # Check if any of the constituent materials have styles for material in materials: - if hasattr(material, 'HasRepresentation') and material.HasRepresentation: + if hasattr(material, "HasRepresentation") and material.HasRepresentation: return True - + return False diff --git a/src/bonsai/bonsai/core/search.py b/src/bonsai/bonsai/core/search.py index 5e9d279df9b..fb4771d92b2 100644 --- a/src/bonsai/bonsai/core/search.py +++ b/src/bonsai/bonsai/core/search.py @@ -17,10 +17,11 @@ # along with Bonsai. If not, see . from __future__ import annotations + from typing import TYPE_CHECKING if TYPE_CHECKING: - import bpy + import bonsai.tool as tool diff --git a/src/bonsai/bonsai/core/sequence.py b/src/bonsai/bonsai/core/sequence.py index 610c7095b6f..4e1ead7d081 100644 --- a/src/bonsai/bonsai/core/sequence.py +++ b/src/bonsai/bonsai/core/sequence.py @@ -17,11 +17,12 @@ # along with Bonsai. If not, see . from __future__ import annotations + from typing import TYPE_CHECKING, Optional, Union if TYPE_CHECKING: - import bpy import ifcopenshell + import bonsai.tool as tool diff --git a/src/bonsai/bonsai/core/spatial.py b/src/bonsai/bonsai/core/spatial.py index 16e11e0fa94..5ce6d7c2539 100644 --- a/src/bonsai/bonsai/core/spatial.py +++ b/src/bonsai/bonsai/core/spatial.py @@ -17,11 +17,13 @@ # along with Bonsai. If not, see . from __future__ import annotations -from typing import TYPE_CHECKING, Optional, Union, assert_never + +from typing import TYPE_CHECKING, Optional, Union if TYPE_CHECKING: import bpy import ifcopenshell + import bonsai.tool as tool @@ -50,15 +52,22 @@ def assign_container( collector: type[tool.Collector], spatial: type[tool.Spatial], container: ifcopenshell.entity_instance, - element_obj: Optional[bpy.types.Object] = None, + objs: Optional[bpy.types.Object] = None, ) -> Union[ifcopenshell.entity_instance, None]: - if not spatial.can_contain(container, element_obj): - return - assert element_obj # Type checker. - rel = ifc.run("spatial.assign_container", products=[ifc.get_entity(element_obj)], relating_structure=container) - spatial.disable_editing(element_obj) - collector.assign(element_obj) - return rel + root_elements = set() + all_elements = set() + for obj in objs: + if not (element := ifc.get_entity(obj)): + continue + root_element = spatial.get_root_element(element) + root_elements.add(root_element) + spatial.disable_editing(obj) + all_elements.add(root_element) + all_elements.update(spatial.get_decomposition(root_element)) + if products := [e for e in root_elements if spatial.can_contain(container, root_element)]: + ifc.run("spatial.assign_container", products=products, relating_structure=container) + for element in all_elements: + collector.assign(ifc.get_object(element)) def enable_editing_container(spatial: type[tool.Spatial], obj: bpy.types.Object) -> None: @@ -96,7 +105,7 @@ def copy_to_container( copied_obj = spatial.duplicate_object_and_data(obj) spatial.set_relative_object_matrix(copied_obj, to_container_obj, matrix) result_objs.append(spatial.run_root_copy_class(obj=copied_obj)) - spatial.run_spatial_assign_container(container=to_container, element_obj=copied_obj) + spatial.run_spatial_assign_container(container=to_container, objs=[copied_obj]) spatial.disable_editing(obj) return result_objs @@ -210,13 +219,8 @@ def generate_space( else: assert space_polygon - bm = spatial.get_bmesh_from_polygon(space_polygon, h=h, polygon_is_si=True) - - mesh = spatial.get_named_mesh_from_bmesh(name="Space", bmesh=bm) - if element and element.is_a("IfcSpace"): - mesh = spatial.get_transformed_mesh_from_local_to_global(mesh) - spatial.edit_active_space_obj_from_mesh(mesh) + spatial.set_space_representation_from_polygon(active_obj, element, space_polygon, h, polygon_is_si=True) spatial.translate_obj_to_z_location(active_obj, z) else: if relating_type: @@ -224,12 +228,13 @@ def generate_space( else: name = "Space" - obj = spatial.get_named_obj_from_mesh(name, mesh) + obj = spatial.create_object(name) spatial.set_obj_origin_to_cursor_position_and_zero_elevation(obj) spatial.translate_obj_to_z_location(obj, z) spatial.assign_ifcspace_class_to_obj(obj) element = ifc.get_entity(obj) + spatial.set_space_representation_from_polygon(obj, element, space_polygon, h, polygon_is_si=True) if relating_type: spatial.assign_relating_type_to_element(ifc, type, element, relating_type) @@ -248,16 +253,16 @@ def generate_spaces_from_walls( for i, linear_ring in enumerate(union.interiors): poly = spatial.get_buffered_poly_from_linear_ring(linear_ring) - bm = spatial.get_bmesh_from_polygon(poly, h, polygon_is_si=False) - name = "Space" + str(i) - obj = spatial.get_named_obj_from_bmesh(name, bmesh=bm) - - spatial.set_obj_origin_to_bboxcenter_and_zero_elevation(obj) + obj = spatial.create_object(name) + spatial.set_obj_origin_to_polygon_center(obj, poly, polygon_is_si=False) spatial.translate_obj_to_z_location(obj, z) spatial.assign_ifcspace_class_to_obj(obj) + element = ifc.get_entity(obj) + spatial.set_space_representation_from_polygon(obj, element, poly, h, polygon_is_si=False) + def toggle_space_visibility(ifc: type[tool.Ifc], spatial: type[tool.Spatial]) -> None: model = ifc.get() diff --git a/src/bonsai/bonsai/core/structural.py b/src/bonsai/bonsai/core/structural.py index 4c31883fe5d..fb5a28fe245 100644 --- a/src/bonsai/bonsai/core/structural.py +++ b/src/bonsai/bonsai/core/structural.py @@ -17,11 +17,12 @@ # along with Bonsai. If not, see . from __future__ import annotations -from typing import TYPE_CHECKING, Optional, Union + +from typing import TYPE_CHECKING, Union if TYPE_CHECKING: - import bpy import ifcopenshell + import bonsai.tool as tool diff --git a/src/bonsai/bonsai/core/style.py b/src/bonsai/bonsai/core/style.py index 85bb4200aa9..04ee971f971 100644 --- a/src/bonsai/bonsai/core/style.py +++ b/src/bonsai/bonsai/core/style.py @@ -17,11 +17,13 @@ # along with Bonsai. If not, see . from __future__ import annotations -from typing import TYPE_CHECKING, Optional, Any + +from typing import TYPE_CHECKING, Any if TYPE_CHECKING: import bpy import ifcopenshell + import bonsai.tool as tool diff --git a/src/bonsai/bonsai/core/system.py b/src/bonsai/bonsai/core/system.py index fcdb95e72d7..f0a3ad03809 100644 --- a/src/bonsai/bonsai/core/system.py +++ b/src/bonsai/bonsai/core/system.py @@ -17,11 +17,12 @@ # along with Bonsai. If not, see . from __future__ import annotations -from typing import TYPE_CHECKING, Optional, Union + +from typing import TYPE_CHECKING, Union if TYPE_CHECKING: - import bpy import ifcopenshell + import bonsai.tool as tool @@ -123,9 +124,8 @@ def hide_ports(ifc: type[tool.Ifc], system: type[tool.System], element: ifcopens def add_port(ifc: type[tool.Ifc], system: type[tool.System], element: ifcopenshell.entity_instance) -> None: system.load_ports(element, system.get_ports(element)) - obj = system.create_empty_at_cursor_with_element_orientation(element) - port = system.run_root_assign_class(obj=obj, ifc_class="IfcDistributionPort", should_add_representation=False) - ifc.run("system.assign_port", element=element, port=port) + port = system.create_port_at_cursor(element) + system.load_ports(element, [port]) def remove_port(ifc: type[tool.Ifc], system: type[tool.System], port: ifcopenshell.entity_instance) -> None: @@ -133,8 +133,13 @@ def remove_port(ifc: type[tool.Ifc], system: type[tool.System], port: ifcopenshe ifc.run("root.remove_product", product=port) -def connect_port(ifc: type[tool.Ifc], port1: ifcopenshell.entity_instance, port2: ifcopenshell.entity_instance) -> None: - ifc.run("system.connect_port", port1=port1, port2=port2) +def connect_port( + ifc: type[tool.Ifc], + port1: ifcopenshell.entity_instance, + port2: ifcopenshell.entity_instance, + direction: str = "NOTDEFINED", +) -> None: + ifc.run("system.connect_port", port1=port1, port2=port2, direction=direction) def disconnect_port(ifc: type[tool.Ifc], port: ifcopenshell.entity_instance) -> None: diff --git a/src/bonsai/bonsai/core/tool.py b/src/bonsai/bonsai/core/tool.py index d8e4dd2396a..e6a60c9debe 100644 --- a/src/bonsai/bonsai/core/tool.py +++ b/src/bonsai/bonsai/core/tool.py @@ -99,6 +99,7 @@ def get_obj_ifc_definition_id(cls, obj=None, obj_type=None, context=None): pass def get_object_bounding_box(cls, obj): pass def get_selected_objects(cls, include_active=False): pass def get_viewport_context(cls): pass + def operator_idname_to_py(cls, idname): pass def is_ifc_class_active(cls, ifc_class): pass def is_ifc_object(cls, obj): pass def remove_object(cls, obj): pass @@ -287,21 +288,29 @@ def purge_hdf5_cache(cls): pass @interface class Document: - def add_breadcrumb(cls, document): pass - def clear_breadcrumbs(cls): pass def clear_document_tree(cls): pass def disable_editing_document(cls): pass + def disable_object_editing_ui(cls): pass def disable_editing_ui(cls): pass def enable_editing_ui(cls): pass def export_document_attributes(cls): pass - def get_active_breadcrumb(cls): pass def import_document_attributes(cls, document): pass def import_project_documents(cls): pass - def import_references(cls, document): pass - def import_subdocuments(cls, document): pass def is_document_information(cls, document): pass - def remove_latest_breadcrumb(cls): pass def set_active_document(cls, document): pass + def clear_active_document(cls): pass + def clear_document_attributes(cls): pass + def expand_document(cls, document): pass + def get_default_parent_for_information(cls): pass + def get_selected_document_information(cls): pass + def get_document_information_id(cls, document): pass + def set_document_information_id(cls, document, value): pass + def get_external_reference_id(cls, reference): pass + def set_external_reference_id(cls, reference, value): pass + def get_document_references(cls, document): pass + def refresh_document_data(cls): pass + def load_document_objects_into_props(cls, document_id): pass + def update_document_objects(cls, document_id): pass @interface @@ -326,6 +335,11 @@ def disable_editing_schedules(cls): pass def disable_editing_sheets(cls): pass def disable_editing_text(cls, obj): pass def does_file_exist(cls, uri): pass + def edit_text_alignment(cls, obj, alignment): pass + def edit_text_font_size(cls, obj, size): pass + def edit_text_literals(cls, obj, literals): pass + def edit_text_symbol(cls, obj, symbol): pass + def edit_text_wrap_length(cls, obj, wrap_length): pass def enable_editing(cls, obj): pass def enable_editing_assigned_product(cls, obj): pass def enable_editing_drawings(cls): pass @@ -335,7 +349,10 @@ def enable_editing_sheets(cls): pass def enable_editing_text(cls, obj): pass def ensure_unique_drawing_name(cls, name): pass def ensure_unique_identification(cls, identification): pass + def export_font_size(cls, obj): pass + def export_symbol(cls, obj): pass def export_text_literal_attributes(cls, obj): pass + def export_wrap_length(cls, obj): pass def generate_drawing_matrix(cls, target_view, location_hint): pass def generate_drawing_name(cls, target_view, location_hint): pass def generate_reference_attributes(cls, reference, **attributes): pass @@ -388,16 +405,14 @@ def run_drawing_activate_model(cls): pass def run_root_assign_class(cls, obj=None, ifc_class=None, predefined_type=None, should_add_representation=True, context=None, ifc_representation_class=None): pass def run_type_assign_type(cls, element=None, relating_type=None): pass def select_assigned_product(cls, drawing): pass + def set_camera_name(cls, drawing, name): pass def set_drawing_collection_name(cls, drawing, collection): pass def set_name(cls, element, name): pass def setup_annotation_object(cls, obj, object_type): pass def setup_shading_styles_path(cls, resource_path): pass def show_decorations(cls): pass def sync_object_placement(cls, obj): pass - def synchronise_ifc_and_text_attributes(cls, obj): pass def update_embedded_svg_location(cls, uri, old_location, new_location): pass - def update_text_annotation_properties(cls, obj): pass - def update_text_size_pset(cls, obj): pass @interface @@ -520,6 +535,60 @@ def unlink(cls, element=None, obj=None): pass def get_all_element_occurrences(cls, element): pass +@interface +class IfcGit: + def add_file_to_repo(cls, repo, path_file): pass + def add_remote(cls, repo, remote_name, remote_url): pass + def add_tag(cls, repo, hexsha, tag_name, tag_message): pass + def branches_by_hexsha(cls, repo): pass + def checkout_new_branch(cls, path_file, branch_name): pass + def clear_commits_list(cls): pass + def clone_repo(cls, remote_url, local_folder): pass + def colourise(cls, step_ids): pass + def config_ifcmerge(cls): pass + def create_new_branch(cls, branch_name): pass + def decolourise(cls): pass + def delete_remote(cls, repo, remote_name): pass + def delete_tag(cls, repo, tag_name): pass + def dos2unix(cls, path_file): pass + def commit_merge(cls, path_ifc): pass + def entity_log(cls, path_ifc, step_id): pass + def fetch(cls, remote_name): pass + def get_commits_list(cls, path_ifc, lookup): pass + def get_merge_tool(cls, branch_name): pass + def get_selected_branch(cls): pass + def git_merge(cls, branch_name): pass + def git_merge_abort(cls): pass + def git_merge_no_commit(cls, branch_name): pass + def git_mergetool(cls, mergetool, path_ifc): pass + def store_merge_conflicts(cls, conflicts): pass + def clear_merge_conflicts(cls): pass + def get_merge_conflicts(cls): pass + def set_display_branch(cls): pass + def get_active_branch_name(cls): pass + def get_ifcgit_props(cls): pass + def get_modified_step_ids(cls, step_ids): pass + def get_path_dir(cls, path_ifc): pass + def get_revisions_step_ids(cls): pass + def is_head_detached(cls): pass + def repo_has_commits(cls): pass + def git_checkout(cls, path_file): pass + def git_commit(cls, path_file, commit_message): pass + def ifc_diff_ids(cls, repo, hash_a, hash_b, path_ifc): pass + def init_repo(cls, path_dir): pass + def install_git_windows(cls, operator): pass + def is_valid_ref_format(cls, string): pass + def load_anyifc(cls, repo): pass + def load_project(cls, path_ifc): pass + def push(cls, repo, remote_name, branch_name): pass + def refresh_revision_list(cls, path_ifc): pass + def repo_from_path(cls, path): pass + def run_git_diff(cls, operator, save_to_temp): pass + def switch_to_revision_item(cls): pass + def tags_by_hexsha(cls, repo): pass + def update_step_ids(cls, step_ids, modified_step_ids): pass + + @interface class Layer: pass @@ -569,6 +638,7 @@ def has_material_profile(cls, element): pass def import_material_definitions(cls, material_type: str): pass def is_a_flow_segment(cls, element): pass def is_a_material_set(cls, material): pass + def is_type_product(cls, element): pass def is_editing_materials(cls): pass def is_material_used_in_sets(cls, material): pass def load_material_attributes(cls, material): pass @@ -608,7 +678,10 @@ def import_profile(cls, profile, obj=None, position=None): pass def import_rectangle(cls, obj, position, profile): pass def load_openings(cls, openings): pass def purge_scene_openings(cls): pass + def recalculate_walls(cls, objs): pass def regenerate_array(cls, parent, data): pass + def regenerate_profile(cls, obj): pass + def regenerate_slab(cls, obj): pass def reload_body_representation(cls, obj_or_objects): pass def replace_object_ifc_representation(cls, ifc_file, ifc_context, obj, new_representation): pass @@ -943,15 +1016,17 @@ def filter_products(cls, products, action): pass def get_active_container(cls): pass def get_container(cls, element): pass def get_decomposed_elements(cls, container, recursive): pass + def get_decomposition(cls, element): pass def get_object_matrix(cls, obj): pass def get_relative_object_matrix(cls, target_obj, relative_to_obj): pass + def get_root_element(cls, element): pass def get_selected_product_types(cls): pass def get_selected_products(cls): pass def import_spatial_decomposition(cls): pass def import_spatial_element(cls, element, level_index): pass def load_contained_elements(cls): pass def run_root_copy_class(cls, obj): pass - def run_spatial_assign_container(cls, container, element_obj): pass + def run_spatial_assign_container(cls, container, objs): pass def run_spatial_import_spatial_decomposition(cls): pass def select_object(cls, obj): pass def select_products(cls, products, unhide=False): pass @@ -978,14 +1053,12 @@ def get_converted_tolerance(cls, tolerance): pass def get_purged_inner_holes_poly(cls, union_geom, min_area): pass def get_poly_valid_interior_list(cls, poly, min_area, interiors_list): pass def get_buffered_poly_from_linear_ring(cls, linear_ring): pass - def get_bmesh_from_polygon(cls, poly, h, polygon_is_si=False): pass - def get_named_obj_from_bmesh(cls, name, bmesh): pass - def get_named_obj_from_mesh(cls, name, mesh): pass - def get_named_mesh_from_bmesh(cls, name, bmesh): pass - def get_transformed_mesh_from_local_to_global(cls, mesh): pass - def edit_active_space_obj_from_mesh(cls, mesh): pass - def set_obj_origin_to_bboxcenter(cls, obj): pass - def set_obj_origin_to_bboxcenter_and_zero_elevation(cls, obj): pass + def get_2d_vertices_from_polygon(cls, poly, obj, polygon_is_si=True): pass + def set_extrusion_representation_from_polygon(cls, obj, element, poly, depth_ifc, polygon_is_si=True): pass + def set_space_representation_from_polygon(cls, obj, element, poly, h, polygon_is_si=True): pass + def set_covering_representation_from_polygon(cls, obj, poly, polygon_is_si=True): pass + def create_object(cls, name): pass + def set_obj_origin_to_polygon_center(cls, obj, poly, polygon_is_si=True): pass def set_obj_origin_to_cursor_position_and_zero_elevation(cls, obj): pass def get_selected_objects(cls): pass def get_active_obj(cls): pass @@ -993,14 +1066,9 @@ def get_active_obj_z(cls): pass def get_active_obj_height(cls): pass def get_relating_type_id(cls): pass def translate_obj_to_z_location(cls, obj, z): pass - def get_2d_vertices_from_obj(cls, obj): pass - def get_scaled_2d_vertices(cls, points): pass - def assign_swept_area_outer_curve_from_2d_vertices(cls, obj, vertices): pass - def get_body_representation(cls, obj): pass def assign_ifcspace_class_to_obj(cls, obj): pass def assign_type_to_obj(cls, obj): pass def assign_relating_type_to_element(cls, ifc, type, element, relating_type): pass - def regen_obj_representation(cls, obj, body): pass def toggle_spaces_visibility_wired_and_textured(cls, spaces): pass def toggle_hide_spaces(cls, spaces): pass def set_default_container(cls, container): pass @@ -1074,6 +1142,7 @@ def get_absolute_matrix(cls, obj): pass @interface class System: def create_empty_at_cursor_with_element_orientation(cls, element): pass + def create_port_at_cursor(cls, system): pass def delete_element_objects(cls, elements): pass def disable_editing_system(cls): pass def disable_system_editing_ui(cls): pass @@ -1104,6 +1173,8 @@ def get_profile_set_usage(cls, element): pass def get_representation_context(cls, representation): pass def get_type_occurrences(cls, element_type): pass def has_material_usage(cls, element): pass + def record_material_usage_attributes(cls, element): pass + def restore_material_usage_attributes(cls, element, usage_attributes): pass def run_geometry_add_representation(cls, obj=None, context=None, ifc_representation_class=None, profile_set_usage=None): pass def run_geometry_switch_representation(cls, obj=None, representation=None): pass @@ -1114,16 +1185,15 @@ def clear_active_unit(cls): pass def disable_editing_units(cls): pass def enable_editing_units(cls): pass def export_unit_attributes(cls): pass + def get_currency_name(cls): pass + def get_project_currency_unit(cls): pass def get_scene_unit_name(cls, unit_type): pass - def get_scene_unit_si_prefix(cls, unit_type): pass + def get_scene_unit_si_prefix(cls, name): pass def import_unit_attributes(cls, unit): pass def import_units(cls): pass - def is_scene_unit_metric(cls): pass + def is_si_unit(cls, name): pass def is_unit_class(cls, unit, ifc_class): pass def set_active_unit(cls, unit): pass - def get_project_currency_unit(cls): pass - def get_currency_name(cls): pass - def add_mass_and_time_units(cls): pass @interface class Voider: diff --git a/src/bonsai/bonsai/core/type.py b/src/bonsai/bonsai/core/type.py index 226f00c4619..cf8f3effbe8 100644 --- a/src/bonsai/bonsai/core/type.py +++ b/src/bonsai/bonsai/core/type.py @@ -17,25 +17,33 @@ # along with Bonsai. If not, see . from __future__ import annotations -import bonsai.core.geometry -from typing import TYPE_CHECKING, Optional + +from typing import TYPE_CHECKING if TYPE_CHECKING: - import bpy import ifcopenshell + import bonsai.tool as tool def assign_type( ifc: type[tool.Ifc], + model: type[tool.Model], type_tool: type[tool.Type], element: ifcopenshell.entity_instance, type: ifcopenshell.entity_instance, ) -> None: + usage_attributes = type_tool.record_material_usage_attributes(element) ifc.run("type.assign_type", related_objects=[element], relating_type=type) obj = ifc.get_object(element) - if type_tool.has_material_usage(element): - pass # for now, representation regeneration handled by API listeners + if (usage := model.get_usage_type(type)) and usage_attributes: + type_tool.restore_material_usage_attributes(element, usage_attributes) + if (usage := model.get_usage_type(type)) == "PROFILE": + model.regenerate_profile(obj) + elif usage == "LAYER2": + model.recalculate_walls([obj]) + elif usage == "LAYER3": + model.regenerate_slab(obj) else: type_data = type_tool.get_object_data(ifc.get_object(type)) if type_data: diff --git a/src/bonsai/bonsai/core/unit.py b/src/bonsai/bonsai/core/unit.py index 9594c2b5669..c0ecc46fcb8 100644 --- a/src/bonsai/bonsai/core/unit.py +++ b/src/bonsai/bonsai/core/unit.py @@ -18,57 +18,27 @@ from __future__ import annotations -from typing import TYPE_CHECKING, Optional + +from typing import TYPE_CHECKING if TYPE_CHECKING: - import bpy import ifcopenshell + import bonsai.tool as tool def assign_scene_units(ifc: type[tool.Ifc], unit: type[tool.Unit]) -> None: - if unit.is_scene_unit_metric(): - lengthunit = ifc.run( - "unit.add_si_unit", unit_type="LENGTHUNIT", prefix=unit.get_scene_unit_si_prefix("LENGTHUNIT") - ) - areaunit = ifc.run("unit.add_si_unit", unit_type="AREAUNIT", prefix=unit.get_scene_unit_si_prefix("AREAUNIT")) - volumeunit = ifc.run( - "unit.add_si_unit", unit_type="VOLUMEUNIT", prefix=unit.get_scene_unit_si_prefix("VOLUMEUNIT") - ) - planeangleunit = ifc.run("unit.add_conversion_based_unit", name="degree") - units = [lengthunit, areaunit, volumeunit, planeangleunit] - - if unit.add_mass_and_time_units(): - prefix = unit.get_scene_unit_si_prefix("MASSUNIT") - if prefix == "CONVERSION": - massunit = ifc.run("unit.add_conversion_based_unit", name=unit.get_scene_unit_name("MASSUNIT").lower()) - else: - massunit = ifc.run("unit.add_si_unit", unit_type="MASSUNIT", prefix=prefix) - prefix = unit.get_scene_unit_si_prefix("TIMEUNIT") - if prefix == "CONVERSION": - timeunit = ifc.run("unit.add_conversion_based_unit", name=unit.get_scene_unit_name("TIMEUNIT").lower()) - else: - timeunit = ifc.run("unit.add_si_unit", unit_type="TIMEUNIT", prefix=prefix) - units += [massunit, timeunit] - - else: - lengthunit = ifc.run("unit.add_conversion_based_unit", name=unit.get_scene_unit_name("LENGTHUNIT")) - areaunit = ifc.run("unit.add_conversion_based_unit", name=unit.get_scene_unit_name("AREAUNIT")) - volumeunit = ifc.run("unit.add_conversion_based_unit", name=unit.get_scene_unit_name("VOLUMEUNIT")) - planeangleunit = ifc.run("unit.add_conversion_based_unit", name="degree") - units = [lengthunit, areaunit, volumeunit, planeangleunit] - - if unit.add_mass_and_time_units(): - massunit = ifc.run("unit.add_conversion_based_unit", name=unit.get_scene_unit_name("MASSUNIT").lower()) - time_unit_name = unit.get_scene_unit_name("TIMEUNIT") - if time_unit_name == "SECOND": - timeunit = ifc.run("unit.add_si_unit", unit_type="TIMEUNIT", prefix=None) + units = [] + for unit_type in ["LENGTHUNIT", "AREAUNIT", "VOLUMEUNIT", "MASSUNIT", "TIMEUNIT"]: + if name := unit.get_scene_unit_name(unit_type): + if unit.is_si_unit(name): + units.append( + ifc.run("unit.add_si_unit", unit_type=unit_type, prefix=unit.get_scene_unit_si_prefix(name)) + ) else: - timeunit = ifc.run("unit.add_conversion_based_unit", name=time_unit_name.lower()) - units += [massunit, timeunit] - print("Add mass and time units:", unit.add_mass_and_time_units()) - print("Assigning units:", units) - ifc.run("unit.assign_unit", units=units) + units.append(ifc.run("unit.add_conversion_based_unit", name=name)) + if units: + ifc.run("unit.assign_unit", units=units) def assign_unit(ifc: type[tool.Ifc], unit_tool: type[tool.Unit], unit: ifcopenshell.entity_instance) -> None: diff --git a/src/bonsai/bonsai/core/web.py b/src/bonsai/bonsai/core/web.py index 187d479b6bf..81b9e8a90c1 100644 --- a/src/bonsai/bonsai/core/web.py +++ b/src/bonsai/bonsai/core/web.py @@ -17,11 +17,11 @@ # along with Bonsai. If not, see . from __future__ import annotations -from typing import TYPE_CHECKING, Optional, Union + +from typing import TYPE_CHECKING if TYPE_CHECKING: - import bpy - import ifcopenshell + import bonsai.tool as tool diff --git a/src/bonsai/bonsai/tool/__init__.py b/src/bonsai/bonsai/tool/__init__.py index 8dae934981d..06e498e8be5 100644 --- a/src/bonsai/bonsai/tool/__init__.py +++ b/src/bonsai/bonsai/tool/__init__.py @@ -15,6 +15,9 @@ # # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . +# +# Ignore unused imports. +# ruff: noqa: F401 from bonsai.tool.aggregate import Aggregate from bonsai.tool.attribute import Attribute @@ -39,8 +42,7 @@ from bonsai.tool.georeference import Georeference from bonsai.tool.group import Group from bonsai.tool.ifc import Ifc -from bonsai.tool.ifcgit import IfcGit -from bonsai.tool.ifcgit import IfcGitRepo +from bonsai.tool.ifcgit import IfcGit, IfcGitRepo from bonsai.tool.layer import Layer from bonsai.tool.library import Library from bonsai.tool.loader import Loader diff --git a/src/bonsai/bonsai/tool/aggregate.py b/src/bonsai/bonsai/tool/aggregate.py index db037c2b022..1f7f6018620 100644 --- a/src/bonsai/bonsai/tool/aggregate.py +++ b/src/bonsai/bonsai/tool/aggregate.py @@ -17,15 +17,21 @@ # along with Bonsai. If not, see . from __future__ import annotations + +from typing import TYPE_CHECKING, Literal, Union + import bpy -import bonsai.core.tool -import bonsai.tool as tool import ifcopenshell.util.element import ifcopenshell.util.representation -from typing import Union, TYPE_CHECKING, Literal + +import bonsai.core.tool +import bonsai.tool as tool if TYPE_CHECKING: - from bonsai.bim.module.aggregate.prop import BIMAggregateProperties, BIMObjectAggregateProperties + from bonsai.bim.module.aggregate.prop import ( + BIMAggregateProperties, + BIMObjectAggregateProperties, + ) class Aggregate(bonsai.core.tool.Aggregate): @@ -43,21 +49,40 @@ def can_aggregate(cls, relating_obj: bpy.types.Object, related_obj: bpy.types.Ob related_object = tool.Ifc.get_entity(related_obj) if not relating_object or not related_object: return False + if relating_object == related_object: + return False + + is_compatible_class = False if (relating_object.is_a("IfcElement") or relating_object.is_a("IfcElementType")) and related_object.is_a( "IfcElement" ): - return True - if tool.Ifc.get_schema() == "IFC2X3": + is_compatible_class = True + elif tool.Ifc.get_schema() == "IFC2X3": if relating_object.is_a("IfcSpatialStructureElement") and related_object.is_a("IfcSpatialStructureElement"): - return True - if relating_object.is_a("IfcProject") and related_object.is_a("IfcSpatialStructureElement"): - return True + is_compatible_class = True + elif relating_object.is_a("IfcProject") and related_object.is_a("IfcSpatialStructureElement"): + is_compatible_class = True else: if relating_object.is_a("IfcSpatialElement") and related_object.is_a("IfcSpatialElement"): - return True - if relating_object.is_a("IfcProject") and related_object.is_a("IfcSpatialElement"): - return True - return False + is_compatible_class = True + elif relating_object.is_a("IfcProject") and related_object.is_a("IfcSpatialElement"): + is_compatible_class = True + + if not is_compatible_class: + return False + + # Prevent cyclic references: walk up the full hierarchy from the + # proposed parent and reject if we encounter the proposed child. + ancestor = ifcopenshell.util.element.get_parent(relating_object) + seen = {relating_object} + while ancestor: + if ancestor == related_object: + return False + if ancestor in seen: + break + seen.add(ancestor) + ancestor = ifcopenshell.util.element.get_parent(ancestor) + return True @classmethod def has_physical_body_representation(cls, element: ifcopenshell.entity_instance) -> bool: diff --git a/src/bonsai/bonsai/tool/attribute.py b/src/bonsai/bonsai/tool/attribute.py index 0515edc04ca..ce5cdba0301 100644 --- a/src/bonsai/bonsai/tool/attribute.py +++ b/src/bonsai/bonsai/tool/attribute.py @@ -17,23 +17,25 @@ # along with Bonsai. If not, see . from __future__ import annotations -import bpy -import bonsai.core.tool -import bonsai.bim.helper as helper -import bonsai.tool as tool -import ifcopenshell + from typing import ( + TYPE_CHECKING, Any, - Optional, - Union, - Literal, TypeVar, - TYPE_CHECKING, - assert_never, + Union, ) +import bpy +import ifcopenshell + +import bonsai.bim.helper as helper +import bonsai.core.tool +import bonsai.tool as tool + if TYPE_CHECKING: - from bonsai.bim.module.attribute.prop import BIMAttributeProperties, BIMExplorerProperties + from bonsai.bim.module.attribute.prop import ( + BIMExplorerProperties, + ) T = TypeVar("T") diff --git a/src/bonsai/bonsai/tool/bcf.py b/src/bonsai/bonsai/tool/bcf.py index b67a5a98dba..7be0f97a5b5 100644 --- a/src/bonsai/bonsai/tool/bcf.py +++ b/src/bonsai/bonsai/tool/bcf.py @@ -17,23 +17,22 @@ # along with Bonsai. If not, see . from __future__ import annotations -import bcf.v2.visinfo -import bonsai.core.tool -import bonsai.tool as tool -import bpy + +from typing import TYPE_CHECKING, Any, Optional, TypeGuard, TypeVar, Union + +import bcf.agnostic.model +import bcf.agnostic.topic +import bcf.agnostic.visinfo import bcf.v2.model import bcf.v2.model.visinfo import bcf.v2.topic - +import bcf.v2.visinfo import bcf.v3.model import bcf.v3.model.visinfo import bcf.v3.topic +import bpy -import bcf.agnostic.model -import bcf.agnostic.topic -import bcf.agnostic.visinfo - -from typing import Any, Union, TypeVar, TypeGuard, Optional, TYPE_CHECKING +import bonsai.core.tool if TYPE_CHECKING: from bonsai.bim.module.bcf.prop import BCFProperties diff --git a/src/bonsai/bonsai/tool/blender.py b/src/bonsai/bonsai/tool/blender.py index 97b161a11bb..fac9657dbd0 100644 --- a/src/bonsai/bonsai/tool/blender.py +++ b/src/bonsai/bonsai/tool/blender.py @@ -17,53 +17,70 @@ # along with Bonsai. If not, see . from __future__ import annotations -import sys -import bpy -import bmesh + +import contextlib +import importlib import json import os import platform import subprocess -import contextlib +import sys import tempfile import traceback -import numpy as np -import numpy.typing as npt -from ifcopenshell import entity_instance -import ifcopenshell.api -import ifcopenshell.util.element -import bonsai.core.tool -import bonsai.tool as tool -import bonsai.bim import types -import importlib +from collections.abc import Callable, Generator, Iterable, Sequence, Sized from datetime import datetime -from mathutils import Vector +from functools import cache, lru_cache from pathlib import Path -from functools import lru_cache, cache -from bonsai.bim.ifc import IFC_CONNECTED_TYPE from typing import ( + TYPE_CHECKING, Any, - Optional, - Union, Literal, + NamedTuple, + Optional, TypeVar, - TYPE_CHECKING, + Union, assert_never, ) -from collections.abc import Iterable, Callable, Generator, Sequence, Sized + +import bmesh +import bpy +import ifcopenshell.api +import ifcopenshell.util.element +import numpy as np +import numpy.typing as npt +from ifcopenshell import entity_instance +from mathutils import Matrix, Vector + +import bonsai.bim +import bonsai.core.tool +import bonsai.tool as tool +from bonsai.bim.ifc import IFC_CONNECTED_TYPE if TYPE_CHECKING: - from sun_position.properties import SunPosProperties import bpy.stub_internal.rna_enums as rna_enums - from bonsai.bim.prop import BIMProperties, BIMObjectProperties, BIMSnapProperties + from sun_position.properties import SunPosProperties + from bonsai.bim.module.attribute.prop import BIMAttributeProperties - from bonsai.bim.module.constraint.prop import BIMConstraintProperties, BIMObjectConstraintProperties + from bonsai.bim.module.constraint.prop import ( + BIMConstraintProperties, + BIMObjectConstraintProperties, + ) from bonsai.bim.module.covetool.prop import CoveToolProperties from bonsai.bim.module.csv.prop import CsvProperties from bonsai.bim.module.diff.prop import DiffProperties from bonsai.bim.module.fm.prop import BIMFMProperties - from bonsai.bim.module.light.prop import BIMSolarProperties, RadianceExporterProperties + from bonsai.bim.module.light.prop import ( + BIMSolarProperties, + RadianceExporterProperties, + ) + from bonsai.bim.prop import ( + BIMAreaProperties, + BIMCollectionProperties, + BIMObjectProperties, + BIMProperties, + BIMTabProperties, + ) T = TypeVar("T") @@ -127,17 +144,20 @@ def activate_camera(cls, obj: bpy.types.Object) -> None: space.region_3d.view_perspective = "CAMERA" @classmethod - def get_area_props(cls, context: bpy.types.Context) -> bpy.types.PropertyGroup: + def get_active_area_props(cls, context: bpy.types.Context) -> BIMAreaProperties | BIMTabProperties: + FULLSCREEN_SUFFIX = "-nonnormal" # Ctrl-space temporary fullscreen + assert (screen := context.screen) try: - if context.screen.name.endswith("-nonnormal"): # Ctrl-space temporary fullscreen - screen = bpy.data.screens[context.screen.name.removesuffix("-nonnormal")] + if screen.name.endswith(FULLSCREEN_SUFFIX): + screen = bpy.data.screens[screen.name.removesuffix(FULLSCREEN_SUFFIX)] # The original area object has its type changed to "EMPTY" apparently index = [a.type for a in screen.areas].index("EMPTY") - return screen.BIMAreaProperties[index] - return context.screen.BIMAreaProperties[context.screen.areas[:].index(context.area)] + return cls.get_area_props(screen)[index] + assert (area := context.area) + return cls.get_area_props(screen)[screen.areas[:].index(area)] except IndexError: # Fallback in case areas aren't setup yet. - return context.screen.BIMTabProperties + return cls.get_tab_props(screen) @classmethod def set_active_object(cls, obj: bpy.types.Object) -> None: @@ -154,18 +174,28 @@ def clear_active_object(cls) -> None: def setup_tabs(cls) -> None: # https://blender.stackexchange.com/questions/140644/how-can-make-the-state-of-a-boolean-property-relative-to-the-3d-view-area for screen in bpy.data.screens: - if len(screen.BIMAreaProperties) == 20: + area_props = cls.get_area_props(screen) + if len(area_props) == 20: continue - screen.BIMAreaProperties.clear() + area_props.clear() for i in range(20): # 20 is an arbitrary value of split areas - screen.BIMAreaProperties.add() + area_props.add() @classmethod - def is_tab(cls, context: bpy.types.Context, tab: str) -> bool: - aprops = cls.get_area_props(context) + def should_show_panel(cls, context: bpy.types.Context, tab: str, panel: str) -> bool: + aprops = cls.get_active_area_props(context) if aprops.path_from_id() == "BIMAreaProperties" and context.area.spaces.active.search_filter: return True - return aprops.tab == tab + if (is_bookmark_tab := aprops.tab == "BOOKMARK") or aprops.tab == tab: + bprops = tool.Blender.get_bim_props() + if not (panel_visibility := bprops.panel_visibilities.get(panel)): + return not is_bookmark_tab + if is_bookmark_tab: + if panel_visibility.is_bookmarked: + return True + elif panel_visibility.is_visible: + return True + return False @classmethod def is_default_scene(cls) -> bool: @@ -311,15 +341,27 @@ def message_ui(self, context): @classmethod def get_view3d_area(cls) -> Union[bpy.types.Area, None]: - for window in bpy.context.window_manager.windows: + assert (wm := bpy.context.window_manager) + for window in wm.windows: for area in window.screen.areas: if area.type == "VIEW_3D": return area + @classmethod + def operator_idname_to_py(cls, idname: str) -> str: + """Convert a Blender internal operator idname to its Python equivalent. + + Example: ``MESH_OT_primitive_cube_add`` -> ``mesh.primitive_cube_add`` + """ + module, func = idname.split("_OT_", 1) + return f"{module.lower()}.{func}" + @classmethod def get_view3d_space(cls) -> Union[bpy.types.SpaceView3D, None]: if area := cls.get_view3d_area(): - return area.spaces.active + space = area.spaces.active + assert isinstance(space, bpy.types.SpaceView3D) + return space @classmethod def get_blender_prop_default_value(cls, props: bpy.types.bpy_struct, prop_name: str) -> Any: @@ -382,17 +424,14 @@ def get_shader_editor_context(cls) -> Union[dict[str, Any], None]: assert isinstance(space, bpy.types.SpaceNodeEditor) if space.tree_type == "ShaderNodeTree": context_override = {"area": area, "space": space, "screen": screen} - + # Add window if screen differs from current context context = bpy.context if context and context.screen != screen: - window = next( - (w for w in context.window_manager.windows if w.screen == screen), - None - ) + window = next((w for w in context.window_manager.windows if w.screen == screen), None) if window: context_override["window"] = window - + return context_override @classmethod @@ -443,6 +482,14 @@ def update_screen(cls) -> None: def update_viewport(cls) -> None: cls.get_viewport_context()["area"].tag_redraw() + @classmethod + def update_all_viewports(cls, context: bpy.types.Context | None = None) -> None: + context = context or bpy.context + assert context.screen + for area in context.screen.areas: + if area.type == "VIEW_3D": + area.tag_redraw() + @classmethod def force_depsgraph_update(cls) -> None: """useful if you need to trigger callbacks like `depsgraph_update_pre`""" @@ -703,13 +750,18 @@ def set_objects_selection( if active_object: active_object.select_set(True) + class ObjectsSelectionArgs(NamedTuple): + context: bpy.types.Context + active_object: bpy.types.Object | None + selected_objects: list[bpy.types.Object] + @classmethod def validate_object_selection( cls, context: bpy.types.Context, active_object: Union[bpy.types.Object, None] = None, selected_objects: Sequence[bpy.types.Object] = (), - ) -> tuple[bpy.types.Context, Union[bpy.types.Object, None], list[bpy.types.Object]]: + ) -> ObjectsSelectionArgs: """Validate object selection and return only valid objects. Can be used before ``set_objects_selection`` to avoid errors @@ -719,12 +771,15 @@ def validate_object_selection( assert context.view_layer view_layer_objects = set(context.view_layer.objects) - new_selected_objects = [o for o in selected_objects if cls.is_valid_data_block(o) and o in view_layer_objects] + def is_selectable(obj: bpy.types.Object) -> bool: + return cls.is_valid_data_block(obj) and obj in view_layer_objects - if active_object and not cls.is_valid_data_block(active_object): + new_selected_objects = [o for o in selected_objects if is_selectable(o)] + + if active_object and not is_selectable(active_object): active_object = None - return context, active_object, new_selected_objects + return cls.ObjectsSelectionArgs(context, active_object, new_selected_objects) @classmethod def clear_objects_selection(cls) -> None: @@ -742,7 +797,11 @@ def get_enum_safe(cls, props: bpy.types.PropertyGroup, prop_name: str) -> Union[ # Yes, accessing items through annotations is a bit hacky # but it's the only way to get the dynamic enum items # besides providing them to get_enum_safe explicitly. - prop_keywords = props.__annotations__[prop_name].keywords + try: + annotations = props.__annotations__ + except AttributeError: + annotations = type(props).__annotations__ + prop_keywords = annotations[prop_name].keywords items = prop_keywords.get("items") if items is None: return None @@ -1214,7 +1273,8 @@ def bake_children_transform(cls, parent_element: entity_instance, item: int) -> @classmethod def constrain_children_to_parent(cls, parent_element: ifcopenshell.entity_instance) -> None: - parent_obj = tool.Ifc.get_object(parent_element) + if not (parent_obj := tool.Ifc.get_object(parent_element)): + return # Filtered out, arrayed void, etc assert isinstance(parent_obj, bpy.types.Object) children = cls.get_all_children_objects(parent_element) for child in children: @@ -1339,11 +1399,11 @@ def get_bonsai_version(cls) -> str: @classmethod def register_toolbar(cls): - import bonsai.bim.module.model.workspace as ws_model + import bonsai.bim.module.covering.workspace as ws_covering import bonsai.bim.module.drawing.workspace as ws_drawing + import bonsai.bim.module.model.workspace as ws_model import bonsai.bim.module.spatial.workspace as ws_spatial import bonsai.bim.module.structural.workspace as ws_structural - import bonsai.bim.module.covering.workspace as ws_covering if bpy.app.background: return @@ -1371,11 +1431,11 @@ def register_toolbar(cls): @classmethod def unregister_toolbar(cls): - import bonsai.bim.module.model.workspace as ws_model + import bonsai.bim.module.covering.workspace as ws_covering import bonsai.bim.module.drawing.workspace as ws_drawing + import bonsai.bim.module.model.workspace as ws_model import bonsai.bim.module.spatial.workspace as ws_spatial import bonsai.bim.module.structural.workspace as ws_structural - import bonsai.bim.module.covering.workspace as ws_covering if bpy.app.background: return @@ -1460,7 +1520,10 @@ def sort_panels_for_register(cls, items: list[str], items_to_parents: dict[str, def override_scene_panel(cls, original_panel: bpy.types.Panel) -> None: @classmethod def poll_check_blender_tab(cls, context): - return tool.Blender.is_tab(context, "BLENDER") + aprops = tool.Blender.get_active_area_props(context) + if aprops.path_from_id() == "BIMAreaProperties" and context.area.spaces.active.search_filter: + return True + return aprops.tab == "BLENDER" polls = bonsai.bim.original_scene_panels_polls @@ -1539,13 +1602,22 @@ def get_sun_props(cls) -> Union[SunPosProperties, None]: return getattr(scene, "sun_pos_properties", None) @classmethod - def scale_font_size(cls, size): + def scale_font_size(cls, size=None): default_dpi = 72 default_pixel_size = 1.0 + ui_style = bpy.context.preferences.ui_styles[0] + base_size = ui_style.widget.points if size is None else size + platform_scale = 0.5 if sys.platform == "darwin" else 1 + default_scale = default_dpi * default_pixel_size system = bpy.context.preferences.system system_scale = system.dpi * system.pixel_size - return (system_scale / default_scale) * size + return ( + (system_scale / default_scale) + * base_size + * platform_scale + * tool.Blender.get_addon_preferences().decorator_font_scale + ) @classmethod def apply_transform_as_local(cls, obj: bpy.types.Object) -> bool: @@ -1750,8 +1822,8 @@ def setup_user_data_dir(cls) -> None: @classmethod @lru_cache def get_list_of_tools(cls) -> tuple[str, ...]: - from bonsai.bim.module.model.workspace import BimTool from bonsai.bim.module.drawing.workspace import AnnotationTool + from bonsai.bim.module.model.workspace import BimTool return tuple(cls.bl_idname for cls in (BimTool.__subclasses__() + [BimTool, AnnotationTool])) @@ -1788,6 +1860,18 @@ def get_bim_props(cls, scene: Optional[bpy.types.Scene] = None) -> BIMProperties assert (scene := bpy.context.scene) return scene.BIMProperties # pyright: ignore[reportAttributeAccessIssue] + @classmethod + def get_area_props(cls, screen: bpy.types.Screen) -> bpy.types.bpy_prop_collection_idprop[BIMAreaProperties]: + return screen.BIMAreaProperties # pyright: ignore[reportAttributeAccessIssue] + + @classmethod + def get_tab_props(cls, screen: bpy.types.Screen) -> BIMTabProperties: + return screen.BIMTabProperties # pyright: ignore[reportAttributeAccessIssue] + + @classmethod + def get_collection_props(cls, collection: bpy.types.Collection) -> BIMCollectionProperties: + return collection.BIMCollectionProperties # pyright: ignore[reportAttributeAccessIssue] + @classmethod def get_object_bim_props(cls, obj: bpy.types.Object) -> BIMObjectProperties: return obj.BIMObjectProperties # pyright: ignore[reportAttributeAccessIssue] @@ -1841,19 +1925,21 @@ def get_valid_uilist_index(cls, current_index: int, items: Sized) -> int: @classmethod def clear_undo_history(cls) -> None: """Clears the Blender history, Bonsai history, and IfcOpenShell history""" - old_undo_steps = bpy.context.preferences.edit.undo_steps - bpy.context.preferences.edit.undo_steps = 2 + assert (preferences := bpy.context.preferences) + old_undo_steps = preferences.edit.undo_steps + preferences.edit.undo_steps = 2 for i in range(3): bpy.ops.ed.undo_push(message="Undo history cleared") - bpy.context.preferences.edit.undo_steps = old_undo_steps + preferences.edit.undo_steps = old_undo_steps tool.Ifc.clear_history() old_history_size = tool.Ifc.get().history_size tool.Ifc.get().set_history_size(0) tool.Ifc.get().set_history_size(old_history_size) @classmethod - def get_unit_scale(cls): - unit_length = bpy.context.scene.unit_settings.length_unit + def get_unit_scale(cls) -> float: + assert (scene := bpy.context.scene) + unit_length = scene.unit_settings.length_unit unit_scale = 1.0 if unit_length == "CENTIMETERS": unit_scale = 0.01 @@ -2104,3 +2190,71 @@ def get_eevee_name(cls) -> Literal["BLENDER_EEVEE"] | Literal["BLENDER_EEVEE_NEX if cls.BLENDER_5: return "BLENDER_EEVEE" return "BLENDER_EEVEE_NEXT" + + @classmethod + def np_frombuffer_legacy(cls, bytedata: bytes, n: int) -> npt.NDArray[np.float32]: + """ + Read ``n`` float values from ``bytedata``, regardless if they are stored as ``float32`` or ``float64``. + Needed to support .blend files saved in Blender <5.0.0. + Also allows to work with .blend files from 5.0.0+ in older Blender versions. + + In ``bpy.app.version >= 5.0.0`` ``mathutils`` transitioned to use ``float32`` buffer type, + while in previous version they were using ``float64``. + In some cases we are storing raw bytes (e.g. object transforms cheksums), so old .blend files + might still have ``float64`` data stored. + + See https://projects.blender.org/blender/blender/issues/149283 + """ + if len(bytedata) == (n * 2): + return np.frombuffer(bytedata, dtype=np.float64).astype(np.float32) + return np.frombuffer(bytedata, dtype=np.float32) + + @classmethod + def np_array_legacy(cls, mathutils_type: Union[Vector, Matrix]) -> npt.NDArray[np.float32]: + """ + Converts ``mathutils`` types to ``np.float32`` arrays, regardless of Blender version. + + See ``np_frombuffer_legacy`` for more details. + """ + if cls.BLENDER_5: + return np.array(mathutils_type) + return np.array(mathutils_type, dtype=np.float32) + + @classmethod + def get_selected_files( + cls, directory: str, files: bpy.types.OperatorFileListElement, use_relative_path=False + ) -> list[Path]: + return [ + tool.Ifc.get_uri(Path(directory) / f.name, use_relative_path=use_relative_path) + for f in files + if (Path(directory) / f.name).is_file() + ] + + @classmethod + def ray_cast_scene( + cls, + context: bpy.types.Context, + origin: Vector, + direction: Vector, + ) -> tuple[bool, Vector, Vector, int, bpy.types.Object, Matrix]: + """ + + The returned matrix is just ``obj.matrix_world``. + The returned object is not evaluated by the current depsgraph, + e.g. if object is modified by the depsgraph (e.g. by modifiers) + object has to be evaluated first (`obj.evaluated_get(depsgraph)`). + """ + depsgraph = context.evaluated_depsgraph_get() + assert context.scene + result = context.scene.ray_cast( + depsgraph, + origin, + direction, + ) + return result + + @classmethod + def depsgraph_evaluate(cls, obj: bpy.types.Object) -> bpy.types.Object: + depsgraph = bpy.context.evaluated_depsgraph_get() + evaluated_obj = obj.evaluated_get(depsgraph) + return evaluated_obj diff --git a/src/bonsai/bonsai/tool/boundary.py b/src/bonsai/bonsai/tool/boundary.py index d09ebcbee17..16662919aa2 100644 --- a/src/bonsai/bonsai/tool/boundary.py +++ b/src/bonsai/bonsai/tool/boundary.py @@ -17,16 +17,22 @@ # along with Bonsai. If not, see . from __future__ import annotations + +from collections.abc import Sequence +from typing import TYPE_CHECKING, Any + import bpy import mathutils +from mathutils import Matrix, Vector + import bonsai.core.tool import bonsai.tool as tool -from mathutils import Matrix, Vector -from typing import Any, TYPE_CHECKING -from collections.abc import Sequence if TYPE_CHECKING: - from bonsai.bim.module.boundary.prop import BIMBoundaryProperties, BIMObjectBoundaryProperties + from bonsai.bim.module.boundary.prop import ( + BIMBoundaryProperties, + BIMObjectBoundaryProperties, + ) class Boundary(bonsai.core.tool.Boundary): diff --git a/src/bonsai/bonsai/tool/brick.py b/src/bonsai/bonsai/tool/brick.py index 9da53f44135..7ef2c304449 100644 --- a/src/bonsai/bonsai/tool/brick.py +++ b/src/bonsai/bonsai/tool/brick.py @@ -17,36 +17,39 @@ # along with Bonsai. If not, see . from __future__ import annotations + +import datetime import os +from collections.abc import Generator +from contextlib import contextmanager +from pathlib import Path +from typing import TYPE_CHECKING, Any, Union + import bpy -import datetime import ifcopenshell import ifcopenshell.guid import ifcopenshell.util.brick import ifcopenshell.util.element import ifcopenshell.util.system + import bonsai.core.brick import bonsai.core.tool import bonsai.tool as tool -from pathlib import Path -from contextlib import contextmanager -from typing import Any, Union, TYPE_CHECKING -from collections.abc import Generator try: + import brickschema import brickschema.persistent from brickschema.namespaces import REF, A - import urllib.parse - from rdflib import Literal, URIRef, Namespace, BNode - from rdflib.namespace import RDF + from rdflib import BNode, Literal, Namespace, URIRef except: # See #1860 print("Warning: brickschema not available.") if TYPE_CHECKING: import brickschema - from rdflib import Literal, URIRef, Namespace, BNode + from rdflib import BNode, Literal, Namespace, URIRef + from bonsai.bim.module.brick.prop import BIMBrickProperties # silence known rdflib_sqlalchemy TypeError warning @@ -161,17 +164,13 @@ def clear_project(cls) -> None: @classmethod def export_brick_attributes(cls, brick_uri: str) -> dict[str, Any]: - query = BrickStore.graph.query( - """ + query = BrickStore.graph.query(""" PREFIX rdfs: SELECT ?label { <{brick_uri}> rdfs:label ?label . } LIMIT 1 - """.replace( - "{brick_uri}", brick_uri - ) - ) + """.replace("{brick_uri}", brick_uri)) name = None for row in query: name = str(row.get("label")) @@ -215,18 +214,14 @@ def get_brick_path_name(cls) -> str: @classmethod def get_brickifc_project(cls) -> Union[str, None]: project = tool.Ifc.get().by_type("IfcProject")[0] - query = BrickStore.graph.query( - """ + query = BrickStore.graph.query(""" PREFIX ref: SELECT ?proj WHERE { ?proj a ref:ifcProject . ?proj ref:ifcProjectID "{project_globalid}" . } LIMIT 1 - """.replace( - "{project_globalid}", project.GlobalId - ) - ) + """.replace("{project_globalid}", project.GlobalId)) results = list(query) if results: return results[0][0].toPython() @@ -272,17 +267,13 @@ def get_element_feeds(cls, element: ifcopenshell.entity_instance) -> set[ifcopen @classmethod def get_item_class(cls, item: str) -> Union[str, None]: - query = BrickStore.graph.query( - """ + query = BrickStore.graph.query(""" PREFIX brick: SELECT ?class WHERE { <{item}> a ?class . } LIMIT 1 - """.replace( - "{item}", item - ) - ) + """.replace("{item}", item)) for row in query: return row.get("class").toPython().split("#")[-1] @@ -305,8 +296,7 @@ def get_namespace(cls, uri: str) -> str: @classmethod def import_brick_classes(cls, brick_class: str, split_screen: bool = False) -> None: - query = BrickStore.graph.query( - """ + query = BrickStore.graph.query(""" PREFIX brick: PREFIX rdfs: PREFIX rdf: @@ -319,10 +309,7 @@ def import_brick_classes(cls, brick_class: str, split_screen: bool = False) -> N } GROUP BY ?group ORDER BY asc(?group) - """.replace( - "{brick_class}", brick_class - ) - ) + """.replace("{brick_class}", brick_class)) props = tool.Brick.get_brick_props() if split_screen: bricks = props.split_screen_bricks @@ -339,8 +326,7 @@ def import_brick_classes(cls, brick_class: str, split_screen: bool = False) -> N @classmethod def import_brick_items(cls, brick_class: str, split_screen: bool = False) -> None: - query = BrickStore.graph.query( - """ + query = BrickStore.graph.query(""" PREFIX brick: PREFIX rdfs: PREFIX rdf: @@ -351,10 +337,7 @@ def import_brick_items(cls, brick_class: str, split_screen: bool = False) -> Non } } ORDER BY asc(?item) - """.replace( - "{brick_class}", brick_class - ) - ) + """.replace("{brick_class}", brick_class)) props = tool.Brick.get_brick_props() if split_screen: bricks = props.split_screen_bricks @@ -504,8 +487,7 @@ def get_project(cls) -> brickschema.graph.Graph: @classmethod def load_sub_roots(cls) -> None: - query = BrickStore.graph.query( - """ + query = BrickStore.graph.query(""" PREFIX brick: PREFIX rdfs: SELECT ?subRoot ?subClasses WHERE { @@ -522,8 +504,7 @@ def load_sub_roots(cls) -> None: } FILTER(?subClasses > 3) } - """ - ) + """) for row in query: sub_root = row.get("subRoot").toPython().split("#")[-1] BrickStore.root_classes.append(sub_root) @@ -555,8 +536,7 @@ def load_namespaces(cls) -> None: @classmethod def load_entity_classes(cls) -> None: for root_class in BrickStore.root_classes: - query = BrickStore.graph.query( - """ + query = BrickStore.graph.query(""" PREFIX brick: PREFIX rdfs: PREFIX owl: @@ -566,25 +546,20 @@ def load_entity_classes(cls) -> None: ?class owl:deprecated true . } } - """.replace( - "{root_class}", root_class - ) - ) + """.replace("{root_class}", root_class)) BrickStore.entity_classes[root_class] = [] for uri in sorted([x[0].toPython() for x in query]): BrickStore.entity_classes[root_class].append(uri) @classmethod def load_relationships(cls) -> None: - query = BrickStore.graph.query( - """ + query = BrickStore.graph.query(""" PREFIX brick: PREFIX rdfs: SELECT DISTINCT ?relation WHERE { ?relation rdfs:subPropertyOf brick:Relationship . } - """ - ) + """) for uri in sorted([x[0].toPython() for x in query]): BrickStore.relationships.append(uri) diff --git a/src/bonsai/bonsai/tool/bsdd.py b/src/bonsai/bonsai/tool/bsdd.py index 337cf626c9f..387474b81fd 100644 --- a/src/bonsai/bonsai/tool/bsdd.py +++ b/src/bonsai/bonsai/tool/bsdd.py @@ -17,26 +17,43 @@ # along with Bonsai. If not, see . from __future__ import annotations -import bonsai.core.tool -import bonsai.tool as tool -import bpy + import json +from typing import TYPE_CHECKING, Any, TypedDict, Union + +import bpy import bsdd import ifcopenshell.api.library -import ifcopenshell.util.type -import ifcopenshell.util.element import ifcopenshell.util.classification -from typing import Any, Union, TYPE_CHECKING, TypedDict +import ifcopenshell.util.element +import ifcopenshell.util.type + +import bonsai.core.tool +import bonsai.tool as tool if TYPE_CHECKING: + from bsdd.bsdd import ClassContractV1, ClassPropertyContractV1, PropertyContractV5 + from bonsai.bim.module.bsdd.prop import BIMBSDDProperties, BSDDDictionary class Bsdd(bonsai.core.tool.Bsdd): - identifier_url = "https://identifier.buildingsmart.org" + default_identifier_url = "https://identifier.buildingsmart.org" + default_api_url = "https://api.bsdd.buildingsmart.org/api/" client = bsdd.Client() - bsdd_classes: dict[str, dict] = {} - bsdd_properties: dict[str, dict] = {} + bsdd_classes: dict[str, ClassContractV1] = {} + bsdd_properties: dict[str, ClassPropertyContractV1 | PropertyContractV5] = {} + + @classmethod + def identifier_url(cls) -> str: + """Derives the identifier base URL from the current client baseurl. + Falls back to the standard bSDD identifier URL when using the default API.""" + if cls.client.baseurl == cls.default_api_url: + return cls.default_identifier_url + from urllib.parse import urlparse + + parsed = urlparse(cls.client.baseurl) + return f"{parsed.scheme}://{parsed.netloc}" @classmethod def get_bsdd_props(cls) -> BIMBSDDProperties: @@ -120,6 +137,10 @@ def get_dictionary(cls, uri: str) -> bsdd.DictionaryContractV1: @classmethod def get_dictionaries(cls) -> list[bsdd.DictionaryContractV1]: prefs = tool.Blender.get_addon_preferences() + baseurl = getattr(prefs, "bsdd_baseurl", "https://api.bsdd.buildingsmart.org/api/") + cls.client = bsdd.Client() + if hasattr(cls.client, "baseurl"): + cls.client.baseurl = baseurl response = cls.client.get_dictionary(include_test_dictionaries=prefs.bsdd_load_test_dictionaries) dicts = response.get("dictionaries") or [] statuses = ["Active"] @@ -248,7 +269,8 @@ def get_bsdd_class(cls, uri: str) -> dict: @classmethod def get_bsdd_property(cls, uri: str) -> dict: if not (bsdd_property := cls.bsdd_properties.get(uri, {})): - bsdd_property = cls.client.get_property(uri, include_classes=True) + # Cache miss occurs for keyword search mode, for classes cache is prepopulated. + bsdd_property = cls.client.get_property(uri) cls.bsdd_properties[uri] = bsdd_property return bsdd_property @@ -262,7 +284,7 @@ def import_classes(cls, obj, obj_type) -> None: for obj in tool.Blender.get_selected_objects(include_active=True): if element := tool.Ifc.get_entity(obj): for reference in ifcopenshell.util.classification.get_references(element): - if (uri := reference.Location) and uri.startswith(cls.identifier_url): + if (uri := reference.Location) and uri.startswith(cls.identifier_url()): classes.add((reference[1] or reference[2] or "Unnamed", uri)) dictionary_uris = ( @@ -376,7 +398,7 @@ def import_selected_properties(cls) -> None: def get_applicable_psets(cls, element: ifcopenshell.entity_instance): uris = set() for reference in ifcopenshell.util.classification.get_references(element): - if (uri := reference.Location) and uri.startswith(cls.identifier_url): + if (uri := reference.Location) and uri.startswith(cls.identifier_url()): uris.add(uri) psets = set() for uri in uris: @@ -392,7 +414,7 @@ def get_applicable_psets(cls, element: ifcopenshell.entity_instance): def is_applicable(cls, pset_uri: str, element: ifcopenshell.entity_instance) -> bool: uris = set() for reference in ifcopenshell.util.classification.get_references(element): - if (uri := reference.Location) and uri.startswith(cls.identifier_url): + if (uri := reference.Location) and uri.startswith(cls.identifier_url()): uris.add(uri) class_uri, pset_name = pset_uri.rsplit("#", 1) return class_uri in uris diff --git a/src/bonsai/bonsai/tool/cad.py b/src/bonsai/bonsai/tool/cad.py index 8c65f4babb4..c91b5df0d8d 100644 --- a/src/bonsai/bonsai/tool/cad.py +++ b/src/bonsai/bonsai/tool/cad.py @@ -29,15 +29,16 @@ # - You can now derive the center from an arc without generating geometry from __future__ import annotations -import sys -import bpy + import math +import sys +from typing import TYPE_CHECKING, Union + import bmesh -import numpy as np +import bpy import mathutils.geometry -from mathutils import Vector, Matrix, geometry -import itertools -from typing import TYPE_CHECKING, Union +import numpy as np +from mathutils import Matrix, Vector, geometry if TYPE_CHECKING: from bonsai.bim.module.cad.prop import BIMCadProperties @@ -840,7 +841,7 @@ def offset_edges(cls, bm, distance, mw=Matrix.Identity(4), wp=Matrix.Identity(4) return new_verts @classmethod - def region_2d_to_vector_3d_np(cls, region: bpy.types.Region, rv3d: bpy.types.RegionView3d, coord: Vector) -> Vector: + def region_2d_to_vector_3d_np(cls, region: bpy.types.Region, rv3d: bpy.types.RegionView3D, coord: Vector) -> Vector: """ Numpy version of view3d_utils.region_2d_to_vector_3d Return a direction vector from the viewport at the specific 2d region @@ -879,7 +880,7 @@ def region_2d_to_vector_3d_np(cls, region: bpy.types.Region, rv3d: bpy.types.Reg @classmethod def region_2d_to_location_3d_np( - cls, region: bpy.types.Region, rv3d: bpy.types.RegionView3d, coord: Vector, depth_location: Vector + cls, region: bpy.types.Region, rv3d: bpy.types.RegionView3D, coord: Vector, depth_location: Vector ) -> Vector: """ Numpy version of view3d_utils.region_2d_to_location_3d @@ -912,7 +913,7 @@ def region_2d_to_location_3d_np( @classmethod def region_2d_to_origin_3d_np( - cls, region: bpy.types.Region, rv3d: bpy.types.RegionView3d, coord: Vector, *, clamp: float = None + cls, region: bpy.types.Region, rv3d: bpy.types.RegionView3D, coord: Vector, *, clamp: float = None ) -> Vector: """ Numpy version of view3d_utils.region_2d_to_origin_3d @@ -970,7 +971,7 @@ def region_2d_to_origin_3d_np( @classmethod def location_3d_to_region_2d_np( - cls, region: bpy.types.Region, rv3d: bpy.types.RegionView3d, coord: Vector, *, default=None + cls, region: bpy.types.Region, rv3d: bpy.types.RegionView3D, coord: Vector, *, default=None ) -> Vector: """ Numpy version of view3d_utils.location_3d_to_region_2d diff --git a/src/bonsai/bonsai/tool/clash.py b/src/bonsai/bonsai/tool/clash.py index 17582540e4d..fb64e82b49e 100644 --- a/src/bonsai/bonsai/tool/clash.py +++ b/src/bonsai/bonsai/tool/clash.py @@ -17,17 +17,17 @@ # along with Bonsai. If not, see . from __future__ import annotations -import os -import bpy + import json -import ifcopenshell -import bonsai.core.tool -import bonsai.tool as tool -from contextlib import contextmanager -from mathutils import Vector +from typing import TYPE_CHECKING, Literal, Union + +import bpy from ifcclash import ifcclash from ifcclash.ifcclash import ClashSource -from typing import TYPE_CHECKING, Union, Literal, get_args +from mathutils import Vector + +import bonsai.core.tool +import bonsai.tool as tool if TYPE_CHECKING: from bonsai.bim.module.clash.prop import BIMClashProperties diff --git a/src/bonsai/bonsai/tool/classification.py b/src/bonsai/bonsai/tool/classification.py index 3535e0a12f2..9264e5bee27 100644 --- a/src/bonsai/bonsai/tool/classification.py +++ b/src/bonsai/bonsai/tool/classification.py @@ -17,15 +17,19 @@ # along with Bonsai. If not, see . from __future__ import annotations + +from typing import TYPE_CHECKING, Union, assert_never + import bpy import ifcopenshell.api -import ifcopenshell.util.classification + import bonsai.core.tool -import bonsai.tool as tool -from typing import Union, assert_never, TYPE_CHECKING if TYPE_CHECKING: - from bonsai.bim.module.classification.prop import BIMClassificationReferenceProperties, BIMClassificationProperties + from bonsai.bim.module.classification.prop import ( + BIMClassificationProperties, + BIMClassificationReferenceProperties, + ) class Classification(bonsai.core.tool.Classification): diff --git a/src/bonsai/bonsai/tool/collector.py b/src/bonsai/bonsai/tool/collector.py index e91c52d3d08..1e6653acd1c 100644 --- a/src/bonsai/bonsai/tool/collector.py +++ b/src/bonsai/bonsai/tool/collector.py @@ -16,11 +16,12 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . + import bpy +import ifcopenshell.util.element + import bonsai.core.tool import bonsai.tool as tool -import ifcopenshell.util.element -from typing import Union class Collector(bonsai.core.tool.Collector): @@ -52,12 +53,12 @@ def assign(cls, obj: bpy.types.Object, should_clean_users_collection=True) -> No tool.Geometry.lock_object(obj) element = (element.PartOfU or element.PartOfV or element.PartOfW)[0] if not tool.Spatial.get_grid_props().is_visible: - obj.hide_set(True) + obj.hide_viewport = True elif element.is_a("IfcGrid"): if tool.Geometry.is_locked(element): tool.Geometry.lock_object(obj) if not tool.Spatial.get_grid_props().is_visible: - obj.hide_set(True) + obj.hide_viewport = True if element.is_a("IfcProject"): if tool.Geometry.is_locked(element): @@ -73,6 +74,8 @@ def assign(cls, obj: bpy.types.Object, should_clean_users_collection=True) -> No tool.Geometry.lock_object(obj) collection = cls._create_project_child_collection("IfcSpace") cls.link_collection_object_safe(collection, obj) + if not tool.Spatial.get_spatial_props().is_visible: + obj.hide_viewport = True elif element.is_a("IfcStructuralItem"): collection = cls._create_project_child_collection("IfcStructuralItem") cls.link_collection_object_safe(collection, obj) @@ -154,7 +157,8 @@ def _create_own_collection(cls, obj: bpy.types.Object) -> bpy.types.Collection: return collection = bpy.data.collections.new(obj.name) props.collection = collection - collection.BIMCollectionProperties.obj = obj + collection_props = tool.Blender.get_collection_props(collection) + collection_props.obj = obj return collection @classmethod diff --git a/src/bonsai/bonsai/tool/context.py b/src/bonsai/bonsai/tool/context.py index c1582cd37fc..50223a6320a 100644 --- a/src/bonsai/bonsai/tool/context.py +++ b/src/bonsai/bonsai/tool/context.py @@ -17,16 +17,19 @@ # along with Bonsai. If not, see . from __future__ import annotations + +from typing import TYPE_CHECKING, Any, Union + import bpy +import ifcopenshell + import bonsai.bim.helper -import bonsai.tool as tool import bonsai.core.tool -import ifcopenshell -from typing import Any, Union, TYPE_CHECKING +import bonsai.tool as tool if TYPE_CHECKING: - from bonsai.bim.prop import Attribute from bonsai.bim.module.context.prop import BIMContextProperties + from bonsai.bim.prop import Attribute class Context(bonsai.core.tool.Context): diff --git a/src/bonsai/bonsai/tool/cost.py b/src/bonsai/bonsai/tool/cost.py index d1ee2a841c5..fc07a629a6b 100644 --- a/src/bonsai/bonsai/tool/cost.py +++ b/src/bonsai/bonsai/tool/cost.py @@ -17,26 +17,30 @@ # along with Bonsai. If not, see . from __future__ import annotations + +import json +from collections.abc import Generator +from pathlib import Path +from typing import TYPE_CHECKING, Any, Literal, Optional, Union, assert_never + +import aud import bpy -import bonsai.core.tool -import bonsai.tool as tool import ifcopenshell.api import ifcopenshell.api.cost import ifcopenshell.api.document import ifcopenshell.api.nest -import ifcopenshell.util.element -import ifcopenshell.util.date import ifcopenshell.util.cost +import ifcopenshell.util.date +import ifcopenshell.util.element import ifcopenshell.util.unit + import bonsai.bim.helper -import json -from pathlib import Path -from typing import Optional, Any, Union, Literal, TYPE_CHECKING, assert_never -from collections.abc import Generator +import bonsai.core.tool +import bonsai.tool as tool if TYPE_CHECKING: - from bonsai.bim.prop import Attribute from bonsai.bim.module.cost.prop import BIMCostProperties, CostItemQuantity + from bonsai.bim.prop import Attribute class Cost(bonsai.core.tool.Cost): @@ -140,25 +144,18 @@ def enable_editing_cost_items(cls, cost_schedule: ifcopenshell.entity_instance) @classmethod def play_sound(cls) -> None: - if tool.Blender.get_addon_preferences().should_play_chaching_sound: + # Save ears for those running the tests in background mode. + if tool.Blender.get_addon_preferences().should_play_chaching_sound and not bpy.app.background: cls.play_chaching_sound() # lol @classmethod def play_chaching_sound(cls) -> None: # TODO: make pitch higher as costs rise - try: - import aud - - device = aud.Device() - # chaching.mp3 is by Lucish_ CC-BY-3.0 https://freesound.org/people/Lucish_/sounds/554841/ - sound = aud.Sound(tool.Blender.get_data_dir_path(filename="chaching.mp3").__str__()) - handle = device.play(sound) - sound_buffered = aud.Sound.buffer(sound) - handle_buffered = device.play(sound_buffered) - handle.stop() - handle_buffered.stop() - except: - pass # ah well + device = aud.Device() + # chaching.mp3 is by Lucish_ CC-BY-3.0 https://freesound.org/people/Lucish_/sounds/554841/ + filepath = tool.Blender.get_data_dir_path("chaching.mp3").__str__() + sound = aud.Sound(filepath) # ty:ignore[too-many-positional-arguments] + device.play(sound) @classmethod def load_cost_schedule_tree(cls) -> None: @@ -581,9 +578,10 @@ def import_cost_schedule_csv( ) -> ifcopenshell.entity_instance: if not file_path: return - from ifc5d.csv2ifc import Csv2Ifc import time + from ifc5d.csv2ifc import Csv2Ifc + start = time.time() resolved_path = tool.Ifc.resolve_uri(file_path) @@ -804,8 +802,8 @@ def export_cost_schedules( format: Literal["CSV", "ODS", "XLSX"], cost_schedule: Optional[ifcopenshell.entity_instance] = None, ) -> Union[str, None]: - import subprocess import os + import subprocess import sys if dirpath: @@ -989,7 +987,8 @@ def change_parent_cost_item( def disable_editing_cost_item_parent(cls) -> None: props = cls.get_cost_props() props.active_cost_item_id = 0 - props.change_cost_item_parent = False + if props.change_cost_item_parent == True: + props.change_cost_item_parent = False @classmethod def load_cost_item_quantities(cls, cost_item: Optional[ifcopenshell.entity_instance] = None) -> None: diff --git a/src/bonsai/bonsai/tool/covering.py b/src/bonsai/bonsai/tool/covering.py index c83a6f3e09a..28e2a80716c 100644 --- a/src/bonsai/bonsai/tool/covering.py +++ b/src/bonsai/bonsai/tool/covering.py @@ -17,12 +17,14 @@ # along with Bonsai. If not, see . from __future__ import annotations + +from typing import TYPE_CHECKING + import bpy -import ifcopenshell import ifcopenshell.util.element + import bonsai.core.tool import bonsai.tool as tool -from typing import TYPE_CHECKING if TYPE_CHECKING: from bonsai.bim.module.covering.prop import BIMCoveringProperties diff --git a/src/bonsai/bonsai/tool/debug.py b/src/bonsai/bonsai/tool/debug.py index 8bd17fa1c10..ccd30ddd74b 100644 --- a/src/bonsai/bonsai/tool/debug.py +++ b/src/bonsai/bonsai/tool/debug.py @@ -17,25 +17,28 @@ # along with Bonsai. If not, see . from __future__ import annotations + +import json import os import re -import json +from collections import defaultdict +from collections.abc import Iterable +from typing import TYPE_CHECKING, Literal, Union, assert_never + import bmesh import bpy -import ifcopenshell.ifcopenshell_wrapper as W import ifcopenshell.api.material import ifcopenshell.api.owner import ifcopenshell.express +import ifcopenshell.ifcopenshell_wrapper as W import ifcopenshell.util.element import ifcopenshell.util.schema +from mathutils import Vector + import bonsai.core.style import bonsai.core.tool import bonsai.tool as tool from bonsai.bim.ifc import IfcStore -from mathutils import Vector -from collections import defaultdict -from typing import Literal, TYPE_CHECKING, assert_never, Union -from collections.abc import Iterable if TYPE_CHECKING: from bonsai.bim.module.debug.prop import BIMDebugProperties diff --git a/src/bonsai/bonsai/tool/demo.py b/src/bonsai/bonsai/tool/demo.py index 745fcf914c3..98375b3e3bb 100644 --- a/src/bonsai/bonsai/tool/demo.py +++ b/src/bonsai/bonsai/tool/demo.py @@ -31,11 +31,13 @@ from __future__ import annotations +from typing import TYPE_CHECKING + import bpy import ifcopenshell + import bonsai.core.tool import bonsai.tool as tool -from typing import TYPE_CHECKING if TYPE_CHECKING: from bonsai.bim.module.demo.prop import BIMDemoProperties diff --git a/src/bonsai/bonsai/tool/document.py b/src/bonsai/bonsai/tool/document.py index 3a2f89aa940..910ca92cf45 100644 --- a/src/bonsai/bonsai/tool/document.py +++ b/src/bonsai/bonsai/tool/document.py @@ -17,12 +17,17 @@ # along with Bonsai. If not, see . from __future__ import annotations + +import json +from typing import TYPE_CHECKING, Any, Union + import bpy import ifcopenshell.util.system +from natsort import natsorted + import bonsai.bim.helper import bonsai.core.tool import bonsai.tool as tool -from typing import Any, Union, TYPE_CHECKING if TYPE_CHECKING: from bonsai.bim.module.document.prop import BIMDocumentProperties @@ -33,17 +38,6 @@ class Document(bonsai.core.tool.Document): def get_document_props(cls) -> BIMDocumentProperties: return bpy.context.scene.BIMDocumentProperties - @classmethod - def add_breadcrumb(cls, document: ifcopenshell.entity_instance) -> None: - props = cls.get_document_props() - new = props.breadcrumbs.add() - new.name = str(document.id()) - - @classmethod - def clear_breadcrumbs(cls) -> None: - props = cls.get_document_props() - props.breadcrumbs.clear() - @classmethod def clear_document_tree(cls) -> None: props = cls.get_document_props() @@ -54,6 +48,11 @@ def disable_editing_document(cls) -> None: props = cls.get_document_props() props.active_document_id = 0 + @classmethod + def disable_object_editing_ui(cls) -> None: + props = cls.get_document_props() + props.is_object_editing = False + @classmethod def disable_editing_ui(cls) -> None: props = cls.get_document_props() @@ -69,18 +68,15 @@ def export_document_attributes(cls) -> dict[str, Any]: props = cls.get_document_props() return bonsai.bim.helper.export_attributes(props.document_attributes) - @classmethod - def get_active_breadcrumb(cls) -> Union[ifcopenshell.entity_instance, None]: - props = cls.get_document_props() - if len(props.breadcrumbs): - return tool.Ifc.get().by_id(int(props.breadcrumbs[-1].name)) - @classmethod def import_document_attributes(cls, document: ifcopenshell.entity_instance) -> None: props = cls.get_document_props() props.document_attributes.clear() - def callback(attr_name: str, _, data: dict[str, Any]) -> Union[bool, None]: + def callback(attr_name: str, attr_value: Any, data: dict[str, Any]) -> Union[bool, None]: + if attr_name == "Location" and attr_value is None: + data[attr_name] = "" + return True if attr_name != "Name": return None # Proceed normally @@ -100,52 +96,132 @@ def callback(attr_name: str, _, data: dict[str, Any]) -> Union[bool, None]: def import_project_documents(cls) -> None: props = cls.get_document_props() props.documents.clear() - project = tool.Ifc.get().by_type("IfcProject")[0] + file = tool.Ifc.get() + try: + expanded_documents = json.loads(props.json_string) + except (AttributeError, json.JSONDecodeError): + expanded_documents = [] + + project = file.by_type("IfcProject")[0] if file.by_type("IfcProject") else None + if not project: + return + + document_children = {} + + for rel in file.by_type("IfcDocumentInformationRelationship"): + parent_id = rel.RelatingDocument.id() + if parent_id not in document_children: + document_children[parent_id] = [] + + for child in rel.RelatedDocuments: + document_children[parent_id].append(child) + + is_ifc2x3 = file.schema == "IFC2X3" + + if is_ifc2x3: + for ref in file.by_type("IfcDocumentReference"): + if ref.ReferenceToDocument: + parent = ref.ReferenceToDocument[0] + parent_id = parent.id() + if parent_id not in document_children: + document_children[parent_id] = [] + document_children[parent_id].append(ref) + else: + for ref in file.by_type("IfcDocumentReference"): + if ref.ReferencedDocument: + parent = ref.ReferencedDocument + parent_id = parent.id() + if parent_id not in document_children: + document_children[parent_id] = [] + document_children[parent_id].append(ref) + + root_documents = [] for rel in project.HasAssociations or []: if rel.is_a("IfcRelAssociatesDocument") and rel.RelatingDocument.is_a("IfcDocumentInformation"): - element = rel.RelatingDocument - new = props.documents.add() - new.ifc_definition_id = element.id() - new["name"] = element.Name or "Unnamed" - new.is_information = True - new["identification"] = cls.get_document_information_id(element) + is_child = False + for children in document_children.values(): + if rel.RelatingDocument in children: + is_child = True + break + + if not is_child: + root_documents.append(rel.RelatingDocument) + + root = props.documents.add() + root.ifc_definition_id = -project.id() + root.document_type = "PROJECT" + root.name = f"Project Documents ({project.Name or 'Unnamed Project'})" + root.identification = "" + root.location = "" + root.tree_depth = 0 + root.has_children = bool(root_documents) + + root_id = -project.id() + + root.is_expanded = root_id not in expanded_documents + + if root.is_expanded: + root_documents = natsorted( + root_documents, key=lambda doc: (cls.get_document_information_id(doc) or "", doc.Name or "") + ) + + for doc in root_documents: + cls._process_document(doc, props, document_children, expanded_documents, 1) @classmethod - def import_references(cls, document: ifcopenshell.entity_instance) -> None: - props = cls.get_document_props() - is_ifc2x3 = tool.Ifc.get_schema() == "IFC2X3" - references = cls.get_document_references(document) - for element in references: - new = props.documents.add() - new.ifc_definition_id = element.id() - # Use Description + Location instead of Name as IFC has a restriction - # for IfcDocumentReference to have Name only if it has no ReferencedDocument. - name = " - ".join([x for x in [element.Description, element.Location] if x]) - new["name"] = name or "Unnamed" - new["identification"] = cls.get_external_reference_id(element) - new.is_information = False - - @classmethod - def import_subdocuments(cls, document: ifcopenshell.entity_instance) -> None: - props = cls.get_document_props() - if document.IsPointer: - for element in document.IsPointer[0].RelatedDocuments or []: - new = props.documents.add() - new.ifc_definition_id = element.id() - new["name"] = element.Name or "Unnamed" - new.is_information = True - new["identification"] = cls.get_document_information_id(element) or "*" + def _process_document(cls, document, props, document_children, expanded_documents, depth): + new = props.documents.add() + new.ifc_definition_id = document.id() + new.document_type = "INFORMATION" if document.is_a("IfcDocumentInformation") else "REFERENCE" + new.tree_depth = depth + + new.name = document.Name or "" + new.identification = ( + cls.get_document_information_id(document) + if new.document_type == "INFORMATION" + else cls.get_external_reference_id(document) + ) + new.identification = new.identification or "" + new.description = document.Description or "" + new.location = document.Location or "" + + if new.document_type == "INFORMATION": + new.name = document.Name or "Unnamed" + + elif new.document_type == "REFERENCE": + file = document.file + if file.schema == "IFC2X3": + if document.ReferenceToDocument and not new.name: + new.name = document.ReferenceToDocument[0].Name or "" + else: + if document.ReferencedDocument and not new.name: + new.name = document.ReferencedDocument.Name or "" + + doc_id = document.id() + has_children = doc_id in document_children and bool(document_children[doc_id]) + new.has_children = has_children + new.is_expanded = doc_id in expanded_documents + + if has_children and new.is_expanded: + children = document_children[doc_id] + + info_children = natsorted( + [d for d in children if d.is_a("IfcDocumentInformation")], + key=lambda doc: (cls.get_document_information_id(doc) or "", doc.Name or ""), + ) + + ref_children = natsorted( + [d for d in children if not d.is_a("IfcDocumentInformation")], + key=lambda doc: (cls.get_external_reference_id(doc) or "", doc.Description or doc.Name or ""), + ) + + for child in info_children + ref_children: + cls._process_document(child, props, document_children, expanded_documents, depth + 1) @classmethod def is_document_information(cls, document: ifcopenshell.entity_instance) -> bool: return document.is_a("IfcDocumentInformation") - @classmethod - def remove_latest_breadcrumb(cls) -> None: - props = cls.get_document_props() - if len(props.breadcrumbs): - props.breadcrumbs.remove(len(props.breadcrumbs) - 1) - @classmethod def set_active_document(cls, document: ifcopenshell.entity_instance) -> None: props = cls.get_document_props() @@ -175,7 +251,77 @@ def set_external_reference_id(cls, reference: ifcopenshell.entity_instance, valu def get_document_references( cls, document: ifcopenshell.entity_instance ) -> tuple[ifcopenshell.entity_instance, ...]: + # TODO: migrate to util.document and replace all instances """Get IfcDocumentReference.ReferencedDocuments, compatible with IFC2X3.""" if document.file.schema == "IFC2X3": return document.DocumentReferences or () return document.HasDocumentReferences + + @classmethod + def get_reference_document(cls, reference: ifcopenshell.entity_instance) -> ifcopenshell.entity_instance | None: + # TODO: migrate to util.document and replace all instances + if reference.file.schema == "IFC2X3": + return (reference.ReferenceToDocument or (None))[0] + return reference.ReferencedDocument + + @classmethod + def clear_active_document(cls) -> None: + props = cls.get_document_props() + props.active_document_id = 0 + + @classmethod + def clear_document_attributes(cls) -> None: + props = cls.get_document_props() + props.document_attributes.clear() + + @classmethod + def expand_document(cls, document: ifcopenshell.entity_instance) -> None: + props = cls.get_document_props() + try: + expanded_docs = json.loads(props.json_string) + except (AttributeError, json.JSONDecodeError): + expanded_docs = [] + + if document.id() not in expanded_docs: + expanded_docs.append(document.id()) + props.json_string = json.dumps(expanded_docs) + + @classmethod + def get_default_parent_for_information(cls) -> Union[ifcopenshell.entity_instance, None]: + file = tool.Ifc.get() + projects = file.by_type("IfcProject") + return projects[0] if projects else None + + @classmethod + def get_selected_document_information(cls) -> Union[ifcopenshell.entity_instance, None]: + props = cls.get_document_props() + + if props.active_document and props.active_document.document_type == "INFORMATION": + file = tool.Ifc.get() + return file.by_id(props.active_document.ifc_definition_id) + return None + + @classmethod + def refresh_document_data(cls) -> None: + import bonsai.bim.module.document.data as document_data + + document_data.DocumentData.is_loaded = False + document_data.DocumentData.load() + + @classmethod + def load_document_objects_into_props(cls, document_id: int) -> None: + import bonsai.bim.module.document.data as document_data + + document_data.DocumentData.load_document_objects_into_props(document_id) + + @classmethod + def update_document_objects(cls, document_id: Union[int, None] = None) -> None: + cls.refresh_document_data() + + if document_id is None: + props = cls.get_document_props() + if props.active_document and props.active_document.ifc_definition_id > 0: + document_id = props.active_document.ifc_definition_id + + if document_id: + cls.load_document_objects_into_props(document_id) diff --git a/src/bonsai/bonsai/tool/drawing.py b/src/bonsai/bonsai/tool/drawing.py index b687134afca..86113b9c959 100644 --- a/src/bonsai/bonsai/tool/drawing.py +++ b/src/bonsai/bonsai/tool/drawing.py @@ -17,60 +17,61 @@ # along with Bonsai. If not, see . from __future__ import annotations -import os -import re -import collections -import collections.abc -import bpy -import math + import json -import lark -import bmesh -import shutil import logging -import shapely +import math +import os import platform -import mathutils +import re +import shutil import subprocess -import numpy as np -import bonsai.core.tool -import bonsai.core.geometry -import bonsai.core.type -import bonsai.tool as tool +from collections.abc import Iterable, Sequence +from fractions import Fraction +from pathlib import Path +from typing import TYPE_CHECKING, Any, Literal, NamedTuple, Optional, Union + +import bmesh +import bpy import ifcopenshell.api -import ifcopenshell.api.geometry import ifcopenshell.api.context -import ifcopenshell.api.drawing import ifcopenshell.api.document +import ifcopenshell.api.drawing +import ifcopenshell.api.geometry import ifcopenshell.api.pset import ifcopenshell.api.root import ifcopenshell.geom +import ifcopenshell.util.element import ifcopenshell.util.placement -import ifcopenshell.util.unit import ifcopenshell.util.representation -import ifcopenshell.util.element import ifcopenshell.util.selector import ifcopenshell.util.shape +import ifcopenshell.util.unit +import lark +import mathutils +import numpy as np +import shapely +from ifcopenshell.util.shape_builder import ShapeBuilder +from lxml import etree +from mathutils import Matrix, Vector +from shapely.ops import unary_union + import bonsai.bim.helper import bonsai.bim.import_ifc +import bonsai.core.geometry import bonsai.core.root -from shapely.ops import unary_union -from lxml import etree -from mathutils import Vector, Matrix -from fractions import Fraction -from typing import Optional, Union, Any, Literal, TYPE_CHECKING, NamedTuple -from collections.abc import Iterable, Sequence -from pathlib import Path -from ifcopenshell.util.shape_builder import ShapeBuilder +import bonsai.core.tool +import bonsai.core.type +import bonsai.tool as tool if TYPE_CHECKING: from bonsai.bim.module.drawing.prop import ( - DocProperties, - Sheet, BIMAnnotationProperties, - BIMTextProperties, - BIMCameraProperties, BIMAssignedProductProperties, + BIMCameraProperties, + BIMTextProperties, + DocProperties, + Sheet, ) from bonsai.bim.module.drawing.prop import Drawing as DrawingProperties @@ -602,9 +603,32 @@ def export_text_literal_attributes(cls, obj: bpy.types.Object) -> list[dict[str, props = tool.Drawing.get_text_props(obj) for literal_props in props.literals: literal_data = bonsai.bim.helper.export_attributes(literal_props.attributes) + alignment = literal_props.align_vertical + "-" + literal_props.align_horizontal + if alignment == "middle-middle": + alignment = "center" + literal_data["BoxAlignment"] = alignment literals.append(literal_data) return literals + @classmethod + def export_font_size(cls, obj: bpy.types.Object) -> str: + return float(cls.get_text_props(obj).font_size) + + @classmethod + def export_alignment(cls, obj: bpy.types.Object) -> str: + props = cls.get_text_props(obj) + if (alignment := props.align_vertical + "-" + props.align_horizontal) == "middle-middle": + return "center" + return alignment + + @classmethod + def export_wrap_length(cls, obj: bpy.types.Object) -> str: + return cls.get_text_props(obj).newline_at + + @classmethod + def export_symbol(cls, obj: bpy.types.Object) -> str: + return cls.get_text_props(obj).get_symbol() + @classmethod def create_annotation_context( cls, target_view: str, object_type: Optional[str] = None @@ -832,43 +856,16 @@ def is_editing_sheets(cls) -> bool: return props.is_editing_sheets @classmethod - def synchronise_ifc_and_text_attributes(cls, obj: bpy.types.Object) -> None: + def edit_text_literals(cls, obj: bpy.types.Object, literal_attributes: dict) -> None: + if not literal_attributes: + return assert (element := tool.Ifc.get_entity(obj)) assert (rep := cls.get_annotation_representation(element)) - - old_literals = cls.get_text_literal(obj, return_list=True) - assert isinstance(old_literals, list) - literals_attributes = cls.export_text_literal_attributes(obj) - props = cls.get_text_props(obj) - defined_ifc_ids = [l.ifc_definition_id for l in props.literals] - ifc_file = tool.Ifc.get() - - added_literals: list[ifcopenshell.entity_instance] = [] - new_literals: list[ifcopenshell.entity_instance] = [] - for ifc_definition_id, attributes in zip(defined_ifc_ids, literals_attributes): - # making sure all literals from text edit exist in ifc - if ifc_definition_id == 0: - literal = cls.add_literal(**attributes) - added_literals.append(literal) - else: - literal = ifc_file.by_id(ifc_definition_id) - ifcopenshell.api.drawing.edit_text_literal( - ifc_file, - text_literal=literal, - attributes=attributes, - ) - new_literals.append(literal) - - removed_literals = set(old_literals) - set(new_literals) - - # Add new literals and keep the order as defined in text props. - items = [i for i in rep.Items if i not in removed_literals] + added_literals - items.sort(key=lambda x: new_literals.index(x) if x in new_literals else -1) - rep.Items = items - - # Remove from ifc the literals that were removed during the edit. - for literal in removed_literals: - ifcopenshell.util.element.remove_deep2(ifc_file, literal) + to_remove = [i for i in rep.Items if i.is_a("IfcTextLiteral")] + new_literals = [cls.add_literal(**a) for a in literal_attributes] + rep.Items = [i for i in rep.Items if not i.is_a("IfcTextLiteral")] + new_literals + for literal in to_remove: + ifcopenshell.util.element.remove_deep2(tool.Ifc.get(), literal) @classmethod def add_literal(cls, **attributes: str) -> ifcopenshell.entity_instance: @@ -1185,22 +1182,26 @@ def get_active_sheet_item(cls, *, is_sheet: bool = False, reference_type: str = @classmethod def import_text_attributes(cls, obj: bpy.types.Object) -> None: - from bonsai.bim.module.drawing.prop import BOX_ALIGNMENT_POSITIONS - props = cls.get_text_props(obj) props.literals.clear() ifc_literals = cls.get_text_literal(obj, return_list=True) assert isinstance(ifc_literals, list) + + if ifc_literals: + first_alignment = getattr(ifc_literals[0], "BoxAlignment", None) or "bottom-left" + if first_alignment == "center": + first_alignment = "middle-middle" + props.align_vertical, props.align_horizontal = first_alignment.split("-") + for ifc_literal in ifc_literals: literal_props = props.literals.add() bonsai.bim.helper.import_attributes(ifc_literal, literal_props.attributes) - box_alignment_mask = [False] * 9 - position_string = literal_props.attributes["BoxAlignment"].string_value - box_alignment_mask[BOX_ALIGNMENT_POSITIONS.index(position_string)] = True - - literal_props.box_alignment = box_alignment_mask # pyright: ignore[reportAttributeAccessIssue] + alignment = getattr(ifc_literal, "BoxAlignment", None) or "bottom-left" + if alignment == "center": + alignment = "middle-middle" + literal_props.align_vertical, literal_props.align_horizontal = alignment.split("-") literal_props.ifc_definition_id = ifc_literal.id() from bonsai.bim.module.drawing.data import DecoratorData @@ -1209,8 +1210,6 @@ def import_text_attributes(cls, obj: bpy.types.Object) -> None: props.font_size = str(text_data["FontSize"]) props.newline_at = text_data["Newline_At"] props.set_symbol(text_data["Symbol"]) - props.reverse_list = text_data["Reverse_List"] - props.list_separator = text_data["List_Separator"] @classmethod def import_assigned_product(cls, obj: bpy.types.Object) -> None: @@ -1276,7 +1275,7 @@ def run_root_assign_class( @classmethod def run_type_assign_type(cls, element: ifcopenshell.entity_instance, relating_type: ifcopenshell.entity_instance): - return bonsai.core.type.assign_type(tool.Ifc, tool.Type, element=element, type=relating_type) + return bonsai.core.type.assign_type(tool.Ifc, tool.Model, tool.Type, element=element, type=relating_type) @classmethod def reload_representation(cls, obj: bpy.types.Object, representation: ifcopenshell.entity_instance): @@ -1291,6 +1290,12 @@ def reload_representation(cls, obj: bpy.types.Object, representation: ifcopenshe def get_representation(cls, element, context): return ifcopenshell.util.representation.get_representation(element, context) + @classmethod + def set_camera_name(cls, drawing: ifcopenshell.entity_instance, name: str) -> None: + camera = tool.Ifc.get_object(drawing) + if camera and camera.name != name: + camera.name = name + @classmethod def set_drawing_collection_name( cls, drawing: ifcopenshell.entity_instance, collection: bpy.types.Collection @@ -1307,7 +1312,7 @@ def show_decorations(cls) -> None: props.should_draw_decorations = True @classmethod - def update_text_size_pset(cls, obj: bpy.types.Object) -> None: + def edit_text_font_size(cls, obj: bpy.types.Object, font_size: float) -> None: """updates pset `EPset_Annotation.Classes` value based on current font size from `obj.BIMTextProperties.font_size` """ @@ -1317,7 +1322,6 @@ def update_text_size_pset(cls, obj: bpy.types.Object) -> None: element = tool.Ifc.get_entity(obj) assert element # updating text font size in EPset_Annotation.Classes - font_size = float(props.font_size) font_size_str = next((key for key in FONT_SIZES if FONT_SIZES[key] == font_size), None) classes = ifcopenshell.util.element.get_pset(element, "EPset_Annotation", "Classes") assert isinstance(classes, Union[str, None]) @@ -1338,34 +1342,32 @@ def update_text_size_pset(cls, obj: bpy.types.Object) -> None: pset = tool.Pset.get_element_pset(element, "EPset_Annotation") if not pset: pset = ifcopenshell.api.pset.add_pset(ifc_file, product=element, name="EPset_Annotation") - ifcopenshell.api.pset.edit_pset( - ifc_file, - pset=pset, - properties={"Classes": classes}, - ) + ifcopenshell.api.pset.edit_pset(ifc_file, pset=pset, properties={"Classes": classes}) @classmethod - def update_text_annotation_properties(cls, obj: bpy.types.Object) -> None: - """Update all EPset_Annotation properties from the text props""" - props = cls.get_text_props(obj) + def edit_text_wrap_length(cls, obj: bpy.types.Object, wrap_length: int) -> None: element = tool.Ifc.get_entity(obj) - assert element + ifc_file = tool.Ifc.get() + pset = tool.Pset.get_element_pset(element, "EPset_Annotation") + if not pset: + pset = ifcopenshell.api.pset.add_pset(ifc_file, product=element, name="EPset_Annotation") + ifcopenshell.api.pset.edit_pset(ifc_file, pset=pset, properties={"Newline_At": wrap_length}) + @classmethod + def edit_text_symbol(cls, obj: bpy.types.Object, symbol: str) -> None: + element = tool.Ifc.get_entity(obj) ifc_file = tool.Ifc.get() pset = tool.Pset.get_element_pset(element, "EPset_Annotation") if not pset: pset = ifcopenshell.api.pset.add_pset(ifc_file, product=element, name="EPset_Annotation") + ifcopenshell.api.pset.edit_pset(ifc_file, pset=pset, properties={"Symbol": symbol}) - ifcopenshell.api.pset.edit_pset( - ifc_file, - pset=pset, - properties={ - "Newline_At": int(props.newline_at), - "Symbol": props.get_symbol(), - "Reverse_List": props.reverse_list, - "List_Separator": props.list_separator or "", - }, - ) + @classmethod + def edit_text_alignment(cls, obj: bpy.types.Object, alignment: str) -> None: + ifc_literals = cls.get_text_literal(obj, return_list=True) + for ifc_literal in ifc_literals or []: + if ifc_literal.is_a("IfcTextLiteralWithExtent"): + ifc_literal.BoxAlignment = alignment # TODO below this point is highly experimental prototype code with no tests @@ -2109,36 +2111,21 @@ def replace_text_literal_variables( cls, text: str, product: Optional[ifcopenshell.entity_instance] = None, - reverse_list: bool = False, - list_separator: str = ", ", ) -> str: if not product: return text - if list_separator: - list_separator = list_separator.encode().decode("unicode_escape") - for command in re.findall("``.*?``", text): + for command in re.findall("``.+?``", text): original_command = command - for variable in re.findall("{{.*?}}", command): - value = ifcopenshell.util.selector.get_element_value(product, variable[2:-2]) - value = '"' + str(value).replace('"', '\\"') + '"' - command = command.replace(variable, value) - # Defensive: skip if command[2:-2] is None or 'None' command_content = command[2:-2] - if command_content is None or str(command_content).strip().lower() == "none": + try: + text = text.replace(original_command, ifcopenshell.util.selector.format(command_content, product)) + except Exception: text = text.replace(original_command, "") - else: - try: - text = text.replace(original_command, ifcopenshell.util.selector.format(command_content)) - except Exception: - text = text.replace(original_command, "") for variable in re.findall("{{.*?}}", text): value = ifcopenshell.util.selector.get_element_value(product, variable[2:-2]) if isinstance(value, (list, tuple)): - if reverse_list: - value = list_separator.join(str(v) for v in reversed(value)) - else: - value = list_separator.join(str(v) for v in value) + value = ", ".join(str(v) for v in value) text = text.replace(variable, str(value)) return text @@ -2739,16 +2726,14 @@ def convert_scale_string(cls, value: str) -> float: return float(value) except: pass # Perhaps it's imperial? - l = lark.Lark( - """start: feet? "-"? inches? + l = lark.Lark("""start: feet? "-"? inches? feet: NUMBER? "-"? fraction? "'" inches: NUMBER? "-"? fraction? "\\"" fraction: NUMBER "/" NUMBER %import common.NUMBER %import common.WS %ignore WS // Disregard spaces in text - """ - ) + """) try: start = l.parse(value) @@ -2798,9 +2783,10 @@ def get_camera_matrix(cls, camera: bpy.types.Object) -> Matrix: @classmethod def convert_svg_to_dxf(cls, svg_filepath: Path, dxf_filepath: Path) -> None: - import ezdxf import xml.etree.ElementTree as ET + import ezdxf + SVG = "{http://www.w3.org/2000/svg}" IFC = "{http://www.ifcopenshell.org/ns}" diff --git a/src/bonsai/bonsai/tool/feature.py b/src/bonsai/bonsai/tool/feature.py index adc6cd95288..3a06cbf6255 100644 --- a/src/bonsai/bonsai/tool/feature.py +++ b/src/bonsai/bonsai/tool/feature.py @@ -17,16 +17,17 @@ # along with Bonsai. If not, see . from __future__ import annotations + +from collections.abc import Iterable +from typing import TYPE_CHECKING + import bpy -import bonsai.core.tool -import bonsai.tool as tool -import bonsai.bim.helper -import bonsai.core.geometry -import ifcopenshell import ifcopenshell.api.feature import ifcopenshell.util.representation -from typing import TYPE_CHECKING -from collections.abc import Iterable + +import bonsai.core.geometry +import bonsai.core.tool +import bonsai.tool as tool if TYPE_CHECKING: from bonsai.bim.module.void.prop import BIMBooleanProperties diff --git a/src/bonsai/bonsai/tool/geometry.py b/src/bonsai/bonsai/tool/geometry.py index e2955d3d281..0d690d03089 100644 --- a/src/bonsai/bonsai/tool/geometry.py +++ b/src/bonsai/bonsai/tool/geometry.py @@ -17,16 +17,28 @@ # along with Bonsai. If not, see . from __future__ import annotations -import bpy -import bmesh -import struct + import hashlib import logging -import numpy as np -import numpy.typing as npt import multiprocessing +import struct +from collections import defaultdict +from collections.abc import Generator, Iterable, Iterator +from math import pi, radians +from typing import ( + TYPE_CHECKING, + Any, + Literal, + Optional, + TypeGuard, + Union, + cast, + get_args, +) + +import bmesh +import bpy import ifcopenshell -import ifcopenshell.api import ifcopenshell.api.boundary import ifcopenshell.api.geometry import ifcopenshell.api.grid @@ -45,37 +57,30 @@ import ifcopenshell.util.shape_builder import ifcopenshell.util.system import ifcopenshell.util.unit -import bonsai.core.tool +import numpy as np +import numpy.typing as npt +from mathutils import Matrix, Vector +from mathutils.bvhtree import BVHTree +from typing_extensions import TypeIs + +import bonsai.bim.helper +import bonsai.bim.import_ifc import bonsai.core.drawing import bonsai.core.geometry import bonsai.core.root import bonsai.core.spatial import bonsai.core.style import bonsai.core.system +import bonsai.core.tool import bonsai.tool as tool -import bonsai.bim.helper -import bonsai.bim.import_ifc -from collections import defaultdict -from math import radians, pi -from mathutils import Vector, Matrix -from mathutils.bvhtree import BVHTree from bonsai.bim.ifc import IfcStore -from typing import ( - Union, - Optional, - Literal, - TYPE_CHECKING, - get_args, - cast, - TypeGuard, - Any, -) -from collections.abc import Iterable, Iterator, Generator -from typing_extensions import TypeIs if TYPE_CHECKING: - from bonsai.bim.prop import Attribute, BIMMeshProperties - from bonsai.bim.module.geometry.prop import BIMObjectGeometryProperties, BIMGeometryProperties + from bonsai.bim.module.geometry.prop import ( + BIMGeometryProperties, + BIMObjectGeometryProperties, + ) + from bonsai.bim.prop import BIMMeshProperties class Geometry(bonsai.core.tool.Geometry): @@ -1146,9 +1151,8 @@ def record_object_materials(cls, obj: bpy.types.Object) -> None: def record_object_position(cls, obj: bpy.types.Object) -> None: # These are recorded separately because they have different numerical tolerances props = tool.Blender.get_object_bim_props(obj) - # Explicit dtype for Blender <5.0 compatibility. - props.location_checksum = repr(np.array(obj.matrix_world.translation, dtype=np.float32).tobytes()) - props.rotation_checksum = repr(np.array(obj.matrix_world.to_3x3(), dtype=np.float32).tobytes()) + props.location_checksum = repr(tool.Blender.np_array_legacy(obj.matrix_world.translation).tobytes()) + props.rotation_checksum = repr(tool.Blender.np_array_legacy(obj.matrix_world.to_3x3()).tobytes()) @classmethod def remove_connection(cls, connection: ifcopenshell.entity_instance) -> None: @@ -1403,8 +1407,6 @@ def remove_representation_item( :param representation_item: item to remove. :param element: item's element. Is used to unmark manual booleans. """ - # NOTE: we assume it's not the last representation item - # otherwise we probably would need to remove representation too # NOTE: a lot of shared code with `geometry.remove_representation` ifc_file = tool.Ifc.get() shape_aspects: list[ifcopenshell.entity_instance] = [] @@ -1463,7 +1465,10 @@ def remove_representation_item( cls.remove_representation_items_from_shape_aspect([representation_item], shape_aspect) if representation: - representation.Items = tuple(set(representation.Items) - {representation_item}) + new_items = tuple(set(representation.Items) - {representation_item}) + if not new_items: + return + representation.Items = new_items also_consider = list(consider_inverses) ifcopenshell.util.element.remove_deep2(ifc_file, representation_item, also_consider=also_consider) @@ -1797,6 +1802,10 @@ def sync_item_positions(cls) -> None: def import_item_attributes(cls, obj: bpy.types.Object) -> None: props = tool.Geometry.get_mesh_props(obj.data) props.item_attributes.clear() + element = tool.Ifc.get_entity(tool.Geometry.get_geometry_props().representation_obj) + if tool.Model.get_usage_type(element) == "LAYER3": + return # All LAYER3 attributes are parametrically determined from the IfcMaterialLayerSet + item = tool.Ifc.get().by_id(props.ifc_definition_id) allowed_attributes = [ a.name() @@ -2106,6 +2115,14 @@ def duplicate_ifc_objects( active_object: Optional[bpy.types.Object] = None, linked: bool = False, ) -> tuple[dict[ifcopenshell.entity_instance, list[ifcopenshell.entity_instance]], Union[bpy.types.Object, None]]: + """Duplicate IFC objects + + Duplication is surprisingly complicated because you might only select + part of a group of related items. + + TODO: write some tests and figure out how to make this function + actually understandable. + """ # Handle arrays objects_to_duplicate = set(objects_to_duplicate) arrays_to_duplicate, array_children = cls.process_arrays_for_duplication(objects_to_duplicate) diff --git a/src/bonsai/bonsai/tool/georeference.py b/src/bonsai/bonsai/tool/georeference.py index 7b56adbab2a..0c47002a367 100644 --- a/src/bonsai/bonsai/tool/georeference.py +++ b/src/bonsai/bonsai/tool/georeference.py @@ -17,22 +17,24 @@ # along with Bonsai. If not, see . from __future__ import annotations -import bpy + import json -import numpy as np -import ifcopenshell +from typing import TYPE_CHECKING, Any, Literal, Union + +import bpy import ifcopenshell.api.georeference import ifcopenshell.util.geolocation import ifcopenshell.util.placement import ifcopenshell.util.unit +import numpy as np + +import bonsai.bim.helper import bonsai.core.tool import bonsai.tool as tool -import bonsai.bim.helper -from typing import Any, Union, Literal, TYPE_CHECKING if TYPE_CHECKING: - from bonsai.bim.prop import Attribute from bonsai.bim.module.georeference.prop import BIMGeoreferenceProperties + from bonsai.bim.prop import Attribute class Georeference(bonsai.core.tool.Georeference): @@ -312,6 +314,23 @@ def enh2xyz(cls, coordinates: tuple[float, float, float]) -> tuple[float, float, ) return coordinates + @classmethod + def global2local(cls, matrix, is_specified_in_map_units: bool) -> tuple[float, float, float]: + matrix = ifcopenshell.util.geolocation.auto_global2local( + tool.Ifc.get(), matrix, is_specified_in_map_units=is_specified_in_map_units + ) + props = cls.get_georeference_props() + if props.has_blender_offset: + matrix = ifcopenshell.util.geolocation.global2local( + matrix, + float(props.blender_offset_x), + float(props.blender_offset_y), + float(props.blender_offset_z), + float(props.blender_x_axis_abscissa), + float(props.blender_x_axis_ordinate), + ) + return matrix + @classmethod def import_plot(cls, filepath: str) -> None: import bmesh @@ -382,6 +401,9 @@ def set_model_origin(cls) -> None: unit_scale = ifcopenshell.util.unit.calculate_unit_scale(tool.Ifc.get()) gprops = tool.Georeference.get_georeference_props() e, n, h = cls.xyz2enh((0, 0, 0), should_return_in_map_units=False) + crs = ifcopenshell.util.geolocation.get_crs(tool.Ifc.get()) or {} + gprops.model_is_georeferenced = bool(crs) + gprops.model_crs = crs.get("Name", "") or "" gprops.model_origin = f"{e},{n},{h}" gprops.model_origin_si = f"{e * unit_scale},{n * unit_scale},{h * unit_scale}" angle = ifcopenshell.util.geolocation.get_grid_north(tool.Ifc.get()) diff --git a/src/bonsai/bonsai/tool/group.py b/src/bonsai/bonsai/tool/group.py index d800904bf86..3e221b57aae 100644 --- a/src/bonsai/bonsai/tool/group.py +++ b/src/bonsai/bonsai/tool/group.py @@ -17,17 +17,20 @@ # along with Bonsai. If not, see . from __future__ import annotations + import json +from typing import TYPE_CHECKING, Literal, Union, assert_never + import bpy import ifcopenshell -import bonsai.bim.helper +from natsort import natsorted + import bonsai.core.tool import bonsai.tool as tool -from typing import TYPE_CHECKING, Literal, assert_never, Union -from natsort import natsorted if TYPE_CHECKING: - from bonsai.bim.module.group.prop import BIMGroupProperties, Group as GroupProp + from bonsai.bim.module.group.prop import BIMGroupProperties + from bonsai.bim.module.group.prop import Group as GroupProp from bonsai.bim.module.system.prop import BIMSystemProperties, System diff --git a/src/bonsai/bonsai/tool/ifc.py b/src/bonsai/bonsai/tool/ifc.py index 9f1c84e6d1a..6d79ce75826 100644 --- a/src/bonsai/bonsai/tool/ifc.py +++ b/src/bonsai/bonsai/tool/ifc.py @@ -17,20 +17,23 @@ # along with Bonsai. If not, see . from __future__ import annotations + import os +from pathlib import Path +from typing import TYPE_CHECKING, Any, Literal, Optional, Union, final + import bpy -import numpy as np import ifcopenshell.api import ifcopenshell.ifcopenshell_wrapper as ifcopenshell_wrapper import ifcopenshell.util.element import ifcopenshell.util.schema -import bonsai.core.tool +import numpy as np + import bonsai.bim.handler import bonsai.bim.schema +import bonsai.core.tool import bonsai.tool as tool -from pathlib import Path -from bonsai.bim.ifc import IfcStore, IFC_CONNECTED_TYPE -from typing import Optional, Union, Any, final, Literal, TYPE_CHECKING +from bonsai.bim.ifc import IFC_CONNECTED_TYPE, IfcStore if TYPE_CHECKING: from bpy.stub_internal import rna_enums @@ -112,24 +115,17 @@ def is_moved(cls, obj: bpy.types.Object, ifc_only: bool = True) -> bool: return True # Let's be conservative # Handle both old float64 and new float32 checksums for version compatibility - loc_checksum_bytes = eval(oprops.location_checksum) - if len(loc_checksum_bytes) == 24: # Old format: 3 * 8 bytes (float64) - loc_check = np.frombuffer(loc_checksum_bytes, dtype=np.float64).astype(np.float32) - else: # New format: 3 * 4 bytes (float32) - loc_check = np.frombuffer(loc_checksum_bytes, dtype=np.float32) - - loc_real = np.array(obj.matrix_world.translation, dtype=np.float32).flatten() + loc_checksum_bytes: bytes = eval(oprops.location_checksum) + loc_check = tool.Blender.np_frombuffer_legacy(loc_checksum_bytes, 3) + loc_real = tool.Blender.np_array_legacy(obj.matrix_world.translation) if not np.allclose(loc_check, loc_real, atol=1e-4): # 0.1 mm return True # Handle both old float64 and new float32 checksums for version compatibility - rot_checksum_bytes = eval(oprops.rotation_checksum) - if len(rot_checksum_bytes) == 72: # Old format: 9 * 8 bytes (float64) - rot_check = np.frombuffer(rot_checksum_bytes, dtype=np.float64).astype(np.float32).reshape(3, 3) - else: # New format: 9 * 4 bytes (float32) - rot_check = np.frombuffer(rot_checksum_bytes, dtype=np.float32).reshape(3, 3) - - rot_real = np.array(obj.matrix_world.to_3x3(), dtype=np.float32) + rot_checksum_bytes: bytes = eval(oprops.rotation_checksum) + rot_check = tool.Blender.np_frombuffer_legacy(rot_checksum_bytes, 9) + rot_check = rot_check.reshape(3, 3) + rot_real = tool.Blender.np_array_legacy(obj.matrix_world.to_3x3()) rot_dot = np.dot(rot_check, rot_real.T) angle_rad = np.arccos(np.clip((np.trace(rot_dot) - 1) / 2, -1, 1)) if angle_rad > 0.0017453292519943296: # 0.1 degrees @@ -201,12 +197,16 @@ def rebuild_element_maps(cls) -> None: if not cls.get(): return + # Clear all per-object msgbus subscriptions at once using the dedicated + # owner. After undo/redo, per-object Python wrappers have new + # identities so clearing by individual obj would miss stale + # subscriptions registered with the old wrappers. + bpy.msgbus.clear_by_owner(bonsai.bim.handler.object_subscription_owner) + for obj in bpy.data.objects: if obj.library: continue - bpy.msgbus.clear_by_owner(obj) - element = cls.get_entity(obj) if not element: continue @@ -221,8 +221,6 @@ def rebuild_element_maps(cls) -> None: if obj.library: continue - bpy.msgbus.clear_by_owner(obj) - style = cls.get_entity(obj) if not style: continue diff --git a/src/bonsai/bonsai/tool/ifcgit.py b/src/bonsai/bonsai/tool/ifcgit.py index 7dfb2431d00..49e6440baeb 100644 --- a/src/bonsai/bonsai/tool/ifcgit.py +++ b/src/bonsai/bonsai/tool/ifcgit.py @@ -17,17 +17,21 @@ # along with Bonsai. If not, see . from __future__ import annotations + +import json +import logging import os import re import subprocess -import bpy -import logging import tempfile +from pathlib import Path +from typing import TYPE_CHECKING, Any, Union + +import bpy + +import bonsai.tool as tool from bonsai.bim import import_ifc from bonsai.bim.ifc import IfcStore -import bonsai.tool as tool -from pathlib import Path -from typing import TYPE_CHECKING, Union, Literal, Any # allows git import even if git executable isn't found os.environ["GIT_PYTHON_REFRESH"] = "quiet" @@ -61,10 +65,13 @@ def init_repo(cls, path_dir: str) -> None: @classmethod def clone_repo(cls, remote_url: str, local_folder: str) -> git.Repo: - IfcGitRepo.repo = git.Repo.clone_from( + repo = git.Repo.clone_from( url=remote_url, to_path=local_folder, ) + # Close the repo to release stale subprocess + repo.close() + IfcGitRepo.repo = git.Repo(local_folder) cls.config_info_attributes(IfcGitRepo.repo) return IfcGitRepo.repo @@ -122,39 +129,27 @@ def add_file_to_repo(cls, repo: git.Repo, path_file: str) -> None: cls.dos2unix(path_file) repo.index.add(os.path.normpath(path_file)) repo.index.commit(message="Added " + os.path.relpath(path_file, repo.working_dir)) - bpy.ops.ifcgit.refresh() @classmethod def git_checkout(cls, path_file: str) -> None: IfcGitRepo.repo.git.checkout(path_file) @classmethod - def checkout_new_branch(cls, path_file: str) -> None: + def checkout_new_branch(cls, path_file: str, branch_name: str) -> None: """Create a branch and move uncommitted changes to this branch""" - props = cls.get_ifcgit_props() - if props.new_branch_name: - IfcGitRepo.repo.git.checkout(b=props.new_branch_name) - props.display_branch = props.new_branch_name - props.new_branch_name = "" - bpy.ops.ifcgit.refresh() + IfcGitRepo.repo.git.checkout(b=branch_name) @classmethod - def git_commit(cls, path_file: str) -> None: - props = cls.get_ifcgit_props() + def git_commit(cls, path_file: str, commit_message: str) -> None: repo = IfcGitRepo.repo if os.name == "nt": cls.dos2unix(path_file) repo.index.add(os.path.normpath(path_file)) - repo.index.commit(message=props.commit_message) - props.commit_message = "" + repo.index.commit(message=commit_message) @classmethod - def add_tag(cls, repo: git.Repo) -> None: - props = cls.get_ifcgit_props() - item = props.ifcgit_commits[props.commit_index] - repo.create_tag(props.new_tag_name, ref=item.hexsha, message=props.new_tag_message) - props.new_tag_name = "" - props.new_tag_message = "" + def add_tag(cls, repo: git.Repo, hexsha: str, tag_name: str, tag_message: str = "") -> None: + repo.create_tag(tag_name, ref=hexsha, message=tag_message) @classmethod def delete_tag(cls, repo: git.Repo, tag_name: git.TagReference) -> None: @@ -162,20 +157,17 @@ def delete_tag(cls, repo: git.Repo, tag_name: git.TagReference) -> None: repo.delete_tag(tag_name) @classmethod - def add_remote(cls, repo: git.Repo) -> None: - props = cls.get_ifcgit_props() - repo.create_remote(name=props.remote_name, url=props.remote_url) - props.remote_name = "" - props.remote_url = "" + def rename_branch(cls, repo: git.Repo, new_name: str) -> None: + repo.active_branch.rename(new_name) @classmethod - def delete_remote(cls, repo: git.Repo) -> None: - props = cls.get_ifcgit_props() - remote_name = props.select_remote + def add_remote(cls, repo: git.Repo, remote_name: str, remote_url: str) -> None: + repo.create_remote(name=remote_name, url=remote_url) + + @classmethod + def delete_remote(cls, repo: git.Repo, remote_name: str) -> None: if remote_name in repo.remotes: repo.delete_remote(remote_name) - if repo.remotes: - props.select_remote = repo.remotes[0].name @classmethod def push(cls, repo: git.Repo, remote_name: str, branch_name: str) -> Union[str, None]: @@ -187,16 +179,25 @@ def push(cls, repo: git.Repo, remote_name: str, branch_name: str) -> Union[str, return exc.stderr @classmethod - def create_new_branch(cls) -> None: + def is_head_detached(cls) -> bool: + return bool(IfcGitRepo.repo.head.is_detached) + + @classmethod + def repo_has_commits(cls) -> bool: + if IfcGitRepo.repo: + return bool(IfcGitRepo.repo.heads) + return False + + @classmethod + def get_active_branch_name(cls) -> str: + return IfcGitRepo.repo.active_branch.name + + @classmethod + def create_new_branch(cls, branch_name: str) -> None: """Convert a detached HEAD into a branch""" - props = cls.get_ifcgit_props() repo = IfcGitRepo.repo - new_branch = repo.create_head(props.new_branch_name) + new_branch = repo.create_head(branch_name) new_branch.checkout() - props.display_branch = props.new_branch_name - props.new_branch_name = "" - - bpy.ops.ifcgit.refresh() @classmethod def clear_commits_list(cls) -> None: @@ -216,7 +217,7 @@ def get_commits_list(cls, path_ifc: str, lookup: dict[str, Any]) -> None: rev=[props.display_branch], ) ) - commits_relevant = list( + commits_relevant = set( git.objects.commit.Commit.iter_items( repo=repo, rev=[props.display_branch], @@ -224,11 +225,17 @@ def get_commits_list(cls, path_ifc: str, lookup: dict[str, Any]) -> None: ) ) + def is_relevant(commit): + if commit in commits_relevant: + return True + # Merge commits are relevant too + return len(commit.parents) > 1 and any(p in commits_relevant for p in commit.parents) + for commit in commits: if props.ifcgit_filter == "tagged" and commit.hexsha not in lookup: continue - elif props.ifcgit_filter == "relevant" and commit not in commits_relevant: + elif props.ifcgit_filter == "relevant" and not is_relevant(commit): continue props.ifcgit_commits.add() @@ -237,7 +244,8 @@ def get_commits_list(cls, path_ifc: str, lookup: dict[str, Any]) -> None: list_item.message = commit.message list_item.author_name = commit.author.name list_item.author_email = commit.author.email - if commit in commits_relevant: + list_item.committed_date = int(commit.committed_date) + if is_relevant(commit): list_item.relevant = True if commit.hexsha in lookup: for tag in lookup[commit.hexsha]: @@ -280,14 +288,23 @@ def load_project(cls, path_ifc: str = "") -> None: bpy.data.orphans_purge(do_recursive=True) + import bonsai.bim.handler + from bonsai.bim.module.model.data import AuthoringData + from bonsai.bim.module.root.data import IfcClassData + + AuthoringData.type_thumbnails = {} + + IfcClassData.is_loaded = False + settings = import_ifc.IfcImportSettings.factory(bpy.context, path_ifc, logging.getLogger("ImportIFC")) settings.should_setup_viewport_camera = False ifc_importer = import_ifc.IfcImporter(settings) ifc_importer.execute() - tool.Project.load_project_pset_templates() tool.Project.load_default_thumbnails() tool.Project.set_default_context() tool.Project.set_default_modeling_dimensions() + tool.Root.reload_grid_decorator() + bonsai.bim.handler.refresh_ui_data() bpy.ops.object.select_all(action="DESELECT") @classmethod @@ -387,20 +404,43 @@ def get_modified_step_ids(cls, step_ids: STEP_IDS) -> STEP_IDS: model = tool.Ifc.get() modified_step_ids = {"modified": set()} - for step_id in step_ids["modified"] | step_ids["added"]: - try: - entity = model.by_id(step_id) - except: - continue - if entity.is_a("IfcProductDefinitionShape"): + def collect(entity, depth=0): + if depth > 2: + return + if entity.is_a("IfcProduct"): + modified_step_ids["modified"].add(entity.id()) + elif entity.is_a("IfcProductDefinitionShape"): for product in entity.ShapeOfProduct: modified_step_ids["modified"].add(product.id()) elif entity.is_a("IfcObjectPlacement"): for product in entity.PlacesObject: modified_step_ids["modified"].add(product.id()) - elif entity.is_a("IfcTypeProduct") and entity.Types: - for related_object in entity.Types[0].RelatedObjects: - modified_step_ids["modified"].add(related_object.id()) + elif entity.is_a("IfcTypeProduct"): + for rel in entity.Types: + for obj in rel.RelatedObjects: + modified_step_ids["modified"].add(obj.id()) + elif entity.is_a("IfcShapeRepresentation"): + for prod_rep in entity.OfProductRepresentation: + for product in prod_rep.ShapeOfProduct: + modified_step_ids["modified"].add(product.id()) + elif entity.is_a("IfcRepresentationItem"): + for referencing in model.get_inverse(entity): + if referencing.is_a("IfcShapeRepresentation"): + collect(referencing, depth + 1) + elif entity.is_a("IfcPropertySet"): + for rel in entity.DefinesOccurrence: + for obj in rel.RelatedObjects: + modified_step_ids["modified"].add(obj.id()) + elif entity.is_a("IfcProperty"): + for pset in entity.PartOfPset: + collect(pset, depth + 1) + + for step_id in step_ids["modified"] | step_ids["added"]: + try: + entity = model.by_id(step_id) + except: + continue + collect(entity) return modified_step_ids @@ -452,38 +492,56 @@ def switch_to_revision_item(cls) -> None: if item.hexsha in lookup: for branch in lookup[item.hexsha]: if branch.name == props.display_branch: + if isinstance(branch, git.RemoteReference): + # Checking out a remote branch tip goes to detached HEAD. + # Pre-fill the new branch name field with the local equivalent + # so the user isn't blocked from committing without a hint. + local_name = branch.remote_head + props.new_branch_name = cls._unique_branch_name(repo, local_name) branch.checkout() return # NOTE this is calling the git binary in a subprocess repo.git.checkout(item.hexsha) + @classmethod + def _unique_branch_name(cls, repo: git.Repo, name: str) -> str: + """Return name if unused, otherwise name-2, name-3, etc.""" + existing = {h.name for h in repo.heads} + if name not in existing: + return name + i = 2 + while f"{name}-{i}" in existing: + i += 1 + return f"{name}-{i}" + @classmethod def delete_collection(cls, blender_collection: bpy.types.Collection) -> None: for obj in blender_collection.objects: bpy.data.objects.remove(obj, do_unlink=True) bpy.data.collections.remove(blender_collection) - @classmethod - def is_valid_branch_name(cls, new_branch_name: str): - """Check if a branch name is valid and doesn't conflict with existing branches""" - if not cls.is_valid_ref_format(new_branch_name): - return False - if new_branch_name in [branch.name for branch in IfcGitRepo.repo.branches]: - return False - return True - @classmethod def config_ifcmerge(cls) -> None: config_reader = IfcGitRepo.repo.config_reader() section = 'mergetool "ifcmerge"' + new_cmd = "ifcmerge $BASE $LOCAL $REMOTE $MERGED > $MERGED.ifcmerge" if not config_reader.has_section(section): with IfcGitRepo.repo.config_writer() as config_writer: - config_writer.set_value(section, "cmd", "ifcmerge $BASE $LOCAL $REMOTE $MERGED") + config_writer.set_value(section, "cmd", new_cmd) + config_writer.set_value(section, "trustExitCode", True) + elif config_reader.get_value(section, "cmd") != new_cmd: + with IfcGitRepo.repo.config_writer() as config_writer: + config_writer.set_value(section, "cmd", new_cmd) config_writer.set_value(section, "trustExitCode", True) section = 'mergetool "ifcmerge-forward"' + new_cmd = "ifcmerge --prioritise-local $BASE $LOCAL $REMOTE $MERGED > $MERGED.ifcmerge" if not config_reader.has_section(section): with IfcGitRepo.repo.config_writer() as config_writer: - config_writer.set_value(section, "cmd", "ifcmerge $BASE $REMOTE $LOCAL $MERGED") + config_writer.set_value(section, "cmd", new_cmd) + config_writer.set_value(section, "trustExitCode", True) + elif config_reader.get_value(section, "cmd") != new_cmd: + with IfcGitRepo.repo.config_writer() as config_writer: + config_writer.set_value(section, "cmd", new_cmd) config_writer.set_value(section, "trustExitCode", True) @classmethod @@ -513,49 +571,117 @@ def dos2unix(cls, path_file: str) -> None: output.write(line + b"\n") @classmethod - def execute_merge(cls, path_ifc: str, operator: bpy.types.Operator) -> Union[None, Literal[False]]: + def get_selected_branch(cls) -> Union[str, None]: + """Return the name of the branch at the selected commit matching display_branch, or None.""" props = cls.get_ifcgit_props() repo = IfcGitRepo.repo item = props.ifcgit_commits[props.commit_index] lookup = cls.branches_by_hexsha(repo) - if item.hexsha in lookup: - for branch in lookup[item.hexsha]: - if branch.name == props.display_branch: - # this is a branch! - if re.match("^(origin/)?(HEAD|main|master)$", branch.name): - # preserve remote IDs in origin/main or main - mergetool = "ifcmerge" - else: - # rewrite remote IDs - mergetool = "ifcmerge-forward" - try: - # NOTE this is calling the git binary in a subprocess - repo.git.merge(branch) - except git.exc.GitCommandError: - # merge is expected to fail, run ifcmerge - try: - repo.git.mergetool(tool=mergetool) - except git.exc.GitCommandError as exc: - message = re.sub("( stderr: '|')", "", exc.stderr) - # ifcmerge failed, rollback - repo.git.merge(abort=True) - - operator.report({"ERROR"}, "IFC Merge failed:" + message) - return False - else: - if os.name == "nt": - cls.dos2unix(path_ifc) - repo.index.add(os.path.normpath(path_ifc)) - repo.git.commit("--no-edit") - except git.exc.GitError: - operator.report({"ERROR"}, "Unknown IFC Merge failure") - return False - - props.display_branch = repo.active_branch.name - - cls.load_project(path_ifc) - cls.refresh_revision_list(path_ifc) - cls.decolourise() + if item.hexsha not in lookup: + return None + for branch in lookup[item.hexsha]: + if branch.name == props.display_branch: + return branch.name + return None + + @classmethod + def get_merge_tool(cls, branch_name: str) -> str: + if re.match("^(origin/)?(HEAD|main|master)$", branch_name): + return "ifcmerge" + return "ifcmerge-forward" + + @classmethod + def git_merge(cls, branch_name: str) -> Union[str, None]: + """Attempt a git merge. Returns None on clean merge, 'conflict' on expected + GitCommandError, or 'error' on an unknown GitError.""" + repo = IfcGitRepo.repo + branch = repo.refs[branch_name] + try: + repo.git.merge(branch) + return None + except git.exc.GitCommandError: + return "conflict" + except git.exc.GitError: + return "error" + + @classmethod + def git_merge_no_commit(cls, branch_name: str) -> Union[str, None]: + """Attempt a git merge without committing (always leaves a merge state to abort). + Returns None on clean merge, 'conflict' on conflict, or 'error' on unknown failure.""" + repo = IfcGitRepo.repo + branch = repo.refs[branch_name] + try: + repo.git.merge(branch, no_commit=True, no_ff=True) + return None + except git.exc.GitCommandError: + return "conflict" + except git.exc.GitError: + return "error" + + @classmethod + def git_mergetool(cls, mergetool: str, path_ifc: str) -> Union[list, None]: + """Run ifcmerge tool. Returns None on success, list of conflict dicts on failure.""" + repo = IfcGitRepo.repo + report_path = path_ifc + ".ifcmerge" + try: + repo.git.mergetool(tool=mergetool) + except git.exc.GitCommandError as e: + print(f"ifcgit: mergetool failed: {e}") + + conflicts = None + if os.path.exists(report_path): + try: + with open(report_path) as f: + content = f.read().strip() + if content: + data = json.loads(content) + conflicts = data.get("conflicts", []) + except (json.JSONDecodeError, OSError): + pass + try: + os.remove(report_path) + except OSError: + pass + + if conflicts is None and repo.index.unmerged_blobs(): + conflicts = [] + + return conflicts + + @classmethod + def store_merge_conflicts(cls, conflicts: list) -> None: + cls.get_ifcgit_props().merge_conflicts = json.dumps(conflicts) + + @classmethod + def clear_merge_conflicts(cls) -> None: + cls.get_ifcgit_props().merge_conflicts = "" + + @classmethod + def get_merge_conflicts(cls) -> Union[list, None]: + raw = cls.get_ifcgit_props().merge_conflicts + if not raw: + return None + try: + return json.loads(raw) + except json.JSONDecodeError: + return None + + @classmethod + def git_merge_abort(cls) -> None: + IfcGitRepo.repo.git.merge(abort=True) + + @classmethod + def commit_merge(cls, path_ifc: str) -> None: + repo = IfcGitRepo.repo + if os.name == "nt": + cls.dos2unix(path_ifc) + repo.index.add(os.path.normpath(path_ifc)) + repo.git.commit("--no-edit") + + @classmethod + def set_display_branch(cls) -> None: + props = cls.get_ifcgit_props() + props.display_branch = IfcGitRepo.repo.active_branch.name @classmethod def entity_log(cls, path_ifc: str, step_id: int) -> str: @@ -583,6 +709,18 @@ def install_git_windows(cls, operator: bpy.types.Operator) -> None: except FileNotFoundError: operator.report({"ERROR"}, "Winget is not available. Make sure Windows Package Manager is installed.") + @classmethod + def select_first_remote(cls) -> None: + props = cls.get_ifcgit_props() + repo = IfcGitRepo.repo + if repo and repo.remotes: + props.select_remote = repo.remotes[0].name + + @classmethod + def fetch(cls, remote_name: str) -> None: + repo = IfcGitRepo.repo + repo.remotes[remote_name].fetch() + @classmethod def run_git_diff(cls, operator: bpy.types.Operator, save_to_temp: bool) -> None: path = tool.Ifc.get_path() diff --git a/src/bonsai/bonsai/tool/layer.py b/src/bonsai/bonsai/tool/layer.py index 7b5775d20d2..a49bf8bf05c 100644 --- a/src/bonsai/bonsai/tool/layer.py +++ b/src/bonsai/bonsai/tool/layer.py @@ -17,10 +17,12 @@ # along with Bonsai. If not, see . from __future__ import annotations + +from typing import TYPE_CHECKING + import bpy + import bonsai.core.tool -import bonsai.tool as tool -from typing import TYPE_CHECKING if TYPE_CHECKING: from bonsai.bim.module.layer.prop import BIMLayerProperties diff --git a/src/bonsai/bonsai/tool/library.py b/src/bonsai/bonsai/tool/library.py index e16a159b004..861278e91cd 100644 --- a/src/bonsai/bonsai/tool/library.py +++ b/src/bonsai/bonsai/tool/library.py @@ -17,12 +17,15 @@ # along with Bonsai. If not, see . from __future__ import annotations -import ifcopenshell + +from typing import TYPE_CHECKING, Any, Literal, Union + import bpy +import ifcopenshell + import bonsai.bim.helper import bonsai.core.tool import bonsai.tool as tool -from typing import Literal, Any, Union, TYPE_CHECKING if TYPE_CHECKING: from bonsai.bim.module.library.prop import BIMLibraryProperties diff --git a/src/bonsai/bonsai/tool/loader.py b/src/bonsai/bonsai/tool/loader.py index e28ceacaec1..6d301924855 100644 --- a/src/bonsai/bonsai/tool/loader.py +++ b/src/bonsai/bonsai/tool/loader.py @@ -17,11 +17,16 @@ # along with Bonsai. If not, see . from __future__ import annotations + +import logging import os import re -import bpy +from math import atan, radians +from pathlib import Path +from typing import Any, Optional, Union, cast + import bmesh -import logging +import bpy import ifcopenshell.geom import ifcopenshell.ifcopenshell_wrapper as W import ifcopenshell.util.element @@ -30,17 +35,15 @@ import ifcopenshell.util.representation import ifcopenshell.util.shape import ifcopenshell.util.unit -import bonsai.core.tool -import bonsai.tool as tool -import bonsai.bim.import_ifc import numpy as np import numpy.typing as npt from ifcopenshell.util.shape_builder import np_to_4d -from math import atan, radians -from mathutils import Vector, Matrix -from pathlib import Path -from typing import Union, Any, Optional, cast +from mathutils import Matrix, Vector +from mathutils.kdtree import KDTree +import bonsai.bim.import_ifc +import bonsai.core.tool +import bonsai.tool as tool # Progressively we'll refactor loading elements into Blender objects into this # class. This will break down the monolithic import_ifc module and allow us to @@ -176,7 +179,8 @@ def convert_ifc_color_or_factor(color_or_factor): def surface_texture_to_dict(cls, surface_texture): if isinstance(surface_texture, dict): return surface_texture - mappings = surface_texture.IsMappedBy or [] + # IsMappedBy is an IFC4+ inverse attribute, not available in IFC2X3. + mappings = getattr(surface_texture, "IsMappedBy", None) or [] surface_texture = surface_texture.get_info() uv_mode = None if mappings: @@ -185,7 +189,7 @@ def surface_texture_to_dict(cls, surface_texture): uv_mode = "Generated" elif coordinates.is_a("IfcTextureCoordinateGenerator") and coordinates.Mode == "COORD-EYE": uv_mode = "Camera" - surface_texture["uv_mode"] = uv_mode or "UV" + surface_texture["uv_mode"] = uv_mode or "Generated" return surface_texture @classmethod @@ -283,6 +287,9 @@ def create_surface_style_with_textures(cls, blender_material, rendering_style, t for texture in textures: mode = texture.get("Mode", None) + # IFC2X3 IfcImageTexture has no Mode attribute; default to DIFFUSE. + if mode is None and texture["type"] == "IfcImageTexture": + mode = "DIFFUSE" node = None image_url = None @@ -290,7 +297,8 @@ def create_surface_style_with_textures(cls, blender_material, rendering_style, t def get_image() -> Union[bpy.types.Image, None]: # TODO: orphaned textures after shader recreated? if texture["type"] == "IfcImageTexture": - original_image_url = texture["URLReference"] + # IFC2X3 uses UrlReference, IFC4+ uses URLReference. + original_image_url = texture.get("URLReference") or texture.get("UrlReference", "") is_relative = not os.path.isabs(original_image_url) nonlocal image_url image_url = Path(original_image_url) @@ -313,6 +321,7 @@ def get_image() -> Union[bpy.types.Image, None]: # https://blender.stackexchange.com/questions/173206/how-to-efficiently-convert-a-pil-image-to-bpy-types-image # https://blender.stackexchange.com/questions/62072/does-blender-have-a-method-to-a-get-png-formatted-bytearray-for-an-image-via-pyt import io + from PIL import Image value = texture["RasterCode"] @@ -535,6 +544,33 @@ def load_indexed_colour_map( for colour in colours: cls.load_indexed_map(colour, mesh) + @classmethod + def load_generated_uv_map(cls, mesh: bpy.types.Mesh) -> None: + bm = bmesh.new() + bm.from_mesh(mesh) + uv_layer = bm.loops.layers.uv.active or bm.loops.layers.uv.new("UVMap") + + all_verts = [v.co for v in bm.verts] + if not all_verts: + bm.free() + return + + min_x = min(v.x for v in all_verts) + max_x = max(v.x for v in all_verts) + min_y = min(v.y for v in all_verts) + max_y = max(v.y for v in all_verts) + width = max_x - min_x + height = max_y - min_y + + for face in bm.faces: + for loop in face.loops: + u = (loop.vert.co.x - min_x) / width if width > 0 else 0.5 + v = (loop.vert.co.y - min_y) / height if height > 0 else 0.5 + loop[uv_layer].uv = (max(0.0, min(1.0, u)), max(0.0, min(1.0, v))) + + bm.to_mesh(mesh) + bm.free() + @classmethod def load_indexed_map(cls, index_map: ifcopenshell.entity_instance, mesh: bpy.types.Mesh) -> None: """Add data from index map as blender mesh attribute. @@ -559,7 +595,18 @@ def load_indexed_map(cls, index_map: ifcopenshell.entity_instance, mesh: bpy.typ bm_verts = np.array([v.co for v in bm.verts]) coords_scaled = np.array(faceset.Coordinates.CoordList) * si_conversion - coordinates_remap = [np.argmin(np.sum((bm_verts - co) ** 2, axis=1)) for co in coords_scaled] + # See #2824. IfcIndexedColourMap is not natively handled by IfcOpenShell + # As a result, we map IFC coords to Blender coords (highly wasteful but...) + # coordinates_remap = [np.argmin(np.sum((bm_verts - co) ** 2, axis=1)) for co in coords_scaled] + # Because this is O(N*M), here is a faster KDTree implementation. + kd = KDTree(len(bm_verts)) + for i, v in enumerate(bm_verts): + kd.insert((float(v[0]), float(v[1]), float(v[2])), i) + kd.balance() + coordinates_remap = np.empty(len(coords_scaled), dtype=np.int32) + for j, co in enumerate(coords_scaled): + _co, index, _dist = kd.find((float(co[0]), float(co[1]), float(co[2]))) + coordinates_remap[j] = index # ifc indices start with 1 remap_verts_to_blender = lambda ifc_verts: [coordinates_remap[i - 1] for i in ifc_verts] @@ -1023,11 +1070,6 @@ def slice_layerset_mesh(cls, element: ifcopenshell.entity_instance, mesh: bpy.ty layer_set = material.ForLayerSet offset = usage.OffsetFromReferenceLine * cls.unit_scale sense_factor = 1 if usage.DirectionSense == "POSITIVE" else -1 - elif material.is_a("IfcMaterialLayerSet"): - usage = None - layer_set = material - offset = 0 - sense_factor = 1 else: return mesh if len(layer_set.MaterialLayers) == 1: @@ -1035,11 +1077,7 @@ def slice_layerset_mesh(cls, element: ifcopenshell.entity_instance, mesh: bpy.ty bm = bmesh.new() bm.from_mesh(mesh) prev_co = None - if not usage: - sense_factor = 1 # Assume the extrusion vector points in the direction sense - no = cls.get_extrusion_vector(element).normalized() - co = Vector((0.0, 0.0, offset)) - elif usage.LayerSetDirection == "AXIS2": + if usage.LayerSetDirection == "AXIS2": co = Vector((0.0, offset, 0.0)) no = cls.get_extrusion_vector(element).normalized() no = no.cross(Vector([1.0, 0.0, 0.0])) diff --git a/src/bonsai/bonsai/tool/material.py b/src/bonsai/bonsai/tool/material.py index 5e8b531c5c1..4c55123a9cc 100644 --- a/src/bonsai/bonsai/tool/material.py +++ b/src/bonsai/bonsai/tool/material.py @@ -17,22 +17,27 @@ # along with Bonsai. If not, see . from __future__ import annotations + +from collections import defaultdict +from typing import TYPE_CHECKING, Any, Optional, Union + import bpy import ifcopenshell import ifcopenshell.api.material -import bonsai.core.tool +import ifcopenshell.util.element +import ifcopenshell.util.unit + +import bonsai.bim.helper import bonsai.core.material +import bonsai.core.tool import bonsai.tool as tool -import bonsai.bim.helper -import ifcopenshell.util.unit -import ifcopenshell.util.element -from collections import defaultdict -from typing import Union, Any, TYPE_CHECKING, Optional if TYPE_CHECKING: # Avoid circular imports. - from bonsai.bim.module.material.prop import Material as MaterialItem - from bonsai.bim.module.material.prop import BIMMaterialProperties, BIMObjectMaterialProperties + from bonsai.bim.module.material.prop import ( + BIMMaterialProperties, + BIMObjectMaterialProperties, + ) class Material(bonsai.core.tool.Material): @@ -221,6 +226,10 @@ def is_a_material_set(cls, material: ifcopenshell.entity_instance) -> bool: "IfcMaterialProfileSet", ] + @classmethod + def is_type_product(cls, element: ifcopenshell.entity_instance) -> bool: + return element.is_a("IfcTypeProduct") + @classmethod def add_material_to_set( cls, material_set: ifcopenshell.entity_instance, material: ifcopenshell.entity_instance diff --git a/src/bonsai/bonsai/tool/misc.py b/src/bonsai/bonsai/tool/misc.py index e2a8028181d..5676e8f76c6 100644 --- a/src/bonsai/bonsai/tool/misc.py +++ b/src/bonsai/bonsai/tool/misc.py @@ -16,20 +16,181 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . -import bpy +from __future__ import annotations + +import ctypes +from typing import TYPE_CHECKING, Any, NamedTuple, Union + import bmesh +import bpy import ifcopenshell import ifcopenshell.util.element import ifcopenshell.util.placement import ifcopenshell.util.unit -import bonsai.core.tool +from mathutils import Matrix, Vector + import bonsai.core.root +import bonsai.core.tool import bonsai.tool as tool -from mathutils import Vector, Matrix -from typing import Union + +if TYPE_CHECKING: + from bonsai.bim.module.misc.prop import BIMMiscProperties class Misc(bonsai.core.tool.Misc): + + class BlenderCStructs: + + class ListBase(ctypes.Structure): + _fields_ = [("first", ctypes.c_void_p), ("last", ctypes.c_void_p)] + + class bUserMenu(ctypes.Structure): + pass + + bUserMenu._fields_ = [ + ("next", ctypes.c_void_p), + ("prev", ctypes.c_void_p), + ("space_type", ctypes.c_int8), + ("_pad0", ctypes.c_int8 * 7), + ("context", ctypes.c_char * 64), + ("items", ListBase), + ] + + class bUserMenuItem(ctypes.Structure): + _fields_ = [ + ("next", ctypes.c_void_p), + ("prev", ctypes.c_void_p), + ("ui_name", ctypes.c_char * 64), + ("type", ctypes.c_int8), + ("_pad0", ctypes.c_int8 * 7), + ] + + class bUserMenuItem_Op(ctypes.Structure): + pass + + bUserMenuItem_Op._fields_ = [ + ("item", bUserMenuItem), + ("op_idname", ctypes.c_char * 64), + ("prop", ctypes.c_void_p), + ("op_prop_enum", ctypes.c_char * 64), + ("opcontext", ctypes.c_int8), + ("_pad0", ctypes.c_int8 * 7), + ] + + class IDPropertyData(ctypes.Structure): + pass + + IDPropertyData._fields_ = [ + ("pointer", ctypes.c_void_p), + ("group", ListBase), + ("children_map", ctypes.c_void_p), + ("val", ctypes.c_int), + ("val2", ctypes.c_int), + ] + + class IDProperty(ctypes.Structure): + pass + + IDProperty._fields_ = [ + ("next", ctypes.c_void_p), + ("prev", ctypes.c_void_p), + ("type", ctypes.c_int8), + ("subtype", ctypes.c_int8), + ("flag", ctypes.c_int16), + ("name", ctypes.c_char * 64), + ("_pad0", ctypes.c_int8 * 4), + ("data", IDPropertyData), + ("len", ctypes.c_int), + ("totallen", ctypes.c_int), + ("ui_data", ctypes.c_void_p), + ] + + class QuickFavorites: + """Blender doesn't provide a good way to access or manage Quick Favorites + from the Python API. We use c-structs (ctypes) to read data directly from memory. + This is fragile and can break between Blender versions. We only use this for + reading data and never writing, to avoid the possibility of corrupting user preferences. + """ + + OFFSET_USER_MENUS: dict[tuple[int, int], int] = { + (4, 5): 10032, + (5, 0): 10032, + (5, 1): 10032, + } + + @classmethod + def _read_idprop_value(cls, prop_ptr: int) -> Any: + IDP_STRING = 0 + IDP_INT = 1 + IDP_FLOAT = 2 + IDP_BOOLEAN = 10 + + p = Misc.BlenderCStructs.IDProperty.from_address(prop_ptr) + if p.type == IDP_INT: + return p.data.val + elif p.type == IDP_BOOLEAN: + return bool(p.data.val) + elif p.type == IDP_FLOAT: + return ctypes.c_float.from_buffer_copy(ctypes.c_int(p.data.val)).value + elif p.type == IDP_STRING: + return ctypes.string_at(p.data.pointer).decode() + return f"" + + @classmethod + def _read_idprop_group(cls, group_ptr: int) -> dict[str, Any]: + root = Misc.BlenderCStructs.IDProperty.from_address(group_ptr) + result: dict[str, Any] = {} + child_ptr = root.data.group.first + while child_ptr: + child = Misc.BlenderCStructs.IDProperty.from_address(child_ptr) + result[child.name.decode()] = cls._read_idprop_value(child_ptr) + child_ptr = child.next + return result + + class QuickFavoritesOperator(NamedTuple): + ui_name: str + op_idname_py: str + props: dict[str, Any] + + @classmethod + def get_quick_favorites(cls) -> list[QuickFavoritesOperator]: + assert bpy.context.preferences + blender_version = bpy.app.version[:2] + offset = cls.OFFSET_USER_MENUS[blender_version] + prefs_address = bpy.context.preferences.as_pointer() + user_menus = Misc.BlenderCStructs.ListBase.from_address(prefs_address + offset) + + result: list[cls.QuickFavoritesOperator] = [] + SPACE_VIEW3D = 4 + + node = user_menus.first + while node: + user_menu = Misc.BlenderCStructs.bUserMenu.from_address(node) + if user_menu.space_type != SPACE_VIEW3D: + node = user_menu.next + continue + item_ptr = user_menu.items.first + while item_ptr: + umi = Misc.BlenderCStructs.bUserMenuItem.from_address(item_ptr) + if umi.type == 2: # OPERATOR + op = Misc.BlenderCStructs.bUserMenuItem_Op.from_address(item_ptr) + props = cls._read_idprop_group(op.prop) if op.prop else {} + result.append( + cls.QuickFavoritesOperator( + ui_name=op.item.ui_name.decode(), + op_idname_py=tool.Blender.operator_idname_to_py(op.op_idname.decode()), + props=props, + ) + ) + item_ptr = umi.next + node = user_menu.next + + return result + + @classmethod + def get_misc_props(cls) -> BIMMiscProperties: + return bpy.context.scene.BIMMiscProperties + @classmethod def get_object_storey(cls, obj: bpy.types.Object) -> Union[ifcopenshell.entity_instance, None]: element = tool.Ifc.get_entity(obj) diff --git a/src/bonsai/bonsai/tool/model.py b/src/bonsai/bonsai/tool/model.py index bfe8d6b0204..60f79cc26e3 100644 --- a/src/bonsai/bonsai/tool/model.py +++ b/src/bonsai/bonsai/tool/model.py @@ -17,15 +17,26 @@ # along with Bonsai. If not, see . from __future__ import annotations -import bpy + +import collections.abc import json +from collections.abc import Iterable, Sequence +from copy import deepcopy +from math import atan, cos, degrees, pi, radians +from typing import ( + TYPE_CHECKING, + Any, + Literal, + Optional, + TypedDict, + TypeVar, + Union, + assert_never, +) + import bmesh -import shapely -import collections -import collections.abc -import numpy as np +import bpy import ifcopenshell -import ifcopenshell.api import ifcopenshell.api.geometry import ifcopenshell.api.grid import ifcopenshell.api.pset @@ -37,34 +48,36 @@ import ifcopenshell.util.shape import ifcopenshell.util.shape_builder import ifcopenshell.util.unit +import mathutils +import numpy as np +import shapely +from ifcopenshell.util.shape_builder import ShapeBuilder, np_to_3d +from mathutils import Matrix, Vector + import bonsai.core.geometry import bonsai.core.tool import bonsai.tool as tool -import mathutils -from math import atan, cos, degrees, pi, radians -from mathutils import Matrix, Vector -from copy import deepcopy from bonsai.bim import import_ifc -from ifcopenshell.util.shape_builder import ShapeBuilder, np_to_3d -from typing import Optional, Union, TypeVar, Any, Literal, TYPE_CHECKING, TypedDict, assert_never -from collections.abc import Iterable, Sequence - T = TypeVar("T") V_ = tool.Blender.V_ if TYPE_CHECKING: + import ifcsverchok.nodes.ifc.shape_builder.shape_output + import sverchok.node_tree + from sverchok.core.node_group import SvGroupTreeNode + from bonsai.bim.module.model.prop import ( - BIMModelProperties, - BIMDoorProperties, BIMArrayProperties, - BIMRoofProperties, - BIMWindowProperties, - BIMStairProperties, - BIMRailingProperties, + BIMDoorProperties, BIMExternalParametricGeometryProperties, + BIMModelProperties, BIMPolylineProperties, - BIMProductPreviewProperties, + BIMRailingProperties, + BIMRoofProperties, + BIMStairProperties, + BIMSverchokProperties, + BIMWindowProperties, ) @@ -75,23 +88,27 @@ def get_model_props(cls) -> BIMModelProperties: @classmethod def get_door_props(cls, obj: bpy.types.Object) -> BIMDoorProperties: - return obj.BIMDoorProperties + return obj.BIMDoorProperties # pyright: ignore[reportAttributeAccessIssue] @classmethod def get_window_props(cls, obj: bpy.types.Object) -> BIMWindowProperties: - return obj.BIMWindowProperties + return obj.BIMWindowProperties # pyright: ignore[reportAttributeAccessIssue] @classmethod def get_stair_props(cls, obj: bpy.types.Object) -> BIMStairProperties: - return obj.BIMStairProperties + return obj.BIMStairProperties # pyright: ignore[reportAttributeAccessIssue] @classmethod def get_roof_props(cls, obj: bpy.types.Object) -> BIMRoofProperties: - return obj.BIMRoofProperties + return obj.BIMRoofProperties # pyright: ignore[reportAttributeAccessIssue] @classmethod def get_railing_props(cls, obj: bpy.types.Object) -> BIMRailingProperties: - return obj.BIMRailingProperties + return obj.BIMRailingProperties # pyright: ignore[reportAttributeAccessIssue] + + @classmethod + def get_sverchok_props(cls, obj: bpy.types.Object) -> BIMSverchokProperties: + return obj.BIMSverchokProperties # pyright: ignore[reportAttributeAccessIssue] @classmethod def get_array_props(cls, obj: bpy.types.Object) -> BIMArrayProperties: @@ -106,11 +123,6 @@ def get_polyline_props(cls) -> BIMPolylineProperties: assert (scene := bpy.context.scene) return scene.BIMPolylineProperties # pyright: ignore[reportAttributeAccessIssue] - @classmethod - def get_product_preview_props(cls) -> BIMProductPreviewProperties: - assert (scene := bpy.context.scene) - return scene.BIMProductPreviewProperties # pyright: ignore[reportAttributeAccessIssue] - @classmethod def convert_si_to_unit(cls, value: T) -> T: if isinstance(value, (tuple, list)): @@ -620,6 +632,71 @@ def purge_scene_openings(cls) -> None: if not openings[i].obj: openings.remove(i) + @classmethod + def save_custom_offset_to_pset(cls, element: ifcopenshell.entity_instance, obj: bpy.types.Object) -> None: + """Save custom offset settings to BBIM_MaterialLayer pset.""" + props = tool.Material.get_object_material_props(obj) + + if not props.use_custom_offset: + # Remove pset if custom offset is disabled + pset = ifcopenshell.util.element.get_pset(element, "BBIM_MaterialLayer") + if pset: + pset_entity = tool.Ifc.get().by_id(pset["id"]) + ifcopenshell.api.pset.remove_pset(tool.Ifc.get(), product=element, pset=pset_entity) + return + + # Determine which reference to save based on usage type + usage_type = tool.Model.get_usage_type(element) + custom_wall_reference = None + custom_slab_reference = None + + if usage_type == "LAYER2": + custom_wall_reference = props.custom_wall_reference + elif usage_type == "LAYER3": + custom_slab_reference = props.custom_slab_reference + + # Get or create pset + pset_data = ifcopenshell.util.element.get_pset(element, "BBIM_MaterialLayer") + if pset_data: + pset = tool.Ifc.get().by_id(pset_data["id"]) + else: + pset = ifcopenshell.api.pset.add_pset(tool.Ifc.get(), product=element, name="BBIM_MaterialLayer") + + # Save properties (store in SI units) + unit_scale = ifcopenshell.util.unit.calculate_unit_scale(tool.Ifc.get()) + properties = { + "UseCustomOffset": props.use_custom_offset, + "CustomOffset": props.custom_offset / unit_scale, + "CustomWallReference": custom_wall_reference if custom_wall_reference else "", + "CustomSlabReference": custom_slab_reference if custom_slab_reference else "", + } + ifcopenshell.api.pset.edit_pset(tool.Ifc.get(), pset=pset, properties=properties) + + @classmethod + def load_custom_offset_from_pset(cls, element: ifcopenshell.entity_instance, obj: bpy.types.Object) -> None: + """Load custom offset settings from BBIM_MaterialLayer pset.""" + pset = ifcopenshell.util.element.get_pset(element, "BBIM_MaterialLayer") + if not pset: + return + + props = tool.Material.get_object_material_props(obj) + unit_scale = ifcopenshell.util.unit.calculate_unit_scale(tool.Ifc.get()) + + # Load properties + props.use_custom_offset = pset.get("UseCustomOffset", False) + props.custom_offset = pset.get("CustomOffset", 0.0) * unit_scale # Convert from SI + + # Load the appropriate reference based on usage type + usage_type = tool.Model.get_usage_type(element) + if usage_type == "LAYER2": + custom_wall_ref = pset.get("CustomWallReference", "") + if custom_wall_ref: + props.custom_wall_reference = custom_wall_ref + elif usage_type == "LAYER3": + custom_slab_ref = pset.get("CustomSlabReference", "") + if custom_slab_ref: + props.custom_slab_reference = custom_slab_ref + class MaterialLayerParameters(TypedDict): """Float values are in project units.""" @@ -652,13 +729,35 @@ def get_material_layer_parameters(cls, element: ifcopenshell.entity_instance) -> ) @classmethod - def get_material_layer_custom_offset(cls, element: ifcopenshell.entity_instance, obj) -> MaterialLayerParameters: + def get_material_layer_custom_offset( + cls, element: ifcopenshell.entity_instance, obj: bpy.types.Object + ) -> Optional[float]: + """Get custom offset value, reading from pset if props are not set.""" unit_scale = ifcopenshell.util.unit.calculate_unit_scale(tool.Ifc.get()) layer_params = tool.Model.get_material_layer_parameters(element) layer_offset = layer_params["offset"] thickness = layer_params["thickness"] / unit_scale props = tool.Material.get_object_material_props(obj) - if props.use_custom_offset: + + # Try to load from pset if not already in props + if not props.use_custom_offset: + pset = ifcopenshell.util.element.get_pset(element, "BBIM_MaterialLayer") + if pset and pset.get("UseCustomOffset", False): + # Load from pset + custom_offset = pset.get("CustomOffset", 0.0) + usage_type = tool.Model.get_usage_type(element) + + if usage_type == "LAYER2": + custom_offset_reference = pset.get("CustomWallReference", "CENTER") + elif usage_type == "LAYER3": + custom_offset_reference = pset.get("CustomSlabReference", "MIDDLE") + else: + return None + else: + return None + else: + # Use current props + custom_offset = props.custom_offset / unit_scale if tool.Model.get_usage_type(element) == "LAYER2": custom_offset_reference = props.custom_wall_reference elif tool.Model.get_usage_type(element) == "LAYER3": @@ -666,24 +765,22 @@ def get_material_layer_custom_offset(cls, element: ifcopenshell.entity_instance, else: return None - custom_offset = props.custom_offset - direction_sense = layer_params["direction_sense"] - if direction_sense == "POSITIVE" and custom_offset_reference in {"INTERIOR", "TOP"}: - layer_offset = custom_offset - thickness * unit_scale - if direction_sense == "POSITIVE" and custom_offset_reference in {"CENTER", "MIDDLE"}: - layer_offset = custom_offset - (thickness / 2) * unit_scale - if (direction_sense == "POSITIVE" and custom_offset_reference in {"EXTERIOR", "BOTTOM"}) or ( - direction_sense == "NEGATIVE" and custom_offset_reference in {"EXTERIOR", "TOP"} - ): - layer_offset = custom_offset - if direction_sense == "NEGATIVE" and custom_offset_reference in {"CENTER", "MIDDLE"}: - layer_offset = custom_offset + (thickness / 2) * unit_scale - if direction_sense == "NEGATIVE" and custom_offset_reference in {"INTERIOR", "BOTTOM"}: - layer_offset = custom_offset + thickness * unit_scale - - return layer_offset / unit_scale + direction_sense = layer_params["direction_sense"] - return None + if direction_sense == "POSITIVE" and custom_offset_reference in {"INTERIOR", "TOP"}: + layer_offset = custom_offset - thickness * unit_scale + if direction_sense == "POSITIVE" and custom_offset_reference in {"CENTER", "MIDDLE"}: + layer_offset = custom_offset - (thickness / 2) * unit_scale + if (direction_sense == "POSITIVE" and custom_offset_reference in {"EXTERIOR", "BOTTOM"}) or ( + direction_sense == "NEGATIVE" and custom_offset_reference in {"EXTERIOR", "TOP"} + ): + layer_offset = custom_offset + if direction_sense == "NEGATIVE" and custom_offset_reference in {"CENTER", "MIDDLE"}: + layer_offset = custom_offset + (thickness / 2) * unit_scale + if direction_sense == "NEGATIVE" and custom_offset_reference in {"INTERIOR", "BOTTOM"}: + layer_offset = custom_offset + thickness * unit_scale + + return layer_offset / unit_scale @classmethod def get_booleans( @@ -957,6 +1054,7 @@ def handle_array_on_copied_element( tool.Model.regenerate_array(obj, array_data) + array_pset = tool.Pset.get_element_pset(element, "BBIM_Array") json_data = tool.Ifc.get().createIfcText(json.dumps(array_data)) ifcopenshell.api.pset.edit_pset(tool.Ifc.get(), pset=array_pset, properties={"Data": json_data}) @@ -969,23 +1067,17 @@ def regenerate_array( cls, parent_obj: bpy.types.Object, data: list[dict[str, Any]], array_layers_to_apply: Iterable[int] = tuple() ) -> None: """`array_layers_to_apply` - list of array layer indices to apply""" - tool.Blender.Modifier.Array.remove_constraints(tool.Ifc.get_entity(parent_obj)) + parent_element = tool.Ifc.get_entity(parent_obj) + + if pset := ifcopenshell.util.element.get_pset(parent_element, "BBIM_Array"): + ifcopenshell.api.pset.remove_pset( + tool.Ifc.get(), product=parent_element, pset=tool.Ifc.get().by_id(pset["id"]) + ) unit_scale = ifcopenshell.util.unit.calculate_unit_scale(tool.Ifc.get()) obj_stack = [parent_obj] for array_i, array in enumerate(data): - # for `sync_children` we remove all previously generated children to regenerate them again - # to assure they are in complete sync (psets, etc) with the array parent - if array["sync_children"]: - removed_children = set(array["children"]) - for removed_child in removed_children: - element = tool.Ifc.get().by_guid(removed_child) - obj = tool.Ifc.get_object(element) - if obj: - tool.Geometry.delete_ifc_object(obj) - array["children"].clear() - child_i = 0 existing_children = set(array["children"]) total_existing_children = len(array["children"]) @@ -1005,29 +1097,27 @@ def regenerate_array( offset = base_offset * i for obj in obj_stack: - # get currently proccesed array element and it's object - if child_i >= total_existing_children: - child_obj = tool.Spatial.duplicate_object_and_data(obj) - child_element = tool.Spatial.run_root_copy_class(obj=child_obj) - else: + try: global_id = array["children"][child_i] - try: - child_element = tool.Ifc.get().by_guid(global_id) - child_obj = tool.Ifc.get_object(child_element) - assert child_obj - except: - child_obj = tool.Spatial.duplicate_object_and_data(obj) - child_element = tool.Spatial.run_root_copy_class(obj=child_obj) + child_element = tool.Ifc.get().by_guid(global_id) + child_obj = tool.Ifc.get_object(child_element) + assert child_obj + except: + old_to_new, _ = tool.Geometry.duplicate_ifc_objects([parent_obj]) + child_element = next(iter(old_to_new.values()))[0] + child_obj = tool.Ifc.get_object(child_element) # add child pset - child_pset = tool.Pset.get_element_pset(child_element, "BBIM_Array") - if child_pset: - ifcopenshell.api.pset.edit_pset( - tool.Ifc.get(), - pset=child_pset, - properties={"Data": None}, - should_purge=False, + if not (child_pset := tool.Pset.get_element_pset(child_element, "BBIM_Array")): + child_pset = ifcopenshell.api.pset.add_pset( + tool.Ifc.get(), product=child_element, name="BBIM_Array" ) + ifcopenshell.api.pset.edit_pset( + tool.Ifc.get(), + pset=child_pset, + properties={"Data": None, "Parent": parent_element.GlobalId}, + should_purge=False, + ) # set child object position new_matrix = obj.matrix_world.copy() @@ -1063,6 +1153,12 @@ def regenerate_array( bpy.context.view_layer.update() + pset = ifcopenshell.api.pset.add_pset(tool.Ifc.get(), product=parent_element, name="BBIM_Array") + json_data = tool.Ifc.get().createIfcText(json.dumps(data)) + ifcopenshell.api.pset.edit_pset( + tool.Ifc.get(), pset=pset, properties={"Data": json_data, "Parent": parent_element.GlobalId} + ) + @classmethod def replace_object_ifc_representation( cls, @@ -1101,6 +1197,7 @@ def update_thumbnail_for_element(cls, element: ifcopenshell.entity_instance, ref return from PIL import Image, ImageDraw + from bonsai.bim.module.model.data import AuthoringData obj = tool.Ifc.get_object(element) @@ -1150,18 +1247,7 @@ def update_thumbnail_for_element(cls, element: ifcopenshell.entity_instance, ref height = 100 - is_horizontal = False - if element.is_a("IfcSlabType"): - is_horizontal = True - - parametric = ifcopenshell.util.element.get_psets(element).get("EPset_Parametric") - if parametric: - layer_set_direction = parametric.get("LayerSetDirection", None) - if layer_set_direction == "AXIS2": - is_horizontal = False - elif layer_set_direction == "AXIS3": - is_horizontal = True - + is_horizontal = cls.get_usage_type(element) == "LAYER3" if is_horizontal: width, height = height, width @@ -1172,7 +1258,7 @@ def update_thumbnail_for_element(cls, element: ifcopenshell.entity_instance, ref del thicknesses[-1] for thickness in thicknesses: current_thickness += thickness - if element.is_a("IfcSlabType"): + if is_horizontal: y = (current_thickness / total_thickness) * height line = [x_offset, y_offset + y, x_offset + width, y_offset + y] else: @@ -2455,12 +2541,24 @@ def setup_parametric_geometry(cls, obj: bpy.types.Object) -> None: @classmethod def clean_up_parametric_geometry(cls, obj: bpy.types.Object) -> None: + # Geo nodes are using modifier. modifier = tool.Model.get_epg_modifier(obj) - assert modifier - node_tree = modifier.node_group - assert node_tree - bpy.data.node_groups.remove(node_tree) - obj.modifiers.clear() + if modifier is not None: + node_tree = modifier.node_group + assert node_tree + bpy.data.node_groups.remove(node_tree) + obj.modifiers.clear() + + # Sverchok are changing the mesh data to preview changes. + # TODO: probably should use modifiers with nodes and temp mesh instead. + active_representation = tool.Geometry.get_active_representation(obj) + assert active_representation is not None + bonsai.core.geometry.switch_representation( + tool.Ifc, + tool.Geometry, + obj=obj, + representation=active_representation, + ) @classmethod def get_parametric_geometry_inputs(cls, modifier: bpy.types.NodesModifier) -> list[bpy.types.NodeSocket]: @@ -2472,13 +2570,66 @@ def get_parametric_geometry_inputs(cls, modifier: bpy.types.NodesModifier) -> li return [s for s in group_node.inputs if s.type != "GEOMETRY"] + @classmethod + def get_ifcsverchok_group_node(cls, node_tree: sverchok.node_tree.SverchCustomTree) -> SvGroupTreeNode: + from sverchok.core.node_group import SvGroupTreeNode + + return next(n for n in node_tree.nodes if isinstance(n, SvGroupTreeNode) and n.label == "BBIM_EPG") + + @classmethod + def get_ifcsverchok_shape_output( + cls, node_tree: sverchok.node_tree.SverchCustomTree + ) -> ifcsverchok.nodes.ifc.shape_builder.shape_output.SvSbShapeOutput: + from ifcsverchok.nodes.ifc.shape_builder.shape_output import SvSbShapeOutput + + group_node = cls.get_ifcsverchok_group_node(node_tree) + subtree = group_node.node_tree + return next(n for n in subtree.nodes if isinstance(n, SvSbShapeOutput)) + + @classmethod + def update_mesh_from_sverchok( + cls, obj: bpy.types.Object, node_tree: sverchok.node_tree.SverchCustomTree + ) -> str | None: + """ + :return: ``None`` if successful, otherwise error message. + """ + import ifcsverchok.helper as helper + + output_node = cls.get_ifcsverchok_shape_output(node_tree) + verts = helper.get_socket_value(output_node.outputs, "Vers", value_type="CONTAINER") + edges = helper.get_socket_value(output_node.outputs, "Edgs", value_type="CONTAINER") + faces = helper.get_socket_value(output_node.outputs, "Pols", value_type="CONTAINER") + mesh = obj.data + assert isinstance(mesh, bpy.types.Mesh) + mesh.clear_geometry() + + # `shade_flat=False`, because `from_pydata` is using method that doesn't support changing shading + # during `Panel.draw` execution. We shade flat later ourselves. + mesh.from_pydata(verts, edges, faces, shade_flat=False) + + def _name_convention_attribute_ensure(attributes, name, domain, data_type): + try: + attribute = attributes[name] + except KeyError: + return attributes.new(name, data_type, domain) + if attribute.domain == domain and attribute.data_type == data_type: + return attribute + attributes.remove(attribute) + return attributes.new(name, data_type, domain) + + sharp_faces = _name_convention_attribute_ensure(mesh.attributes, "sharp_face", "FACE", "BOOLEAN") + assert isinstance(sharp_faces, bpy.types.BoolAttribute) + data = sharp_faces.data + ones = np.ones(len(data), dtype=bool) + data.foreach_set("value", ones) + @classmethod def align_objects( cls, reference_obj: bpy.types.Object, objs: Iterable[bpy.types.Object], align_type: Literal["CENTER", "POSITIVE", "NEGATIVE"], - ): + ) -> None: if align_type == "CENTER": point = reference_obj.matrix_world @ (Vector(reference_obj.bound_box[0]) + (reference_obj.dimensions / 2)) elif align_type == "POSITIVE": @@ -2584,3 +2735,57 @@ def recalculate_walls(cls, walls: list[bpy.types.Object]) -> None: material.OffsetFromReferenceLine = custom_offset cls.recreate_wall(element, wall) + + @classmethod + def regenerate_slab(cls, obj: bpy.types.Object) -> None: + from bonsai.bim.module.model.slab import DumbSlabPlaner + + element = tool.Ifc.get_entity(obj) + material_set = ifcopenshell.util.element.get_material(element, should_skip_usage=True) + new_thickness = sum([l.LayerThickness for l in material_set.MaterialLayers]) + DumbSlabPlaner().change_thickness(element, new_thickness) + + @classmethod + def regenerate_profile(cls, obj: bpy.types.Object) -> None: + from bonsai.bim.module.model.profile import DumbProfileRecalculator + + DumbProfileRecalculator().recalculate([obj]) + + @classmethod + def run_ifcsverchok_graph_on_bonsai_file(cls, node_tree: sverchok.node_tree.SverchCustomTree) -> None: + from ifcsverchok.ifcstore import SvIfcStore + from sverchok.core.update_system import UpdateTree + + # We should be very careful and use bonsai file just for 1 graph update. + # To avoid producing duplicated data in non-ephemeral file. + SvIfcStore.use_bonsai_file = True + try: + # The ones below refresh asyncronously, so we're using different method to get results synchronously. + # - bpy.ops.node.sverchok_update_context(force_mode=True) + # - node_tree.force_update() + # TODO: Ideally we should find shape output node and update only it's furtherest children. + # Because user might have some nodes just floating around unused. + # ` update_tree = UpdateTree.get(node_tree); update_tree.add_outdated(nodes)` can be used for this. + UpdateTree.reset_tree(node_tree) + nodes_to_update = UpdateTree.main_update(node_tree) + # Consuming generator, which triggers the update. + list(nodes_to_update) + finally: + SvIfcStore.use_bonsai_file = False + + @classmethod + def create_bmesh_from_vertices(cls, vertices: list[Vector], is_closed: bool = False) -> bmesh.types.BMesh: + bm = bmesh.new() + + new_verts = [bm.verts.new(v) for v in vertices] + if is_closed: + new_edges = [bm.edges.new((new_verts[i], new_verts[i + 1])) for i in range(len(new_verts) - 1)] + new_edges.append( + bm.edges.new((new_verts[-1], new_verts[0])) + ) # Add an edge between the last an first point to make it closed. + else: + new_edges = [bm.edges.new((new_verts[i], new_verts[i + 1])) for i in range(len(new_verts) - 1)] + + bm.verts.index_update() + bm.edges.index_update() + return bm diff --git a/src/bonsai/bonsai/tool/nest.py b/src/bonsai/bonsai/tool/nest.py index 094299c499a..5a1b2c83b27 100644 --- a/src/bonsai/bonsai/tool/nest.py +++ b/src/bonsai/bonsai/tool/nest.py @@ -17,11 +17,14 @@ # along with Bonsai. If not, see . from __future__ import annotations + +from typing import TYPE_CHECKING, Union + import bpy +import ifcopenshell.util.element + import bonsai.core.tool import bonsai.tool as tool -import ifcopenshell.util.element -from typing import TYPE_CHECKING, Union if TYPE_CHECKING: from bonsai.bim.module.nest.prop import BIMNestProperties, BIMObjectNestProperties @@ -42,9 +45,23 @@ def can_nest(cls, relating_obj, related_obj): related_object = tool.Ifc.get_entity(related_obj) if not relating_object or not related_object: return False - if relating_object.is_a("IfcElement") and related_object.is_a("IfcElement"): - return True - return False + if relating_object == related_object: + return False + is_compatible_class = relating_object.is_a("IfcElement") and related_object.is_a("IfcElement") + if not is_compatible_class: + return False + # Prevent cyclic references: walk up the full hierarchy from the + # proposed parent and reject if we encounter the proposed child. + ancestor = ifcopenshell.util.element.get_parent(relating_object) + seen = {relating_object} + while ancestor: + if ancestor == related_object: + return False + if ancestor in seen: + break + seen.add(ancestor) + ancestor = ifcopenshell.util.element.get_parent(ancestor) + return True @classmethod def disable_editing(cls, obj: bpy.types.Object) -> None: @@ -120,11 +137,11 @@ def enable_nest_mode(cls, active_object: bpy.types.Object): return {"FINISHED"} @classmethod - def disable_nest_mode(cls): - context = bpy.context - props = context.scene.BIMNestProperties + def disable_nest_mode(cls) -> None: + props = cls.get_nest_props() for obj_prop in props.not_editing_objects: obj = obj_prop.obj + assert obj and obj.original obj.original.display_type = obj_prop.previous_display_type element = tool.Ifc.get_entity(obj) if not element: @@ -132,7 +149,7 @@ def disable_nest_mode(cls): components = ifcopenshell.util.element.get_components(tool.Ifc.get_entity(props.editing_nest)) objs = [tool.Ifc.get_object(component) for component in components] - if context.space_data.local_view: + if bpy.context.space_data.local_view: bpy.ops.view3d.localview() props.in_nest_mode = False diff --git a/src/bonsai/bonsai/tool/owner.py b/src/bonsai/bonsai/tool/owner.py index 615fd64db8a..9f8cf4ab7c2 100644 --- a/src/bonsai/bonsai/tool/owner.py +++ b/src/bonsai/bonsai/tool/owner.py @@ -17,12 +17,15 @@ # along with Bonsai. If not, see . from __future__ import annotations + +from typing import TYPE_CHECKING, Any, Literal, Union + import bpy +import ifcopenshell + +import bonsai.bim.helper import bonsai.core.tool import bonsai.tool as tool -import bonsai.bim.helper -import ifcopenshell -from typing import Union, Any, TYPE_CHECKING, Literal, assert_never if TYPE_CHECKING: from bonsai.bim.module.owner.prop import BIMOwnerProperties diff --git a/src/bonsai/bonsai/tool/patch.py b/src/bonsai/bonsai/tool/patch.py index eb2b5141734..6ae06b5e100 100644 --- a/src/bonsai/bonsai/tool/patch.py +++ b/src/bonsai/bonsai/tool/patch.py @@ -17,11 +17,14 @@ # along with Bonsai. If not, see . from __future__ import annotations + +from typing import TYPE_CHECKING, Any + import bpy import ifcopenshell import ifcpatch + import bonsai.core.tool -from typing import Any, TYPE_CHECKING if TYPE_CHECKING: from bonsai.bim.module.patch.prop import BIMPatchProperties diff --git a/src/bonsai/bonsai/tool/polyline.py b/src/bonsai/bonsai/tool/polyline.py index e8bacd1b4c5..542bc230059 100644 --- a/src/bonsai/bonsai/tool/polyline.py +++ b/src/bonsai/bonsai/tool/polyline.py @@ -16,19 +16,19 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . -import bpy -import bmesh import math -import ifcopenshell +from dataclasses import dataclass, field +from math import radians +from typing import Literal, Optional, Union + +import bpy import ifcopenshell.util.unit +from lark import Lark, Transformer +from mathutils import Matrix, Vector + import bonsai.core.tool import bonsai.tool as tool from bonsai.bim.module.drawing.helper import format_distance -from dataclasses import dataclass, field -from lark import Lark, Transformer -from math import degrees, radians, sin, cos, tan -from mathutils import Vector, Matrix -from typing import Optional, Union, Literal class Polyline(bonsai.core.tool.Polyline): @@ -189,7 +189,8 @@ def calculate_distance_and_angle( orientation_angle = 0 if input_ui: if should_round: - angle = 5 * round(angle / 5) if distance < angle_round_threshold else angle + angle_snap = tool.Snap.get_angle_snap_value(context) + angle = angle_snap * round(angle / angle_snap) if distance < angle_round_threshold else angle factor = tool.Snap.get_increment_snap_value(context) distance = factor * round(distance / factor) input_ui.set_value("X", mouse_vector.x) @@ -532,9 +533,12 @@ def insert_polyline_point(cls, input_ui: PolylineUI, tool_state: Optional[ToolSt polyline_data = polyline_data[0] polyline_points = polyline_data.polyline_points if polyline_points: - # Avoids creating two points at the same location - for point in polyline_points[1:]: # The first can be repeated to form a wall loop + # Avoids creating two points at the same location. + # The only exception is repeating the first point to close a loop (requires >= 3 existing points). + for i, point in enumerate(polyline_points): if (x, y, z) == (point.x, point.y, point.z): + if i == 0 and len(polyline_points) >= 3: + continue return "Cannot create two points at the same location" # Avoids creating overlapping edges if len(polyline_points) > 1: diff --git a/src/bonsai/bonsai/tool/profile.py b/src/bonsai/bonsai/tool/profile.py index cfb36a06abe..4c7c2fc4488 100644 --- a/src/bonsai/bonsai/tool/profile.py +++ b/src/bonsai/bonsai/tool/profile.py @@ -17,22 +17,22 @@ # along with Bonsai. If not, see . from __future__ import annotations + +from typing import TYPE_CHECKING, Union + import bpy import ifcopenshell import ifcopenshell.api.profile import ifcopenshell.geom import ifcopenshell.ifcopenshell_wrapper as W -import ifcopenshell.util.element -import ifcopenshell.util.unit -import ifcopenshell.util.placement -import ifcopenshell.util.representation import ifcopenshell.util.shape +import ifcopenshell.util.unit import numpy as np +import PIL.ImageDraw + import bonsai.core.tool import bonsai.tool as tool -import PIL.ImageDraw from bonsai.bim.module.model.decorator import ProfileDecorator -from typing import Union, TYPE_CHECKING if TYPE_CHECKING: import bonsai.bim.module.profile.prop diff --git a/src/bonsai/bonsai/tool/project.py b/src/bonsai/bonsai/tool/project.py index 0bfb4b00c1a..1bfb239726a 100644 --- a/src/bonsai/bonsai/tool/project.py +++ b/src/bonsai/bonsai/tool/project.py @@ -17,30 +17,50 @@ # along with Bonsai. If not, see . from __future__ import annotations + +import json import os import shutil +from collections import defaultdict +from math import radians +from pathlib import Path +from typing import ( + TYPE_CHECKING, + Any, + Literal, + NamedTuple, + NotRequired, + Optional, + TypedDict, +) + import bpy import ifcopenshell import ifcopenshell.api.document import ifcopenshell.util.element import ifcopenshell.util.representation -import ifcopenshell.util.unit +import ifcopenshell.util.shape_builder +import numpy as np +import numpy.typing as npt +from ifcopenshell.api.project.append_asset import APPENDABLE_ASSET_TYPES +from mathutils import Matrix, Vector + +import bonsai.bim.schema import bonsai.core.aggregate import bonsai.core.context -import bonsai.core.tool +import bonsai.core.owner import bonsai.core.root +import bonsai.core.tool import bonsai.core.unit -import bonsai.core.owner -import bonsai.bim.schema import bonsai.tool as tool -from collections import defaultdict from bonsai.bim.ifc import IfcStore -from ifcopenshell.api.project.append_asset import APPENDABLE_ASSET_TYPES -from pathlib import Path -from typing import NamedTuple, Optional, Union, TYPE_CHECKING if TYPE_CHECKING: - from bonsai.bim.module.project.prop import BIMProjectProperties, MeasureToolSettings + from bonsai.bim.module.project.prop import ( + BIMProjectProperties, + Link, + MeasureToolSettings, + ) HiearchyDict = dict[ifcopenshell.entity_instance, "HiearchyDict"] @@ -55,6 +75,47 @@ def get_measure_tool_settings(cls) -> MeasureToolSettings: assert (scene := bpy.context.scene) return scene.MeasureToolSettings # pyright: ignore[reportAttributeAccessIssue] + @classmethod + def get_link_empty_handle(cls, link: Link) -> bpy.types.Object | None: + if tool.Ifc.get(): + return tool.Ifc.get_object(tool.Ifc.get().by_id(link.ifc_definition_id)) + return link.empty_handle + + @classmethod + def set_link_empty_handle(cls, link: Link, empty: bpy.types.Object) -> None: + if tool.Ifc.get(): + tool.Ifc.link(tool.Ifc.get().by_id(link.ifc_definition_id), empty) + else: + link.empty_handle = empty + + @classmethod + def calculate_link_matrix(cls, link: Link) -> Matrix: + filepath = Path(tool.Ifc.resolve_uri(link.filepath)) + with open(filepath.with_suffix(".ifc.cache.json"), "r") as f: + metadata = json.load(f) + + rot = ifcopenshell.util.shape_builder.np_rotation_matrix( + radians(-float(metadata["model_project_north"])), 4, "Z" + ) + global_matrix = rot @ np.eye(4) + global_matrix[:, 3][:3] = [float(o) for o in metadata["model_origin_si"].split(",")] + + if tool.Ifc.get(): + transformation = tool.Ifc.get().by_id(link.ifc_definition_id)[1] # Identification + else: + transformation = link.transformation + + if transformation: + transformation = np.fromstring(transformation, sep=",", dtype=np.float64).reshape(4, 4) + if not np.allclose(transformation, np.eye(4)): + global_matrix = transformation @ global_matrix + + gprops = tool.Georeference.get_georeference_props() + rot = ifcopenshell.util.shape_builder.np_rotation_matrix(radians(-float(gprops.model_project_north)), 4, "Z") + local_matrix = rot @ np.eye(4) + local_matrix[:, 3][:3] = [float(o) for o in gprops.model_origin_si.split(",")] + return Matrix(np.linalg.inv(local_matrix) @ global_matrix) + @classmethod def append_all_types_from_template(cls, template: str) -> None: # TODO refactor @@ -246,68 +307,32 @@ def run_root_reload_grid_decorator(cls) -> None: tool.Root.reload_grid_decorator() @classmethod - def get_linked_models_document(cls) -> Union[ifcopenshell.entity_instance, None]: - for document in tool.Ifc.get().by_type("IfcDocumentInformation"): - if document.Name == "BBIM_Linked_Models": - return document + def get_linked_models_documents(cls) -> dict[str, ifcopenshell.entity_instance]: + linked_docs = {} + for doc in tool.Ifc.get().by_type("IfcDocumentInformation"): + if doc.Scope == "LINKED_MODEL": + for reference in tool.Drawing.get_document_references(doc): + linked_docs[Path(reference.Location).as_posix()] = doc + break + return linked_docs @classmethod def load_linked_models_from_ifc(cls) -> None: links = tool.Project.get_project_props().links links.clear() - links_document = cls.get_linked_models_document() - if not links_document: - return - - references = tool.Document.get_document_references(links_document) - if not references: - return - - for reference in references: - link = links.add() - link.name = reference.Location - - @classmethod - def save_linked_models_to_ifc(cls) -> None: - ifc_file = tool.Ifc.get() - links = tool.Project.get_project_props().links - filepaths: set[Path] = set() - for link in links: - filepaths.add(Path(link.name)) - - links_document = cls.get_linked_models_document() - - if not filepaths and links_document is None: - return - - paths_to_add = filepaths.copy() - references_to_remove: list[ifcopenshell.entity_instance] = [] - if links_document: - references = tool.Document.get_document_references(links_document) - for reference in references: - # I guess got corrupted by the user. - if not (location := reference.Location): - references_to_remove.remove(reference) - continue - path = Path(location) - if path in paths_to_add: - paths_to_add.remove(path) - else: - references_to_remove.append(reference) - - if paths_to_add: - if links_document is None: - links_document = ifcopenshell.api.document.add_information(ifc_file) - links_document.Name = "BBIM_Linked_Models" - links_document.Description = "Bonsai internal document containing references to currently linked models" - - for path in paths_to_add: - reference = ifcopenshell.api.document.add_reference(ifc_file, links_document) - reference.Location = path.as_posix() - - if references_to_remove: - for reference in references_to_remove: - ifcopenshell.api.document.remove_reference(ifc_file, reference) + for doc in tool.Ifc.get().by_type("IfcDocumentInformation"): + if doc.Scope != "LINKED_MODEL": + continue + for reference in tool.Drawing.get_document_references(doc): + filepath = reference.Location + link = links.add() + link.name = filepath + link.filepath = filepath + link.ifc_definition_id = reference.id() + link.has_transformation = False + if reference[1]: + m = np.fromstring(reference[1], sep=",", dtype=np.float64).reshape(4, 4) + link.has_transformation = not np.allclose(m, np.eye(4)) @classmethod def get_project_library_elements( @@ -486,8 +511,8 @@ def get_header_data(cls) -> HeaderData: ) @classmethod - def get_clipping_planes_normals(cls): - normals = [] + def get_clipping_planes_normals(cls) -> list[tuple[Vector, Vector]]: + normals: list[tuple[Vector, Vector]] = [] for clipping_plane in tool.Project.get_project_props().clipping_planes: plane = clipping_plane.obj if not plane or not plane.data: @@ -496,6 +521,7 @@ def get_clipping_planes_normals(cls): if plane.mode == "EDIT": continue # A profile decorator or something else is used here. + assert isinstance(plane.data, bpy.types.Mesh) v1 = plane.matrix_world @ plane.data.vertices[0].co v2 = plane.matrix_world @ plane.data.vertices[1].co v3 = plane.matrix_world @ plane.data.vertices[2].co @@ -513,3 +539,435 @@ def save_test_project(cls) -> None: if tmp.exists(): shutil.rmtree(tmp) bpy.ops.bim.save_project(filepath=cls.TEMP_PROJECT_PATH.__str__(), should_save_as=True) + + @classmethod + def get_metadata_document_information(cls) -> Optional[ifcopenshell.entity_instance]: + ifc_file = tool.Ifc.get() + if not ifc_file: + return None + for doc in ifc_file.by_type("IfcDocumentInformation"): + if getattr(doc, "Scope", None) == "BLEND_METADATA": + return doc + return None + + @classmethod + def create_metadata_document_information(cls, metadata_filename: str) -> ifcopenshell.entity_instance: + ifc_file = tool.Ifc.get() + if not ifc_file: + raise Exception("No IFC file loaded") + + doc = ifcopenshell.api.document.add_information(ifc_file, parent=None) + + if ifc_file.schema == "IFC2X3": + ifcopenshell.api.document.edit_information( + ifc_file, + information=doc, + attributes={ + "DocumentId": "BLEND_METADATA", + "Name": "Blend Metadata", + "Scope": "BLEND_METADATA", + "Description": "References to blend metadata file for this IFC project", + "Location": metadata_filename, + }, + ) + else: + ifcopenshell.api.document.edit_information( + ifc_file, + information=doc, + attributes={ + "Identification": "BLEND_METADATA", + "Name": "Blend Metadata", + "Scope": "BLEND_METADATA", + "Description": "References to blend metadata file for this IFC project", + "Location": metadata_filename, + }, + ) + + return doc + + @classmethod + def update_metadata_document_information(cls, metadata_filename: str) -> None: + doc = cls.get_metadata_document_information() + if not doc: + return + + ifc_file = tool.Ifc.get() + ifcopenshell.api.document.edit_information( + ifc_file, information=doc, attributes={"Location": metadata_filename} + ) + + @classmethod + def remove_metadata_document_information(cls) -> None: + doc = cls.get_metadata_document_information() + if not doc: + return + + ifc_file = tool.Ifc.get() + ifcopenshell.api.document.remove_information(ifc_file, information=doc) + + class Link: + """Tools for working with linked models.""" + + class LinkedObjectChunk(TypedDict): + """There's actually no dictionary with those keys, + just using this class to document what keys we do assign to the objects + that represent chunks of the linked models. + """ + + guids: list[str] + """List of guids present in the object.""" + + guid_ids: list[int] + """Number of faces that belong to each guid. + + E.g. if chunk consists of two 12 tris cubes: + ``` + guids = ["aaa", "bbb"] + # Meaning object has 24 polygons + # [0;11] is part of "aaa", [12:23] is part of "bbb". + guid_ids = [12, 24] + ``` + """ + + db: str + """Absolute filepath to .ifc.cache.sqlite.""" + + ifc_filepath: str + """Absolute filepath to .ifc.""" + + # Only added when object is queried. + selected_vertices: NotRequired[list[tuple[int, int, int]]] + selected_edges: NotRequired[list[tuple[int, int]]] + selected_tris: NotRequired[list[tuple[int, int, int]]] + + hidden_indices: NotRequired[list[int]] + """List of hidden indices in "guids". + Note that entire object also can be hidden by ``hide_viewport`` and then "hidden_indices" won't be set. + + ``` + guids = ["aaa", "bbb", "ccc"] + # guid "bbb" is hidden. + hidden_indices = [1] + ``` + """ + + @classmethod + def is_linked_element(cls, obj: bpy.types.Object) -> bool: + return "guids" in obj + + @classmethod + def get_obj_by_guid(cls, link: Link, guid: str) -> bpy.types.Object | None: + assert link.is_loaded + + handle = tool.Project.get_link_empty_handle(link) + assert handle + col = handle.instance_collection + assert col + + guid_obj = None + for obj in col.objects: + obj_guids: list[str] = obj["guids"] + if guid in obj_guids: + guid_obj = obj + break + + return guid_obj + + @classmethod + def get_linked_element_guid_ids(cls, obj: bpy.types.Object, *, skip_hidden: bool) -> npt.NDArray[np.int64]: + obj_guid_ids: npt.NDArray[np.int64] = np.array(obj["guid_ids"]) + + if not skip_hidden: + return obj_guid_ids + + # 'hidden_indices' is needed, because otherwise we can't make sense of 'guid_ids', + # since part of the geometry is hidden. + obj_hidden_indices: list[int] = list(obj.get("hidden_indices") or []) + + if not obj_hidden_indices: + return obj_guid_ids + + # Skip hidden geometry indices. + hidden_indices_mask = np.zeros(len(obj_guid_ids), dtype=bool) + hidden_indices_mask[obj_hidden_indices] = True + deltas = np.diff(obj_guid_ids, prepend=0) + deltas[~hidden_indices_mask] = 0 + obj_guid_ids -= np.cumsum(deltas) + return obj_guid_ids + + @classmethod + def get_guid_by_face_index(cls, obj: bpy.types.Object, face_index: int) -> str | None: + guids: list[str] = obj["guids"] + guid_ids = cls.get_linked_element_guid_ids(obj, skip_hidden=True) + for guid, guid_end_index in zip(guids, guid_ids): + if face_index < guid_end_index: + return guid + + @classmethod + def get_linked_element_geom_slice(cls, obj: bpy.types.Object, guid: str) -> slice[int, int]: + """ + Get slice for ``obj.data.polygons`` for the provided ``guid``. + """ + obj_guids: list[str] = obj["guids"] + + # Just to be safe. + obj_hidden_indices: list[int] = obj.get("hidden_indices") or [] + index = obj_guids.index(guid) + if index in obj_hidden_indices: + assert False, "Unexpected. Why would you need the geometry for the hidden element?" + obj_guid_ids = cls.get_linked_element_guid_ids(obj, skip_hidden=False) + guid_end_index = obj_guid_ids[index] + guid_start_index = index and obj_guid_ids[index - 1] + return slice(guid_start_index, guid_end_index) + + @classmethod + def setup_hide_modifier( + cls, + obj: bpy.types.Object, + hide_type: Literal["hide_selected", "hide_unselected"], + ) -> bpy.types.VertexGroup: + # `MeshPolygon.hide` works only in EDIT mode, + # so we use vertex groups + Mask modifier. + # But since for hiding we're modifying object in a linked model, + # then those changes are ephemeral and not fully supported by Blender + # e.g. they're not tracked by UNDO system. + + MODIFIER_VG_NAME = "BBIM_HIDE_LINKED_GEOMETRY" + + vertex_groups = obj.vertex_groups + vertex_group = vertex_groups.get(MODIFIER_VG_NAME) + if vertex_group is None: + vertex_group = vertex_groups.new(name=MODIFIER_VG_NAME) + + modifiers = obj.modifiers + modifier = modifiers.get(MODIFIER_VG_NAME) + if modifier is None: + modifier = modifiers.new(MODIFIER_VG_NAME, "MASK") + assert isinstance(modifier, bpy.types.MaskModifier) + modifier.vertex_group = MODIFIER_VG_NAME + # Mask modifier by default shows only geometry from the provided vertex group. + modifier.invert_vertex_group = hide_type == "hide_selected" + return vertex_group + + @classmethod + def hide_linked_element(cls, obj: bpy.types.Object, guid: str) -> None: + verts = tool.Project.Link.get_linked_element_verts(obj, guid) + + vertex_group = cls.setup_hide_modifier(obj, "hide_selected") + vertex_group.add(verts, 1.0, "REPLACE") + + hidden_indices: list[int] = list(obj.get("hidden_indices") or []) + guid_ids: list[str] = obj["guids"] + index = guid_ids.index(guid) + hidden_indices.append(index) + obj["hidden_indices"] = hidden_indices + + @classmethod + def unhide_all_elements(cls, link: Link) -> None: + obj = tool.Project.get_link_empty_handle(link) + assert obj + col = obj.instance_collection + assert col + + for obj_ in col.objects: + obj_.hide_viewport = False + + if "hidden_indices" not in obj_: + continue + obj_.vertex_groups.clear() + obj_.modifiers.clear() + del obj_["hidden_indices"] + + @classmethod + def hide_all_elements_except(cls, link: Link, queried_obj: bpy.types.Object, queried_guid: str) -> None: + handle = tool.Project.get_link_empty_handle(link) + assert handle + col = handle.instance_collection + assert col + + for obj_ in col.objects: + if "guids" not in obj_: + continue + if obj_ != queried_obj: + # Just hide the entire chunk, if queried guid is not part of it. + obj_.hide_viewport = True + continue + + guids: list[str] = obj_["guids"] + queried_guid_index = guids.index(queried_guid) + + # Get vertices for the queried element before modifying hidden_indices. + queried_verts = cls.get_linked_element_verts(obj_, queried_guid) + vertex_group = cls.setup_hide_modifier(obj_, "hide_unselected") + + assert isinstance(mesh := obj_.data, bpy.types.Mesh) + # Clean up possible previously hidden elements. + vertex_group.remove(range(len(mesh.vertices))) + + vertex_group.add(queried_verts, 1.0, "REPLACE") + + # Mark all guids as hidden except the queried one. + obj_["hidden_indices"] = [i for i in range(len(guids)) if i != queried_guid_index] + + @classmethod + def select_linked_element_geom(cls, obj: bpy.types.Object, guid: str) -> None: + slice_ = cls.get_linked_element_geom_slice(obj, guid) + + mesh = obj.data + assert isinstance(mesh, bpy.types.Mesh) + guid_polygons = mesh.polygons[slice_] + + selected_tris: list[tuple[int, ...]] = [] + selected_edges: list[tuple[int, ...]] = [] + + # Restart verts indices for our polygons. + guid_vertices_set: set[int] = set() + for polygon in guid_polygons: + guid_vertices_set.update(polygon.vertices) + vert_map = {k: v for v, k in enumerate(guid_vertices_set)} + + selected_vertices = [obj.matrix_world @ mesh.vertices[vi].co for vi in vert_map] + for polygon in guid_polygons: + selected_tris.append(tuple(vert_map[vi] for vi in polygon.vertices)) + selected_edges.extend(tuple([vert_map[vi] for vi in e]) for e in polygon.edge_keys) + + obj["selected_vertices"] = selected_vertices + obj["selected_edges"] = selected_edges + obj["selected_tris"] = selected_tris + + @classmethod + def get_linked_element_verts(cls, obj: bpy.types.Object, guid: str) -> set[int]: + slice_ = cls.get_linked_element_geom_slice(obj, guid) + + mesh = obj.data + assert isinstance(mesh, bpy.types.Mesh) + guid_polygons = mesh.polygons[slice_] + + guid_vertices_set: set[int] = set() + for polygon in guid_polygons: + guid_vertices_set.update(polygon.vertices) + return guid_vertices_set + + @classmethod + def select_linked_element( + cls, + context: bpy.types.Context, + obj: bpy.types.Object, + guid: str, + instance_matrix: Matrix | None = None, + ) -> None: + import sqlite3 + + from ifcpatch.recipes.ExtractPropertiesToSQLite import ( + ElementRow, + PropertyRow, + RelationshipRow, + ) + + from bonsai.bim.module.project.data import LinksData + from bonsai.bim.module.project.decorator import ProjectDecorator + + # Not sure if there's a difference between `instance_matrix` coming from `ray_cast` + # and usual `matrix_world`, maybe we can just get it from object always. + if instance_matrix is None: + instance_matrix = obj.matrix_world + + cls.deselect_queried_linked_element() + cls.set_queried_linked_element(obj, guid, instance_matrix) + cls.select_linked_element_geom(obj, guid) + db = sqlite3.connect(obj["db"]) + c = db.cursor() + + c.execute(f"SELECT * FROM elements WHERE global_id = '{guid}' LIMIT 1") + element = ElementRow(*c.fetchone()) + + attributes: dict[str, Any] = {} + for i, attr in enumerate(["GlobalId", "IFC Class", "Predefined Type", "Name", "Description"]): + if element[i + 1] is not None: + attributes[attr] = element[i + 1] + + c.execute("SELECT * FROM properties WHERE element_id = ?", (element[0],)) + rows = [PropertyRow(*row) for row in c.fetchall()] + + properties: defaultdict[str, dict[str, str]] = defaultdict(dict) + for row in rows: + properties[row.pset_name][row.name] = row.value + + c.execute("SELECT * FROM relationships WHERE from_id = ?", (element[0],)) + relationships = [RelationshipRow(*row) for row in c.fetchall()] + + relating_type_id = None + + for relationship in relationships: + if relationship[1] == "IfcRelDefinesByType": + relating_type_id = relationship[2] + + type_properties: defaultdict[str, dict[str, str]] = defaultdict(dict) + if relating_type_id is not None: + c.execute("SELECT * FROM properties WHERE element_id = ?", (relating_type_id,)) + rows = [PropertyRow(*row) for row in c.fetchall()] + for row in rows: + type_properties[row.pset_name][row.name] = row.value + + LinksData.linked_data = { + "attributes": attributes, + "properties": [(k, properties[k]) for k in sorted(properties.keys())], + "type_properties": [(k, type_properties[k]) for k in sorted(type_properties.keys())], + } + db.close() + + assert context.screen + for area in context.screen.areas: + if area.type == "PROPERTIES": + for region in area.regions: + if region.type == "WINDOW": + region.tag_redraw() + elif area.type == "VIEW_3D": + area.tag_redraw() + + ProjectDecorator.install(context) + + @classmethod + def set_queried_linked_element(cls, obj: bpy.types.Object, guid: str, instance_matrix: Matrix) -> None: + props = tool.Project.get_project_props() + props.queried_obj = obj + props.queried_obj_root = cls.find_obj_root(obj, instance_matrix) + props.queried_guid = guid + + @classmethod + def deselect_queried_linked_element(cls) -> None: + props = tool.Project.get_project_props() + obj = props.queried_obj + props.property_unset("queried_obj") + props.property_unset("queried_obj_root") + props.property_unset("queried_guid") + + if obj is not None: + for field in cls.SelectedGeometry._fields: + del obj[field] + + @classmethod + def find_obj_root(cls, obj: bpy.types.Object, matrix: Matrix) -> bpy.types.Object | None: + collections = set(obj.users_collection) + for o in bpy.data.objects: + if ( + o.type != "EMPTY" + or o.instance_type != "COLLECTION" + or o.instance_collection not in collections + or not np.allclose(matrix, o.matrix_world, atol=1e-4) + ): + continue + return o + + class SelectedGeometry(NamedTuple): + selected_vertices: list[tuple[float, float, float]] + selected_edges: list[tuple[int, int]] + selected_tris: list[tuple[int, int, int]] + + @classmethod + def get_selected_geometry(cls, obj: bpy.types.Object) -> SelectedGeometry: + return cls.SelectedGeometry( + obj["selected_vertices"], + obj["selected_edges"], + obj["selected_tris"], + ) diff --git a/src/bonsai/bonsai/tool/pset.py b/src/bonsai/bonsai/tool/pset.py index b6901238bac..2e2fc4383c4 100644 --- a/src/bonsai/bonsai/tool/pset.py +++ b/src/bonsai/bonsai/tool/pset.py @@ -17,27 +17,28 @@ # along with Bonsai. If not, see . from __future__ import annotations + +from typing import TYPE_CHECKING, Any, Literal, Union, assert_never + import bpy import ifcopenshell -import ifcopenshell.api.pset import ifcopenshell.util.attribute import ifcopenshell.util.element + import bonsai.bim.helper +import bonsai.bim.schema import bonsai.core.tool import bonsai.tool as tool -import bonsai.bim.schema -from typing import Union, Literal, Any, TYPE_CHECKING, assert_never - if TYPE_CHECKING: - from bonsai.bim.prop import Attribute from bonsai.bim.module.pset.prop import ( - PsetProperties, - GlobalPsetProperties, AddEditPropertyEntry, - RenamePropertyEntry, DeletePsetEntry, + GlobalPsetProperties, + PsetProperties, + RenamePropertyEntry, ) + from bonsai.bim.prop import Attribute class Pset(bonsai.core.tool.Pset): diff --git a/src/bonsai/bonsai/tool/pset_template.py b/src/bonsai/bonsai/tool/pset_template.py index 3da6dad2e57..fea5362d4e5 100644 --- a/src/bonsai/bonsai/tool/pset_template.py +++ b/src/bonsai/bonsai/tool/pset_template.py @@ -17,16 +17,17 @@ # along with Bonsai. If not, see . from __future__ import annotations + +from pathlib import Path +from typing import TYPE_CHECKING, Literal, final + import bpy import ifcopenshell import ifcopenshell.api.pset_template -import ifcopenshell.util.attribute -import ifcopenshell.util.element + +import bonsai.bim import bonsai.core.tool import bonsai.tool as tool -import bonsai.bim -from pathlib import Path -from typing import Literal, final, TYPE_CHECKING from bonsai.bim.ifc import IfcStore if TYPE_CHECKING: @@ -61,19 +62,23 @@ def _execute(self, context: bpy.types.Context) -> None: tool.Ifc.Operator._execute(self, context) @classmethod - def add_pset_as_template( - cls, pset: ifcopenshell.entity_instance, template_file: ifcopenshell.file - ) -> ifcopenshell.entity_instance: - # TODO: add tests. - pset_template = ifcopenshell.api.pset_template.add_pset_template(template_file, pset.Name) - for property in pset.HasProperties: - ifcopenshell.api.pset_template.add_prop_template( - template_file, - pset_template, - name=property.Name, - description=property.Description, - primary_measure_type=property.NominalValue.is_a(), - ) + def add_pset_as_template(cls, pset_name: str, template_file: ifcopenshell.file) -> ifcopenshell.entity_instance: + added_prop_names = set() + pset_template = ifcopenshell.api.pset_template.add_pset_template(template_file, pset_name) + for pset in tool.Ifc.get().by_type("IfcPropertySet"): + if pset.Name != pset_name: + continue + for prop in pset.HasProperties: + if prop.Name in added_prop_names: + continue + added_prop_names.add(prop.Name) + ifcopenshell.api.pset_template.add_prop_template( + template_file, + pset_template, + name=prop.Name, + description=prop.Description, + primary_measure_type=prop.NominalValue.is_a(), + ) return pset_template @classmethod diff --git a/src/bonsai/bonsai/tool/qto.py b/src/bonsai/bonsai/tool/qto.py index 0efa7593359..ec14df6f4cb 100644 --- a/src/bonsai/bonsai/tool/qto.py +++ b/src/bonsai/bonsai/tool/qto.py @@ -17,15 +17,17 @@ # along with Bonsai. If not, see . from __future__ import annotations + +from typing import TYPE_CHECKING, Any, Literal, Optional, Union + import bpy -import bonsai.core.tool -import bonsai.bim.schema -import bonsai.tool as tool import ifcopenshell import ifcopenshell.util.unit -import ifcopenshell.util.element from mathutils import Vector -from typing import Optional, Union, Literal, TYPE_CHECKING, Any + +import bonsai.bim.schema +import bonsai.core.tool +import bonsai.tool as tool if TYPE_CHECKING: from bonsai.bim.module.qto.prop import BIMQtoProperties diff --git a/src/bonsai/bonsai/tool/raycast.py b/src/bonsai/bonsai/tool/raycast.py index 90bec966442..dc45b4e9bb8 100644 --- a/src/bonsai/bonsai/tool/raycast.py +++ b/src/bonsai/bonsai/tool/raycast.py @@ -16,16 +16,20 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . +from __future__ import annotations + +import math +from typing import Union + import bmesh import bpy -import copy +import mathutils import numpy as np from bpy_extras import view3d_utils +from mathutils import Vector + import bonsai.core.tool import bonsai.tool as tool -import mathutils -from mathutils import Vector -from typing import Union class Raycast(bonsai.core.tool.Raycast): @@ -41,6 +45,7 @@ class Raycast(bonsai.core.tool.Raycast): (0, -offset), (offset, -offset), ) + snap_objs = [] @classmethod def get_visible_objects(cls, context: bpy.types.Context): @@ -69,8 +74,10 @@ def get_on_screen_2d_bounding_boxes( rv3d = context.region_data assert rv3d view_location = rv3d.view_matrix.inverted().translation + view_normal = rv3d.view_rotation @ mathutils.Vector((0.0, 0.0, -1.0)) obj_matrix = obj.matrix_world.copy() bbox = [obj_matrix @ Vector(v) for v in obj.bound_box] + bbox_edges = [(0, 1), (1, 2), (2, 3), (3, 0), (4, 5), (5, 6), (6, 7), (7, 4), (0, 4), (1, 5), (2, 6), (3, 7)] transposed_bbox: list[Vector] = [] bbox_2d: list[float] = [] @@ -94,8 +101,25 @@ def get_on_screen_2d_bounding_boxes( for v in bbox: coord_2d = tool.Cad.location_3d_to_region_2d_np(context.region, context.space_data.region_3d, v) - if coord_2d is not None: - transposed_bbox.append(coord_2d) + transposed_bbox.append(coord_2d) + + if not any(transposed_bbox): + transposed_bbox = [] + # If there are None values in transposed_bbox it means that there are vertices behind the camera + # so we get the intersection of the edge with the region border + # new_bbox = [] + if any(transposed_bbox) and not all(transposed_bbox): + new_bbox = transposed_bbox.copy() + new_bbox = [x for x in new_bbox if x is not None] + for edge in bbox_edges: + if (transposed_bbox[edge[0]] is None) ^ (transposed_bbox[edge[1]] is None): + point, _ = cls.intersect_edge_region_border( + context.region, context.space_data, rv3d, bbox[edge[0]], bbox[edge[1]] + ) + if point: + new_bbox.append(point) + if new_bbox: + transposed_bbox = new_bbox region = context.region borders = (0, region.width, 0, region.height) @@ -117,6 +141,96 @@ def get_on_screen_2d_bounding_boxes( return (obj, bbox_2d) return None + def intersect_edge_region_border(region, space, rv3d, v1, v2): + def segment_intersect_near_plane(view_matrix, clip_start, p_world_a, p_world_b): + a_view = view_matrix @ p_world_a + b_view = view_matrix @ p_world_b + z_near = -clip_start + za = a_view.z + zb = b_view.z + denom = zb - za + if denom == 0.0: + return None, None + t = (z_near - za) / denom + if t < 0.0 or t > 1.0: + return None, None + p_view = a_view.lerp(b_view, t) + cam_world = view_matrix.inverted() + p_world = cam_world @ p_view + return p_world, t + + def is_inside_region(pt2d, region): + return 0.0 <= pt2d.x <= region.width and 0.0 <= pt2d.y <= region.height + + def clamp_to_region_border(point2d, region): + x, y = point2d + x_clamped = max(0.0, min(region.width, x)) + y_clamped = max(0.0, min(region.height, y)) + return Vector((x_clamped, y_clamped)) + + def find_nearby_onscreen_point(region, rv3d, p1, p2, initial_t_on_segment, max_iters=40, step=0.05): + """ + Use iterative approach: move t toward 0. Returns the first point that is inside region border + """ + t = initial_t_on_segment + for i in range(max_iters): + test_3d = p1.lerp(p2, t) + test_2d = view3d_utils.location_3d_to_region_2d(region, rv3d, test_3d) + if test_2d is not None and is_inside_region(test_2d, region): + return test_3d, test_2d, t + # move t toward 0 by reducing it by a fraction of its current value + t -= step + # if t is already very small, break + if t <= 1e-6: + break + + return None, None, None + + # Ensures that all the calculation uses the same direction based on which point is on the screen + if view3d_utils.location_3d_to_region_2d(region, rv3d, v1): + onscreen_vert = v1 + offscreen_vert = v2 + else: + onscreen_vert = v2 + offscreen_vert = v1 + # v2, v1 = v1, v2 + + clip_start = space.clip_start + view_mat = rv3d.view_matrix + inter_world, t_on_ab = segment_intersect_near_plane(view_mat, clip_start, onscreen_vert, offscreen_vert) + + if inter_world is None: + print("No intersection with viewport near plane found for the segment.") + return None, None + + init_2d = view3d_utils.location_3d_to_region_2d(region, rv3d, inter_world) + + if init_2d is not None and is_inside_region(init_2d, region): + final_world = inter_world + final_2d = init_2d + final_t = t_on_ab + else: + found_world, found_2d, found_t = find_nearby_onscreen_point( + region, rv3d, onscreen_vert, offscreen_vert, t_on_ab, max_iters=600, step=0.01 + ) + if found_world is None: + if init_2d is None: + print("Initial projection invalid and iterative search failed.") + return None, None + # fallback: clamp projected point to border via manual mapping + final_2d = clamp_to_region_border(init_2d, region) + final_world = None + final_t = None + # print("Iterative search failed; using clamped 2D:", final_2d) + else: + final_world = found_world + final_2d = found_2d + final_t = found_t + # print(f"Found onscreen point at t={final_t:.4f}") + + # print("Final 2D:", final_2d) + return final_2d, v2 + @classmethod def intersect_mouse_2d_bounding_box(cls, mouse_pos: tuple[int, int], bbox: list[float, float, float, float]): x, y = mouse_pos @@ -232,6 +346,158 @@ def obj_ray_cast( else: return None, None, None + @classmethod + def ray_cast_by_proximity_2d( + cls, + context: bpy.types.Context, + event: bpy.types.Event, + snap_obj: SnapObj, + ): + + def divide_vector(start, end, n): + points = [] + delta = (end - start) / n + for i in range(1, n): + point = start + i * delta + points.append(point) + return points + + region = context.region + rv3d = context.region_data + mouse_pos = event.mouse_region_x, event.mouse_region_y + ray_origin, ray_target, ray_direction = cls.get_viewport_ray_data(context, event) + points = [] + + try: + loc = tool.Cad.region_2d_to_location_3d_np(region, rv3d, mouse_pos, ray_direction) + except: + loc = Vector((0, 0, 0)) + + verts_2d = [ + view3d_utils.location_3d_to_region_2d(region, rv3d, v) for v in snap_obj.verts_3d + ] # Numpy version is worst in performance + + intersected = snap_obj.raycast_boxes( + context, event, snap_obj.root, intersected=[], rays=(ray_origin, ray_direction) + ) + edges = [] + for it in intersected: + edges.extend(it.edges) + edges = set(edges) + + edge_verts = {} + for e in edges: + verts_idx = tuple(snap_obj.obj.data.edges[e].vertices) + verts = snap_obj.obj.data.vertices + v1 = snap_obj.obj.matrix_world @ verts[verts_idx[0]].co + v1_2d = verts_2d[verts_idx[0]] + v2 = snap_obj.obj.matrix_world @ verts[verts_idx[1]].co + v2_2d = verts_2d[verts_idx[1]] + if (v1_2d is None) ^ (v2_2d is None): + point, _ = cls.intersect_edge_region_border(region, context.space_data, rv3d, v1, v2) + if v1_2d is None: + edge_verts[e] = (point, v2_2d) + else: + edge_verts[e] = (v1_2d, point) + else: + edge_verts[e] = (v1_2d, v2_2d) + + snap_threshold = 10.0 + + for i, point in enumerate(verts_2d): + if not point: + continue + distance = (Vector(mouse_pos) - point).length + if distance <= snap_threshold: + snap_point = { + "object": snap_obj.obj, + "type": "Vertex", + "point": snap_obj.verts_3d[i], + "distance": distance / 10, + } + points.append(snap_point) + + count = 0 + selected_edges = {} + for e in edges: + p0, p1 = edge_verts[e] + p0x, p0y = p0 + p1x, p1y = p1 + px, py = mouse_pos + + # segment vector = p1 - p0 + sx = p1x - p0x + sy = p1y - p0y + + # seg length squared + seg_len_sq = sx * sx + sy * sy + + if seg_len_sq == 0.0: + # degenerate segment: skip it + continue + + # project (p - p0) onto seg: t = dot(p-p0, seg) / |seg|^2 + apx = px - p0x + apy = py - p0y + t = (apx * sx + apy * sy) / seg_len_sq + + # clamp to segment + if t <= 0.0: + t_clamped = 0.0 + cx, cy = p0x, p0y + elif t >= 1.0: + t_clamped = 1.0 + cx, cy = p1x, p1y + else: + t_clamped = t + cx = p0x + sx * t_clamped + cy = p0y + sy * t_clamped + + dx = px - cx + dy = py - cy + dist = math.hypot(dx, dy) + if dist <= snap_threshold: + selected_edges[dist] = e + + if selected_edges: + min_dist = float("inf") + for key in selected_edges: + if key < min_dist: + min_dist = key + + idx = snap_obj.obj.data.edges[selected_edges[min_dist]].vertices + edge_verts = (snap_obj.verts_3d[idx[0]], snap_obj.verts_3d[idx[1]]) + division_points = divide_vector( + edge_verts[0], edge_verts[1], 2 + ) # TODO Make it work for different divisions + for division_point in division_points: + intersection = tool.Cad.point_on_edge(division_point, (ray_target, loc)) + distance = (division_point - intersection).length + if distance < snap_threshold: + snap_point = { + "object": snap_obj.obj, + "type": "Edge Center", + "point": division_point.copy(), + "distance": distance, + } + points.append(snap_point) + + intersection = tool.Cad.intersect_edges_v2((ray_target, loc), edge_verts) + if intersection[0]: + if tool.Cad.is_point_on_edge(intersection[1], edge_verts): + distance = (intersection[1] - intersection[0]).length + if distance < snap_threshold: + snap_point = { + "object": snap_obj.obj, + "type": "Edge", + "point": intersection[1].copy(), + "edge_verts": edge_verts, + "distance": distance, + } + points.append(snap_point) + + return points + @classmethod def ray_cast_by_proximity( cls, @@ -457,7 +723,9 @@ def filter_objects_to_raycast( if bbox_2d: if tool.Raycast.intersect_mouse_2d_bounding_box(mouse_pos, bbox_2d): if tool.Raycast.object_is_visible_in_clipping_plane(obj): - objs_to_raycast.append(obj) + snap_obj = cls.create_snap_obj(obj) + if snap_obj is not None: + objs_to_raycast.append(snap_obj) return objs_to_raycast @@ -474,12 +742,6 @@ def cast_rays_to_single_object( face_index = None # Wireframes if obj.type in {"EMPTY", "CURVE"} or (hasattr(obj.data, "polygons") and len(obj.data.polygons) == 0): - snap_points = tool.Raycast.ray_cast_by_proximity(context, event, obj) - if snap_points: - hit = sorted(snap_points, key=lambda x: x["distance"])[0]["point"] - if hit: - hit_world = obj.original.matrix_world @ hit - return obj, hit_world, face_index return None, None, None # Meshes else: @@ -514,19 +776,20 @@ def cast_rays_and_get_best_object( ray_origin, ray_target, ray_direction = cls.get_viewport_ray_data(context, event) - for obj in objs_to_raycast: + for snap_obj in objs_to_raycast: if not include_wireframes and ( - obj.type in {"EMPTY", "CURVE"} or (hasattr(obj.data, "polygons") and len(obj.data.polygons) == 0) + snap_obj.obj.type in {"EMPTY", "CURVE"} + or (hasattr(snap_obj.obj.data, "polygons") and len(snap_obj.obj.data.polygons) == 0) ): continue - snap_obj, hit, face_index = cls.cast_rays_to_single_object(context, event, obj) + hit_obj, hit, face_index = cls.cast_rays_to_single_object(context, event, snap_obj.obj) if hit is not None: length_squared = (hit - ray_origin).length_squared if best_obj is None or length_squared < best_length_squared: best_length_squared = length_squared - best_obj = snap_obj + best_obj = hit_obj best_hit = hit best_face_index = face_index @@ -536,6 +799,79 @@ def cast_rays_and_get_best_object( else: return None, None, None + @classmethod + def ray_cast_and_get_closest_to_camera_snaps( + cls, + context: bpy.types.Context, + event: bpy.types.Event, + objs_to_raycast: list[bpy.types.Object], + ) -> Union[tuple[bpy.types.Object, Vector, int], tuple[None, None, None]]: + closest_length_squared = 1.0 + closest_obj = None + closest_hit = None + closest_face_index = None + + ray_origin, ray_target, ray_direction = cls.get_viewport_ray_data(context, event) + + closest_snaps = [] + hit = None + + for snap_obj in objs_to_raycast: + if snap_obj.obj.type in {"EMPTY", "CURVE"} or ( + hasattr(snap_obj.obj.data, "polygons") and len(snap_obj.obj.data.polygons) == 0 + ): + # For wireframe objects we have to test all the snaps to see which is closer + snap_points = tool.Raycast.ray_cast_by_proximity_2d(context, event, snap_obj) + closest_wf_hit = None + closest_wf_length_squared = 1.0 + closest_wf_point = None + if snap_points: + for point in snap_points: + point["group"] = "Wireframe" + closest_snaps.append(point) + length = (point["point"] - ray_origin).length_squared + if closest_wf_hit is None or length < closest_wf_length_squared: + closest_wf_length_squared = length + closest_wf_hit = point["point"] + closest_wf_point = point + + if closest_wf_point: + hit_obj = closest_wf_point["object"] + hit = closest_wf_point["point"] + face_index = None + + else: + # Solid objects + hit_obj, hit, face_index = cls.cast_rays_to_single_object(context, event, snap_obj.obj) + + if hit: + snap_point = { + "point": hit, + "type": "Face", + "group": "Object", + "object": hit_obj, + "face_index": face_index, + "distance": 9, # High value so it has low priority + } + closest_snaps.append(snap_point) + + # Here we test which is closer, including wireframe and solid objects + if hit is not None: + length_squared = (hit - ray_origin).length_squared + if closest_obj is None or length_squared < closest_length_squared: + closest_length_squared = length_squared + closest_obj = hit_obj + closest_hit = hit + closest_face_index = face_index + + # Label snaps from the closest object + if closest_obj is not None: + for snap in closest_snaps: + if snap["object"] == closest_obj: + snap["is_closest_to_camera"] = True + + return closest_snaps + @classmethod def calculate_snap_threshold(cls, view_distance): snap_threshold = view_distance / 100 @@ -547,3 +883,273 @@ def calculate_snap_threshold(cls, view_distance): if lens < 50: snap_threshold *= value return snap_threshold + + @classmethod + def create_snap_obj(cls, obj): + if obj.data is None or not isinstance(obj.data, bpy.types.Mesh): + return None + for i, snap_obj in enumerate(cls.snap_objs): + if obj.name == snap_obj.obj.name: + # Handle objects modified while a modal operator is active. + # Example: adding a door or window alters the wall geometry. + if len(obj.data.vertices) != len(snap_obj.verts_3d): + cls.snap_objs.pop(i) + snap_obj = SnapObj(obj) + cls.snap_objs.append(snap_obj) + for v1, v2 in zip(obj.data.vertices, snap_obj.verts_3d): + if (obj.matrix_world @ v1.co) != v2: + cls.snap_objs.pop(i) + snap_obj = SnapObj(obj) + cls.snap_objs.append(snap_obj) + return snap_obj + snap_obj = SnapObj(obj) + cls.snap_objs.append(snap_obj) + return snap_obj + + @classmethod + def clear_snap_objs(cls): + TreeNode.__clear_all__() + SnapObj.__clear_all__() + cls.snap_objs.clear() + + +class TreeNode: + all = [] + + def __init__(self, box: tuple): + self.__class__.all.append(self) + self.box = box + self.child_a = None + self.child_b = None + self.edges = [] + + def __clear_all__(): + for instance in TreeNode.all: + del instance + TreeNode.all.clear() + + +class SnapObj: + max_depth = 9 + all = [] + + def __init__(self, obj: bpy.types.Object): + self.__class__.all.append(self) + self.obj = obj + self.root = self._create_root_node() + self.root.edges = [e.index for e in obj.data.edges] + self.split_box(self.root, 0) + self.verts_3d = [obj.matrix_world @ v.co for v in obj.data.vertices] + self.snap_points = [] + + def __clear_all__(): + for instance in SnapObj.all: + del instance + SnapObj.all.clear() + + def _create_root_node(self) -> TreeNode: + bbox = tool.Blender.get_object_bounding_box(self.obj) + min_point = self.obj.matrix_world @ bbox["min_point"] + max_point = self.obj.matrix_world @ bbox["max_point"] + new_bbox = self.expand_bounding_box((min_point, max_point)) + return TreeNode(new_bbox) + + def divide_bounding_box_along_longest_axis( + self, min_pt: Vector, max_pt: Vector + ) -> Union[tuple[Vector, Vector], tuple[Vector, Vector]]: + """ + Divide a bounding box into two equal parts along the axis with the longest dimension. + + Args: + min_pt: The minimum point of the bounding box. + max_pt: The maximum point of the bounding box. + + Returns: + list: A list of two tuples, each containing the minimum and maximum points of the divided boxes. + """ + + # Calculate the dimensions of the box + dx = max_pt.x - min_pt.x + dy = max_pt.y - min_pt.y + dz = max_pt.z - min_pt.z + + # Determine the axis with the longest dimension + if dx >= dy and dx >= dz: + # Divide along the x-axis + mid_x = min_pt.x + dx / 2 + box1 = (min_pt, Vector((mid_x, max_pt.y, max_pt.z))) + box2 = (Vector((mid_x, min_pt.y, min_pt.z)), max_pt) + elif dy >= dx and dy >= dz: + # Divide along the y-axis + mid_y = min_pt.y + dy / 2 + box1 = (min_pt, Vector((max_pt.x, mid_y, max_pt.z))) + box2 = (Vector((min_pt.x, mid_y, min_pt.z)), max_pt) + else: + # Divide along the z-axis + mid_z = min_pt.z + dz / 2 + box1 = (min_pt, Vector((max_pt.x, max_pt.y, mid_z))) + box2 = (Vector((min_pt.x, min_pt.y, mid_z)), max_pt) + + return [box1, box2] + + def expand_bounding_box(self, box: tuple[Vector, Vector], offset: float = 0.1) -> tuple[Vector, Vector]: + """ + Expand a 3D bounding box by a given offset. + + Args: + min_pt: The minimum point of the bounding box. + max_pt: The maximum point of the bounding box. + offset: The offset to expand the bounding box by. + + Returns: + tuple: A tuple containing the new minimum and maximum points of the expanded bounding box. + """ + + min_pt, max_pt = box + # Calculate the new minimum and maximum points + new_min_pt = Vector((min_pt.x - offset, min_pt.y - offset, min_pt.z - offset)) + new_max_pt = Vector((max_pt.x + offset, max_pt.y + offset, max_pt.z + offset)) + + return new_min_pt, new_max_pt + + def split_box(self, parent: TreeNode, depth: int): + """ + Splits the bounding box creating two child nodes to compose a BVH Tree recursively. + + Args: + parent: the TreeNode instance that represents the parent node of a BVH Tree. + depth: the depth of the BVH Tree no be used in recursion. + """ + if depth > self.max_depth: + return + box_a, box_b = self.divide_bounding_box_along_longest_axis(parent.box[0], parent.box[1]) + parent.child_a = TreeNode(box_a) + parent.child_b = TreeNode(box_b) + edges_a = [] + edges_b = [] + for e in parent.edges: + verts_idx = [v for v in self.obj.data.edges[e].vertices] + verts_coords = [] + for idx in verts_idx: + if idx < len(self.obj.data.vertices): + verts_coords.append(self.obj.matrix_world @ self.obj.data.vertices[idx].co) + if self.line_intersects_box(verts_coords[0], verts_coords[1], parent.child_a.box): + edges_a.append(e) + if self.line_intersects_box(verts_coords[0], verts_coords[1], parent.child_b.box): + edges_b.append(e) + parent.child_a.edges = edges_a + parent.child_b.edges = edges_b + self.split_box(parent.child_a, depth + 1) + self.split_box(parent.child_b, depth + 1) + + def raycast_box( + self, context: bpy.types.Context, event: bpy.types.Event, node: TreeNode, rays: tuple[Vector, Vector] + ) -> bool: + """ + Raycast bounding box. + + Args: + context: Blender context. + event: Blender event. + node: a TreeNode instance. + rays: tuple containing ray origin and ray direction + + Returns: + True if hits the box or False otherwise. + """ + box = node.box + min_v = box[0] + max_v = box[1] + t_min = 0.0 + t_max = float("inf") + ray_origin, ray_dir = rays + inv_dir = Vector((1.0 / r if r != 0.0 else 1e32) for r in (ray_dir.x, ray_dir.y, ray_dir.z)) + # X + tx1 = (min_v.x - ray_origin.x) * inv_dir[0] + tx2 = (max_v.x - ray_origin.x) * inv_dir[0] + tmin = min(tx1, tx2) + tmax = max(tx1, tx2) + # Y + ty1 = (min_v.y - ray_origin.y) * inv_dir[1] + ty2 = (max_v.y - ray_origin.y) * inv_dir[1] + tmin = max(tmin, min(ty1, ty2)) + tmax = min(tmax, max(ty1, ty2)) + # Z + tz1 = (min_v.z - ray_origin.z) * inv_dir[2] + tz2 = (max_v.z - ray_origin.z) * inv_dir[2] + tmin = max(tmin, min(tz1, tz2)) + tmax = min(tmax, max(tz1, tz2)) + return (tmax >= max(tmin, t_min)) and (tmin <= t_max) + + def line_intersects_box(self, v1: mathutils.Vector, v2: mathutils.Vector, box: tuple) -> bool: + """ + Check if a line segment intersects an axis-aligned bounding box (AABB). + + Args: + v1: The first endpoint of the line segment as a mathutils.Vector. + v2: The second endpoint of the line segment as a mathutils.Vector. + box: A tuple containing the minimum and maximum points of the AABB, where each point is a mathutils.Vector. + + Returns: + bool: True if the segment [v1, v2] intersects the AABB; otherwise, False. + """ + bmin, bmax = box + dir = v2 - v1 + tmin = 0.0 + tmax = 1.0 + + for i in range(3): + if abs(dir[i]) < 1e-12: + # Line is parallel to slab. If origin not within slab -> no hit. + if v1[i] < bmin[i] or v1[i] > bmax[i]: + return False + else: + ood = 1.0 / dir[i] + t1 = (bmin[i] - v1[i]) * ood + t2 = (bmax[i] - v1[i]) * ood + if t1 > t2: + t1, t2 = t2, t1 + if t1 > tmin: + tmin = t1 + if t2 < tmax: + tmax = t2 + if tmin > tmax: + return False + + # If any overlap in [0,1] exists, there's intersection + return (tmax >= 0.0) and (tmin <= 1.0) + + def raycast_boxes( + self, + context: bpy.types.Context, + event: bpy.Types.Event, + node: TreeNode, + intersected: Union[TreeNode] = [], + rays: tuple[Vector, Vector] = (), + ) -> Union[TreeNode]: + """ + Raycast bounding box subdivisions recursively. + + Args: + context: Blender context. + event: Blender event. + node: a TreeNode instance. + intersected: list of intersected boxes to use in recursion. + rays: tuple containing ray origin and ray direction + + Returns: + tuple: a list of TreeNode instances that represent the subdivided boxes hit by the ray cast. + """ + if not node.child_a: + intersected.append(node) + return intersected + + intersects_a = self.raycast_box(context, event, node.child_a, rays) + intersects_b = self.raycast_box(context, event, node.child_b, rays) + if intersects_a: + intersected = self.raycast_boxes(context, event, node.child_a, intersected, rays) + + if intersects_b: + intersected = self.raycast_boxes(context, event, node.child_b, intersected, rays) + + return intersected diff --git a/src/bonsai/bonsai/tool/resource.py b/src/bonsai/bonsai/tool/resource.py index 425dce1a76a..c64b7b503bf 100644 --- a/src/bonsai/bonsai/tool/resource.py +++ b/src/bonsai/bonsai/tool/resource.py @@ -19,25 +19,31 @@ # ############################################################################ # from __future__ import annotations -import bpy -import bonsai.core.tool -import bonsai.tool as tool -import bonsai.bim.helper + import json import time -import isodate from datetime import datetime +from typing import TYPE_CHECKING, Any, Literal, Union + +import bpy import ifcopenshell.api.pset import ifcopenshell.api.resource -import ifcopenshell.util.date as ifcdateutils +import ifcopenshell.util.constraint import ifcopenshell.util.cost +import ifcopenshell.util.date as ifcdateutils import ifcopenshell.util.resource -import ifcopenshell.util.constraint -from typing import Any, Union, TYPE_CHECKING, Literal +import isodate + +import bonsai.bim.helper +import bonsai.core.tool +import bonsai.tool as tool if TYPE_CHECKING: + from bonsai.bim.module.resource.prop import ( + BIMResourceProductivity, + BIMResourceProperties, + ) from bonsai.bim.prop import Attribute - from bonsai.bim.module.resource.prop import BIMResourceProperties, BIMResourceProductivity class Resource(bonsai.core.tool.Resource): diff --git a/src/bonsai/bonsai/tool/root.py b/src/bonsai/bonsai/tool/root.py index 42bd558bd17..8880a168fed 100644 --- a/src/bonsai/bonsai/tool/root.py +++ b/src/bonsai/bonsai/tool/root.py @@ -17,23 +17,25 @@ # along with Bonsai. If not, see . from __future__ import annotations + +from typing import TYPE_CHECKING, Any, Literal, Optional, Union + import bpy import ifcopenshell -import ifcopenshell.api import ifcopenshell.api.feature import ifcopenshell.api.geometry import ifcopenshell.api.root import ifcopenshell.api.style -import ifcopenshell.util.representation import ifcopenshell.util.element import ifcopenshell.util.placement -import bonsai.core.tool +import ifcopenshell.util.representation + import bonsai.core.aggregate import bonsai.core.geometry +import bonsai.core.tool import bonsai.tool as tool -from typing import Union, Optional, Any, Literal, TYPE_CHECKING -from bonsai.bim.module.spatial.decorator import GridDecorator from bonsai.bim.module.geometry.decorator import ItemDecorator +from bonsai.bim.module.spatial.decorator import GridDecorator if TYPE_CHECKING: from bonsai.bim.module.root.prop import BIMRootProperties @@ -91,38 +93,16 @@ def exclude_callback(attribute: ifcopenshell.entity_instance) -> bool: elif dest.is_a("IfcTypeProduct"): if not source.RepresentationMaps: return copied_entities - - # Copy representation maps while preserving mapped representation structures - new_maps = [] - for i, rep_map in enumerate(source.RepresentationMaps): - source_rep = rep_map.MappedRepresentation - - # Copy the map itself - new_map = ifcopenshell.util.element.copy(tool.Ifc.get(), rep_map) - - # Handle the mapped representation - preserve mapping structure if present - if ( - source_rep.RepresentationType == "MappedRepresentation" - and len(source_rep.Items) == 1 - and source_rep.Items[0].is_a("IfcMappedItem") - ): - # This is a mapped representation - preserve the structure - new_rep = ifcopenshell.util.element.copy(tool.Ifc.get(), source_rep) - new_rep.Items = [ifcopenshell.util.element.copy(tool.Ifc.get(), item) for item in source_rep.Items] - new_map.MappedRepresentation = new_rep - else: - # Not a mapped representation - use copy_deep as before - new_map.MappedRepresentation = ifcopenshell.util.element.copy_deep( - tool.Ifc.get(), - source_rep, - exclude=["IfcGeometricRepresentationContext"], - exclude_callback=exclude_callback, - copied_entities=copied_entities, - ) - - new_maps.append(new_map) - - dest.RepresentationMaps = new_maps + dest.RepresentationMaps = [ + ifcopenshell.util.element.copy_deep( + tool.Ifc.get(), + m, + exclude=["IfcGeometricRepresentationContext"], + exclude_callback=exclude_callback, + copied_entities=copied_entities, + ) + for m in source.RepresentationMaps + ] return copied_entities @classmethod diff --git a/src/bonsai/bonsai/tool/search.py b/src/bonsai/bonsai/tool/search.py index a0e2e17456a..356addee3a5 100644 --- a/src/bonsai/bonsai/tool/search.py +++ b/src/bonsai/bonsai/tool/search.py @@ -17,20 +17,23 @@ # along with Bonsai. If not, see . from __future__ import annotations -import bpy + import json -import lark -import bonsai.tool as tool -import bonsai.core.tool +from itertools import cycle +from typing import TYPE_CHECKING, Any, Literal, Union + +import bpy import ifcopenshell.guid import ifcopenshell.util.selector -from itertools import cycle +import lark + +import bonsai.core.tool +import bonsai.tool as tool from bonsai.bim.prop import BIMFacet -from typing import Union, Literal, TYPE_CHECKING if TYPE_CHECKING: - from bonsai.bim.prop import BIMFilterGroup from bonsai.bim.module.search.prop import BIMSearchProperties + from bonsai.bim.prop import BIMFilterGroup class Search(bonsai.core.tool.Search): @@ -48,7 +51,9 @@ def get_group_data(cls, group: ifcopenshell.entity_instance) -> dict: @classmethod def import_filter_structure( - cls, filter_structure: list, filter_groups: bpy.types.bpy_prop_collection_idprop[BIMFilterGroup] + cls, + filter_structure: list[list[dict[str, Any]]], + filter_groups: bpy.types.bpy_prop_collection_idprop[BIMFilterGroup], ) -> None: filter_groups.clear() @@ -132,10 +137,7 @@ def _export_single_filter(cls, ifc_filter: BIMFacet) -> str: else: value = ifc_filter.value - if ( - preferences.chain_filter_with_set_operations - or preferences.default_filter_with_set_operations_for_globalid_and_class - ): + if preferences.chain_filter_with_set_operations: value = value.lstrip("!") if ifc_filter.filter_mode == "SUBTRACT": value = f"!{value}" @@ -144,10 +146,7 @@ def _export_single_filter(cls, ifc_filter: BIMFacet) -> str: elif ifc_filter.type == "entity": value = ifc_filter.value - if ( - preferences.chain_filter_with_set_operations - or preferences.default_filter_with_set_operations_for_globalid_and_class - ): + if preferences.chain_filter_with_set_operations: value = value.lstrip("!") if ifc_filter.filter_mode == "SUBTRACT": value = f"!{value}" @@ -191,7 +190,9 @@ def _export_single_filter(cls, ifc_filter: BIMFacet) -> str: return "" @classmethod - def execute_filter_groups(cls, filter_groups: bpy.types.bpy_prop_collection_idprop[BIMFilterGroup]) -> set: + def execute_filter_groups( + cls, filter_groups: bpy.types.bpy_prop_collection_idprop[BIMFilterGroup] + ) -> set[ifcopenshell.entity_instance]: """ Execute filter groups with simplified chaining support. Within a single group chain, all filters chain sequentially with ADD/SUBTRACT/FILTER modes. @@ -199,10 +200,10 @@ def execute_filter_groups(cls, filter_groups: bpy.types.bpy_prop_collection_idpr """ preferences = tool.Blender.get_addon_preferences() - all_group_results = [] + all_group_results: list[set[ifcopenshell.entity_instance]] = [] - for group_idx, filter_group in enumerate(filter_groups): - group_results = set() + for filter_group in filter_groups: + group_results: set[ifcopenshell.entity_instance] = set() for filter_index, ifc_filter in enumerate(filter_group.filters): if not ifc_filter.value: @@ -215,19 +216,10 @@ def execute_filter_groups(cls, filter_groups: bpy.types.bpy_prop_collection_idpr if filter_index == 0: mode = "ADD" else: - if ifc_filter.type in ["entity", "instance"]: - if ( - preferences.chain_filter_with_set_operations - or preferences.default_filter_with_set_operations_for_globalid_and_class - ): - mode = ifc_filter.filter_mode - else: - mode = "FILTER" if group_results else "ADD" + if preferences.chain_filter_with_set_operations: + mode = ifc_filter.filter_mode else: - if preferences.chain_filter_with_set_operations: - mode = ifc_filter.filter_mode - else: - mode = "FILTER" if group_results else "ADD" + mode = "FILTER" if group_results else "ADD" if mode == "ADD": results = ifcopenshell.util.selector.filter_elements(tool.Ifc.get(), query) @@ -257,7 +249,7 @@ def execute_filter_groups(cls, filter_groups: bpy.types.bpy_prop_collection_idpr if group_results: all_group_results.append(group_results) - final_results = set() + final_results: set[ifcopenshell.entity_instance] = set() for group_results in all_group_results: final_results.update(group_results) @@ -274,9 +266,9 @@ def execute_filter_groups_from_json( """ filter_structure = data.get("filter_structure", []) - all_group_results = [] + all_group_results: list[set[ifcopenshell.entity_instance]] = [] for group_data in filter_structure: - group_results = set() + group_results: set[ifcopenshell.entity_instance] = set() for filter_data in group_data: filter_mode = filter_data.get("filter_mode", "ADD") @@ -344,7 +336,7 @@ def execute_filter_groups_from_json( if group_results: all_group_results.append(group_results) - final_results = set() + final_results: set[ifcopenshell.entity_instance] = set() for group_results in all_group_results: final_results.update(group_results) diff --git a/src/bonsai/bonsai/tool/sequence.py b/src/bonsai/bonsai/tool/sequence.py index a2a2cb9668e..2afed8741a4 100644 --- a/src/bonsai/bonsai/tool/sequence.py +++ b/src/bonsai/bonsai/tool/sequence.py @@ -17,35 +17,32 @@ # along with Bonsai. If not, see . from __future__ import annotations -import os + +import json import re +from collections.abc import Iterable +from datetime import datetime +from datetime import time as datetime_time +from typing import TYPE_CHECKING, Any, Literal, Optional, Union + import bpy -import json -import base64 -import ifcopenshell.api.sequence -import ifcopenshell.util.element -import pystache -import mathutils -import webbrowser -import isodate import ifcopenshell import ifcopenshell.api.group -import ifcopenshell.ifcopenshell_wrapper as W +import ifcopenshell.api.sequence import ifcopenshell.util.date +import ifcopenshell.util.element import ifcopenshell.util.selector import ifcopenshell.util.sequence -import bonsai.core.tool -import bonsai.tool as tool -import bonsai.bim.helper +import isodate +import mathutils from dateutil import parser -from datetime import datetime -from datetime import time as datetime_time -from typing import Optional, Any, Union, Literal, TYPE_CHECKING -from collections.abc import Iterable from mathutils import Color +import bonsai.bim.helper +import bonsai.core.tool +import bonsai.tool as tool + if TYPE_CHECKING: - from bonsai.bim.prop import Attribute from bonsai.bim.module.sequence.prop import ( BIMAnimationProperties, BIMStatusProperties, @@ -54,6 +51,7 @@ BIMWorkPlanProperties, BIMWorkScheduleProperties, ) + from bonsai.bim.prop import Attribute class Sequence(bonsai.core.tool.Sequence): diff --git a/src/bonsai/bonsai/tool/snap.py b/src/bonsai/bonsai/tool/snap.py index 04ec6c538d8..5755c02ba76 100644 --- a/src/bonsai/bonsai/tool/snap.py +++ b/src/bonsai/bonsai/tool/snap.py @@ -17,20 +17,20 @@ # along with Bonsai. If not, see . from __future__ import annotations -import bpy + +import math +from typing import TYPE_CHECKING, Any, Union + import bmesh -import ifcopenshell +import bpy import ifcopenshell.util.unit +from mathutils import Matrix, Vector + import bonsai.core.tool import bonsai.tool as tool from bonsai.bim.module.drawing.data import DecoratorData from bonsai.bim.module.drawing.decoration import CutDecorator from bonsai.bim.module.model.decorator import PolylineDecorator -import math -import mathutils -from mathutils import Matrix, Vector -from lark import Lark, Transformer -from typing import Union, Any, TYPE_CHECKING if TYPE_CHECKING: from bonsai.bim.prop import BIMSnapGroups, BIMSnapProperties @@ -111,6 +111,15 @@ def get_increment_snap_value(cls, context: bpy.types.Context) -> Union[float, No return increment + @classmethod + def get_angle_snap_value(cls, context: bpy.types.Context) -> float: + """Get the angle snap increment from Blender's tool settings. + + :param context: Blender context + :return: Angle snap increment in degrees + """ + return math.degrees(context.scene.tool_settings.snap_angle_increment_3d) + @classmethod def get_snap_points_on_raycasted_face(cls, context, event, obj, face_index): matrix = obj.matrix_world.copy() @@ -379,57 +388,36 @@ def select_plane_method(): # Objects objs_to_raycast = tool.Raycast.filter_objects_to_raycast(context, event, objs_2d_bbox) - # Wireframes - # For wireframe we have to get all the objects so we can further calculate edge intersection - for snap_obj in objs_to_raycast: - if snap_obj.type in {"EMPTY", "CURVE"} or (snap_obj.type == "MESH" and len(snap_obj.data.polygons) == 0): - snap_points = tool.Raycast.ray_cast_by_proximity(context, event, snap_obj) - if snap_points: - for point in snap_points: - point["group"] = "Wireframe" - detected_snaps.append(point) - - if (space.shading.type == "SOLID" and space.shading.show_xray) or ( + closest_snaps = tool.Raycast.ray_cast_and_get_closest_to_camera_snaps(context, event, objs_to_raycast) + detected_snaps.extend(closest_snaps) + + xray_mode = (space.shading.type == "SOLID" and space.shading.show_xray) or ( space.shading.type == "WIREFRAME" and space.shading.show_xray_wireframe - ): - results = [] - for obj in objs_to_raycast: - results.append(tool.Raycast.cast_rays_to_single_object(context, event, obj)) - else: - results = [] - results.append(tool.Raycast.cast_rays_and_get_best_object(context, event, objs_to_raycast)) - - for result in results: - snap_obj = result[0] - hit = result[1] - face_index = result[2] - if hit is not None: - # Wireframes - if snap_obj.type in {"EMPTY", "CURVE"} or ( - snap_obj.type == "MESH" and len(snap_obj.data.polygons) == 0 - ): - continue - # Meshes - else: - # Add face snap - snap_point = { - "point": hit, - "type": "Face", - "group": "Object", - "object": snap_obj, - "face_index": face_index, - "distance": 9, # High value so it has low priority - } - detected_snaps.append(snap_point) - - # Add vertex and edge snap - snap_points = tool.Raycast.ray_cast_by_proximity( - context, event, snap_obj, snap_obj.data.polygons[face_index] - ) - if snap_points: - for point in snap_points: - point["group"] = "Object" - detected_snaps.append(point) + ) + + for snap_obj in objs_to_raycast: + for snap in closest_snaps: + if snap_obj.obj == snap["object"]: + if xray_mode: + if "face_index" in snap and snap["face_index"] is not None: + snap_points = tool.Raycast.ray_cast_by_proximity_2d(context, event, snap_obj) + for point in snap_points: + point["group"] = "Object" + detected_snaps.append(point) + else: + # If it is a solid object that is closest to camera it ignores all the rest + if ( + "is_closest_to_camera" in snap + and snap["is_closest_to_camera"] + and snap["group"] == "Object" + ): + closest_snap = [snap] # discards objects that aren't the closest + if "face_index" in snap and snap["face_index"] is not None: + snap_points = tool.Raycast.ray_cast_by_proximity_2d(context, event, snap_obj) + for point in snap_points: + point["group"] = "Object" + closest_snap.append(point) + detected_snaps = closest_snap # snap to cut geometry (e.g. in plan view) if CutDecorator.installed: @@ -553,7 +541,11 @@ def select_snapping_points(cls, context, event, tool_state, detected_snaps): def filter_snapping_points_by_type(snapping_points): options = ["Plane", "Axis"] props = tool.Snap.get_snap_props() - for prop in props.__annotations__.keys(): + try: + annotations = props.__annotations__ + except AttributeError: + annotations = type(props).__annotations__ + for prop in annotations.keys(): if getattr(props, prop): options.append(props.rna_type.properties[prop].name) @@ -563,7 +555,11 @@ def filter_snapping_points_by_type(snapping_points): def filter_snapping_points_by_group(detected_snaps): options = ["Wireframe", "Axis", "Plane"] props = tool.Snap.get_snap_groups() - for prop in props.__annotations__.keys(): + try: + annotations = props.__annotations__ + except AttributeError: + annotations = type(props).__annotations__ + for prop in annotations.keys(): if getattr(props, prop): options.append(props.rna_type.properties[prop].name) filtered_groups = [group for group in detected_snaps if group["group"] in options] diff --git a/src/bonsai/bonsai/tool/spatial.py b/src/bonsai/bonsai/tool/spatial.py index 6ca29343e9e..11a41672bc0 100644 --- a/src/bonsai/bonsai/tool/spatial.py +++ b/src/bonsai/bonsai/tool/spatial.py @@ -17,43 +17,45 @@ # along with Bonsai. If not, see . from __future__ import annotations -import bpy + +import json +from collections import defaultdict +from collections.abc import Generator, Iterable +from typing import TYPE_CHECKING, Any, Literal, Optional, Union + import bmesh -import shapely -import shapely.ops +import bpy import ifcopenshell import ifcopenshell.api.attribute +import ifcopenshell.api.geometry import ifcopenshell.api.type import ifcopenshell.geom +import ifcopenshell.util.classification import ifcopenshell.util.element import ifcopenshell.util.placement import ifcopenshell.util.representation -import ifcopenshell.util.classification import ifcopenshell.util.shape_builder import ifcopenshell.util.type import ifcopenshell.util.unit -import bonsai.core.type -import bonsai.core.tool +import numpy as np +import shapely +import shapely.ops +from mathutils import Matrix, Vector +from natsort import natsorted +from shapely import Polygon + +import bonsai.core.geometry import bonsai.core.root import bonsai.core.spatial -import bonsai.core.geometry -import bonsai.core.unit +import bonsai.core.tool +import bonsai.core.type import bonsai.tool as tool -import json -import numpy as np -from math import pi -from mathutils import Vector, Matrix -from shapely import Polygon -from typing import Optional, Union, Literal, Any, TYPE_CHECKING -from collections.abc import Generator, Iterable -from collections import defaultdict -from natsort import natsorted if TYPE_CHECKING: from bonsai.bim.module.spatial.prop import ( BIMGridProperties, - BIMSpatialDecompositionProperties, BIMObjectSpatialProperties, + BIMSpatialDecompositionProperties, ) @@ -71,9 +73,25 @@ def get_grid_props(cls) -> BIMGridProperties: return bpy.context.scene.BIMGridProperties @classmethod - def can_contain(cls, container: ifcopenshell.entity_instance, element_obj: Union[bpy.types.Object, None]) -> bool: - if not (element := tool.Ifc.get_entity(element_obj)): - return False + def get_decomposition(cls, element: ifcopenshell.entity_instance) -> list(ifcopenshell.entity_instance): + return ifcopenshell.util.element.get_decomposition(element) + + @classmethod + def get_root_element(cls, element: ifcopenshell.entity_instance) -> ifcopenshell.entity_instance: + while True: + if parent := ( + ifcopenshell.util.element.get_aggregate(element) + or ifcopenshell.util.element.get_nest(element) + or ifcopenshell.util.element.get_filled_void(element) + or ifcopenshell.util.element.get_voided_element(element) + ): + element = parent + else: + break + return element + + @classmethod + def can_contain(cls, container: ifcopenshell.entity_instance, element: ifcopenshell.entity_instance) -> bool: if tool.Ifc.get_schema() == "IFC2X3": if not container.is_a("IfcSpatialStructureElement"): return False @@ -144,10 +162,10 @@ def run_root_copy_class(cls, obj: bpy.types.Object) -> ifcopenshell.entity_insta @classmethod def run_spatial_assign_container( - cls, container: ifcopenshell.entity_instance, element_obj: bpy.types.Object + cls, container: ifcopenshell.entity_instance, objs: list[bpy.types.Object] ) -> Union[ifcopenshell.entity_instance, None]: return bonsai.core.spatial.assign_container( - tool.Ifc, tool.Collector, tool.Spatial, container=container, element_obj=element_obj + tool.Ifc, tool.Collector, tool.Spatial, container=container, objs=objs ) @classmethod @@ -973,114 +991,104 @@ def get_buffered_poly_from_linear_ring(cls, linear_ring: shapely.LinearRing) -> return poly @classmethod - def get_bmesh_from_polygon(cls, poly: Polygon, h: float, polygon_is_si: bool = False) -> bmesh.types.BMesh: - """ - :param h: Height, in meters. - :param polygon_is_si: Should be True if `poly` is defined in meters. - """ - mat = Matrix() - bm = bmesh.new() - bm.verts.index_update() - bm.edges.index_update() - - mat_invert = mat.inverted() - si_conversion = 1.0 if polygon_is_si else ifcopenshell.util.unit.calculate_unit_scale(tool.Ifc.get()) - new_verts = [ - # bm.verts.new(mat_invert @ (Vector([v[0], v[1], 0]) * si_conversion)) for v in poly.exterior.coords[0:-1] - bm.verts.new(mat_invert @ (Vector([v[0], v[1], 0]) * si_conversion)) - for v in shapely.get_exterior_ring(poly).coords[0:-1] - ] - [bm.edges.new((new_verts[i], new_verts[i + 1])) for i in range(len(new_verts) - 1)] - bm.edges.new((new_verts[len(new_verts) - 1], new_verts[0])) - - bm.verts.index_update() - bm.edges.index_update() - - bmesh.ops.remove_doubles(bm, verts=bm.verts, dist=1e-5) - bmesh.ops.triangle_fill(bm, edges=bm.edges) - bmesh.ops.dissolve_limit(bm, angle_limit=pi / 180 * 5, verts=bm.verts, edges=bm.edges) - - if h != 0: - extrusion = bmesh.ops.extrude_face_region(bm, geom=bm.faces) - extruded_verts = [g for g in extrusion["geom"] if isinstance(g, bmesh.types.BMVert)] - bmesh.ops.translate(bm, vec=[0.0, 0.0, h], verts=extruded_verts) - - bmesh.ops.recalc_face_normals(bm, faces=bm.faces) - - return bm - - @classmethod - def get_named_obj_from_bmesh(cls, name: str, bmesh: bmesh.types.BMesh) -> bpy.types.Object: - mesh = cls.get_named_mesh_from_bmesh(name, bmesh) - obj = cls.get_named_obj_from_mesh(name, mesh) - return obj - - @classmethod - def get_named_obj_from_mesh(cls, name: str, mesh: bpy.types.Mesh) -> bpy.types.Object: + def create_object(cls, name: str) -> bpy.types.Object: + mesh = bpy.data.meshes.new(name=name) obj = bpy.data.objects.new(name, mesh) return obj @classmethod - def get_named_mesh_from_bmesh(cls, name: str, bmesh: bmesh.types.BMesh) -> bpy.types.Mesh: - mesh = bpy.data.meshes.new(name=name) - bmesh.to_mesh(mesh) - bmesh.free() - return mesh + def set_obj_origin_to_polygon_center(cls, obj: bpy.types.Object, poly: Polygon, polygon_is_si: bool = True) -> None: + unit_scale = ifcopenshell.util.unit.calculate_unit_scale(tool.Ifc.get()) + centroid = poly.centroid + if polygon_is_si: + obj.location = Vector((centroid.x, centroid.y, 0)) + else: + obj.location = Vector((centroid.x * unit_scale, centroid.y * unit_scale, 0)) @classmethod - def get_transformed_mesh_from_local_to_global(cls, mesh: bpy.types.Mesh) -> bpy.types.Mesh: - active_obj = cls.get_active_obj() - mat = active_obj.matrix_world - mesh.transform(mat.inverted()) - mesh.update() - return mesh + def get_2d_vertices_from_polygon( + cls, + poly: Polygon, + obj: bpy.types.Object, + polygon_is_si: bool = True, + ) -> list[list[float]]: + """Convert a world-space shapely polygon to 2D vertices in obj's local space, in IFC file units. + + :param poly: The polygon in world space. + :param obj: The Blender object whose local space is used. + :param polygon_is_si: True if polygon coords are in SI, False if in IFC file units. + :return: List of [x, y] coordinates (not closed). + """ + ifc_file = tool.Ifc.get() + unit_scale = ifcopenshell.util.unit.calculate_unit_scale(ifc_file) + bpy.context.view_layer.update() + mat_inv = obj.matrix_world.inverted() + coords_2d = [] + for v in shapely.get_exterior_ring(poly).coords[:-1]: + world_si = Vector((v[0], v[1], 0)) + if not polygon_is_si: + world_si = world_si * unit_scale + local_si = mat_inv @ world_si + coords_2d.append([local_si.x / unit_scale, local_si.y / unit_scale]) + return coords_2d + + @classmethod + def set_extrusion_representation_from_polygon( + cls, + obj: bpy.types.Object, + element: ifcopenshell.entity_instance, + poly: Polygon, + depth_ifc: float, + polygon_is_si: bool = True, + ) -> None: + """Create or replace the IFC body representation from a polygon extrusion. - @classmethod - def edit_active_space_obj_from_mesh(cls, mesh: bpy.types.Mesh) -> None: - active_obj = bpy.context.active_object - old_mesh = active_obj.data - old_mesh_name = old_mesh.name - assert active_obj and isinstance(old_mesh, bpy.types.Mesh) - tool.Geometry.get_mesh_props(mesh).ifc_definition_id = tool.Geometry.get_mesh_props(old_mesh).ifc_definition_id - tool.Geometry.change_object_data(active_obj, mesh, is_global=True) - tool.Ifc.edit(active_obj) - tool.Blender.remove_data_block(old_mesh) - # Rename after old mesh is removed to avoid .001 suffix. - mesh.name = old_mesh_name + :param obj: The Blender object. + :param element: The IFC product entity. + :param poly: The polygon in world space. + :param depth_ifc: The extrusion depth in IFC file units. + :param polygon_is_si: True if polygon coords are in SI, False if in IFC file units. + """ + ifc_file = tool.Ifc.get() + builder = ifcopenshell.util.shape_builder.ShapeBuilder(ifc_file) - @classmethod - def set_obj_origin_to_bboxcenter(cls, obj: bpy.types.Object) -> None: - mat = obj.matrix_world - inverted = mat.inverted() - local_bbox_center = 0.125 * sum((Vector(b) for b in obj.bound_box), Vector()) - global_bbox_center = mat @ local_bbox_center + coords_2d = cls.get_2d_vertices_from_polygon(poly, obj, polygon_is_si) - oldLoc = obj.location - newLoc = global_bbox_center - diff = newLoc - oldLoc - for vert in obj.data.vertices: - aux_vector = mat @ vert.co - aux_vector = aux_vector - diff - vert.co = inverted @ aux_vector - obj.location = newLoc + curve = builder.polyline(coords_2d, closed=True) + item = builder.extrude(curve, magnitude=depth_ifc) + + old_body = ifcopenshell.util.representation.get_representation(element, "Model", "Body", "MODEL_VIEW") + if old_body: + context = old_body.ContextOfItems + ifcopenshell.api.geometry.unassign_representation(ifc_file, product=element, representation=old_body) + ifcopenshell.api.geometry.remove_representation(ifc_file, representation=old_body) + else: + context = ifcopenshell.util.representation.get_context(ifc_file, "Model", "Body", "MODEL_VIEW") + + new_body = builder.get_representation(context, item) + ifcopenshell.api.geometry.assign_representation(ifc_file, product=element, representation=new_body) + bonsai.core.geometry.switch_representation( + tool.Ifc, + tool.Geometry, + obj=obj, + representation=new_body, + ) @classmethod - def set_obj_origin_to_bboxcenter_and_zero_elevation(cls, obj: bpy.types.Object) -> None: - mat = obj.matrix_world - inverted = mat.inverted() - local_bbox_center = 0.125 * sum((Vector(b) for b in obj.bound_box), Vector()) - global_bbox_center = mat @ local_bbox_center - global_obj_origin = global_bbox_center - global_obj_origin.z = 0 + def set_space_representation_from_polygon( + cls, + obj: bpy.types.Object, + element: ifcopenshell.entity_instance, + poly: Polygon, + h: float, + polygon_is_si: bool = True, + ) -> None: + """Create or replace the IFC body representation of a space from a polygon. - oldLoc = obj.location - newLoc = global_obj_origin - diff = newLoc - oldLoc - for vert in obj.data.vertices: - aux_vector = mat @ vert.co - aux_vector = aux_vector - diff - vert.co = inverted @ aux_vector - obj.location = newLoc + :param h: The height in SI (meters). + """ + unit_scale = ifcopenshell.util.unit.calculate_unit_scale(tool.Ifc.get()) + cls.set_extrusion_representation_from_polygon(obj, element, poly, h / unit_scale, polygon_is_si) @classmethod def set_obj_origin_to_cursor_position_and_zero_elevation(cls, obj: bpy.types.Object) -> None: @@ -1127,64 +1135,53 @@ def translate_obj_to_z_location(cls, obj: bpy.types.Object, z: float) -> None: if z != 0: obj.location = obj.location + Vector((0, 0, z)) - @classmethod - def get_2d_vertices_from_obj(cls, obj: bpy.types.Object) -> list[tuple]: - points = [] - vectors = [v.co for v in obj.data.vertices.values()] - for vector in vectors: - points.append(vector.xy) - - points.append(vectors[0].xy) - return points - - @classmethod - def get_scaled_2d_vertices(cls, points: list[Vector]) -> list[tuple[float, float]]: - model = tool.Ifc.get() - unit_scale = ifcopenshell.util.unit.calculate_unit_scale(model) - _points = [] - for p in points: - _p = list(p) - _p[0] /= unit_scale - _p[1] /= unit_scale - _points.append(_p) - return _points - - @classmethod - def assign_swept_area_outer_curve_from_2d_vertices(cls, obj: bpy.types.Object, vertices: list[Vector]) -> None: - body = cls.get_body_representation(obj) - model = tool.Ifc.get() - extrusion = tool.Model.get_extrusion(body) - area = extrusion.SweptArea - old_area = area.OuterCurve - - builder = ifcopenshell.util.shape_builder.ShapeBuilder(model) - outer_curve = builder.polyline(vertices, closed=True) - - area.OuterCurve = outer_curve - ifcopenshell.util.element.remove_deep2(tool.Ifc.get(), old_area) - - @classmethod - def get_body_representation(cls, obj: bpy.types.Object) -> Union[ifcopenshell.entity_instance, None]: - element = tool.Ifc.get_entity(obj) - return ifcopenshell.util.representation.get_representation(element, "Model", "Body", "MODEL_VIEW") - @classmethod def assign_ifcspace_class_to_obj(cls, obj: bpy.types.Object) -> None: - bpy.ops.bim.assign_class(obj=obj.name, ifc_class="IfcSpace") + bonsai.core.root.assign_class( + tool.Ifc, + tool.Collector, + tool.Root, + obj=obj, + ifc_class="IfcSpace", + should_add_representation=False, + ) @classmethod def assign_type_to_obj(cls, obj: bpy.types.Object) -> None: props = tool.Model.get_model_props() ifc_file = tool.Ifc.get() relating_type_id = props.relating_type_id - relating_type = tool.Ifc.get().by_id(int(relating_type_id)) + relating_type = ifc_file.by_id(int(relating_type_id)) ifc_class = relating_type.is_a() instance_class = ifcopenshell.util.type.get_applicable_entities(ifc_class, ifc_file.schema)[0] - bpy.ops.bim.assign_class(obj=obj.name, ifc_class=instance_class) + bonsai.core.root.assign_class( + tool.Ifc, + tool.Collector, + tool.Root, + obj=obj, + ifc_class=instance_class, + should_add_representation=False, + ) element = tool.Ifc.get_entity(obj) assert element ifcopenshell.api.type.assign_type(ifc_file, related_objects=[element], relating_type=relating_type) + @classmethod + def set_covering_representation_from_polygon( + cls, + obj: bpy.types.Object, + poly: Polygon, + polygon_is_si: bool = True, + ) -> None: + """Create the covering body representation from a polygon, extruded by the type's material layer thickness.""" + element = tool.Ifc.get_entity(obj) + relating_type = ifcopenshell.util.element.get_type(element) + material = ifcopenshell.util.element.get_material(relating_type, should_skip_usage=True) + depth = 0.0 + if material and material.is_a("IfcMaterialLayerSet"): + depth = sum(layer.LayerThickness for layer in material.MaterialLayers) + cls.set_extrusion_representation_from_polygon(obj, element, poly, depth, polygon_is_si) + @classmethod def assign_relating_type_to_element( cls, @@ -1193,16 +1190,7 @@ def assign_relating_type_to_element( element: ifcopenshell.entity_instance, relating_type: ifcopenshell.entity_instance, ) -> None: - bonsai.core.type.assign_type(ifc, type, element=element, type=relating_type) - - @classmethod - def regen_obj_representation(cls, obj: bpy.types.Object, body: ifcopenshell.entity_instance) -> None: - bonsai.core.geometry.switch_representation( - tool.Ifc, - tool.Geometry, - obj=obj, - representation=body, - ) + bonsai.core.type.assign_type(ifc, tool.Model, type, element=element, type=relating_type) @classmethod def set_space_visibility(cls, is_visible: bool) -> None: @@ -1213,18 +1201,18 @@ def set_space_visibility(cls, is_visible: bool) -> None: for element in elements: if obj := tool.Ifc.get_object(element): if obj.hide_viewport is True and is_visible: - obj.hide_set(False) + obj.hide_viewport = False elif obj.hide_viewport is False and not is_visible: - obj.hide_set(True) + obj.hide_viewport = True @classmethod def set_grid_visibility(cls, is_visible: bool) -> None: for element in tool.Ifc.get().by_type("IfcGrid") + tool.Ifc.get().by_type("IfcGridAxis"): if obj := tool.Ifc.get_object(element): if obj.hide_viewport is True and is_visible: - obj.hide_set(False) + obj.hide_viewport = False elif obj.hide_viewport is False and not is_visible: - obj.hide_set(True) + obj.hide_viewport = True @classmethod def toggle_spaces_visibility_wired_and_textured(cls, spaces: list[ifcopenshell.entity_instance]) -> None: diff --git a/src/bonsai/bonsai/tool/structural.py b/src/bonsai/bonsai/tool/structural.py index 3f218e52e99..b011f5df889 100644 --- a/src/bonsai/bonsai/tool/structural.py +++ b/src/bonsai/bonsai/tool/structural.py @@ -17,21 +17,30 @@ # along with Bonsai. If not, see . from __future__ import annotations + +import json +from typing import TYPE_CHECKING, Any, Union + import bpy import ifcopenshell import ifcopenshell.api.context import ifcopenshell.api.structural import ifcopenshell.util.attribute import ifcopenshell.util.representation -import json + import bonsai.bim.helper import bonsai.core.tool import bonsai.tool as tool -from typing import Union, Any, TYPE_CHECKING if TYPE_CHECKING: - from bonsai.bim.module.structural.prop import BIMStructuralProperties, BIMObjectStructuralProperties - from ifcopenshell.api.structural.edit_structural_boundary_condition import AttributeDict + from ifcopenshell.api.structural.edit_structural_boundary_condition import ( + AttributeDict, + ) + + from bonsai.bim.module.structural.prop import ( + BIMObjectStructuralProperties, + BIMStructuralProperties, + ) class Structural(bonsai.core.tool.Structural): diff --git a/src/bonsai/bonsai/tool/style.py b/src/bonsai/bonsai/tool/style.py index e6861b53dc4..83f1751e960 100644 --- a/src/bonsai/bonsai/tool/style.py +++ b/src/bonsai/bonsai/tool/style.py @@ -17,23 +17,29 @@ # along with Bonsai. If not, see . from __future__ import annotations + +from collections.abc import Sequence +from typing import TYPE_CHECKING, Any, Literal, Optional, Union + import bpy -import numpy as np import ifcopenshell import ifcopenshell.api.style import ifcopenshell.util.element import ifcopenshell.util.representation +from mathutils import Color + +import bonsai.bim.helper import bonsai.core.style import bonsai.core.tool import bonsai.tool as tool -import bonsai.bim.helper -from mathutils import Color -from typing import Union, Any, Optional, Literal, TYPE_CHECKING -from collections.abc import Sequence if TYPE_CHECKING: + from bonsai.bim.module.style.prop import ( + BIMStyleProperties, + BIMStylesProperties, + ColourRgb, + ) from bonsai.bim.prop import Attribute - from bonsai.bim.module.style.prop import BIMStylesProperties, BIMStyleProperties, ColourRgb # fmt: off TEXTURE_MAPS_BY_METHODS = { @@ -197,6 +203,11 @@ def get_shading_style_data_from_props(cls) -> dict[str, Any]: available_props = props.bl_rna.properties.keys() for prop_blender, prop_ifc in STYLE_PROPS_MAP.items(): + null_prop_name = f"is_{prop_blender}_null" + if null_prop_name in available_props and getattr(props, null_prop_name): + surface_style_data[prop_ifc] = None + continue + class_prop_name = f"{prop_blender}_class" # get detailed color properties if available diff --git a/src/bonsai/bonsai/tool/surveyor.py b/src/bonsai/bonsai/tool/surveyor.py index 7c203586f29..42fe540c635 100644 --- a/src/bonsai/bonsai/tool/surveyor.py +++ b/src/bonsai/bonsai/tool/surveyor.py @@ -17,14 +17,13 @@ # along with Bonsai. If not, see . import bpy -import ifcopenshell.api import ifcopenshell.util.geolocation import ifcopenshell.util.unit -import bonsai.core.tool -import bonsai.tool as tool import numpy as np import numpy.typing as npt -from mathutils import Matrix + +import bonsai.core.tool +import bonsai.tool as tool class Surveyor(bonsai.core.tool.Surveyor): diff --git a/src/bonsai/bonsai/tool/system.py b/src/bonsai/bonsai/tool/system.py index efaaa802c50..926bceca91d 100644 --- a/src/bonsai/bonsai/tool/system.py +++ b/src/bonsai/bonsai/tool/system.py @@ -17,26 +17,28 @@ # along with Bonsai. If not, see . from __future__ import annotations + +import re +from enum import Enum +from typing import TYPE_CHECKING, Any, Optional, Union + import bpy import ifcopenshell.api.geometry import ifcopenshell.api.system import ifcopenshell.util.element import ifcopenshell.util.system +from mathutils import Matrix, Vector + import bonsai.bim.helper import bonsai.core.geometry import bonsai.core.root import bonsai.core.tool import bonsai.tool as tool from bonsai.bim import import_ifc -import re -from mathutils import Matrix, Vector from bonsai.bim.module.system.data import ObjectSystemData, SystemDecorationData -from enum import Enum -from typing import TYPE_CHECKING, Optional, Any, Union -from natsort import natsorted if TYPE_CHECKING: - from bonsai.bim.module.system.prop import BIMSystemProperties, BIMZoneProperties, BIMZoneProperties + from bonsai.bim.module.system.prop import BIMSystemProperties, BIMZoneProperties class System(bonsai.core.tool.System): @@ -100,6 +102,7 @@ def add_port(mep_element, matrix): @classmethod def create_empty_at_cursor_with_element_orientation(cls, element: ifcopenshell.entity_instance) -> bpy.types.Object: + # Is this necessary anymore? element_obj = tool.Ifc.get_object(element) obj = bpy.data.objects.new("Port", None) obj.matrix_world = element_obj.matrix_world @@ -107,6 +110,26 @@ def create_empty_at_cursor_with_element_orientation(cls, element: ifcopenshell.e bpy.context.scene.collection.objects.link(obj) return obj + @classmethod + def create_port_at_cursor(cls, element: ifcopenshell.entity_instance) -> ifcopenshell.entity_instance: + ifc_file = tool.Ifc.get() + element_obj = tool.Ifc.get_object(element) + + port = ifcopenshell.api.system.add_port(ifc_file, element=element) + port.FlowDirection = "NOTDEFINED" + port.PredefinedType = "USERDEFINED" + + systems = ifcopenshell.util.system.get_element_systems(element) + system = systems[0] if systems else None + port.SystemType = getattr(system, "PredefinedType", None) or "USERDEFINED" + + matrix = element_obj.matrix_world.copy() + matrix.translation = bpy.context.scene.cursor.matrix.translation + + ifcopenshell.api.geometry.edit_object_placement(ifc_file, product=port, matrix=matrix, is_si=True) + + return port + @classmethod def delete_element_objects(cls, elements: list[ifcopenshell.entity_instance]) -> None: for element in elements: @@ -192,11 +215,22 @@ def load_ports(cls, element: ifcopenshell.entity_instance, ports: list[ifcopensh ifc_importer.process_context_filter() ifc_importer.create_generic_elements(set(ports_to_create)) - container = ifcopenshell.util.element.get_container(element) - if container: - collection = tool.Blender.get_object_bim_props(tool.Ifc.get_object(container)).collection - ifc_importer.collections[container.GlobalId] = collection - ifc_importer.place_objects_in_collections() + if element.is_a("IfcTypeProduct"): + target_collection = None + for collection in obj.users_collection: + target_collection = collection + break + + if target_collection: + for port_obj in ifc_importer.added_data.values(): + if isinstance(port_obj, bpy.types.Object): + tool.Collector.link_collection_object_safe(target_collection, port_obj) + else: + container = ifcopenshell.util.element.get_container(element) + if container: + collection = tool.Blender.get_object_bim_props(tool.Ifc.get_object(container)).collection + ifc_importer.collections[container.GlobalId] = collection + ifc_importer.place_objects_in_collections() for port_obj in ifc_importer.added_data.values(): assert isinstance(port_obj, bpy.types.Object) diff --git a/src/bonsai/bonsai/tool/type.py b/src/bonsai/bonsai/tool/type.py index dab53ee14fc..882c4b46180 100644 --- a/src/bonsai/bonsai/tool/type.py +++ b/src/bonsai/bonsai/tool/type.py @@ -17,14 +17,17 @@ # along with Bonsai. If not, see . from __future__ import annotations + +from typing import TYPE_CHECKING, Union + import bpy import ifcopenshell import ifcopenshell.util.element import ifcopenshell.util.representation -import bonsai.core.tool + import bonsai.core.geometry +import bonsai.core.tool import bonsai.tool as tool -from typing import Union, TYPE_CHECKING if TYPE_CHECKING: from bonsai.bim.module.type.prop import BIMTypeProperties @@ -72,14 +75,7 @@ def get_ifc_representation_class(cls, element: ifcopenshell.entity_instance) -> @classmethod def get_model_types(cls) -> list[ifcopenshell.entity_instance]: - ifc_file = tool.Ifc.get() - types = ifc_file.by_type("IfcElementType") - # exclude IfcSpatialElementType - types += ifc_file.by_type("IfcTypeProduct", include_subtypes=False) - if not tool.Ifc.get_schema().startswith("IFC4X3"): - types += ifc_file.by_type("IfcWindowStyle") - types += ifc_file.by_type("IfcDoorStyle") - return types + return tool.Ifc.get().by_type("IfcTypeProduct") @classmethod def get_object_data(cls, obj: bpy.types.Object) -> Union[bpy.types.ID, None]: @@ -138,3 +134,20 @@ def run_geometry_switch_representation( obj=obj, representation=representation, ) + + @classmethod + def record_material_usage_attributes(cls, element: ifcopenshell.entity_instance) -> dict | None: + if (material := ifcopenshell.util.element.get_material(element)) and "Usage" in material.is_a(): + return material.get_info() + + @classmethod + def restore_material_usage_attributes(cls, element: ifcopenshell.entity_instance, usage_attributes: dict) -> None: + if (material := ifcopenshell.util.element.get_material(element)) and material.is_a() == usage_attributes[ + "type" + ]: + if usage_attributes["type"] == "IfcMaterialLayerSetUsage": + for attr in ("LayerSetDirection", "DirectionSense", "OffsetFromReferenceLine", "ReferenceExtent"): + setattr(material, attr, usage_attributes.get(attr)) + elif usage_attributes["type"] == "IfcMaterialProfileSetUsage": + for attr in ("CardinalPoint", "ReferenceExtent"): + setattr(material, attr, usage_attributes.get(attr)) diff --git a/src/bonsai/bonsai/tool/unit.py b/src/bonsai/bonsai/tool/unit.py index c982c435236..4c3e45b794e 100644 --- a/src/bonsai/bonsai/tool/unit.py +++ b/src/bonsai/bonsai/tool/unit.py @@ -17,254 +17,24 @@ # along with Bonsai. If not, see . from __future__ import annotations -import bpy + import json import math +from typing import TYPE_CHECKING, Any, Literal, Union + +import bpy import ifcopenshell +import ifcopenshell.util.unit +from lark import Lark, Transformer + import bonsai.bim.helper import bonsai.core.tool import bonsai.tool as tool -from lark import Lark, Transformer -from typing import Union, Literal, Any, TYPE_CHECKING, assert_never if TYPE_CHECKING: from bonsai.bim.module.unit.prop import BIMUnitProperties -def parse_distance_string(input_string: str, use_project_unit: bool = True) -> tuple[bool, float]: - """ - Parse a distance string with optional unit suffixes and convert to meters. - - This function parses distance inputs with units (e.g., "5m", "10ft", "3.5cm") - and converts them to meters (SI units) for use in IFC models. - - Supports: - - Metric units: mm, cm, dm, m - - Imperial units: ft/feet ('), in/inches (") - - Arithmetic expressions: +, -, *, / - - Fractions for imperial units (e.g., 1/2") - - Formula mode: values starting with "=" - - :param input_string: The string to parse (e.g., "5m", "10ft", "10'6\"", "3.5cm", "12in") - :param use_project_unit: If True, uses project unit scale; if False, uses Blender unit scale - :return: Tuple (is_valid, value_in_meters) where is_valid indicates successful parsing - and value_in_meters is the converted value in meters - - Examples: - >>> parse_distance_string("5m") - (True, 5.0) - >>> parse_distance_string("30cm") - (True, 0.3) - >>> parse_distance_string("10ft") - (True, 3.048) - >>> parse_distance_string("12in") - (True, 0.3048) - >>> parse_distance_string("5'6\"") - (True, 1.6764) - >>> parse_distance_string("invalid") - (False, 0.0) - """ - - grammar_imperial = r""" - start: (FORMULA dim expr) | dim - dim: imperial - - FORMULA: "=" - - imperial: feet_inches | feet_only | inches_only | plain_number - feet_only: NUMBER (FEET_SYM | FEET_TEXT) - inches_only: inch_value (INCH_SYM | INCH_TEXT) - feet_inches: NUMBER (FEET_SYM | FEET_TEXT) DASH? inch_value (INCH_SYM | INCH_TEXT)? - plain_number: NUMBER - - inch_value: NUMBER fraction | fraction | NUMBER - - fraction: NUMBER "/" NUMBER - - expr: (ADD | SUB) dim | (MUL | DIV) NUMBER - - NUMBER: /-?(?:\d+\.?\d*|\.\d+)/ - FEET_SYM: "'" - FEET_TEXT: "ft" - INCH_SYM: "\"" - INCH_TEXT: "in" - DASH: "-" - ADD: "+" - SUB: "-" - MUL: "*" - DIV: "/" - - %ignore " " - """ - - grammar_metric = r""" - start: FORMULA? dim expr? - dim: metric - - FORMULA: "=" - - metric: NUMBER (MM | CM | DM | M | DEG)? - - expr: (ADD | SUB | MUL | DIV) dim - - NUMBER: /-?(?:\d+\.?\d*|\.\d+)/ - MM: "mm" - CM: "cm" - DM: "dm" - M: "m" - DEG: "°" - ADD: "+" - SUB: "-" - MUL: "*" - DIV: "/" - - %ignore " " - """ - - class InputTransform(Transformer): - def NUMBER(self, n): - return float(n) - - def fraction(self, numbers): - return numbers[0] / numbers[1] - - def inch_value(self, args): - # Can be: NUMBER fraction, fraction, or NUMBER - if len(args) == 2: - # NUMBER fraction (e.g., "9 1/64") - return args[0] + args[1] - else: - # Just fraction or just NUMBER - return args[0] - - def plain_number(self, args): - # A plain number in imperial context is assumed to be feet - feet = args[0] - # Convert feet to meters (1 foot = 0.3048 meters) - return feet * 0.3048 - - def feet_only(self, args): - # args[0] is the number of feet, args[1] is the unit token (we can ignore it) - feet = args[0] - # Convert feet to meters (1 foot = 0.3048 meters) - return feet * 0.3048 - - def inches_only(self, args): - # args[0] is the inch_value, args[1] is the unit token - inches = args[0] - # Convert inches to meters (1 inch = 0.0254 meters) - return inches * 0.0254 - - def feet_inches(self, args): - # Extract feet and inches values - feet = args[0] - # Find the inch_value (it's a number, not a token) - inches = None - for arg in args[1:]: - if isinstance(arg, (int, float)): - inches = arg - break - if inches is None: - inches = 0 - # Convert to meters - total_meters = (feet * 0.3048) + (inches * 0.0254) - return total_meters - - def imperial(self, args): - # Just return the value from the sub-rule (feet_only, inches_only, or feet_inches) - return args[0] - - def metric(self, args): - # args[0] is the NUMBER, args[1] if present is the unit - value = args[0] - if len(args) > 1: - unit = str(args[1]) - # Convert to meters based on unit - if unit == "mm": - value = value / 1000.0 - elif unit == "cm": - value = value / 100.0 - elif unit == "dm": - value = value / 10.0 - elif unit == "m": - value = value # already in meters - elif unit == "°": - value = value # degrees, pass through - # If no unit specified, assume it's already in the project's unit system - return value - - def dim(self, args): - return args[0] - - def expr(self, args): - op = args[0] - value = float(args[1]) - if op == "+": - return lambda x: x + value - elif op == "-": - return lambda x: x - value - elif op == "*": - return lambda x: x * value - elif op == "/": - return lambda x: x / value - - def FORMULA(self, args): - return args[0] - - def start(self, args): - i = 0 - if args[0] == "=": - i += 1 - else: - if len(args) > 1: - raise ValueError("Invalid input.") - dimension = args[i] - if len(args) > i + 1: - expression = args[i + 1] - return expression(dimension) - else: - return dimension - - try: - # Determine unit scale - if use_project_unit and tool.Ifc.get(): - unit_scale = ifcopenshell.util.unit.calculate_unit_scale(tool.Ifc.get()) - else: - unit_scale = tool.Blender.get_unit_scale() - - # Try to parse with the project's default grammar first - if bpy.context.scene.unit_settings.system == "IMPERIAL": - primary_parser = Lark(grammar_imperial) - fallback_parser = Lark(grammar_metric) - else: - primary_parser = Lark(grammar_metric) - fallback_parser = Lark(grammar_imperial) - - # Try parsing with primary grammar - parse_tree = None - try: - parse_tree = primary_parser.parse(input_string) - except Exception as e: - # If primary fails, try fallback grammar (allows metric in imperial projects and vice versa) - try: - parse_tree = fallback_parser.parse(input_string) - except Exception as e2: - pass - - if parse_tree is None: - return False, 0.0 - - # Transform the parse tree to get the numeric result - transformer = InputTransform() - result = transformer.transform(parse_tree) - result = round(result, 6) - - return True, result - - except Exception as e: - return False, 0.0 - - class Unit(bonsai.core.tool.Unit): UNIT_TYPE = Literal["LENGTHUNIT", "AREAUNIT", "VOLUMEUNIT", "MASSUNIT", "TIMEUNIT"] @@ -292,6 +62,245 @@ def format_distance(meters: float, use_imperial: bool = None, **kwargs) -> str: **kwargs, ) + @classmethod + def parse_distance_string(cls, input_string: str, use_project_unit: bool = True) -> tuple[bool, float]: + """ + Parse a distance string with optional unit suffixes and convert to meters. + + This function parses distance inputs with units (e.g., "5m", "10ft", "3.5cm") + and converts them to meters (SI units) for use in IFC models. + + Supports: + - Metric units: mm, cm, dm, m + - Imperial units: ft/feet ('), in/inches (") + - Arithmetic expressions: +, -, *, / + - Fractions for imperial units (e.g., 1/2") + - Formula mode: values starting with "=" + + :param input_string: The string to parse (e.g., "5m", "10ft", "10'6\"", "3.5cm", "12in") + :param use_project_unit: If True, uses project unit scale; if False, uses Blender unit scale + :return: Tuple (is_valid, value_in_meters) where is_valid indicates successful parsing + and value_in_meters is the converted value in meters + + Examples: + >>> parse_distance_string("5m") + (True, 5.0) + >>> parse_distance_string("30cm") + (True, 0.3) + >>> parse_distance_string("10ft") + (True, 3.048) + >>> parse_distance_string("12in") + (True, 0.3048) + >>> parse_distance_string("5'6\"") + (True, 1.6764) + >>> parse_distance_string("invalid") + (False, 0.0) + """ + + grammar_imperial = r""" + start: (FORMULA dim expr) | dim + dim: imperial + + FORMULA: "=" + + imperial: feet_inches | feet_only | inches_only | plain_number + feet_only: NUMBER (FEET_SYM | FEET_TEXT) + inches_only: inch_value (INCH_SYM | INCH_TEXT) + feet_inches: NUMBER (FEET_SYM | FEET_TEXT) DASH? inch_value (INCH_SYM | INCH_TEXT)? + plain_number: NUMBER + + inch_value: NUMBER fraction | fraction | NUMBER + + fraction: NUMBER "/" NUMBER + + expr: (ADD | SUB) dim | (MUL | DIV) NUMBER + + NUMBER: /-?(?:\d+\.?\d*|\.\d+)/ + FEET_SYM: "'" + FEET_TEXT: "ft" + INCH_SYM: "\"" + INCH_TEXT: "in" + DASH: "-" + ADD: "+" + SUB: "-" + MUL: "*" + DIV: "/" + + %ignore " " + """ + + grammar_metric = r""" + start: FORMULA? dim expr? + dim: metric + + FORMULA: "=" + + metric: NUMBER (MM | CM | DM | M | DEG)? + + expr: (ADD | SUB | MUL | DIV) dim + + NUMBER: /-?(?:\d+\.?\d*|\.\d+)/ + MM: "mm" + CM: "cm" + DM: "dm" + M: "m" + DEG: "°" + ADD: "+" + SUB: "-" + MUL: "*" + DIV: "/" + + %ignore " " + """ + + class InputTransform(Transformer): + def NUMBER(self, n): + return float(n) + + def fraction(self, numbers): + return numbers[0] / numbers[1] + + def inch_value(self, args): + # Can be: NUMBER fraction, fraction, or NUMBER + if len(args) == 2: + # NUMBER fraction (e.g., "9 1/64") + return args[0] + args[1] + else: + # Just fraction or just NUMBER + return args[0] + + def plain_number(self, args): + # A plain number in imperial context is assumed to be feet + feet = args[0] + # Convert feet to meters (1 foot = 0.3048 meters) + return feet * 0.3048 + + def feet_only(self, args): + # args[0] is the number of feet, args[1] is the unit token (we can ignore it) + feet = args[0] + # Convert feet to meters (1 foot = 0.3048 meters) + return feet * 0.3048 + + def inches_only(self, args): + # args[0] is the inch_value, args[1] is the unit token + inches = args[0] + # Convert inches to meters (1 inch = 0.0254 meters) + return inches * 0.0254 + + def feet_inches(self, args): + # Extract feet and inches values + feet = args[0] + # Find the inch_value (it's a number, not a token) + inches = None + for arg in args[1:]: + if isinstance(arg, (int, float)): + inches = arg + break + if inches is None: + inches = 0 + + # If feet is negative, inches should also be negative (subtractive) + if feet < 0: + inches = -inches + + # Convert to meters + total_meters = (feet * 0.3048) + (inches * 0.0254) + return total_meters + + def imperial(self, args): + # Just return the value from the sub-rule (feet_only, inches_only, or feet_inches) + return args[0] + + def metric(self, args): + # args[0] is the NUMBER, args[1] if present is the unit + value = args[0] + if len(args) > 1: + unit = str(args[1]) + # Convert to meters based on unit + if unit == "mm": + value = value / 1000.0 + elif unit == "cm": + value = value / 100.0 + elif unit == "dm": + value = value / 10.0 + elif unit == "m": + value = value # already in meters + elif unit == "°": + value = value # degrees, pass through + # If no unit specified, assume it's already in the project's unit system + return value + + def dim(self, args): + return args[0] + + def expr(self, args): + op = args[0] + value = float(args[1]) + if op == "+": + return lambda x: x + value + elif op == "-": + return lambda x: x - value + elif op == "*": + return lambda x: x * value + elif op == "/": + return lambda x: x / value + + def FORMULA(self, args): + return args[0] + + def start(self, args): + i = 0 + if args[0] == "=": + i += 1 + else: + if len(args) > 1: + raise ValueError("Invalid input.") + dimension = args[i] + if len(args) > i + 1: + expression = args[i + 1] + return expression(dimension) + else: + return dimension + + try: + # Determine unit scale + if use_project_unit and tool.Ifc.get(): + unit_scale = ifcopenshell.util.unit.calculate_unit_scale(tool.Ifc.get()) + else: + unit_scale = tool.Blender.get_unit_scale() + + # Try to parse with the project's default grammar first + if bpy.context.scene.unit_settings.system == "IMPERIAL": + primary_parser = Lark(grammar_imperial) + fallback_parser = Lark(grammar_metric) + else: + primary_parser = Lark(grammar_metric) + fallback_parser = Lark(grammar_imperial) + + # Try parsing with primary grammar + parse_tree = None + try: + parse_tree = primary_parser.parse(input_string) + except Exception as e: + # If primary fails, try fallback grammar (allows metric in imperial projects and vice versa) + try: + parse_tree = fallback_parser.parse(input_string) + except Exception as e2: + pass + + if parse_tree is None: + return False, 0.0 + + # Transform the parse tree to get the numeric result + transformer = InputTransform() + result = transformer.transform(parse_tree) + result = round(result, 6) + + return True, result + + except Exception as e: + return False, 0.0 + @classmethod def get_unit_props(cls) -> BIMUnitProperties: return bpy.context.scene.BIMUnitProperties @@ -325,66 +334,33 @@ def callback(attributes, prop): return bonsai.bim.helper.export_attributes(props.unit_attributes, callback=callback) @classmethod - def get_scene_unit_name(cls, unit_type: UNIT_TYPE) -> str: - bim_props = tool.Blender.get_bim_props() + def get_scene_unit_name(cls, unit_type: UNIT_TYPE) -> str | None: if unit_type == "LENGTHUNIT": - assert bpy.context.scene - props = bpy.context.scene.unit_settings - if props.length_unit == "MILES": - return "mile" - elif props.length_unit == "FEET" or props.length_unit == "ADAPTIVE": - return "foot" - elif props.length_unit == "INCHES": - return "inch" - elif props.length_unit == "THOU": - return "thou" - return "foot" - elif unit_type == "AREAUNIT": - return bim_props.area_unit - elif unit_type == "VOLUMEUNIT": - return bim_props.volume_unit - elif unit_type == "MASSUNIT": - return bim_props.mass_unit.lower() - elif unit_type == "TIMEUNIT": - return bim_props.time_unit.lower() - else: - assert_never(unit_type) + name = bpy.context.scene.unit_settings.length_unit + if name == "ADAPTIVE": + if bpy.context.scene.unit_settings.system == "IMPERIAL": + name = "foot" + else: + name = "METRE" + name = ( + {"MILES": "mile", "FEET": "foot", "INCHES": "inch", "THOU": "thou", "ADAPTIVE": "METERS"} + .get(name, name) + .replace("METERS", "METRE") + ) + if len(name) > len("METRE") and name.endswith("METRE"): + return f"{name[:-5]}/METRE" + return name + bim_props = tool.Blender.get_bim_props() + if (name := getattr(bim_props, f"{unit_type[:-4].lower()}_unit")) != "NONE": + return name @classmethod - def get_scene_unit_si_prefix(cls, unit_type: UNIT_TYPE) -> Union[str, None]: - bim_props = tool.Blender.get_bim_props() - if unit_type == "LENGTHUNIT": - assert bpy.context.scene - props = bpy.context.scene.unit_settings - if props.length_unit == "ADAPTIVE" or props.length_unit == "METERS": - return - return props.length_unit.replace("METERS", "") - elif unit_type == "AREAUNIT": - unit = bim_props.area_unit - elif unit_type == "VOLUMEUNIT": - unit = bim_props.volume_unit - elif unit_type == "MASSUNIT": - unit = bim_props.mass_unit - if unit == "GRAM": - return None - elif unit == "KILOGRAM": - return "KILO" - elif unit == "TONNE": - return "MEGA" - elif unit in ["POUND", "OUNCE"]: - return "CONVERSION" - else: - return None - elif unit_type == "TIMEUNIT": - unit = bim_props.time_unit - if unit == "SECOND": - return None - else: - return "CONVERSION" - else: - assert_never(unit_type) - if "/" in unit: - return unit.split("/")[0] + def is_si_unit(cls, name: str) -> bool: + return name[0].isupper() + + @classmethod + def get_scene_unit_si_prefix(cls, name: str) -> str | None: + return name.split("/")[0] if "/" in name else None @classmethod def import_unit_attributes(cls, unit: ifcopenshell.entity_instance) -> None: @@ -444,11 +420,6 @@ def import_units(cls) -> None: new.is_assigned = unit in assigned_units new.ifc_class = unit.is_a() - @classmethod - def is_scene_unit_metric(cls) -> bool: - assert bpy.context.scene - return bpy.context.scene.unit_settings.system in ["METRIC", "NONE"] - @classmethod def is_unit_class(cls, unit: ifcopenshell.entity_instance, ifc_class: str) -> bool: return unit.is_a(ifc_class) @@ -499,9 +470,3 @@ def get_icon_for_unit_class(cls, ifc_class: str) -> str: elif ifc_class == "IfcMonetaryUnit": return "COPY_ID" return "MOD_MESHDEFORM" - - @classmethod - def add_mass_and_time_units(cls) -> bool: - """Return True if the user wants to add mass and time units, False otherwise.""" - bim_props = tool.Blender.get_bim_props() - return getattr(bim_props, "add_mass_time_units", False) diff --git a/src/bonsai/bonsai/tool/web.py b/src/bonsai/bonsai/tool/web.py index 2e1628378fb..9ebf211ce8f 100644 --- a/src/bonsai/bonsai/tool/web.py +++ b/src/bonsai/bonsai/tool/web.py @@ -17,37 +17,39 @@ # along with Bonsai. If not, see . from __future__ import annotations -from ifcopenshell.util.classification import get_classification_data, get_references -from ifcopenshell.util.selector import filter_elements -import ifcopenshell.util.cost -import bpy -from bonsai.bim.module.web.data import WebData -from ifcopenshell.util.element import get_psets, get_type, has_property -import bonsai.core.tool -import bonsai.tool as tool -import ifcopenshell.api.sequence -import ifcopenshell.api.classification -import ifcopenshell.api.cost -from typing import Any, Optional, TYPE_CHECKING, Union -from mathutils import Color -import time -import socket -import sys -import os + +import asyncio import errno +import json +import os +import queue +import socket import subprocess -import webbrowser -import asyncio -import socketio +import sys import threading -import queue -import json -from time import sleep +import time +import webbrowser from pathlib import Path -import bonsai.core.sequence -import bonsai.core.cost +from typing import TYPE_CHECKING, Any, Optional, Union + +import bpy +import ifcopenshell.api.classification +import ifcopenshell.api.cost +import ifcopenshell.api.sequence +import ifcopenshell.util.cost +import socketio from ifc5d.ifc2json import ifc5D2json +from ifcopenshell.util.classification import get_classification_data, get_references +from ifcopenshell.util.element import get_psets, get_type, has_property +from ifcopenshell.util.selector import filter_elements +from mathutils import Color + +import bonsai.core.cost +import bonsai.core.sequence +import bonsai.core.tool +import bonsai.tool as tool from bonsai.bim.ifc import IfcStore +from bonsai.bim.module.web.data import WebData if TYPE_CHECKING: from bonsai.bim.module.web.prop import WebProperties @@ -115,7 +117,6 @@ def start_websocket_server(cls, port: int) -> None: :param port: The port number on which to start the WebSocket server. """ - import addon_utils global ws_process diff --git a/src/bonsai/docs/guides/development/code_style.rst b/src/bonsai/docs/guides/development/code_style.rst index cdc506d5aba..96f3d2b9cc8 100644 --- a/src/bonsai/docs/guides/development/code_style.rst +++ b/src/bonsai/docs/guides/development/code_style.rst @@ -7,7 +7,7 @@ Python code formatters For Python code formatting, we use `Black code formatter `__, black settings are stored in the repository's pyproject.toml. -We have GitHub workflow `ci-black-formatting` to maintain black formatting across the repository. +We have GitHub workflow `ci-lint` to maintain black formatting across the repository. ``black`` can be installed using ``pip install black`` and files can be formatted with the following example command: diff --git a/src/bonsai/docs/guides/development/index.rst b/src/bonsai/docs/guides/development/index.rst index 8852892361f..d969791bf61 100644 --- a/src/bonsai/docs/guides/development/index.rst +++ b/src/bonsai/docs/guides/development/index.rst @@ -19,4 +19,5 @@ This chapter covers how you can help contribute to Bonsai. undo_system writing_docs debugging + maintenance ide/index diff --git a/src/bonsai/docs/guides/development/installation.rst b/src/bonsai/docs/guides/development/installation.rst index e68d90aa001..7355d09ca1a 100644 --- a/src/bonsai/docs/guides/development/installation.rst +++ b/src/bonsai/docs/guides/development/installation.rst @@ -10,6 +10,8 @@ There are different methods of installation, depending on your situation. recommended for developers who are actively coding. 4. :ref:`guides/development/installation:Packaged installation` is recommended for those who use a package manager. +5. :ref:`guides/development/installation:BonsaiPR (Bleeding Edge) Installation` merges all open, non-draft PRs automatically. + System requirements ------------------- @@ -200,6 +202,7 @@ Packaged installation - **Arch Linux**: `Direct from Git `__. - **Chocolatey on Windows**: `Unstable `__. +- **Fedora Linux**: `IfcOpenShell Copr repository `__. Tips for package managers ------------------------- @@ -230,6 +233,95 @@ the `Makefile `__ in the ``dist`` target. + + +BonsaiPR (Bleeding Edge) Installation +-------------------------------------- + +**BonsaiPR** is a community-maintained build that automatically merges open pull +requests (PRs) from the IfcOpenShell repository into a single installable add-on. +It is intended for power users and testers who want to try the latest community +contributions before they are officially reviewed and merged. + +Why BonsaiPR Exists +~~~~~~~~~~~~~~~~~~~~ + +Many excellent PRs are submitted by contributors, but core maintainers have +limited time for timely reviews. As a result, PRs often sit unmerged, +contributors lose momentum, and valuable work risks being forgotten. + +BonsaiPR addresses this by providing a ``bleeding_edge`` build that merges all +open, non-draft PRs automatically. Power users can install this build to test +multiple PRs together, helping catch issues earlier and reducing the load on core +developers. + +.. warning:: + + You must enable either **Bonsai** or **BonsaiPR**, but **not both at the + same time**. Enabling both can cause conflicts or unexpected behaviour. To + switch between them, disable the active one before enabling the other. + +How It Works +~~~~~~~~~~~~~ + +On a regular basis (and whenever a PR is opened or modified), an automated +system: + +1. Clones the IfcOpenShell repository and merges all open, non-draft PRs. +2. Builds the resulting add-on for all supported platforms. +3. Publishes the result as a release on the `BonsaiPR releases page + `__. +4. The list of branches is also published on `falken10vdl's IfcOpenShell Fork + `__. + +Each release includes a full report listing which PRs were merged successfully, +which were skipped (e.g. drafts), and which failed due to conflicts with other +PRs. + +Installing BonsaiPR with Automated Updates +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +1. Open Blender and go to :menuselection:`Edit --> Preferences --> Add-ons`. + Disable **Bonsai** if it is currently enabled. + +2. Click on the **Get Extensions** tab in the left sidebar. + +3. In the top right, click the **Repositories** dropdown, then the **+ icon**, + and select **Add Remote Repository**. + +4. Enter the following URL:: + + https://raw.githubusercontent.com/falken10vdl/bonsaiPR/refs/heads/main/index.json + +5. Enable **Check for Updates on Startup**, then click **Create**. + +6. In the **Get Extensions** search bar, type ``bonsai`` and look for + **BonsaiPR**. Click **Install**. + +7. Go to :menuselection:`Edit --> Preferences --> Add-ons` and confirm that + **BonsaiPR** is enabled and **Bonsai** is disabled. + +8. Restart Blender. + +Blender will automatically check for updates to the BonsaiPR extension on +startup, so you will always have access to the latest bleeding edge build. + +Installing BonsaiPR Manually +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +If you prefer to install manually, download the appropriate ``.zip`` file for +your platform from the `BonsaiPR releases page +`__: + +- **Linux (x64)**: ``bonsaiPR_py311-0.8.4-alphaYYMMDDHHMM-linux-x64.zip`` +- **macOS Intel (x64)**: ``bonsaiPR_py311-0.8.4-alphaYYMMDDHHMM-macos-x64.zip`` +- **macOS Apple Silicon (ARM64)**: ``bonsaiPR_py311-0.8.4-alphaYYMMDDHHMM-macos-arm64.zip`` +- **Windows (x64)**: ``bonsaiPR_py311-0.8.4-alphaYYMMDDHHMM-windows-x64.zip`` + +Then go to :menuselection:`Edit --> Preferences --> Get Extensions --> "V" Icon +(top right) --> Install from Disk` and select the downloaded zip. + + Add-on compatibility -------------------- diff --git a/src/bonsai/docs/guides/development/maintenance.rst b/src/bonsai/docs/guides/development/maintenance.rst new file mode 100644 index 00000000000..f08a003fd59 --- /dev/null +++ b/src/bonsai/docs/guides/development/maintenance.rst @@ -0,0 +1,122 @@ +Maintenance +=========== + +This page documents what needs to be updated in various maintenance scenarios. + +Python Version Added or Removed +-------------------------------- + +When adding or removing a supported Python version, update the following: + +.. list-table:: + :header-rows: 1 + + * - File + - What to update + * - ``.github/workflows/ci-lint.yaml`` + - ``MIN_IOS_PY_VERSION`` + * - ``.github/workflows/ci-ifcopenshell-python-pypi.yml`` + - ``pyver`` matrix + * - ``.github/workflows/ci-ifcopenshell-python.yml`` + - ``pyver`` matrix + * - ``nix/build-all.py`` + - ``PYTHON_VERSIONS`` list + * - ``src/bsdd/pyproject.toml`` + - ``requires-python`` + * - ``src/ifcopenshell-python/docs/ifcopenshell-python/installation.rst`` + - add or remove the row in the ZIP packages table + * - ``src/ifcopenshell-python/Makefile`` + - ``SUPPORTED_PYVERSIONS`` + * - ``src/ifcopenshell-python/pyproject.toml`` + - ``requires-python`` + * - ``src/ifcopenshell-python/test/test_package.py`` + - ``SUPPORTED_PY_VERSIONS`` tuple + * - ``win/build-all-win.py`` + - ``PYTHON_VERSIONS`` list + +Blender Version Updated +----------------------- + +When a new Blender version is released and supported: + +.. list-table:: + :header-rows: 1 + + * - File + - What to update + * - ``.github/workflows/ci-bonsai.yml`` + - ``pyver`` matrix + * - ``.github/workflows/ci-bonsai-daily.yml`` + - Blender download URL + +Blender's Bundled Python Version Updated +----------------------------------------- + +When Blender ships with a new Python version: + +.. list-table:: + :header-rows: 1 + + * - File + - What to update + * - ``.github/workflows/ci-lint.yaml`` + - ``MIN_BLENDER_PY_VERSION`` + * - ``.github/scripts/publish-bonsai-releases.py`` + - ``CURRENT_PYTHON_VERSION`` + * - ``src/bonsai/Makefile`` + - ``SUPPORTED_PYVERSIONS`` + * - ``src/bonsai/scripts/dev_environment.py`` + - ``PYTHON_VERSION`` mapping (Blender version, bundled Python version) + +Release +------- + +Notes: + +- Typically all packages are released at once using the same version schema +- The ``README.md`` badges can serve as a visual reference for what versions have been released +- Corrective Release (if needed after a standard release): + + - Create a new branch from the release tag (e.g., from the ``ifcopenshell-0.8.5`` tag) + - Update ``VERSION`` with the ``-post1`` suffix (e.g., ``0.8.5-post1``, **not** ``.post1``) + - The hyphen is required for semantic versioning compliance; Blender will not process ``.post1`` suffixes correctly + - Follow the standard release process for the corrective version + +- Multiple Blender Python Versions: + + - Blender does not allow multiple builds for the same platform with different Python versions (e.g., cannot have both ``bonsai_py311-0.8.5-windows-x64.zip`` and ``bonsai_py313-0.8.5-windows-x64.zip``) + - Workaround: publish different Python versions as different extension versions (e.g., py313 as ``0.8.5`` and py311 as ``0.8.5-post1``) + - Set the maximum Blender version on the Blender extensions platform UI to prevent conflicts (e.g., set max version ``5.1.0`` for ``0.8.5-post1``, which restricts it to versions below 5.1.0) + +Things to update: + +- ``.github/workflows/ci-bcf-pypi.yml`` - release `bcf-client `_ to PyPI +- ``.github/workflows/ci-bonsai.yml`` - release bonsai in GitHub releases +- ``.github/workflows/ci-bsdd-pypi.yaml`` - release `bsdd `_ to PyPI +- ``.github/workflows/ci-ifc4d-pypi.yaml`` - release `ifc4d `_ to PyPI +- ``.github/workflows/ci-ifc5d-pypi.yaml`` - release `ifc5d `_ to PyPI +- ``.github/workflows/ci-ifcclash-pypi.yaml`` - release `ifcclash `_ to PyPI +- ``.github/workflows/ci-ifcconvert.yml`` - release ifcconvert binaries in GitHub releases +- ``.github/workflows/ci-ifccsv-pypi.yaml`` - release `ifccsv `_ to PyPI +- ``.github/workflows/ci-ifcdiff-pypi.yaml`` - release `ifcdiff `_ to PyPI +- ``.github/workflows/ci-ifcedit-pypi.yaml`` - release `ifcedit `_ to PyPI +- ``.github/workflows/ci-ifcfm-pypi.yaml`` - release `ifcfm `_ to PyPI +- ``.github/workflows/ci-ifccityjson-pypi.yaml`` - release `ifccityjson `_ to PyPI +- ``.github/workflows/ci-ifcmcp-pypi.yaml`` - release `ifcopenshell-mcp `_ to PyPI +- ``.github/workflows/ci-ifcopenshell-python.yml`` - release ifcopenshell-python binaries in GitHub releases +- ``.github/workflows/ci-ifcopenshell-python-pypi.yml`` - release `ifcopenshell `_ wheels to PyPI +- ``.github/workflows/ci-ifcpatch-pypi.yaml`` - release `ifcpatch `_ to PyPI +- ``.github/workflows/ci-ifcquery-pypi.yaml`` - release `ifcquery `_ to PyPI +- ``.github/workflows/ci-ifcsverchok.yml`` - release ifcsverchok Blender add-on in GitHub releases +- ``.github/workflows/ci-ifctester-pypi.yml`` - release `ifctester `_ to PyPI +- ``.github/workflows/ci-pyodide-wasm-release.yml`` - release pyodide wasm wheel to `wasm-wheels `_ +- ``.github/workflows/publish-bonsai-releases.yml`` - publish Bonsai Blender extension to `Blender extensions platform `_ + + - ❗ Requires ``BLENDER_EXTENSIONS_TOKEN`` secret to be set - ❗ not yet configured + +- Publishing documentation and websites (see `website `_ repository): + + - `ifcopenshell-docs.yml` - builds and publishes IfcOpenShell documentation to `docs.ifcopenshell.org `_ (`ifcopenshell_org_docs `_ repo) + - `bonsai-docs.yml` - builds and publishes Bonsai documentation to `docs.bonsaibim.org `_ (`bonsaibim_org_docs `_ repo) + - `publish-websites.yml` - publishes `bonsaibim.org `_ (`bonsaibim_org_static_html `_ repo) and `ifcopenshell.org `_ (`ifcopenshell_org_static_html `_ repo) +- ``VERSION`` to the release version - **UPDATE THIS LAST** as all workflows above typically depend on it to set the version correctly diff --git a/src/bonsai/pyproject.toml b/src/bonsai/pyproject.toml index 6dab8f34548..4ee183cba06 100644 --- a/src/bonsai/pyproject.toml +++ b/src/bonsai/pyproject.toml @@ -38,8 +38,12 @@ exclude = ["test*"] [tool.ruff] extend = "../../pyproject.toml" +lint.extend-select = [ + "F401", # unused imports +] -[tool.ruff.lint] -ignore = [ - "I", # import sorting - ignore it temporarily, still need to do some tests +[tool.ruff.lint.isort] +known-first-party = [ + "test", + "bonsai", ] diff --git a/src/bonsai/pytest.ini b/src/bonsai/pytest.ini index 001313dd306..e628606201b 100644 --- a/src/bonsai/pytest.ini +++ b/src/bonsai/pytest.ini @@ -1,6 +1,7 @@ [pytest] markers = aggregate + array attribute boolean boundary diff --git a/src/bonsai/runpytest.py b/src/bonsai/runpytest.py index f9a55fdc271..9a00ea69b0f 100755 --- a/src/bonsai/runpytest.py +++ b/src/bonsai/runpytest.py @@ -23,6 +23,7 @@ """ import sys + import pytest argv = [__file__] diff --git a/src/bonsai/scripts/bonsai_deps.py b/src/bonsai/scripts/bonsai_deps.py new file mode 100644 index 00000000000..678fa49bb18 --- /dev/null +++ b/src/bonsai/scripts/bonsai_deps.py @@ -0,0 +1,23 @@ +"""Clone or update Bonsai external dependencies. + +Must be run from the repository root. +""" + +import subprocess +from pathlib import Path + +DEPS = [ + ("https://projects.blender.org/pioverfour/sun_position.git", "sun_position"), + ("https://github.com/kevancress/MeasureIt_ARCH", "MeasureIt_ARCH"), + ("https://github.com/nortikin/sverchok.git", "sverchok"), +] + +base = Path("src/bonsai/external_dependencies") +base.mkdir(parents=True, exist_ok=True) + +for url, name in DEPS: + path = base / name + if not path.exists(): + subprocess.check_call(["git", "clone", url, str(path)]) + else: + subprocess.check_call(["git", "-C", str(path), "pull", "--rebase"]) diff --git a/src/bonsai/scripts/bonsai_translations.py b/src/bonsai/scripts/bonsai_translations.py index de7f613210e..7b6ae960db4 100644 --- a/src/bonsai/scripts/bonsai_translations.py +++ b/src/bonsai/scripts/bonsai_translations.py @@ -4,20 +4,19 @@ # Ensure it's not fake-bpy-module. if not hasattr(bpy, "context"): raise ModuleNotFoundError - import bl_i18n_utils import addon_utils BPY_IS_LOADED = True except ModuleNotFoundError: BPY_IS_LOADED = False -import shutil -import tempfile import importlib import os import re -from pathlib import Path +import shutil +import tempfile from dataclasses import dataclass, field +from pathlib import Path from typing import Optional bl_info = { @@ -274,8 +273,10 @@ def is_valid_path(path: Path): f"Couldn't find locale path in the source directory, creating dummy directory: {source_locale_path}.", ) - from ui_translate.settings import settings as ui_translate_settings # pyright: ignore[reportMissingImports] - from ui_translate.update_ui import ( # pyright: ignore[reportMissingImports] + from ui_translate.settings import ( # pyright: ignore[reportMissingImports] # ty:ignore[unresolved-import] + settings as ui_translate_settings, + ) + from ui_translate.update_ui import ( # pyright: ignore[reportMissingImports] # ty:ignore[unresolved-import] UI_OT_i18n_updatetranslation_init_settings, ) diff --git a/src/bonsai/scripts/classifications/brick_classifiction.py b/src/bonsai/scripts/classifications/brick_classifiction.py index 9a9d42353ed..17246940c70 100644 --- a/src/bonsai/scripts/classifications/brick_classifiction.py +++ b/src/bonsai/scripts/classifications/brick_classifiction.py @@ -22,8 +22,7 @@ def generate(self): } ) - query = self.schema.query( - """ + query = self.schema.query(""" PREFIX brick: PREFIX rdfs: PREFIX skos: @@ -49,8 +48,7 @@ def generate(self): } } GROUP BY ?entity - """ - ) + """) # create references dictionary references = {} @@ -76,17 +74,13 @@ def generate(self): ) # get all parents of the entity - query = self.schema.query( - """ + query = self.schema.query(""" PREFIX brick: PREFIX rdfs: SELECT ?parent WHERE { brick:{entity} rdfs:subClassOf ?parent . } - """.replace( - "{entity}", location.split("#")[-1] - ) - ) + """.replace("{entity}", location.split("#")[-1])) # filter parents for the brick entity for row in query: parent = row.get("parent").toPython() diff --git a/src/bonsai/scripts/classifications/uniclass_classification.py b/src/bonsai/scripts/classifications/uniclass_classification.py index ce55fae9e77..299db8a4695 100644 --- a/src/bonsai/scripts/classifications/uniclass_classification.py +++ b/src/bonsai/scripts/classifications/uniclass_classification.py @@ -1,4 +1,5 @@ import os + import ifcopenshell import pandas as pd diff --git a/src/bonsai/scripts/classifications/vbis.py b/src/bonsai/scripts/classifications/vbis.py index fe77308f82f..71d0af5fe9d 100644 --- a/src/bonsai/scripts/classifications/vbis.py +++ b/src/bonsai/scripts/classifications/vbis.py @@ -1,12 +1,10 @@ import csv -import os -import json # import pystache -import subprocess -import ifcopenshell from pathlib import Path +import ifcopenshell + class Generator: def __init__(self): diff --git a/src/bonsai/scripts/classifications/xml_classification.py b/src/bonsai/scripts/classifications/xml_classification.py index d75383a0510..0a80fb68e7f 100644 --- a/src/bonsai/scripts/classifications/xml_classification.py +++ b/src/bonsai/scripts/classifications/xml_classification.py @@ -1,9 +1,10 @@ """This script converts Graphisoft XML into an IFC file""" +import os import xml.etree.ElementTree as ET + import ifcopenshell import ifcopenshell.guid -import os class IFC4Extractor: diff --git a/src/bonsai/scripts/dev_environment.py b/src/bonsai/scripts/dev_environment.py index 4598d0bf492..e9a8d2a44f5 100644 --- a/src/bonsai/scripts/dev_environment.py +++ b/src/bonsai/scripts/dev_environment.py @@ -78,7 +78,8 @@ def find_bonsai_path() -> Union[Path, None]: # --------------------------- # Never changed by user. -PACKAGE_PATH = BLENDER_PATH / r"extensions/.local/lib/python3.11/site-packages" +PYTHON_VERSION = "3.13" if BLENDER_VERSION == "5.1" else "3.11" +PACKAGE_PATH = BLENDER_PATH / rf"extensions/.local/lib/python{PYTHON_VERSION}/site-packages" def main() -> None: @@ -193,7 +194,7 @@ def main() -> None: print(f"Downloading {url} -> {filepath}") urllib.request.urlretrieve(url, filepath) - input("Dev environment is all set. 🎉🎉\nPress Enter to continue..." "") + input("Dev environment is all set!! \nPress Enter to continue...") if __name__ == "__main__": diff --git a/src/bonsai/scripts/dev_environment_vscode_config.py b/src/bonsai/scripts/dev_environment_vscode_config.py new file mode 100644 index 00000000000..088810e05cb --- /dev/null +++ b/src/bonsai/scripts/dev_environment_vscode_config.py @@ -0,0 +1,28 @@ +import json +from pathlib import Path + +import bpy + +import bonsai + +repo_path = Path(bonsai.__file__).resolve().parent +install_path = Path(bonsai.__file__).absolute().parent +assert repo_path != install_path, "Run `dev_environment.py` to setup the development environment symlinks first." + +repo_root = repo_path.parent.parent.parent +settings_path = repo_root / ".vscode" / "settings.json" +settings_path.parent.mkdir(parents=True, exist_ok=True) + +settings = json.loads(settings_path.read_text()) if settings_path.exists() else {} +settings.update( + { + "bonsai.localRoot": repo_path.as_posix(), + "bonsai.remoteRoot": install_path.as_posix(), + "bonsai.blenderPath": Path(bpy.app.binary_path).parent.as_posix(), + } +) +json_data = json.dumps(settings, indent=2) + +settings_path.write_text(json_data) + +print("\n\nBonsai/VSCode development environment configured successfully!\n\n") diff --git a/src/bonsai/scripts/dxf2ifc.py b/src/bonsai/scripts/dxf2ifc.py index 3fa34e379ab..caef1df864d 100644 --- a/src/bonsai/scripts/dxf2ifc.py +++ b/src/bonsai/scripts/dxf2ifc.py @@ -16,9 +16,9 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . +import ezdxf import ifcopenshell import ifcopenshell.guid -import ezdxf class Dxf2Ifc: diff --git a/src/bonsai/scripts/extract.py b/src/bonsai/scripts/extract.py index dffaaf6d40f..2b4166be81e 100644 --- a/src/bonsai/scripts/extract.py +++ b/src/bonsai/scripts/extract.py @@ -16,9 +16,13 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . -import xml.sax, json, copy, pathlib -from bs4 import BeautifulSoup # pyright: ignore[reportMissingModuleSource] +import copy +import json +import pathlib import sys +import xml.sax + +from bs4 import BeautifulSoup # pyright: ignore[reportMissingModuleSource] sys.setrecursionlimit(100) diff --git a/src/bonsai/scripts/gbxml.py b/src/bonsai/scripts/gbxml.py index 8d23fe60186..6cf104f2c16 100644 --- a/src/bonsai/scripts/gbxml.py +++ b/src/bonsai/scripts/gbxml.py @@ -16,16 +16,16 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . -import bpy -import uuid import math -import sys +import uuid + +import bpy # sys.path.append('C:\Program Files\Python37\Lib\site-packages') -import lxml import lxml.etree -import bspy # pyright: ignore[reportMissingImports] -from bspy import Gbxml # pyright: ignore[reportMissingImports] +from bspy import ( # ty: ignore[unresolved-import] + Gbxml, # pyright: ignore[reportMissingImports] +) class GbxmlExporter: diff --git a/src/bonsai/scripts/generate_au_library.py b/src/bonsai/scripts/generate_au_library.py index 044f2fb0900..91fe2242559 100644 --- a/src/bonsai/scripts/generate_au_library.py +++ b/src/bonsai/scripts/generate_au_library.py @@ -20,7 +20,6 @@ # pylint: skip-file import bpy -import ifcopenshell import ifcopenshell.api import ifcopenshell.api.context import ifcopenshell.api.geometry @@ -30,6 +29,7 @@ import ifcopenshell.api.root import ifcopenshell.api.style import ifcopenshell.api.unit + import bonsai.tool as tool diff --git a/src/bonsai/scripts/generate_demo_library.py b/src/bonsai/scripts/generate_demo_library.py index 7a9e741dabe..a77fc09ab7f 100644 --- a/src/bonsai/scripts/generate_demo_library.py +++ b/src/bonsai/scripts/generate_demo_library.py @@ -16,6 +16,8 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . +from pathlib import Path + import bpy import ifcopenshell import ifcopenshell.api @@ -31,8 +33,8 @@ import ifcopenshell.api.unit import ifcopenshell.util.schema import ifcopenshell.util.shape_builder + import bonsai.tool as tool -from pathlib import Path def sync_guids(target_file: ifcopenshell.file, source_file: ifcopenshell.file) -> None: diff --git a/src/bonsai/scripts/generate_entourage_library.py b/src/bonsai/scripts/generate_entourage_library.py index 78ed71ac6a3..fe7a75856e3 100644 --- a/src/bonsai/scripts/generate_entourage_library.py +++ b/src/bonsai/scripts/generate_entourage_library.py @@ -17,8 +17,8 @@ # along with Bonsai. If not, see . import os + import bpy -import ifcopenshell import ifcopenshell.api import ifcopenshell.api.context import ifcopenshell.api.geometry @@ -26,9 +26,8 @@ import ifcopenshell.api.root import ifcopenshell.api.style import ifcopenshell.api.unit -import bonsai.tool as tool -from pathlib import Path +import bonsai.tool as tool # When run from Blender BLEND_DIR = os.path.dirname(bpy.data.filepath) diff --git a/src/bonsai/scripts/generate_furniture_library.py b/src/bonsai/scripts/generate_furniture_library.py index 7212191be98..7b9d4117727 100644 --- a/src/bonsai/scripts/generate_furniture_library.py +++ b/src/bonsai/scripts/generate_furniture_library.py @@ -16,22 +16,21 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . -import numpy as np +from itertools import chain +from math import pi, tan +from pathlib import Path +from typing import Optional, Union + import ifcopenshell import ifcopenshell.api import ifcopenshell.api.context import ifcopenshell.api.geometry -import ifcopenshell.api.material import ifcopenshell.api.project import ifcopenshell.api.root -import ifcopenshell.api.style import ifcopenshell.api.unit import ifcopenshell.util.element -from math import cos, tan, pi -from pathlib import Path -from itertools import chain -from ifcopenshell.util.shape_builder import ShapeBuilder, V, np_to_3d, np_normalized -from typing import Optional, Union +import numpy as np +from ifcopenshell.util.shape_builder import ShapeBuilder, V, np_normalized, np_to_3d GeneratorOutput = Union[list[ifcopenshell.entity_instance], list[list[ifcopenshell.entity_instance]]] diff --git a/src/bonsai/scripts/generate_landscape_library.py b/src/bonsai/scripts/generate_landscape_library.py index 01e694e9d01..4e6ad3eba15 100644 --- a/src/bonsai/scripts/generate_landscape_library.py +++ b/src/bonsai/scripts/generate_landscape_library.py @@ -16,11 +16,14 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . -import os -import bpy import csv +import os import random -import ifcopenshell +from collections import namedtuple +from math import cos, pi, sin +from random import uniform + +import bpy import ifcopenshell.api import ifcopenshell.api.context import ifcopenshell.api.geometry @@ -29,15 +32,10 @@ import ifcopenshell.api.style import ifcopenshell.api.unit import ifcopenshell.util.unit -import bonsai.tool as tool -from math import cos, sin, tan, pi -from pathlib import Path -from itertools import chain from ifcopenshell.util.shape_builder import ShapeBuilder -from collections import namedtuple -from mathutils import Vector, Matrix -from random import uniform +from mathutils import Vector +import bonsai.tool as tool # When run from Blender BLEND_DIR = os.path.dirname(bpy.data.filepath) diff --git a/src/bonsai/scripts/generate_png_icons.py b/src/bonsai/scripts/generate_png_icons.py index d24b69fe90c..a523163a204 100644 --- a/src/bonsai/scripts/generate_png_icons.py +++ b/src/bonsai/scripts/generate_png_icons.py @@ -5,9 +5,9 @@ # to run on mac: python3 generate_png_icons.py import os +import re import subprocess import xml.etree.ElementTree as ET -import re SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__)) SVG_FILE = os.path.join(SCRIPT_DIR, "bonsai_icons.svg") diff --git a/src/bonsai/scripts/generate_site_library.py b/src/bonsai/scripts/generate_site_library.py index e42ad4e4f2d..d8439287ad3 100644 --- a/src/bonsai/scripts/generate_site_library.py +++ b/src/bonsai/scripts/generate_site_library.py @@ -17,7 +17,6 @@ # along with Bonsai. If not, see . import bpy -import ifcopenshell import ifcopenshell.api import ifcopenshell.api.context import ifcopenshell.api.geometry @@ -25,6 +24,7 @@ import ifcopenshell.api.root import ifcopenshell.api.style import ifcopenshell.api.unit + import bonsai.tool as tool diff --git a/src/bonsai/scripts/generate_steel_profiles_library.py b/src/bonsai/scripts/generate_steel_profiles_library.py index 086c9186891..ca45648122d 100644 --- a/src/bonsai/scripts/generate_steel_profiles_library.py +++ b/src/bonsai/scripts/generate_steel_profiles_library.py @@ -19,15 +19,15 @@ # fmt: off # pylint: skip-file -import ifcopenshell +from math import pi +from pathlib import Path + +import boltspy as bolts # pyright: ignore[reportMissingImports] # ty:ignore[unresolved-import] import ifcopenshell.api import ifcopenshell.api.material import ifcopenshell.api.project import ifcopenshell.api.root import ifcopenshell.api.unit -import boltspy as bolts # pyright: ignore[reportMissingImports] -from math import cos, pi -from pathlib import Path from ifcopenshell.util.shape_builder import ShapeBuilder, V, ifc_safe_vector_type diff --git a/src/bonsai/scripts/generate_util_type_json.py b/src/bonsai/scripts/generate_util_type_json.py index c162800f54b..7c44a9dfe99 100644 --- a/src/bonsai/scripts/generate_util_type_json.py +++ b/src/bonsai/scripts/generate_util_type_json.py @@ -18,6 +18,7 @@ # See bug #1300. Dodgy quick results that we should rebuild later. import json + import ifcopenshell import ifcopenshell.util.schema diff --git a/src/bonsai/scripts/geonodes_modifier_prototype.py b/src/bonsai/scripts/geonodes_modifier_prototype.py index 1b3dbfd8abe..185200942e4 100644 --- a/src/bonsai/scripts/geonodes_modifier_prototype.py +++ b/src/bonsai/scripts/geonodes_modifier_prototype.py @@ -17,14 +17,14 @@ # along with Bonsai. If not, see . -import ifcopenshell +import json + +import bmesh +import bpy import ifcopenshell.api.pset import ifcopenshell.util.element -import bonsai.tool as tool -import bpy -import bmesh -import json +import bonsai.tool as tool # Below is the code for # prototype for geonodes modifier (similar to ifc sverchok modifier) diff --git a/src/bonsai/scripts/getIfcElements.py b/src/bonsai/scripts/getIfcElements.py index 335260f7e98..57e03d50c4a 100644 --- a/src/bonsai/scripts/getIfcElements.py +++ b/src/bonsai/scripts/getIfcElements.py @@ -18,9 +18,9 @@ """This script converts the computer iterpretable listing ifcXML XSD into a JSON file""" -import xml.etree.ElementTree as ET import collections import json +import xml.etree.ElementTree as ET class IFC4Extractor: diff --git a/src/bonsai/scripts/get_all_qtos.py b/src/bonsai/scripts/get_all_qtos.py index 7f23dca55ae..8d407120eb4 100644 --- a/src/bonsai/scripts/get_all_qtos.py +++ b/src/bonsai/scripts/get_all_qtos.py @@ -1,13 +1,13 @@ """Update ifc5d json files with qtos from the provided pset templates path.""" import json -import ifcopenshell.util.pset -import ifcopenshell.util.type -import ifc5d from collections import defaultdict from pathlib import Path from typing import Union +import ifc5d +import ifcopenshell.util.pset + def order_dict(dictionary): # https://stackoverflow.com/questions/22721579/sorting-a-nested-ordereddict-by-key-recursively diff --git a/src/bonsai/scripts/get_description.py b/src/bonsai/scripts/get_description.py index 2d581185aac..a05d5dc2872 100644 --- a/src/bonsai/scripts/get_description.py +++ b/src/bonsai/scripts/get_description.py @@ -16,11 +16,12 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . -import os -import re import html import json +import os +import re from pathlib import Path + import ifcopenshell diff --git a/src/bonsai/scripts/get_volume_by_material.py b/src/bonsai/scripts/get_volume_by_material.py index 2f818629903..312878e53dc 100644 --- a/src/bonsai/scripts/get_volume_by_material.py +++ b/src/bonsai/scripts/get_volume_by_material.py @@ -16,10 +16,11 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . -import bpy -import bmesh import pprint +import bmesh +import bpy + material_volumes = {} for obj in bpy.context.selected_objects: diff --git a/src/bonsai/scripts/headless_import.py b/src/bonsai/scripts/headless_import.py index 111b07d78bb..7554eacc048 100644 --- a/src/bonsai/scripts/headless_import.py +++ b/src/bonsai/scripts/headless_import.py @@ -1,6 +1,7 @@ # This can be run using `blender -b -P headless_import.py` import bpy + import bonsai.tool as tool # When federating, you may wish to manually specify the origin to ensure models diff --git a/src/bonsai/scripts/obj2ifc-meshlab.py b/src/bonsai/scripts/obj2ifc-meshlab.py index 1d2739ca210..d707c8bda71 100644 --- a/src/bonsai/scripts/obj2ifc-meshlab.py +++ b/src/bonsai/scripts/obj2ifc-meshlab.py @@ -19,21 +19,19 @@ # This can be packaged with `pyinstaller --onefile --hidden-import numpy --collect-all ifcopenshell --clean obj2ifc.py` import argparse -import pymeshlab # pyright: ignore[reportMissingImports] -import ifcopenshell -import ifcopenshell.api +from pathlib import Path + import ifcopenshell.api.aggregate import ifcopenshell.api.context import ifcopenshell.api.geometry +import ifcopenshell.api.owner.settings import ifcopenshell.api.project import ifcopenshell.api.root import ifcopenshell.api.spatial import ifcopenshell.api.unit -import ifcopenshell.api.owner.settings import ifcopenshell.guid -from pathlib import Path - import numpy as np +import pymeshlab # pyright: ignore[reportMissingImports] # ty:ignore[unresolved-import] class Obj2Ifc: diff --git a/src/bonsai/scripts/obj2ifc.py b/src/bonsai/scripts/obj2ifc.py index dc91cedfd57..0b3252cd1cd 100644 --- a/src/bonsai/scripts/obj2ifc.py +++ b/src/bonsai/scripts/obj2ifc.py @@ -19,21 +19,19 @@ # This can be packaged with `pyinstaller --onefile --hidden-import numpy --collect-all ifcopenshell --clean obj2ifc.py` import argparse -import pywavefront # pyright: ignore[reportMissingImports] -import ifcopenshell -import ifcopenshell.api +from pathlib import Path + import ifcopenshell.api.aggregate import ifcopenshell.api.context import ifcopenshell.api.geometry +import ifcopenshell.api.owner.settings import ifcopenshell.api.project import ifcopenshell.api.root import ifcopenshell.api.spatial import ifcopenshell.api.unit -import ifcopenshell.api.owner.settings import ifcopenshell.guid -from pathlib import Path - import numpy as np +import pywavefront # pyright: ignore[reportMissingImports] # ty:ignore[unresolved-import] class Obj2Ifc: diff --git a/src/bonsai/scripts/replace_drawing_path.py b/src/bonsai/scripts/replace_drawing_path.py index eeca3911e05..2dd4296fad7 100644 --- a/src/bonsai/scripts/replace_drawing_path.py +++ b/src/bonsai/scripts/replace_drawing_path.py @@ -27,15 +27,14 @@ """ -import bonsai.tool as tool -import ifcopenshell -import ifcopenshell.api.pset -import ifcopenshell.util.element +import os import sys +from sys import platform +import ifcopenshell.api.pset +import ifcopenshell.util.element -import os -from sys import platform +import bonsai.tool as tool file = tool.Ifc.get() if not file: diff --git a/src/bonsai/scripts/reregister_bonsai.py b/src/bonsai/scripts/reregister_bonsai.py index 437c9f5b34d..4eb3764708d 100644 --- a/src/bonsai/scripts/reregister_bonsai.py +++ b/src/bonsai/scripts/reregister_bonsai.py @@ -23,8 +23,8 @@ to ensure disable and enable occur in the same Blender session. """ - import bpy + import bonsai.tool as tool bonsai_name = tool.Blender.get_blender_addon_package_name() diff --git a/src/bonsai/scripts/setup_pytest.py b/src/bonsai/scripts/setup_pytest.py index 90af113ecab..a4e56ca35c9 100644 --- a/src/bonsai/scripts/setup_pytest.py +++ b/src/bonsai/scripts/setup_pytest.py @@ -16,8 +16,8 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . -import sys import subprocess +import sys from pathlib import Path print("Here are the detected system paths:") @@ -45,10 +45,10 @@ subprocess.check_call(command + [dep]) try: - import pytest - import pytest_bdd - import pytest_blender - import pygments + import pygments # noqa: F401 + import pytest # noqa: F401 + import pytest_bdd # noqa: F401 + import pytest_blender # noqa: F401 print("Test dependency installation was successful!") except Exception as e: diff --git a/src/bonsai/scripts/standalone_blender_import.py b/src/bonsai/scripts/standalone_blender_import.py index 27dc84e07ff..a2b9908afb8 100644 --- a/src/bonsai/scripts/standalone_blender_import.py +++ b/src/bonsai/scripts/standalone_blender_import.py @@ -1,6 +1,7 @@ +import multiprocessing + import ifcopenshell import ifcopenshell.geom -import multiprocessing class BlenderImporter: diff --git a/src/bonsai/scripts/standalone_drawer.py b/src/bonsai/scripts/standalone_drawer.py index 1b669adb3fa..886887bf321 100644 --- a/src/bonsai/scripts/standalone_drawer.py +++ b/src/bonsai/scripts/standalone_drawer.py @@ -1,10 +1,10 @@ +import multiprocessing import sys +from typing import NamedTuple + import ifcopenshell -import ifcopenshell.util.element import ifcopenshell.geom -import multiprocessing -from typing import NamedTuple -import ifcopenshell.ifcopenshell_wrapper as W +import ifcopenshell.util.element # W.turn_on_detailed_logging() diff --git a/src/bonsai/scripts/standalone_section_shader.py b/src/bonsai/scripts/standalone_section_shader.py index 970e58105b2..20afd92fea0 100644 --- a/src/bonsai/scripts/standalone_section_shader.py +++ b/src/bonsai/scripts/standalone_section_shader.py @@ -12,20 +12,16 @@ } -import bpy -from bpy.types import Operator, PropertyGroup, Panel -from mathutils import Vector, Matrix, Euler from math import radians + +import bpy from bpy.props import ( - PointerProperty, - StringProperty, - EnumProperty, BoolProperty, - IntProperty, - FloatProperty, FloatVectorProperty, - CollectionProperty, + PointerProperty, ) +from bpy.types import Operator, Panel, PropertyGroup +from mathutils import Euler, Vector class SectionCutawayManager: diff --git a/src/bonsai/scripts/waldo.py b/src/bonsai/scripts/waldo.py index 5ed734356cc..c58e1dc1ec3 100644 --- a/src/bonsai/scripts/waldo.py +++ b/src/bonsai/scripts/waldo.py @@ -1,5 +1,8 @@ -import numpy as np -import ifcopenshell +# https://stackoverflow.com/a/9184560/9627415 +# Possible optimisation to linalg.norm? +from itertools import cycle +from math import radians + import ifcopenshell.api.aggregate import ifcopenshell.api.context import ifcopenshell.api.geometry @@ -12,14 +15,7 @@ import ifcopenshell.api.unit import ifcopenshell.util.placement import ifcopenshell.util.shape_builder - -# https://stackoverflow.com/a/9184560/9627415 -# Possible optimisation to linalg.norm? - -# from ifcopenshell.util.shape_builder import VectorType, SequenceOfVectors -from itertools import cycle -from collections import namedtuple -from math import sin, cos, radians +import numpy as np f = ifcopenshell.api.project.create_file() diff --git a/src/bonsai/test/bim/bootstrap.py b/src/bonsai/test/bim/bootstrap.py index 6d997bdd7fa..587b8f5a2db 100644 --- a/src/bonsai/test/bim/bootstrap.py +++ b/src/bonsai/test/bim/bootstrap.py @@ -19,19 +19,22 @@ import os import re -import bpy -import pytest import webbrowser -import bonsai.bim.handler -import bonsai.tool as tool + +import bpy import ifcopenshell import ifcopenshell.util.element import ifcopenshell.util.representation -from bonsai.bim.ifc import IfcStore +import pytest from mathutils import Vector +import bonsai.bim.handler +import bonsai.tool as tool +from bonsai.bim.ifc import IfcStore + # Monkey-patch webbrowser opening since we want to test headlessly webbrowser.open = lambda x: True +tool.Drawing.open_with_user_command = lambda x, y: True variables = {"cwd": os.getcwd(), "ifc": "IfcStore.get_file()"} diff --git a/src/bonsai/test/bim/feature/array.feature b/src/bonsai/test/bim/feature/array.feature new file mode 100644 index 00000000000..23fa4c0080f --- /dev/null +++ b/src/bonsai/test/bim/feature/array.feature @@ -0,0 +1,276 @@ +@array +Feature: Array + +Scenario: Add array + Given an empty IFC project + And I load the demo construction library + And I set "scene.BIMModelProperties.ifc_class" to "IfcColumnType" + And I add the construction type + When the object "IfcColumn/Column" is selected + And I look at the "Array" panel + And I see "No Array Found" + And I click "ADD" + Then the object "IfcColumn/Column" exists + And I see "Column" + And I see "1 Items" + And I don't see "No Array Found" + And the object "IfcColumn/Column" is at "0,0,0" + +Scenario: Enable editing array + Given an empty IFC project + And I load the demo construction library + And I set "scene.BIMModelProperties.ifc_class" to "IfcColumnType" + And I add the construction type + And the object "IfcColumn/Column" is selected + And I look at the "Array" panel + And I click "ADD" + When I click "GREASEPENCIL" + Then I see "Count" + And I see "Method" + And I don't see "1 Items" + +Scenario: Disable editing array + Given an empty IFC project + And I load the demo construction library + And I set "scene.BIMModelProperties.ifc_class" to "IfcColumnType" + And I add the construction type + And the object "IfcColumn/Column" is selected + And I look at the "Array" panel + And I click "ADD" + And I click "GREASEPENCIL" + When I click "CANCEL" + Then I see "1 Items" + And I don't see "Count" + +Scenario: Edit array + Given an empty IFC project + And I load the demo construction library + And I set "scene.BIMModelProperties.ifc_class" to "IfcColumnType" + And I add the construction type + And the object "IfcColumn/Column" is selected + And I look at the "Array" panel + And I click "ADD" + And I click "GREASEPENCIL" + When I set the "Count" property to "2" + And I click "CHECKMARK" + Then the object "IfcColumn/Column.001" is in the collection "IfcBuildingStorey/My Storey" + And the object "IfcColumn/Column" is at "0,0,0" + And the object "IfcColumn/Column.001" is at "0,0,0" + And the object "IfcColumn/Column" dimensions are "0.5,0.6,3" + +Scenario: Edit array - offset method + Given an empty IFC project + And I load the demo construction library + And I set "scene.BIMModelProperties.ifc_class" to "IfcColumnType" + And I add the construction type + And the object "IfcColumn/Column" is selected + And I look at the "Array" panel + And I click "ADD" + And I click "GREASEPENCIL" + When I set the "Count" property to "3" + And I set the "Method" property to "Offset" + And I set the "X" property to "1" + And I click "CHECKMARK" + Then the object "IfcColumn/Column.001" is in the collection "IfcBuildingStorey/My Storey" + And the object "IfcColumn/Column.002" is in the collection "IfcBuildingStorey/My Storey" + And the object "IfcColumn/Column" is at "0,0,0" + And the object "IfcColumn/Column.001" is at "1,0,0" + And the object "IfcColumn/Column.002" is at "2,0,0" + And the object "IfcColumn/Column" dimensions are "0.5,0.6,3" + And the object "IfcColumn/Column.001" dimensions are "0.5,0.6,3" + And the object "IfcColumn/Column.002" dimensions are "0.5,0.6,3" + +Scenario: Edit array - distribute method + Given an empty IFC project + And I load the demo construction library + And I set "scene.BIMModelProperties.ifc_class" to "IfcColumnType" + And I add the construction type + And the object "IfcColumn/Column" is selected + And I look at the "Array" panel + And I click "ADD" + And I click "GREASEPENCIL" + When I set the "Count" property to "3" + And I set the "Method" property to "Distribute" + And I set the "X" property to "2" + And I click "CHECKMARK" + Then the object "IfcColumn/Column.001" is in the collection "IfcBuildingStorey/My Storey" + And the object "IfcColumn/Column.002" is in the collection "IfcBuildingStorey/My Storey" + And the object "IfcColumn/Column" is at "0,0,0" + And the object "IfcColumn/Column.001" is at "1,0,0" + And the object "IfcColumn/Column.002" is at "2,0,0" + And the object "IfcColumn/Column" dimensions are "0.5,0.6,3" + And the object "IfcColumn/Column.001" dimensions are "0.5,0.6,3" + And the object "IfcColumn/Column.002" dimensions are "0.5,0.6,3" + +Scenario: Edit array - local space + Given an empty IFC project + And I load the demo construction library + And I set "scene.BIMModelProperties.ifc_class" to "IfcColumnType" + And I add the construction type + And the object "IfcColumn/Column" is rotated by "0,0,90" deg + And the object "IfcColumn/Column" is selected + And I look at the "Array" panel + And I click "ADD" + And I click "GREASEPENCIL" + When I set the "Count" property to "2" + And I set the "Method" property to "Offset" + And I set the "Use Local Space" property to "TRUE" + And I set the "X" property to "1" + And I click "CHECKMARK" + Then the object "IfcColumn/Column" is at "0,0,0" + And the object "IfcColumn/Column.001" is at "0,1,0" + +Scenario: Edit array - world space + Given an empty IFC project + And I load the demo construction library + And I set "scene.BIMModelProperties.ifc_class" to "IfcColumnType" + And I add the construction type + And the object "IfcColumn/Column" is rotated by "0,0,90" deg + And the object "IfcColumn/Column" is selected + And I look at the "Array" panel + And I click "ADD" + And I click "GREASEPENCIL" + When I set the "Count" property to "2" + And I set the "Method" property to "Offset" + And I set the "Use Local Space" property to "FALSE" + And I set the "X" property to "1" + And I click "CHECKMARK" + Then the object "IfcColumn/Column" is at "0,0,0" + And the object "IfcColumn/Column.001" is at "1,0,0" + +Scenario: Edit array - decrease count + Given an empty IFC project + And I load the demo construction library + And I set "scene.BIMModelProperties.ifc_class" to "IfcColumnType" + And I add the construction type + And the object "IfcColumn/Column" is selected + And I look at the "Array" panel + And I click "ADD" + And I click "GREASEPENCIL" + When I set the "Count" property to "3" + And I click "CHECKMARK" + And I click "GREASEPENCIL" + When I set the "Count" property to "2" + And I click "CHECKMARK" + Then the object "IfcColumn/Column.001" exists + And the object "IfcColumn/Column.002" does not exist + +Scenario: Edit array - multiple arrays + Given an empty IFC project + And I load the demo construction library + And I set "scene.BIMModelProperties.ifc_class" to "IfcColumnType" + And I add the construction type + And the object "IfcColumn/Column" is selected + And I look at the "Array" panel + And I click "ADD" + And I click "GREASEPENCIL" + When I set the "Count" property to "3" + And I set the "Method" property to "Offset" + And I set the "X" property to "1" + And I click "CHECKMARK" + And I see "3 Items" + And I click "ADD" + And I click the "GREASEPENCIL" after the text "1 Items (Offset)" + And I set the "Count" property to "2" + And I set the "Method" property to "Offset" + And I set the "Y" property to "1" + And I click the "CHECKMARK" after the text "Count" + Then I see "3 Items" + And I see "2 Items" + Then the object "IfcColumn/Column.001" is in the collection "IfcBuildingStorey/My Storey" + And the object "IfcColumn/Column.002" is in the collection "IfcBuildingStorey/My Storey" + And the object "IfcColumn/Column.003" is in the collection "IfcBuildingStorey/My Storey" + And the object "IfcColumn/Column.004" is in the collection "IfcBuildingStorey/My Storey" + And the object "IfcColumn/Column.005" is in the collection "IfcBuildingStorey/My Storey" + And the object "IfcColumn/Column" is at "0,0,0" + And the object "IfcColumn/Column.001" is at "1,0,0" + And the object "IfcColumn/Column.002" is at "2,0,0" + And the object "IfcColumn/Column.003" is at "0,1,0" + And the object "IfcColumn/Column.004" is at "1,1,0" + And the object "IfcColumn/Column.005" is at "2,1,0" + And the object "IfcColumn/Column" dimensions are "0.5,0.6,3" + And the object "IfcColumn/Column.001" dimensions are "0.5,0.6,3" + And the object "IfcColumn/Column.002" dimensions are "0.5,0.6,3" + And the object "IfcColumn/Column.003" dimensions are "0.5,0.6,3" + And the object "IfcColumn/Column.004" dimensions are "0.5,0.6,3" + And the object "IfcColumn/Column.005" dimensions are "0.5,0.6,3" + +Scenario: Remove array + Given an empty IFC project + And I load the demo construction library + And I set "scene.BIMModelProperties.ifc_class" to "IfcColumnType" + And I add the construction type + And the object "IfcColumn/Column" is selected + And I look at the "Array" panel + And I click "ADD" + And I click "GREASEPENCIL" + And I set the "Count" property to "2" + And I set the "Method" property to "Offset" + And I set the "X" property to "1" + And I click "CHECKMARK" + When I click "X" + Then the object "IfcColumn/Column" exists + And the object "IfcColumn/Column.001" does not exist + +Scenario: Regenerate array + Given an empty IFC project + And I load the demo construction library + And I set "scene.BIMModelProperties.ifc_class" to "IfcColumnType" + And I add the construction type + And the object "IfcColumn/Column" is selected + And I look at the "Array" panel + And I click "ADD" + And I click "GREASEPENCIL" + And I set the "Count" property to "2" + And I click "CHECKMARK" + When I click "FILE_REFRESH" + Then the object "IfcColumn/Column" exists + And the object "IfcColumn/Column.001" exists + +Scenario: Apply array + Given an empty IFC project + And I load the demo construction library + And I set "scene.BIMModelProperties.ifc_class" to "IfcColumnType" + And I add the construction type + And the object "IfcColumn/Column" is selected + And I look at the "Array" panel + And I click "ADD" + And I click "GREASEPENCIL" + And I set the "Count" property to "2" + And I click "CHECKMARK" + When I click "CHECKMARK" + Then the object "IfcColumn/Column" exists + And the object "IfcColumn/Column.001" exists + And I see "No Array Found" + +Scenario: Select array parent + Given an empty IFC project + And I load the demo construction library + And I set "scene.BIMModelProperties.ifc_class" to "IfcColumnType" + And I add the construction type + And the object "IfcColumn/Column" is selected + And I look at the "Array" panel + And I click "ADD" + And I click "GREASEPENCIL" + And I set the "Count" property to "2" + And I click "CHECKMARK" + When the object "IfcColumn/Column.001" is selected + And I click "OBJECT_DATA" + Then the object "IfcColumn/Column" is selected + And the object "IfcColumn/Column.001" is not selected + +Scenario: Select all array objects + Given an empty IFC project + And I load the demo construction library + And I set "scene.BIMModelProperties.ifc_class" to "IfcColumnType" + And I add the construction type + And the object "IfcColumn/Column" is selected + And I look at the "Array" panel + And I click "ADD" + And I click "GREASEPENCIL" + And I set the "Count" property to "2" + And I click "CHECKMARK" + When the object "IfcColumn/Column.001" is selected + And I click "RESTRICT_SELECT_OFF" + Then the object "IfcColumn/Column" is selected + And the object "IfcColumn/Column.001" is selected diff --git a/src/bonsai/test/bim/feature/covering.feature b/src/bonsai/test/bim/feature/covering.feature index 4eb97649daa..cefa554d412 100644 --- a/src/bonsai/test/bim/feature/covering.feature +++ b/src/bonsai/test/bim/feature/covering.feature @@ -2,7 +2,7 @@ Feature: Covering Covers covering tool. -Scenario: Execute generate flooring coverings from walls +Scenario: Add flooring from walls Given an empty IFC project And I load the demo construction library And I set "scene.BIMModelProperties.ifc_class" to "IfcWallType" @@ -24,9 +24,9 @@ Scenario: Execute generate flooring coverings from walls And the cursor is at "0,2.0,0" And I set "scene.BIMModelProperties.length" to "1.9" And I press "bim.add_occurrence" - # add_instance_flooring_coverings_from_walls is expecting FLOORING predefined type. + # Set COV30 predefined type to FLOORING. And the object "IfcCoveringType/COV30" is selected - And I look at the "Attributes" panel + And I look at the "Object Attributes" panel And I click "Edit" And I set the "PredefinedType" property to "FLOORING" And I click "Save Attributes" @@ -42,3 +42,108 @@ Scenario: Execute generate flooring coverings from walls Then the object "IfcCovering/Covering0" exists And the object "IfcCovering/Covering0" is at "1.8,1.05,0.0" And the object "IfcCovering/Covering0" dimensions are "3.4,1.9,0.03" + +Scenario: Add ceiling from walls + Given an empty IFC project + And I load the demo construction library + And I set "scene.BIMModelProperties.ifc_class" to "IfcWallType" + And the variable "element_type" is "[e for e in {ifc}.by_type('IfcWallType') if e.Name == 'WAL100'][0].id()" + And I set "scene.BIMModelProperties.relating_type_id" to "{element_type}" + And I press "bim.add_occurrence" + And the object "IfcWall/Wall" is selected + And I press "bim.change_layer_length(length=3.6)" + And the cursor is at "3.6,0.1,3" + And I set "scene.BIMModelProperties.length" to "2.0" + And I press "bim.add_occurrence" + And the cursor is at "3.5,2.1,3" + And I set "scene.BIMModelProperties.length" to "3.5" + And I press "bim.add_occurrence" + And the cursor is at "0,2.0,0" + And I set "scene.BIMModelProperties.length" to "1.9" + And I press "bim.add_occurrence" + # Set COV30 predefined type to CEILING. + And the object "IfcCoveringType/COV30" is selected + And I look at the "Object Attributes" panel + And I click "Edit" + And I set the "PredefinedType" property to "CEILING" + And I click "Save Attributes" + # Run the operator with ceiling height = 2.7 (default). + When the object "IfcWall/Wall" is selected + And additionally the object "IfcWall/Wall.001" is selected + And additionally the object "IfcWall/Wall.002" is selected + And additionally the object "IfcWall/Wall.003" is selected + And I set "scene.BIMModelProperties.ifc_class" to "IfcCoveringType" + And the variable "element_type" is "[e for e in {ifc}.by_type('IfcCoveringType') if e.Name == 'COV30'][0].id()" + And I set "scene.BIMModelProperties.relating_type_id" to "{element_type}" + And I press "bim.add_instance_ceiling_coverings_from_walls" + Then the object "IfcCovering/Covering0" exists + And the object "IfcCovering/Covering0" is at "1.8,1.05,2.7" + And the object "IfcCovering/Covering0" dimensions are "3.4,1.9,0.03" + +Scenario: Add flooring from cursor + Given an empty IFC project + And I load the demo construction library + And I set "scene.BIMModelProperties.ifc_class" to "IfcWallType" + And the variable "element_type" is "[e for e in {ifc}.by_type('IfcWallType') if e.Name == 'WAL100'][0].id()" + And I set "scene.BIMModelProperties.relating_type_id" to "{element_type}" + And I press "bim.add_occurrence" + And the cursor is at "1.1,0,0" + And I press "bim.add_occurrence" + And the object "IfcWall/Wall.001" is selected + And I press "bim.hotkey(hotkey='S_R')" + And the cursor is at "0,.9,0" + And I press "bim.add_occurrence" + And the cursor is at "-1,0,0" + And I press "bim.add_occurrence" + And the object "IfcWall/Wall.003" is selected + And I press "bim.hotkey(hotkey='S_R')" + And the object "IfcWall/Wall.003" is moved to "0,0,0" + # Set COV30 predefined type to FLOORING. + And the object "IfcCoveringType/COV30" is selected + And I look at the "Object Attributes" panel + And I click "Edit" + And I set the "PredefinedType" property to "FLOORING" + And I click "Save Attributes" + # Generate covering from cursor inside the room. + When the cursor is at "0.5,0.5,0" + And I deselect all objects + And I set "scene.BIMModelProperties.ifc_class" to "IfcCoveringType" + And the variable "element_type" is "[e for e in {ifc}.by_type('IfcCoveringType') if e.Name == 'COV30'][0].id()" + And I set "scene.BIMModelProperties.relating_type_id" to "{element_type}" + And I press "bim.add_instance_flooring_covering_from_cursor" + Then the object "IfcCovering/Covering" exists + And the object "IfcCovering/Covering" dimensions are "1,0.8,0.03" + +Scenario: Add ceiling from cursor + Given an empty IFC project + And I load the demo construction library + And I set "scene.BIMModelProperties.ifc_class" to "IfcWallType" + And the variable "element_type" is "[e for e in {ifc}.by_type('IfcWallType') if e.Name == 'WAL100'][0].id()" + And I set "scene.BIMModelProperties.relating_type_id" to "{element_type}" + And I press "bim.add_occurrence" + And the cursor is at "1.1,0,0" + And I press "bim.add_occurrence" + And the object "IfcWall/Wall.001" is selected + And I press "bim.hotkey(hotkey='S_R')" + And the cursor is at "0,.9,0" + And I press "bim.add_occurrence" + And the cursor is at "-1,0,0" + And I press "bim.add_occurrence" + And the object "IfcWall/Wall.003" is selected + And I press "bim.hotkey(hotkey='S_R')" + And the object "IfcWall/Wall.003" is moved to "0,0,0" + # Set COV30 predefined type to CEILING. + And the object "IfcCoveringType/COV30" is selected + And I look at the "Object Attributes" panel + And I click "Edit" + And I set the "PredefinedType" property to "CEILING" + And I click "Save Attributes" + # Generate covering from cursor inside the room. + When the cursor is at "0.5,0.5,0" + And I deselect all objects + And I set "scene.BIMModelProperties.ifc_class" to "IfcCoveringType" + And the variable "element_type" is "[e for e in {ifc}.by_type('IfcCoveringType') if e.Name == 'COV30'][0].id()" + And I set "scene.BIMModelProperties.relating_type_id" to "{element_type}" + And I press "bim.add_instance_ceiling_covering_from_cursor" + Then the object "IfcCovering/Covering" exists + And the object "IfcCovering/Covering" dimensions are "1,0.8,0.03" diff --git a/src/bonsai/test/bim/feature/document.feature b/src/bonsai/test/bim/feature/document.feature index 9b4a34cfb40..35509c23140 100644 --- a/src/bonsai/test/bim/feature/document.feature +++ b/src/bonsai/test/bim/feature/document.feature @@ -6,23 +6,6 @@ Scenario: Load project documents When I press "bim.load_project_documents" Then nothing happens -Scenario: Load document - Given an empty IFC project - And I press "bim.load_project_documents" - And I press "bim.add_information" - And the variable "information" is "{ifc}.by_type('IfcDocumentInformation')[-1].id()" - When I press "bim.load_document(document={information})" - Then nothing happens - -Scenario: Load parent document - Given an empty IFC project - And I press "bim.load_project_documents" - And I press "bim.add_information" - And the variable "information" is "{ifc}.by_type('IfcDocumentInformation')[-1].id()" - And I press "bim.load_document(document={information})" - When I press "bim.load_parent_document" - Then nothing happens - Scenario: Disable document editing UI Given an empty IFC project And I press "bim.load_project_documents" @@ -57,7 +40,8 @@ Scenario: Add document reference And I press "bim.load_project_documents" And I press "bim.add_information" And the variable "information" is "{ifc}.by_type('IfcDocumentInformation')[-1].id()" - And I press "bim.load_document(document={information})" + And I press "bim.load_project_documents" + And I set "scene.BIMDocumentProperties.active_document_index" to "1" When I press "bim.add_document_reference" Then nothing happens @@ -83,16 +67,12 @@ Scenario: Assign document And I press "bim.load_project_documents" And I press "bim.add_information" And the variable "information" is "{ifc}.by_type('IfcDocumentInformation')[-1].id()" - And I press "bim.load_document(document={information})" - And I press "bim.add_document_reference" - And the variable "reference" is "{ifc}.by_type('IfcDocumentReference')[-1].id()" And I add a cube And the object "Cube" is selected - And I look at the "Class" panel - And I set the "Products" property to "IfcElement" - And I set the "Class" property to "IfcWall" - And I click "Assign IFC Class" - When I press "bim.assign_document(document={reference})" + And I set "scene.BIMRootProperties.ifc_product" to "IfcElement" + And I set "scene.BIMRootProperties.ifc_class" to "IfcWall" + And I press "bim.assign_class" + When I press "bim.assign_document(document={information})" Then nothing happens Scenario: Unassign document @@ -100,15 +80,11 @@ Scenario: Unassign document And I press "bim.load_project_documents" And I press "bim.add_information" And the variable "information" is "{ifc}.by_type('IfcDocumentInformation')[-1].id()" - And I press "bim.load_document(document={information})" - And I press "bim.add_document_reference" - And the variable "reference" is "{ifc}.by_type('IfcDocumentReference')[-1].id()" And I add a cube And the object "Cube" is selected - And I look at the "Class" panel - And I set the "Products" property to "IfcElement" - And I set the "Class" property to "IfcWall" - And I click "Assign IFC Class" - And I press "bim.assign_document(document={reference})" - When I press "bim.unassign_document(document={reference})" - Then nothing happens + And I set "scene.BIMRootProperties.ifc_product" to "IfcElement" + And I set "scene.BIMRootProperties.ifc_class" to "IfcWall" + And I press "bim.assign_class" + And I press "bim.assign_document(document={information})" + When I press "bim.unassign_document(document={information})" + Then nothing happens \ No newline at end of file diff --git a/src/bonsai/test/bim/feature/drawing.feature b/src/bonsai/test/bim/feature/drawing.feature index 6a24168e4b5..0f0c5a3b170 100644 --- a/src/bonsai/test/bim/feature/drawing.feature +++ b/src/bonsai/test/bim/feature/drawing.feature @@ -3,12 +3,6 @@ Feature: Drawing Scenario: Duplicate drawing Given an empty IFC project - And I add a cube - And the object "Cube" is selected - And I look at the "Class" panel - And I set the "Products" property to "IfcElement" - And I set the "Class" property to "IfcWall" - And I click "Assign IFC Class" And I save IFC project And I look at the "Drawings" panel And I click "IMPORT" @@ -315,3 +309,130 @@ Scenario: Create sheet - with a drawing added to it And I click "IMAGE_PLANE" When I click "OUTPUT" Then the file "{ifc_dir}/sheets/A01 - UNTITLED.svg" should contain "IfcWall" + +Scenario: Enable editing text + Given an empty IFC project + And I add a cube + And the object "Cube" is selected + And I save IFC project + And I look at the "Drawings" panel + And I click "IMPORT" + And I click "ADD" + And I press "bim.toggle_target_view(option="EXPAND", target_view='PLAN_VIEW')" + And I select the "PLAN_VIEW" item in the "BIM_UL_drawinglist" list + And I click "VIEW_CAMERA_UNSELECTED" in the row where I see "PLAN_VIEW" in the "1st" list + And I press "bim.add_annotation" + And the object "IfcAnnotation/TEXT" is selected + And I look at the "BIM_PT_text" panel + When I click "Enable Editing Text" + Then I see "Literals:" + And I don't see "FontSize" + +Scenario: Disable editing text + Given an empty IFC project + And I add a cube + And the object "Cube" is selected + And I save IFC project + And I look at the "Drawings" panel + And I click "IMPORT" + And I click "ADD" + And I press "bim.toggle_target_view(option="EXPAND", target_view='PLAN_VIEW')" + And I select the "PLAN_VIEW" item in the "BIM_UL_drawinglist" list + And I click "VIEW_CAMERA_UNSELECTED" in the row where I see "PLAN_VIEW" in the "1st" list + And I press "bim.add_annotation" + And the object "IfcAnnotation/TEXT" is selected + And I look at the "BIM_PT_text" panel + And I click "Enable Editing Text" + When I click "CANCEL" + Then I see "FontSize" + And I don't see "Literals:" + +Scenario: Edit text - no changes + Given an empty IFC project + And I add a cube + And the object "Cube" is selected + And I save IFC project + And I look at the "Drawings" panel + And I click "IMPORT" + And I click "ADD" + And I press "bim.toggle_target_view(option="EXPAND", target_view='PLAN_VIEW')" + And I select the "PLAN_VIEW" item in the "BIM_UL_drawinglist" list + And I click "VIEW_CAMERA_UNSELECTED" in the row where I see "PLAN_VIEW" in the "1st" list + And I press "bim.add_annotation" + And the object "IfcAnnotation/TEXT" is selected + And I look at the "BIM_PT_text" panel + And I click "Enable Editing Text" + When I click "Edit Text" + Then I see "FontSize" + And I don't see "Literals:" + +Scenario: Edit text - change literal + Given an empty IFC project + And I add a cube + And the object "Cube" is selected + And I save IFC project + And I look at the "Drawings" panel + And I click "IMPORT" + And I click "ADD" + And I press "bim.toggle_target_view(option="EXPAND", target_view='PLAN_VIEW')" + And I select the "PLAN_VIEW" item in the "BIM_UL_drawinglist" list + And I click "VIEW_CAMERA_UNSELECTED" in the row where I see "PLAN_VIEW" in the "1st" list + And I press "bim.add_annotation" + And the object "IfcAnnotation/TEXT" is selected + And I look at the "BIM_PT_text" panel + And I click "Enable Editing Text" + And I set the "Literal" property to "Hello World" + When I click "Edit Text" + Then I see "Hello World" + +Scenario: Add text literal + Given an empty IFC project + And I add a cube + And the object "Cube" is selected + And I save IFC project + And I look at the "Drawings" panel + And I click "IMPORT" + And I click "ADD" + And I press "bim.toggle_target_view(option="EXPAND", target_view='PLAN_VIEW')" + And I select the "PLAN_VIEW" item in the "BIM_UL_drawinglist" list + And I click "VIEW_CAMERA_UNSELECTED" in the row where I see "PLAN_VIEW" in the "1st" list + And I press "bim.add_annotation" + And the object "IfcAnnotation/TEXT" is selected + And I look at the "BIM_PT_text" panel + And I click "Enable Editing Text" + And I click the "ADD" after the text "Literals:" + And I set the "2nd Literal" property to "New Literal" + When I click "Edit Text" + Then I see "New Literal" + +Scenario: Remove text literal + Given an empty IFC project + And I add a cube + And the object "Cube" is selected + And I save IFC project + And I look at the "Drawings" panel + And I click "IMPORT" + And I click "ADD" + And I press "bim.toggle_target_view(option="EXPAND", target_view='PLAN_VIEW')" + And I select the "PLAN_VIEW" item in the "BIM_UL_drawinglist" list + And I click "VIEW_CAMERA_UNSELECTED" in the row where I see "PLAN_VIEW" in the "1st" list + And I press "bim.add_annotation" + And the object "IfcAnnotation/TEXT" is selected + And I look at the "BIM_PT_text" panel + And I click "Enable Editing Text" + And I set the "Literal" property to "Keep This" + And I click the "ADD" after the text "Literals:" + And I set the "2nd Literal" property to "Remove This" + And I click "Edit Text" + And I click "Enable Editing Text" + When I click the "2nd" "X" + And I click "Edit Text" + Then I see "Keep This" + And I don't see "Remove This" + +Scenario: Add reference image + Given an empty IFC project + And I save IFC project + When I press "bim.add_reference_image(filepath='{cwd}/test/files/image.jpg', x_length=1, y_length=0.565)" + Then the object "IfcAnnotation/image" exists + And the object "IfcAnnotation/image" dimensions are "1.0,0.565,0." diff --git a/src/bonsai/test/bim/feature/material.feature b/src/bonsai/test/bim/feature/material.feature index 2f34cbb893f..67525cd8f3d 100644 --- a/src/bonsai/test/bim/feature/material.feature +++ b/src/bonsai/test/bim/feature/material.feature @@ -422,6 +422,24 @@ Scenario: Enable editing material set item When I press "bim.enable_editing_material_set_item(material_set_item={material_profile})" Then nothing happens +Scenario: Edit layer item defaults null IsVentilated to FALSE in UI + Given an empty IFC project + And I add a cube + And the object "Cube" is selected + And I look at the "Class" panel + And I set the "Products" property to "IfcElement" + And I set the "Class" property to "IfcWall" + And I click "Assign IFC Class" + And I press "bim.add_material()" + And I set "active_object.BIMObjectMaterialProperties.material_type" to "IfcMaterialLayerSet" + And I press "bim.assign_material" + And I press "bim.enable_editing_assigned_material" + And the variable "layer" is "{ifc}.by_type('IfcMaterialLayer')[0].id()" + And I press "bim.enable_editing_material_set_item(material_set_item={layer})" + When I evaluate expression "attrs = bpy.context.active_object.BIMObjectMaterialProperties.material_set_item_attributes; is_vent = next(a for a in attrs if a.name == 'IsVentilated'); assert is_vent.enum_value == 'FALSE'; assert is_vent.is_null is True" + And I press "bim.edit_material_set_item(material_set_item={layer})" + Then I evaluate expression "assert {ifc}.by_id({layer}).IsVentilated is None" + Scenario: Add material set layer Given an empty IFC project And I add a cube diff --git a/src/bonsai/test/bim/feature/model.feature b/src/bonsai/test/bim/feature/model.feature index 9ca843c1c5a..064620a5748 100644 --- a/src/bonsai/test/bim/feature/model.feature +++ b/src/bonsai/test/bim/feature/model.feature @@ -57,7 +57,7 @@ Scenario: Add one type from the Construction Type Browser Scenario: Add grid Given an empty IFC project - When I press "mesh.add_grid" + When I press "bim.add_grid" Then the object "IfcGrid/Grid" is an "IfcGrid" And the object "IfcGridAxis/A" is an "IfcGridAxis" And the object "IfcGridAxis/B" is an "IfcGridAxis" @@ -396,6 +396,44 @@ Scenario: Add a slab And the object "IfcSlab/Slab" bottom left corner is at "0,0,0" And the object "IfcSlab/Slab" top right corner is at "1,1,0.2" +Scenario: Extend walls to underside + Given an empty IFC project + And I load the demo construction library + And I set "scene.BIMModelProperties.ifc_class" to "IfcWallType" + And the variable "element_type" is "[e for e in {ifc}.by_type('IfcWallType') if e.Name == 'WAL100'][0].id()" + And I set "scene.BIMModelProperties.relating_type_id" to "{element_type}" + And I press "bim.add_occurrence" + And I set "scene.BIMModelProperties.ifc_class" to "IfcSlabType" + And the variable "element_type" is "[e for e in {ifc}.by_type('IfcSlabType') if e.Name == 'FLR200'][0].id()" + And I set "scene.BIMModelProperties.relating_type_id" to "{element_type}" + And I press "bim.add_occurrence" + And the object "IfcSlab/Slab" is moved to "0,0,2.5" + When the object "IfcWall/Wall" is selected + And additionally the object "IfcSlab/Slab" is selected + And I look at the tool header + And I click "Extend To Underside" + Then the object "IfcWall/Wall" dimensions are "1,0.1,2.5" + +Scenario: Extend walls to underside - extending to a tessellated gable roof + Given an empty IFC project + And I load the demo construction library + And I set "scene.BIMModelProperties.ifc_class" to "IfcWallType" + And the variable "element_type" is "[e for e in {ifc}.by_type('IfcWallType') if e.Name == 'WAL100'][0].id()" + And I set "scene.BIMModelProperties.relating_type_id" to "{element_type}" + And I press "bim.add_occurrence" + # Create gable roof: a cube turned into a prism with a ridge. + And I add a cube of size "1" at "0.5,0.05,3" + And the object "Cube" is selected + And I evaluate expression "obj = bpy.context.active_object; [setattr(v.co, 'y', 0) for v in obj.data.vertices if v.co.z > 0]" + And I set "scene.BIMRootProperties.ifc_product" to "IfcElement" + And I set "scene.BIMRootProperties.ifc_class" to "IfcRoof" + And I press "bim.assign_class" + When the object "IfcWall/Wall" is selected + And additionally the object "IfcRoof/Cube" is selected + And I look at the tool header + And I click "Extend To Underside" + Then the object "IfcWall/Wall" dimensions are "1,0.1,2.5" + Scenario: Enable editing a slab profile Given an empty IFC project And I load the demo construction library diff --git a/src/bonsai/test/bim/feature/project.feature b/src/bonsai/test/bim/feature/project.feature index cb9aeec21e6..0db6041b566 100644 --- a/src/bonsai/test/bim/feature/project.feature +++ b/src/bonsai/test/bim/feature/project.feature @@ -677,31 +677,43 @@ Scenario: Load project elements - all georeferencing coordinate situations with And the object "IfcActuator/J" has a vertex at "10.366,3.813,-1" And the object "IfcActuator/J" has a vertex at "12.298,4.331,-1" -Scenario: Link IFC +Scenario: Link IFC - from an empty IFC project Given an empty IFC project - When I link IFC project from "{cwd}/test/files/basic.ifc" + When I press "bim.link_ifc(filepath='{cwd}/test/files/basic.ifc')" Then "scene.BIMProjectProperties.links['{cwd}/test/files/basic.ifc'].is_loaded" is "True" And the collection "IfcProject/basic.ifc" exists And the object "Chunk" exists And the object "Chunk" is placed in the collection "IfcProject/basic.ifc" -Scenario: Link IFC - disabled false origin mode +Scenario: Link IFC - from an empty IFC project - automatic false origin mode (0,0,0 will be the false origin) Given an empty IFC project # Not currently possible via UI And I set "scene.BIMProjectProperties.distance_limit" to "5" - And I set "scene.BIMProjectProperties.false_origin_mode" to "DISABLED" - When I link IFC project from "{cwd}/test/files/geolocation.ifc" + And I set "scene.BIMProjectProperties.false_origin_mode" to "AUTOMATIC" + When I press "bim.link_ifc(filepath='{cwd}/test/files/geolocation.ifc', use_cache=False)" Then the object "Chunk" exists And the object "Chunk" has a vertex at "2,2,-1" And the object "Chunk" has a vertex at "9,-1,-1" And the object "Chunk" has a vertex at "17,4,-1" -Scenario: Link IFC - from an empty IFC project - automatic false origin mode (0,0,0 will be the false origin) +Scenario: Link IFC - from an empty IFC project - manual false origin mode Given an empty IFC project # Not currently possible via UI And I set "scene.BIMProjectProperties.distance_limit" to "5" - And I set "scene.BIMProjectProperties.false_origin_mode" to "AUTOMATIC" - When I link IFC project from "{cwd}/test/files/geolocation.ifc" + And I set "scene.BIMProjectProperties.false_origin_mode" to "MANUAL" + And I set "scene.BIMProjectProperties.false_origin" to "10000,0,0" + When I press "bim.link_ifc(filepath='{cwd}/test/files/geolocation.ifc', use_cache=False)" + Then the object "Chunk" exists + And the object "Chunk" has a vertex at "2,2,-1" + And the object "Chunk" has a vertex at "9,-1,-1" + And the object "Chunk" has a vertex at "17,4,-1" + +Scenario: Link IFC - from an empty IFC project - disabled false origin mode + Given an empty IFC project + # Not currently possible via UI + And I set "scene.BIMProjectProperties.distance_limit" to "5" + And I set "scene.BIMProjectProperties.false_origin_mode" to "DISABLED" + When I press "bim.link_ifc(filepath='{cwd}/test/files/geolocation.ifc', use_cache=False)" Then the object "Chunk" exists And the object "Chunk" has a vertex at "2,2,-1" And the object "Chunk" has a vertex at "9,-1,-1" @@ -712,31 +724,42 @@ Scenario: Link IFC - from an empty Blender session - automatic false origin mode # Not currently possible via UI And I set "scene.BIMProjectProperties.distance_limit" to "5" And I set "scene.BIMProjectProperties.false_origin_mode" to "AUTOMATIC" - When I link IFC project from "{cwd}/test/files/geolocation.ifc" + When I press "bim.link_ifc(filepath='{cwd}/test/files/geolocation.ifc', use_cache=False)" Then the object "Chunk" exists And the object "Chunk" has a vertex at "-11,-2,0" And the object "Chunk" has a vertex at "-4,-5,0" And the object "Chunk" has a vertex at "4,0,0" -Scenario: Link IFC - manual false origin mode +Scenario: Link IFC - from an empty Blender session - manual false origin mode Given an empty Blender session # Not currently possible via UI And I set "scene.BIMProjectProperties.distance_limit" to "5" And I set "scene.BIMProjectProperties.false_origin_mode" to "MANUAL" And I set "scene.BIMProjectProperties.false_origin" to "10000,0,0" - When I link IFC project from "{cwd}/test/files/geolocation.ifc" + When I press "bim.link_ifc(filepath='{cwd}/test/files/geolocation.ifc', use_cache=False)" Then the object "Chunk" exists And the object "Chunk" has a vertex at "-8,2,-1" And the object "Chunk" has a vertex at "-1,-1,-1" And the object "Chunk" has a vertex at "7,4,-1" -Scenario: Link IFC - automatic false origin mode - two different false origins and project norths - grid north is up because we start with geolocation.ifc +Scenario: Link IFC - from an empty Blender session - disabled false origin mode + Given an empty Blender session + # Not currently possible via UI + And I set "scene.BIMProjectProperties.distance_limit" to "5" + And I set "scene.BIMProjectProperties.false_origin_mode" to "DISABLED" + When I press "bim.link_ifc(filepath='{cwd}/test/files/geolocation.ifc', use_cache=False)" + Then the object "Chunk" exists + And the object "Chunk" has a vertex at "2,2,-1" + And the object "Chunk" has a vertex at "9,-1,-1" + And the object "Chunk" has a vertex at "17,4,-1" + +Scenario: Link IFC - from an empty Blender session - automatic false origin mode - two different false origins and project norths - grid north is up because we start with geolocation.ifc Given an empty Blender session # Not currently possible via UI And I set "scene.BIMProjectProperties.distance_limit" to "5" And I set "scene.BIMProjectProperties.false_origin_mode" to "AUTOMATIC" - When I link IFC project from "{cwd}/test/files/geolocation.ifc" - And I link IFC project from "{cwd}/test/files/geolocation-mapconversion-angle.ifc" + When I press "bim.link_ifc(filepath='{cwd}/test/files/geolocation.ifc', use_cache=False)" + And I press "bim.link_ifc(filepath='{cwd}/test/files/geolocation-mapconversion-angle.ifc', use_cache=False)" Then the object "Col:IfcProject/geolocation.ifc:Chunk" exists And the object "Col:IfcProject/geolocation-mapconversion-angle.ifc:Chunk" exists And the object "Col:IfcProject/geolocation.ifc:Chunk" has a vertex at "-11,-2,0" @@ -746,13 +769,13 @@ Scenario: Link IFC - automatic false origin mode - two different false origins a And the object "Col:IfcProject/geolocation-mapconversion-angle.ifc:Chunk" has a vertex at "9.294,-9.366,0" And the object "Col:IfcProject/geolocation-mapconversion-angle.ifc:Chunk" has a vertex at "18.722,-9.036,0" -Scenario: Link IFC - automatic false origin mode - two different false origins and project norths - project north is up because we start with geolocation-mapconversion-angle.ifc +Scenario: Link IFC - from an empty Blender session - automatic false origin mode - two different false origins and project norths - project north is up because we start with geolocation-mapconversion-angle.ifc Given an empty Blender session # Not currently possible via UI And I set "scene.BIMProjectProperties.distance_limit" to "5" And I set "scene.BIMProjectProperties.false_origin_mode" to "AUTOMATIC" - When I link IFC project from "{cwd}/test/files/geolocation-mapconversion-angle.ifc" - And I link IFC project from "{cwd}/test/files/geolocation.ifc" + When I press "bim.link_ifc(filepath='{cwd}/test/files/geolocation-mapconversion-angle.ifc', use_cache=False)" + And I press "bim.link_ifc(filepath='{cwd}/test/files/geolocation.ifc', use_cache=False)" Then the object "Col:IfcProject/geolocation.ifc:Chunk" exists And the object "Col:IfcProject/geolocation-mapconversion-angle.ifc:Chunk" exists And the object "Col:IfcProject/geolocation-mapconversion-angle.ifc:Chunk" has a vertex at "-11,-2,0" @@ -762,14 +785,14 @@ Scenario: Link IFC - automatic false origin mode - two different false origins a And the object "Col:IfcProject/geolocation.ifc:Chunk" has a vertex at "-17.696,-7.866,0" And the object "Col:IfcProject/geolocation.ifc:Chunk" has a vertex at "-13.268,0.464,0" -Scenario: Link IFC - automatic false origin mode - three identical false origins but different project and map units +Scenario: Link IFC - from an empty Blender session - automatic false origin mode - three identical false origins but different project and map units Given an empty Blender session # Not currently possible via UI And I set "scene.BIMProjectProperties.distance_limit" to "5" And I set "scene.BIMProjectProperties.false_origin_mode" to "AUTOMATIC" - When I link IFC project from "{cwd}/test/files/geolocation-unit1.ifc" - And I link IFC project from "{cwd}/test/files/geolocation-unit2.ifc" - And I link IFC project from "{cwd}/test/files/geolocation-unit3.ifc" + When I press "bim.link_ifc(filepath='{cwd}/test/files/geolocation-unit1.ifc', use_cache=False)" + And I press "bim.link_ifc(filepath='{cwd}/test/files/geolocation-unit2.ifc', use_cache=False)" + And I press "bim.link_ifc(filepath='{cwd}/test/files/geolocation-unit3.ifc', use_cache=False)" Then the object "Col:IfcProject/geolocation-unit1.ifc:Chunk" exists And the object "Col:IfcProject/geolocation-unit2.ifc:Chunk" exists And the object "Col:IfcProject/geolocation-unit3.ifc:Chunk" exists @@ -779,54 +802,54 @@ Scenario: Link IFC - automatic false origin mode - three identical false origins Scenario: Toggle link visibility - wireframe mode Given an empty IFC project - And I link IFC project from "{cwd}/test/files/basic.ifc" - When I press "bim.toggle_link_visibility(link='{cwd}/test/files/basic.ifc', mode='WIREFRAME')" + And I press "bim.link_ifc(filepath='{cwd}/test/files/basic.ifc')" + When I press "bim.toggle_link_visibility(link_index=0, mode='WIREFRAME')" Then "scene.BIMProjectProperties.links['{cwd}/test/files/basic.ifc'].is_wireframe" is "True" And the object "Chunk" should display as "WIRE" - When I press "bim.toggle_link_visibility(link='{cwd}/test/files/basic.ifc', mode='WIREFRAME')" + When I press "bim.toggle_link_visibility(link_index=0, mode='WIREFRAME')" Then "scene.BIMProjectProperties.links['{cwd}/test/files/basic.ifc'].is_wireframe" is "False" And the object "Chunk" should display as "TEXTURED" Scenario: Toggle link selectability Given an empty IFC project - And I link IFC project from "{cwd}/test/files/basic.ifc" - When I press "bim.toggle_link_selectability(link='{cwd}/test/files/basic.ifc')" + And I press "bim.link_ifc(filepath='{cwd}/test/files/basic.ifc')" + When I press "bim.toggle_link_selectability(link_index=0)" Then "scene.BIMProjectProperties.links['{cwd}/test/files/basic.ifc'].is_selectable" is "False" And the collection "IfcProject/basic.ifc" is unselectable - When I press "bim.toggle_link_selectability(link='{cwd}/test/files/basic.ifc')" + When I press "bim.toggle_link_selectability(link_index=0)" Then "scene.BIMProjectProperties.links['{cwd}/test/files/basic.ifc'].is_selectable" is "True" And the collection "IfcProject/basic.ifc" is selectable Scenario: Toggle link visibility - visible mode Given an empty IFC project - And I link IFC project from "{cwd}/test/files/basic.ifc" - When I press "bim.toggle_link_visibility(link='{cwd}/test/files/basic.ifc', mode='VISIBLE')" + And I press "bim.link_ifc(filepath='{cwd}/test/files/basic.ifc')" + When I press "bim.toggle_link_visibility(link_index=0, mode='VISIBLE')" Then "scene.BIMProjectProperties.links['{cwd}/test/files/basic.ifc'].is_hidden" is "True" And the object "IfcProject/basic.ifc" is not visible - When I press "bim.toggle_link_visibility(link='{cwd}/test/files/basic.ifc', mode='VISIBLE')" + When I press "bim.toggle_link_visibility(link_index=0, mode='VISIBLE')" Then "scene.BIMProjectProperties.links['{cwd}/test/files/basic.ifc'].is_hidden" is "False" And the object "IfcProject/basic.ifc" is visible Scenario: Unload link Given an empty Blender session - And I link IFC project from "{cwd}/test/files/basic.ifc" - When I press "bim.unload_link(filepath='{cwd}/test/files/basic.ifc')" + And I press "bim.link_ifc(filepath='{cwd}/test/files/basic.ifc')" + When I press "bim.unload_link(link_index=0)" Then "scene.BIMProjectProperties.links['{cwd}/test/files/basic.ifc'].is_loaded" is "False" And the collection "IfcProject/basic.ifc" does not exist Scenario: Load link Given an empty Blender session - And I link IFC project from "{cwd}/test/files/basic.ifc" - And I press "bim.unload_link(filepath='{cwd}/test/files/basic.ifc')" - When I press "bim.load_link(filepath='{cwd}/test/files/basic.ifc')" + And I press "bim.link_ifc(filepath='{cwd}/test/files/basic.ifc')" + And I press "bim.unload_link(link_index=0)" + When I press "bim.load_link(link_index=0)" Then "scene.BIMProjectProperties.links['{cwd}/test/files/basic.ifc'].is_loaded" is "True" And the object "IfcProject/basic.ifc" exists Scenario: Unlink IFC Given an empty Blender session - And I link IFC project from "{cwd}/test/files/basic.ifc" - And I press "bim.unload_link(filepath='{cwd}/test/files/basic.ifc')" - When I press "bim.unlink_ifc(filepath='{cwd}/test/files/basic.ifc')" + And I press "bim.link_ifc(filepath='{cwd}/test/files/basic.ifc')" + And I press "bim.unload_link(link_index=0)" + When I press "bim.unlink_ifc(link_index=0)" Then "scene.BIMProjectProperties.links.get('{cwd}/test/files/basic.ifc')" is "None" And "scene.collection.children.get('IfcProject/basic.ifc')" is "None" And the object "Chunk" does not exist @@ -891,7 +914,7 @@ Scenario: Export IFC - with moved object location synchronised Scenario: Export IFC - with moved grid axis location synchronised Given an empty IFC project - And I press "mesh.add_grid" + And I press "bim.add_grid" When the object "IfcGridAxis/01" is moved to "1,0,0" And I save IFC project And I load previously saved IFC project diff --git a/src/bonsai/test/bim/feature/spatial.feature b/src/bonsai/test/bim/feature/spatial.feature index 2b3020ea23b..3ed7a80b945 100644 --- a/src/bonsai/test/bim/feature/spatial.feature +++ b/src/bonsai/test/bim/feature/spatial.feature @@ -74,6 +74,50 @@ Scenario: Assign container When I click "CHECKMARK" Then the object "IfcWall/Cube" is in the collection "IfcSite/My Site" +Scenario: Assign container - assign an aggregate which also affects children + Given an empty IFC project + And I add a cube + And the object "Cube" is selected + And I look at the "Class" panel + And I set the "Products" property to "IfcElement" + And I set the "Class" property to "IfcWall" + And I click "Assign IFC Class" + And the object "IfcWall/Cube" is selected + When I press "bim.add_aggregate" + Then the object "IfcElementAssembly/Default_Name" exists + And the object "IfcElementAssembly/Default_Name" is contained in object "IfcBuildingStorey/My Storey" + When I look at the "Spatial Decomposition" panel + And I select the "My Site" item in the "BIM_UL_containers_manager" list + And I click "Set Default" + And the object "IfcWall/Cube" is selected + And I look at the "Spatial Container" panel + And I click "GREASEPENCIL" + And I click "CHECKMARK" + Then the object "IfcWall/Cube" is in the collection "IfcSite/My Site" + And the object "IfcElementAssembly/Default_Name" is in the collection "IfcSite/My Site" + +Scenario: Assign container - assign a child which also affects parents + Given an empty IFC project + And I add a cube + And the object "Cube" is selected + And I look at the "Class" panel + And I set the "Products" property to "IfcElement" + And I set the "Class" property to "IfcWall" + And I click "Assign IFC Class" + And the object "IfcWall/Cube" is selected + When I press "bim.add_aggregate" + Then the object "IfcElementAssembly/Default_Name" exists + And the object "IfcElementAssembly/Default_Name" is contained in object "IfcBuildingStorey/My Storey" + When I look at the "Spatial Decomposition" panel + And I select the "My Site" item in the "BIM_UL_containers_manager" list + And I click "Set Default" + And the object "IfcElementAssembly/Default_Name" is selected + And I look at the "Spatial Container" panel + And I click "GREASEPENCIL" + And I click "CHECKMARK" + Then the object "IfcWall/Cube" is in the collection "IfcSite/My Site" + And the object "IfcElementAssembly/Default_Name" is in the collection "IfcSite/My Site" + Scenario: Copy to container Given an empty IFC project And I add a cube diff --git a/src/bonsai/test/bim/feature/type.feature b/src/bonsai/test/bim/feature/type.feature index 1efefef4469..9bae601b30b 100644 --- a/src/bonsai/test/bim/feature/type.feature +++ b/src/bonsai/test/bim/feature/type.feature @@ -110,7 +110,7 @@ Scenario: Assign type - assign to a type with a material layer set, which automa And the object "IfcWall/Unnamed" has a "100" thick layered material containing the material "Default" And the object "IfcWall/Unnamed" dimensions are ".5,.1,.5" -Scenario: Assign type - assign to a different type with a material layer set +Scenario: Assign type - assign to a different type with a LAYER2 material layer set Given an empty IFC project And I add a cube And the object "Cube" is selected @@ -149,6 +149,23 @@ Scenario: Assign type - assign to a different type with a material layer set Then the object "IfcWall/Cube" has a "200" thick layered material containing the material "Default" And the object "IfcWall/Cube" dimensions are "1,.2,1" +Scenario: Assign type - assign to a different type with a LAYER3 material layer set + Given an empty IFC project + And I load the demo construction library + And I set "scene.BIMModelProperties.ifc_class" to "IfcSlabType" + And the variable "element_type" is "[e for e in {ifc}.by_type('IfcSlabType') if e.Name == 'FLR200'][0].id()" + And I set "scene.BIMModelProperties.relating_type_id" to "{element_type}" + When I press "bim.add_occurrence" + Then the object "IfcSlab/Slab" is an "IfcSlab" + And the object "IfcSlab/Slab" dimensions are "1,1,0.2" + And the object "IfcSlab/Slab" bottom left corner is at "0,0,0" + And the object "IfcSlab/Slab" top right corner is at "1,1,0.2" + When I look at the "Type" panel + And I click "GREASEPENCIL" + And I set the "relating_type" property to "FLR300" + And I click "CHECKMARK" + Then the object "IfcSlab/Slab" dimensions are "1,1,0.3" + Scenario: Assign type - assign to a type with a material profile set Given an empty IFC project And I add a cube diff --git a/src/bonsai/test/bim/module/drawing/test_segment_clipping.py b/src/bonsai/test/bim/module/drawing/test_segment_clipping.py index 2a30f6a957a..2846a3f2b70 100644 --- a/src/bonsai/test/bim/module/drawing/test_segment_clipping.py +++ b/src/bonsai/test/bim/module/drawing/test_segment_clipping.py @@ -18,8 +18,8 @@ import pytest from mathutils import Vector -from bonsai.bim.module.drawing.helper import clip_segment +from bonsai.bim.module.drawing.helper import clip_segment BOUNDS = (10, 30, 10, 30, None, None) diff --git a/src/bonsai/test/bim/stub.py b/src/bonsai/test/bim/stub.py index a5c498f81e1..969cf98cbe5 100644 --- a/src/bonsai/test/bim/stub.py +++ b/src/bonsai/test/bim/stub.py @@ -17,7 +17,7 @@ # along with Bonsai. If not, see . -from typing import Union, Any, Optional +from typing import Any, Optional, Union class bSDDClientStub: diff --git a/src/bonsai/test/bim/test_feature.py b/src/bonsai/test/bim/test_feature.py index fa5ccb36d04..79e8494441b 100644 --- a/src/bonsai/test/bim/test_feature.py +++ b/src/bonsai/test/bim/test_feature.py @@ -17,31 +17,34 @@ # along with Bonsai. If not, see . from __future__ import annotations + import os -import types -import bpy -import pytest -import shutil import pprint +import shutil import traceback +import types import webbrowser -import numpy as np -import test.bim.stub +from collections.abc import Generator +from inspect import signature +from math import radians +from pathlib import Path +from typing import Any, Union + +import bpy import ifcopenshell import ifcopenshell.util.element import ifcopenshell.util.representation -import bonsai.tool as tool +import numpy as np +import pytest +from mathutils import Vector +from pytest_bdd import given, parsers, scenarios, then, when + import bonsai.bim.handler -from collections.abc import Generator +import bonsai.tool as tool +import test.bim.stub from bonsai.bim.ifc import IfcStore -from bonsai.tool.brick import BrickStore from bonsai.bim.module.model.data import AuthoringData -from pytest_bdd import scenarios, given, when, then, parsers -from inspect import signature -from mathutils import Vector -from math import radians -from pathlib import Path -from typing import Union, Any +from bonsai.tool.brick import BrickStore scenarios("feature") @@ -67,10 +70,7 @@ as resets the ``bpy.context`` and some it's members become `None`. """ -TMP = Path.cwd() / "test/files/temp" -TEST_FILES_DIR = Path.cwd() / "test/files" - -CLEAN_LINKED_FILES_CACHE = False +TMP = Path(f"{variables['cwd']}/test/files/temp") EPSET_DRAWING = Path.cwd() / "bonsai/bim/data/pset/EPset_Drawing.ifc" EPSET_DRAWING_BYTES = EPSET_DRAWING.read_bytes() @@ -96,7 +96,11 @@ def refresh_spy(self) -> None: def __getattr__(self, attr: str) -> PanelSpy | Any: self.spied_attr = attr - if annotation := self.blender_panel.__annotations__.get(attr, None): + try: + annotations = self.blender_panel.__annotations__ + except AttributeError: + annotations = type(self.blender_panel).__annotations__ + if annotation := annotations.get(attr, None): return annotation.keywords.get("default", None) # An operator property if attr == "layout": return self @@ -129,14 +133,22 @@ def __call__(self, *args: Any, **kwargs: Any) -> PanelSpy | TemplateListSpy | Op self.spied_labels.append(kwargs["text"]) return self elif self.spied_attr == "prop": - props, name = args + if args: + props, name = args + else: + props = kwargs.get("data") + name = kwargs.get("property") props: bpy.types.bpy_struct text = kwargs.get("text", props.bl_rna.properties[name].name) icon = kwargs.get("icon", None) prop_type = props.bl_rna.properties[name].type enum_items = [] if prop_type == "ENUM": - prop_keywords = props.__annotations__[name].keywords + try: + annotations = props.__annotations__ + except AttributeError: + annotations = type(props).__annotations__ + prop_keywords = annotations[name].keywords items = prop_keywords.get("items") if items is not None: if isinstance(items, (list, tuple)): @@ -234,7 +246,7 @@ def __init__(self, parent: TemplateListSpy, item): self.spied_props: list[dict[str, Any]] = [] self.spied_operators: list[dict[str, Any]] = [] if len(signature(blender_panel.draw_item).parameters) == 8: - blender_panel.draw_item( + blender_panel.draw_item( # ty:ignore[missing-argument] self, bpy.context, self, @@ -272,6 +284,8 @@ def create_ui_name_cache(): try: panel_type = getattr(bpy.types, bl_idname) if panel_type.bl_rna.base.name == "Panel": + if "_tab_" in panel_type.bl_idname: + continue # Tab panels are just groups and not relevant in testing ui_name_cache[panel_type.bl_label] = panel_type.bl_idname elif panel_type.bl_rna.base.name == "Operator": ui_name_cache[panel_type.bl_label] = bl_idname @@ -300,25 +314,6 @@ def vectors_are_equal(v1, v2): return all(is_x(v1[i], v2[i]) for i in range(len(v1))) -@pytest.fixture(scope="function", autouse=True) -def run_for_each_test() -> Generator[None]: - # Code before this runs before each test - yield - # Code after this runs after each test - - global CLEAN_LINKED_FILES_CACHE - if CLEAN_LINKED_FILES_CACHE: - for filepath in TEST_FILES_DIR.glob("*.ifc.cache.*"): - filepath.unlink() - CLEAN_LINKED_FILES_CACHE = False - - # pset_template tests are editing EPset_Drawing.ifc, so we need to restore it. - global RELOAD_EPSET_DRAWING - if RELOAD_EPSET_DRAWING: - EPSET_DRAWING.write_bytes(EPSET_DRAWING_BYTES) - RELOAD_EPSET_DRAWING = False - - @given("an untestable scenario") def an_untestable_scenario(): pass @@ -329,7 +324,7 @@ def an_untestable_scenario(): def an_empty_blender_session(): IfcStore.purge() if not PYTEST_BLENDER_NO_BACKGROUND: - bpy.ops.wm.read_homefile(app_template="") + bpy.ops.wm.read_homefile(app_template="", use_factory_startup=True) if len(bpy.data.objects) > 0: bpy.data.batch_remove(bpy.data.objects) bpy.ops.outliner.orphans_purge(do_local_ids=True, do_linked_ids=True, do_recursive=True) @@ -373,16 +368,6 @@ def saving_ifc_project() -> None: tool.Project.save_test_project() -@given(parsers.parse('I link IFC project from "{filepath}"')) -@when(parsers.parse('I link IFC project from "{filepath}"')) -@then(parsers.parse('I link IFC project from "{filepath}"')) -def i_link_ifc_project_from_filepath(filepath: str) -> None: - global CLEAN_LINKED_FILES_CACHE - filepath = replace_variables(filepath) - CLEAN_LINKED_FILES_CACHE = True - bpy.ops.bim.link_ifc(filepath=filepath, use_cache=False) - - @given("the Brickschema is stubbed") def the_brickschema_is_stubbed(): # This makes things run faster since we don't need to load the entire brick schema @@ -397,7 +382,7 @@ def i_look_at_the_panel_panel(panel: str) -> None: # Option to provide explicit panel name if panel names overlap. panel_class = getattr(bpy.types, panel, None) - if panel_class is None: + if panel_class is None or panel_class.bl_rna.base.name not in ("Panel", "Operator", "Menu", "UIList"): global ui_name_cache create_ui_name_cache() if panel not in ui_name_cache: @@ -409,6 +394,32 @@ def i_look_at_the_panel_panel(panel: str) -> None: panel_spy.refresh_spy() +@given(parsers.parse("I look at the tool header")) +@when(parsers.parse("I look at the tool header")) +@then(parsers.parse("I look at the tool header")) +def i_look_at_the_tool_header() -> None: + from bonsai.bim.module.model.workspace import EditObjectUI + + class MockRegion: + type = "UI" + + class MockContext: + def __getattr__(self, name): + if name == "region": + return MockRegion() + return getattr(bpy.context, name) + + global panel_spy + panel_spy = PanelSpy(EditObjectUI) + panel_spy.is_spy_dirty = False + panel_spy.spied_attr = None + panel_spy.spied_labels = [] + panel_spy.spied_props = [] + panel_spy.spied_operators = [] + panel_spy.spied_lists = [] + EditObjectUI.draw(MockContext(), panel_spy) + + @given(parsers.parse('I open the "{name}" menu')) @when(parsers.parse('I open the "{name}" menu')) @then(parsers.parse('I open the "{name}" menu')) @@ -629,8 +640,9 @@ def i_see_the_prop_property_is_value(prop, value): @then(parsers.parse('I set the "{prop}" property to "{value}"')) def i_set_the_prop_property_to_value(prop: str, value: str): """ - :param prop: Could be either property name, property text, property icon - or property index (e.g. "1st", "2nd", "5th"). + :param prop: Could be either property name, property text, property icon, + property index (e.g. "1st", "2nd", "5th"), or Nth named property + (e.g. "2nd Literal" for the 2nd property called "Literal"). :param value: For boolean propeties - 'TRUE' or 'FALSE'. """ @@ -638,12 +650,28 @@ def i_set_the_prop_property_to_value(prop: str, value: str): assert panel_spy panel_spy.refresh_spy() is_nth = False - if prop[0].isnumeric() and prop.endswith(("st", "nd", "th")): + is_nth_named = False + nth_target = 0 + prop_name = prop + if " " in prop and prop[0].isnumeric(): + parts = prop.split(" ", 1) + if parts[0].endswith(("st", "nd", "th")): + is_nth_named = True + nth_target = int(parts[0][:-2]) - 1 + prop_name = parts[1] + elif prop[0].isnumeric() and prop.endswith(("st", "nd", "th")): is_nth = True + named_count = 0 for nth, spied_prop in enumerate(panel_spy.spied_props): if is_nth and nth != int(prop[:-2]) - 1: continue - if not is_nth and prop not in (spied_prop["name"], spied_prop["text"], spied_prop["icon"]): + if is_nth_named: + if prop_name not in (spied_prop["name"], spied_prop["text"], spied_prop["icon"]): + continue + if named_count != nth_target: + named_count += 1 + continue + elif not is_nth and prop not in (spied_prop["name"], spied_prop["text"], spied_prop["icon"]): continue if spied_prop["prop_type"] == "BOOLEAN": if value == "TRUE": @@ -892,6 +920,29 @@ def i_click_button(button): _i_click_button_on_panel(button, panel_spy) +@given(parsers.parse('I click the "{nth}" "{button}"')) +@when(parsers.parse('I click the "{nth}" "{button}"')) +@then(parsers.parse('I click the "{nth}" "{button}"')) +def i_click_the_nth_button(nth, button): + """ + :param nth: Ordinal like "1st", "2nd", "3rd" to select the Nth matching button. + :param button: The text or icon of the button to click. + """ + assert panel_spy + panel_spy.refresh_spy() + target = int(nth[:-2]) - 1 + count = 0 + for spied_operator in panel_spy.spied_operators: + if spied_operator["text"] == button or spied_operator["icon"] == button: + if count == target: + spied_operator["operator"]("INVOKE_DEFAULT", **spied_operator["kwargs"]) + panel_spy.is_spy_dirty = True + return + count += 1 + debug = "\n".join([f"{i} {v}" for i, v in enumerate(panel_spy.spied_operators)]) + assert False, f"Could not find {nth} {button}:\n{debug}" + + @given(parsers.parse('I click the "{button}" after the text "{text}"')) @when(parsers.parse('I click the "{button}" after the text "{text}"')) @then(parsers.parse('I click the "{button}" after the text "{text}"')) @@ -1576,10 +1627,19 @@ def the_object_name_has_a_vertex_at_location(name, location): is_pass = False target = Vector([float(co) for co in location.split(",")]) verts = [] - for v in obj.data.vertices: - verts.append(obj.matrix_world @ v.co) - if (verts[-1] - target).length < 0.001: - is_pass = True + depsgraph = bpy.context.evaluated_depsgraph_get() + obj_eval = obj.evaluated_get(depsgraph) + mesh = obj_eval.to_mesh(preserve_all_data_layers=False, depsgraph=depsgraph) + try: + for inst in depsgraph.object_instances: + if inst.object.original is obj: + mw = inst.matrix_world + for i, v in enumerate(mesh.vertices): + verts.append(mw @ v.co) + if (verts[-1] - target).length < 0.001: + is_pass = True + finally: + obj_eval.to_mesh_clear() assert is_pass, f"No verts found at {location}: {verts}" diff --git a/src/bonsai/test/core/bootstrap.py b/src/bonsai/test/core/bootstrap.py index 837ce67b948..cd8371e1c33 100644 --- a/src/bonsai/test/core/bootstrap.py +++ b/src/bonsai/test/core/bootstrap.py @@ -16,11 +16,13 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . -import sys import json +import sys +from typing import Any, Literal, Optional, Self, TypedDict + import pytest + import bonsai.core.tool -from typing import Any, Optional, TypedDict, Literal, Self @pytest.fixture @@ -100,6 +102,13 @@ def geometry(): prophet.verify() +@pytest.fixture +def ifcgit(): + prophet = Prophecy(bonsai.core.tool.IfcGit) + yield prophet + prophet.verify() + + @pytest.fixture def georeference(): prophet = Prophecy(bonsai.core.tool.Georeference) @@ -135,6 +144,13 @@ def misc(): prophet.verify() +@pytest.fixture +def model(): + prophet = Prophecy(bonsai.core.tool.Model) + yield prophet + prophet.verify() + + @pytest.fixture def nest(): prophet = Prophecy(bonsai.core.tool.Nest) diff --git a/src/bonsai/test/core/test_aggregate.py b/src/bonsai/test/core/test_aggregate.py index 157b1c3999b..4e7babe13a2 100644 --- a/src/bonsai/test/core/test_aggregate.py +++ b/src/bonsai/test/core/test_aggregate.py @@ -17,7 +17,7 @@ # along with Bonsai. If not, see . import bonsai.core.aggregate as subject -from test.core.bootstrap import ifc, aggregate, collector +from test.core.bootstrap import aggregate, collector, ifc class TestEnableEditingAggregate: diff --git a/src/bonsai/test/core/test_attribute.py b/src/bonsai/test/core/test_attribute.py index aba74e1a4eb..d62b832cd9e 100644 --- a/src/bonsai/test/core/test_attribute.py +++ b/src/bonsai/test/core/test_attribute.py @@ -17,7 +17,7 @@ # along with Bonsai. If not, see . import bonsai.core.attribute as subject -from test.core.bootstrap import ifc, blender, root, spatial +from test.core.bootstrap import blender, ifc, root, spatial class TestCopyAttributeToSelection: diff --git a/src/bonsai/test/core/test_brick.py b/src/bonsai/test/core/test_brick.py index 10a4a7cfd17..c40df069734 100644 --- a/src/bonsai/test/core/test_brick.py +++ b/src/bonsai/test/core/test_brick.py @@ -17,7 +17,7 @@ # along with Bonsai. If not, see . import bonsai.core.brick as subject -from test.core.bootstrap import ifc, brick +from test.core.bootstrap import brick, ifc class TestLoadBrickProject: diff --git a/src/bonsai/test/core/test_context.py b/src/bonsai/test/core/test_context.py index 7388754765e..2fd9e05834d 100644 --- a/src/bonsai/test/core/test_context.py +++ b/src/bonsai/test/core/test_context.py @@ -17,7 +17,7 @@ # along with Bonsai. If not, see . import bonsai.core.context as subject -from test.core.bootstrap import ifc, context +from test.core.bootstrap import context, ifc class TestAddContext: diff --git a/src/bonsai/test/core/test_document.py b/src/bonsai/test/core/test_document.py index 48421c1fe4a..bd9f743a3d6 100644 --- a/src/bonsai/test/core/test_document.py +++ b/src/bonsai/test/core/test_document.py @@ -16,30 +16,18 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . - import bonsai.core.document as subject -from test.core.bootstrap import ifc, document +from test.core.bootstrap import document, ifc class TestLoadProjectDocuments: def test_run(self, document): document.clear_document_tree().should_be_called() document.import_project_documents().should_be_called() - document.clear_breadcrumbs().should_be_called() document.enable_editing_ui().should_be_called() subject.load_project_documents(document) -class TestLoadDocument: - def test_run(self, document): - document.clear_document_tree().should_be_called() - document.import_subdocuments("document").should_be_called() - document.import_references("document").should_be_called() - document.disable_editing_document().should_be_called() - document.add_breadcrumb("document").should_be_called() - subject.load_document(document, document="document") - - class TestDisableDocumentEditingUi: def test_run(self, document): document.disable_editing_ui().should_be_called() @@ -47,45 +35,71 @@ def test_run(self, document): subject.disable_document_editing_ui(document) +class TestDisableObjectDocumentEditingUi: + def test_run(self, document): + document.disable_object_editing_ui().should_be_called() + subject.disable_object_document_editing_ui(document) + + class TestEnableEditingDocument: def test_run(self, document): - document.import_document_attributes("document").should_be_called() document.set_active_document("document").should_be_called() - subject.enable_editing_document(document, document="document") + document.import_document_attributes("document").should_be_called() + subject.enable_editing_document(document, ifc_document="document") class TestDisableEditingDocument: def test_run(self, document): - document.disable_editing_document().should_be_called() + document.clear_active_document().should_be_called() + document.clear_document_attributes().should_be_called() subject.disable_editing_document(document) class TestAddInformation: def test_add_and_reload_tree_at_project_root(self, ifc, document): document.clear_document_tree().should_be_called() - document.get_active_breadcrumb().should_be_called().will_return(None) - ifc.run("document.add_information", parent=None).should_be_called().will_return("information") + document.get_default_parent_for_information().should_be_called().will_return("default_parent") + ifc.run("document.add_information", parent="default_parent").should_be_called().will_return("information") ifc.run("document.add_reference", information="information").should_be_called() + document.is_document_information("default_parent").should_be_called().will_return(True) + document.expand_document("default_parent").should_be_called() document.import_project_documents().should_be_called() + subject.add_information(ifc, document) def test_add_and_reload_tree_at_current_parent(self, ifc, document): document.clear_document_tree().should_be_called() - document.get_active_breadcrumb().should_be_called().will_return("parent") ifc.run("document.add_information", parent="parent").should_be_called().will_return("information") ifc.run("document.add_reference", information="information").should_be_called() - document.import_subdocuments("parent").should_be_called() - document.import_references("parent").should_be_called() - subject.add_information(ifc, document) + document.is_document_information("parent").should_be_called().will_return(True) + document.expand_document("parent").should_be_called() + document.import_project_documents().should_be_called() + + subject.add_information(ifc, document, parent="parent") + + def test_add_without_expanding_if_parent_is_not_information(self, ifc, document): + document.clear_document_tree().should_be_called() + ifc.run("document.add_information", parent="parent").should_be_called().will_return("information") + ifc.run("document.add_reference", information="information").should_be_called() + document.is_document_information("parent").should_be_called().will_return(False) + document.import_project_documents().should_be_called() + + subject.add_information(ifc, document, parent="parent") class TestAddReference: - def test_run(self, ifc, document): - document.get_active_breadcrumb().should_be_called().will_return("parent") + def test_run_with_selected_parent(self, ifc, document): + document.get_selected_document_information().should_be_called().will_return("parent") ifc.run("document.add_reference", information="parent").should_be_called() - document.clear_document_tree().should_be_called() - document.import_subdocuments("parent").should_be_called() - document.import_references("parent").should_be_called() + document.expand_document("parent").should_be_called() + document.import_project_documents().should_be_called() + + subject.add_reference(ifc, document) + + def test_run_without_selected_parent(self, ifc, document): + document.get_selected_document_information().should_be_called().will_return(None) + document.import_project_documents().should_be_called() + subject.add_reference(ifc, document) @@ -96,9 +110,8 @@ def test_edit_information(self, ifc, document): ifc.run("document.edit_information", information="document", attributes="attributes").should_be_called() document.disable_editing_document().should_be_called() document.clear_document_tree().should_be_called() - document.get_active_breadcrumb().should_be_called().will_return(None) document.import_project_documents().should_be_called() - subject.edit_document(ifc, document, document="document") + subject.edit_document(ifc, document, ifc_document="document") def test_edit_reference(self, ifc, document): document.export_document_attributes().should_be_called().will_return("attributes") @@ -106,10 +119,8 @@ def test_edit_reference(self, ifc, document): ifc.run("document.edit_reference", reference="document", attributes="attributes").should_be_called() document.disable_editing_document().should_be_called() document.clear_document_tree().should_be_called() - document.get_active_breadcrumb().should_be_called().will_return("parent") - document.import_subdocuments("parent").should_be_called() - document.import_references("parent").should_be_called() - subject.edit_document(ifc, document, document="document") + document.import_project_documents().should_be_called() + subject.edit_document(ifc, document, ifc_document="document") class TestRemoveDocument: @@ -117,27 +128,24 @@ def test_remove_information(self, ifc, document): document.clear_document_tree().should_be_called() document.is_document_information("document").should_be_called().will_return(True) ifc.run("document.remove_information", information="document").should_be_called() - document.get_active_breadcrumb().should_be_called().will_return(None) document.import_project_documents().should_be_called() - subject.remove_document(ifc, document, document="document") + subject.remove_document(ifc, document, ifc_document="document") def test_remove_reference(self, ifc, document): document.clear_document_tree().should_be_called() document.is_document_information("document").should_be_called().will_return(False) ifc.run("document.remove_reference", reference="document").should_be_called() - document.get_active_breadcrumb().should_be_called().will_return("parent") - document.import_subdocuments("parent").should_be_called() - document.import_references("parent").should_be_called() - subject.remove_document(ifc, document, document="document") + document.import_project_documents().should_be_called() + subject.remove_document(ifc, document, ifc_document="document") class TestAssignDocument: def test_run(self, ifc): ifc.run("document.assign_document", products=["product"], document="document").should_be_called() - subject.assign_document(ifc, product="product", document="document") + subject.assign_document(ifc, product="product", ifc_document="document") class TestUnassignDocument: def test_run(self, ifc): ifc.run("document.unassign_document", products=["product"], document="document").should_be_called() - subject.unassign_document(ifc, product="product", document="document") + subject.unassign_document(ifc, product="product", ifc_document="document") diff --git a/src/bonsai/test/core/test_drawing.py b/src/bonsai/test/core/test_drawing.py index 957bd79f794..52822aa754d 100644 --- a/src/bonsai/test/core/test_drawing.py +++ b/src/bonsai/test/core/test_drawing.py @@ -17,7 +17,7 @@ # along with Bonsai. If not, see . import bonsai.core.drawing as subject -from test.core.bootstrap import ifc, drawing, collector, geometry, blender, Prophecy +from test.core.bootstrap import Prophecy, blender, collector, drawing, geometry, ifc class TestEnableEditingText: @@ -35,9 +35,14 @@ def test_run(self, drawing): class TestEditText: def test_run(self, drawing): - drawing.synchronise_ifc_and_text_attributes("obj").should_be_called() - drawing.update_text_size_pset("obj").should_be_called() - drawing.update_text_annotation_properties("obj").should_be_called() + drawing.export_text_literal_attributes("obj").should_be_called().will_return("literal_attributes") + drawing.export_font_size("obj").should_be_called().will_return("font_size") + drawing.edit_text_font_size("obj", "font_size").should_be_called() + drawing.export_wrap_length("obj").should_be_called().will_return("wrap_length") + drawing.edit_text_wrap_length("obj", "wrap_length").should_be_called() + drawing.export_symbol("obj").should_be_called().will_return("symbol") + drawing.edit_text_symbol("obj", "symbol").should_be_called() + drawing.edit_text_literals("obj", "literal_attributes").should_be_called() drawing.disable_editing_text("obj").should_be_called() subject.edit_text(drawing, obj="obj") @@ -466,6 +471,7 @@ def test_run(self, ifc, drawing): class TestUpdateDrawingName: def test_do_not_update_if_name_unchanged(self, ifc, drawing): drawing.get_name("drawing").should_be_called().will_return("name") + drawing.set_camera_name("drawing", "name").should_be_called() drawing.get_drawing_group("drawing").should_be_called().will_return("group") drawing.get_name("group").should_be_called().will_return("name") drawing.get_drawing_collection("drawing").should_be_called().will_return("collection") @@ -482,6 +488,7 @@ def test_do_not_update_if_name_unchanged(self, ifc, drawing): def test_run(self, ifc, drawing): drawing.get_name("drawing").should_be_called().will_return("oldname") ifc.run("attribute.edit_attributes", product="drawing", attributes={"Name": "name"}).should_be_called() + drawing.set_camera_name("drawing", "name").should_be_called() drawing.get_drawing_group("drawing").should_be_called().will_return("group") drawing.get_name("group").should_be_called().will_return("oldname") ifc.run("attribute.edit_attributes", product="group", attributes={"Name": "name"}).should_be_called() diff --git a/src/bonsai/test/core/test_geometry.py b/src/bonsai/test/core/test_geometry.py index c9e3392808f..21ccb092200 100644 --- a/src/bonsai/test/core/test_geometry.py +++ b/src/bonsai/test/core/test_geometry.py @@ -18,7 +18,7 @@ import bonsai.core.geometry as subject import test.core.test_style -from test.core.bootstrap import ifc, surveyor, geometry, style +from test.core.bootstrap import geometry, ifc, style, surveyor class TestEditObjectPlacement: diff --git a/src/bonsai/test/core/test_georeference.py b/src/bonsai/test/core/test_georeference.py index 6048ae58282..e95236ec3f5 100644 --- a/src/bonsai/test/core/test_georeference.py +++ b/src/bonsai/test/core/test_georeference.py @@ -17,12 +17,13 @@ # along with Bonsai. If not, see . import bonsai.core.georeference as subject -from test.core.bootstrap import ifc, georeference +from test.core.bootstrap import georeference, ifc class TestAddGeoreferencing: def test_run(self, georeference): georeference.add_georeferencing().should_be_called() + georeference.set_model_origin().should_be_called() subject.add_georeferencing(georeference) @@ -35,9 +36,10 @@ def test_run(self, georeference): class TestRemoveGeoreferencing: - def test_run(self, ifc): + def test_run(self, ifc, georeference): ifc.run("georeference.remove_georeferencing").should_be_called() - subject.remove_georeferencing(ifc) + georeference.set_model_origin().should_be_called() + subject.remove_georeferencing(ifc, georeference) class TestDisableEditingGeoreferencing: diff --git a/src/bonsai/test/core/test_ifcgit.py b/src/bonsai/test/core/test_ifcgit.py new file mode 100644 index 00000000000..4884497c8b0 --- /dev/null +++ b/src/bonsai/test/core/test_ifcgit.py @@ -0,0 +1,329 @@ +# Bonsai - OpenBIM Blender Add-on +# Copyright (C) 2025 Dion Moult +# +# This file is part of Bonsai. +# +# Bonsai is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Bonsai is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Bonsai. If not, see . +# This file was generated with the assistance of an AI coding tool. + +import pytest + +import bonsai.core.ifcgit as subject +from test.core.bootstrap import ifc, ifcgit + + +class MockOperator: + def __init__(self): + self.reports = [] + + def report(self, level, message): + self.reports.append((level, message)) + + +class TestCreateRepo: + def test_run(self, ifcgit, ifc): + ifc.get_path().should_be_called().will_return("path/to/model.ifc") + ifcgit.get_path_dir("path/to/model.ifc").should_be_called().will_return("path/to") + ifcgit.init_repo("path/to").should_be_called() + subject.create_repo(ifcgit, ifc) + + +class TestAddFile: + def test_run(self, ifcgit, ifc): + ifc.get_path().should_be_called().will_return("path/to/model.ifc") + ifcgit.repo_from_path("path/to/model.ifc").should_be_called().will_return("repo") + ifcgit.add_file_to_repo("repo", "path/to/model.ifc").should_be_called() + subject.add_file(ifcgit, ifc) + + +class TestCloneRepo: + def test_successful_clone(self, ifcgit): + ifcgit.clone_repo("http://example.com/repo.git", "/local/folder").should_be_called().will_return("repo") + ifcgit.load_anyifc("repo").should_be_called() + op = MockOperator() + subject.clone_repo(ifcgit, "http://example.com/repo.git", "/local/folder", operator=op) + assert op.reports == [({"INFO"}, "Repository cloned")] + + def test_failed_clone_reports_error(self, ifcgit): + ifcgit.clone_repo("http://example.com/repo.git", "/local/folder").should_be_called().will_return(None) + op = MockOperator() + subject.clone_repo(ifcgit, "http://example.com/repo.git", "/local/folder", operator=op) + assert op.reports == [({"ERROR"}, "Clone failed")] + + +class TestDiscardUncommitted: + def test_run(self, ifcgit, ifc): + ifc.get_path().should_be_called().will_return("path/to/model.ifc") + ifcgit.git_checkout("path/to/model.ifc").should_be_called() + ifcgit.load_project("path/to/model.ifc").should_be_called() + subject.discard_uncommitted(ifcgit, ifc) + + +class TestCommitChanges: + def test_commit_on_branch_without_new_branch(self, ifcgit, ifc): + ifc.get_path().should_be_called().will_return("path/to/model.ifc") + ifcgit.is_head_detached().should_be_called().will_return(False) + ifcgit.git_commit("path/to/model.ifc", "my message").should_be_called() + subject.commit_changes(ifcgit, ifc, "my message", "") + + def test_commit_on_branch_with_new_branch(self, ifcgit, ifc): + ifc.get_path().should_be_called().will_return("path/to/model.ifc") + ifcgit.is_head_detached().should_be_called().will_return(False) + ifcgit.checkout_new_branch("path/to/model.ifc", "feature").should_be_called() + ifcgit.git_commit("path/to/model.ifc", "my message").should_be_called() + subject.commit_changes(ifcgit, ifc, "my message", "feature") + + def test_commit_on_detached_head(self, ifcgit, ifc): + ifc.get_path().should_be_called().will_return("path/to/model.ifc") + ifcgit.is_head_detached().should_be_called().will_return(True) + ifcgit.git_commit("path/to/model.ifc", "my message").should_be_called() + ifcgit.create_new_branch("feature").should_be_called() + subject.commit_changes(ifcgit, ifc, "my message", "feature") + + +class TestAddTag: + def test_run(self, ifcgit): + ifcgit.add_tag("repo", "abc123", "v1.0", "Release notes").should_be_called() + subject.add_tag(ifcgit, "repo", "abc123", "v1.0", "Release notes") + + +class TestDeleteTag: + def test_run(self, ifcgit): + ifcgit.delete_tag("repo", "v1.0").should_be_called() + subject.delete_tag(ifcgit, "repo", "v1.0") + + +class TestAddRemote: + def test_run(self, ifcgit): + ifcgit.add_remote("repo", "origin", "http://example.com").should_be_called() + subject.add_remote(ifcgit, "repo", "origin", "http://example.com") + + +class TestDeleteRemote: + def test_run(self, ifcgit): + ifcgit.delete_remote("repo", "origin").should_be_called() + subject.delete_remote(ifcgit, "repo", "origin") + + +class TestPush: + def test_push_succeeds_silently(self, ifcgit): + ifcgit.get_active_branch_name().should_be_called().will_return("main") + ifcgit.push("repo", "origin", "main").should_be_called().will_return(None) + subject.push(ifcgit, "repo", "origin", operator=None) + + def test_push_failure_reports_error(self, ifcgit): + ifcgit.get_active_branch_name().should_be_called().will_return("main") + ifcgit.push("repo", "origin", "main").should_be_called().will_return("stderr: rejected") + op = MockOperator() + subject.push(ifcgit, "repo", "origin", operator=op) + assert op.reports == [({"ERROR"}, "stderr: rejected")] + + +class TestRefreshRevisionList: + def test_refreshes_when_repo_has_heads(self, ifcgit, ifc): + ifcgit.clear_merge_conflicts().should_be_called() + ifcgit.repo_has_commits().should_be_called().will_return(True) + ifc.get_path().should_be_called().will_return("path/to/model.ifc") + ifcgit.refresh_revision_list("path/to/model.ifc").should_be_called() + subject.refresh_revision_list(ifcgit, ifc) + + def test_skips_when_repo_has_no_heads(self, ifcgit, ifc): + ifcgit.clear_merge_conflicts().should_be_called() + ifcgit.repo_has_commits().should_be_called().will_return(False) + subject.refresh_revision_list(ifcgit, ifc) + # nothing else should be called — Prophecy will verify + + +class TestColouriseRevision: + def test_skips_when_no_step_ids(self, ifcgit): + ifcgit.get_revisions_step_ids().should_be_called().will_return(None) + subject.colourise_revision(ifcgit) + + def test_colourises_with_step_ids(self, ifcgit): + ifcgit.get_revisions_step_ids().should_be_called().will_return("step_ids") + ifcgit.get_modified_step_ids("step_ids").should_be_called().will_return("modified_step_ids") + ifcgit.update_step_ids("step_ids", "modified_step_ids").should_be_called().will_return("final_step_ids") + ifcgit.colourise("final_step_ids").should_be_called() + subject.colourise_revision(ifcgit) + + +class TestColouriseUncommitted: + def test_skips_when_no_step_ids(self, ifcgit, ifc): + ifc.get_path().should_be_called().will_return("path/to/model.ifc") + ifcgit.ifc_diff_ids("repo", None, "HEAD", "path/to/model.ifc").should_be_called().will_return(None) + subject.colourise_uncommitted(ifcgit, ifc, "repo") + + def test_colourises_with_step_ids(self, ifcgit, ifc): + ifc.get_path().should_be_called().will_return("path/to/model.ifc") + ifcgit.ifc_diff_ids("repo", None, "HEAD", "path/to/model.ifc").should_be_called().will_return("step_ids") + ifcgit.get_modified_step_ids("step_ids").should_be_called().will_return("modified_step_ids") + ifcgit.update_step_ids("step_ids", "modified_step_ids").should_be_called().will_return("final_step_ids") + ifcgit.colourise("final_step_ids").should_be_called() + subject.colourise_uncommitted(ifcgit, ifc, "repo") + + +class TestSwitchRevision: + def test_run(self, ifcgit, ifc): + ifc.get_path().should_be_called().will_return("path/to/model.ifc") + ifcgit.switch_to_revision_item().should_be_called() + ifcgit.load_project("path/to/model.ifc").should_be_called() + ifcgit.refresh_revision_list("path/to/model.ifc").should_be_called() + ifcgit.decolourise().should_be_called() + subject.switch_revision(ifcgit, ifc) + + +class TestMergeBranch: + def test_no_branch_at_selected_commit(self, ifcgit, ifc): + ifc.get_path().should_be_called().will_return("path/to/model.ifc") + ifcgit.config_ifcmerge().should_be_called() + ifcgit.get_selected_branch().should_be_called().will_return(None) + subject.merge_branch(ifcgit, ifc, operator=None) + + def test_clean_merge(self, ifcgit, ifc): + ifc.get_path().should_be_called().will_return("path/to/model.ifc") + ifcgit.config_ifcmerge().should_be_called() + ifcgit.get_selected_branch().should_be_called().will_return("feature") + ifcgit.get_merge_tool("feature").should_be_called().will_return("ifcmerge-forward") + ifcgit.git_merge("feature").should_be_called().will_return(None) + ifcgit.clear_merge_conflicts().should_be_called() + ifcgit.set_display_branch().should_be_called() + ifcgit.git_checkout("path/to/model.ifc").should_be_called() + ifcgit.load_project("path/to/model.ifc").should_be_called() + ifcgit.refresh_revision_list("path/to/model.ifc").should_be_called() + ifcgit.decolourise().should_be_called() + subject.merge_branch(ifcgit, ifc, operator=None) + + def test_conflict_mergetool_success(self, ifcgit, ifc): + ifc.get_path().should_be_called().will_return("path/to/model.ifc") + ifcgit.config_ifcmerge().should_be_called() + ifcgit.get_selected_branch().should_be_called().will_return("feature") + ifcgit.get_merge_tool("feature").should_be_called().will_return("ifcmerge-forward") + ifcgit.git_merge("feature").should_be_called().will_return("conflict") + ifcgit.git_mergetool("ifcmerge-forward", "path/to/model.ifc").should_be_called().will_return(None) + ifcgit.commit_merge("path/to/model.ifc").should_be_called() + ifcgit.clear_merge_conflicts().should_be_called() + ifcgit.set_display_branch().should_be_called() + ifcgit.git_checkout("path/to/model.ifc").should_be_called() + ifcgit.load_project("path/to/model.ifc").should_be_called() + ifcgit.refresh_revision_list("path/to/model.ifc").should_be_called() + ifcgit.decolourise().should_be_called() + subject.merge_branch(ifcgit, ifc, operator=None) + + def test_conflict_mergetool_failure(self, ifcgit, ifc): + conflicts = [{"type": "attribute_conflict", "entity_id": 42}] + ifc.get_path().should_be_called().will_return("path/to/model.ifc") + ifcgit.config_ifcmerge().should_be_called() + ifcgit.get_selected_branch().should_be_called().will_return("feature") + ifcgit.get_merge_tool("feature").should_be_called().will_return("ifcmerge-forward") + ifcgit.git_merge("feature").should_be_called().will_return("conflict") + ifcgit.git_mergetool("ifcmerge-forward", "path/to/model.ifc").should_be_called().will_return(conflicts) + ifcgit.git_merge_abort().should_be_called() + ifcgit.store_merge_conflicts(conflicts).should_be_called() + op = MockOperator() + subject.merge_branch(ifcgit, ifc, op) + assert op.reports == [({"WARNING"}, "Merge failed — see the conflict report in the panel below")] + + def test_unknown_merge_error(self, ifcgit, ifc): + ifc.get_path().should_be_called().will_return("path/to/model.ifc") + ifcgit.config_ifcmerge().should_be_called() + ifcgit.get_selected_branch().should_be_called().will_return("feature") + ifcgit.get_merge_tool("feature").should_be_called().will_return("ifcmerge-forward") + ifcgit.git_merge("feature").should_be_called().will_return("error") + op = MockOperator() + subject.merge_branch(ifcgit, ifc, op) + assert op.reports == [({"ERROR"}, "Unknown IFC Merge failure")] + + +class TestDryRunMerge: + def test_no_branch_at_selected_commit(self, ifcgit, ifc): + ifc.get_path().should_be_called().will_return("path/to/model.ifc") + ifcgit.config_ifcmerge().should_be_called() + ifcgit.get_selected_branch().should_be_called().will_return(None) + subject.dry_run_merge(ifcgit, ifc, operator=None) + + def test_clean_merge_preview(self, ifcgit, ifc): + ifc.get_path().should_be_called().will_return("path/to/model.ifc") + ifcgit.config_ifcmerge().should_be_called() + ifcgit.get_selected_branch().should_be_called().will_return("feature") + ifcgit.get_merge_tool("feature").should_be_called().will_return("ifcmerge-forward") + ifcgit.git_merge_no_commit("feature").should_be_called().will_return(None) + ifcgit.git_merge_abort().should_be_called() + ifcgit.clear_merge_conflicts().should_be_called() + op = MockOperator() + subject.dry_run_merge(ifcgit, ifc, op) + assert op.reports == [({"INFO"}, "Merge preview: no conflicts")] + + def test_conflict_preview_shows_report(self, ifcgit, ifc): + conflicts = [{"type": "attribute_conflict", "entity_id": 42}] + ifc.get_path().should_be_called().will_return("path/to/model.ifc") + ifcgit.config_ifcmerge().should_be_called() + ifcgit.get_selected_branch().should_be_called().will_return("feature") + ifcgit.get_merge_tool("feature").should_be_called().will_return("ifcmerge-forward") + ifcgit.git_merge_no_commit("feature").should_be_called().will_return("conflict") + ifcgit.git_mergetool("ifcmerge-forward", "path/to/model.ifc").should_be_called().will_return(conflicts) + ifcgit.git_merge_abort().should_be_called() + ifcgit.store_merge_conflicts(conflicts).should_be_called() + op = MockOperator() + subject.dry_run_merge(ifcgit, ifc, op) + assert op.reports == [({"WARNING"}, "Merge preview: conflicts found — see the panel below")] + + def test_conflict_preview_mergetool_succeeds(self, ifcgit, ifc): + ifc.get_path().should_be_called().will_return("path/to/model.ifc") + ifcgit.config_ifcmerge().should_be_called() + ifcgit.get_selected_branch().should_be_called().will_return("feature") + ifcgit.get_merge_tool("feature").should_be_called().will_return("ifcmerge-forward") + ifcgit.git_merge_no_commit("feature").should_be_called().will_return("conflict") + ifcgit.git_mergetool("ifcmerge-forward", "path/to/model.ifc").should_be_called().will_return(None) + ifcgit.git_merge_abort().should_be_called() + ifcgit.clear_merge_conflicts().should_be_called() + op = MockOperator() + subject.dry_run_merge(ifcgit, ifc, op) + assert op.reports == [({"INFO"}, "Merge preview: no conflicts")] + + +class TestEntityLog: + def test_run(self, ifcgit, ifc): + ifc.get_path().should_be_called().will_return("path/to/model.ifc") + ifcgit.entity_log("path/to/model.ifc", 42).should_be_called().will_return("log text") + op = MockOperator() + subject.entity_log(ifcgit, ifc, 42, op) + assert op.reports == [({"ERROR"}, "log text")] + + +class TestInstallGit: + def test_windows(self, ifcgit): + import unittest.mock as mock + + with mock.patch("platform.system", return_value="Windows"): + ifcgit.install_git_windows(operator="op").should_be_called() + subject.install_git(ifcgit, "op") + + def test_non_windows_does_nothing(self, ifcgit): + import unittest.mock as mock + + with mock.patch("platform.system", return_value="Linux"): + subject.install_git(ifcgit, "op") + # no tool method should be called — Prophecy will verify + + +class TestFetch: + def test_run(self, ifcgit): + ifcgit.fetch("origin").should_be_called() + subject.fetch(ifcgit, "origin") + + +class TestRunGitDiff: + def test_run(self, ifcgit): + ifcgit.run_git_diff("operator", False).should_be_called() + subject.run_git_diff(ifcgit, "operator", False) diff --git a/src/bonsai/test/core/test_material.py b/src/bonsai/test/core/test_material.py index a8baee0c6c9..a2cbf8c4338 100644 --- a/src/bonsai/test/core/test_material.py +++ b/src/bonsai/test/core/test_material.py @@ -17,7 +17,7 @@ # along with Bonsai. If not, see . import bonsai.core.material as subject -from test.core.bootstrap import ifc, material, style, spatial +from test.core.bootstrap import ifc, material, spatial, style class TestAddMaterial: diff --git a/src/bonsai/test/core/test_misc.py b/src/bonsai/test/core/test_misc.py index 950799a098d..716607c0d84 100644 --- a/src/bonsai/test/core/test_misc.py +++ b/src/bonsai/test/core/test_misc.py @@ -17,7 +17,7 @@ # along with Bonsai. If not, see . import bonsai.core.misc as subject -from test.core.bootstrap import misc, ifc +from test.core.bootstrap import ifc, misc class TestResizeToStorey: diff --git a/src/bonsai/test/core/test_nest.py b/src/bonsai/test/core/test_nest.py index d2eefc9109e..36cbfafc604 100644 --- a/src/bonsai/test/core/test_nest.py +++ b/src/bonsai/test/core/test_nest.py @@ -17,7 +17,7 @@ # along with Bonsai. If not, see . import bonsai.core.nest as subject -from test.core.bootstrap import ifc, nest, collector +from test.core.bootstrap import collector, ifc, nest class TestEnableEditingNeset: diff --git a/src/bonsai/test/core/test_owner.py b/src/bonsai/test/core/test_owner.py index b6480304077..12d5bf3fa1e 100644 --- a/src/bonsai/test/core/test_owner.py +++ b/src/bonsai/test/core/test_owner.py @@ -18,7 +18,7 @@ import bonsai.core.owner as subject -from test.core.bootstrap import ifc, owner, Prophecy +from test.core.bootstrap import Prophecy, ifc, owner class TestAddPerson: diff --git a/src/bonsai/test/core/test_project.py b/src/bonsai/test/core/test_project.py index 7ecdc3c36c9..462e1cabcd0 100644 --- a/src/bonsai/test/core/test_project.py +++ b/src/bonsai/test/core/test_project.py @@ -18,7 +18,7 @@ import bonsai.core.project as subject -from test.core.bootstrap import ifc, project, spatial, georeference +from test.core.bootstrap import georeference, ifc, project, spatial class TestCreateProject: diff --git a/src/bonsai/test/core/test_root.py b/src/bonsai/test/core/test_root.py index 7d922627ac5..121236803d0 100644 --- a/src/bonsai/test/core/test_root.py +++ b/src/bonsai/test/core/test_root.py @@ -18,7 +18,7 @@ import bonsai.core.root as subject import test.core.test_geometry -from test.core.bootstrap import ifc, collector, geometry, root +from test.core.bootstrap import collector, geometry, ifc, root class TestCopyClass: diff --git a/src/bonsai/test/core/test_spatial.py b/src/bonsai/test/core/test_spatial.py index a2b824fc919..ddc6116fdf7 100644 --- a/src/bonsai/test/core/test_spatial.py +++ b/src/bonsai/test/core/test_spatial.py @@ -17,7 +17,7 @@ # along with Bonsai. If not, see . import bonsai.core.spatial as subject -from test.core.bootstrap import ifc, collector, spatial +from test.core.bootstrap import collector, ifc, spatial class TestReferenceStructure: @@ -38,16 +38,19 @@ def test_run(self, ifc, spatial): class TestAssignContainer: def test_run(self, ifc, collector, spatial): - spatial.can_contain("container", "element_obj").should_be_called().will_return(True) - ifc.get_entity("element_obj").should_be_called().will_return("element") - ifc.run( - "spatial.assign_container", products=["element"], relating_structure="container" - ).should_be_called().will_return("rel") - spatial.disable_editing("element_obj").should_be_called() - collector.assign("element_obj").should_be_called() - assert ( - subject.assign_container(ifc, collector, spatial, container="container", element_obj="element_obj") == "rel" - ) + ifc.get_entity("obj").should_be_called().will_return("element") + spatial.get_root_element("element").should_be_called().will_return("aggregate") + spatial.get_decomposition("aggregate").should_be_called().will_return(["element", "element2"]) + spatial.can_contain("container", "aggregate").should_be_called().will_return(True) + ifc.run("spatial.assign_container", products=["aggregate"], relating_structure="container").should_be_called() + spatial.disable_editing("obj").should_be_called() + ifc.get_object("aggregate").should_be_called().will_return("aggregate_obj") + ifc.get_object("element").should_be_called().will_return("obj") + ifc.get_object("element2").should_be_called().will_return("obj2") + collector.assign("aggregate_obj").should_be_called() + collector.assign("obj").should_be_called() + collector.assign("obj2").should_be_called() + subject.assign_container(ifc, collector, spatial, container="container", objs=["obj"]) class TestEnableEditingContainer: @@ -82,7 +85,7 @@ def test_run(self, ifc, collector, spatial): spatial.duplicate_object_and_data("obj").should_be_called().will_return("new_obj") spatial.set_relative_object_matrix("new_obj", "to_container_obj", "matrix").should_be_called() spatial.run_root_copy_class(obj="new_obj").should_be_called() - spatial.run_spatial_assign_container(container="to_container", element_obj="new_obj").should_be_called() + spatial.run_spatial_assign_container(container="to_container", objs=["new_obj"]).should_be_called() spatial.disable_editing("obj").should_be_called() @@ -97,7 +100,7 @@ def test_using_an_absolute_matrix_if_there_is_no_from_container(self, ifc, colle spatial.duplicate_object_and_data("obj").should_be_called().will_return("new_obj") spatial.set_relative_object_matrix("new_obj", "to_container_obj", "matrix").should_be_called() spatial.run_root_copy_class(obj="new_obj").should_be_called() - spatial.run_spatial_assign_container(container="to_container", element_obj="new_obj").should_be_called() + spatial.run_spatial_assign_container(container="to_container", objs=["new_obj"]).should_be_called() spatial.disable_editing("obj").should_be_called() diff --git a/src/bonsai/test/core/test_style.py b/src/bonsai/test/core/test_style.py index ca8fc6b962c..a2278cf0083 100644 --- a/src/bonsai/test/core/test_style.py +++ b/src/bonsai/test/core/test_style.py @@ -17,7 +17,7 @@ # along with Bonsai. If not, see . import bonsai.core.style as subject -from test.core.bootstrap import ifc, material, style, spatial +from test.core.bootstrap import ifc, material, spatial, style class TestAddStyle: diff --git a/src/bonsai/test/core/test_system.py b/src/bonsai/test/core/test_system.py index d907059b988..0f7dd34b627 100644 --- a/src/bonsai/test/core/test_system.py +++ b/src/bonsai/test/core/test_system.py @@ -18,7 +18,7 @@ import bonsai.core.system as subject -from test.core.bootstrap import ifc, system, spatial, group +from test.core.bootstrap import group, ifc, spatial, system class TestLoadSystems: @@ -153,11 +153,10 @@ class TestAddPort: def test_run(self, ifc, system): system.get_ports("element").should_be_called().will_return(["port"]) system.load_ports("element", ["port"]).should_be_called() - system.create_empty_at_cursor_with_element_orientation("element").should_be_called().will_return("obj") - system.run_root_assign_class( - obj="obj", ifc_class="IfcDistributionPort", should_add_representation=False - ).should_be_called().will_return("port") - ifc.run("system.assign_port", element="element", port="port").should_be_called() + # system.create_empty_at_cursor_with_element_orientation("element").should_be_called().will_return("obj") + # system.run_root_assign_class(obj="obj", ifc_class="IfcDistributionPort", should_add_representation=False).should_be_called().will_return("port") + system.create_port_at_cursor("element").should_be_called().will_return("port") + system.load_ports("element", ["port"]).should_be_called() subject.add_port(ifc, system, element="element") diff --git a/src/bonsai/test/core/test_type.py b/src/bonsai/test/core/test_type.py index 68130c1fa89..031e414f95d 100644 --- a/src/bonsai/test/core/test_type.py +++ b/src/bonsai/test/core/test_type.py @@ -17,28 +17,30 @@ # along with Bonsai. If not, see . import bonsai.core.type as subject -from test.core.bootstrap import ifc, type, geometry +from test.core.bootstrap import geometry, ifc, model, type class TestAssignType: - def test_assigning_and_switching_to_an_existing_type_data(self, ifc, type): + def test_assigning_and_switching_to_an_existing_type_data(self, ifc, model, type): + type.record_material_usage_attributes("element").should_be_called().will_return(None) ifc.run("type.assign_type", related_objects=["element"], relating_type="type").should_be_called() - type.has_material_usage("element").should_be_called().will_return(False) + model.get_usage_type("type").should_be_called(2).will_return(None) ifc.get_object("type").should_be_called().will_return("type_obj") type.get_object_data("type_obj").should_be_called().will_return("type_obj_data") type.change_object_data("obj", "type_obj_data", is_global=False).should_be_called() ifc.get_object("element").should_be_called().will_return("obj") type.disable_editing("obj").should_be_called() - subject.assign_type(ifc, type, element="element", type="type") + subject.assign_type(ifc, model, type, element="element", type="type") - def test_assigning_and_not_changing_data_if_the_type_has_no_data(self, ifc, type): + def test_assigning_and_not_changing_data_if_the_type_has_no_data(self, ifc, model, type): + type.record_material_usage_attributes("element").should_be_called().will_return(None) ifc.run("type.assign_type", related_objects=["element"], relating_type="type").should_be_called() - type.has_material_usage("element").should_be_called().will_return(False) + model.get_usage_type("type").should_be_called(2).will_return(None) ifc.get_object("type").should_be_called().will_return("type_obj") type.get_object_data("type_obj").should_be_called().will_return(None) ifc.get_object("element").should_be_called().will_return("obj") type.disable_editing("obj").should_be_called() - subject.assign_type(ifc, type, element="element", type="type") + subject.assign_type(ifc, model, type, element="element", type="type") class TestPurgeUnusedTypes: diff --git a/src/bonsai/test/core/test_unit.py b/src/bonsai/test/core/test_unit.py index a7d73c755f9..1c328fe84cd 100644 --- a/src/bonsai/test/core/test_unit.py +++ b/src/bonsai/test/core/test_unit.py @@ -22,119 +22,91 @@ class TestAssignSceneUnits: def test_creating_and_assigning_metric_units(self, ifc, unit): - unit.is_scene_unit_metric().should_be_called().will_return(True) - unit.get_scene_unit_si_prefix("LENGTHUNIT").should_be_called().will_return("prefix") - unit.get_scene_unit_si_prefix("AREAUNIT").should_be_called().will_return("prefix") - unit.get_scene_unit_si_prefix("VOLUMEUNIT").should_be_called().will_return("prefix") - unit.add_mass_and_time_units().should_be_called().will_return(True) - unit.get_scene_unit_si_prefix("MASSUNIT").should_be_called().will_return("KILO") - unit.get_scene_unit_si_prefix("TIMEUNIT").should_be_called().will_return(None) - - ifc.run("unit.add_si_unit", unit_type="LENGTHUNIT", prefix="prefix").should_be_called().will_return( + unit.get_scene_unit_name("LENGTHUNIT").should_be_called().will_return("length_name") + unit.get_scene_unit_name("AREAUNIT").should_be_called().will_return("area_name") + unit.get_scene_unit_name("VOLUMEUNIT").should_be_called().will_return("volume_name") + unit.get_scene_unit_name("MASSUNIT").should_be_called().will_return("mass_name") + unit.get_scene_unit_name("TIMEUNIT").should_be_called().will_return("time_name") + unit.is_si_unit("length_name").should_be_called().will_return(True) + unit.is_si_unit("area_name").should_be_called().will_return(True) + unit.is_si_unit("volume_name").should_be_called().will_return(True) + unit.is_si_unit("mass_name").should_be_called().will_return(True) + unit.is_si_unit("time_name").should_be_called().will_return(True) + unit.get_scene_unit_si_prefix("length_name").should_be_called().will_return("length_prefix") + unit.get_scene_unit_si_prefix("area_name").should_be_called().will_return("area_prefix") + unit.get_scene_unit_si_prefix("volume_name").should_be_called().will_return("volume_prefix") + unit.get_scene_unit_si_prefix("mass_name").should_be_called().will_return("mass_prefix") + unit.get_scene_unit_si_prefix("time_name").should_be_called().will_return("time_prefix") + ifc.run("unit.add_si_unit", unit_type="LENGTHUNIT", prefix="length_prefix").should_be_called().will_return( "lengthunit" ) - ifc.run("unit.add_si_unit", unit_type="AREAUNIT", prefix="prefix").should_be_called().will_return("areaunit") - ifc.run("unit.add_si_unit", unit_type="VOLUMEUNIT", prefix="prefix").should_be_called().will_return( + ifc.run("unit.add_si_unit", unit_type="AREAUNIT", prefix="area_prefix").should_be_called().will_return( + "areaunit" + ) + ifc.run("unit.add_si_unit", unit_type="VOLUMEUNIT", prefix="volume_prefix").should_be_called().will_return( "volumeunit" ) - ifc.run("unit.add_si_unit", unit_type="MASSUNIT", prefix="KILO").should_be_called().will_return("massunit") - ifc.run("unit.add_si_unit", unit_type="TIMEUNIT", prefix=None).should_be_called().will_return("timeunit") - ifc.run("unit.add_conversion_based_unit", name="degree").should_be_called().will_return("planeangleunit") - + ifc.run("unit.add_si_unit", unit_type="MASSUNIT", prefix="mass_prefix").should_be_called().will_return( + "massunit" + ) + ifc.run("unit.add_si_unit", unit_type="TIMEUNIT", prefix="time_prefix").should_be_called().will_return( + "timeunit" + ) ifc.run( - "unit.assign_unit", units=["lengthunit", "areaunit", "volumeunit", "planeangleunit", "massunit", "timeunit"] + "unit.assign_unit", units=["lengthunit", "areaunit", "volumeunit", "massunit", "timeunit"] ).should_be_called() subject.assign_scene_units(ifc, unit) - def test_creating_and_assigning_metric_units_without_mass_and_time(self, ifc, unit): - unit.is_scene_unit_metric().should_be_called().will_return(True) - unit.get_scene_unit_si_prefix("LENGTHUNIT").should_be_called().will_return("CENTI") - unit.get_scene_unit_si_prefix("AREAUNIT").should_be_called().will_return("CENTI") - unit.get_scene_unit_si_prefix("VOLUMEUNIT").should_be_called().will_return("CENTI") - unit.add_mass_and_time_units().should_be_called().will_return(False) - ifc.run("unit.add_si_unit", unit_type="LENGTHUNIT", prefix="CENTI").should_be_called().will_return("lengthunit") - ifc.run("unit.add_si_unit", unit_type="AREAUNIT", prefix="CENTI").should_be_called().will_return("areaunit") - ifc.run("unit.add_si_unit", unit_type="VOLUMEUNIT", prefix="CENTI").should_be_called().will_return("volumeunit") - ifc.run("unit.add_conversion_based_unit", name="degree").should_be_called().will_return("planeangleunit") - ifc.run("unit.assign_unit", units=["lengthunit", "areaunit", "volumeunit", "planeangleunit"]).should_be_called() + def test_creating_and_assigning_only_specified_units(self, ifc, unit): + unit.get_scene_unit_name("LENGTHUNIT").should_be_called().will_return("length_name") + unit.get_scene_unit_name("AREAUNIT").should_be_called().will_return(None) + unit.get_scene_unit_name("VOLUMEUNIT").should_be_called().will_return(None) + unit.get_scene_unit_name("MASSUNIT").should_be_called().will_return(None) + unit.get_scene_unit_name("TIMEUNIT").should_be_called().will_return(None) + unit.is_si_unit("length_name").should_be_called().will_return(True) + unit.get_scene_unit_si_prefix("length_name").should_be_called().will_return("length_prefix") + ifc.run("unit.add_si_unit", unit_type="LENGTHUNIT", prefix="length_prefix").should_be_called().will_return( + "lengthunit" + ) + ifc.run("unit.assign_unit", units=["lengthunit"]).should_be_called() subject.assign_scene_units(ifc, unit) def test_creating_and_assigning_imperial_units(self, ifc, unit): - unit.is_scene_unit_metric().should_be_called().will_return(False) - unit.get_scene_unit_name("LENGTHUNIT").should_be_called().will_return("foot") - unit.get_scene_unit_name("AREAUNIT").should_be_called().will_return("square foot") - unit.get_scene_unit_name("VOLUMEUNIT").should_be_called().will_return("cubic foot") - unit.add_mass_and_time_units().should_be_called().will_return(True) - unit.get_scene_unit_name("MASSUNIT").should_be_called().will_return("pound") - unit.get_scene_unit_name("TIMEUNIT").should_be_called().will_return("SECOND") - - ifc.run("unit.add_conversion_based_unit", name="foot").should_be_called().will_return("lengthunit") - ifc.run("unit.add_conversion_based_unit", name="square foot").should_be_called().will_return("areaunit") - ifc.run("unit.add_conversion_based_unit", name="cubic foot").should_be_called().will_return("volumeunit") - ifc.run("unit.add_conversion_based_unit", name="pound").should_be_called().will_return("massunit") - ifc.run("unit.add_si_unit", unit_type="TIMEUNIT", prefix=None).should_be_called().will_return("timeunit") - ifc.run("unit.add_conversion_based_unit", name="degree").should_be_called().will_return("planeangleunit") - + unit.get_scene_unit_name("LENGTHUNIT").should_be_called().will_return("length_name") + unit.get_scene_unit_name("AREAUNIT").should_be_called().will_return("area_name") + unit.get_scene_unit_name("VOLUMEUNIT").should_be_called().will_return("volume_name") + unit.get_scene_unit_name("MASSUNIT").should_be_called().will_return("mass_name") + unit.get_scene_unit_name("TIMEUNIT").should_be_called().will_return("time_name") + unit.is_si_unit("length_name").should_be_called().will_return(False) + unit.is_si_unit("area_name").should_be_called().will_return(False) + unit.is_si_unit("volume_name").should_be_called().will_return(False) + unit.is_si_unit("mass_name").should_be_called().will_return(False) + unit.is_si_unit("time_name").should_be_called().will_return(False) + ifc.run("unit.add_conversion_based_unit", name="length_name").should_be_called().will_return("lengthunit") + ifc.run("unit.add_conversion_based_unit", name="area_name").should_be_called().will_return("areaunit") + ifc.run("unit.add_conversion_based_unit", name="volume_name").should_be_called().will_return("volumeunit") + ifc.run("unit.add_conversion_based_unit", name="mass_name").should_be_called().will_return("massunit") + ifc.run("unit.add_conversion_based_unit", name="time_name").should_be_called().will_return("timeunit") ifc.run( - "unit.assign_unit", units=["lengthunit", "areaunit", "volumeunit", "planeangleunit", "massunit", "timeunit"] + "unit.assign_unit", units=["lengthunit", "areaunit", "volumeunit", "massunit", "timeunit"] ).should_be_called() subject.assign_scene_units(ifc, unit) - def test_creating_and_assigning_imperial_units_without_mass_and_time(self, ifc, unit): - unit.is_scene_unit_metric().should_be_called().will_return(False) - unit.get_scene_unit_name("LENGTHUNIT").should_be_called().will_return("yard") - unit.get_scene_unit_name("AREAUNIT").should_be_called().will_return("square yard") - unit.get_scene_unit_name("VOLUMEUNIT").should_be_called().will_return("cubic yard") - unit.add_mass_and_time_units().should_be_called().will_return(False) - ifc.run("unit.add_conversion_based_unit", name="yard").should_be_called().will_return("lengthunit") - ifc.run("unit.add_conversion_based_unit", name="square yard").should_be_called().will_return("areaunit") - ifc.run("unit.add_conversion_based_unit", name="cubic yard").should_be_called().will_return("volumeunit") - ifc.run("unit.add_conversion_based_unit", name="degree").should_be_called().will_return("planeangleunit") - ifc.run("unit.assign_unit", units=["lengthunit", "areaunit", "volumeunit", "planeangleunit"]).should_be_called() - subject.assign_scene_units(ifc, unit) - - def test_creating_metric_units_with_conversion_based_mass_and_time(self, ifc, unit): - unit.is_scene_unit_metric().should_be_called().will_return(True) - unit.get_scene_unit_si_prefix("LENGTHUNIT").should_be_called().will_return("MILLI") - unit.get_scene_unit_si_prefix("AREAUNIT").should_be_called().will_return(None) - unit.get_scene_unit_si_prefix("VOLUMEUNIT").should_be_called().will_return(None) - unit.add_mass_and_time_units().should_be_called().will_return(True) - unit.get_scene_unit_si_prefix("MASSUNIT").should_be_called().will_return("CONVERSION") - unit.get_scene_unit_name("MASSUNIT").should_be_called().will_return("tonne") - unit.get_scene_unit_si_prefix("TIMEUNIT").should_be_called().will_return("CONVERSION") - unit.get_scene_unit_name("TIMEUNIT").should_be_called().will_return("minute") - - ifc.run("unit.add_si_unit", unit_type="LENGTHUNIT", prefix="MILLI").should_be_called().will_return("lengthunit") - ifc.run("unit.add_si_unit", unit_type="AREAUNIT", prefix=None).should_be_called().will_return("areaunit") - ifc.run("unit.add_si_unit", unit_type="VOLUMEUNIT", prefix=None).should_be_called().will_return("volumeunit") - ifc.run("unit.add_conversion_based_unit", name="tonne").should_be_called().will_return("massunit") - ifc.run("unit.add_conversion_based_unit", name="minute").should_be_called().will_return("timeunit") - ifc.run("unit.add_conversion_based_unit", name="degree").should_be_called().will_return("planeangleunit") - - ifc.run( - "unit.assign_unit", units=["lengthunit", "areaunit", "volumeunit", "planeangleunit", "massunit", "timeunit"] - ).should_be_called() - subject.assign_scene_units(ifc, unit) - - def test_creating_imperial_units_with_conversion_based_units(self, ifc, unit): - unit.is_scene_unit_metric().should_be_called().will_return(False) - unit.get_scene_unit_name("LENGTHUNIT").should_be_called().will_return("inch") - unit.get_scene_unit_name("AREAUNIT").should_be_called().will_return("square inch") - unit.get_scene_unit_name("VOLUMEUNIT").should_be_called().will_return("cubic inch") - unit.add_mass_and_time_units().should_be_called().will_return(True) - unit.get_scene_unit_name("MASSUNIT").should_be_called().will_return("ounce") - unit.get_scene_unit_name("TIMEUNIT").should_be_called().will_return("hour") - - ifc.run("unit.add_conversion_based_unit", name="inch").should_be_called().will_return("lengthunit") - ifc.run("unit.add_conversion_based_unit", name="square inch").should_be_called().will_return("areaunit") - ifc.run("unit.add_conversion_based_unit", name="cubic inch").should_be_called().will_return("volumeunit") - ifc.run("unit.add_conversion_based_unit", name="ounce").should_be_called().will_return("massunit") - ifc.run("unit.add_conversion_based_unit", name="hour").should_be_called().will_return("timeunit") - ifc.run("unit.add_conversion_based_unit", name="degree").should_be_called().will_return("planeangleunit") - - ifc.run( - "unit.assign_unit", units=["lengthunit", "areaunit", "volumeunit", "planeangleunit", "massunit", "timeunit"] - ).should_be_called() + def test_creating_both_metric_and_imperial_units(self, ifc, unit): + # I know British doctors measure with stones so... + unit.get_scene_unit_name("LENGTHUNIT").should_be_called().will_return("length_name") + unit.get_scene_unit_name("AREAUNIT").should_be_called().will_return("area_name") + unit.get_scene_unit_name("VOLUMEUNIT").should_be_called().will_return(None) + unit.get_scene_unit_name("MASSUNIT").should_be_called().will_return(None) + unit.get_scene_unit_name("TIMEUNIT").should_be_called().will_return(None) + unit.is_si_unit("length_name").should_be_called().will_return(True) + unit.is_si_unit("area_name").should_be_called().will_return(False) + unit.get_scene_unit_si_prefix("length_name").should_be_called().will_return("length_prefix") + ifc.run("unit.add_si_unit", unit_type="LENGTHUNIT", prefix="length_prefix").should_be_called().will_return( + "lengthunit" + ) + ifc.run("unit.add_conversion_based_unit", name="area_name").should_be_called().will_return("areaunit") + ifc.run("unit.assign_unit", units=["lengthunit", "areaunit"]).should_be_called() subject.assign_scene_units(ifc, unit) diff --git a/src/bonsai/test/pyproject.toml b/src/bonsai/test/pyproject.toml new file mode 100644 index 00000000000..7567fe86273 --- /dev/null +++ b/src/bonsai/test/pyproject.toml @@ -0,0 +1,5 @@ +[tool.ruff] +extend = "../pyproject.toml" +lint.ignore = [ + "F401", # unused imports +] diff --git a/src/bonsai/test/tool/test_aggregate.py b/src/bonsai/test/tool/test_aggregate.py index 20c31cacdcb..4fd9388c13c 100644 --- a/src/bonsai/test/tool/test_aggregate.py +++ b/src/bonsai/test/tool/test_aggregate.py @@ -18,16 +18,18 @@ import bpy import ifcopenshell +import ifcopenshell.api.aggregate import ifcopenshell.api.context import ifcopenshell.api.geometry import ifcopenshell.api.root import ifcopenshell.api.spatial import ifcopenshell.api.unit import ifcopenshell.util.shape_builder + import bonsai.core.tool import bonsai.tool as tool -from test.bim.bootstrap import NewFile from bonsai.tool.aggregate import Aggregate as subject +from test.bim.bootstrap import NewFile class TestImplementsTool(NewFile): @@ -98,6 +100,42 @@ def test_unlinked_elements_cannot_aggregate(self): subelement_obj = bpy.data.objects.new("Object", None) assert subject.can_aggregate(element_obj, subelement_obj) is False + def test_element_cannot_aggregate_to_itself(self): + ifc = ifcopenshell.file() + tool.Ifc.set(ifc) + element = ifc.createIfcElementAssembly() + element_obj = bpy.data.objects.new("Object", None) + tool.Ifc.link(element, element_obj) + assert subject.can_aggregate(element_obj, element_obj) is False + + def test_cyclic_aggregation_is_prevented(self): + ifc = ifcopenshell.file() + tool.Ifc.set(ifc) + assembly_a = ifc.createIfcElementAssembly() + assembly_a_obj = bpy.data.objects.new("AssemblyA", None) + tool.Ifc.link(assembly_a, assembly_a_obj) + beam = ifc.createIfcBeam() + beam_obj = bpy.data.objects.new("Beam", None) + tool.Ifc.link(beam, beam_obj) + ifcopenshell.api.aggregate.assign_object(ifc, products=[beam], relating_object=assembly_a) + assert subject.can_aggregate(beam_obj, assembly_a_obj) is False + + def test_deep_cyclic_aggregation_is_prevented(self): + ifc = ifcopenshell.file() + tool.Ifc.set(ifc) + assembly_a = ifc.createIfcElementAssembly() + assembly_a_obj = bpy.data.objects.new("AssemblyA", None) + tool.Ifc.link(assembly_a, assembly_a_obj) + assembly_b = ifc.createIfcElementAssembly() + assembly_b_obj = bpy.data.objects.new("AssemblyB", None) + tool.Ifc.link(assembly_b, assembly_b_obj) + beam = ifc.createIfcBeam() + beam_obj = bpy.data.objects.new("Beam", None) + tool.Ifc.link(beam, beam_obj) + ifcopenshell.api.aggregate.assign_object(ifc, products=[assembly_b], relating_object=assembly_a) + ifcopenshell.api.aggregate.assign_object(ifc, products=[beam], relating_object=assembly_b) + assert subject.can_aggregate(beam_obj, assembly_a_obj) is False + class TestHasPhysicalBodyRepresentation(NewFile): def test_run(self): diff --git a/src/bonsai/test/tool/test_blender.py b/src/bonsai/test/tool/test_blender.py index 2db244abe15..cb5d06bc716 100644 --- a/src/bonsai/test/tool/test_blender.py +++ b/src/bonsai/test/tool/test_blender.py @@ -16,14 +16,19 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . +import tempfile +from pathlib import Path +from typing import TYPE_CHECKING + import bpy import ifcopenshell +import pytest + +import bonsai import bonsai.core.tool import bonsai.tool as tool -import pytest -from test.bim.bootstrap import NewFile -from typing import TYPE_CHECKING from bonsai.tool.blender import Blender as subject +from test.bim.bootstrap import NewFile if TYPE_CHECKING: import bpy.stub_internal.rna_enums as rna_enums @@ -108,3 +113,57 @@ def execute(self, context): assert error_reports == [] bpy.utils.unregister_class(OBJECT_OT_test_fail_operator) + + +class TestGetSelectedFiles(NewFile): + def test_get_a_single_file(self) -> None: + with tempfile.NamedTemporaryFile() as f: + file = type("", (object,), {"name": f.name})() + assert subject.get_selected_files(Path(f.name).parent, [file]) == [f.name] + + def test_get_multiple_files(self) -> None: + with tempfile.NamedTemporaryFile() as f: + with tempfile.NamedTemporaryFile() as g: + file = type("", (object,), {"name": f.name})() + file2 = type("", (object,), {"name": g.name})() + assert subject.get_selected_files(Path(f.name).parent, [file, file2]) == [f.name, g.name] + + def test_exclude_directories(self) -> None: + with tempfile.NamedTemporaryFile() as f: + with tempfile.TemporaryDirectory() as d: + file = type("", (object,), {"name": f.name})() + directory = type("", (object,), {"name": d})() + assert subject.get_selected_files(Path(f.name).parent, [file, directory]) == [f.name] + + def test_get_relative_paths(self) -> None: + with tempfile.TemporaryDirectory() as tmp_dir: + base_path = Path(tmp_dir) + with tempfile.NamedTemporaryFile(dir=tmp_dir, suffix=".ifc") as f: + tool.Ifc.set_path(str(f.name)) + with tempfile.NamedTemporaryFile(dir=tmp_dir) as g: + file = type("", (object,), {"name": g.name}) + assert subject.get_selected_files(Path(g.name).parent, [file], use_relative_path=True) == [ + Path(g.name).name + ] + + +class TestGetDebugInfo(NewFile): + # Only keys that are safe to set if Bonsai fails to load. + EXPECTED_KEYS = { + "os", + "os_version", + "python_version", + "architecture", + "machine", + "processor", + "blender_version", + "bonsai_version", + "bonsai_commit_hash", + "bonsai_commit_date", + "last_actions", + "last_error", + } + + def test_failed_to_load_returns_only_base_keys(self): + info = bonsai.get_debug_info(bonsai_failed_to_load=True) + assert set(info.keys()) == self.EXPECTED_KEYS diff --git a/src/bonsai/test/tool/test_brick.py b/src/bonsai/test/tool/test_brick.py index 7470dd59549..c3d1f429e38 100644 --- a/src/bonsai/test/tool/test_brick.py +++ b/src/bonsai/test/tool/test_brick.py @@ -17,22 +17,24 @@ # along with Bonsai. If not, see . import os + import bpy import brickschema import brickschema.persistent -from brickschema.namespaces import REF, A import ifcopenshell import ifcopenshell.api import ifcopenshell.api.aggregate import ifcopenshell.api.root import ifcopenshell.guid +from brickschema.namespaces import REF, A +from rdflib import Literal, Namespace, URIRef +from rdflib.namespace import RDF + import bonsai.core.tool import bonsai.tool as tool -from rdflib.namespace import RDF -from rdflib import Literal, URIRef, Namespace -from test.bim.bootstrap import NewFile from bonsai.tool.brick import Brick as subject from bonsai.tool.brick import BrickStore +from test.bim.bootstrap import NewFile class TestImplementsTool(NewFile): diff --git a/src/bonsai/test/tool/test_cad.py b/src/bonsai/test/tool/test_cad.py index c02aaed8c6d..2e84c717186 100644 --- a/src/bonsai/test/tool/test_cad.py +++ b/src/bonsai/test/tool/test_cad.py @@ -16,10 +16,11 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . -from test.bim.bootstrap import NewFile -from bonsai.tool.cad import Cad as subject from mathutils import Vector +from bonsai.tool.cad import Cad as subject +from test.bim.bootstrap import NewFile + V = lambda *x: Vector([float(i) for i in x]) diff --git a/src/bonsai/test/tool/test_classification.py b/src/bonsai/test/tool/test_classification.py index b584050e8d0..a48df50db40 100644 --- a/src/bonsai/test/tool/test_classification.py +++ b/src/bonsai/test/tool/test_classification.py @@ -17,14 +17,16 @@ # along with Bonsai. If not, see . import os + import bpy import ifcopenshell import ifcopenshell.util.classification import ifcopenshell.util.element + import bonsai.core.tool import bonsai.tool as tool -from test.bim.bootstrap import NewFile from bonsai.tool.classification import Classification as subject +from test.bim.bootstrap import NewFile class TestImplementsTool(NewFile): @@ -40,6 +42,7 @@ def test_add_classification_reference(self): bpy.ops.mesh.primitive_cube_add(size=10, location=(0, 0, 4)) obj = bpy.data.objects["Cube"] bpy.ops.bim.assign_class(ifc_class="IfcSpace", predefined_type="SPACE", userdefined_type="") + tool.Blender.set_active_object(obj) element = tool.Ifc.get_entity(obj) assert element @@ -64,6 +67,7 @@ def test_add_classification_refence_with_props(self): bpy.ops.mesh.primitive_cube_add(size=10, location=(0, 0, 4)) obj = bpy.data.objects["Cube"] bpy.ops.bim.assign_class(ifc_class="IfcSpace", predefined_type="SPACE", userdefined_type="") + tool.Blender.set_active_object(obj) element = tool.Ifc.get_entity(obj) assert element @@ -108,6 +112,7 @@ def test_add_clasification_reference_with_object_type(self): bpy.ops.mesh.primitive_cube_add(size=10, location=(0, 0, 4)) obj = bpy.data.objects["Cube"] bpy.ops.bim.assign_class(ifc_class="IfcSpace", predefined_type="SPACE", userdefined_type="") + tool.Blender.set_active_object(obj) element = tool.Ifc.get_entity(obj) assert element diff --git a/src/bonsai/test/tool/test_collector.py b/src/bonsai/test/tool/test_collector.py index ba59aeef928..1ddd7e63811 100644 --- a/src/bonsai/test/tool/test_collector.py +++ b/src/bonsai/test/tool/test_collector.py @@ -24,6 +24,7 @@ import ifcopenshell.api.group import ifcopenshell.api.spatial import ifcopenshell.util.element + import bonsai.core.tool import bonsai.tool as tool from bonsai.tool.collector import Collector as subject diff --git a/src/bonsai/test/tool/test_context.py b/src/bonsai/test/tool/test_context.py index f4035ecd972..c131028e983 100644 --- a/src/bonsai/test/tool/test_context.py +++ b/src/bonsai/test/tool/test_context.py @@ -18,9 +18,10 @@ import bpy import ifcopenshell -import test.bim.bootstrap + import bonsai.core.tool import bonsai.tool as tool +import test.bim.bootstrap from bonsai.tool.context import Context as subject diff --git a/src/bonsai/test/tool/test_cost.py b/src/bonsai/test/tool/test_cost.py new file mode 100644 index 00000000000..3cfbe03c91c --- /dev/null +++ b/src/bonsai/test/tool/test_cost.py @@ -0,0 +1,49 @@ +# Bonsai - OpenBIM Blender Add-on +# Copyright (C) 2021 Dion Moult +# +# This file is part of Bonsai. +# +# Bonsai is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Bonsai is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Bonsai. If not, see . + + +import test.bim.bootstrap +import ifcopenshell.api.cost + +import bonsai.core.tool +import bonsai.tool as tool +import test.bim.bootstrap +from test.bim.bootstrap import NewFile + +from bonsai.tool.cost import Cost as subject + +class TestImplementsTool(NewFile): + def test_run(self): + assert isinstance(subject(), bonsai.core.tool.Cost) + +class TestDisableEditingCostItemParent(NewFile): + def test_avoid_recursion_error(newfile, monkeypatch): + class DummyProps: + def __init__(self): + self.change_cost_item_parent = None + self.active_cost_item_id = 5 + + props = DummyProps() + monkeypatch.setattr( + "bonsai.tool.Cost.get_cost_props", + lambda: props + ) + subject.disable_editing_cost_item_parent() + assert props.active_cost_item_id == 0 + assert props.change_cost_item_parent is not False + diff --git a/src/bonsai/test/tool/test_debug.py b/src/bonsai/test/tool/test_debug.py index 24e875071be..7b434c4ee64 100644 --- a/src/bonsai/test/tool/test_debug.py +++ b/src/bonsai/test/tool/test_debug.py @@ -17,16 +17,18 @@ # along with Bonsai. If not, see . import os +from pathlib import Path + import bpy import ifcopenshell import ifcopenshell.api.style import ifcopenshell.util.schema + import bonsai.core.tool import bonsai.tool as tool -from test.bim.bootstrap import NewFile -from bonsai.tool.debug import Debug as subject from bonsai.bim.ifc import IfcStore -from pathlib import Path +from bonsai.tool.debug import Debug as subject +from test.bim.bootstrap import NewFile class TestImplementsTool(NewFile): diff --git a/src/bonsai/test/tool/test_document.py b/src/bonsai/test/tool/test_document.py index 9e3556afd5e..5afb25cd654 100644 --- a/src/bonsai/test/tool/test_document.py +++ b/src/bonsai/test/tool/test_document.py @@ -16,14 +16,17 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . +import json + import bpy import ifcopenshell import ifcopenshell.api import ifcopenshell.api.document + import bonsai.core.tool import bonsai.tool as tool -from test.bim.bootstrap import NewFile from bonsai.tool.document import Document as subject +from test.bim.bootstrap import NewFile class TestImplementsTool(NewFile): @@ -31,24 +34,6 @@ def test_run(self): assert isinstance(subject(), bonsai.core.tool.Document) -class TestAddBreadcrumb(NewFile): - def test_run(self): - ifc = ifcopenshell.file() - tool.Ifc().set(ifc) - document = ifc.createIfcDocumentInformation() - subject.add_breadcrumb(document) - props = tool.Document.get_document_props() - assert props.breadcrumbs[0].name == str(document.id()) - - -class TestClearBreadcrumbs(NewFile): - def test_run(self): - props = tool.Document.get_document_props() - props.breadcrumbs.add() - subject.clear_breadcrumbs() - assert len(props.breadcrumbs) == 0 - - class TestClearDocumentTree(NewFile): def test_run(self): props = tool.Document.get_document_props() @@ -103,15 +88,6 @@ def test_exporting_information(self): } -class TestGetActiveBreadcrumb(NewFile): - def test_run(self): - ifc = ifcopenshell.file() - tool.Ifc().set(ifc) - document = ifc.createIfcDocumentInformation() - subject.add_breadcrumb(document) - assert subject.get_active_breadcrumb() == document - - class TestImportDocumentAttributes(NewFile): def test_importing_information(self): ifc = ifcopenshell.file() @@ -166,51 +142,64 @@ def test_importing_reference(self): assert props.document_attributes["Description"].string_value == "Description" -class TestImportProjectDocuments(NewFile): +class TestImportProjectDocumentsExpanded(NewFile): def test_run(self): ifc = ifcopenshell.file() tool.Ifc().set(ifc) - ifc.createIfcProject() + project = ifc.createIfcProject() document = ifcopenshell.api.document.add_information(ifc) + reference = ifcopenshell.api.document.add_reference(ifc, information=document) + + props = tool.Document.get_document_props() + expanded_docs = [document.id()] # Mark document as expanded + props.json_string = json.dumps(expanded_docs) + subject.import_project_documents() props = tool.Document.get_document_props() - assert len(props.documents) == 1 - assert props.documents[0].ifc_definition_id == document.id() - assert props.documents[0].name == "Unnamed" - assert props.documents[0].identification == "X" - assert props.documents[0].is_information is True + # Should have project root + document + reference = 3 total + assert len(props.documents) == 3 + + assert props.documents[0].ifc_definition_id == -project.id() + assert props.documents[0].document_type == "PROJECT" + + doc_info = next((d for d in props.documents if d.ifc_definition_id == document.id()), None) + assert doc_info is not None + assert doc_info.document_type == "INFORMATION" + + doc_ref = next((d for d in props.documents if d.ifc_definition_id == reference.id()), None) + assert doc_ref is not None + assert doc_ref.location == "" + assert doc_ref.identification == "X" + assert doc_ref.document_type == "REFERENCE" -class TestImportReferences(NewFile): + +class TestImportProjectDocumentsCollapsed(NewFile): def test_run(self): ifc = ifcopenshell.file() tool.Ifc().set(ifc) - ifc.createIfcProject() + project = ifc.createIfcProject() document = ifcopenshell.api.document.add_information(ifc) reference = ifcopenshell.api.document.add_reference(ifc, information=document) - subject.import_references(document) - props = tool.Document.get_document_props() - assert len(props.documents) == 1 - assert props.documents[0].ifc_definition_id == reference.id() - assert props.documents[0].name == "Unnamed" - assert props.documents[0].identification == "X" - assert props.documents[0].is_information is False + props = tool.Document.get_document_props() + props.json_string = json.dumps([]) # Empty expanded list -class TestImportSubdocuments(NewFile): - def test_run(self): - ifc = ifcopenshell.file() - tool.Ifc().set(ifc) - ifc.createIfcProject() - document = ifcopenshell.api.document.add_information(ifc) - subdocument = ifcopenshell.api.document.add_information(ifc, parent=document) - subject.import_subdocuments(document) + subject.import_project_documents() props = tool.Document.get_document_props() - assert len(props.documents) == 1 - assert props.documents[0].ifc_definition_id == subdocument.id() - assert props.documents[0].name == "Unnamed" - assert props.documents[0].identification == "X" - assert props.documents[0].is_information is True + + # Should have project root + document = 2 total (reference not imported because parent is collapsed) + assert len(props.documents) == 2 + + assert props.documents[0].ifc_definition_id == -project.id() + assert props.documents[0].document_type == "PROJECT" + + doc_info = next((d for d in props.documents if d.ifc_definition_id == document.id()), None) + assert doc_info is not None + assert doc_info.document_type == "INFORMATION" + + doc_ref = next((d for d in props.documents if d.ifc_definition_id == reference.id()), None) + assert doc_ref is None class TestIsDocumentInformation(NewFile): @@ -222,15 +211,6 @@ def test_run(self): assert subject.is_document_information(reference) is False -class TestRemoveLatestBreadcrumb(NewFile): - def test_run(self): - props = tool.Document.get_document_props() - props.breadcrumbs.add() - props.breadcrumbs.add() - subject.remove_latest_breadcrumb() - assert len(props.breadcrumbs) == 1 - - class TestSetActiveDocument(NewFile): def test_run(self): ifc = ifcopenshell.file() diff --git a/src/bonsai/test/tool/test_drawing.py b/src/bonsai/test/tool/test_drawing.py index 960e283084c..e3de6ba2d9f 100644 --- a/src/bonsai/test/tool/test_drawing.py +++ b/src/bonsai/test/tool/test_drawing.py @@ -17,10 +17,10 @@ # along with Bonsai. If not, see . import os +import xml.etree.ElementTree as ET from pathlib import Path -import numpy as np + import bpy -import mathutils import ifcopenshell import ifcopenshell.api.drawing import ifcopenshell.api.group @@ -28,14 +28,17 @@ import ifcopenshell.api.root import ifcopenshell.guid import ifcopenshell.util.element +import mathutils +import numpy as np +import pytest +from ifcopenshell.util.shape_builder import ShapeBuilder +from mathutils import Vector + import bonsai.core.tool import bonsai.tool as tool -from test.bim.bootstrap import NewFile -from bonsai.tool.drawing import Drawing as subject from bonsai.bim.module.drawing.data import DecoratorData -from mathutils import Vector - -import xml.etree.ElementTree as ET +from bonsai.tool.drawing import Drawing as subject +from test.bim.bootstrap import NewFile class TestImplementsTool(NewFile): @@ -149,6 +152,34 @@ def test_run(self): assert props.is_editing_sheets == False +class TestEditTextLiterals(NewFile): + def test_run(self): + ifc = ifcopenshell.file() + tool.Ifc.set(ifc) + obj = bpy.data.objects.new("Object", None) + element = ifc.createIfcAnnotation() + element.Representation = ifc.createIfcProductDefinitionShape() + context = ifc.createIfcGeometricRepresentationSubContext(ContextType="Plan", ContextIdentifier="Annotation") + item = ifc.createIfcTextLiteralWithExtent(Literal="Literal", Path="RIGHT", BoxAlignment="bottom-left") + builder = ShapeBuilder(tool.Ifc.get()) + polyline = builder.polyline([(0.0, 0.0, 0.0), (1.0, 0.0, 0.0)]) + representation = ifc.createIfcShapeRepresentation(ContextOfItems=context, Items=[item, polyline]) + element.Representation.Representations = [representation] + tool.Ifc.link(element, obj) + literal_attributes = [ + { + "Literal": "Foo", + "Path": "RIGHT", + "BoxAlignment": "bottom-left", + } + ] + subject.edit_text_literals(obj, literal_attributes) + assert len(ifc.by_type("IfcTextLiteralWithExtent")) == 1 + literal = ifc.by_type("IfcTextLiteralWithExtent")[0] + assert literal in representation.Items + assert literal.Literal == "Foo" + + class TestDisableEditingText(NewFile): def test_run(self): obj = bpy.data.objects.new("Object", None) @@ -635,10 +666,13 @@ def test_run(self): literal_props = props.literals[0] assert literal_props.ifc_definition_id == item.id() - assert literal_props.box_alignment[:] == tuple([False] * 6 + [True] + [False] * 2) assert literal_props.attributes["Literal"].string_value == "Literal" assert literal_props.attributes["Path"].enum_value == "RIGHT" assert literal_props.attributes["BoxAlignment"].string_value == "bottom-left" + assert literal_props.align_vertical == "bottom" + assert literal_props.align_horizontal == "left" + assert props.align_vertical == "bottom" + assert props.align_horizontal == "left" class TestReplaceTextLiteralVariables(NewFile): @@ -903,7 +937,7 @@ def test_run(self): bpy.ops.bim.save_project(filepath=str(ifc_path), should_save_as=True) filepath = Path("test/files/image.jpg").absolute() - bpy.ops.bim.add_reference_image(filepath=str(filepath)) + bpy.ops.bim.add_reference_image(filepath=str(filepath), x_length=3.53982, y_length=2.0) obj = bpy.data.objects["IfcAnnotation/image"] assert obj is not None @@ -927,71 +961,3 @@ def test_run(self): uv_node = material_nodes["Texture Coordinate"] assert len(uv_node.outputs["Generated"].links[:]) == 1 - - -class TestAddReference(NewFile): - def test_add_single_reference(self): - """Test adding a single reference file (backward compatibility)""" - bpy.ops.bim.create_project() - ifc_path = Path("test/files/temp/test.ifc").absolute() - bpy.ops.bim.save_project(filepath=str(ifc_path), should_save_as=True) - - # Create a temporary SVG file - svg_path = Path("test/files/temp/reference.svg").absolute() - svg_path.parent.mkdir(parents=True, exist_ok=True) - with open(svg_path, "w") as f: - f.write('') - - try: - # Add single reference - bpy.ops.bim.add_reference(filepath=str(svg_path)) - - # Verify reference was added - ifc = tool.Ifc.get() - references = [doc for doc in ifc.by_type("IfcDocumentInformation") if doc.Scope == "REFERENCE"] - assert len(references) == 1 - assert references[0].Name == "reference" - finally: - # Cleanup - if svg_path.exists(): - svg_path.unlink() - - def test_add_multiple_references(self): - """Test adding multiple reference files at once""" - bpy.ops.bim.create_project() - ifc_path = Path("test/files/temp/test.ifc").absolute() - bpy.ops.bim.save_project(filepath=str(ifc_path), should_save_as=True) - - # Create temporary SVG files - temp_dir = Path("test/files/temp").absolute() - temp_dir.mkdir(parents=True, exist_ok=True) - - svg_files = [] - for i in range(3): - svg_path = temp_dir / f"reference_{i}.svg" - with open(svg_path, "w") as f: - f.write('') - svg_files.append(svg_path) - - try: - # Test by directly calling core.add_document multiple times - # (simulating what the operator does with multiple files) - ifc = tool.Ifc.get() - for svg_file in svg_files: - uri = tool.Ifc.get_uri(str(svg_file), use_relative_path=True) - from bonsai.bim import core - - core.drawing.add_document(tool.Ifc, tool.Drawing, "REFERENCE", uri=uri) - - # Verify all references were added - references = [doc for doc in ifc.by_type("IfcDocumentInformation") if doc.Scope == "REFERENCE"] - assert len(references) == 3 - - reference_names = {ref.Name for ref in references} - expected_names = {f"reference_{i}" for i in range(3)} - assert reference_names == expected_names - finally: - # Cleanup - for svg_file in svg_files: - if svg_file.exists(): - svg_file.unlink() diff --git a/src/bonsai/test/tool/test_geometry.py b/src/bonsai/test/tool/test_geometry.py index a2107da12fd..424e1fd8760 100644 --- a/src/bonsai/test/tool/test_geometry.py +++ b/src/bonsai/test/tool/test_geometry.py @@ -16,19 +16,21 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . -import bpy import math -import numpy as np +from typing import Union + +import bpy import ifcopenshell import ifcopenshell.api.geometry import ifcopenshell.api.root import ifcopenshell.api.type +import numpy as np +from mathutils import Vector + import bonsai.core.tool import bonsai.tool as tool -from mathutils import Vector -from test.bim.bootstrap import NewFile from bonsai.tool.geometry import Geometry as subject -from typing import Union +from test.bim.bootstrap import NewFile class TestImplementsTool(NewFile): @@ -321,8 +323,8 @@ def test_run(self): obj = bpy.data.objects.new("Object", None) props = tool.Blender.get_object_bim_props(obj) subject.record_object_position(obj) - assert props.location_checksum == repr(np.array(obj.matrix_world.translation, dtype=np.float32).tobytes()) - assert props.rotation_checksum == repr(np.array(obj.matrix_world.to_3x3(), dtype=np.float32).tobytes()) + assert props.location_checksum == repr(tool.Blender.np_array_legacy(obj.matrix_world.translation).tobytes()) + assert props.rotation_checksum == repr(tool.Blender.np_array_legacy(obj.matrix_world.to_3x3()).tobytes()) class TestRemoveConnection(NewFile): diff --git a/src/bonsai/test/tool/test_georeference.py b/src/bonsai/test/tool/test_georeference.py index a6292abde4f..2d29f8429bd 100644 --- a/src/bonsai/test/tool/test_georeference.py +++ b/src/bonsai/test/tool/test_georeference.py @@ -16,19 +16,21 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . -import bpy import math + +import bpy import ifcopenshell import ifcopenshell.api import ifcopenshell.api.context import ifcopenshell.api.georeference import ifcopenshell.api.root import ifcopenshell.api.unit +from mathutils import Vector + import bonsai.core.tool import bonsai.tool as tool -from mathutils import Vector -from test.bim.bootstrap import NewFile from bonsai.tool.georeference import Georeference as subject +from test.bim.bootstrap import NewFile class TestImplementsTool(NewFile): diff --git a/src/bonsai/test/tool/test_ifc.py b/src/bonsai/test/tool/test_ifc.py index 3cbd7bdc222..9542332d52b 100644 --- a/src/bonsai/test/tool/test_ifc.py +++ b/src/bonsai/test/tool/test_ifc.py @@ -16,15 +16,17 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . +import os +import tempfile +from pathlib import Path + import bpy import ifcopenshell -import test.bim.bootstrap +import pytest + import bonsai.core.tool import bonsai.tool as tool -import pytest -import tempfile -import os -from pathlib import Path +import test.bim.bootstrap from bonsai.tool.ifc import Ifc as subject diff --git a/src/bonsai/test/tool/test_ifcgit.py b/src/bonsai/test/tool/test_ifcgit.py new file mode 100644 index 00000000000..964bd96fd26 --- /dev/null +++ b/src/bonsai/test/tool/test_ifcgit.py @@ -0,0 +1,581 @@ +# Bonsai - OpenBIM Blender Add-on +# Copyright (C) 2025 Dion Moult +# +# This file is part of Bonsai. +# +# Bonsai is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Bonsai is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Bonsai. If not, see . +# This file was generated with the assistance of an AI coding tool. + +import os +import tempfile + +import bonsai.core.tool +from bonsai.tool.ifcgit import IfcGit, IfcGitRepo +from test.bim.bootstrap import NewFile + +try: + import git + import git.exc + + HAS_GIT = True +except ImportError: + HAS_GIT = False + +import pytest + +requires_git = pytest.mark.skipif(not HAS_GIT, reason="GitPython not available") + + +def _make_repo(tmpdir: str) -> "git.Repo": + """Initialise a git repo with user config (needed for commits).""" + repo = git.Repo.init(tmpdir) + with repo.config_writer() as cfg: + cfg.set_value("user", "name", "Test User") + cfg.set_value("user", "email", "test@example.com") + return repo + + +def _commit_ifc(repo: "git.Repo", tmpdir: str, content: str, message: str) -> str: + """Write content to model.ifc, stage and commit it. Returns commit hexsha.""" + ifc_path = os.path.join(tmpdir, "model.ifc") + with open(ifc_path, "w") as f: + f.write(content) + repo.index.add([os.path.normpath(ifc_path)]) + commit = repo.index.commit(message) + return commit.hexsha + + +# --------------------------------------------------------------------------- +# Interface conformance +# --------------------------------------------------------------------------- + + +class TestImplementsTool(NewFile): + def test_run(self): + assert isinstance(IfcGit(), bonsai.core.tool.IfcGit) + + +# --------------------------------------------------------------------------- +# Pure-logic (no git required) +# --------------------------------------------------------------------------- + + +class TestIsValidRefFormat(NewFile): + def test_simple_name(self): + assert IfcGit.is_valid_ref_format("main") + + def test_name_with_slash(self): + assert IfcGit.is_valid_ref_format("feature/my-feature") + + def test_name_with_numbers(self): + assert IfcGit.is_valid_ref_format("release-2024") + + def test_rejects_leading_dot(self): + assert not IfcGit.is_valid_ref_format(".hidden") + + def test_rejects_leading_dash(self): + assert not IfcGit.is_valid_ref_format("-branch") + + def test_rejects_space(self): + assert not IfcGit.is_valid_ref_format("my branch") + + def test_rejects_double_dot(self): + assert not IfcGit.is_valid_ref_format("my..branch") + + def test_rejects_tilde(self): + assert not IfcGit.is_valid_ref_format("my~branch") + + def test_rejects_caret(self): + assert not IfcGit.is_valid_ref_format("my^branch") + + def test_rejects_trailing_dot(self): + assert not IfcGit.is_valid_ref_format("branch.") + + def test_rejects_trailing_slash(self): + assert not IfcGit.is_valid_ref_format("branch/") + + def test_rejects_dot_lock_suffix(self): + assert not IfcGit.is_valid_ref_format("branch.lock") + + def test_rejects_empty_string(self): + assert not IfcGit.is_valid_ref_format("") + + def test_rejects_at_brace(self): + assert not IfcGit.is_valid_ref_format("branch@{upstream}") + + +class TestGetPathDir(NewFile): + def test_returns_parent_directory(self): + assert IfcGit.get_path_dir("/some/path/model.ifc") == "/some/path" + + def test_handles_nested_path(self): + assert IfcGit.get_path_dir("/a/b/c/d.ifc") == "/a/b/c" + + def test_returns_absolute_path(self): + result = IfcGit.get_path_dir("/a/b/model.ifc") + assert os.path.isabs(result) + + +# --------------------------------------------------------------------------- +# File I/O +# --------------------------------------------------------------------------- + + +class TestDos2Unix(NewFile): + def test_converts_crlf_to_lf(self): + with tempfile.NamedTemporaryFile(suffix=".ifc", delete=False, mode="wb") as f: + f.write(b"line1\r\nline2\r\nline3\r\n") + path = f.name + try: + IfcGit.dos2unix(path) + with open(path, "rb") as f: + assert f.read() == b"line1\nline2\nline3\n" + finally: + os.unlink(path) + + def test_lf_only_file_is_unchanged(self): + with tempfile.NamedTemporaryFile(suffix=".ifc", delete=False, mode="wb") as f: + f.write(b"line1\nline2\nline3\n") + path = f.name + try: + IfcGit.dos2unix(path) + with open(path, "rb") as f: + assert f.read() == b"line1\nline2\nline3\n" + finally: + os.unlink(path) + + def test_empty_file_unchanged(self): + with tempfile.NamedTemporaryFile(suffix=".ifc", delete=False, mode="wb") as f: + f.write(b"") + path = f.name + try: + IfcGit.dos2unix(path) + with open(path, "rb") as f: + assert f.read() == b"" + finally: + os.unlink(path) + + +# --------------------------------------------------------------------------- +# Git repo initialisation +# --------------------------------------------------------------------------- + + +class TestInitRepo(NewFile): + @requires_git + def test_creates_git_repo(self): + with tempfile.TemporaryDirectory() as tmpdir: + IfcGitRepo.repo = None + IfcGit.init_repo(tmpdir) + assert IfcGitRepo.repo is not None + assert os.path.isdir(IfcGitRepo.repo.git_dir) + IfcGitRepo.repo = None + + @requires_git + def test_creates_info_attributes_file(self): + with tempfile.TemporaryDirectory() as tmpdir: + IfcGitRepo.repo = None + IfcGit.init_repo(tmpdir) + attrs_path = os.path.join(IfcGitRepo.repo.git_dir, "info", "attributes") + assert os.path.isfile(attrs_path) + with open(attrs_path) as f: + assert "*.ifc text" in f.read() + IfcGitRepo.repo = None + + +class TestRepoFromPath(NewFile): + @requires_git + def test_finds_repo_from_file_in_root(self): + with tempfile.TemporaryDirectory() as tmpdir: + IfcGitRepo.repo = None + repo = _make_repo(tmpdir) + ifc_path = os.path.join(tmpdir, "model.ifc") + open(ifc_path, "w").close() + result = IfcGit.repo_from_path(ifc_path) + assert result is not None + assert os.path.abspath(result.working_dir) == os.path.abspath(tmpdir) + IfcGitRepo.repo = None + + @requires_git + def test_finds_repo_from_subdirectory(self): + with tempfile.TemporaryDirectory() as tmpdir: + IfcGitRepo.repo = None + _make_repo(tmpdir) + subdir = os.path.join(tmpdir, "sub", "dir") + os.makedirs(subdir) + result = IfcGit.repo_from_path(subdir) + assert result is not None + IfcGitRepo.repo = None + + @requires_git + def test_returns_none_for_path_outside_any_repo(self): + with tempfile.TemporaryDirectory() as tmpdir: + IfcGitRepo.repo = None + # a plain directory with no .git anywhere above it (using /tmp directly + # is safe since /tmp is not a git repo on this system) + result = IfcGit.repo_from_path("/nonexistent/path/that/does/not/exist") + assert result is None + IfcGitRepo.repo = None + + +# --------------------------------------------------------------------------- +# Git repo configuration +# --------------------------------------------------------------------------- + + +class TestConfigInfoAttributes(NewFile): + @requires_git + def test_creates_attributes_file(self): + with tempfile.TemporaryDirectory() as tmpdir: + repo = _make_repo(tmpdir) + IfcGit.config_info_attributes(repo) + attrs_path = os.path.join(repo.git_dir, "info", "attributes") + assert os.path.isfile(attrs_path) + with open(attrs_path) as f: + assert "*.ifc text" in f.read() + + @requires_git + def test_does_not_overwrite_existing_attributes(self): + with tempfile.TemporaryDirectory() as tmpdir: + repo = _make_repo(tmpdir) + attrs_path = os.path.join(repo.git_dir, "info", "attributes") + os.makedirs(os.path.dirname(attrs_path), exist_ok=True) + with open(attrs_path, "w") as f: + f.write("*.png binary\n") + IfcGit.config_info_attributes(repo) + with open(attrs_path) as f: + content = f.read() + assert "*.png binary" in content # original content preserved + + +class TestConfigPush(NewFile): + @requires_git + def test_sets_push_defaults(self): + with tempfile.TemporaryDirectory() as tmpdir: + repo = _make_repo(tmpdir) + IfcGit.config_push(repo) + reader = repo.config_reader() + assert reader.get_value("push", "default") == "current" + assert reader.get_value("push", "autoSetupRemote") is True + + @requires_git + def test_does_not_overwrite_existing_push_section(self): + with tempfile.TemporaryDirectory() as tmpdir: + repo = _make_repo(tmpdir) + with repo.config_writer() as w: + w.set_value("push", "default", "simple") + IfcGit.config_push(repo) + reader = repo.config_reader() + assert reader.get_value("push", "default") == "simple" + + +# --------------------------------------------------------------------------- +# Branch / tag lookups +# --------------------------------------------------------------------------- + + +class TestBranchesByHexsha(NewFile): + @requires_git + def test_maps_head_commit_to_active_branch(self): + with tempfile.TemporaryDirectory() as tmpdir: + repo = _make_repo(tmpdir) + _commit_ifc(repo, tmpdir, "#1=IFCPROJECT('abc',$,$,$,$,$,$,$,$);\n", "init") + result = IfcGit.branches_by_hexsha(repo) + head_sha = repo.head.commit.hexsha + assert head_sha in result + names = [b.name for b in result[head_sha]] + assert repo.active_branch.name in names + + @requires_git + def test_returns_empty_dict_when_no_commits(self): + with tempfile.TemporaryDirectory() as tmpdir: + repo = _make_repo(tmpdir) + result = IfcGit.branches_by_hexsha(repo) + assert result == {} + + @requires_git + def test_includes_both_branches_when_pointing_to_same_commit(self): + with tempfile.TemporaryDirectory() as tmpdir: + repo = _make_repo(tmpdir) + _commit_ifc(repo, tmpdir, "#1=IFCPROJECT('abc',$,$,$,$,$,$,$,$);\n", "init") + repo.create_head("feature") + result = IfcGit.branches_by_hexsha(repo) + head_sha = repo.head.commit.hexsha + names = [b.name for b in result[head_sha]] + assert len(names) == 2 + + +class TestTagsByHexsha(NewFile): + @requires_git + def test_returns_empty_dict_when_no_tags(self): + with tempfile.TemporaryDirectory() as tmpdir: + repo = _make_repo(tmpdir) + _commit_ifc(repo, tmpdir, "#1=IFCPROJECT('abc',$,$,$,$,$,$,$,$);\n", "init") + assert IfcGit.tags_by_hexsha(repo) == {} + + @requires_git + def test_maps_commit_to_annotated_tag(self): + with tempfile.TemporaryDirectory() as tmpdir: + repo = _make_repo(tmpdir) + _commit_ifc(repo, tmpdir, "#1=IFCPROJECT('abc',$,$,$,$,$,$,$,$);\n", "init") + repo.create_tag("v1.0", message="Release 1.0") + result = IfcGit.tags_by_hexsha(repo) + head_sha = repo.head.commit.hexsha + assert head_sha in result + assert result[head_sha][0].name == "v1.0" + + @requires_git + def test_maps_commit_to_lightweight_tag(self): + with tempfile.TemporaryDirectory() as tmpdir: + repo = _make_repo(tmpdir) + _commit_ifc(repo, tmpdir, "#1=IFCPROJECT('abc',$,$,$,$,$,$,$,$);\n", "init") + repo.create_tag("v0.1") + result = IfcGit.tags_by_hexsha(repo) + head_sha = repo.head.commit.hexsha + assert head_sha in result + + +class TestDeleteTag(NewFile): + @requires_git + def test_removes_existing_tag(self): + with tempfile.TemporaryDirectory() as tmpdir: + repo = _make_repo(tmpdir) + _commit_ifc(repo, tmpdir, "#1=IFCPROJECT('abc',$,$,$,$,$,$,$,$);\n", "init") + repo.create_tag("v1.0") + IfcGit.delete_tag(repo, "v1.0") + assert "v1.0" not in [t.name for t in repo.tags] + + @requires_git + def test_does_not_raise_for_nonexistent_tag(self): + with tempfile.TemporaryDirectory() as tmpdir: + repo = _make_repo(tmpdir) + _commit_ifc(repo, tmpdir, "#1=IFCPROJECT('abc',$,$,$,$,$,$,$,$);\n", "init") + IfcGit.delete_tag(repo, "does-not-exist") # must not raise + + +# --------------------------------------------------------------------------- +# IFC diff parsing +# --------------------------------------------------------------------------- + + +class TestIfcDiffIds(NewFile): + @requires_git + def test_detects_modified_entity(self): + with tempfile.TemporaryDirectory() as tmpdir: + repo = _make_repo(tmpdir) + sha_a = _commit_ifc(repo, tmpdir, "#1=IFCPROJECT('abc',$,$,$,$,$,$,$,$);\n", "init") + ifc_path = os.path.join(tmpdir, "model.ifc") + sha_b = _commit_ifc(repo, tmpdir, "#1=IFCPROJECT('xyz',$,$,$,$,$,$,$,$);\n", "update") + result = IfcGit.ifc_diff_ids(repo, sha_a, sha_b, ifc_path) + assert 1 in result["modified"] + assert result["added"] == set() + assert result["removed"] == set() + + @requires_git + def test_detects_added_entity(self): + with tempfile.TemporaryDirectory() as tmpdir: + repo = _make_repo(tmpdir) + sha_a = _commit_ifc(repo, tmpdir, "#1=IFCPROJECT('abc',$,$,$,$,$,$,$,$);\n", "init") + ifc_path = os.path.join(tmpdir, "model.ifc") + sha_b = _commit_ifc( + repo, + tmpdir, + "#1=IFCPROJECT('abc',$,$,$,$,$,$,$,$);\n#2=IFCSITE('new',$,$,$,$,$,$,$,$,$,$,$,$);\n", + "add site", + ) + result = IfcGit.ifc_diff_ids(repo, sha_a, sha_b, ifc_path) + assert 2 in result["added"] + assert 1 not in result["modified"] + assert result["removed"] == set() + + @requires_git + def test_detects_removed_entity(self): + with tempfile.TemporaryDirectory() as tmpdir: + repo = _make_repo(tmpdir) + sha_a = _commit_ifc(repo, tmpdir, "#1=IFCPROJECT('abc',$,$,$,$,$,$,$,$);\n", "init") + ifc_path = os.path.join(tmpdir, "model.ifc") + sha_b = _commit_ifc(repo, tmpdir, "", "clear") + result = IfcGit.ifc_diff_ids(repo, sha_a, sha_b, ifc_path) + assert 1 in result["removed"] + assert result["added"] == set() + assert result["modified"] == set() + + @requires_git + def test_no_changes_between_identical_commits(self): + with tempfile.TemporaryDirectory() as tmpdir: + repo = _make_repo(tmpdir) + sha = _commit_ifc(repo, tmpdir, "#1=IFCPROJECT('abc',$,$,$,$,$,$,$,$);\n", "init") + ifc_path = os.path.join(tmpdir, "model.ifc") + result = IfcGit.ifc_diff_ids(repo, sha, sha, ifc_path) + assert result["modified"] == set() + assert result["added"] == set() + assert result["removed"] == set() + + @requires_git + def test_diff_against_working_tree_with_none_hash_a(self): + with tempfile.TemporaryDirectory() as tmpdir: + repo = _make_repo(tmpdir) + _commit_ifc(repo, tmpdir, "#1=IFCPROJECT('abc',$,$,$,$,$,$,$,$);\n", "init") + ifc_path = os.path.join(tmpdir, "model.ifc") + # Make an uncommitted change in working tree + with open(ifc_path, "w") as f: + f.write("#1=IFCPROJECT('xyz',$,$,$,$,$,$,$,$);\n") + result = IfcGit.ifc_diff_ids(repo, None, "HEAD", ifc_path) + assert 1 in result["modified"] + + @requires_git + def test_handles_multiple_changed_entities(self): + with tempfile.TemporaryDirectory() as tmpdir: + repo = _make_repo(tmpdir) + sha_a = _commit_ifc( + repo, + tmpdir, + "#1=IFCPROJECT('abc',$,$,$,$,$,$,$,$);\n#2=IFCSITE('s',$,$,$,$,$,$,$,$,$,$,$,$);\n", + "init", + ) + ifc_path = os.path.join(tmpdir, "model.ifc") + sha_b = _commit_ifc( + repo, + tmpdir, + "#1=IFCPROJECT('xyz',$,$,$,$,$,$,$,$);\n#2=IFCSITE('t',$,$,$,$,$,$,$,$,$,$,$,$);\n", + "update both", + ) + result = IfcGit.ifc_diff_ids(repo, sha_a, sha_b, ifc_path) + assert 1 in result["modified"] + assert 2 in result["modified"] + + +# --------------------------------------------------------------------------- +# Merge conflict report — store / clear / get +# --------------------------------------------------------------------------- + + +class TestStoreClearGetMergeConflicts(NewFile): + def test_round_trip(self): + conflicts = [{"type": "attribute_conflict", "entity_id": 42}] + IfcGit.store_merge_conflicts(conflicts) + result = IfcGit.get_merge_conflicts() + assert result == conflicts + + def test_get_returns_none_when_empty(self): + IfcGit.clear_merge_conflicts() + assert IfcGit.get_merge_conflicts() is None + + def test_clear_removes_stored_conflicts(self): + IfcGit.store_merge_conflicts([{"type": "class_changed"}]) + IfcGit.clear_merge_conflicts() + assert IfcGit.get_merge_conflicts() is None + + def test_get_returns_none_on_corrupt_json(self): + import bpy + + bpy.context.scene.IfcGitProperties.merge_conflicts = "not valid json {" + assert IfcGit.get_merge_conflicts() is None + + +# --------------------------------------------------------------------------- +# git_mergetool — report file reading +# --------------------------------------------------------------------------- + + +class TestGitMergetool: + @requires_git + def test_returns_none_when_report_file_absent(self): + import unittest.mock as mock + + with tempfile.TemporaryDirectory() as tmpdir: + ifc_path = os.path.join(tmpdir, "model.ifc") + mock_repo = mock.MagicMock() + IfcGitRepo.repo = mock_repo + result = IfcGit.git_mergetool("ifcmerge", ifc_path) + assert result is None + IfcGitRepo.repo = None + + @requires_git + def test_returns_none_when_report_file_empty(self): + import unittest.mock as mock + + with tempfile.TemporaryDirectory() as tmpdir: + ifc_path = os.path.join(tmpdir, "model.ifc") + report_path = ifc_path + ".ifcmerge" + open(report_path, "w").close() + mock_repo = mock.MagicMock() + IfcGitRepo.repo = mock_repo + result = IfcGit.git_mergetool("ifcmerge", ifc_path) + assert result is None + assert not os.path.exists(report_path) + IfcGitRepo.repo = None + + @requires_git + def test_parses_conflict_report_and_deletes_file(self): + import json + import unittest.mock as mock + + with tempfile.TemporaryDirectory() as tmpdir: + ifc_path = os.path.join(tmpdir, "model.ifc") + report_path = ifc_path + ".ifcmerge" + conflicts = [{"type": "attribute_conflict", "entity_id": 5}] + with open(report_path, "w") as f: + json.dump({"status": "failed", "conflicts": conflicts}, f) + mock_repo = mock.MagicMock() + mock_repo.git.mergetool.side_effect = git.exc.GitCommandError("mergetool", 1) + IfcGitRepo.repo = mock_repo + result = IfcGit.git_mergetool("ifcmerge", ifc_path) + assert result == conflicts + assert not os.path.exists(report_path) + IfcGitRepo.repo = None + + +# --------------------------------------------------------------------------- +# config_ifcmerge — cmd format and update +# --------------------------------------------------------------------------- + + +class TestConfigIfcmerge: + @requires_git + def test_writes_redirect_cmd_on_first_call(self): + with tempfile.TemporaryDirectory() as tmpdir: + repo = _make_repo(tmpdir) + IfcGitRepo.repo = repo + IfcGit.config_ifcmerge() + reader = repo.config_reader() + cmd = reader.get_value('mergetool "ifcmerge"', "cmd") + assert "> $MERGED.ifcmerge" in cmd + IfcGitRepo.repo = None + + @requires_git + def test_updates_cmd_missing_redirect(self): + with tempfile.TemporaryDirectory() as tmpdir: + repo = _make_repo(tmpdir) + IfcGitRepo.repo = repo + with repo.config_writer() as w: + w.set_value('mergetool "ifcmerge"', "cmd", "ifcmerge $BASE $LOCAL $REMOTE $MERGED") + w.set_value('mergetool "ifcmerge"', "trustExitCode", True) + IfcGit.config_ifcmerge() + reader = repo.config_reader() + cmd = reader.get_value('mergetool "ifcmerge"', "cmd") + assert "> $MERGED.ifcmerge" in cmd + IfcGitRepo.repo = None + + @requires_git + def test_forward_tool_writes_redirect_cmd(self): + with tempfile.TemporaryDirectory() as tmpdir: + repo = _make_repo(tmpdir) + IfcGitRepo.repo = repo + IfcGit.config_ifcmerge() + reader = repo.config_reader() + cmd = reader.get_value('mergetool "ifcmerge-forward"', "cmd") + assert "--prioritise-local" in cmd + assert "> $MERGED.ifcmerge" in cmd + IfcGitRepo.repo = None diff --git a/src/bonsai/test/tool/test_library.py b/src/bonsai/test/tool/test_library.py index 64d73f918b5..b0bbbf39909 100644 --- a/src/bonsai/test/tool/test_library.py +++ b/src/bonsai/test/tool/test_library.py @@ -18,10 +18,11 @@ import bpy import ifcopenshell + import bonsai.core.tool import bonsai.tool as tool -from test.bim.bootstrap import NewFile from bonsai.tool.library import Library as subject +from test.bim.bootstrap import NewFile class TestImplementsTool(NewFile): diff --git a/src/bonsai/test/tool/test_loader.py b/src/bonsai/test/tool/test_loader.py index b128988abaa..8817d3d92b8 100644 --- a/src/bonsai/test/tool/test_loader.py +++ b/src/bonsai/test/tool/test_loader.py @@ -16,21 +16,23 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . -import bpy -import bmesh import json +from pathlib import Path + +import bmesh +import bpy import ifcopenshell import ifcopenshell.api.library import ifcopenshell.api.style import ifcopenshell.util.schema -import bonsai.core.tool -import bonsai.tool as tool -from test.bim.bootstrap import NewFile -from bonsai.tool.loader import Loader as subject import numpy as np from ifcopenshell.util.shape_builder import ShapeBuilder from mathutils import Vector -from pathlib import Path + +import bonsai.core.tool +import bonsai.tool as tool +from bonsai.tool.loader import Loader as subject +from test.bim.bootstrap import NewFile class TestImplementsTool(NewFile): @@ -188,8 +190,8 @@ def test_create_surface_style_with_textures_from_ifc_blob_image(self): def get_png_raster_code(): import base64 - import zlib import struct + import zlib # https://blender.stackexchange.com/questions/62072/does-blender-have-a-method-to-a-get-png-formatted-bytearray-for-an-image-via-pyt width = 2 diff --git a/src/bonsai/test/tool/test_material.py b/src/bonsai/test/tool/test_material.py index ef423afb4c6..870417a254c 100644 --- a/src/bonsai/test/tool/test_material.py +++ b/src/bonsai/test/tool/test_material.py @@ -23,10 +23,11 @@ import ifcopenshell.api.pset import ifcopenshell.api.root import ifcopenshell.api.style + import bonsai.core.tool import bonsai.tool as tool -from test.bim.bootstrap import NewFile from bonsai.tool.material import Material as subject +from test.bim.bootstrap import NewFile class TestImplementsTool(NewFile): diff --git a/src/bonsai/test/tool/test_misc.py b/src/bonsai/test/tool/test_misc.py index 883755888ae..21c1fd341cf 100644 --- a/src/bonsai/test/tool/test_misc.py +++ b/src/bonsai/test/tool/test_misc.py @@ -16,16 +16,18 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . -import bpy import math -import numpy + +import bpy import ifcopenshell import ifcopenshell.api.aggregate import ifcopenshell.api.spatial import ifcopenshell.api.unit -import test.bim.bootstrap +import numpy + import bonsai.core.tool import bonsai.tool as tool +import test.bim.bootstrap from bonsai.tool.misc import Misc as subject @@ -169,6 +171,12 @@ def test_run(self): assert list(obj.scale) == [1.0, 1.0, 1.0] +class TestQuickFavoritesOffsetUserMenus(test.bim.bootstrap.NewFile): + def test_current_blender_version_is_supported(self): + version = bpy.app.version[:2] + assert version in subject.QuickFavorites.OFFSET_USER_MENUS + + class TestSplitObjectsWithCutter(test.bim.bootstrap.NewFile): def test_run(self): bpy.ops.mesh.primitive_cube_add() diff --git a/src/bonsai/test/tool/test_model.py b/src/bonsai/test/tool/test_model.py index d69b2a532ee..30782b8a151 100644 --- a/src/bonsai/test/tool/test_model.py +++ b/src/bonsai/test/tool/test_model.py @@ -16,6 +16,9 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . +import json +from typing import Any + import bpy import ifcopenshell import ifcopenshell.api.geometry @@ -26,14 +29,13 @@ import ifcopenshell.util.element import ifcopenshell.util.representation import ifcopenshell.util.shape_builder +import numpy as np +from ifcopenshell.util.shape_builder import ShapeBuilder, V + import bonsai.core.tool import bonsai.tool as tool -import numpy as np -import json -from typing import Any -from test.bim.bootstrap import NewFile from bonsai.tool.model import Model as subject -from ifcopenshell.util.shape_builder import V, ShapeBuilder +from test.bim.bootstrap import NewFile class TestImplementsTool(NewFile): @@ -174,6 +176,7 @@ def test_run(self): pset_data = pset_data_base.copy() calculated_data = calculated_data_base.copy() pset_data["custom_first_last_tread_run"] = (0.1, 0.4) + pset_data["custom_tread_lock"] = False calculated_data["Length"] += -0.2 + 0.1 self.compare_data(pset_data, calculated_data) @@ -181,6 +184,7 @@ def test_run(self): pset_data = pset_data_base.copy() calculated_data = calculated_data_base.copy() pset_data["custom_first_last_tread_run"] = (0.0, None) + pset_data["custom_tread_lock"] = False calculated_data["Length"] = 0.9 # Only 3 treads at 0.3 each self.compare_data(pset_data, calculated_data) @@ -188,6 +192,7 @@ def test_run(self): pset_data = pset_data_base.copy() calculated_data = calculated_data_base.copy() pset_data["custom_first_last_tread_run"] = (None, 0.0) + pset_data["custom_tread_lock"] = False calculated_data["Length"] = 0.9 # Only 3 treads at 0.3 each self.compare_data(pset_data, calculated_data) @@ -195,6 +200,7 @@ def test_run(self): pset_data = pset_data_base.copy() calculated_data = calculated_data_base.copy() pset_data["custom_first_last_tread_run"] = (0.0, 0.0) + pset_data["custom_tread_lock"] = False calculated_data["Length"] = 0.6 # Only 2 middle treads at 0.3 each self.compare_data(pset_data, calculated_data) diff --git a/src/bonsai/test/tool/test_nest.py b/src/bonsai/test/tool/test_nest.py index 257bbcee888..368ea9a923b 100644 --- a/src/bonsai/test/tool/test_nest.py +++ b/src/bonsai/test/tool/test_nest.py @@ -19,11 +19,13 @@ import bpy import ifcopenshell import ifcopenshell.api +import ifcopenshell.api.nest import ifcopenshell.api.spatial + import bonsai.core.tool import bonsai.tool as tool -from test.bim.bootstrap import NewFile from bonsai.tool.nest import Nest as subject +from test.bim.bootstrap import NewFile class TestImplementsTool(NewFile): @@ -50,6 +52,42 @@ def test_unlinked_elements_cannot_nest(self): subelement_obj = bpy.data.objects.new("Object", None) assert subject.can_nest(element_obj, subelement_obj) is False + def test_element_cannot_nest_to_itself(self): + ifc = ifcopenshell.file() + tool.Ifc.set(ifc) + element = ifc.createIfcWall() + element_obj = bpy.data.objects.new("Object", None) + tool.Ifc.link(element, element_obj) + assert subject.can_nest(element_obj, element_obj) is False + + def test_cyclic_nesting_is_prevented(self): + ifc = ifcopenshell.file() + tool.Ifc.set(ifc) + wall_a = ifc.createIfcWall() + wall_a_obj = bpy.data.objects.new("WallA", None) + tool.Ifc.link(wall_a, wall_a_obj) + wall_b = ifc.createIfcWall() + wall_b_obj = bpy.data.objects.new("WallB", None) + tool.Ifc.link(wall_b, wall_b_obj) + ifcopenshell.api.nest.assign_object(ifc, related_objects=[wall_b], relating_object=wall_a) + assert subject.can_nest(wall_b_obj, wall_a_obj) is False + + def test_deep_cyclic_nesting_is_prevented(self): + ifc = ifcopenshell.file() + tool.Ifc.set(ifc) + wall_a = ifc.createIfcWall() + wall_a_obj = bpy.data.objects.new("WallA", None) + tool.Ifc.link(wall_a, wall_a_obj) + wall_b = ifc.createIfcWall() + wall_b_obj = bpy.data.objects.new("WallB", None) + tool.Ifc.link(wall_b, wall_b_obj) + wall_c = ifc.createIfcWall() + wall_c_obj = bpy.data.objects.new("WallC", None) + tool.Ifc.link(wall_c, wall_c_obj) + ifcopenshell.api.nest.assign_object(ifc, related_objects=[wall_b], relating_object=wall_a) + ifcopenshell.api.nest.assign_object(ifc, related_objects=[wall_c], relating_object=wall_b) + assert subject.can_nest(wall_c_obj, wall_a_obj) is False + class TestDisableEditing(NewFile): def test_run(self): diff --git a/src/bonsai/test/tool/test_owner.py b/src/bonsai/test/tool/test_owner.py index 84ca456e96c..bc4ed2d5335 100644 --- a/src/bonsai/test/tool/test_owner.py +++ b/src/bonsai/test/tool/test_owner.py @@ -16,15 +16,17 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . +from functools import cache +from typing import Any + import bpy import ifcopenshell import ifcopenshell.api.owner + import bonsai.core.tool import bonsai.tool as tool -from test.bim.bootstrap import NewFile from bonsai.tool.owner import Owner as subject -from typing import Any -from functools import cache +from test.bim.bootstrap import NewFile class TestImplementsTool(NewFile): diff --git a/src/bonsai/test/tool/test_patch.py b/src/bonsai/test/tool/test_patch.py index 8fce8974a97..955908f2842 100644 --- a/src/bonsai/test/tool/test_patch.py +++ b/src/bonsai/test/tool/test_patch.py @@ -17,12 +17,14 @@ # along with Bonsai. If not, see . import os + import bpy import ifcopenshell + import bonsai.core.tool import bonsai.tool as tool -from test.bim.bootstrap import NewFile from bonsai.tool.patch import Patch as subject +from test.bim.bootstrap import NewFile class TestImplementsTool(NewFile): diff --git a/src/bonsai/test/tool/test_polyline.py b/src/bonsai/test/tool/test_polyline.py index 9dd1e8f41c4..b55c6b52a64 100644 --- a/src/bonsai/test/tool/test_polyline.py +++ b/src/bonsai/test/tool/test_polyline.py @@ -21,10 +21,11 @@ import ifcopenshell.api.project import ifcopenshell.api.root import ifcopenshell.api.unit + import bonsai.core.tool import bonsai.tool as tool -from test.bim.bootstrap import NewFile from bonsai.tool.polyline import Polyline as subject +from test.bim.bootstrap import NewFile class TestImplementsTool(NewFile): diff --git a/src/bonsai/test/tool/test_project.py b/src/bonsai/test/tool/test_project.py index 5751660d83c..e9e11f46569 100644 --- a/src/bonsai/test/tool/test_project.py +++ b/src/bonsai/test/tool/test_project.py @@ -17,20 +17,26 @@ # along with Bonsai. If not, see . import contextlib +import json +import tempfile +from pathlib import Path +from tempfile import NamedTemporaryFile +from typing import cast + import bpy import ifcopenshell import ifcopenshell.api.context import ifcopenshell.api.document import ifcopenshell.api.root import ifcopenshell.api.unit -import bonsai.core.tool -import bonsai.tool as tool -import tempfile import ifcpatch +import numpy as np from ifcpatch.recipes import Ifc2Sql -from test.bim.bootstrap import NewFile + +import bonsai.core.tool +import bonsai.tool as tool from bonsai.tool.project import Project as subject -from pathlib import Path +from test.bim.bootstrap import NewFile class TestImplementsTool(NewFile): @@ -261,7 +267,7 @@ def test_load_linked_models_document_no_references(self): props = tool.Project.get_project_props() ifcopenshell.api.root.create_entity(ifc, "IfcProject") document = ifcopenshell.api.document.add_information(ifc) - document.Name = "BBIM_Linked_Models" + document.Name = "X" tool.Ifc.set(ifc) subject.load_linked_models_from_ifc() assert len(props.links) == 0 @@ -271,86 +277,81 @@ def test_load_linked_models_document_with_references(self): props = tool.Project.get_project_props() ifcopenshell.api.root.create_entity(ifc, "IfcProject") document = ifcopenshell.api.document.add_information(ifc) - document.Name = "BBIM_Linked_Models" + document.Scope = "LINKED_MODEL" reference = ifcopenshell.api.document.add_reference(ifc, document) - linked_model_path = "test.ifc" - reference.Location = linked_model_path + reference.Location = "test.ifc" + reference.Identification = "" + reference2 = ifcopenshell.api.document.add_reference(ifc, document) + reference2.Location = "test2.ifc" + reference2.Identification = "1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16" tool.Ifc.set(ifc) subject.load_linked_models_from_ifc() - assert len(props.links) == 1 - assert props.links[0].name == linked_model_path + assert len(props.links) == 2 + assert props.links[0].name == "test.ifc" + assert props.links[0].ifc_definition_id == reference.id() + assert props.links[0].has_transformation is False + assert props.links[1].name == "test2.ifc" + assert props.links[1].ifc_definition_id == reference2.id() + assert props.links[1].has_transformation is True -class TestSaveLinkedModelsToIfc(NewFile): - def test_save_linked_models_to_ifc_no_links(self): - ifc = ifcopenshell.file() - tool.Ifc.set(ifc) - subject.save_linked_models_to_ifc() - assert len(ifc.by_type("IfcDocumentInformation")) == 0 - assert len(ifc.by_type("IfcDocumentReference")) == 0 - - def test_save_linked_models_to_ifc_paths_to_add(self): - ifc = ifcopenshell.file() - ifcopenshell.api.root.create_entity(ifc, "IfcProject") +class TestCalculateLinkMatrix(NewFile): + def test_linking_a_model_without_an_offset_to_our_session_with_no_offset(self): props = tool.Project.get_project_props() - link = props.links.add() - linked_model_path = "test.ifc" - link.name = linked_model_path - tool.Ifc.set(ifc) - subject.save_linked_models_to_ifc() - assert len(documents := ifc.by_type("IfcDocumentInformation")) == 1 - assert documents[0].Name == "BBIM_Linked_Models" - assert len(references := ifc.by_type("IfcDocumentReference")) == 1 - assert references[0].Location == linked_model_path - - def test_save_linked_models_to_ifc_already_created_references(self): - ifc = ifcopenshell.file() - links = tool.Project.get_project_props().links - ifcopenshell.api.root.create_entity(ifc, "IfcProject") - - document = ifcopenshell.api.document.add_information(ifc) - document.Name = "BBIM_Linked_Models" - document_id = document.id() - reference = ifcopenshell.api.document.add_reference(ifc, document) - linked_model_path = "test.ifc" - reference.Location = linked_model_path - reference_id = reference.id() - - link = links.add() - linked_model_path = "test.ifc" - link.name = linked_model_path - tool.Ifc.set(ifc) - subject.save_linked_models_to_ifc() - - # Information and references to stay intact. - assert len(documents := ifc.by_type("IfcDocumentInformation")) == 1 - assert documents[0].id() == document_id - assert documents[0].Name == "BBIM_Linked_Models" - assert len(references := ifc.by_type("IfcDocumentReference")) == 1 - assert references[0].id() == reference_id - assert references[0].Location == linked_model_path - - def test_save_linked_models_to_ifc_references_to_remove(self): - ifc = ifcopenshell.file() - links = tool.Project.get_project_props().links - ifcopenshell.api.root.create_entity(ifc, "IfcProject") - - document = ifcopenshell.api.document.add_information(ifc) - document.Name = "BBIM_Linked_Models" - document_id = document.id() - reference = ifcopenshell.api.document.add_reference(ifc, document) - linked_model_path = "test.ifc" - reference.Location = linked_model_path - - tool.Ifc.set(ifc) - subject.save_linked_models_to_ifc() - links.clear() - - # Remove reference for removed link. - assert len(documents := ifc.by_type("IfcDocumentInformation")) == 1 - assert documents[0].id() == document_id - assert documents[0].Name == "BBIM_Linked_Models" - assert len(ifc.by_type("IfcDocumentReference")) == 0 + gprops = tool.Georeference.get_georeference_props() + with NamedTemporaryFile(suffix=".ifc.cache.json", mode="w", delete=True) as tmp: + link = props.links.add() + link.filepath = tmp.name.replace(".ifc.cache.json", ".ifc") + json.dump({"model_project_north": "0", "model_origin_si": "0,0,0"}, tmp) + tmp.flush() + gprops.model_project_north = "0" + gprops.model_origin_si = "0,0,0" + assert np.allclose(subject.calculate_link_matrix(link), np.eye(4)) + + def test_linking_an_offset_model_to_our_session_with_no_offset(self): + props = tool.Project.get_project_props() + gprops = tool.Georeference.get_georeference_props() + with NamedTemporaryFile(suffix=".ifc.cache.json", mode="w", delete=True) as tmp: + link = props.links.add() + link.filepath = tmp.name.replace(".ifc.cache.json", ".ifc") + json.dump({"model_project_north": "0", "model_origin_si": "5,0,0"}, tmp) + tmp.flush() + gprops.model_project_north = "0" + gprops.model_origin_si = "0,0,0" + m = np.eye(4) + m[0][3] = 5 + assert np.allclose(subject.calculate_link_matrix(link), m) + + def test_linking_an_offset_model_to_our_session_with_offset(self): + props = tool.Project.get_project_props() + gprops = tool.Georeference.get_georeference_props() + with NamedTemporaryFile(suffix=".ifc.cache.json", mode="w", delete=True) as tmp: + link = props.links.add() + link.filepath = tmp.name.replace(".ifc.cache.json", ".ifc") + json.dump({"model_project_north": "0", "model_origin_si": "5,0,0"}, tmp) + tmp.flush() + gprops.model_project_north = "0" + gprops.model_origin_si = "2,0,0" + m = np.eye(4) + m[0][3] = 3 + assert np.allclose(subject.calculate_link_matrix(link), m) + + def test_linking_an_offset_model_to_our_session_with_offset_and_transformation(self): + props = tool.Project.get_project_props() + gprops = tool.Georeference.get_georeference_props() + with NamedTemporaryFile(suffix=".ifc.cache.json", mode="w", delete=True) as tmp: + link = props.links.add() + link.filepath = tmp.name.replace(".ifc.cache.json", ".ifc") + transformation = np.eye(4) + transformation[0][3] = 4 + link.transformation = ",".join(map(str, transformation.reshape(-1))) + json.dump({"model_project_north": "0", "model_origin_si": "5,0,0"}, tmp) + tmp.flush() + gprops.model_project_north = "0" + gprops.model_origin_si = "2,0,0" + m = np.eye(4) + m[0][3] = 7 + assert np.allclose(subject.calculate_link_matrix(link), m) class TestLoadingIfcSqlite(NewFile): @@ -364,7 +365,7 @@ def test_run(self): sql_type="SQLite", ) patcher.patch() - tmp_file = Path(tempfile.mktemp(suffix=".ifcsqlite")) + tmp_file = Path(tempfile.mkstemp(suffix=".ifcsqlite")[1]) ifcpatch.write(patcher.get_output(), tmp_file) elements_with_meshes = [ @@ -399,3 +400,43 @@ def clean_up() -> None: for element_name in elements_without_meshes: assert element_name in bpy.data.objects assert not bpy.data.objects[element_name].data + + +class TestGettingLinkedElementGeomSlice: + TEST_OBJ = { + "guids": ["aaa", "bbb", "ccc"], + "guid_ids": [5, 10, 15], + } + + def test_get_first_element(self): + obj = TestGettingLinkedElementGeomSlice.TEST_OBJ + obj = cast(bpy.types.Object, obj) + slice_ = subject.Link.get_linked_element_geom_slice(obj, "aaa") + assert range(15)[slice_] == range(5) + + def test_get_middle_element(self): + obj = TestGettingLinkedElementGeomSlice.TEST_OBJ + obj = cast(bpy.types.Object, obj) + slice_ = subject.Link.get_linked_element_geom_slice(obj, "bbb") + assert range(15)[slice_] == range(5, 10) + + def test_skip_hidden_first_element(self): + obj = TestGettingLinkedElementGeomSlice.TEST_OBJ + obj = obj | {"hidden_indices": [0]} + obj = cast(bpy.types.Object, obj) + slice_ = subject.Link.get_linked_element_geom_slice(obj, "bbb") + assert range(15)[slice_] == range(5) + + def test_skip_hidden_middle_element(self): + obj = TestGettingLinkedElementGeomSlice.TEST_OBJ + obj = obj | {"hidden_indices": [1]} + obj = cast(bpy.types.Object, obj) + slice_ = subject.Link.get_linked_element_geom_slice(obj, "ccc") + assert range(15)[slice_] == range(5, 10) + + def test_handle_hidden_non_first_element(self): + obj = TestGettingLinkedElementGeomSlice.TEST_OBJ + obj = obj | {"hidden_indices": [1]} + obj = cast(bpy.types.Object, obj) + slice_ = subject.Link.get_linked_element_geom_slice(obj, "aaa") + assert range(15)[slice_] == range(5) diff --git a/src/bonsai/test/tool/test_pset.py b/src/bonsai/test/tool/test_pset.py index 9aa8e70289a..9b01105748c 100644 --- a/src/bonsai/test/tool/test_pset.py +++ b/src/bonsai/test/tool/test_pset.py @@ -20,6 +20,7 @@ import ifcopenshell import ifcopenshell.api import ifcopenshell.api.pset + import bonsai.core.tool import bonsai.tool as tool from bonsai.tool.pset import Pset as subject diff --git a/src/bonsai/test/tool/test_pset_template.py b/src/bonsai/test/tool/test_pset_template.py new file mode 100644 index 00000000000..d2aa408caaf --- /dev/null +++ b/src/bonsai/test/tool/test_pset_template.py @@ -0,0 +1,49 @@ +# Bonsai - OpenBIM Blender Add-on +# Copyright (C) 2021 Dion Moult +# +# This file is part of Bonsai. +# +# Bonsai is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Bonsai is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Bonsai. If not, see . + +import bpy +import ifcopenshell +import ifcopenshell.api +import ifcopenshell.api.pset + +import bonsai.core.tool +import bonsai.tool as tool +from bonsai.tool.pset_template import PsetTemplate as subject +from test.bim.bootstrap import NewFile + + +class TestImplementsTool(NewFile): + def test_run(self): + assert isinstance(subject(), bonsai.core.tool.PsetTemplate) + + +class TestAddPsetAsTemplate(NewFile): + def test_run(self): + ifc = ifcopenshell.file() + tool.Ifc.set(ifc) + element1 = ifc.createIfcWall() + element2 = ifc.createIfcWall() + pset = ifcopenshell.api.pset.add_pset(ifc, product=element1, name="Foo") + prop = ifcopenshell.api.pset.edit_pset(ifc, pset=pset, properties={"Foo": "a"}) + pset = ifcopenshell.api.pset.add_pset(ifc, product=element2, name="Foo") + prop = ifcopenshell.api.pset.edit_pset(ifc, pset=pset, properties={"Bar": "b"}) + library = ifcopenshell.file() + assert (pset_template := subject.add_pset_as_template("Foo", library)) + assert pset_template.is_a("IfcPropertySetTemplate") + assert len(templates := pset_template.HasPropertyTemplates) == 2 + assert set(t.Name for t in templates) == {"Foo", "Bar"} diff --git a/src/bonsai/test/tool/test_qto.py b/src/bonsai/test/tool/test_qto.py index 2b06cbb3c9a..9ec7dc4efd1 100644 --- a/src/bonsai/test/tool/test_qto.py +++ b/src/bonsai/test/tool/test_qto.py @@ -25,11 +25,12 @@ import ifcopenshell.api.root import ifcopenshell.api.unit import ifcopenshell.util.pset -import test.bim.bootstrap -import bonsai.core.tool + +import bonsai.bim.import_ifc as import_ifc import bonsai.core.root +import bonsai.core.tool import bonsai.tool as tool -import bonsai.bim.import_ifc as import_ifc +import test.bim.bootstrap from bonsai.tool.qto import Qto as subject diff --git a/src/bonsai/test/tool/test_root.py b/src/bonsai/test/tool/test_root.py index b27b556a03e..39b853d63c9 100644 --- a/src/bonsai/test/tool/test_root.py +++ b/src/bonsai/test/tool/test_root.py @@ -22,10 +22,11 @@ import ifcopenshell.api.feature import ifcopenshell.api.type import ifcopenshell.util.element + import bonsai.core.tool import bonsai.tool as tool -from test.bim.bootstrap import NewFile from bonsai.tool.root import Root as subject +from test.bim.bootstrap import NewFile class TestImplementsTool(NewFile): diff --git a/src/bonsai/test/tool/test_sequence.py b/src/bonsai/test/tool/test_sequence.py index 7dab2671b9b..af915f02736 100644 --- a/src/bonsai/test/tool/test_sequence.py +++ b/src/bonsai/test/tool/test_sequence.py @@ -17,15 +17,17 @@ # along with Bonsai. If not, see . import os + import bpy import ifcopenshell import ifcopenshell.api import ifcopenshell.api.pset import ifcopenshell.api.root + import bonsai.core.tool import bonsai.tool as tool -from test.bim.bootstrap import NewFile from bonsai.tool.sequence import Sequence as subject +from test.bim.bootstrap import NewFile class TestImplementsTool(NewFile): diff --git a/src/bonsai/test/tool/test_spatial.py b/src/bonsai/test/tool/test_spatial.py index fd9316912a4..005f370b016 100644 --- a/src/bonsai/test/tool/test_spatial.py +++ b/src/bonsai/test/tool/test_spatial.py @@ -16,17 +16,18 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . -import numpy as np import bpy import ifcopenshell import ifcopenshell.api import ifcopenshell.api.root import ifcopenshell.api.spatial +import numpy as np +from mathutils import Matrix + import bonsai.core.tool import bonsai.tool as tool from bonsai.tool.spatial import Spatial as subject from test.bim.bootstrap import NewFile -from mathutils import Matrix class TestImplementsTool(NewFile): @@ -42,9 +43,7 @@ def test_a_spatial_structure_element_can_contain_an_element(self): structure_obj = bpy.data.objects.new("Object", None) tool.Ifc.link(structure, structure_obj) element = ifc.createIfcWall() - element_obj = bpy.data.objects.new("Object", None) - tool.Ifc.link(element, element_obj) - assert subject.can_contain(structure, element_obj) is True + assert subject.can_contain(structure, element) is True def test_a_spatial_structure_element_can_contain_an_element_ifc2x3(self): ifc = ifcopenshell.file(schema="IFC2X3") @@ -53,9 +52,7 @@ def test_a_spatial_structure_element_can_contain_an_element_ifc2x3(self): structure_obj = bpy.data.objects.new("Object", None) tool.Ifc.link(structure, structure_obj) element = ifc.createIfcWall() - element_obj = bpy.data.objects.new("Object", None) - tool.Ifc.link(element, element_obj) - assert subject.can_contain(structure, element_obj) is True + assert subject.can_contain(structure, element) is True def test_a_spatial_zone_element_cannot_contain_an_element(self): ifc = ifcopenshell.file() @@ -64,14 +61,7 @@ def test_a_spatial_zone_element_cannot_contain_an_element(self): structure_obj = bpy.data.objects.new("Object", None) tool.Ifc.link(structure, structure_obj) element = ifc.createIfcWall() - element_obj = bpy.data.objects.new("Object", None) - tool.Ifc.link(element, element_obj) - assert subject.can_contain(structure, element_obj) is False - - def test_unlinked_elements_cannot_contain_anything(self): - structure_obj = bpy.data.objects.new("Object", None) - element_obj = bpy.data.objects.new("Object", None) - assert subject.can_contain(structure_obj, element_obj) is False + assert subject.can_contain(structure, element) is False def test_a_non_spatial_element_cannot_contain_anything(self): ifc = ifcopenshell.file() @@ -80,9 +70,7 @@ def test_a_non_spatial_element_cannot_contain_anything(self): structure_obj = bpy.data.objects.new("Object", None) tool.Ifc.link(structure, structure_obj) element = ifc.createIfcWall() - element_obj = bpy.data.objects.new("Object", None) - tool.Ifc.link(element, element_obj) - assert subject.can_contain(structure, element_obj) is False + assert subject.can_contain(structure, element) is False def test_a_non_element_cannot_be_contained(self): ifc = ifcopenshell.file() @@ -91,9 +79,7 @@ def test_a_non_element_cannot_be_contained(self): structure_obj = bpy.data.objects.new("Object", None) tool.Ifc.link(structure, structure_obj) element = ifc.createIfcTask() - element_obj = bpy.data.objects.new("Object", None) - tool.Ifc.link(element, element_obj) - assert subject.can_contain(structure, element_obj) is False + assert subject.can_contain(structure, element) is False def test_other_non_elements_that_have_a_contained_in_structure_attribute_can_be_contained(self): ifc = ifcopenshell.file() @@ -102,9 +88,7 @@ def test_other_non_elements_that_have_a_contained_in_structure_attribute_can_be_ structure_obj = bpy.data.objects.new("Object", None) tool.Ifc.link(structure, structure_obj) element = ifc.createIfcGrid() - element_obj = bpy.data.objects.new("Object", None) - tool.Ifc.link(element, element_obj) - assert subject.can_contain(structure, element_obj) is True + assert subject.can_contain(structure, element) is True class TestCanReference(NewFile): diff --git a/src/bonsai/test/tool/test_style.py b/src/bonsai/test/tool/test_style.py index 23c70461ee2..743ac317ecf 100644 --- a/src/bonsai/test/tool/test_style.py +++ b/src/bonsai/test/tool/test_style.py @@ -17,17 +17,19 @@ # along with Bonsai. If not, see . import os + import bpy import ifcopenshell import ifcopenshell.api import ifcopenshell.api.root import ifcopenshell.util.representation import pytest +from ifcopenshell.util.shape_builder import ShapeBuilder + import bonsai.core.tool import bonsai.tool as tool -from test.bim.bootstrap import NewFile from bonsai.tool.style import Style as subject -from ifcopenshell.util.shape_builder import ShapeBuilder +from test.bim.bootstrap import NewFile class TestImplementsTool(NewFile): diff --git a/src/bonsai/test/tool/test_surveyor.py b/src/bonsai/test/tool/test_surveyor.py index 0228cd92710..782b171a6d0 100644 --- a/src/bonsai/test/tool/test_surveyor.py +++ b/src/bonsai/test/tool/test_surveyor.py @@ -17,16 +17,16 @@ # along with Bonsai. If not, see . import bpy -import numpy as np import ifcopenshell import ifcopenshell.api import ifcopenshell.api.root import ifcopenshell.api.unit import ifcopenshell.util.geolocation +import numpy as np -import test.bim.bootstrap import bonsai.core.tool import bonsai.tool as tool +import test.bim.bootstrap from bonsai.tool import Surveyor as subject diff --git a/src/bonsai/test/tool/test_system.py b/src/bonsai/test/tool/test_system.py index de8e9026b0b..5c18ad623f7 100644 --- a/src/bonsai/test/tool/test_system.py +++ b/src/bonsai/test/tool/test_system.py @@ -16,19 +16,22 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . +from math import pi + import bpy import ifcopenshell import ifcopenshell.api import ifcopenshell.api.root import ifcopenshell.api.system +import ifcopenshell.util.system import ifcopenshell.util.unit +import numpy as np +from mathutils import Euler, Matrix, Vector + import bonsai.core.tool import bonsai.tool as tool -import numpy as np -from test.bim.bootstrap import NewFile from bonsai.tool.system import System as subject -from mathutils import Euler, Vector, Matrix -from math import pi +from test.bim.bootstrap import NewFile class TestImplementsTool(NewFile): @@ -104,6 +107,20 @@ def test_run(self): assert obj.matrix_world == bpy.context.scene.cursor.matrix +class TestCreatePortAtCursor(NewFile): + def test_run(self): + assert bpy.context.scene + ifc = ifcopenshell.file() + tool.Ifc().set(ifc) + system = ifcopenshell.api.system.add_system(ifc) + element = ifcopenshell.api.root.create_entity(ifc, ifc_class="IfcDuctSegment") + ifcopenshell.api.system.assign_system(ifc, products=[element], system=system) + obj = tool.Ifc.link(element, bpy.data.objects.new("Object", None)) + port = subject.create_port_at_cursor(element) + assert port.is_a("IfcDistributionPort") + assert ifcopenshell.util.system.get_ports(element) == [port] + + class TestDeleteElementObjects(NewFile): def test_run(self): ifc = ifcopenshell.file() diff --git a/src/bonsai/test/tool/test_type.py b/src/bonsai/test/tool/test_type.py index 5bbf3c4c42d..0d91b1f4f09 100644 --- a/src/bonsai/test/tool/test_type.py +++ b/src/bonsai/test/tool/test_type.py @@ -20,10 +20,11 @@ import ifcopenshell import ifcopenshell.api.root import ifcopenshell.api.type + import bonsai.core.tool import bonsai.tool as tool -from test.bim.bootstrap import NewFile from bonsai.tool.type import Type as subject +from test.bim.bootstrap import NewFile class TestImplementsTool(NewFile): diff --git a/src/bonsai/test/tool/test_unit.py b/src/bonsai/test/tool/test_unit.py index 190a8fa302e..392650da71b 100644 --- a/src/bonsai/test/tool/test_unit.py +++ b/src/bonsai/test/tool/test_unit.py @@ -21,10 +21,11 @@ import ifcopenshell.api.project import ifcopenshell.api.root import ifcopenshell.api.unit + import bonsai.core.tool import bonsai.tool as tool -from test.bim.bootstrap import NewFile from bonsai.tool.unit import Unit as subject +from test.bim.bootstrap import NewFile class TestImplementsTool(NewFile): @@ -32,6 +33,17 @@ def test_run(self): assert isinstance(subject(), bonsai.core.tool.Unit) +class TestParseDistanceString(NewFile): + def test_run(self): + assert subject.parse_distance_string("5m") == (True, 5.0) + assert subject.parse_distance_string("30cm") == (True, 0.3) + assert subject.parse_distance_string("10ft") == (True, 3.048) + assert subject.parse_distance_string("12in") == (True, 0.3048) + assert subject.parse_distance_string("5'6\"") == (True, 1.6764) + assert subject.parse_distance_string("-5'6\"") == (True, -1.6764) + assert subject.parse_distance_string("invalid") == (False, 0.0) + + class TestClearActiveUnit(NewFile): def test_run(self): props = tool.Unit.get_unit_props() @@ -130,25 +142,43 @@ def test_getting_an_imperial_name(self): assert subject.get_scene_unit_name("AREAUNIT") == "square foot" assert subject.get_scene_unit_name("VOLUMEUNIT") == "cubic inch" + def test_getting_an_si_name(self): + props = tool.Blender.get_bim_props() + bpy.context.scene.unit_settings.system = "METRIC" + bpy.context.scene.unit_settings.length_unit = "METERS" + props.area_unit = "SQUARE_METRE" + props.volume_unit = "CUBIC_METRE" + assert subject.get_scene_unit_name("LENGTHUNIT") == "METRE" + assert subject.get_scene_unit_name("AREAUNIT") == "SQUARE_METRE" + assert subject.get_scene_unit_name("VOLUMEUNIT") == "CUBIC_METRE" + bpy.context.scene.unit_settings.length_unit = "MILLIMETERS" + assert subject.get_scene_unit_name("LENGTHUNIT") == "MILLI/METRE" + bpy.context.scene.unit_settings.length_unit = "ADAPTIVE" + assert subject.get_scene_unit_name("LENGTHUNIT") == "METRE" + def test_getting_a_name_with_no_unit_system(self): assert bpy.context.scene bpy.context.scene.unit_settings.system = "NONE" - assert subject.get_scene_unit_name("LENGTHUNIT") == "foot" + assert subject.get_scene_unit_name("LENGTHUNIT") == "METRE" + bpy.context.scene.unit_settings.length_unit = "ADAPTIVE" + assert subject.get_scene_unit_name("LENGTHUNIT") == "METRE" + assert subject.get_scene_unit_name("AREAUNIT") == "SQUARE_METRE" + assert subject.get_scene_unit_name("VOLUMEUNIT") == "CUBIC_METRE" def test_getting_mass_unit_names(self): """Test getting mass unit names for different systems""" assert bpy.context.scene props = tool.Blender.get_bim_props() props.mass_unit = "GRAM" - assert subject.get_scene_unit_name("MASSUNIT") == "gram" - props.mass_unit = "KILOGRAM" - assert subject.get_scene_unit_name("MASSUNIT") == "kilogram" - props.mass_unit = "POUND" + assert subject.get_scene_unit_name("MASSUNIT") == "GRAM" + props.mass_unit = "KILO/GRAM" + assert subject.get_scene_unit_name("MASSUNIT") == "KILO/GRAM" + props.mass_unit = "MEGA/GRAM" + assert subject.get_scene_unit_name("MASSUNIT") == "MEGA/GRAM" + props.mass_unit = "pound" assert subject.get_scene_unit_name("MASSUNIT") == "pound" - props.mass_unit = "OUNCE" + props.mass_unit = "ounce" assert subject.get_scene_unit_name("MASSUNIT") == "ounce" - props.mass_unit = "TONNE" - assert subject.get_scene_unit_name("MASSUNIT") == "tonne" def test_getting_time_unit_names(self): """Test getting time unit names for different systems""" @@ -156,64 +186,26 @@ def test_getting_time_unit_names(self): props = tool.Blender.get_bim_props() props.time_unit = "SECOND" - assert subject.get_scene_unit_name("TIMEUNIT") == "second" - props.time_unit = "MINUTE" + assert subject.get_scene_unit_name("TIMEUNIT") == "SECOND" + props.time_unit = "minute" assert subject.get_scene_unit_name("TIMEUNIT") == "minute" - props.time_unit = "HOUR" - assert subject.get_scene_unit_name("TIMEUNIT") == "hour" - props.time_unit = "DAY" - assert subject.get_scene_unit_name("TIMEUNIT") == "day" + props.time_unit = "NONE" + assert not subject.get_scene_unit_name("TIMEUNIT") class TestGetSceneUnitSIPrefix: def test_run(self): assert bpy.context.scene - bpy.context.scene.unit_settings.system = "METRIC" - bpy.context.scene.unit_settings.length_unit = "METERS" - assert subject.get_scene_unit_si_prefix("LENGTHUNIT") is None - bpy.context.scene.unit_settings.length_unit = "MICROMETERS" - assert subject.get_scene_unit_si_prefix("LENGTHUNIT") == "MICRO" - bpy.context.scene.unit_settings.length_unit = "MILLIMETERS" - assert subject.get_scene_unit_si_prefix("LENGTHUNIT") == "MILLI" - bpy.context.scene.unit_settings.length_unit = "CENTIMETERS" - assert subject.get_scene_unit_si_prefix("LENGTHUNIT") == "CENTI" - bpy.context.scene.unit_settings.length_unit = "KILOMETERS" - assert subject.get_scene_unit_si_prefix("LENGTHUNIT") == "KILO" - bpy.context.scene.unit_settings.length_unit = "ADAPTIVE" - assert subject.get_scene_unit_si_prefix("LENGTHUNIT") is None - props = tool.Blender.get_bim_props() - props.area_unit = "SQUARE_METRE" - assert subject.get_scene_unit_si_prefix("AREAUNIT") is None - props.area_unit = "MILLI/SQUARE_METRE" - assert subject.get_scene_unit_si_prefix("AREAUNIT") == "MILLI" - props.volume_unit = "CUBIC_METRE" - assert subject.get_scene_unit_si_prefix("VOLUMEUNIT") is None - props.volume_unit = "MILLI/CUBIC_METRE" - assert subject.get_scene_unit_si_prefix("VOLUMEUNIT") == "MILLI" + assert subject.get_scene_unit_si_prefix("METRE") is None + assert subject.get_scene_unit_si_prefix("MICRO/METRE") == "MICRO" + assert subject.get_scene_unit_si_prefix("SQUARE_METRE") is None + assert subject.get_scene_unit_si_prefix("MILLI/SQUARE_METRE") == "MILLI" + assert subject.get_scene_unit_si_prefix("foot") is None def test_mass_and_time_unit_prefixes(self): - assert bpy.context.scene - props = tool.Blender.get_bim_props() - - props.mass_unit = "KILOGRAM" - assert subject.get_scene_unit_si_prefix("MASSUNIT") == "KILO" - props.mass_unit = "GRAM" - assert subject.get_scene_unit_si_prefix("MASSUNIT") is None - props.mass_unit = "POUND" - assert subject.get_scene_unit_si_prefix("MASSUNIT") == "CONVERSION" - props.mass_unit = "OUNCE" - assert subject.get_scene_unit_si_prefix("MASSUNIT") == "CONVERSION" - props.mass_unit = "TONNE" - assert subject.get_scene_unit_si_prefix("MASSUNIT") == "MEGA" - - props.time_unit = "SECOND" - assert subject.get_scene_unit_si_prefix("TIMEUNIT") is None - props.time_unit = "MINUTE" - assert subject.get_scene_unit_si_prefix("TIMEUNIT") == "CONVERSION" - props.time_unit = "HOUR" - assert subject.get_scene_unit_si_prefix("TIMEUNIT") == "CONVERSION" - props.time_unit = "DAY" - assert subject.get_scene_unit_si_prefix("TIMEUNIT") == "CONVERSION" + assert subject.get_scene_unit_si_prefix("KILO/GRAM") == "KILO" + assert subject.get_scene_unit_si_prefix("MEGA/GRAM") == "MEGA" + assert subject.get_scene_unit_si_prefix("GRAM") is None class TestImportUnitAttributes(NewFile): @@ -442,18 +434,6 @@ def test_importing_mass_and_time_units(self): assert second_prop.ifc_class == "IfcSIUnit" -class TestIsSceneUnitMetric(NewFile): - def test_run(self): - assert bpy.context.scene - props = bpy.context.scene.unit_settings - props.system = "METRIC" - assert subject.is_scene_unit_metric() is True - props.system = "IMPERIAL" - assert subject.is_scene_unit_metric() is False - props.system = "NONE" - assert subject.is_scene_unit_metric() is True - - class TestIsUnitClass: def test_run(self): ifc = ifcopenshell.file() diff --git a/src/bonsai/type-check-requirements.txt b/src/bonsai/type-check-requirements.txt new file mode 100644 index 00000000000..1a8419c7d3e --- /dev/null +++ b/src/bonsai/type-check-requirements.txt @@ -0,0 +1,41 @@ +aiohttp +beautifulsoup4 +boto3 +botocore +brickschema +cjio >=0.8, <0.10 +debugpy +ezdxf +fake-bpy-module-latest +git+https://github.com/prochitecture/bpypolyskel +git+https://github.com/Andrej730/IFC2JSON_python.git@pyproject_toml +gitpython +isodate +lark +lxml +lxml-stubs +markdown-it-py +natsort +numpy +odfpy +openpyxl +pandas +pillow +platformdirs +pygments +pyradiance +pystache +pytest +pytest_bdd +pytest_blender +python-dateutil +python-socketio +pytz +rdflib +requests +shapely +svgwrite +typing-extensions +typst +tzfpy +xsdata diff --git a/src/bsdd/bsdd.py b/src/bsdd/bsdd.py index 17480c87f5a..fbc14cc3930 100644 --- a/src/bsdd/bsdd.py +++ b/src/bsdd/bsdd.py @@ -184,7 +184,79 @@ class ClassPropertyContractV1(TypedDict): qudtCodes: NotRequired[list[str]] -class PropertyContractV4(TypedDict): +class ClassRelationItemContractV1(TypedDict): + relationType: str + classUri: str + className: NotRequired[str] + fraction: NotRequired[float] + dictionaryUri: NotRequired[str] + + +class ClassRelationsContractV1(TypedDict): + totalCount: NotRequired[int] + offset: NotRequired[int] + count: NotRequired[int] + classUri: NotRequired[str] + areReversedRelations: NotRequired[bool] + classRelations: NotRequired[list[ClassRelationItemContractV1]] + + +class ClassPropertiesContractV1(TypedDict): + classUri: NotRequired[str] + totalCount: NotRequired[int] + offset: NotRequired[int] + count: NotRequired[int] + classProperties: list[ClassPropertyContractV1] + + +class ClassPropertyItemContractV1(TypedDict): + name: str + propertySet: str + uri: str + description: NotRequired[str] + definition: NotRequired[str] + dataType: NotRequired[str] + dimension: NotRequired[str] + dimensionLength: NotRequired[int] + dimensionMass: NotRequired[int] + dimensionTime: NotRequired[int] + dimensionElectricCurrent: NotRequired[int] + dimensionThermodynamicTemperature: NotRequired[int] + dimensionAmountOfSubstance: NotRequired[int] + dimensionLuminousIntensity: NotRequired[int] + dynamicParameterPropertyCodes: NotRequired[list[str]] + example: NotRequired[str] + isDynamic: NotRequired[bool] + isRequired: NotRequired[bool] + isWritable: NotRequired[bool] + maxExclusive: NotRequired[float] + maxInclusive: NotRequired[float] + minExclusive: NotRequired[float] + minInclusive: NotRequired[float] + pattern: NotRequired[str] + physicalQuantity: NotRequired[str] + allowedValues: NotRequired[list[ClassPropertyValueItemContractV1]] + predefinedValue: NotRequired[str] + propertyCode: NotRequired[str] + propertyDictionaryName: NotRequired[str] + propertyDictionaryUri: NotRequired[str] + propertyUri: NotRequired[str] + propertyStatus: NotRequired[str] + propertyValueKind: NotRequired[str] + symbol: NotRequired[str] + units: NotRequired[list[str]] + qudtCodes: NotRequired[list[str]] + + +class ClassPropertyValueItemContractV1(TypedDict): + uri: NotRequired[str] + code: NotRequired[str] + value: str + description: NotRequired[str] + sortNumber: NotRequired[int] + + +class PropertyContractV5(TypedDict): dictionaryUri: NotRequired[str] activationDateUtc: str code: str @@ -710,16 +782,64 @@ def get_class( params = {k: v for k, v in params.items() if v is not None} return self.get(endpoint, params) - def get_property(self, uri, include_classes=False, language_code="", version: int = 4) -> PropertyContractV4: + def get_class_relations( + self, + class_uri: str, + get_reverse_relations: bool = False, + search_text: str = "", + offset: int = 0, + limit: int = 1000, + language_code: str = "", + version=1, + ) -> ClassRelationsContractV1: + """ + Get class relations or reverse relations (paginated) + """ + endpoint = f"Class/Relations/v{version}" + params = { + "ClassUri": class_uri, + "GetReverseRelations": get_reverse_relations, + "SearchText": search_text, + "Offset": offset, + "Limit": limit, + "languageCode": language_code, + } + return self.get(endpoint, params) + + def get_class_properties( + self, + class_uri: str, + property_set: str = "", + property_code: str = "", + search_text: str = "", + offset: int = 0, + limit: int = 1000, + language_code: str = "", + version=1, + ) -> ClassPropertiesContractV1: """ - Get Property Detail - this API replaces Property + Get class properties (paginated) """ + endpoint = f"Class/Properties/v{version}" + params = { + "ClassUri": class_uri, + "PropertySet": property_set, + "PropertyCode": property_code, + "SearchText": search_text, + "Offset": offset, + "Limit": limit, + "languageCode": language_code, + } + return self.get(endpoint, params) + def get_property(self, uri, language_code="", version: int = 5) -> PropertyContractV5: + """ + Get Property details. + If you also need the list of classes using the property, then use api/Property/Classes + """ endpoint = f"Property/v{version}" params = { "uri": uri, - "includeClasses": include_classes, "LanguageCode": language_code, } return self.get(endpoint, params) @@ -864,7 +984,6 @@ def get_units(self, version: int = 1) -> list[UnitContractV1]: def apply_ifc_classification_properties( ifc_file: ifcopenshell.file, element: ifcopenshell.entity_instance, classificationProperties: dict[str, Any] ) -> None: - import ifcopenshell.api import ifcopenshell.api.pset import ifcopenshell.util.element diff --git a/src/bsdd/bsdd_json.py b/src/bsdd/bsdd_json.py index becaac810b3..6a89d197532 100644 --- a/src/bsdd/bsdd_json.py +++ b/src/bsdd/bsdd_json.py @@ -7,7 +7,7 @@ from pydantic import BaseModel, ConfigDict, Field, PrivateAttr, model_validator -from .type_hints import * +from type_hints import * def _lower_first(s: str) -> str: diff --git a/src/bsdd/pyproject.toml b/src/bsdd/pyproject.toml index d64d667a20d..17fa72f37a8 100644 --- a/src/bsdd/pyproject.toml +++ b/src/bsdd/pyproject.toml @@ -43,3 +43,9 @@ Issues = "https://github.com/IfcOpenShell/IfcOpenShell/issues" [tool.setuptools] py-modules = ["bsdd","bsdd_json","type_hints"] + +[tool.ruff] +extend = "../../pyproject.toml" +lint.select = [ + "F401", # unused imports +] diff --git a/src/bsdd/tests/test_bsdd.py b/src/bsdd/tests/test_bsdd.py index aea17b9eb99..9dab01025cf 100644 --- a/src/bsdd/tests/test_bsdd.py +++ b/src/bsdd/tests/test_bsdd.py @@ -37,6 +37,22 @@ def test_get_class(): ] +def test_get_class_relations(): + uri_light_fixture = next(l for l in get_ifc_classes()["classes"] if "IfcLightFixture" == l["code"])["uri"] + ifc4x3_light_fixture_relations = client.get_class_properties(uri_light_fixture, True) + assert "Electrical unit for light-line system" and "Tubelight system" in [ + r["className"] for r in ifc4x3_light_fixture_relations["classRelations"] + ] + + +def test_get_class_properties(): + uri_light_fixture = next(l for l in get_ifc_classes()["classes"] if "IfcLightFixture" == l["code"])["uri"] + ifc4x3_light_fixture_properties = client.get_class_properties(uri_light_fixture) + assert "Maintenance Factor" and "Light Fixture Mounting Type" in [ + l["name"] for l in ifc4x3_light_fixture_properties["classProperties"] + ] + + def test_search_class(): ss_heat_pump_sys = client.search_class("Ss_60_40_36", [nbs_uri]) li = [l + "source heat pump systems" for l in ["Air ", "Ground ", "Water "]] diff --git a/src/common.mk b/src/common.mk index 24537d06de0..cbc251fbe2d 100644 --- a/src/common.mk +++ b/src/common.mk @@ -1,7 +1,7 @@ SHELL := sh IS_STABLE:=FALSE -PYTHON:=python3.11 -PIP:=pip3.11 +PYTHON:=python3 +PIP:=pip3 VERSION:=$(shell cat ../../VERSION) VERSION_DATE:=$(shell date '+%y%m%d') SED:=sed -i @@ -28,6 +28,7 @@ dist: mkdir -p dist cp -r $(PACKAGE_NAME) build/ cp pyproject.toml build/ + if [ -f README.md ]; then cp README.md build/; fi ifeq ($(IS_STABLE), TRUE) $(SED) 's/version = "0.0.0"/version = "$(VERSION)"/' build/pyproject.toml ifdef IS_MODULE diff --git a/src/examples/CMakeLists.txt b/src/examples/CMakeLists.txt index 3a5c0187b5d..a7c99043bdc 100644 --- a/src/examples/CMakeLists.txt +++ b/src/examples/CMakeLists.txt @@ -35,51 +35,45 @@ else() include_directories("${CMAKE_SOURCE_DIR}/../src") endif() -if(SCHEMA_VERSIONS MATCHES "2x3") - add_executable(IfcParseExamples IfcParseExamples.cpp) +macro(build_example exe_name) + set(additional_targets ${ARGN}) + add_executable(${exe_name} ${exe_name}.cpp) if(STANDALONE_PROJECT) - target_link_libraries(IfcParseExamples IfcOpenShell::IfcParse) + target_link_libraries( + ${exe_name} + IfcOpenShell::IfcParse + $<$:IfcOpenShell::${additional_targets}> + ) else() - target_include_directories(IfcParseExamples PRIVATE "${CMAKE_SOURCE_DIR}/../src") - target_link_libraries(IfcParseExamples IfcParse) - set_target_properties(IfcParseExamples PROPERTIES FOLDER Examples) + target_include_directories(${exe_name} PRIVATE "${CMAKE_SOURCE_DIR}/../src") + target_link_libraries(${exe_name} IfcParse ${additional_targets}) + set_target_properties(${exe_name} PROPERTIES FOLDER Examples) endif() - install(TARGETS IfcParseExamples) + install(TARGETS ${exe_name}) +endmacro() - if(WITH_OPENCASCADE) - add_executable(IfcOpenHouse IfcOpenHouse.cpp) - add_executable(IfcAdvancedHouse IfcAdvancedHouse.cpp) - add_library(IfcHouseInterface INTERFACE) - - if(STANDALONE_PROJECT) - target_link_libraries(IfcHouseInterface INTERFACE IfcOpenShell::IfcParse IfcOpenShell::geometry_serializer) - else() - target_link_libraries(IfcHouseInterface INTERFACE IfcParse geometry_serializer) - set_target_properties(IfcOpenHouse PROPERTIES FOLDER Examples) - set_target_properties(IfcAdvancedHouse PROPERTIES FOLDER Examples) - endif() - target_link_libraries(IfcOpenHouse PRIVATE IfcHouseInterface) - target_link_libraries(IfcAdvancedHouse PRIVATE IfcHouseInterface) - install(TARGETS IfcOpenHouse IfcAdvancedHouse) - endif() +if("4" IN_LIST SCHEMA_VERSIONS) + build_example(arbitrary_open_profile_def) + build_example(triangulated_faceset) endif() -if(SCHEMA_VERSIONS MATCHES "4x3_add2") - add_executable(IfcAlignment IfcAlignment.cpp) - add_executable(IfcSimplifiedAlignment IfcSimplifiedAlignment.cpp) - add_library(IfcAlignmentInterface INTERFACE) +if("2x3" IN_LIST SCHEMA_VERSIONS) + build_example(composite_profile_def) + build_example(csg_primitive) + build_example(ellipse_pies) + build_example(faces) + build_example(ifc_curve_rebar) + build_example(profiles) + build_example(IfcParseExamples) - if(STANDALONE_PROJECT) - target_link_libraries(IfcAlignmentInterface INTERFACE IfcOpenShell::IfcParse) - else() - target_link_libraries(IfcAlignmentInterface INTERFACE IfcParse) - set_target_properties(IfcAlignment PROPERTIES FOLDER Examples) - set_target_properties(IfcSimplifiedAlignment PROPERTIES FOLDER Examples) + if(WITH_OPENCASCADE) + build_example(IfcOpenHouse geometry_serializer) + build_example(IfcAdvancedHouse geometry_serializer) endif() +endif() - target_link_libraries(IfcAlignment PRIVATE IfcAlignmentInterface) - target_link_libraries(IfcSimplifiedAlignment PRIVATE IfcAlignmentInterface) - - install(TARGETS IfcAlignment IfcSimplifiedAlignment) +if("4x3_add2" IN_LIST SCHEMA_VERSIONS) + build_example(IfcAlignment) + build_example(IfcSimplifiedAlignment) endif() diff --git a/src/examples/IfcAlignment.cpp b/src/examples/IfcAlignment.cpp index d4e3ed0348a..491aef1e797 100644 --- a/src/examples/IfcAlignment.cpp +++ b/src/examples/IfcAlignment.cpp @@ -489,6 +489,6 @@ int main() { } // That's it - save the model to a file - std::ofstream ofs("FHWA_Bridge_Geometry_Alignment_Example.ifc"); + std::ofstream ofs("IfcAlignment.ifc"); ofs << file; } diff --git a/src/examples/IfcSimplifiedAlignment.cpp b/src/examples/IfcSimplifiedAlignment.cpp index bde0e59b613..1c88de4c298 100644 --- a/src/examples/IfcSimplifiedAlignment.cpp +++ b/src/examples/IfcSimplifiedAlignment.cpp @@ -159,6 +159,6 @@ int main() { } // That's it - save the model to a file - std::ofstream ofs("FHWA_Bridge_Geometry_Alignment_Example_Simplified.ifc"); + std::ofstream ofs("IfcSimplifiedAlignment.ifc"); ofs << file; } diff --git a/src/examples/arbitrary_open_profile_def.cpp b/src/examples/arbitrary_open_profile_def.cpp index 45495736d5b..1346c56a5d9 100644 --- a/src/examples/arbitrary_open_profile_def.cpp +++ b/src/examples/arbitrary_open_profile_def.cpp @@ -28,16 +28,16 @@ #include #include -#include "../ifcparse/Ifc2x3.h" -#include "../ifcparse/IfcUtil.h" -#include "../ifcparse/IfcHierarchyHelper.h" +#define IfcSchema Ifc4 +#include "ifcparse/Ifc4.h" +#include "ifcparse/IfcHierarchyHelper.h" typedef std::string S; typedef IfcParse::IfcGlobalId guid; boost::none_t const null = boost::none; static int i = 0; -void create_product_from_item(IfcHierarchyHelper& file, IfcSchema::IfcRepresentationItem* item, const std::string& s) { +void create_product_from_item(IfcHierarchyHelper& file, IfcSchema::IfcRepresentationItem* item, const std::string& s) { IfcSchema::IfcBuildingElementProxy* product = new IfcSchema::IfcBuildingElementProxy( guid(), 0, S("product"), null, null, 0, 0, null, null); file.addBuildingProduct(product); @@ -50,7 +50,7 @@ void create_product_from_item(IfcHierarchyHelper& file, IfcSchema::IfcRepresenta items->push(item); if (s == "GeometricSet") { - IfcSchema::IfcGeometricSet* set = new IfcSchema::IfcGeometricSet(items->generalize()); + IfcSchema::IfcGeometricSet* set = new IfcSchema::IfcGeometricSet(items->as()); file.addEntity(set); items = IfcSchema::IfcRepresentationItem::list::ptr(new IfcSchema::IfcRepresentationItem::list()); items->push(set); @@ -67,7 +67,7 @@ void create_product_from_item(IfcHierarchyHelper& file, IfcSchema::IfcRepresenta product->setRepresentation(shape); } -void create_surfaces_from_profile(IfcHierarchyHelper& file, IfcSchema::IfcProfileDef* profile) { +void create_surfaces_from_profile(IfcHierarchyHelper& file, IfcSchema::IfcProfileDef* profile) { IfcSchema::IfcSurfaceOfLinearExtrusion* extrusion = new IfcSchema::IfcSurfaceOfLinearExtrusion(profile, file.addPlacement3d(), file.addTriplet(0, 0, 1), 100.); file.addEntity(extrusion); @@ -80,7 +80,7 @@ void create_surfaces_from_profile(IfcHierarchyHelper& file, IfcSchema::IfcProfil create_product_from_item(file, revolution, "GeometricSet"); } -void create_solids_from_profile(IfcHierarchyHelper& file, IfcSchema::IfcProfileDef* profile) { +void create_solids_from_profile(IfcHierarchyHelper& file, IfcSchema::IfcProfileDef* profile) { IfcSchema::IfcExtrudedAreaSolid* extrusion = new IfcSchema::IfcExtrudedAreaSolid(profile, file.addPlacement3d(), file.addTriplet(0, 0, 1), 100.); file.addEntity(extrusion); @@ -96,7 +96,7 @@ void create_solids_from_profile(IfcHierarchyHelper& file, IfcSchema::IfcProfileD create_product_from_item(file, revolution2, "SweptSolid"); } -void create_products_from_curve(IfcHierarchyHelper& file, IfcSchema::IfcBoundedCurve* curve) { +void create_products_from_curve(IfcHierarchyHelper& file, IfcSchema::IfcBoundedCurve* curve) { IfcSchema::IfcArbitraryOpenProfileDef* open = new IfcSchema::IfcArbitraryOpenProfileDef(IfcSchema::IfcProfileTypeEnum::IfcProfileType_CURVE, null, curve); IfcSchema::IfcCenterLineProfileDef* center_line = new IfcSchema::IfcCenterLineProfileDef(IfcSchema::IfcProfileTypeEnum::IfcProfileType_AREA, null, curve, 10.); file.addEntity(open); @@ -107,9 +107,9 @@ void create_products_from_curve(IfcHierarchyHelper& file, IfcSchema::IfcBoundedC } int main(int argc, char** argv) { - const char filename[] = "IfcArbitraryOpenProfileDef.ifc"; - IfcHierarchyHelper file; - file.header().file_name().name(filename); + const char filename[] = "arbitrary_open_profile_def.ifc"; + IfcHierarchyHelper file; + file.header().file_name()->setname(filename); double coords1[] = {-50.0, 0.0}; double coords2[] = { 50.0, 0.0}; @@ -124,17 +124,18 @@ int main(int argc, char** argv) { IfcSchema::IfcEllipse* ellipse = new IfcSchema::IfcEllipse(file.addPlacement2d(), 50., 25.); file.addEntity(ellipse); - IfcEntityList::ptr trim1(new IfcEntityList); - IfcEntityList::ptr trim2(new IfcEntityList); + aggregate_of_instance::ptr trim1(new aggregate_of_instance); + aggregate_of_instance::ptr trim2(new aggregate_of_instance); trim1->push(new IfcSchema::IfcParameterValue( 0.)); trim2->push(new IfcSchema::IfcParameterValue(180.)); - IfcSchema::IfcTrimmedCurve* trim = new IfcSchema::IfcTrimmedCurve(ellipse, trim1, trim2, true, IfcSchema::IfcTrimmingPreference::IfcTrimmingPreference_PARAMETER); + IfcSchema::IfcTrimmedCurve* trim = new IfcSchema::IfcTrimmedCurve(ellipse, trim1->as(), trim2->as(), true, IfcSchema::IfcTrimmingPreference::IfcTrimmingPreference_PARAMETER); file.addEntity(trim); create_products_from_curve(file, trim); - file.getSingle()->setName("IfcArbitraryOpenProfileDef"); + using namespace std::string_literals; + file.getSingle()->setName("arbitrary_open_profile_def"s); std::ofstream f(filename); f << file; -} +} \ No newline at end of file diff --git a/src/examples/composite_profile_def.cpp b/src/examples/composite_profile_def.cpp index 5ff41a3b136..2b5f082f55f 100644 --- a/src/examples/composite_profile_def.cpp +++ b/src/examples/composite_profile_def.cpp @@ -27,18 +27,18 @@ #include #include -#include "../ifcparse/Ifc2x3.h" -#include "../ifcparse/IfcUtil.h" -#include "../ifcparse/IfcHierarchyHelper.h" +#define IfcSchema Ifc2x3 +#include "ifcparse/Ifc2x3.h" +#include "ifcparse/IfcHierarchyHelper.h" typedef std::string S; typedef IfcParse::IfcGlobalId guid; boost::none_t const null = boost::none; int main(int argc, char** argv) { - const char filename[] = "IfcCompositeProfileDef.ifc"; - IfcHierarchyHelper file; - file.header().file_name().name(filename); + const char filename[] = "composite_profile_def.ifc"; + IfcHierarchyHelper file; + file.header().file_name()->setname(filename); double coords1[] = {100.0, 0.0}; double coords2[] = {200.0, 0.0}; @@ -112,7 +112,8 @@ int main(int argc, char** argv) { product->setRepresentation(shape); - file.getSingle()->setName("IfcCompositeProfileDef"); + using namespace std::string_literals; + file.getSingle()->setName("composite_profile_def"s); std::ofstream f(filename); f << file; diff --git a/src/examples/csg_primitive.cpp b/src/examples/csg_primitive.cpp index 190236ed6ba..4d805a33757 100644 --- a/src/examples/csg_primitive.cpp +++ b/src/examples/csg_primitive.cpp @@ -27,9 +27,9 @@ #include #include -#include "../ifcparse/Ifc2x3.h" -#include "../ifcparse/IfcUtil.h" -#include "../ifcparse/IfcHierarchyHelper.h" +#define IfcSchema Ifc2x3 +#include "ifcparse/Ifc2x3.h" +#include "ifcparse/IfcHierarchyHelper.h" typedef std::string S; typedef IfcParse::IfcGlobalId guid; @@ -101,7 +101,7 @@ class Node { return operate(OP_INTERSECT, p); } - IfcSchema::IfcRepresentationItem* serialize(IfcHierarchyHelper& file) const { + IfcSchema::IfcRepresentationItem* serialize(IfcHierarchyHelper& file) const { IfcSchema::IfcRepresentationItem* my; if (op == OP_TERMINAL) { IfcSchema::IfcAxis2Placement3D* place = file.addPlacement3d(x,y,z,zx,zy,zz,xx,xy,xz); @@ -117,7 +117,7 @@ class Node { my = new IfcSchema::IfcRightCircularCone(place, b, a); } } else { - IfcSchema::IfcBooleanOperator::IfcBooleanOperator o; + IfcSchema::IfcBooleanOperator o = IfcSchema::IfcBooleanOperator::IfcBooleanOperator_UNION; if (op == OP_ADD) { o = IfcSchema::IfcBooleanOperator::IfcBooleanOperator_UNION; } else if (op == OP_SUBTRACT) { @@ -125,7 +125,7 @@ class Node { } else if (op == OP_INTERSECT) { o = IfcSchema::IfcBooleanOperator::IfcBooleanOperator_INTERSECTION; } - my = new IfcSchema::IfcBooleanResult(o, left->serialize(file), right->serialize(file)); + my = new IfcSchema::IfcBooleanResult(o, left->serialize(file)->as(), right->serialize(file)->as()); } file.addEntity(my); return my; @@ -133,9 +133,9 @@ class Node { }; int main(int argc, char** argv) { - const char filename[] = "IfcCsgPrimitive.ifc"; - IfcHierarchyHelper file; - file.header().file_name().name(filename); + const char filename[] = "csg_primitive.ifc"; + IfcHierarchyHelper file; + file.header().file_name()->setname(filename); IfcSchema::IfcRepresentationItem* csg1 = Node::Box(8000.,6000.,3000.).subtract( Node::Box(7600.,5600.,2800.).move(200.,200.,200.) @@ -186,7 +186,8 @@ int main(int argc, char** argv) { product->setRepresentation(shape); - file.getSingle()->setName("IfcCompositeProfileDef"); + using namespace std::string_literals; + file.getSingle()->setName("csg_primitive"s); std::ofstream f(filename); f << file; diff --git a/src/examples/ellipse_pies.cpp b/src/examples/ellipse_pies.cpp index 9994ca820d8..8128c4377ce 100644 --- a/src/examples/ellipse_pies.cpp +++ b/src/examples/ellipse_pies.cpp @@ -27,9 +27,9 @@ #include #include -#include "../ifcparse/Ifc2x3.h" -#include "../ifcparse/IfcUtil.h" -#include "../ifcparse/IfcHierarchyHelper.h" +#define IfcSchema Ifc2x3 +#include "ifcparse/Ifc2x3.h" +#include "ifcparse/IfcHierarchyHelper.h" typedef std::string S; typedef IfcParse::IfcGlobalId guid; @@ -44,7 +44,7 @@ typedef struct { static int i = 0; -void create_testcase_for(IfcHierarchyHelper& file, const EllipsePie& pie, Ifc2x3::IfcTrimmingPreference::IfcTrimmingPreference pref) { +void create_testcase_for(IfcHierarchyHelper& file, const EllipsePie& pie, IfcSchema::IfcTrimmingPreference pref) { const double deg = 1. / 180. * 3.141592653; double flt1[] = {0. , 0. }; double flt2[] = {pie.r1 * cos(pie.t1*deg), pie.r2 * sin(pie.t1*deg)}; @@ -67,16 +67,16 @@ void create_testcase_for(IfcHierarchyHelper& file, const EllipsePie& pie, Ifc2x3 Ifc2x3::IfcEllipse* ellipse = new Ifc2x3::IfcEllipse(file.addPlacement2d(), pie.r1, pie.r2); file.addEntity(ellipse); - IfcEntityList::ptr trim1(new IfcEntityList); - IfcEntityList::ptr trim2(new IfcEntityList); - if (pref == Ifc2x3::IfcTrimmingPreference::IfcTrimmingPreference_PARAMETER) { + aggregate_of_instance::ptr trim1(new aggregate_of_instance); + aggregate_of_instance::ptr trim2(new aggregate_of_instance); + if (pref == IfcSchema::IfcTrimmingPreference::IfcTrimmingPreference_PARAMETER) { trim1->push(new Ifc2x3::IfcParameterValue(pie.t1)); trim2->push(new Ifc2x3::IfcParameterValue(pie.t2)); } else { trim1->push(p2); trim2->push(p3); } - Ifc2x3::IfcTrimmedCurve* trim = new Ifc2x3::IfcTrimmedCurve(ellipse, trim1, trim2, true, pref); + Ifc2x3::IfcTrimmedCurve* trim = new Ifc2x3::IfcTrimmedCurve(ellipse, trim1->as(), trim2->as(), true, pref); file.addEntity(trim); Ifc2x3::IfcCompositeCurveSegment::list::ptr segments(new Ifc2x3::IfcCompositeCurveSegment::list()); @@ -124,25 +124,25 @@ void create_testcase_for(IfcHierarchyHelper& file, const EllipsePie& pie, Ifc2x3 int main(int argc, char** argv) { const std::string filename = "ellipse_pies.ifc"; - IfcHierarchyHelper file; + IfcHierarchyHelper file; { EllipsePie pie = {80., 50., 0., 150.}; - create_testcase_for(file, pie, Ifc2x3::IfcTrimmingPreference::IfcTrimmingPreference_PARAMETER); - create_testcase_for(file, pie, Ifc2x3::IfcTrimmingPreference::IfcTrimmingPreference_CARTESIAN);} + create_testcase_for(file, pie, IfcSchema::IfcTrimmingPreference::IfcTrimmingPreference_PARAMETER); + create_testcase_for(file, pie, IfcSchema::IfcTrimmingPreference::IfcTrimmingPreference_CARTESIAN);} { EllipsePie pie = {80, 50., 30., 300.}; - create_testcase_for(file, pie, Ifc2x3::IfcTrimmingPreference::IfcTrimmingPreference_PARAMETER); - create_testcase_for(file, pie, Ifc2x3::IfcTrimmingPreference::IfcTrimmingPreference_CARTESIAN);} + create_testcase_for(file, pie, IfcSchema::IfcTrimmingPreference::IfcTrimmingPreference_PARAMETER); + create_testcase_for(file, pie, IfcSchema::IfcTrimmingPreference::IfcTrimmingPreference_CARTESIAN);} { EllipsePie pie = {80, 50., 300., 30.}; - create_testcase_for(file, pie, Ifc2x3::IfcTrimmingPreference::IfcTrimmingPreference_PARAMETER); - create_testcase_for(file, pie, Ifc2x3::IfcTrimmingPreference::IfcTrimmingPreference_CARTESIAN);} + create_testcase_for(file, pie, IfcSchema::IfcTrimmingPreference::IfcTrimmingPreference_PARAMETER); + create_testcase_for(file, pie, IfcSchema::IfcTrimmingPreference::IfcTrimmingPreference_CARTESIAN);} { EllipsePie pie = {50., 80., 0., 150.}; - create_testcase_for(file, pie, Ifc2x3::IfcTrimmingPreference::IfcTrimmingPreference_PARAMETER); - create_testcase_for(file, pie, Ifc2x3::IfcTrimmingPreference::IfcTrimmingPreference_CARTESIAN);} + create_testcase_for(file, pie, IfcSchema::IfcTrimmingPreference::IfcTrimmingPreference_PARAMETER); + create_testcase_for(file, pie, IfcSchema::IfcTrimmingPreference::IfcTrimmingPreference_CARTESIAN);} { EllipsePie pie = {50, 80., 30., 300.}; - create_testcase_for(file, pie, Ifc2x3::IfcTrimmingPreference::IfcTrimmingPreference_PARAMETER); - create_testcase_for(file, pie, Ifc2x3::IfcTrimmingPreference::IfcTrimmingPreference_CARTESIAN);} + create_testcase_for(file, pie, IfcSchema::IfcTrimmingPreference::IfcTrimmingPreference_PARAMETER); + create_testcase_for(file, pie, IfcSchema::IfcTrimmingPreference::IfcTrimmingPreference_CARTESIAN);} { EllipsePie pie = {50, 80., 300., 30.}; - create_testcase_for(file, pie, Ifc2x3::IfcTrimmingPreference::IfcTrimmingPreference_PARAMETER); - create_testcase_for(file, pie, Ifc2x3::IfcTrimmingPreference::IfcTrimmingPreference_CARTESIAN);} + create_testcase_for(file, pie, IfcSchema::IfcTrimmingPreference::IfcTrimmingPreference_PARAMETER); + create_testcase_for(file, pie, IfcSchema::IfcTrimmingPreference::IfcTrimmingPreference_CARTESIAN);} std::ofstream f(filename.c_str()); f << file; } diff --git a/src/examples/faces.cpp b/src/examples/faces.cpp index 985b23dd8e9..f7e3858c584 100644 --- a/src/examples/faces.cpp +++ b/src/examples/faces.cpp @@ -22,18 +22,19 @@ * Example that generates various forms of IfcFace * * * ********************************************************************************/ +#include -#include "../ifcparse/Ifc2x3.h" -#include "../ifcparse/IfcUtil.h" -#include "../ifcparse/IfcHierarchyHelper.h" +#define IfcSchema Ifc2x3 +#include "ifcparse/Ifc2x3.h" +#include "ifcparse/IfcHierarchyHelper.h" typedef std::string S; typedef IfcParse::IfcGlobalId guid; -boost::none_t const null = (static_cast(0)); +boost::none_t const null = boost::none; static int x = 0; -void create_testcase(IfcHierarchyHelper& file, IfcSchema::IfcFace* face, const std::string& name) { +void create_testcase(IfcHierarchyHelper& file, IfcSchema::IfcFace* face, const std::string& name) { IfcSchema::IfcFace::list::ptr faces(new IfcSchema::IfcFace::list); faces->push(face); IfcSchema::IfcOpenShell* shell = new IfcSchema::IfcOpenShell(faces); @@ -57,14 +58,14 @@ void create_testcase(IfcHierarchyHelper& file, IfcSchema::IfcFace* face, const s file.getRepresentationContext("Model"), S("Body"), S("SurfaceModel"), items); reps->push(rep); - IfcSchema::IfcProductDefinitionShape* shape = new IfcSchema::IfcProductDefinitionShape(0, 0, reps); + IfcSchema::IfcProductDefinitionShape* shape = new IfcSchema::IfcProductDefinitionShape(boost::none, boost::none, reps); file.addEntity(shape); product->setRepresentation(shape); } int main(int argc, char** argv) { - IfcHierarchyHelper file; + IfcHierarchyHelper file; { IfcSchema::IfcCartesianPoint::list::ptr points (new IfcSchema::IfcCartesianPoint::list); points->push(file.addTriplet(-400, -400, 0)); @@ -192,7 +193,7 @@ int main(int argc, char** argv) { IfcSchema::IfcCartesianPoint::list::ptr trim2(new IfcSchema::IfcCartesianPoint::list); trim1->push(point1); trim2->push(point2); - IfcSchema::IfcTrimmedCurve* trimmed_curve = new IfcSchema::IfcTrimmedCurve(circle, trim1->generalize(), trim2->generalize(), true, IfcSchema::IfcTrimmingPreference::IfcTrimmingPreference_CARTESIAN); + IfcSchema::IfcTrimmedCurve* trimmed_curve = new IfcSchema::IfcTrimmedCurve(circle, trim1->generalize()->as(), trim2->generalize()->as(), true, IfcSchema::IfcTrimmingPreference::IfcTrimmingPreference_CARTESIAN); IfcSchema::IfcArbitraryOpenProfileDef* profile = new IfcSchema::IfcArbitraryOpenProfileDef(IfcSchema::IfcProfileTypeEnum::IfcProfileType_CURVE, boost::none, trimmed_curve); IfcSchema::IfcAxis1Placement* place = new IfcSchema::IfcAxis1Placement(file.addTriplet(0., 0., 0.), file.addTriplet(1., 0., 0.)); IfcSchema::IfcSurfaceOfRevolution* surface = new IfcSchema::IfcSurfaceOfRevolution(profile, file.addPlacement3d(), place); @@ -200,8 +201,8 @@ int main(int argc, char** argv) { IfcSchema::IfcFace* face = new IfcSchema::IfcFaceSurface(bounds, surface, true); create_testcase(file, face, "face surface"); } - const std::string filename = "faces.ifc"; - file.header().file_name().name(filename); - std::ofstream f(filename.c_str()); + const char filename[] = "faces.ifc"; + file.header().file_name()->setname(filename); + std::ofstream f(filename); f << file; } \ No newline at end of file diff --git a/src/examples/ifc_curve_rebar.cpp b/src/examples/ifc_curve_rebar.cpp index 2ba269e015a..0f66f7b45a2 100644 --- a/src/examples/ifc_curve_rebar.cpp +++ b/src/examples/ifc_curve_rebar.cpp @@ -27,22 +27,24 @@ #include #include -#include "ifcparse\Ifc2x3.h" -#include "ifcparse\IfcUtil.h" -#include "ifcparse\IfcHierarchyHelper.h" -#include "ifcgeom\IfcGeom.h" +#define IfcSchema Ifc2x3 +#include "ifcparse/Ifc2x3.h" +#include "ifcparse/IfcHierarchyHelper.h" + +#include +const static double PI = boost::math::constants::pi(); typedef std::string S; typedef IfcParse::IfcGlobalId guid; boost::none_t const null = boost::none; -void create_curve_rebar(IfcHierarchyHelper& file) +void create_curve_rebar(IfcHierarchyHelper& file) { int dia = 24; int R = 3 * dia; int length = 12 * dia; - double crossSectionarea = M_PI * (dia / 2) * 2; + double crossSectionarea = PI * dia * dia / 4; IfcSchema::IfcReinforcingBar* rebar = new IfcSchema::IfcReinforcingBar( guid(), 0, S("test"), null, null, 0, 0, @@ -83,14 +85,15 @@ void create_curve_rebar(IfcHierarchyHelper& file) IfcSchema::IfcCircle* circle = new IfcSchema::IfcCircle(axis1, R); file.addEntity(circle); - IfcEntityList::ptr trim1(new IfcEntityList); - IfcEntityList::ptr trim2(new IfcEntityList); - + IfcSchema::IfcTrimmingSelect::list::ptr trim1(new IfcSchema::IfcTrimmingSelect::list); + IfcSchema::IfcTrimmingSelect::list::ptr trim2(new IfcSchema::IfcTrimmingSelect::list); + trim1->push(new IfcSchema::IfcParameterValue(180)); trim1->push(p2); trim2->push(new IfcSchema::IfcParameterValue(270)); trim2->push(p4); + IfcSchema::IfcTrimmedCurve* trimmed_curve = new IfcSchema::IfcTrimmedCurve(circle, trim1, trim2, false, IfcSchema::IfcTrimmingPreference::IfcTrimmingPreference_PARAMETER); file.addEntity(trimmed_curve); @@ -133,8 +136,8 @@ void create_curve_rebar(IfcHierarchyHelper& file) int main() { - IfcHierarchyHelper file; - file.header().file_name().name("ifc_curve_rebar.ifc"); + IfcHierarchyHelper file; + file.header().file_name()->setname("ifc_curve_rebar.ifc"); create_curve_rebar(file); std::ofstream f("ifc_curve_rebar.ifc"); f << file; diff --git a/src/examples/profiles.cpp b/src/examples/profiles.cpp index d171745dc75..78cc67f13fc 100644 --- a/src/examples/profiles.cpp +++ b/src/examples/profiles.cpp @@ -27,21 +27,21 @@ #include #include -#include "../ifcparse/Ifc2x3.h" -#include "../ifcparse/IfcUtil.h" -#include "../ifcparse/IfcHierarchyHelper.h" +#define IfcSchema Ifc2x3 +#include "ifcparse/Ifc2x3.h" +#include "ifcparse/IfcHierarchyHelper.h" typedef std::string S; -typedef IfcWrite::IfcGuidHelper guid; -boost::none_t const null = (static_cast(0)); +typedef IfcParse::IfcGlobalId guid; +boost::none_t const null = boost::none; void create_testcase_for(IfcSchema::IfcProfileDef::list::ptr profiles) { IfcSchema::IfcProfileDef* profile = *profiles->begin(); - const std::string profile_type = IfcSchema::Type::ToString(profile->type()); + const std::string& profile_type = profile->declaration().name(); const std::string filename = profile_type + ".ifc"; - IfcHierarchyHelper file; - file.filename(filename); + IfcHierarchyHelper file; + file.header().file_name()->setname(filename); int i = 0; for (IfcSchema::IfcProfileDef::list::it it = profiles->begin(); it != profiles->end(); ++it, ++i) { @@ -54,7 +54,7 @@ void create_testcase_for(IfcSchema::IfcProfileDef::list::ptr profiles) { product->setObjectPlacement(file.addLocalPlacement(0, 100. * i)); - if (profile->is(IfcSchema::Type::IfcParameterizedProfileDef)) { + if (profile->declaration().is(IfcSchema::IfcParameterizedProfileDef::Class())) { ((IfcSchema::IfcParameterizedProfileDef*) profile)->setPosition(file.addPlacement2d()); } @@ -72,7 +72,7 @@ void create_testcase_for(IfcSchema::IfcProfileDef::list::ptr profiles) { file.getSingle(), S("Body"), S("SweptSolid"), items); reps->push(rep); - IfcSchema::IfcProductDefinitionShape* shape = new IfcSchema::IfcProductDefinitionShape(0, 0, reps); + IfcSchema::IfcProductDefinitionShape* shape = new IfcSchema::IfcProductDefinitionShape(null, null, reps); file.addEntity(rep); file.addEntity(shape); @@ -84,122 +84,123 @@ void create_testcase_for(IfcSchema::IfcProfileDef::list::ptr profiles) { } int main(int argc, char** argv) { + IfcSchema::get_schema(); // Ensure schema is initialized { IfcSchema::IfcProfileDef::list::ptr profiles (new IfcSchema::IfcProfileDef::list); - profiles->push(new Ifc2x3::IfcUShapeProfileDef( + profiles->push(new IfcSchema::IfcUShapeProfileDef( IfcSchema::IfcProfileTypeEnum::IfcProfileType_AREA, null, 0, 50.0, 25.0, 5.0, 5.0, null, null, null, null)); - profiles->push(new Ifc2x3::IfcUShapeProfileDef( + profiles->push(new IfcSchema::IfcUShapeProfileDef( IfcSchema::IfcProfileTypeEnum::IfcProfileType_AREA, null, 0, 50.0, 25.0, 5.0, 5.0, 2.0, 2.0, null, null)); - profiles->push(new Ifc2x3::IfcUShapeProfileDef( + profiles->push(new IfcSchema::IfcUShapeProfileDef( IfcSchema::IfcProfileTypeEnum::IfcProfileType_AREA, null, 0, 50.0, 25.0, 5.0, 5.0, null, null, 4.0, null)); - profiles->push(new Ifc2x3::IfcUShapeProfileDef( + profiles->push(new IfcSchema::IfcUShapeProfileDef( IfcSchema::IfcProfileTypeEnum::IfcProfileType_AREA, null, 0, 50.0, 25.0, 5.0, 5.0, 1.0, 3.0, 6.0, null)); create_testcase_for(profiles); } { IfcSchema::IfcProfileDef::list::ptr profiles (new IfcSchema::IfcProfileDef::list); - profiles->push(new Ifc2x3::IfcTShapeProfileDef( + profiles->push(new IfcSchema::IfcTShapeProfileDef( IfcSchema::IfcProfileTypeEnum::IfcProfileType_AREA, null, 0, 50.0, 25.0, 5.0, 5.0, null, null, null, null, null, null)); - profiles->push(new Ifc2x3::IfcTShapeProfileDef( + profiles->push(new IfcSchema::IfcTShapeProfileDef( IfcSchema::IfcProfileTypeEnum::IfcProfileType_AREA, null, 0, 50.0, 25.0, 5.0, 5.0, 2.0, 2.0, 2.0, null, null, null)); - profiles->push(new Ifc2x3::IfcTShapeProfileDef( + profiles->push(new IfcSchema::IfcTShapeProfileDef( IfcSchema::IfcProfileTypeEnum::IfcProfileType_AREA, null, 0, 50.0, 25.0, 5.0, 5.0, null, null, null, 2.0, 2.0, null)); - profiles->push(new Ifc2x3::IfcTShapeProfileDef( + profiles->push(new IfcSchema::IfcTShapeProfileDef( IfcSchema::IfcProfileTypeEnum::IfcProfileType_AREA, null, 0, 50.0, 25.0, 5.0, 5.0, 3.0, 2.0, 1.0, 2.0, 2.0, null)); create_testcase_for(profiles); } { IfcSchema::IfcProfileDef::list::ptr profiles (new IfcSchema::IfcProfileDef::list); - profiles->push(new Ifc2x3::IfcZShapeProfileDef( + profiles->push(new IfcSchema::IfcZShapeProfileDef( IfcSchema::IfcProfileTypeEnum::IfcProfileType_AREA, null, 0, 50.0, 25.0, 5.0, 5.0, null, null)); - profiles->push(new Ifc2x3::IfcZShapeProfileDef( + profiles->push(new IfcSchema::IfcZShapeProfileDef( IfcSchema::IfcProfileTypeEnum::IfcProfileType_AREA, null, 0, 50.0, 25.0, 5.0, 5.0, 2.0, 2.0)); create_testcase_for(profiles); } { IfcSchema::IfcProfileDef::list::ptr profiles (new IfcSchema::IfcProfileDef::list); - profiles->push(new Ifc2x3::IfcEllipseProfileDef( + profiles->push(new IfcSchema::IfcEllipseProfileDef( IfcSchema::IfcProfileTypeEnum::IfcProfileType_AREA, null, 0, 25.0, 15.0)); - profiles->push(new Ifc2x3::IfcEllipseProfileDef( + profiles->push(new IfcSchema::IfcEllipseProfileDef( IfcSchema::IfcProfileTypeEnum::IfcProfileType_AREA, null, 0, 15.0, 25.0)); create_testcase_for(profiles); } { IfcSchema::IfcProfileDef::list::ptr profiles (new IfcSchema::IfcProfileDef::list); - profiles->push(new Ifc2x3::IfcIShapeProfileDef( + profiles->push(new IfcSchema::IfcIShapeProfileDef( IfcSchema::IfcProfileTypeEnum::IfcProfileType_AREA, null, 0, 25.0, 50.0, 5.0, 5.0, null)); - profiles->push(new Ifc2x3::IfcIShapeProfileDef( + profiles->push(new IfcSchema::IfcIShapeProfileDef( IfcSchema::IfcProfileTypeEnum::IfcProfileType_AREA, null, 0, 25.0, 50.0, 5.0, 5.0, 2.0)); - profiles->push(new Ifc2x3::IfcAsymmetricIShapeProfileDef( + profiles->push(new IfcSchema::IfcAsymmetricIShapeProfileDef( IfcSchema::IfcProfileTypeEnum::IfcProfileType_AREA, null, 0, 25.0, 50.0, 5.0, 5.0, 2.0, 20.0, 10.0, 5.0, null)); create_testcase_for(profiles); } { IfcSchema::IfcProfileDef::list::ptr profiles (new IfcSchema::IfcProfileDef::list); - profiles->push(new Ifc2x3::IfcLShapeProfileDef( + profiles->push(new IfcSchema::IfcLShapeProfileDef( IfcSchema::IfcProfileTypeEnum::IfcProfileType_AREA, null, 0, 50.0, 25.0, 5.0, null, null, null, null, null)); - profiles->push(new Ifc2x3::IfcLShapeProfileDef( + profiles->push(new IfcSchema::IfcLShapeProfileDef( IfcSchema::IfcProfileTypeEnum::IfcProfileType_AREA, null, 0, 50.0, 25.0, 5.0, 2.0, 2.0, null, null, null)); - profiles->push(new Ifc2x3::IfcLShapeProfileDef( + profiles->push(new IfcSchema::IfcLShapeProfileDef( IfcSchema::IfcProfileTypeEnum::IfcProfileType_AREA, null, 0, 50.0, 25.0, 5.0, null, null, 2.0, null, null)); - profiles->push(new Ifc2x3::IfcLShapeProfileDef( + profiles->push(new IfcSchema::IfcLShapeProfileDef( IfcSchema::IfcProfileTypeEnum::IfcProfileType_AREA, null, 0, 50.0, 25.0, 5.0, 1.0, 2.0, 2.0, null, null)); create_testcase_for(profiles); } { IfcSchema::IfcProfileDef::list::ptr profiles (new IfcSchema::IfcProfileDef::list); - profiles->push(new Ifc2x3::IfcCShapeProfileDef( + profiles->push(new IfcSchema::IfcCShapeProfileDef( IfcSchema::IfcProfileTypeEnum::IfcProfileType_AREA, null, 0, 50.0, 25.0, 5.0, 10.0, null, null)); - profiles->push(new Ifc2x3::IfcCShapeProfileDef( + profiles->push(new IfcSchema::IfcCShapeProfileDef( IfcSchema::IfcProfileTypeEnum::IfcProfileType_AREA, null, 0, 50.0, 25.0, 5.0, 10.0, 2.0, null)); create_testcase_for(profiles); } { IfcSchema::IfcProfileDef::list::ptr profiles (new IfcSchema::IfcProfileDef::list); - profiles->push(new Ifc2x3::IfcCircleProfileDef( + profiles->push(new IfcSchema::IfcCircleProfileDef( IfcSchema::IfcProfileTypeEnum::IfcProfileType_AREA, null, 0, 25.0)); - profiles->push(new Ifc2x3::IfcCircleHollowProfileDef( + profiles->push(new IfcSchema::IfcCircleHollowProfileDef( IfcSchema::IfcProfileTypeEnum::IfcProfileType_AREA, null, 0, 25.0, 5.0)); create_testcase_for(profiles); } { IfcSchema::IfcProfileDef::list::ptr profiles (new IfcSchema::IfcProfileDef::list); - profiles->push(new Ifc2x3::IfcRectangleProfileDef( + profiles->push(new IfcSchema::IfcRectangleProfileDef( IfcSchema::IfcProfileTypeEnum::IfcProfileType_AREA, null, 0, 50.0, 25.0)); - profiles->push(new Ifc2x3::IfcRoundedRectangleProfileDef( + profiles->push(new IfcSchema::IfcRoundedRectangleProfileDef( IfcSchema::IfcProfileTypeEnum::IfcProfileType_AREA, null, 0, 50.0, 25.0, 5.0)); - profiles->push(new Ifc2x3::IfcRectangleHollowProfileDef( + profiles->push(new IfcSchema::IfcRectangleHollowProfileDef( IfcSchema::IfcProfileTypeEnum::IfcProfileType_AREA, null, 0, 50.0, 25.0, 5.0, null, null)); - profiles->push(new Ifc2x3::IfcRectangleHollowProfileDef( + profiles->push(new IfcSchema::IfcRectangleHollowProfileDef( IfcSchema::IfcProfileTypeEnum::IfcProfileType_AREA, null, 0, 50.0, 25.0, 5.0, 2.0, 4.0)); create_testcase_for(profiles); } { IfcSchema::IfcProfileDef::list::ptr profiles (new IfcSchema::IfcProfileDef::list); - profiles->push(new Ifc2x3::IfcTrapeziumProfileDef( + profiles->push(new IfcSchema::IfcTrapeziumProfileDef( IfcSchema::IfcProfileTypeEnum::IfcProfileType_AREA, null, 0, 50.0, 30.0, 25.0, 0.0)); - profiles->push(new Ifc2x3::IfcTrapeziumProfileDef( + profiles->push(new IfcSchema::IfcTrapeziumProfileDef( IfcSchema::IfcProfileTypeEnum::IfcProfileType_AREA, null, 0, 50.0, 60.0, 25.0, -20.0)); - profiles->push(new Ifc2x3::IfcTrapeziumProfileDef( + profiles->push(new IfcSchema::IfcTrapeziumProfileDef( IfcSchema::IfcProfileTypeEnum::IfcProfileType_AREA, null, 0, 50.0, 10.0, 25.0, 30.0)); create_testcase_for(profiles); } diff --git a/src/examples/triangulated_faceset.cpp b/src/examples/triangulated_faceset.cpp index acf56d60c15..18eb1c3b73a 100644 --- a/src/examples/triangulated_faceset.cpp +++ b/src/examples/triangulated_faceset.cpp @@ -23,15 +23,19 @@ * * ********************************************************************************/ -#include "../ifcparse/Ifc4.h" -#include "../ifcparse/IfcUtil.h" -#include "../ifcparse/IfcHierarchyHelper.h" +#include +#include +#include + +#define IfcSchema Ifc4 +#include "ifcparse/Ifc4.h" +#include "ifcparse/IfcHierarchyHelper.h" #include "suzanne_geometry.h" typedef std::string S; typedef IfcParse::IfcGlobalId guid; -boost::none_t const null = (static_cast(0)); +boost::none_t const null = boost::none; template std::vector< std::vector > create_vector_from_array(const T* arr, unsigned size) { @@ -50,7 +54,7 @@ std::vector< std::vector > create_vector_from_array(const T* arr, unsigned si } int main(int argc, char** argv) { - IfcHierarchyHelper file; + IfcHierarchyHelper file; IfcSchema::IfcBuildingElementProxy* product = new IfcSchema::IfcBuildingElementProxy( guid(), 0, S("Blender's Suzanne"), null, null, 0, 0, null, null); @@ -73,13 +77,13 @@ int main(int argc, char** argv) { file.getRepresentationContext("Model"), S("Body"), S("SurfaceModel"), items); reps->push(rep); - IfcSchema::IfcProductDefinitionShape* shape = new IfcSchema::IfcProductDefinitionShape(0, 0, reps); + IfcSchema::IfcProductDefinitionShape* shape = new IfcSchema::IfcProductDefinitionShape(boost::none, boost::none, reps); file.addEntity(shape); product->setRepresentation(shape); - const std::string filename = "tesselated_faceset.ifc"; - file.header().file_name().name(filename); - std::ofstream f(filename.c_str()); + const std::string filename = "triangulated_faceset.ifc"; + file.header().file_name()->setname(filename); + std::ofstream f(filename); f << file; } diff --git a/src/ifc2ca/_deprecated/scriptCodeAsterBonded.py b/src/ifc2ca/_deprecated/scriptCodeAsterBonded.py index 0b1184453b8..e5bfd03aedd 100644 --- a/src/ifc2ca/_deprecated/scriptCodeAsterBonded.py +++ b/src/ifc2ca/_deprecated/scriptCodeAsterBonded.py @@ -89,27 +89,22 @@ def create(self): f.write("# Linear Static Analysis With Self-Weight\n") - f.write( - """ + f.write(""" # STEP: INITIALIZE STUDY DEBUT( PAR_LOT = 'NON' ) -""" - ) +""") - f.write( - """ + f.write(""" # STEP: READ MED FILE mesh = LIRE_MAILLAGE( FORMAT = 'MED', UNITE = 20 ) -""" - ) +""") - f.write( - """ + f.write(""" # STEP: DEFINE MODEL model = AFFE_MODELE( MAILLAGE = mesh, @@ -118,8 +113,7 @@ def create(self): TOUT = 'OUI', PHENOMENE = 'MECANIQUE', MODELISATION = '3D' - ),""" - ) + ),""") if faceGroupNames: template = """ @@ -157,12 +151,10 @@ def create(self): f.write(template.format(**context)) - f.write( - """ + f.write(""" ) )\n -""" - ) +""") f.write("# STEP: DEFINE MATERIALS") @@ -195,12 +187,10 @@ def create(self): f.write(template.format(**context)) - f.write( - """ + f.write(""" material = AFFE_MATERIAU( MAILLAGE = mesh, - AFFE = (""" - ) + AFFE = (""") for i, material in enumerate(materials): template = """ @@ -227,20 +217,16 @@ def create(self): f.write(template.format(**context)) - f.write( - """ + f.write(""" ) ) -""" - ) +""") - f.write( - """ + f.write(""" # STEP: DEFINE ELEMENTS element = AFFE_CARA_ELEM( MODELE = model, - POUTRE = (""" - ) + POUTRE = (""") for profile in profiles: if profile["profileShape"] == "rectangular" and profile["profileType"] == "AREA": @@ -296,11 +282,9 @@ def create(self): f.write(template.format(**context)) - f.write( - """ + f.write(""" ), - COQUE = (""" - ) + COQUE = (""") for el in [el for el in elements if el["geometryType"] == "surface"]: @@ -319,15 +303,11 @@ def create(self): f.write(template.format(**context)) - f.write( - """ - ),""" - ) + f.write(""" + ),""") - f.write( - """ - ORIENTATION = (""" - ) + f.write(""" + ORIENTATION = (""") for el in [el for el in elements if el["geometryType"] == "line"]: @@ -345,21 +325,16 @@ def create(self): f.write(template.format(**context)) - f.write( - """ - ),""" - ) + f.write(""" + ),""") - f.write( - """ + f.write(""" )\n -""" - ) +""") f.write("# STEP: DEFINE SUPPORTS AND CONSTRAINTS") - f.write( - """ + f.write(""" liaisons = AFFE_CHAR_MECA( MODELE = model, DDL_IMPO = ( @@ -372,14 +347,11 @@ def create(self): DRY = 0.0, DRZ = 0.0 ) - ),""" - ) + ),""") if rigidLinkGroupNames: - f.write( - """ - LIAISON_SOLIDE = (""" - ) + f.write(""" + LIAISON_SOLIDE = (""") for groupName in rigidLinkGroupNames: template = """ @@ -391,16 +363,12 @@ def create(self): f.write(template.format(**context)) - f.write( - """ - ),""" - ) + f.write(""" + ),""") - f.write( - """ + f.write(""" ) -""" - ) +""") template = """ # STEP: DEFINE LOAD @@ -418,8 +386,7 @@ def create(self): f.write(template.format(**context)) - f.write( - """ + f.write(""" # STEP: RUN ANALYSIS res_Bld = MECA_STATIQUE( MODELE = model, @@ -434,8 +401,7 @@ def create(self): ) ) ) -""" - ) +""") # f.write( # ''' @@ -515,8 +481,7 @@ def create(self): # ''' # ) # - f.write( - """ + f.write(""" # STEP: DEFORMED SHAPE EXTRACTION IMPR_RESU( FORMAT = 'MED', @@ -527,15 +492,12 @@ def create(self): NOM_CHAM_MED = ('Bld_DISP',), # 'Bld_REAC', 'Bld_FORC' ) ) -""" - ) +""") - f.write( - """ + f.write(""" # STEP: CONCLUDE STUDY FIN() -""" - ) +""") f.close() diff --git a/src/ifc2ca/_deprecated/scriptSalomeBonded.py b/src/ifc2ca/_deprecated/scriptSalomeBonded.py index fb2bd575f97..d3b6d506c8c 100644 --- a/src/ifc2ca/_deprecated/scriptSalomeBonded.py +++ b/src/ifc2ca/_deprecated/scriptSalomeBonded.py @@ -53,16 +53,16 @@ def makePoint(self, pl): """Function to define a Point from a polyline (list of 1 point)""" - (x, y, z) = pl + x, y, z = pl return self.geompy.MakeVertex(x, y, z) def makeLine(self, pl): """Function to define a Line from a polyline (list of 2 points)""" - (x, y, z) = pl[0] + x, y, z = pl[0] P1 = self.geompy.MakeVertex(x, y, z) - (x, y, z) = pl[1] + x, y, z = pl[1] P2 = self.geompy.MakeVertex(x, y, z) return self.geompy.MakeLineTwoPnt(P1, P2) diff --git a/src/ifc4d/__main__.py b/src/ifc4d/__main__.py index 8313ba7464b..86c36394e63 100644 --- a/src/ifc4d/__main__.py +++ b/src/ifc4d/__main__.py @@ -1,8 +1,7 @@ import argparse -import os -import sys import ifcopenshell + from ifc4d.msp2ifc import MSP2Ifc from ifc4d.p6xer2ifc import P6XER2Ifc from ifc4d.p62ifc import P62Ifc diff --git a/src/ifc4d/ifc4d/common.py b/src/ifc4d/ifc4d/common.py index f4fd42e1d14..296b8f36cb3 100644 --- a/src/ifc4d/ifc4d/common.py +++ b/src/ifc4d/ifc4d/common.py @@ -4,11 +4,9 @@ from typing import Any, TypedDict, Union import ifcopenshell -import ifcopenshell.api import ifcopenshell.api.control import ifcopenshell.api.resource import ifcopenshell.api.sequence -import ifcopenshell.util.date from typing_extensions import NotRequired diff --git a/src/ifc4d/ifc4d/csv2ifc.py b/src/ifc4d/ifc4d/csv2ifc.py index 6efbf4fad62..a908acdb534 100644 --- a/src/ifc4d/ifc4d/csv2ifc.py +++ b/src/ifc4d/ifc4d/csv2ifc.py @@ -24,7 +24,6 @@ from typing import Any, Literal, NamedTuple, Optional, Union, cast, get_args import ifcopenshell -import ifcopenshell.api import ifcopenshell.api.cost import ifcopenshell.api.pset import ifcopenshell.api.resource @@ -33,7 +32,6 @@ import ifcopenshell.util.date import ifcopenshell.util.element import ifcopenshell.util.resource -import ifcopenshell.util.unit import isodate SUPPORTED_COLUMN = Literal[ diff --git a/src/ifc4d/ifc4d/csv4d2ifc.py b/src/ifc4d/ifc4d/csv4d2ifc.py index 2e519cc0eaa..4247a06bbc5 100644 --- a/src/ifc4d/ifc4d/csv4d2ifc.py +++ b/src/ifc4d/ifc4d/csv4d2ifc.py @@ -22,7 +22,6 @@ import re import ifcopenshell -import ifcopenshell.api import ifcopenshell.api.root import ifcopenshell.api.sequence import ifcopenshell.util.date diff --git a/src/ifc4d/ifc4d/ifc2p6.py b/src/ifc4d/ifc4d/ifc2p6.py index 5093f306be2..a4634ca3729 100644 --- a/src/ifc4d/ifc4d/ifc2p6.py +++ b/src/ifc4d/ifc4d/ifc2p6.py @@ -24,8 +24,6 @@ import ifcopenshell.util.date import ifcopenshell.util.sequence -from .common import ScheduleIfcGenerator - class Ifc2P6: def __init__(self): diff --git a/src/ifc4d/ifc4d/msp2ifc.py b/src/ifc4d/ifc4d/msp2ifc.py index 3ba14a6985a..91ae683c84c 100644 --- a/src/ifc4d/ifc4d/msp2ifc.py +++ b/src/ifc4d/ifc4d/msp2ifc.py @@ -18,10 +18,9 @@ import datetime import xml.etree.ElementTree as ET -from datetime import date, timedelta +from datetime import timedelta import ifcopenshell -import ifcopenshell.api import ifcopenshell.api.control import ifcopenshell.api.pset import ifcopenshell.api.root diff --git a/src/ifc4d/ifc4d/p62ifc.py b/src/ifc4d/ifc4d/p62ifc.py index 833bf39dd3b..7d4881161a5 100644 --- a/src/ifc4d/ifc4d/p62ifc.py +++ b/src/ifc4d/ifc4d/p62ifc.py @@ -17,13 +17,8 @@ # along with Ifc4D. If not, see . import datetime -import math import xml.etree.ElementTree as ET -import ifcopenshell -import ifcopenshell.api -import ifcopenshell.util.date - from .common import ScheduleIfcGenerator diff --git a/src/ifc4d/ifc4d/p6xer2ifc.py b/src/ifc4d/ifc4d/p6xer2ifc.py index ef218ade2d5..935634767d8 100644 --- a/src/ifc4d/ifc4d/p6xer2ifc.py +++ b/src/ifc4d/ifc4d/p6xer2ifc.py @@ -16,11 +16,7 @@ # You should have received a copy of the GNU Lesser General Public License # along with Ifc4D. If not, see . -from datetime import date, datetime, timedelta -import ifcopenshell -import ifcopenshell.api -import ifcopenshell.util.date from xerparser.reader import Reader from .common import ScheduleIfcGenerator diff --git a/src/ifc4d/ifc4d/pp2ifc.py b/src/ifc4d/ifc4d/pp2ifc.py index 338a887e916..b2be0c753b4 100644 --- a/src/ifc4d/ifc4d/pp2ifc.py +++ b/src/ifc4d/ifc4d/pp2ifc.py @@ -12,8 +12,6 @@ from datetime import timedelta from typing import Any -import ifcopenshell.util.date - from .common import Activity, Calendar, ScheduleIfcGenerator, WBSEntry from .wpattern import AstaCalendarWorkPattern diff --git a/src/ifc4d/pyproject.toml b/src/ifc4d/pyproject.toml index 6bb2cc9f229..bbc101905a1 100644 --- a/src/ifc4d/pyproject.toml +++ b/src/ifc4d/pyproject.toml @@ -28,3 +28,9 @@ Issues = "https://github.com/IfcOpenShell/IfcOpenShell/issues" [tool.setuptools.packages.find] include = ["ifc4d"] exclude = ["test*"] + +[tool.ruff] +extend = "../../pyproject.toml" +lint.select = [ + "F401", # unused imports +] diff --git a/src/ifc5d/ifc5d/IFC4X3QtoBaseQuantitiesBlender.json b/src/ifc5d/ifc5d/IFC4X3QtoBaseQuantitiesBlender.json index 596f39a2b5d..02f67170281 100644 --- a/src/ifc5d/ifc5d/IFC4X3QtoBaseQuantitiesBlender.json +++ b/src/ifc5d/ifc5d/IFC4X3QtoBaseQuantitiesBlender.json @@ -237,7 +237,7 @@ "Area": "get_net_side_area", "Height": "get_height", "Perimeter": "get_rectangular_perimeter", - "Width": "get_length" + "Width": "get_x" } }, "IfcDuctFitting + IfcDuctFittingType": { diff --git a/src/ifc5d/ifc5d/csv2ifc.py b/src/ifc5d/ifc5d/csv2ifc.py index b1edd82d88e..c33d6e847e9 100644 --- a/src/ifc5d/ifc5d/csv2ifc.py +++ b/src/ifc5d/ifc5d/csv2ifc.py @@ -24,7 +24,6 @@ from typing import Optional, TypedDict, Union import ifcopenshell -import ifcopenshell.api import ifcopenshell.api.control import ifcopenshell.api.cost import ifcopenshell.api.root diff --git a/src/ifc5d/ifc5d/ifc5Dspreadsheet.py b/src/ifc5d/ifc5d/ifc5Dspreadsheet.py index 324340fb1c9..5aab765c268 100644 --- a/src/ifc5d/ifc5d/ifc5Dspreadsheet.py +++ b/src/ifc5d/ifc5d/ifc5Dspreadsheet.py @@ -25,7 +25,7 @@ import os import time from collections import Counter -from typing import Any, Optional, TypedDict, Union +from typing import Optional, TypedDict, Union import ifcopenshell import ifcopenshell.util.cost @@ -420,7 +420,7 @@ def write(self) -> None: class Ifc5DOdsWriter(Ifc5Dwriter): def write(self) -> None: - from odf.number import CurrencyStyle, CurrencySymbol, Number, NumberStyle, Text + from odf.number import CurrencyStyle, CurrencySymbol, Number from odf.opendocument import OpenDocumentSpreadsheet from odf.style import Style, TableCellProperties @@ -450,7 +450,7 @@ def write(self) -> None: self.doc.save(os.path.join(self.output, file_name), True) def write_table(self, cost_schedule): - from odf.number import CurrencyStyle, CurrencySymbol, Number, NumberStyle, Text + from odf.number import CurrencySymbol, Number from odf.table import Table, TableCell, TableRow from odf.text import P diff --git a/src/ifc5d/ifc5d/qto.py b/src/ifc5d/ifc5d/qto.py index f7fba8d9e5e..955c6fd7afd 100644 --- a/src/ifc5d/ifc5d/qto.py +++ b/src/ifc5d/ifc5d/qto.py @@ -27,7 +27,6 @@ from typing import Any, Literal, NamedTuple, Union, get_args import ifcopenshell -import ifcopenshell.api import ifcopenshell.api.pset import ifcopenshell.geom import ifcopenshell.ifcopenshell_wrapper as W @@ -35,7 +34,6 @@ import ifcopenshell.util.representation import ifcopenshell.util.selector import ifcopenshell.util.shape -import ifcopenshell.util.type import ifcopenshell.util.unit diff --git a/src/ifc5d/pyproject.toml b/src/ifc5d/pyproject.toml index 4d89b8a1087..8d51a638193 100644 --- a/src/ifc5d/pyproject.toml +++ b/src/ifc5d/pyproject.toml @@ -35,3 +35,9 @@ exclude = ["test*"] [tool.setuptools.package-data] "*" = ["*.*"] + +[tool.ruff] +extend = "../../pyproject.toml" +lint.select = [ + "F401", # unused imports +] diff --git a/src/ifc5d/test/test_csv2ifc.py b/src/ifc5d/test/test_csv2ifc.py index 7dc1bbd7186..c14a795da30 100644 --- a/src/ifc5d/test/test_csv2ifc.py +++ b/src/ifc5d/test/test_csv2ifc.py @@ -20,15 +20,15 @@ import tempfile from pathlib import Path -import ifc5d.csv2ifc -import ifc5d.ifc5Dspreadsheet import ifcopenshell import ifcopenshell.api.root import ifcopenshell.api.unit import ifcopenshell.util.cost -import ifcopenshell.util.element import pytest +import ifc5d.csv2ifc +import ifc5d.ifc5Dspreadsheet + class TestCsv2Ifc: @staticmethod diff --git a/src/ifcbimtester/bimtester/features/steps/aggregation/en.py b/src/ifcbimtester/bimtester/features/steps/aggregation/en.py index a2bbe621a16..f0c4af8f156 100644 --- a/src/ifcbimtester/bimtester/features/steps/aggregation/en.py +++ b/src/ifcbimtester/bimtester/features/steps/aggregation/en.py @@ -28,12 +28,8 @@ @step('There must be exactly {number} "{ifc_class}" elements') def step_impl(context, number, ifc_class): num = len(IfcStore.file.by_type(ifc_class)) - assert num == int( - number - ), "Could not find {} elements of {}. \ - Found {} element(s).".format( - number, ifc_class, num - ) + assert num == int(number), "Could not find {} elements of {}. \ + Found {} element(s).".format(number, ifc_class, num) @given('a set of (key,value) called ("{key_name}","{value_name}")') @@ -95,13 +91,9 @@ def step_impl(context, attribute_name): @then('there must be exactly a number of "{ifc_class}" equals to the number of distinct value') def step_impl(context, ifc_class): try: - context.execute_steps( - """ + context.execute_steps(""" then There must be exactly {number} "{ifc_class}" elements - """.format( - ifc_class=ifc_class, number=context.model.get_count_distinct_values() - ) - ) + """.format(ifc_class=ifc_class, number=context.model.get_count_distinct_values())) except AssertionError as error: str_error = str(error) assert False, str_error[: str_error.find("Traceback")] diff --git a/src/ifcbimtester/examples/steps/aggregation.py b/src/ifcbimtester/examples/steps/aggregation.py index ccf46b5e0df..96e0375b439 100644 --- a/src/ifcbimtester/examples/steps/aggregation.py +++ b/src/ifcbimtester/examples/steps/aggregation.py @@ -51,13 +51,9 @@ def step_impl(context, path_file): @then("there must be exactly a number of {ifc_class} equals to the number of distinct row value") def step_impl(context, ifc_class): try: - context.execute_steps( - """ + context.execute_steps(""" then There must be exactly {number} {ifc_class} elements - """.format( - ifc_class=ifc_class, number=context.model.get_count_distinct_values() - ) - ) + """.format(ifc_class=ifc_class, number=context.model.get_count_distinct_values())) except AssertionError as error: str_error = str(error) assert False, str_error[: str_error.find("Traceback")] diff --git a/src/ifcchat/CNAME b/src/ifcchat/CNAME new file mode 100644 index 00000000000..6fbcc546618 --- /dev/null +++ b/src/ifcchat/CNAME @@ -0,0 +1 @@ +ai-chat.ifcopenshell.org \ No newline at end of file diff --git a/src/ifcchat/README.md b/src/ifcchat/README.md new file mode 100644 index 00000000000..5dc434143ae --- /dev/null +++ b/src/ifcchat/README.md @@ -0,0 +1,10 @@ +IfcOpenShell AI Assistant +========================= + +A web-based client-side (pyodide + OpenAI, Anthropic, Gemini, or OpenRouter API) model interrogation and generation API based on: ifcedit, ifcquery and ifcmcp (ifcopenshell-mcp) packaged in a HTML+JS application. + +### Setup instructions + +``` +pip download ifcquery==0.8.5 ifcopenshell-mcp==0.8.5 ifcedit==0.8.5 lark==1.3.1 isodate==0.7.2 --no-deps -d ./dist +``` diff --git a/src/ifcchat/api_anthropic.js b/src/ifcchat/api_anthropic.js new file mode 100644 index 00000000000..64033171542 --- /dev/null +++ b/src/ifcchat/api_anthropic.js @@ -0,0 +1,184 @@ +// This file was generated with the assistance of an AI coding tool. + +function parseArguments(argumentsText) { + if (!argumentsText) return {}; + try { + return JSON.parse(argumentsText); + } catch { + return {}; + } +} + +function toAnthropicTools(tools = []) { + return tools.map((tool) => ({ + name: tool.function.name, + description: tool.function.description, + input_schema: tool.function.parameters, + })); +} + +function toAnthropicAssistantContent(message) { + const content = []; + + if (message.content) { + content.push({ type: "text", text: message.content }); + } + + for (const toolCall of message.tool_calls ?? []) { + content.push({ + type: "tool_use", + id: toolCall.id, + name: toolCall.function.name, + input: parseArguments(toolCall.function.arguments), + }); + } + + if (content.length === 0) { + return ""; + } + + return content.length === 1 && content[0].type === "text" ? content[0].text : content; +} + +function toAnthropicUserContent(message) { + return typeof message.content === "string" ? message.content : JSON.stringify(message.content ?? ""); +} + +function toAnthropicToolResult(message) { + return { + type: "tool_result", + tool_use_id: message.tool_call_id, + content: typeof message.content === "string" ? message.content : JSON.stringify(message.content ?? ""), + }; +} + +function splitSystemAndMessages(messages = []) { + const system = []; + const anthropicMessages = []; + let pendingToolResults = []; + + const flushToolResults = () => { + if (pendingToolResults.length === 0) return; + anthropicMessages.push({ role: "user", content: pendingToolResults }); + pendingToolResults = []; + }; + + for (const message of messages) { + if (message.role === "system") { + if (message.content) { + system.push(message.content); + } + continue; + } + + if (message.role === "tool") { + pendingToolResults.push(toAnthropicToolResult(message)); + continue; + } + + flushToolResults(); + + if (message.role === "user") { + anthropicMessages.push({ + role: "user", + content: toAnthropicUserContent(message), + }); + continue; + } + + if (message.role === "assistant") { + anthropicMessages.push({ + role: "assistant", + content: toAnthropicAssistantContent(message), + }); + } + } + + flushToolResults(); + + return { + system: system.join("\n\n"), + messages: anthropicMessages, + }; +} + +function toChatCompletionResponse(response) { + const text = []; + const toolCalls = []; + + for (const block of response.content ?? []) { + if (block.type === "text") { + text.push(block.text); + continue; + } + + if (block.type === "tool_use") { + toolCalls.push({ + id: block.id, + type: "function", + function: { + name: block.name, + arguments: JSON.stringify(block.input ?? {}), + }, + }); + } + } + + const message = { role: "assistant" }; + const content = text.join("\n").trim(); + + if (content) { + message.content = content; + } + + if (toolCalls.length) { + message.tool_calls = toolCalls; + } + + return { + choices: [ + { + message, + }, + ], + }; +} + +export async function chat({ apiKey, model, messages, tools }) { + const request = splitSystemAndMessages(messages); + const anthropicTools = toAnthropicTools(tools); + + // Mark the last tool with cache_control so the entire tool list is cached + if (anthropicTools.length > 0) { + anthropicTools[anthropicTools.length - 1].cache_control = { type: "ephemeral" }; + } + + const body = { + model, + max_tokens: 4096, + messages: request.messages, + tools: anthropicTools, + }; + + if (request.system) { + body.system = [{ type: "text", text: request.system, cache_control: { type: "ephemeral" } }]; + } + + const res = await fetch("https://api.anthropic.com/v1/messages", { + method: "POST", + headers: { + "Content-Type": "application/json", + "x-api-key": apiKey, + "anthropic-version": "2023-06-01", + "anthropic-dangerous-direct-browser-access": "true", + }, + body: JSON.stringify(body), + }); + + if (!res.ok) { + const text = await res.text(); + throw new Error(`Anthropic error ${res.status}: ${text}`); + } + + return toChatCompletionResponse(await res.json()); +} diff --git a/src/ifcchat/api_openai.js b/src/ifcchat/api_openai.js new file mode 100644 index 00000000000..8903f897e47 --- /dev/null +++ b/src/ifcchat/api_openai.js @@ -0,0 +1,20 @@ +function getChatCompletionsUrl(baseURL) { + const root = (baseURL || "https://api.openai.com/v1").replace(/\/+$/, ""); + return `${root}/chat/completions`; +} + +export async function chat({ apiKey, baseURL, model, messages, tools }) { + const res = await fetch(getChatCompletionsUrl(baseURL), { + method: "POST", + headers: { + "Content-Type": "application/json", + "Authorization": `Bearer ${apiKey}`, + }, + body: JSON.stringify({ model, messages, tools }), + }); + if (!res.ok) { + const text = await res.text(); + throw new Error(`OpenAI error ${res.status}: ${text}`); + } + return await res.json(); +} diff --git a/src/ifcchat/api_openrouter.js b/src/ifcchat/api_openrouter.js new file mode 100644 index 00000000000..38c11e36e85 --- /dev/null +++ b/src/ifcchat/api_openrouter.js @@ -0,0 +1,20 @@ +function getChatCompletionsUrl(baseURL) { + const root = (baseURL || "https://openrouter.ai/api/v1").replace(/\/+$/, ""); + return `${root}/chat/completions`; +} + +export async function chat({ apiKey, baseURL, model, messages, tools }) { + const res = await fetch(getChatCompletionsUrl(baseURL), { + method: "POST", + headers: { + "Content-Type": "application/json", + "Authorization": `Bearer ${apiKey}`, + }, + body: JSON.stringify({ model, messages, tools }), + }); + if (!res.ok) { + const text = await res.text(); + throw new Error(`OpenRouter error ${res.status}: ${text}`); + } + return await res.json(); +} diff --git a/src/ifcchat/app.js b/src/ifcchat/app.js new file mode 100644 index 00000000000..cf8723f46f5 --- /dev/null +++ b/src/ifcchat/app.js @@ -0,0 +1,771 @@ +// app.js +import * as openaiApi from "./api_openai.js"; +import * as anthropicApi from "./api_anthropic.js"; +import * as openrouterApi from "./api_openrouter.js"; + +const PROVIDERS = { + openai: { + api: openaiApi, + apiKeyLabel: "OpenAI API key", + apiKeyPlaceholder: "sk-...", + baseUrlLabel: "Base URL", + baseUrlPlaceholder: "https://api.openai.com/v1", + baseUrlDefault: "https://api.openai.com/v1", + models: [ + { + value: "gpt-5.2", + label: "gpt-5.2" + }, + { + value: "gpt-5.2-chat-latest", + label: "gpt-5.2-chat-latest" + }, + { + value: "gpt-5", + label: "gpt-5" + }, + { + value: "gpt-5-chat-latest", + label: "gpt-5-chat-latest" + }, + { + value: "gpt-5-mini", + label: "gpt-5-mini" + }, + { + value: "gpt-5-nano", + label: "gpt-5-nano" + }, + { + value: "gpt-4.1", + label: "gpt-4.1" + }, + { + value: "gpt-4.1-mini", + label: "gpt-4.1-mini" + }, + { + value: "gpt-4.1-nano", + label: "gpt-4.1-nano" + }, + ], + }, + anthropic: { + api: anthropicApi, + apiKeyLabel: "Anthropic API key", + apiKeyPlaceholder: "sk-ant-...", + models: [ + { + value: "claude-sonnet-4-6", + label: "claude-sonnet-4-6" + }, + { + value: "claude-opus-4-6", + label: "claude-opus-4-6" + }, + { + value: "claude-haiku-4-5-20251001", + label: "claude-haiku-4-5" + }, + ], + }, + gemini: { + api: openaiApi, + apiKeyLabel: "Gemini API key", + apiKeyPlaceholder: "AIza...", + baseUrlLabel: "Base URL", + baseUrlPlaceholder: "https://generativelanguage.googleapis.com/v1beta/openai/", + baseUrlDefault: "https://generativelanguage.googleapis.com/v1beta/openai/", + models: [ + { + value: "gemini-3-flash-preview", + label: "gemini-3-flash-preview" + }, + { + value: "gemini-2.5-flash", + label: "gemini-2.5-flash" + }, + { + value: "gemini-2.5-pro", + label: "gemini-2.5-pro" + }, + ], + }, + openrouter: { + api: openrouterApi, + apiKeyLabel: "OpenRouter API key", + apiKeyPlaceholder: "sk-or-v1-...", + baseUrlLabel: "Base URL", + baseUrlPlaceholder: "https://openrouter.ai/api/v1", + baseUrlDefault: "https://openrouter.ai/api/v1", + models: [ + { + value: "openai/gpt-oss-20b", + label: "gpt-oss-20b" + }, + { + value: "openai/gpt-oss-120b", + label: "gpt-oss-120b" + }, + { + value: "mistralai/mistral-small-3.2-24b-instruct", + label: "mistral-small-3.2" + }, + { + value: "openai/gpt-4.1", + label: "gpt-4.1" + }, + { + value: "anthropic/claude-sonnet-4-5", + label: "claude-sonnet-4-5" + }, + { + value: "google/gemini-2.5-pro-preview", + label: "gemini-2.5-pro" + }, + ], + }, +}; + +const $ = (id) => document.getElementById(id); + +const statusEl = $("status"); +const msgsEl = $("msgs"); +const sendBtn = $("send"); +const inputEl = $("input"); +const apiKeyEl = $("apiKey"); +const apiKeyLabelEl = $("apiKeyLabel"); +const baseUrlRowEl = $("baseUrlRow"); +const baseUrlLabelEl = $("baseUrlLabel"); +const baseUrlEl = $("baseUrl"); +const thinkingIndicatorEl = $("thinkingIndicator"); +const compactingIndicatorEl = $("compactingIndicator"); +const modelEl = $("model"); +const providerEls = document.querySelectorAll('input[name="provider"]'); +const ifcFileEl = $("ifcFile"); +const newBtn = $("newModel"); +const downloadBtn = $("downloadIfc"); + +function getProviderValue() { + return document.querySelector('input[name="provider"]:checked')?.value || "openai"; +} + +function onProviderChange() { + const provider = PROVIDERS[getProviderValue()]; + apiKeyLabelEl.innerHTML = `${provider.apiKeyLabel}stored in browser memory; only sent to provider servers`; + apiKeyEl.placeholder = provider.apiKeyPlaceholder; + baseUrlRowEl.hidden = !provider.baseUrlDefault; + if (provider.baseUrlDefault) { + baseUrlLabelEl.innerHTML = `${provider.baseUrlLabel}override the API endpoint for OpenAI-compatible providers`; + baseUrlEl.placeholder = provider.baseUrlPlaceholder; + baseUrlEl.value = provider.baseUrlDefault; + } else { + baseUrlEl.value = ""; + baseUrlEl.placeholder = ""; + } + modelEl.innerHTML = provider.models.map(m => ``).join(""); +} + +for (const providerEl of providerEls) { + providerEl.addEventListener("change", onProviderChange); +} +onProviderChange(); + +function setBusy(isBusy, reason = "") { + const controls = [ + $("send"), + $("newModel"), + $("downloadIfc"), + $("ifcFile"), + ]; + + for (const el of controls) el.disabled = isBusy; + + $("input").disabled = isBusy; + + const browseBtn = $("browseBtn"); + if (browseBtn) { + browseBtn.classList.toggle("disabled", isBusy); + browseBtn.setAttribute("aria-disabled", isBusy ? "true" : "false"); + browseBtn.tabIndex = isBusy ? -1 : 0; + } + + sendBtn.innerHTML = isBusy + ? `` + : `Send send`; + + setStatus(isBusy ? (reason || "Working…") : "Ready"); +} + +function escapeHtml(text) { + return text + .replaceAll("&", "&") + .replaceAll("<", "<") + .replaceAll(">", ">") + .replaceAll('"', """) + .replaceAll("'", "'"); +} + +function sanitizeUrl(url) { + try { + const parsed = new URL(url, window.location.href); + if (["http:", "https:", "mailto:"].includes(parsed.protocol)) { + return parsed.href; + } + } catch { + } + return null; +} + +function renderInlineMarkdown(text) { + const placeholders = []; + const addPlaceholder = (html) => { + const token = `@@MD${placeholders.length}@@`; + placeholders.push({ token, html }); + return token; + }; + + let rendered = text; + + rendered = rendered.replace(/`([^`]+)`/g, (_, code) => addPlaceholder(`${escapeHtml(code)}`)); + rendered = rendered.replace(/\[([^\]]+)\]\(([^)\s]+)\)/g, (_, label, url) => { + const href = sanitizeUrl(url); + if (!href) { + return `${label} (${url})`; + } + return addPlaceholder( + `${escapeHtml(label)}` + ); + }); + + rendered = escapeHtml(rendered); + rendered = rendered.replace(/\*\*([^*]+)\*\*/g, "$1"); + rendered = rendered.replace(/\*([^*]+)\*/g, "$1"); + rendered = rendered.replace(/_([^_]+)_/g, "$1"); + + for (const placeholder of placeholders) { + rendered = rendered.replaceAll(placeholder.token, placeholder.html); + } + + return rendered; +} + +function renderMarkdown(text) { + const lines = String(text).replace(/\r\n?/g, "\n").split("\n"); + const html = []; + let paragraphLines = []; + let quoteLines = []; + let listType = null; + let listItems = []; + + const flushParagraph = () => { + if (!paragraphLines.length) return; + html.push(`

${renderInlineMarkdown(paragraphLines.join(" "))}

`); + paragraphLines = []; + }; + + const flushQuote = () => { + if (!quoteLines.length) return; + const quoteBody = quoteLines.map((line) => renderInlineMarkdown(line)).join("
"); + html.push(`

${quoteBody}

`); + quoteLines = []; + }; + + const flushList = () => { + if (!listItems.length || !listType) return; + const items = listItems.map((item) => `
  • ${renderInlineMarkdown(item)}
  • `).join(""); + html.push(`<${listType}>${items}`); + listType = null; + listItems = []; + }; + + const flushAll = () => { + flushParagraph(); + flushQuote(); + flushList(); + }; + + for (let index = 0; index < lines.length; index++) { + const line = lines[index]; + const trimmed = line.trim(); + + if (trimmed.startsWith("```")) { + flushAll(); + const language = trimmed.slice(3).trim(); + const codeLines = []; + index += 1; + while (index < lines.length && !lines[index].trim().startsWith("```")) { + codeLines.push(lines[index]); + index += 1; + } + const languageClass = language ? ` class="language-${escapeHtml(language)}"` : ""; + html.push(`
    ${escapeHtml(codeLines.join("\n"))}
    `); + continue; + } + + if (!trimmed) { + flushAll(); + continue; + } + + const headingMatch = trimmed.match(/^(#{1,6})\s+(.+)$/); + if (headingMatch) { + flushAll(); + const level = headingMatch[1].length; + html.push(`${renderInlineMarkdown(headingMatch[2])}`); + continue; + } + + const quoteMatch = trimmed.match(/^>\s?(.*)$/); + if (quoteMatch) { + flushParagraph(); + flushList(); + quoteLines.push(quoteMatch[1]); + continue; + } + + if (quoteLines.length) { + flushQuote(); + } + + const unorderedListMatch = trimmed.match(/^[-*]\s+(.+)$/); + if (unorderedListMatch) { + flushParagraph(); + if (listType && listType !== "ul") { + flushList(); + } + listType = "ul"; + listItems.push(unorderedListMatch[1]); + continue; + } + + const orderedListMatch = trimmed.match(/^\d+\.\s+(.+)$/); + if (orderedListMatch) { + flushParagraph(); + if (listType && listType !== "ol") { + flushList(); + } + listType = "ol"; + listItems.push(orderedListMatch[1]); + continue; + } + + if (listItems.length) { + flushList(); + } + + paragraphLines.push(trimmed); + } + + flushAll(); + + return html.join(""); +} + +function addMessage(role, text) { + if (text.ok) { + text = text.data; + } + if (typeof text !== "string") { + text = JSON.stringify(text, null, 2); + } + const wrap = document.createElement("div"); + wrap.className = `msg ${role}`; + wrap.innerHTML = ` +
    ${role}${role === "tool" ? '' : ''}
    +
    `; + const bubble = wrap.querySelector(".bubble"); + if (role === "assistant") { + bubble.classList.add("markdown-content"); + bubble.innerHTML = renderMarkdown(text); + } else { + bubble.textContent = text; + } + bubble.onclick = function () { + if (bubble.scrollHeight > 100 && role === "tool") { + const expanded = bubble.style.maxHeight === 'none'; + bubble.style.maxHeight = expanded ? '' : 'none'; + bubble.style.borderBottom = expanded ? '' : 'dotted 2px gray'; + wrap.querySelector(".chevron").style.transform = expanded ? '' : 'rotate(90deg)'; + } + } + msgsEl.insertBefore(wrap, thinkingIndicatorEl); + msgsEl.scrollTop = msgsEl.scrollHeight; +} + +function setStatus(text) { + statusEl.textContent = text; + thinkingIndicatorEl.hidden = text !== "Thinking…"; + compactingIndicatorEl.hidden = text !== "Compacting…"; + msgsEl.scrollTop = msgsEl.scrollHeight; +} + +const worker = new Worker("./ifc_worker.js", { type: "module" }); + +function callWorker(type, payload = {}) { + return new Promise((resolve, reject) => { + const id = crypto.randomUUID(); + const onMsg = (ev) => { + const msg = ev.data; + if (!msg || msg.id !== id) return; + worker.removeEventListener("message", onMsg); + if (msg.ok) resolve(msg); + else reject(new Error(msg.error || "Worker error")); + }; + worker.addEventListener("message", onMsg); + worker.postMessage({ id, type, payload }); + }); +} + +// ---- Tool schemas (should match ifcmcp.core openai_tools()) ---- +const tools = [ + { + type: "function", function: { name: "ifc_new", description: "Create a new empty IFC model in memory. Valid schemas: IFC4, IFC2X3, IFC4X3 (for IFC 4.3).", + parameters: { type: "object", properties: { schema: { type: "string", enum: ["IFC4", "IFC2X3", "IFC4X3"] } }, required: [], additionalProperties: false } } + }, + { + type: "function", function: { name: "ifc_summary", description: "Get a concise overview of the loaded IFC model.", + parameters: { type: "object", properties: {}, required: [], additionalProperties: false } } + }, + { + type: "function", function: { name: "ifc_tree", description: "Get the full spatial hierarchy tree.", + parameters: { type: "object", properties: {}, required: [], additionalProperties: false } } + }, + { + type: "function", function: { name: "ifc_select", description: "Select elements using ifcopenshell selector syntax (e.g. 'IfcWall').", + parameters: { type: "object", properties: { query: { type: "string" } }, required: ["query"], additionalProperties: false } } + }, + { + type: "function", function: { name: "ifc_info", description: "Inspect an entity by STEP id.", + parameters: { type: "object", properties: { element_id: { type: "integer" } }, required: ["element_id"], additionalProperties: false } } + }, + { + type: "function", function: { name: "ifc_relations", description: "Get relationships for an element. traverse='up' walks to IfcProject.", + parameters: { + type: "object", properties: { element_id: { type: "integer" }, traverse: { type: "string" } }, + required: ["element_id"], additionalProperties: false + } } + }, + { + type: "function", function: { name: "ifc_clash", description: "Run clash/clearance checks for an element.", + parameters: { + type: "object", properties: { element_id: { type: "integer" }, clearance: { type: "number" }, tolerance: { type: "number" }, scope: { type: "string" } }, + required: ["element_id"], additionalProperties: false + } } + }, + { + type: "function", function: { name: "ifc_list", description: "List ifcopenshell.api modules or functions within a module.", + parameters: { type: "object", properties: { module: { type: "string" } }, required: [], additionalProperties: false } } + }, + { + type: "function", function: { name: "ifc_docs", description: "Get documentation for an ifcopenshell.api function, 'module.function'.", + parameters: { type: "object", properties: { function_path: { type: "string" } }, required: ["function_path"], additionalProperties: false } } + }, + { + type: "function", function: { name: "ifc_edit", description: "Execute an ifcopenshell.api mutation; params is a JSON string of stringly-typed kwargs.", + parameters: { type: "object", properties: { function_path: { type: "string" }, params: { type: "string" } }, required: ["function_path"], additionalProperties: false } } + }, + { + type: "function", function: { name: "ifc_validate", description: "Validate the loaded model. Returns valid bool and list of issues.", + parameters: { type: "object", properties: { express_rules: { type: "boolean" } }, required: [], additionalProperties: false } } + }, + { + type: "function", function: { name: "ifc_schedule", description: "List work schedules and nested tasks. Use max_depth=1 for top-level phases only on large projects.", + parameters: { type: "object", properties: { max_depth: { type: "integer" } }, required: [], additionalProperties: false } } + }, + { + type: "function", function: { name: "ifc_cost", description: "List cost schedules and nested cost items. Use max_depth=1 for top-level sections only on large BoQs.", + parameters: { type: "object", properties: { max_depth: { type: "integer" } }, required: [], additionalProperties: false } } + }, + { + type: "function", function: { name: "ifc_schema", description: "Return IFC class documentation for an entity type.", + parameters: { type: "object", properties: { entity_type: { type: "string" } }, required: ["entity_type"], additionalProperties: false } } + }, + { + type: "function", function: { name: "ifc_quantify", description: "Run quantity take-off (QTO) on the model. Modifies model in-place; call ifc_save() after.", + parameters: { type: "object", properties: { rule: { type: "string" }, selector: { type: "string" } }, required: ["rule"], additionalProperties: false } } + }, +]; + +const SYSTEM_INSTRUCTIONS = ` +You are an IFC copilot running in a browser. You can call tools to inspect or modify the currently loaded IFC model. +Rules: +- If the user asks about model contents (counts, lists, properties, hierarchy), use tools like ifc_summary/ifc_select/ifc_info/ifc_tree. +- If the user asks to change the model, prefer: (1) ifc_list to find candidate API modules, (2) ifc_docs for the exact function signature, then (3) ifc_edit. +- If there is no model and the user wants to create one, call ifc_new. +- In case of type errors on api functions, retry providing values as strings (for example in the case of the matrix in geometry.edit_object_placement). +- After edits, explain what changed and suggest downloading the IFC. +Be concise. Avoid dumping huge trees unless asked. +`; + +let messages = []; // running conversation state (Chat Completions style) + +const MAX_TOOL_RESULT_CHARS = 0; +const MAX_HISTORY_MESSAGES = 40; +const ESTIMATED_CHARS_PER_TOKEN = 4; +const MAX_ESTIMATED_TOKENS_PER_MINUTE = 24000; +const COMPACT_WHEN_ESTIMATED_TOKENS = 18000; +const KEEP_RAW_TURN_GROUPS = 1; +const minuteTokenMap = new Map(); + +function truncateToolResult(text) { + if (MAX_TOOL_RESULT_CHARS == 0 || text.length <= MAX_TOOL_RESULT_CHARS) return text; + return text.slice(0, MAX_TOOL_RESULT_CHARS) + "\n... (truncated)"; +} + +function trimHistory() { + if (messages.length <= MAX_HISTORY_MESSAGES) return; + // Find a safe cut point — don't break mid-tool-call sequence. + // Walk forward from the trim target to find a user message boundary. + let cut = messages.length - MAX_HISTORY_MESSAGES; + while (cut < messages.length && messages[cut].role !== "user") { + cut++; + } + if (cut > 0 && cut < messages.length) { + messages.splice(0, cut); + } +} + +function getEstimatedTokenMinuteLog(firstIterationMinuteBucket) { + return Array.from(minuteTokenMap.entries()) + .filter(([minuteBucket]) => minuteBucket >= firstIterationMinuteBucket) + .sort(([leftMinuteBucket], [rightMinuteBucket]) => leftMinuteBucket - rightMinuteBucket) + .map(([minuteBucket, estimatedTokens]) => ({ + timestamp: new Date(minuteBucket * 60000).toISOString(), + estimated_tokens: estimatedTokens, + })); +} + +async function chatWithMinuteDelay({ chat, apiKey, baseURL, model, messages, tools }) { + const estimatedTokens = Math.max( + 1, + Math.ceil(JSON.stringify({ model, messages, ...(tools ? { tools } : {}) }).length / ESTIMATED_CHARS_PER_TOKEN) + ); + let currentMinuteBucket = Math.floor(Date.now() / 60000); + const estimateTokenUsage = (minuteTokenMap.get(currentMinuteBucket) ?? 0) + estimatedTokens; + + if (estimateTokenUsage > MAX_ESTIMATED_TOKENS_PER_MINUTE) { + currentMinuteBucket += 1; + await new Promise((resolve) => setTimeout(() => resolve(), 60000)); + } + + minuteTokenMap.set(currentMinuteBucket, (minuteTokenMap.get(currentMinuteBucket) ?? 0) + estimatedTokens); + + return { + minuteBucket: currentMinuteBucket, + response: await chat({ apiKey, baseURL, model, messages, tools }), + }; +} + +async function compactHistoryWithLLM(chat, apiKey, baseURL, model) { + const estimatedTokens = Math.max( + 1, + Math.ceil(JSON.stringify([{ role: "system", content: SYSTEM_INSTRUCTIONS }, ...messages]).length / ESTIMATED_CHARS_PER_TOKEN) + ); + if (messages.length <= MAX_HISTORY_MESSAGES && estimatedTokens <= COMPACT_WHEN_ESTIMATED_TOKENS) return null; + + const { prefix, groups } = messages.reduce((acc, message) => { + if (message.role === "user") { + acc.groups.push([message]); + } else if (acc.groups.length) { + acc.groups[acc.groups.length - 1].push(message); + } else { + acc.prefix.push(message); + } + return acc; + }, { prefix: [], groups: [] }); + + if (groups.length <= KEEP_RAW_TURN_GROUPS) return null; + + const compacted = [...prefix, ...groups.slice(0, -KEEP_RAW_TURN_GROUPS).flat()]; + if (!compacted.length) return null; + + setStatus("Compacting…"); + try { + const before = { + message_count: messages.length, + turn_group_count: groups.length, + estimated_tokens: estimatedTokens, + }; + const { minuteBucket, response } = await chatWithMinuteDelay({ + chat, + apiKey, + baseURL, + model, + messages: [ + { + role: "system", + content: "Summarize older IFC chat context for continuation. Preserve user goals, model state and schema, edits already applied, important ids, names, selectors, and unresolved questions. Be concise, factual, and use short markdown bullets. Do not mention that this is a summary." + }, + { role: "user", content: JSON.stringify(compacted) }, + ], + }); + const summary = response.choices?.[0]?.message?.content?.trim(); + + if (!summary) return minuteBucket; + + messages = [ + { role: "assistant", content: `[Context summary]\n${summary}` }, + ...groups.slice(-KEEP_RAW_TURN_GROUPS).flat(), + ]; + console.log("History compaction before", before); + console.log("History compaction after", { + message_count: messages.length, + turn_group_count: messages.filter((message) => message.role === "user").length, + estimated_tokens: Math.max( + 1, + Math.ceil(JSON.stringify([{ role: "system", content: SYSTEM_INSTRUCTIONS }, ...messages]).length / ESTIMATED_CHARS_PER_TOKEN) + ), + }); + return minuteBucket; + } finally { + setStatus("Thinking…"); + } +} + +async function runAgentTurn(userText) { + const apiKey = apiKeyEl.value.trim(); + if (!apiKey) throw new Error("Missing API key"); + + const provider = PROVIDERS[getProviderValue()]; + const { chat } = provider.api; + const baseURL = provider.baseUrlDefault ? baseUrlEl.value.trim() : undefined; + let firstIterationMinuteBucket = null; + + messages.push({ role: "user", content: userText }); + + for (let i = 0; i < 64; i++) { + const compactedMinuteBucket = await compactHistoryWithLLM(chat, apiKey, baseURL, modelEl.value); + if (firstIterationMinuteBucket === null && compactedMinuteBucket !== null) { + firstIterationMinuteBucket = compactedMinuteBucket; + } + if (messages.length > MAX_HISTORY_MESSAGES * 2) trimHistory(); + + const messages_with_system = [{ role: "system", content: SYSTEM_INSTRUCTIONS }, ...messages]; + const { minuteBucket, response } = await chatWithMinuteDelay({ + chat, + apiKey, + baseURL, + model: modelEl.value, + messages: messages_with_system, + tools, + }); + if (firstIterationMinuteBucket === null) { + firstIterationMinuteBucket = minuteBucket; + } + + const message = response.choices?.[0]?.message; + if (!message) throw new Error("No message in response"); + + messages.push(message); + + if (message.content) addMessage("assistant", message.content); + + const calls = message.tool_calls ?? []; + if (calls.length === 0) { + console.log("Estimated token usage by minute", getEstimatedTokenMinuteLog(firstIterationMinuteBucket)); + return; + } + + for (const call of calls) { + let args = {}; + try { args = call.function.arguments ? JSON.parse(call.function.arguments) : {}; } + catch { args = {}; } + + addMessage("tool", `→ ${call.function.name}(${JSON.stringify(args)})`); + + const toolRes = await callWorker("toolCall", { name: call.function.name, args }); + + const fullResult = JSON.stringify(toolRes.result); + + messages.push({ + role: "tool", + tool_call_id: call.id, + content: truncateToolResult(fullResult), + }); + + // Show full result in UI, but only truncated version goes to the LLM + addMessage("tool", `← ${call.function.name}: ${JSON.stringify(toolRes.result, null, 2)}`); + } + } + + addMessage("assistant", "I hit the tool-call loop limit. Try narrowing your request."); +} + +sendBtn.onclick = async () => { + const text = inputEl.value.trim(); + if (!text) return; + inputEl.value = ""; + addMessage("user", text); + try { + setBusy(true, "Thinking…"); + await runAgentTurn(text); + setBusy(false, "Ready"); + } catch (e) { + setBusy(false, "Error"); + addMessage("assistant", `Error: ${e.message}`); + } +}; + +inputEl.addEventListener("keydown", (e) => { + if (e.key === "Enter" && !e.shiftKey) { + e.preventDefault(); + sendBtn.click(); + } +}); + +ifcFileEl.onchange = async () => { + const f = ifcFileEl.files?.[0]; + if (!f) return; + setBusy(true, "Loading IFC into Pyodide…"); + const buf = await f.arrayBuffer(); + try { + const r = await callWorker("loadIfc", { filename: f.name, bytes: buf }, [buf]); + addMessage("assistant", r.result); + setBusy(false, "Ready"); + } catch (e) { + setStatus(true, "Error"); + addMessage("assistant", `Load error: ${e.message}`); + } +}; + +newBtn.onclick = async () => { + try { + setBusy(true, "Creating new model…"); + const r = await callWorker("toolCall", { name: "ifc_new", args: { schema: "IFC4X3" } }); + addMessage("assistant", `New model: ${JSON.stringify(r.result)}`); + setBusy(false, "Ready"); + } catch (e) { + setBusy(true, "Error"); + addMessage("assistant", `Error: ${e.message}`); + } +}; + +downloadBtn.onclick = async () => { + try { + setBusy(true, "Exporting IFC…"); + const r = await callWorker("exportIfc", {}); + const blob = new Blob([r.bytes], { type: "application/octet-stream" }); + const url = URL.createObjectURL(blob); + const a = document.createElement("a"); + a.href = url; + a.download = r.filename || "model.ifc"; + a.click(); + URL.revokeObjectURL(url); + setBusy(false, "Ready"); + } catch (e) { + setBusy(true, "Error"); + addMessage("assistant", `Export error: ${e.message}`); + } +}; + +(async () => { + try { + setBusy(true, "Initializing Pyodide and IfcOpenShell for in-memory IFC access…"); + await callWorker("init", {}); + setBusy(false, "Ready"); + } catch (e) { + setBusy(true, "Error"); + addMessage("assistant", `Worker init failed: ${e.message}`); + } +})(); diff --git a/src/ifcchat/ifc_worker.js b/src/ifcchat/ifc_worker.js new file mode 100644 index 00000000000..06d6ecdf70c --- /dev/null +++ b/src/ifcchat/ifc_worker.js @@ -0,0 +1,101 @@ +// ifc_worker.js (MODULE WORKER) +import { loadPyodide } from "https://cdn.jsdelivr.net/pyodide/v0.29.3/full/pyodide.mjs"; + +let pyodide = null; +let callToolPy = null; +let initPromise = null; + +function ok(id, extra = {}, transfer = []) { + self.postMessage({ id, ok: true, ...extra }, transfer); +} +function fail(id, error) { + self.postMessage({ id, ok: false, error: String(error?.message || error) }); +} + +async function ensurePyodide() { + if (initPromise) return initPromise; + + initPromise = (async () => { + // Passing indexURL avoids some environments failing to infer it from the module URL. :contentReference[oaicite:3]{index=3} + pyodide = await loadPyodide({ + indexURL: "https://cdn.jsdelivr.net/pyodide/v0.29.3/full/", + }); + + await pyodide.loadPackage("micropip"); + await pyodide.loadPackage("numpy"); + await pyodide.loadPackage("shapely"); + await pyodide.loadPackage("typing-extensions"); + + const micropip = pyodide.pyimport("micropip"); + micropip.install("python-dateutil") + + const wheelUrl = "https://ifcopenshell.github.io/wasm-wheels/ifcopenshell-0.8.5-cp313-cp313-pyodide_2025_0_wasm32.whl"; + + await micropip.install(wheelUrl); + + await micropip.install([ + "./dist/ifcquery-0.8.5-py3-none-any.whl", + "./dist/ifcedit-0.8.5-py3-none-any.whl", + "./dist/ifcopenshell_mcp-0.8.5-py3-none-any.whl", + "./dist/lark-1.3.1-py3-none-any.whl", + "./dist/isodate-0.7.2-py3-none-any.whl", + ]) + await pyodide.runPythonAsync(` +from ifcmcp.embedded import call_tool as _call_tool + `); + callToolPy = pyodide.globals.get("_call_tool"); + })(); + + return initPromise; +} + +function callTool(name, args) { + const pyArgs = pyodide.toPy(args); + const res = callToolPy(name, pyArgs); + pyArgs.destroy(); + const resJs = res.toJs({ dict_converter: Object.fromEntries }); + res.destroy(); + return resJs; +} + +self.onmessage = async (ev) => { + const { id, type, payload } = ev.data || {}; + try { + if (type === "init") { + await ensurePyodide(); + ok(id, { result: "ok" }); + return; + } + + await ensurePyodide(); + + if (type === "loadIfc") { + const { filename, bytes } = payload; + const path = `/tmp/${filename || "model.ifc"}`; + pyodide.FS.mkdirTree("/tmp"); + pyodide.FS.writeFile(path, new Uint8Array(bytes)); + const result = callTool("ifc_load", { path }); + ok(id, { result }); + return; + } + + if (type === "exportIfc") { + const path = "/tmp/export.ifc"; + const result = callTool("ifc_save", { path }); + const data = pyodide.FS.readFile(path); + ok(id, { result, filename: "export.ifc", bytes: data }, [data.buffer]); + return; + } + + if (type === "toolCall") { + const { name, args } = payload; + const result = callTool(name, args || {}); + ok(id, { result }); + return; + } + + throw new Error(`Unknown message type: ${type}`); + } catch (e) { + fail(id, e); + } +}; \ No newline at end of file diff --git a/src/ifcchat/index.html b/src/ifcchat/index.html new file mode 100644 index 00000000000..7ccb6785912 --- /dev/null +++ b/src/ifcchat/index.html @@ -0,0 +1,131 @@ + + + + + + + IfcOpenShell AI Assistant + + + + + +
    +
    +
    + +
    + + + + +
    +
    + +
    + + +
    + +
    + + +
    + +
    + + +
    + +
    + +
    + + +
    + + + +
    + + +
    + +
    + +
    + +
    + +
    + +
    + • Upload an IFC, then ask “Summarize the model” or “List all IfcWalls”.
    + • Try “Add a new site and building named X” (will use ifc_edit). +
    +
    + +
    + +
    + Chat with your IFC model. This app uses ifcopenshell-mcp to interact with an IFC model. IFC is in its raw-serialized form provides little textual context on the meaning of attributes, the intent behind element instances and the resulting geometrical form. By using the IfcOpenShell high-level API through an MCP-like interface (Model Context Protocol; allows for structured interaction with APIs and tools) these limitations are addressed and the model can be interrogated on a higher semantic abstraction level. You can also use ifcopenshell-mcp on your local machine with any LLM provider that supports the MCP protocol. +
    +
    +
    + +
    +
    + +
    + IfcOpenShell AI Assistant +
    +
    + + Status: Booting… +
    +
    + +
    + + +
    +
    +
    + + +
    +
    +
    +
    + + + + + diff --git a/src/ifcchat/style.css b/src/ifcchat/style.css new file mode 100644 index 00000000000..105e0d574f6 --- /dev/null +++ b/src/ifcchat/style.css @@ -0,0 +1,370 @@ +* { + box-sizing: border-box; +} + +body { + font-family: system-ui, sans-serif; + margin: 0; +} + +button, +input, +select, +textarea { + font: inherit; +} + +header { + padding: 12px 16px; + border-bottom: 1px solid #ddd; +} + +header input, +header select { + padding: 8px; +} + +main { + display: grid; + grid-template-columns: 320px 1fr; + height: 100vh; +} + +.side { + border-right: 1px solid #ddd; + padding: 12px; + overflow: auto; + background: #f9f9f9; +} + +.chat { + display: flex; + flex-direction: column; + height: 100%; +} + +.msgs { + flex: 1; + overflow: auto; + padding: 16px; +} + +.msg { + margin: 10px 0; +} + +.thinking-indicator { + display: inline-flex; + align-items: center; + gap: 10px; + color: #555; + font-size: 80%; +} + +.thinking-indicator[hidden] { + display: none; +} + +.thinking-indicator .spinner { + width: 14px; + height: 14px; +} + +.msg .role { + font-size: 12px; + opacity: 0.7; + margin: 12px 0 4px 0; +} + +.role.user { + text-align: right; +} + +.msg .bubble { + padding: 0; + border-radius: 10px; + white-space: pre-wrap; +} + +.msg.assistant .bubble { + padding: 10px 14px; + line-height: 1.5; +} + +.markdown-content > :first-child { + margin-top: 0; +} + +.markdown-content > :last-child { + margin-bottom: 0; +} + +.markdown-content p, +.markdown-content ul, +.markdown-content ol, +.markdown-content blockquote, +.markdown-content pre { + margin: 0 0 12px 0; +} + +.markdown-content h1, +.markdown-content h2, +.markdown-content h3, +.markdown-content h4, +.markdown-content h5, +.markdown-content h6 { + margin: 0 0 12px 0; + line-height: 1.25; +} + +.markdown-content ul, +.markdown-content ol { + padding-left: 24px; +} + +.markdown-content blockquote { + margin-left: 0; + padding-left: 12px; + border-left: 3px solid #ddd; + color: #555; +} + +.markdown-content code { + padding: 1px 4px; + border-radius: 4px; + background: #f2f2f2; + font-family: ui-monospace, SFMono-Regular, Menlo, monospace; + font-size: 90%; +} + +.markdown-content pre { + overflow-x: auto; + padding: 12px; + border-radius: 10px; + background: #f4f4f4; +} + +.markdown-content pre code { + padding: 0; + background: transparent; +} + +.markdown-content a { + color: inherit; +} + +.msg.user .bubble { + padding: 10px 20px; + background: #eee; + width: 50%; + margin-left: auto; + border: solid 1px #ddd; +} + +.msg.tool .bubble { + font-family: ui-monospace, SFMono-Regular, Menlo, monospace; + font-size: 60%; + max-height: 100px; + overflow: hidden; + cursor: pointer; +} + +.chevron { + display: inline-block; + font-size: 10px; + margin-left: 6px; + transition: transform 0.2s; + vertical-align: middle; +} + +.composer { + display: flex; + gap: 8px; + padding: 12px; + justify-content: center; +} + +.composer textarea { + flex: 1; + resize: none; + height: 88px; + border: none; +} + +.composer button { + align-self: center; +} + +.composer .inner { + border: solid 1px #ddd; + border-radius: 20px; + padding: 10px; + display: flex; + width: 100%; +} + +@keyframes spin { to { transform: rotate(360deg); } } +.spinner { + width: 18px; + height: 18px; + border: 2px solid #aaa; + border-top-color: #333; + border-radius: 50%; + animation: spin 0.7s linear infinite; + display: inline-block; +} + +.status { + font-size: 12px; + opacity: 0.7; +} + +section > .row > label { + display: block; + font-size: 12px; + opacity: 0.75; + margin-bottom: 6px; + font-weight: bold; +} + +section > .row > label .small { + font-weight: normal; + display: block; + font-size: 80%; +} + +.side .row { + margin-bottom: 20px; +} + +.provider-tabs { + display: flex; + flex-wrap: wrap; + gap: 6px; + background: #00000010; + padding: 6px 0 0 6px; +} + +.provider-tab { + position: relative; + display: inline-flex; +} + +.provider-tab input { + position: absolute; + opacity: 0; + pointer-events: none; +} + +.provider-tab span { + display: inline-flex; + align-items: center; + justify-content: center; + min-height: 38px; + padding: 8px; + border: 1px solid #d0d0d0; + border-radius: 2px 2px 0 0; + background: #e8e8e8; + color: #555; + cursor: pointer; + user-select: none; + transition: background 0.15s, border-color 0.15s, color 0.15s; + font-size: 75%; +} + +.provider-tab input:checked + span { + background: #f9f9f9; + border-color: #999; + color: #111; + border-bottom: none; +} + +.provider-tab input:focus-visible + span { + outline: 2px solid #666; + outline-offset: 2px; +} + +.row button { + padding: 8px 10px; +} + + +hr { + border: dashed 1px #ddd; +} + +.btn-row { + display: flex; + gap: 10px; +} + +.btn-row > .btn, +.btn-row > button.btn { + flex: 1 1 0; + min-width: 0; +} + +.btn { + display: inline-flex; + align-items: center; + justify-content: center; + gap: 8px; + font-size: 14px; + + padding: 10px 12px; + border-radius: 10px; + border: 1px solid #d0d0d0; + background: #eee; + + cursor: pointer; + user-select: none; + text-decoration: none; +} + +.btn:hover { + background: #ddd; +} + +.btn:active { + transform: translateY(1px); +} + +.btn-wide { + width: 100%; +} + +.material-icons { + font-size: 18px; + line-height: 1; +} + +.btn.disabled, +.btn:disabled { + opacity: 0.55; + cursor: not-allowed; + pointer-events: none; +} + +#input { + border: none; + outline: none; +} + +#input:focus, +#input:focus-visible { + outline: none; + box-shadow: none; +} + +.code { + font-family: 'Courier New', Courier, monospace; + font-size: 90%; + background-color: #eee; + border: solid 1px #ddd; + padding: 2px; + display: inline-block; +} + +header .row:nth-child(2) { + padding: 15px 0 0 0; +} \ No newline at end of file diff --git a/src/ifcclash/pyproject.toml b/src/ifcclash/pyproject.toml index dc27c49efc4..3b510d4ea56 100644 --- a/src/ifcclash/pyproject.toml +++ b/src/ifcclash/pyproject.toml @@ -19,6 +19,11 @@ dependencies = [ "ifcopenshell", ] +[project.optional-dependencies] +advanced = [ + "scikit-learn", +] + [project.urls] Homepage = "http://ifcopenshell.org" Documentation = "https://docs.ifcopenshell.org" diff --git a/src/ifcconvert/CMakeLists.txt b/src/ifcconvert/CMakeLists.txt index a5e16180cb0..af46bc7dfe3 100644 --- a/src/ifcconvert/CMakeLists.txt +++ b/src/ifcconvert/CMakeLists.txt @@ -15,6 +15,7 @@ target_link_libraries( IfcGeom IfcParse Serializers + ${kernel_libraries} ${OpenCASCADE_LIBRARIES} ${Boost_LIBRARIES} ${HDF5_LIBRARIES} diff --git a/src/ifccsv/ifccsv.py b/src/ifccsv/ifccsv.py index 341fa186e7d..f6d3157f81f 100755 --- a/src/ifccsv/ifccsv.py +++ b/src/ifccsv/ifccsv.py @@ -29,14 +29,11 @@ from typing import Literal, Optional, Union import ifcopenshell -import ifcopenshell.util.element -import ifcopenshell.util.schema import ifcopenshell.util.selector try: from odf.namespaces import OFFICENS - from odf.opendocument import OpenDocumentSpreadsheet, load - from odf.style import Style, TableCellProperties + from odf.opendocument import load from odf.table import Table, TableCell, TableRow from odf.text import P except: diff --git a/src/ifccsv/pyproject.toml b/src/ifccsv/pyproject.toml index 4485d411e53..c012decd236 100644 --- a/src/ifccsv/pyproject.toml +++ b/src/ifccsv/pyproject.toml @@ -26,3 +26,9 @@ Issues = "https://github.com/IfcOpenShell/IfcOpenShell/issues" [tool.setuptools] py-modules = ["ifccsv"] + +[tool.ruff] +extend = "../../pyproject.toml" +lint.select = [ + "F401", # unused imports +] diff --git a/src/ifcedit/Makefile b/src/ifcedit/Makefile new file mode 100644 index 00000000000..114e5f9ddcd --- /dev/null +++ b/src/ifcedit/Makefile @@ -0,0 +1,10 @@ +PACKAGE_NAME:=ifcedit +include ../common.mk + +.PHONY: test +test: + pytest tests + +.PHONY: qa +qa: + black . diff --git a/src/ifcedit/README.md b/src/ifcedit/README.md new file mode 100644 index 00000000000..19b1ec8e7ad --- /dev/null +++ b/src/ifcedit/README.md @@ -0,0 +1,305 @@ + +# ifcedit + +A CLI wrapper that exposes all 350+ `ifcopenshell.api` mutation functions as +shell commands. Functions are auto-discovered at runtime via introspection -- +no hardcoded list to maintain. + +## Installation + +```bash +pip install ifcedit +``` + +Requires `ifcopenshell`. + +## Usage + +``` +ifcedit [options] [--format json|text] +``` + +Three subcommands: `list` to discover functions, `docs` to read their +documentation, and `run` to execute them. + +## Subcommands + +### list + +Discover available API modules and their functions. + +**List all modules:** + +```bash +ifcedit list +``` + +```json +[ + { + "module": "root", + "description": "Functions for creating project-level entities", + "functions": ["create_entity", "remove_product", "copy_class"], + "count": 3 + }, + { + "module": "spatial", + "description": "Functions for managing spatial relationships", + "functions": ["assign_container", "unassign_container"], + "count": 2 + } +] +``` + +**List functions in a module:** + +```bash +ifcedit list root +``` + +```json +[ + { + "name": "create_entity", + "description": "Create an IFC entity with optional initial attributes", + "params": [ + {"name": "ifc_class", "type": "str", "required": true}, + {"name": "name", "type": "Optional[str]"} + ] + } +] +``` + +### docs + +Show full documentation for a specific function, including parameter +descriptions from docstrings and return type. + +```bash +ifcedit docs root.create_entity +``` + +```json +{ + "module": "root", + "function": "create_entity", + "description": "Create an IFC entity with optional initial attributes", + "long_description": "This function creates a new entity instance...", + "params": [ + { + "name": "ifc_class", + "type": "str", + "required": true, + "description": "The IFC class name (e.g. 'IfcWall', 'IfcProject')" + }, + { + "name": "name", + "type": "Optional[str]", + "description": "Optional name attribute" + } + ], + "return_type": "ifcopenshell.entity_instance", + "return_description": "The newly created entity instance" +} +``` + +### run + +Execute an API function against an IFC file. Parameters are passed as +`--key value` pairs after the function name. + +```bash +ifcedit run model.ifc root.create_entity --ifc_class IfcWall --name "My Wall" +``` + +```json +{ + "ok": true, + "result": {"id": 42, "type": "IfcWall", "name": "My Wall"} +} +``` + +**Options:** + +- `-o, --output ` -- write to a different file instead of overwriting the input +- `--dry-run` -- validate parameters without executing or saving + +```bash +# Save to a new file +ifcedit run model.ifc root.create_entity -o out.ifc --ifc_class IfcWall + +# Validate without executing +ifcedit run model.ifc root.create_entity --dry-run --ifc_class IfcWall +``` + +Dry-run output shows the resolved parameters: + +```json +{ + "ok": true, + "dry_run": true, + "module": "root", + "function": "create_entity", + "args": {"ifc_class": "IfcWall", "name": "My Wall"} +} +``` + +## Parameter type coercion + +CLI strings are automatically converted to the types expected by each API +function, using the function's type annotations: + +| Type | CLI input | Python value | +|------|-----------|--------------| +| `str` | `"hello"` | `"hello"` | +| `int` | `"42"` or `"#42"` | `42` | +| `float` | `"3.14"` | `3.14` | +| `bool` | `"true"`, `"1"`, `"yes"` | `True` | +| `Optional[X]` | `"none"` | `None` | +| `entity_instance` | `"42"` or `"#42"` | resolved from model by step ID | +| `list[entity_instance]` | `"5,6,7"` or `"[5, 6, 7]"` | list of resolved entities | +| `dict` | `'{"key": "val"}'` | parsed JSON object | +| `Literal["A", "B"]` | `"A"` | validated against allowed values | + +## Examples + +```bash +# Create a project +ifcedit run model.ifc root.create_entity --ifc_class IfcProject --name "My Project" + +# Assign an element to a storey +ifcedit run model.ifc spatial.assign_container --products 10 --relating_structure 4 + +# Assign multiple elements at once +ifcedit run model.ifc aggregate.assign_object --products "5,6,7" --relating_object 1 + +# Add a property set +ifcedit run model.ifc pset.add_pset --product 10 --name "Pset_WallCommon" + +# Edit properties +ifcedit run model.ifc pset.edit_pset --pset 15 \ + --properties '{"IsExternal": true, "FireRating": "2HR"}' +``` + +### foreach + +Apply an API function to each element in a JSON array read from stdin. +`{field}` placeholders in argument values are substituted with fields from +each JSON object. The model is opened once and saved once regardless of how +many elements are processed. + +```bash +ifcquery model.ifc select 'IfcWindow' | ifcedit foreach model.ifc root.remove_product --product {id} +``` + +```json +{"ok": true, "count": 36, "errors": []} +``` + +Placeholder tokens match the fields emitted by `ifcquery` — typically `{id}`, +`{type}`, and `{name}`: + +```bash +ifcquery model.ifc select 'IfcDoor' | ifcedit foreach model.ifc attribute.edit_attributes \ + --product {id} --attributes '{"Name": "Door"}' +``` + +**Options:** + +- `-o, --output ` -- write to a different file instead of overwriting the input + +**Output:** + +- `count` -- number of elements successfully processed +- `errors` -- list of per-element failures, each with `index`, `item`, and `error`; processing continues past errors + +```json +{ + "ok": false, + "count": 34, + "errors": [ + {"index": 2, "item": {"id": 55, "type": "IfcWindow", "name": "W03"}, "error": "Entity #55 not found in model"} + ] +} +``` + +Exit code is 1 if any element failed. + +### quantify + +Run quantity take-off (QTO) on an IFC file, computing physical measurements +(volume, area, length, count, weight) and writing them back as +`IfcElementQuantity` property sets. Uses `ifc5d` rules. + +**List available rules:** + +```bash +ifcedit quantify list +``` + +```json +[ + {"name": "IFC4QtoBaseQuantities"}, + {"name": "IFC4X3QtoBaseQuantities"} +] +``` + +**Run QTO on a file:** + +```bash +ifcedit quantify run model.ifc IFC4QtoBaseQuantities +ifcedit quantify run model.ifc IFC4QtoBaseQuantities --selector IfcWall +ifcedit quantify run model.ifc IFC4QtoBaseQuantities -o model_qto.ifc +``` + +```json +{"ok": true, "rule": "IFC4QtoBaseQuantities", "elements_quantified": 42} +``` + +Options: + +- `--selector ` -- ifcopenshell selector to restrict elements (default: all `IfcElement`) +- `-o, --output ` -- write to a different file instead of overwriting the input + +Note: `quantify run` writes geometry-based measurements and requires the +IfcOpenShell C++ geometry bindings for elements with computed quantities. + +## Error handling + +Errors are reported in the JSON response: + +```json +{ + "ok": false, + "error": "Entity #999 not found in model" +} +``` + +Exit code is 0 on success, 1 on error. + +## Relationship to ifcquery + +`ifcedit` and `ifcquery` are complementary tools: + +- **ifcquery** reads and inspects IFC models (summary, tree, info, select, relations, clash, validate, schedule, cost, schema, contexts, materials, plot, render) +- **ifcedit** modifies IFC models by wrapping `ifcopenshell.api` functions, and runs QTO via `quantify` + +A typical workflow: inspect with `ifcquery`, look up the right API function +with `ifcedit docs`, then apply changes with `ifcedit run`. + +The two tools also compose directly in shell scripts. Use `ifcquery --format ids` +to feed a list of IDs into a `run` parameter, or pipe `ifcquery select` JSON +into `ifcedit foreach` to apply an operation to every matching element: + +```bash +# Aggregate — pass all IDs as a list parameter +ifcedit run model.ifc spatial.unassign_container \ + --products "$(ifcquery model.ifc --format ids select 'IfcWall')" + +# Fan-out — one operation per element, model opened and saved once +ifcquery model.ifc select 'IfcWindow' | ifcedit foreach model.ifc root.remove_product --product {id} +``` + +## License + +LGPLv3+ -- see the IfcOpenShell project license. diff --git a/src/ifcedit/ifcedit/__init__.py b/src/ifcedit/ifcedit/__init__.py new file mode 100644 index 00000000000..eac2eac7999 --- /dev/null +++ b/src/ifcedit/ifcedit/__init__.py @@ -0,0 +1,20 @@ +# This file was generated with the assistance of an AI coding tool. +# IfcEdit - CLI wrapper for ifcopenshell.api mutation functions +# Copyright (C) 2026 Bruno Postle +# +# This file is part of IfcEdit. +# +# IfcEdit is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# IfcEdit is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with IfcEdit. If not, see . + +__version__ = version = "0.0.0" diff --git a/src/ifcedit/ifcedit/__main__.py b/src/ifcedit/ifcedit/__main__.py new file mode 100644 index 00000000000..28292f378ed --- /dev/null +++ b/src/ifcedit/ifcedit/__main__.py @@ -0,0 +1,265 @@ +# This file was generated with the assistance of an AI coding tool. +# IfcEdit - CLI wrapper for ifcopenshell.api mutation functions +# Copyright (C) 2026 Bruno Postle +# +# This file is part of IfcEdit. +# +# IfcEdit is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# IfcEdit is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with IfcEdit. If not, see . + +from __future__ import annotations + +import argparse +import json +import sys + +import ifcopenshell + +from ifcedit.discover import function_docs, list_functions, list_modules +from ifcedit.foreach import run_foreach +from ifcedit.quantify import list_rules, run_quantify +from ifcedit.run import run_api + + +def format_output(data, fmt: str) -> str: + if fmt == "json": + return json.dumps(data, indent=2, ensure_ascii=False) + elif fmt == "text": + return _format_text(data) + return json.dumps(data, indent=2, ensure_ascii=False) + + +def _format_text(data, indent: int = 0) -> str: + prefix = " " * indent + lines = [] + if isinstance(data, dict): + for key, value in data.items(): + if isinstance(value, (dict, list)): + lines.append(f"{prefix}{key}:") + lines.append(_format_text(value, indent + 1)) + else: + lines.append(f"{prefix}{key}: {value}") + elif isinstance(data, list): + for item in data: + if isinstance(item, dict): + lines.append(_format_text(item, indent)) + lines.append("") + else: + lines.append(f"{prefix}- {item}") + else: + lines.append(f"{prefix}{data}") + return "\n".join(lines) + + +def cmd_list(args): + if args.module: + try: + functions = list_functions(args.module) + except Exception as e: + print(f"Error: {e}", file=sys.stderr) + sys.exit(1) + print(format_output(functions, args.output_format)) + else: + modules = list_modules() + print(format_output(modules, args.output_format)) + + +def cmd_docs(args): + parts = args.function_path.split(".") + if len(parts) != 2: + print("Error: function path must be 'module.function' (e.g. root.create_entity)", file=sys.stderr) + sys.exit(1) + module, function = parts + try: + docs = function_docs(module, function) + except Exception as e: + print(f"Error: {e}", file=sys.stderr) + sys.exit(1) + print(format_output(docs, args.output_format)) + + +def cmd_run(args, extra_args): + try: + model = ifcopenshell.open(args.ifc_file) + except Exception as e: + print(f"Error: Could not open IFC file: {e}", file=sys.stderr) + sys.exit(1) + + parts = args.function_path.split(".") + if len(parts) != 2: + print("Error: function path must be 'module.function' (e.g. root.create_entity)", file=sys.stderr) + sys.exit(1) + module, function = parts + + # Parse extra --key value arguments into a dict + raw_kwargs = _parse_extra_args(extra_args) + + if args.dry_run: + result = {"ok": True, "dry_run": True, "module": module, "function": function, "args": raw_kwargs} + else: + result = run_api(model, module, function, raw_kwargs) + + if result["ok"]: + output_path = args.output or args.ifc_file + model.write(output_path) + + print(format_output(result, args.output_format)) + if not result["ok"]: + sys.exit(1) + + +def _parse_extra_args(extra: list[str]) -> dict[str, str]: + """Parse a list of ['--key', 'value', ...] into a dict.""" + kwargs = {} + i = 0 + while i < len(extra): + arg = extra[i] + if arg.startswith("--"): + key = arg[2:] + if i + 1 < len(extra) and not extra[i + 1].startswith("--"): + kwargs[key] = extra[i + 1] + i += 2 + else: + # Flag without value — treat as "true" + kwargs[key] = "true" + i += 1 + else: + print(f"Error: Unexpected argument: {arg}", file=sys.stderr) + sys.exit(1) + return kwargs + + +def cmd_foreach(args, extra_args): + try: + model = ifcopenshell.open(args.ifc_file) + except Exception as e: + print(f"Error: Could not open IFC file: {e}", file=sys.stderr) + sys.exit(1) + + parts = args.function_path.split(".") + if len(parts) != 2: + print("Error: function path must be 'module.function' (e.g. root.create_entity)", file=sys.stderr) + sys.exit(1) + module, function = parts + + raw_kwargs_template = _parse_extra_args(extra_args) + + try: + stdin_data = json.load(sys.stdin) + except json.JSONDecodeError as e: + print(f"Error: Could not parse JSON from stdin: {e}", file=sys.stderr) + sys.exit(1) + + if not isinstance(stdin_data, list): + print("Error: stdin must be a JSON array", file=sys.stderr) + sys.exit(1) + + result = run_foreach(model, module, function, raw_kwargs_template, stdin_data) + + if result["ok"]: + output_path = args.output or args.ifc_file + model.write(output_path) + + print(format_output(result, args.output_format)) + if not result["ok"]: + sys.exit(1) + + +def cmd_quantify(args, extra_args): + if args.quantify_command == "list": + result = list_rules() + print(format_output(result, args.output_format)) + elif args.quantify_command == "run": + try: + model = ifcopenshell.open(args.ifc_file) + except Exception as e: + print(f"Error: Could not open IFC file: {e}", file=sys.stderr) + sys.exit(1) + selector = args.selector or None + result = run_quantify(model, args.rule_name, selector=selector) + if result["ok"]: + output_path = args.output or args.ifc_file + model.write(output_path) + print(format_output(result, args.output_format)) + if not result["ok"]: + sys.exit(1) + else: + print("Error: quantify requires a subcommand: list or run", file=sys.stderr) + sys.exit(1) + + +def main(): + parser = argparse.ArgumentParser( + prog="ifcedit", + description="CLI wrapper for ifcopenshell.api IFC model mutation functions", + ) + parser.add_argument( + "--format", + choices=["json", "text"], + default="json", + dest="output_format", + help="Output format (default: json)", + ) + + subparsers = parser.add_subparsers(dest="command", required=True) + + # list + list_parser = subparsers.add_parser("list", help="List API modules or functions in a module") + list_parser.add_argument("module", nargs="?", help="Module name (omit to list all modules)") + + # docs + docs_parser = subparsers.add_parser("docs", help="Show full documentation for an API function") + docs_parser.add_argument("function_path", help="module.function (e.g. root.create_entity)") + + # run + run_parser = subparsers.add_parser("run", help="Execute an API function on an IFC file") + run_parser.add_argument("ifc_file", help="Path to the IFC file") + run_parser.add_argument("function_path", help="module.function (e.g. root.create_entity)") + run_parser.add_argument("-o", "--output", help="Output file path (default: overwrite input)") + run_parser.add_argument("--dry-run", action="store_true", help="Validate without executing or saving") + + # foreach + foreach_parser = subparsers.add_parser( + "foreach", + help="Apply an API function to each element in a JSON array read from stdin", + ) + foreach_parser.add_argument("ifc_file", help="Path to the IFC file") + foreach_parser.add_argument("function_path", help="module.function (e.g. attribute.edit_attributes)") + foreach_parser.add_argument("-o", "--output", help="Output file path (default: overwrite input)") + + # quantify + quantify_parser = subparsers.add_parser("quantify", help="Quantity take-off (QTO) using ifc5d rules") + quantify_sub = quantify_parser.add_subparsers(dest="quantify_command") + quantify_sub.add_parser("list", help="List available QTO rule names") + qrun_parser = quantify_sub.add_parser("run", help="Run QTO on an IFC file") + qrun_parser.add_argument("ifc_file", help="Path to the IFC file") + qrun_parser.add_argument("rule_name", help="QTO rule name (e.g. IFC4QtoBaseQuantities)") + qrun_parser.add_argument("--selector", help="ifcopenshell selector to restrict elements (default: all IfcElement)") + qrun_parser.add_argument("-o", "--output", help="Output file path (default: overwrite input)") + + args, extra = parser.parse_known_args() + + if args.command == "list": + cmd_list(args) + elif args.command == "docs": + cmd_docs(args) + elif args.command == "run": + cmd_run(args, extra) + elif args.command == "foreach": + cmd_foreach(args, extra) + elif args.command == "quantify": + cmd_quantify(args, extra) + + +if __name__ == "__main__": + main() diff --git a/src/ifcedit/ifcedit/coerce.py b/src/ifcedit/ifcedit/coerce.py new file mode 100644 index 00000000000..5a410ec1867 --- /dev/null +++ b/src/ifcedit/ifcedit/coerce.py @@ -0,0 +1,180 @@ +# This file was generated with the assistance of an AI coding tool. +# IfcEdit - CLI wrapper for ifcopenshell.api mutation functions +# Copyright (C) 2026 Bruno Postle +# +# This file is part of IfcEdit. +# +# IfcEdit is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# IfcEdit is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with IfcEdit. If not, see . + +from __future__ import annotations + +import json +import typing + +import ifcopenshell + + +def coerce_value( + value_str: str, + type_hint, + model: ifcopenshell.file | None = None, + lookup_file: ifcopenshell.file | None = None, +): + """Convert a CLI string argument to the proper Python type based on a type hint. + + Args: + value_str: The raw string from the CLI. + type_hint: The type annotation from the function signature. + model: The main open IFC model, needed to resolve entity instance references by ID. + lookup_file: Override file for entity resolution (e.g. a library file for + project.append_asset). When provided, entity IDs are looked up here instead + of in model. + + Returns: + The converted Python value. + + Raises: + ValueError: If the value cannot be converted. + TypeError: If the type hint is not supported. + """ + # When a library file has been opened, entity IDs are resolved from it, not the main model. + effective_lookup = lookup_file if lookup_file is not None else model + + if type_hint is None: + return value_str + + origin = typing.get_origin(type_hint) + args = typing.get_args(type_hint) + + # Union / Optional + if origin is typing.Union: + non_none_types = [a for a in args if a is not type(None)] + if value_str.lower() == "none": + if type(None) in args: + return None + # Try each non-None type in order + for t in non_none_types: + try: + return coerce_value(value_str, t, model, lookup_file) + except (ValueError, TypeError): + continue + raise ValueError(f"Cannot convert '{value_str}' to any of {non_none_types}") + + # Literal + if origin is typing.Literal: + allowed = args + if value_str in [str(a) for a in allowed]: + # return the actual literal value with proper type + for a in allowed: + if str(a) == value_str: + return a + raise ValueError(f"'{value_str}' is not one of: {', '.join(repr(a) for a in allowed)}") + + # list types + if origin is list: + if args and _is_entity_type(args[0]): + return _coerce_entity_list(value_str, effective_lookup) + if args: + items = _split_list(value_str) + return [coerce_value(item.strip(), args[0], model, lookup_file) for item in items] + return _split_list(value_str) + + # dict types + if origin is dict: + return _floatify_numeric_lists(json.loads(value_str)) + + # Simple types + if type_hint is str: + return value_str + if type_hint is int: + return int(value_str.lstrip("#")) + if type_hint is float: + return float(value_str) + if type_hint is bool: + return value_str.lower() in ("true", "1", "yes") + + # ifcopenshell.file — open from path string + if type_hint is ifcopenshell.file: + return ifcopenshell.open(value_str) + + # entity_instance + if _is_entity_type(type_hint): + return _coerce_entity(value_str, effective_lookup) + + # Fallback: try json.loads for complex types, then plain string + try: + return json.loads(value_str) + except (json.JSONDecodeError, TypeError): + return value_str + + +def _is_entity_type(hint) -> bool: + """Check if a type hint refers to ifcopenshell.entity_instance.""" + if hint is ifcopenshell.entity_instance: + return True + if isinstance(hint, type) and issubclass(hint, ifcopenshell.entity_instance): + return True + return False + + +def _coerce_entity(value_str: str | int, lookup_file: ifcopenshell.file | None) -> ifcopenshell.entity_instance: + """Resolve a step ID string like '123' or '#123' to an entity instance.""" + if lookup_file is None: + raise ValueError("Cannot resolve entity reference without an IFC model") + if isinstance(value_str, int): + entity_id = value_str + else: + entity_id = int(value_str.strip().lstrip("#")) + try: + return lookup_file.by_id(entity_id) + except RuntimeError: + raise ValueError(f"Entity #{entity_id} not found in model") + + +def _coerce_entity_list(value_str: str, lookup_file: ifcopenshell.file | None) -> list[ifcopenshell.entity_instance]: + """Resolve a comma-separated list of step IDs to entity instances.""" + items = _split_list(value_str) + return [_coerce_entity(item.strip(), lookup_file) for item in items] + + +def _floatify_numeric_lists(obj): + """Recursively convert lists of numbers to lists of floats. + + IFC C++ bindings require Python floats (not ints) for AGGREGATE OF DOUBLE + attributes (e.g. DirectionRatios, Coordinates). JSON parsing produces ints + for whole numbers like 0, which causes a TypeError at the binding level. + """ + if isinstance(obj, dict): + return {k: _floatify_numeric_lists(v) for k, v in obj.items()} + if ( + isinstance(obj, list) + and obj + and all(isinstance(v, (int, float)) for v in obj) + and any(isinstance(v, float) for v in obj) + ): + return [float(v) for v in obj] + return obj + + +def _split_list(value_str: str) -> list[str]: + """Split a comma-separated string, handling JSON arrays too.""" + value_str = value_str.strip() + if value_str.startswith("["): + try: + parsed = json.loads(value_str) + if isinstance(parsed, list): + return [json.dumps(item) if isinstance(item, (dict, list)) else str(item) for item in parsed] + except json.JSONDecodeError: + pass + return [item.strip() for item in value_str.split(",") if item.strip()] diff --git a/src/ifcedit/ifcedit/discover.py b/src/ifcedit/ifcedit/discover.py new file mode 100644 index 00000000000..b26a93f6c6b --- /dev/null +++ b/src/ifcedit/ifcedit/discover.py @@ -0,0 +1,282 @@ +# This file was generated with the assistance of an AI coding tool. +# IfcEdit - CLI wrapper for ifcopenshell.api mutation functions +# Copyright (C) 2026 Bruno Postle +# +# This file is part of IfcEdit. +# +# IfcEdit is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# IfcEdit is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with IfcEdit. If not, see . + +from __future__ import annotations + +import importlib +import inspect +import re +import typing +from pathlib import Path + + +def _api_package_path() -> Path: + """Return the filesystem path to the ifcopenshell.api package.""" + import ifcopenshell.api + + return Path(ifcopenshell.api.__file__).parent + + +def list_modules() -> list[dict]: + """List all API modules with their function counts and descriptions. + + Returns a list of dicts: [{"module": "root", "description": "...", "functions": [...], "count": 4}, ...] + """ + api_path = _api_package_path() + modules = [] + for child in sorted(api_path.iterdir()): + if not child.is_dir() or child.name.startswith("_"): + continue + init_file = child / "__init__.py" + if not init_file.exists(): + continue + try: + mod = importlib.import_module(f"ifcopenshell.api.{child.name}") + except Exception: + continue + all_names = getattr(mod, "__all__", []) + if not all_names: + continue + description = "" + if mod.__doc__: + description = mod.__doc__.strip().split("\n")[0] + modules.append( + { + "module": child.name, + "description": description, + "functions": list(all_names), + "count": len(all_names), + } + ) + return modules + + +def list_functions(module: str) -> list[dict]: + """List functions in an API module with one-line descriptions and parameter info. + + Returns a list of dicts: [{"name": "create_entity", "description": "...", "params": [...]}] + """ + mod = importlib.import_module(f"ifcopenshell.api.{module}") + all_names = getattr(mod, "__all__", []) + functions = [] + for name in all_names: + fn = _get_underlying_function(module, name) + if fn is None: + continue + description = "" + if fn.__doc__: + description = fn.__doc__.strip().split("\n")[0] + params = _extract_params(fn) + functions.append( + { + "name": name, + "description": description, + "params": params, + } + ) + return functions + + +def function_docs(module: str, function: str) -> dict: + """Full documentation for a single API function. + + Returns a dict with: module, function, description, params (with types/defaults/descriptions), return_type + """ + fn = _get_underlying_function(module, function) + if fn is None: + raise ValueError(f"Function '{module}.{function}' not found") + + description = "" + long_description = "" + if fn.__doc__: + description, long_description = _parse_docstring_body(fn.__doc__) + + params = _extract_params(fn) + param_descriptions = _parse_param_docs(fn.__doc__ or "") + for param in params: + if param["name"] in param_descriptions: + param["description"] = param_descriptions[param["name"]] + + return_type = _format_type_hint(typing.get_type_hints(fn).get("return")) + return_description = _parse_return_doc(fn.__doc__ or "") + + result = { + "module": module, + "function": function, + "description": description, + "long_description": long_description, + "params": params, + } + if return_type: + result["return_type"] = return_type + if return_description: + result["return_description"] = return_description + return result + + +def _get_underlying_function(module: str, function: str): + """Get the actual function object (unwrapping the listener wrapper if needed).""" + try: + fn_module = importlib.import_module(f"ifcopenshell.api.{module}.{function}") + fn = getattr(fn_module, function, None) + return fn + except (ImportError, AttributeError): + return None + + +def _extract_params(fn) -> list[dict]: + """Extract parameter info from a function's signature and type hints.""" + sig = inspect.signature(fn) + try: + hints = typing.get_type_hints(fn) + except Exception: + hints = {} + + params = [] + for name, param in sig.parameters.items(): + if name == "file" or name == "self": + continue + info = {"name": name} + if name in hints: + info["type"] = _format_type_hint(hints[name]) + if param.default is not inspect.Parameter.empty: + info["default"] = _serialize_default(param.default) + else: + info["required"] = True + params.append(info) + return params + + +def _format_type_hint(hint) -> str | None: + """Format a type hint to a readable string.""" + import ifcopenshell + + if hint is None: + return None + if hint is type(None): + return "None" + # ifcopenshell.file params are passed as a file path string + if hint is ifcopenshell.file: + return "file_path" + origin = typing.get_origin(hint) + args = typing.get_args(hint) + + # Union (including Optional) + if origin is typing.Union: + formatted = [_format_type_hint(a) for a in args] + # Optional[X] is Union[X, None] — render as "Optional[X]" + if len(formatted) == 2 and "None" in formatted: + inner = next(f for f in formatted if f != "None") + return f"Optional[{inner}]" + return " | ".join(formatted) + + # Literal + if origin is typing.Literal: + values = ", ".join(repr(a) for a in args) + return f"Literal[{values}]" + + # Generic types (list, dict, etc.) + if origin is not None: + origin_name = getattr(origin, "__name__", str(origin)) + if args: + inner = ", ".join(_format_type_hint(a) for a in args) + return f"{origin_name}[{inner}]" + return origin_name + + # Simple types + return getattr(hint, "__name__", str(hint)) + + +def _serialize_default(value): + """Serialize a default value to something JSON-friendly.""" + if value is None: + return None + if isinstance(value, (str, int, float, bool)): + return value + return repr(value) + + +def _parse_docstring_body(docstring: str) -> tuple[str, str]: + """Parse the summary and long description from a docstring.""" + lines = docstring.strip().split("\n") + summary = lines[0].strip() if lines else "" + body_lines = [] + in_body = False + for line in lines[1:]: + stripped = line.strip() + if stripped.startswith(":param") or stripped.startswith(":return"): + break + if stripped.startswith("Example"): + break + if not in_body and not stripped: + in_body = True + continue + if in_body: + body_lines.append(stripped) + + long_description = " ".join(body_lines).strip() + # collapse multiple spaces + long_description = re.sub(r"\s+", " ", long_description) + return summary, long_description + + +_FIELD_MARKER = re.compile(r":(?:param|returns?|rtype|type|raises?)\b") + + +def _parse_param_docs(docstring: str) -> dict[str, str]: + """Extract :param name: description lines from a docstring.""" + params = {} + current_param = None + current_lines = [] + for line in docstring.split("\n"): + stripped = line.strip() + match = re.match(r":param\s+(\w+):\s*(.*)", stripped) + if match: + if current_param: + params[current_param] = " ".join(current_lines).strip() + current_param = match.group(1) + current_lines = [match.group(2)] + elif current_param and stripped and not _FIELD_MARKER.match(stripped): + current_lines.append(stripped) + elif _FIELD_MARKER.match(stripped) or (stripped == "" and current_param): + if current_param: + params[current_param] = " ".join(current_lines).strip() + current_param = None + current_lines = [] + if current_param: + params[current_param] = " ".join(current_lines).strip() + # collapse whitespace + return {k: re.sub(r"\s+", " ", v) for k, v in params.items()} + + +def _parse_return_doc(docstring: str) -> str: + """Extract :return: description from a docstring.""" + lines = [] + in_return = False + for line in docstring.split("\n"): + stripped = line.strip() + match = re.match(r":return:\s*(.*)", stripped) + if match: + in_return = True + lines = [match.group(1)] + elif in_return: + if _FIELD_MARKER.match(stripped) or stripped == "": + break + lines.append(stripped) + return re.sub(r"\s+", " ", " ".join(lines).strip()) diff --git a/src/ifcedit/ifcedit/foreach.py b/src/ifcedit/ifcedit/foreach.py new file mode 100644 index 00000000000..587d611c3fa --- /dev/null +++ b/src/ifcedit/ifcedit/foreach.py @@ -0,0 +1,76 @@ +# IfcEdit - CLI wrapper for ifcopenshell.api mutation functions +# Copyright (C) 2026 Bruno Postle +# +# This file is part of IfcEdit. +# +# IfcEdit is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# IfcEdit is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with IfcEdit. If not, see . + +from __future__ import annotations + +import ifcopenshell + +from ifcedit.run import run_api + + +def _substitute(template: str, item: dict) -> str: + """Replace {key} placeholders in template with values from item.""" + for key, value in item.items(): + template = template.replace(f"{{{key}}}", str(value)) + return template + + +def run_foreach( + model: ifcopenshell.file, + module: str, + function: str, + raw_kwargs_template: dict[str, str], + items: list[dict], +) -> dict: + """Apply an API function to each item in a list, substituting {field} placeholders. + + Opens the model once, applies the mutation for every item, and returns a summary. + The caller is responsible for saving the model. + + Args: + model: The open IFC model (mutated in place). + module: API module name (e.g. "root"). + function: Function name (e.g. "remove_product"). + raw_kwargs_template: Arg templates with {field} placeholders, e.g. {"product": "{id}"}. + items: List of dicts (e.g. from ifcquery select output). + + Returns: + {"ok": True, "count": N, "errors": []} on full success, + {"ok": False, "count": N, "errors": [{...}]} if any item failed. + """ + errors = [] + count = 0 + + for i, item in enumerate(items): + if not isinstance(item, dict): + errors.append({"index": i, "item": item, "error": "item is not a dict"}) + continue + + substituted = {k: _substitute(v, item) for k, v in raw_kwargs_template.items()} + result = run_api(model, module, function, substituted) + + if result["ok"]: + count += 1 + else: + errors.append({"index": i, "item": item, "error": result["error"]}) + + return { + "ok": len(errors) == 0, + "count": count, + "errors": errors, + } diff --git a/src/ifcedit/ifcedit/quantify.py b/src/ifcedit/ifcedit/quantify.py new file mode 100644 index 00000000000..f85475e22c8 --- /dev/null +++ b/src/ifcedit/ifcedit/quantify.py @@ -0,0 +1,37 @@ +# This file was generated with the assistance of an AI coding tool. +from __future__ import annotations + +from typing import Any + +import ifcopenshell + +AVAILABLE_RULES = ["IFC4QtoBaseQuantities", "IFC4X3QtoBaseQuantities"] + + +def list_rules() -> list[dict[str, str]]: + """Return a list of available quantification rule names.""" + return [{"name": name} for name in AVAILABLE_RULES] + + +def run_quantify(model: ifcopenshell.file, rule: str, selector: str | None = None) -> dict[str, Any]: + """Run quantity take-off on the model using the named rule. + + Modifies the model in-place by adding/updating IfcElementQuantity psets. + Returns a summary dict with ok, rule, and elements_quantified. + """ + from ifc5d.qto import edit_qtos, quantify + from ifc5d.qto import rules as rule_sets + + if rule not in rule_sets: + return {"ok": False, "error": f"Unknown rule: {rule}. Available: {list(rule_sets.keys())}"} + + import ifcopenshell.util.selector + + if selector: + elements = set(ifcopenshell.util.selector.filter_elements(model, selector)) + else: + elements = set(model.by_type("IfcElement")) + + results = quantify(model, elements, rule_sets[rule]) + edit_qtos(model, results) + return {"ok": True, "rule": rule, "elements_quantified": len(results)} diff --git a/src/ifcedit/ifcedit/run.py b/src/ifcedit/ifcedit/run.py new file mode 100644 index 00000000000..91d8be6774a --- /dev/null +++ b/src/ifcedit/ifcedit/run.py @@ -0,0 +1,148 @@ +# This file was generated with the assistance of an AI coding tool. +# IfcEdit - CLI wrapper for ifcopenshell.api mutation functions +# Copyright (C) 2026 Bruno Postle +# +# This file is part of IfcEdit. +# +# IfcEdit is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# IfcEdit is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with IfcEdit. If not, see . + +from __future__ import annotations + +import importlib +import inspect +import typing + +import ifcopenshell + +from ifcedit.coerce import coerce_value + + +def _is_file_type(hint) -> bool: + """Check if a type hint refers to ifcopenshell.file (or Optional[ifcopenshell.file]).""" + if hint is ifcopenshell.file: + return True + origin = typing.get_origin(hint) + args = typing.get_args(hint) + if origin is typing.Union and ifcopenshell.file in args: + return True + return False + + +def run_api( + model: ifcopenshell.file, + module: str, + function: str, + raw_kwargs: dict[str, str], +) -> dict: + """Execute an ifcopenshell.api function with CLI-provided string arguments. + + Args: + model: The open IFC model. + module: API module name (e.g. "root"). + function: Function name (e.g. "create_entity"). + raw_kwargs: String keyword arguments from the CLI. + + Returns: + A dict with {"ok": True, "result": ...} on success, + or {"ok": False, "error": "..."} on failure. + """ + try: + fn = _import_function(module, function) + except (ImportError, AttributeError) as e: + return {"ok": False, "error": f"Cannot find function '{module}.{function}': {e}"} + + try: + hints = typing.get_type_hints(fn) + except Exception: + hints = {} + + sig = inspect.signature(fn) + coerced_kwargs = {} + + # Pass 1: coerce ifcopenshell.file-typed params first (e.g. library= in append_asset). + # The opened file is then used as the lookup file for entity resolution in pass 2. + opened_files: list[ifcopenshell.file] = [] + for name, value_str in raw_kwargs.items(): + if name not in sig.parameters: + return {"ok": False, "error": f"Unknown parameter '{name}' for {module}.{function}"} + hint = hints.get(name) + if not _is_file_type(hint): + continue + try: + coerced = coerce_value(value_str, hint, model) + coerced_kwargs[name] = coerced + if isinstance(coerced, ifcopenshell.file): + opened_files.append(coerced) + except (ValueError, TypeError) as e: + return {"ok": False, "error": f"Cannot convert parameter '{name}': {e}"} + + # Pass 2: coerce remaining params. Entity instance IDs are resolved from the opened + # library file (if any), since you are always appending from another file, never + # from the current model. + lookup_file = opened_files[0] if opened_files else None + for name, value_str in raw_kwargs.items(): + if name in coerced_kwargs: + continue + if name not in sig.parameters: + return {"ok": False, "error": f"Unknown parameter '{name}' for {module}.{function}"} + hint = hints.get(name) + try: + coerced_kwargs[name] = coerce_value(value_str, hint, model, lookup_file=lookup_file) + except (ValueError, TypeError) as e: + return {"ok": False, "error": f"Cannot convert parameter '{name}': {e}"} + + # Determine if the function takes 'file' as its first parameter + first_param = next(iter(sig.parameters), None) + try: + if first_param == "file": + result = fn(model, **coerced_kwargs) + else: + result = fn(**coerced_kwargs) + except Exception as e: + return {"ok": False, "error": f"{type(e).__name__}: {e}"} + + return {"ok": True, "result": serialize_result(result)} + + +def _import_function(module: str, function: str): + """Import and return the underlying function from ifcopenshell.api.""" + fn_module = importlib.import_module(f"ifcopenshell.api.{module}.{function}") + fn = getattr(fn_module, function) + return fn + + +def serialize_result(value) -> object: + """Serialize an API result to a JSON-friendly structure.""" + if value is None: + return None + if isinstance(value, ifcopenshell.entity_instance): + return _serialize_entity(value) + if isinstance(value, (list, tuple, set, frozenset)): + return [serialize_result(item) for item in value] + if isinstance(value, dict): + return {str(k): serialize_result(v) for k, v in value.items()} + if isinstance(value, (str, int, float, bool)): + return value + return str(value) + + +def _serialize_entity(entity: ifcopenshell.entity_instance) -> dict: + """Serialize an entity instance to a summary dict.""" + result = { + "id": entity.id(), + "type": entity.is_a(), + } + if hasattr(entity, "Name") and entity.Name: + result["name"] = entity.Name + return result diff --git a/src/ifcedit/pyproject.toml b/src/ifcedit/pyproject.toml new file mode 100644 index 00000000000..f50c0b3cc4c --- /dev/null +++ b/src/ifcedit/pyproject.toml @@ -0,0 +1,33 @@ +[build-system] +requires = ["setuptools>=61.0"] +build-backend = "setuptools.build_meta" + +[project] +name = "ifcedit" +version = "0.0.0" +authors = [ + { name="Bruno Postle", email="bruno@postle.net" }, +] +description = "CLI wrapper for ifcopenshell.api IFC model mutation functions" +readme = "README.md" +keywords = ["IFC", "BIM", "API"] +classifiers = [ + "Programming Language :: Python :: 3", + "License :: OSI Approved :: GNU Lesser General Public License v3 or later (LGPLv3+)", +] +dependencies = ["ifcopenshell", "ifc5d"] + +[project.scripts] +ifcedit = "ifcedit.__main__:main" + +[project.urls] +Homepage = "http://ifcopenshell.org" +Documentation = "https://docs.ifcopenshell.org" +Issues = "https://github.com/IfcOpenShell/IfcOpenShell/issues" + +[tool.setuptools.packages.find] +include = ["ifcedit*"] +exclude = ["test*"] + +[tool.ruff] +extend = "../../pyproject.toml" diff --git a/src/ifcedit/tests/__init__.py b/src/ifcedit/tests/__init__.py new file mode 100644 index 00000000000..0a3bc271a0d --- /dev/null +++ b/src/ifcedit/tests/__init__.py @@ -0,0 +1 @@ +# This file was generated with the assistance of an AI coding tool. diff --git a/src/ifcedit/tests/conftest.py b/src/ifcedit/tests/conftest.py new file mode 100644 index 00000000000..241220b145b --- /dev/null +++ b/src/ifcedit/tests/conftest.py @@ -0,0 +1,63 @@ +# This file was generated with the assistance of an AI coding tool. +import ifcopenshell +import ifcopenshell.api.aggregate +import ifcopenshell.api.material +import ifcopenshell.api.owner.settings +import ifcopenshell.api.project +import ifcopenshell.api.pset +import ifcopenshell.api.root +import ifcopenshell.api.spatial +import ifcopenshell.api.unit +import pytest + + +@pytest.fixture +def model(): + """Create an IFC4 model with a spatial hierarchy and a wall.""" + f = ifcopenshell.api.project.create_file() + ifcopenshell.api.owner.settings.get_user = lambda ifc: (ifc.by_type("IfcPersonAndOrganization") or [None])[0] + ifcopenshell.api.owner.settings.get_application = lambda ifc: (ifc.by_type("IfcApplication") or [None])[0] + + project = ifcopenshell.api.root.create_entity(f, ifc_class="IfcProject", name="TestProject") + ifcopenshell.api.unit.assign_unit(f) + + site = ifcopenshell.api.root.create_entity(f, ifc_class="IfcSite", name="TestSite") + building = ifcopenshell.api.root.create_entity(f, ifc_class="IfcBuilding", name="TestBuilding") + storey = ifcopenshell.api.root.create_entity(f, ifc_class="IfcBuildingStorey", name="Ground Floor") + + ifcopenshell.api.aggregate.assign_object(f, products=[site], relating_object=project) + ifcopenshell.api.aggregate.assign_object(f, products=[building], relating_object=site) + ifcopenshell.api.aggregate.assign_object(f, products=[storey], relating_object=building) + + wall = ifcopenshell.api.root.create_entity(f, ifc_class="IfcWall", name="Wall001") + ifcopenshell.api.spatial.assign_container(f, products=[wall], relating_structure=storey) + + return f + + +@pytest.fixture +def model_file(model, tmp_path): + """Write the model fixture to a temp file and return the path.""" + path = tmp_path / "test.ifc" + model.write(str(path)) + return str(path) + + +@pytest.fixture +def library(): + """Create an IFC4 library with a single IfcWallType asset.""" + lib = ifcopenshell.api.project.create_file() + ifcopenshell.api.owner.settings.get_user = lambda ifc: (ifc.by_type("IfcPersonAndOrganization") or [None])[0] + ifcopenshell.api.owner.settings.get_application = lambda ifc: (ifc.by_type("IfcApplication") or [None])[0] + ifcopenshell.api.root.create_entity(lib, ifc_class="IfcProject", name="TestLibrary") + ifcopenshell.api.unit.assign_unit(lib) + ifcopenshell.api.root.create_entity(lib, ifc_class="IfcWallType", name="WAL01") + return lib + + +@pytest.fixture +def library_file(library, tmp_path): + """Write the library fixture to a temp file and return the path.""" + path = tmp_path / "library.ifc" + library.write(str(path)) + return str(path) diff --git a/src/ifcedit/tests/test_coerce.py b/src/ifcedit/tests/test_coerce.py new file mode 100644 index 00000000000..4ee6895717a --- /dev/null +++ b/src/ifcedit/tests/test_coerce.py @@ -0,0 +1,158 @@ +# This file was generated with the assistance of an AI coding tool. +import json +from typing import Literal, Optional, Union + +import ifcopenshell +import ifcopenshell.api.project +import pytest + +from ifcedit.coerce import coerce_value + + +class TestStringCoercion: + def test_plain_string(self): + assert coerce_value("hello", str) == "hello" + + def test_empty_string(self): + assert coerce_value("", str) == "" + + +class TestIntCoercion: + def test_plain_int(self): + assert coerce_value("42", int) == 42 + + def test_hash_prefix(self): + assert coerce_value("#42", int) == 42 + + def test_negative(self): + assert coerce_value("-5", int) == -5 + + +class TestFloatCoercion: + def test_plain_float(self): + assert coerce_value("3.14", float) == pytest.approx(3.14) + + def test_integer_as_float(self): + assert coerce_value("5", float) == 5.0 + + +class TestBoolCoercion: + def test_true_values(self): + for val in ("true", "True", "TRUE", "1", "yes"): + assert coerce_value(val, bool) is True + + def test_false_values(self): + for val in ("false", "False", "0", "no"): + assert coerce_value(val, bool) is False + + +class TestOptionalCoercion: + def test_optional_string(self): + assert coerce_value("hello", Optional[str]) == "hello" + + def test_optional_none(self): + assert coerce_value("none", Optional[str]) is None + assert coerce_value("None", Optional[str]) is None + + def test_optional_int(self): + assert coerce_value("42", Optional[int]) == 42 + + +class TestUnionCoercion: + def test_union_str_int(self): + # Tries str first (or int first depending on order), both work + result = coerce_value("hello", Union[str, int]) + assert result == "hello" + + def test_union_int_none(self): + result = coerce_value("42", Union[int, None]) + assert result == 42 + + +class TestLiteralCoercion: + def test_valid_literal(self): + assert coerce_value("IFC4", Literal["IFC2X3", "IFC4", "IFC4X3"]) == "IFC4" + + def test_invalid_literal(self): + with pytest.raises(ValueError, match="not one of"): + coerce_value("IFC5", Literal["IFC2X3", "IFC4", "IFC4X3"]) + + +class TestDictCoercion: + def test_json_dict(self): + result = coerce_value('{"IsExternal": true, "FireRating": "2HR"}', dict[str, object]) + assert result == {"IsExternal": True, "FireRating": "2HR"} + + def test_mixed_float_int_list_coerced_to_float(self): + # [0.419, 0, 0.908] — JSON integer 0 mixed with floats must become float + # so ifcopenshell AGGREGATE OF DOUBLE attributes (e.g. DirectionRatios) don't reject the list + result = coerce_value('{"DirectionRatios": [0.419, 0, 0.908]}', dict[str, object]) + assert result["DirectionRatios"] == pytest.approx([0.419, 0.0, 0.908]) + assert all(isinstance(v, float) for v in result["DirectionRatios"]) + + def test_pure_int_list_not_coerced(self): + # All-integer lists (e.g. face indices) must stay as ints + result = coerce_value('{"CoordIndex": [0, 1, 2]}', dict[str, object]) + assert result["CoordIndex"] == [0, 1, 2] + assert all(isinstance(v, int) for v in result["CoordIndex"]) + + +class TestListCoercion: + def test_comma_separated(self): + result = coerce_value("a,b,c", list[str]) + assert result == ["a", "b", "c"] + + def test_json_array(self): + result = coerce_value("[1, 2, 3]", list[int]) + assert result == [1, 2, 3] + + +class TestEntityCoercion: + def test_entity_by_id(self, model): + wall = model.by_type("IfcWall")[0] + result = coerce_value(str(wall.id()), ifcopenshell.entity_instance, model) + assert result == wall + + def test_entity_with_hash(self, model): + wall = model.by_type("IfcWall")[0] + result = coerce_value(f"#{wall.id()}", ifcopenshell.entity_instance, model) + assert result == wall + + def test_entity_not_found(self, model): + with pytest.raises(ValueError, match="not found"): + coerce_value("999999", ifcopenshell.entity_instance, model) + + def test_entity_list(self, model): + wall = model.by_type("IfcWall")[0] + result = coerce_value(str(wall.id()), list[ifcopenshell.entity_instance], model) + assert len(result) == 1 + assert result[0] == wall + + def test_entity_list_multiple(self, model): + wall = model.by_type("IfcWall")[0] + storey = model.by_type("IfcBuildingStorey")[0] + result = coerce_value(f"{wall.id()},{storey.id()}", list[ifcopenshell.entity_instance], model) + assert len(result) == 2 + + def test_entity_no_model(self): + with pytest.raises(ValueError, match="without an IFC model"): + coerce_value("42", ifcopenshell.entity_instance, None) + + +class TestFileCoercion: + def test_opens_file_from_path(self, model_file): + result = coerce_value(model_file, ifcopenshell.file) + assert isinstance(result, ifcopenshell.file) + + def test_entity_from_lookup_file(self, model_file): + lib = ifcopenshell.open(model_file) + wall = lib.by_type("IfcWall")[0] + empty_model = ifcopenshell.api.project.create_file() + result = coerce_value(str(wall.id()), ifcopenshell.entity_instance, empty_model, lookup_file=lib) + assert result.id() == wall.id() + assert result.is_a("IfcWall") + + +class TestFallback: + def test_no_type_hint(self): + assert coerce_value("hello", None) == "hello" diff --git a/src/ifcedit/tests/test_discover.py b/src/ifcedit/tests/test_discover.py new file mode 100644 index 00000000000..7b77cb5b7e5 --- /dev/null +++ b/src/ifcedit/tests/test_discover.py @@ -0,0 +1,104 @@ +# This file was generated with the assistance of an AI coding tool. +from ifcedit.discover import function_docs, list_functions, list_modules + + +class TestListModules: + def test_returns_list(self): + result = list_modules() + assert isinstance(result, list) + assert len(result) > 0 + + def test_module_structure(self): + result = list_modules() + for entry in result: + assert "module" in entry + assert "description" in entry + assert "functions" in entry + assert "count" in entry + assert isinstance(entry["functions"], list) + assert entry["count"] == len(entry["functions"]) + + def test_known_modules_present(self): + result = list_modules() + module_names = [m["module"] for m in result] + for expected in ("root", "spatial", "pset", "aggregate", "unit"): + assert expected in module_names + + def test_root_module_has_functions(self): + result = list_modules() + root = next(m for m in result if m["module"] == "root") + assert "create_entity" in root["functions"] + assert root["count"] >= 3 + + +class TestListFunctions: + def test_root_functions(self): + result = list_functions("root") + assert isinstance(result, list) + names = [f["name"] for f in result] + assert "create_entity" in names + + def test_function_structure(self): + result = list_functions("root") + for fn in result: + assert "name" in fn + assert "description" in fn + assert "params" in fn + + def test_create_entity_params(self): + result = list_functions("root") + create = next(f for f in result if f["name"] == "create_entity") + param_names = [p["name"] for p in create["params"]] + assert "ifc_class" in param_names + assert "name" in param_names + + def test_pset_functions(self): + result = list_functions("pset") + names = [f["name"] for f in result] + assert "add_pset" in names + assert "edit_pset" in names + + +class TestFunctionDocs: + def test_create_entity_docs(self): + result = function_docs("root", "create_entity") + assert result["module"] == "root" + assert result["function"] == "create_entity" + assert result["description"] + assert isinstance(result["params"], list) + assert len(result["params"]) > 0 + + def test_params_have_types(self): + result = function_docs("root", "create_entity") + for param in result["params"]: + assert "name" in param + assert "type" in param + + def test_params_have_descriptions(self): + result = function_docs("root", "create_entity") + ifc_class = next(p for p in result["params"] if p["name"] == "ifc_class") + assert "description" in ifc_class + assert len(ifc_class["description"]) > 0 + + def test_return_type(self): + result = function_docs("root", "create_entity") + assert "return_type" in result + + def test_assign_container_docs(self): + result = function_docs("spatial", "assign_container") + assert result["module"] == "spatial" + param_names = [p["name"] for p in result["params"]] + assert "products" in param_names + assert "relating_structure" in param_names + + def test_unknown_function_raises(self): + import pytest + + with pytest.raises(ValueError, match="not found"): + function_docs("root", "nonexistent_function") + + def test_edit_pset_docs(self): + result = function_docs("pset", "edit_pset") + param_names = [p["name"] for p in result["params"]] + assert "pset" in param_names + assert "properties" in param_names diff --git a/src/ifcedit/tests/test_foreach.py b/src/ifcedit/tests/test_foreach.py new file mode 100644 index 00000000000..d464fedcf39 --- /dev/null +++ b/src/ifcedit/tests/test_foreach.py @@ -0,0 +1,85 @@ +# Tests for ifcedit.foreach +import ifcopenshell +import ifcopenshell.api.owner.settings +import ifcopenshell.api.project +import ifcopenshell.api.root +import ifcopenshell.api.spatial +import ifcopenshell.api.unit +import pytest + +from ifcedit.foreach import _substitute, run_foreach + + +@pytest.fixture +def model(model): + return model + + +class TestSubstitute: + def test_single_field(self): + assert _substitute("--product {id}", {"id": 42}) == "--product 42" + + def test_multiple_fields(self): + result = _substitute("{type} #{id} ({name})", {"id": 5, "type": "IfcWall", "name": "W1"}) + assert result == "IfcWall #5 (W1)" + + def test_no_placeholder(self): + assert _substitute("hello", {"id": 1}) == "hello" + + def test_unknown_placeholder_unchanged(self): + assert _substitute("{unknown}", {"id": 1}) == "{unknown}" + + +class TestRunForeach: + def _items(self, model, ifc_class): + return [{"id": e.id(), "type": e.is_a(), "name": e.Name} for e in model.by_type(ifc_class)] + + def test_rename_single(self, model): + items = self._items(model, "IfcWall") + result = run_foreach( + model, "attribute", "edit_attributes", {"product": "{id}", "attributes": '{"Name": "R"}'}, items + ) + assert result["ok"] is True + assert result["count"] == 1 + assert result["errors"] == [] + assert model.by_type("IfcWall")[0].Name == "R" + + def test_rename_multiple(self, model): + items = self._items(model, "IfcElement") + result = run_foreach( + model, "attribute", "edit_attributes", {"product": "{id}", "attributes": '{"Name": "X"}'}, items + ) + assert result["ok"] is True + assert result["count"] == len(items) + + def test_empty_list(self, model): + result = run_foreach(model, "root", "remove_product", {"product": "{id}"}, []) + assert result["ok"] is True + assert result["count"] == 0 + assert result["errors"] == [] + + def test_bad_id_collects_error(self, model): + items = [{"id": 999999, "type": "IfcWall", "name": "X"}] + result = run_foreach(model, "root", "remove_product", {"product": "{id}"}, items) + assert result["ok"] is False + assert result["count"] == 0 + assert len(result["errors"]) == 1 + assert result["errors"][0]["index"] == 0 + + def test_non_dict_item_collects_error(self, model): + result = run_foreach(model, "root", "remove_product", {"product": "{id}"}, ["not_a_dict"]) + assert result["ok"] is False + assert len(result["errors"]) == 1 + + def test_partial_failure_counts_successes(self, model): + wall_id = model.by_type("IfcWall")[0].id() + items = [ + {"id": wall_id, "type": "IfcWall", "name": "W"}, + {"id": 999999, "type": "IfcWall", "name": "Bad"}, + ] + result = run_foreach( + model, "attribute", "edit_attributes", {"product": "{id}", "attributes": '{"Name": "Ok"}'}, items + ) + assert result["ok"] is False + assert result["count"] == 1 + assert len(result["errors"]) == 1 diff --git a/src/ifcedit/tests/test_main.py b/src/ifcedit/tests/test_main.py new file mode 100644 index 00000000000..00585d5172d --- /dev/null +++ b/src/ifcedit/tests/test_main.py @@ -0,0 +1,211 @@ +# This file was generated with the assistance of an AI coding tool. +import json +import subprocess +import sys + +import ifcopenshell +import pytest + + +def run_ifcedit(*args, stdin=None): + """Run ifcedit as a subprocess and return (stdout, stderr, returncode).""" + result = subprocess.run( + [sys.executable, "-m", "ifcedit", *args], + capture_output=True, + text=True, + input=stdin, + ) + return result.stdout, result.stderr, result.returncode + + +class TestListCommand: + def test_list_all_modules(self): + stdout, stderr, rc = run_ifcedit("list") + assert rc == 0 + data = json.loads(stdout) + assert isinstance(data, list) + module_names = [m["module"] for m in data] + assert "root" in module_names + assert "spatial" in module_names + + def test_list_module_functions(self): + stdout, stderr, rc = run_ifcedit("list", "root") + assert rc == 0 + data = json.loads(stdout) + assert isinstance(data, list) + names = [f["name"] for f in data] + assert "create_entity" in names + + def test_list_text_format(self): + stdout, stderr, rc = run_ifcedit("--format", "text", "list") + assert rc == 0 + assert "root" in stdout + + +class TestDocsCommand: + def test_docs_create_entity(self): + stdout, stderr, rc = run_ifcedit("docs", "root.create_entity") + assert rc == 0 + data = json.loads(stdout) + assert data["module"] == "root" + assert data["function"] == "create_entity" + assert "params" in data + + def test_docs_invalid_path(self): + stdout, stderr, rc = run_ifcedit("docs", "invalid_path") + assert rc != 0 + assert "module.function" in stderr + + def test_docs_unknown_function(self): + stdout, stderr, rc = run_ifcedit("docs", "root.nonexistent") + assert rc != 0 + + +class TestRunCommand: + def test_create_entity(self, model_file): + stdout, stderr, rc = run_ifcedit( + "run", model_file, "root.create_entity", "--ifc_class", "IfcWall", "--name", "CLIWall" + ) + assert rc == 0, f"stderr: {stderr}" + data = json.loads(stdout) + assert data["ok"] is True + assert data["result"]["type"] == "IfcWall" + assert data["result"]["name"] == "CLIWall" + + def test_dry_run(self, model_file): + stdout, stderr, rc = run_ifcedit("run", model_file, "root.create_entity", "--dry-run", "--ifc_class", "IfcWall") + assert rc == 0 + data = json.loads(stdout) + assert data["ok"] is True + assert data["dry_run"] is True + + def test_output_to_different_file(self, model_file, tmp_path): + output = str(tmp_path / "output.ifc") + stdout, stderr, rc = run_ifcedit( + "run", model_file, "root.create_entity", "-o", output, "--ifc_class", "IfcSlab" + ) + assert rc == 0, f"stderr: {stderr}" + data = json.loads(stdout) + assert data["ok"] is True + + import os + + assert os.path.exists(output) + + def test_run_error_bad_function(self, model_file): + stdout, stderr, rc = run_ifcedit("run", model_file, "root.nonexistent") + assert rc != 0 + + def test_run_invalid_function_path(self, model_file): + stdout, stderr, rc = run_ifcedit("run", model_file, "invalid_path") + assert rc != 0 + assert "module.function" in stderr + + +class TestForeachCommand: + def _select_json(self, model, ifc_class): + """Build a JSON array like ifcquery select would produce.""" + elements = model.by_type(ifc_class) + return json.dumps([{"id": e.id(), "type": e.is_a(), "name": getattr(e, "Name", None)} for e in elements]) + + def test_foreach_rename(self, model, model_file): + walls_json = self._select_json(model, "IfcWall") + stdout, stderr, rc = run_ifcedit( + "foreach", + model_file, + "attribute.edit_attributes", + "--product", + "{id}", + "--attributes", + '{"Name": "Renamed"}', + stdin=walls_json, + ) + assert rc == 0, f"stderr: {stderr}" + data = json.loads(stdout) + assert data["ok"] is True + assert data["count"] == 1 + assert data["errors"] == [] + updated = ifcopenshell.open(model_file) + assert updated.by_type("IfcWall")[0].Name == "Renamed" + + def test_foreach_multiple_elements(self, model, model_file): + # Build a two-item list by selecting all IfcObject (includes spatial structure + elements) + elements_json = self._select_json(model, "IfcObject") + items = json.loads(elements_json) + assert len(items) >= 2 + stdout, stderr, rc = run_ifcedit( + "foreach", + model_file, + "attribute.edit_attributes", + "--product", + "{id}", + "--attributes", + '{"Name": "Bulk"}', + stdin=elements_json, + ) + assert rc == 0, f"stderr: {stderr}" + data = json.loads(stdout) + assert data["ok"] is True + assert data["count"] == len(items) + + def test_foreach_empty_list(self, model_file): + stdout, stderr, rc = run_ifcedit( + "foreach", + model_file, + "attribute.edit_attributes", + "--product", + "{id}", + "--attributes", + '{"Name": "X"}', + stdin="[]", + ) + assert rc == 0 + data = json.loads(stdout) + assert data["ok"] is True + assert data["count"] == 0 + + def test_foreach_invalid_json_stdin(self, model_file): + stdout, stderr, rc = run_ifcedit( + "foreach", + model_file, + "root.remove_product", + "--product", + "{id}", + stdin="not json", + ) + assert rc != 0 + assert "Error" in stderr + + def test_foreach_not_array_stdin(self, model_file): + stdout, stderr, rc = run_ifcedit( + "foreach", + model_file, + "root.remove_product", + "--product", + "{id}", + stdin='{"id": 1}', + ) + assert rc != 0 + assert "Error" in stderr + + def test_foreach_output_to_different_file(self, model, model_file, tmp_path): + import os + + output = str(tmp_path / "out.ifc") + walls_json = self._select_json(model, "IfcWall") + stdout, stderr, rc = run_ifcedit( + "foreach", + model_file, + "attribute.edit_attributes", + "-o", + output, + "--product", + "{id}", + "--attributes", + '{"Name": "OutFile"}', + stdin=walls_json, + ) + assert rc == 0, f"stderr: {stderr}" + assert os.path.exists(output) + updated = ifcopenshell.open(output) + assert updated.by_type("IfcWall")[0].Name == "OutFile" diff --git a/src/ifcedit/tests/test_quantify.py b/src/ifcedit/tests/test_quantify.py new file mode 100644 index 00000000000..f4335fb2a7f --- /dev/null +++ b/src/ifcedit/tests/test_quantify.py @@ -0,0 +1,87 @@ +# This file was generated with the assistance of an AI coding tool. +from __future__ import annotations + +import ifcopenshell +import ifcopenshell.api.aggregate +import ifcopenshell.api.owner.settings +import ifcopenshell.api.project +import ifcopenshell.api.root +import ifcopenshell.api.spatial +import ifcopenshell.api.unit +import pytest + +from ifcedit.quantify import AVAILABLE_RULES, list_rules, run_quantify + + +class TestListRules: + def test_returns_list(self): + result = list_rules() + assert isinstance(result, list) + + def test_each_entry_has_name(self): + result = list_rules() + for entry in result: + assert "name" in entry + + def test_ifc4_rule_present(self): + result = list_rules() + names = [r["name"] for r in result] + assert "IFC4QtoBaseQuantities" in names + + def test_ifc4x3_rule_present(self): + result = list_rules() + names = [r["name"] for r in result] + assert "IFC4X3QtoBaseQuantities" in names + + +@pytest.fixture +def quantify_model(): + """Create an IFC4 model with a wall element.""" + f = ifcopenshell.api.project.create_file() + ifcopenshell.api.owner.settings.get_user = lambda ifc: (ifc.by_type("IfcPersonAndOrganization") or [None])[0] + ifcopenshell.api.owner.settings.get_application = lambda ifc: (ifc.by_type("IfcApplication") or [None])[0] + + project = ifcopenshell.api.root.create_entity(f, ifc_class="IfcProject", name="TestProject") + ifcopenshell.api.unit.assign_unit(f) + + site = ifcopenshell.api.root.create_entity(f, ifc_class="IfcSite", name="TestSite") + building = ifcopenshell.api.root.create_entity(f, ifc_class="IfcBuilding", name="TestBuilding") + storey = ifcopenshell.api.root.create_entity(f, ifc_class="IfcBuildingStorey", name="Ground Floor") + + ifcopenshell.api.aggregate.assign_object(f, products=[site], relating_object=project) + ifcopenshell.api.aggregate.assign_object(f, products=[building], relating_object=site) + ifcopenshell.api.aggregate.assign_object(f, products=[storey], relating_object=building) + + wall = ifcopenshell.api.root.create_entity(f, ifc_class="IfcWall", name="Wall001") + ifcopenshell.api.spatial.assign_container(f, products=[wall], relating_structure=storey) + + return f + + +class TestRunQuantify: + def test_returns_ok_true(self, quantify_model): + result = run_quantify(quantify_model, "IFC4QtoBaseQuantities") + assert result["ok"] is True + + def test_returns_rule_name(self, quantify_model): + result = run_quantify(quantify_model, "IFC4QtoBaseQuantities") + assert result["rule"] == "IFC4QtoBaseQuantities" + + def test_returns_elements_quantified(self, quantify_model): + result = run_quantify(quantify_model, "IFC4QtoBaseQuantities") + assert "elements_quantified" in result + assert isinstance(result["elements_quantified"], int) + + def test_unknown_rule_returns_error(self, quantify_model): + result = run_quantify(quantify_model, "NonExistentRule") + assert result["ok"] is False + assert "error" in result + + def test_selector_restricts_elements(self, quantify_model): + result = run_quantify(quantify_model, "IFC4QtoBaseQuantities", selector="IfcWall") + assert result["ok"] is True + assert result["rule"] == "IFC4QtoBaseQuantities" + + def test_empty_selector_runs_on_all(self, quantify_model): + result = run_quantify(quantify_model, "IFC4QtoBaseQuantities", selector=None) + assert result["ok"] is True diff --git a/src/ifcedit/tests/test_run.py b/src/ifcedit/tests/test_run.py new file mode 100644 index 00000000000..80881e879fc --- /dev/null +++ b/src/ifcedit/tests/test_run.py @@ -0,0 +1,97 @@ +# This file was generated with the assistance of an AI coding tool. +import ifcopenshell +import ifcopenshell.api.project +import ifcopenshell.api.pset +import ifcopenshell.api.root + +from ifcedit.run import run_api, serialize_result + + +class TestRunApi: + def test_create_entity(self, model): + result = run_api(model, "root", "create_entity", {"ifc_class": "IfcWall", "name": "NewWall"}) + assert result["ok"] is True + assert result["result"]["type"] == "IfcWall" + assert result["result"]["name"] == "NewWall" + assert isinstance(result["result"]["id"], int) + + def test_create_entity_default_class(self, model): + result = run_api(model, "root", "create_entity", {}) + assert result["ok"] is True + assert result["result"]["type"] == "IfcBuildingElementProxy" + + def test_assign_container(self, model): + wall = ifcopenshell.api.root.create_entity(model, ifc_class="IfcWall", name="TestWall2") + storey = model.by_type("IfcBuildingStorey")[0] + result = run_api( + model, + "spatial", + "assign_container", + {"products": str(wall.id()), "relating_structure": str(storey.id())}, + ) + assert result["ok"] is True + assert result["result"]["type"] == "IfcRelContainedInSpatialStructure" + + def test_add_pset(self, model): + wall = model.by_type("IfcWall")[0] + result = run_api(model, "pset", "add_pset", {"product": str(wall.id()), "name": "Pset_WallCommon"}) + assert result["ok"] is True + assert result["result"]["type"] == "IfcPropertySet" + + def test_unknown_function(self, model): + result = run_api(model, "root", "nonexistent", {}) + assert result["ok"] is False + assert "Cannot find" in result["error"] + + def test_unknown_parameter(self, model): + result = run_api(model, "root", "create_entity", {"bogus_param": "value"}) + assert result["ok"] is False + assert "Unknown parameter" in result["error"] + + def test_bad_entity_reference(self, model): + result = run_api(model, "pset", "add_pset", {"product": "999999", "name": "Pset_WallCommon"}) + assert result["ok"] is False + assert "not found" in result["error"] + + +class TestAppendAsset: + def test_append_asset_from_library(self, model, library_file): + lib = ifcopenshell.open(library_file) + wall_type = lib.by_type("IfcWallType")[0] + result = run_api( + model, + "project", + "append_asset", + {"library": library_file, "element": str(wall_type.id())}, + ) + assert result["ok"] is True + assert result["result"]["type"] == "IfcWallType" + assert model.by_type("IfcWallType"), "wall type should have been appended to the model" + + +class TestSerializeResult: + def test_none(self): + assert serialize_result(None) is None + + def test_string(self): + assert serialize_result("hello") == "hello" + + def test_int(self): + assert serialize_result(42) == 42 + + def test_entity(self, model): + wall = model.by_type("IfcWall")[0] + result = serialize_result(wall) + assert result["id"] == wall.id() + assert result["type"] == "IfcWall" + assert result["name"] == "Wall001" + + def test_list(self, model): + walls = model.by_type("IfcWall") + result = serialize_result(walls) + assert isinstance(result, list) + assert all(isinstance(r, dict) for r in result) + + def test_dict(self): + result = serialize_result({"key": "value"}) + assert result == {"key": "value"} diff --git a/src/ifcfm/ifcfm/cobie24.py b/src/ifcfm/ifcfm/cobie24.py index f4848e16544..b83a4abe08e 100644 --- a/src/ifcfm/ifcfm/cobie24.py +++ b/src/ifcfm/ifcfm/cobie24.py @@ -955,7 +955,7 @@ def get_unit_type_name(ifc_file: ifcopenshell.file, unit_type: str) -> Union[str return val(unit.Currency) -def get_unit_name(ifc_file: ifcopenshell.entity_instance, unit: ifcopenshell.entity_instance) -> Union[str, None]: +def get_unit_name(unit: ifcopenshell.entity_instance) -> Union[str, None]: if unit.is_a("IfcNamedUnit"): return val(unit.Name) diff --git a/src/ifcfm/ifcfm/cobie24legacy.py b/src/ifcfm/ifcfm/cobie24legacy.py index 078529e8927..b3aa069e754 100644 --- a/src/ifcfm/ifcfm/cobie24legacy.py +++ b/src/ifcfm/ifcfm/cobie24legacy.py @@ -953,7 +953,7 @@ def get_unit_type_name(ifc_file: ifcopenshell.file, unit_type: str) -> Union[str return val(unit.Currency) -def get_unit_name(ifc_file: ifcopenshell.entity_instance, unit: ifcopenshell.entity_instance) -> Union[str, None]: +def get_unit_name(unit: ifcopenshell.entity_instance) -> Union[str, None]: if unit.is_a("IfcNamedUnit"): return val(unit.Name) diff --git a/src/ifcgeom/CMakeLists.txt b/src/ifcgeom/CMakeLists.txt index b50dfce590d..31bb2e7bcef 100644 --- a/src/ifcgeom/CMakeLists.txt +++ b/src/ifcgeom/CMakeLists.txt @@ -29,14 +29,12 @@ endif() find_package(Eigen3 REQUIRED) -target_link_libraries( - IfcGeom - ${kernel_libraries} - ${mapping_libraries} - ${CMAKE_THREAD_LIBS_INIT} - "Eigen3::Eigen" - ${CGAL_LIBRARIES} -) +target_link_libraries(IfcGeom ${mapping_libraries} ${CMAKE_THREAD_LIBS_INIT} "Eigen3::Eigen" ${CGAL_LIBRARIES}) + +if(WITH_OPENCASCADE) + target_link_libraries(IfcGeom TKernel) +endif() + if(NOT WASM_BUILD) target_link_libraries(IfcGeom IfcParse) endif() diff --git a/src/ifcgeom/ConversionSettings.h b/src/ifcgeom/ConversionSettings.h index eb405a9e7c9..febd789f6bb 100644 --- a/src/ifcgeom/ConversionSettings.h +++ b/src/ifcgeom/ConversionSettings.h @@ -452,6 +452,12 @@ namespace ifcopenshell { static constexpr bool defaultvalue = false; }; + struct MakeVolume : public SettingBase { + static constexpr const char* const name = "make-volume"; + static constexpr const char* const description = "Try to isolate and fix a valid volume from non-manifold elements prior to opening subtraction"; + static constexpr bool defaultvalue = false; + }; + struct DeferProcessingFirstElement : public SettingBase { static constexpr const char* const name = "defer-processing-first-element"; static constexpr const char* const description = "Don't process first element in Iterator::initialize call()"; @@ -647,7 +653,7 @@ namespace ifcopenshell { }; class Settings : public SettingsContainer< - std::tuple + std::tuple > {}; } diff --git a/src/ifcgeom/Converter.cpp b/src/ifcgeom/Converter.cpp index 6b70ac7f51a..a50a43cc660 100644 --- a/src/ifcgeom/Converter.cpp +++ b/src/ifcgeom/Converter.cpp @@ -12,11 +12,8 @@ ifcopenshell::geometry::Converter::Converter(std::unique_ptrsettings(); } -ifcopenshell::geometry::Converter::~Converter() -{ - if (mapping_ != nullptr) { - delete mapping_; - } +ifcopenshell::geometry::Converter::~Converter() { + delete mapping_; } namespace { diff --git a/src/ifcgeom/IfcGeomRepresentation.cpp b/src/ifcgeom/IfcGeomRepresentation.cpp index 48346b2831e..f0c150597e8 100644 --- a/src/ifcgeom/IfcGeomRepresentation.cpp +++ b/src/ifcgeom/IfcGeomRepresentation.cpp @@ -91,7 +91,7 @@ bool IfcGeom::Representation::BRep::calculate_volume(double& volume) const { volume = 0.; return false; } - volume = s->area()->to_double(); + volume = s->volume()->to_double(); return true; } diff --git a/src/ifcgeom/Iterator.cpp b/src/ifcgeom/Iterator.cpp index a7f700f4def..4db7db8946c 100644 --- a/src/ifcgeom/Iterator.cpp +++ b/src/ifcgeom/Iterator.cpp @@ -620,17 +620,7 @@ const IfcGeom::Element* IfcGeom::Iterator::get_object(int id) { } } catch (const std::exception& e) { Logger::Error(e); - } -#ifdef IFOPSH_WITH_OPENCASCADE - catch (const Standard_Failure& e) { - if (e.GetMessageString() && strlen(e.GetMessageString())) { - Logger::Error(e.GetMessageString()); - } else { - Logger::Error("Unknown error returning product"); - } - } -#endif - catch (...) { + } catch (...) { Logger::Error("Unknown error returning product"); } @@ -645,18 +635,7 @@ const IfcUtil::IfcBaseClass* IfcGeom::Iterator::create() { } catch (const std::exception& e) { Logger::Error(e); had_error_processing_elements_ = true; - } -#ifdef IFOPSH_WITH_OPENCASCADE - catch (const Standard_Failure& e) { - if (e.GetMessageString() && strlen(e.GetMessageString())) { - Logger::Error(e.GetMessageString()); - } else { - Logger::Error("Unknown error creating geometry"); - } - had_error_processing_elements_ = true; - } -#endif - catch (...) { + } catch (...) { Logger::Error("Unknown error creating geometry"); had_error_processing_elements_ = true; } diff --git a/src/ifcgeom/Iterator.h b/src/ifcgeom/Iterator.h index 3f5f90a3500..fc9e542d605 100644 --- a/src/ifcgeom/Iterator.h +++ b/src/ifcgeom/Iterator.h @@ -68,10 +68,6 @@ #include "../ifcgeom/abstract_mapping.h" #include "../ifcgeom/GeometrySerializer.h" -#ifdef IFOPSH_WITH_OPENCASCADE -#include -#endif - #include #include diff --git a/src/ifcgeom/Serialization/CMakeLists.txt b/src/ifcgeom/Serialization/CMakeLists.txt index 4463cabcc92..0c491361012 100644 --- a/src/ifcgeom/Serialization/CMakeLists.txt +++ b/src/ifcgeom/Serialization/CMakeLists.txt @@ -1,6 +1,6 @@ add_subdirectory(schema) -add_library(geometry_serializer STATIC Serialization.cpp) +add_library(geometry_serializer Serialization.cpp) file(GLOB IFCGEOM_SERIALIZATION_H_FILE *.h) set_target_properties( diff --git a/src/ifcgeom/Serialization/schema/CMakeLists.txt b/src/ifcgeom/Serialization/schema/CMakeLists.txt index b6daf97cd93..583c177634a 100644 --- a/src/ifcgeom/Serialization/schema/CMakeLists.txt +++ b/src/ifcgeom/Serialization/schema/CMakeLists.txt @@ -1,5 +1,5 @@ foreach(schema ${SCHEMA_VERSIONS}) - add_library(geometry_serializer_ifc${schema} STATIC Serialization.cpp) + add_library(geometry_serializer_ifc${schema} OBJECT Serialization.cpp) target_link_libraries(geometry_serializer_ifc${schema} ${OpenCASCADE_LIBRARIES}) set_target_properties( geometry_serializer_ifc${schema} diff --git a/src/ifcgeom/infra_sweep_helper.cpp b/src/ifcgeom/infra_sweep_helper.cpp index b9c9e598d9f..123e13b0638 100644 --- a/src/ifcgeom/infra_sweep_helper.cpp +++ b/src/ifcgeom/infra_sweep_helper.cpp @@ -14,6 +14,27 @@ namespace { } } +namespace { +template > +bool has_intersection(const std::set& A, + const std::set& B) { + auto itA = A.begin(); + auto itB = B.begin(); + + while (itA != A.end() && itB != B.end()) { + if (Cmp()(*itA, *itB)) { + ++itA; + } else if (Cmp()(*itB, *itA)) { + ++itB; + } else { + return true; + } + } + return false; +} + +} + taxonomy::loft::ptr ifcopenshell::geometry::make_loft(const Settings& settings_, const IfcUtil::IfcBaseClass* inst, const taxonomy::function_item::ptr& fn, std::vector& cross_sections) { std::sort(cross_sections.begin(), cross_sections.end()); @@ -25,7 +46,7 @@ taxonomy::loft::ptr ifcopenshell::geometry::make_loft(const Settings& settings_, // @todo currently only the case is handled where directrix returns a function_item // @todo this "if" statement is not really required because the function returns at the start if the Directrix is not a function_item function if (fn) { - function_item_evaluator evaluator(settings_,fn); + function_item_evaluator evaluator(settings_, fn); double start = std::max(0., cross_sections.front().dist_along); double end = std::min(fn->length(), cross_sections.back().dist_along); @@ -45,6 +66,7 @@ taxonomy::loft::ptr ifcopenshell::geometry::make_loft(const Settings& settings_, // parameter is minimum number of steps num_steps = (size_t)std::ceil(param); } + auto delta_step = curve_length / num_steps; std::vector longitudes; for (auto& x : cross_sections) { longitudes.push_back(x.dist_along); @@ -52,7 +74,7 @@ taxonomy::loft::ptr ifcopenshell::geometry::make_loft(const Settings& settings_, longitudes.push_back(std::numeric_limits::infinity()); auto profile_index = longitudes.begin(); for (size_t i = 0; i <= num_steps; ++i) { - auto dist_along = start + curve_length / num_steps * i; + auto dist_along = start + delta_step * i; while (dist_along > *(profile_index + 1)) { profile_index++; if (profile_index == longitudes.end()) { @@ -60,6 +82,8 @@ taxonomy::loft::ptr ifcopenshell::geometry::make_loft(const Settings& settings_, } } + const bool is_last_placement_of_this_profile = profile_index + 1 >= longitudes.end() ? false : ((start + delta_step * (i+1)) > *(profile_index + 1)); + auto relative_dist_along = (dist_along - *profile_index) / (*(profile_index + 1) - *profile_index); const auto& profile_a = cross_sections[std::distance(longitudes.begin(), profile_index)].section_geometry; const auto& offset_a = cross_sections[std::distance(longitudes.begin(), profile_index)].offset; @@ -136,35 +160,210 @@ taxonomy::loft::ptr ifcopenshell::geometry::make_loft(const Settings& settings_, } auto interpolated_offset = lerp(offset_a, offset_b, relative_dist_along); - if (rotation_a == rotation_b && rotation_a) { - // @todo we don't support an overridden rotation on only one of the placements + if (rotation_a.has_value() && rotation_b.has_value() ) { + // @todo we don't support an overridden rotation on only one of the placements // in which case we would need to lerp with the rotation component below in m4b. interpolated_rotation = lerp(*rotation_a, *rotation_b, relative_dist_along); } else if (rotation_a != rotation_b) { - Logger::Error("Direction vectors on cross section placements only supported when used consistently"); + Logger::Error("Direction vectors on cross section placements only supported when used consistently"); } + taxonomy::loop::ptr w1, w2; taxonomy::edge::ptr e1, e2; + taxonomy::point3::ptr p1, p2; + for (auto tmp_ : boost::combine(loops_a, loops_b)) { boost::tie(w1, w2) = tmp_; - if (w1->children.size() != w2->children.size()) { - Logger::Warning("Mismatching number of edges: " + - std::to_string(w1->children.size()) + " vs " + - std::to_string(w2->children.size()), - inst - ); + + if (w1->closed != w2->closed) { + Logger::Warning("Mismatching closed property on loops", inst); return nullptr; + } + + if (w1->tags.is_initialized() != w2->tags.is_initialized()) { + Logger::Warning("Mismatching availability tags on loops", inst); + return nullptr; + } + + if (w1->tags) { + // check uniqueness + std::set tags_seen; + for (const auto& t : *w1->tags) { + if (tags_seen.find(t) != tags_seen.end()) { + Logger::Warning("Duplicate tag '" + t + "' on loft profile", inst); + return nullptr; + } + tags_seen.insert(t); + } } - std::vector points; - for (auto tmp__ : boost::combine(w1->children, w2->children)) { - boost::tie(e1, e2) = tmp__; - auto& p1 = boost::get(e1->start); - auto& p2 = boost::get(e2->start); - - auto p3 = (lerp(p1->ccomponents(), p2->ccomponents(), relative_dist_along) + interpolated_offset).eval(); - // auto p4 = (interpolated_rotation * p3).eval(); - points.push_back(taxonomy::make(p3)); + + if (w2->tags) { + // check uniqueness + std::set tags_seen; + for (const auto& t : *w2->tags) { + if (tags_seen.find(t) != tags_seen.end()) { + Logger::Warning("Duplicate tag '" + t + "' on loft profile", inst); + return nullptr; + } + tags_seen.insert(t); + } + } + + std::map tag_to_point_on_w1, tag_to_point_on_w2; + + auto loop_to_points = [](const taxonomy::loop::ptr& loop, const boost::optional>& input_tags) -> std::pair, std::vector>> { + std::vector points; + std::vector> tags; + std::vector::const_iterator tag_it; + + if (!loop->closed.get_value_or(false)) { + points = {boost::get(loop->children[0]->start)}; + if (input_tags) { + tags = {{input_tags->front()}}; + tag_it = ++input_tags->begin(); + } + } + for (auto& e : loop->children) { + const auto& p1_ = boost::get(e->start); + const auto& p2_ = boost::get(e->end); + if (input_tags && p1_->ccomponents() == p2_->ccomponents()) { + tags.back().insert(*tag_it); + ++tag_it; + } else { + points.push_back(p2_); + if (input_tags) { + tags.emplace_back(); + tags.back().insert(*tag_it); + ++tag_it; + } + } + } + if (!input_tags) { + if (loop->closed.get_value_or(false)) { + // close polygon by referencing first point + points.push_back(points.front()); + } + } + return {points, tags}; + }; + + auto combine_tags = [](const std::vector>& tag_sets) -> std::set { + return std::accumulate( + tag_sets.begin(), tag_sets.end(), std::set{}, + [](std::set acc, + const std::set& m) { + acc.insert(m.begin(), m.end()); + return acc; + }); + }; + + auto join_tags = [](const std::set& tag_set) -> std::string { + std::string result; + for (auto it = tag_set.begin(); it != tag_set.end(); ++it) { + if (it != tag_set.begin()) { + result += ", "; + } + result += *it; + } + return result; + }; + + auto [w1_points, w1_tags] = loop_to_points(w1, w1->tags); + auto [w2_points, w2_tags] = loop_to_points(w2, w2->tags); + + if (w1->tags && w2->tags) { + { + auto it = w1_points.begin(); + auto jt = w1_tags.begin(); + while (it != w1_points.end() && jt != w1_tags.end()) { + for (auto& t : *jt) { + tag_to_point_on_w1[t] = *it; + } + ++it; + ++jt; + } + } + + { + auto it = w2_points.begin(); + auto jt = w2_tags.begin(); + while (it != w2_points.end() && jt != w2_tags.end()) { + for (auto& t : *jt) { + tag_to_point_on_w2[t] = *it; + } + ++it; + ++jt; + } + } + + auto w1_tags_combined = combine_tags(w1_tags); + auto w2_tags_combined = combine_tags(w2_tags); + + // For every point (which can have multiple tags in case of 0-width edges) there needs to be a corresponding point on the other profile + + for (auto& p1_tags : w1_tags) { + if (!has_intersection(p1_tags, w2_tags_combined)) { + Logger::Warning("No matching tags found on loft profiles: " + join_tags(p1_tags) + " not in " + join_tags(w2_tags_combined), inst); + return nullptr; + } + } + + for (auto& p2_tags : w2_tags) { + if (!has_intersection(p2_tags, w1_tags_combined)) { + Logger::Warning("No matching tags found on loft profiles: " + join_tags(p2_tags) + " not in " + join_tags(w1_tags_combined), inst); + return nullptr; + } + } + } else { + if (w1->children.size() != w2->children.size()) { + Logger::Warning("Mismatching number of edges: " + + std::to_string(w1->children.size()) + " vs " + + std::to_string(w2->children.size()), + inst); + return nullptr; + } } + + std::vector points; + + std::vector common_tags_vec; + if (w1->tags) { + std::set common_tags; + for (const auto& t : *w1->tags) { + if (tag_to_point_on_w2.find(t) == tag_to_point_on_w2.end()) { + continue; + } + + const auto& p1_ = tag_to_point_on_w1[t]; + const auto& p2_ = tag_to_point_on_w2[t]; + + auto p3 = (lerp(p1_->ccomponents(), p2_->ccomponents(), relative_dist_along) + interpolated_offset).eval(); + + std::set tags_for_this_point_on_subsequent_profile = {t}; + + if (is_last_placement_of_this_profile) { + for (auto& ts : w2_tags) { + if (ts.find(t) != ts.end()) { + tags_for_this_point_on_subsequent_profile = ts; + } + } + } + + for (auto& x : tags_for_this_point_on_subsequent_profile) { + points.push_back(taxonomy::make(p3)); + common_tags_vec.push_back(x); + } + } + } else { + for (auto tmp__ : boost::combine(w1_points, w2_points)) { + boost::tie(p1, p2) = tmp__; + auto p3 = (lerp(p1->ccomponents(), p2->ccomponents(), relative_dist_along) + interpolated_offset).eval(); + points.push_back(taxonomy::make(p3)); + } + } + + /* + // This is handled in the loop_to_points() function above if (!points.empty()) { if (!w1->closed.get_value_or(true) && !w2->closed.get_value_or(true)) { // open polygon, add last point @@ -178,12 +377,17 @@ taxonomy::loft::ptr ifcopenshell::geometry::make_loft(const Settings& settings_, points.push_back(points.front()); } } + */ auto interpolated_loop = polygon_from_points(points); - interpolated_loop->external = w1->external; if (interpolated->kind() == taxonomy::FACE) { - std::static_pointer_cast(interpolated)->children.push_back(interpolated_loop); + interpolated_loop->external = w1->external; + std::static_pointer_cast(interpolated)->children.push_back(interpolated_loop); } else { + if (w1->tags) { + std::static_pointer_cast(interpolated)->tags = common_tags_vec; + } + std::static_pointer_cast(interpolated)->closed = w1->closed; std::static_pointer_cast(interpolated)->children = interpolated_loop->children; } } diff --git a/src/ifcgeom/kernels/CMakeLists.txt b/src/ifcgeom/kernels/CMakeLists.txt index c9c8c549cbd..6775a8f3781 100644 --- a/src/ifcgeom/kernels/CMakeLists.txt +++ b/src/ifcgeom/kernels/CMakeLists.txt @@ -8,13 +8,13 @@ foreach(kernel ${GEOMETRY_KERNELS}) set(KERNEL_TARGET "geometry_kernel_${kernel}") - add_library(${KERNEL_TARGET} OBJECT ${IFCGEOM_FILES}) + add_library(${KERNEL_TARGET} ${IFCGEOM_FILES}) set_target_properties( ${KERNEL_TARGET} PROPERTIES COMPILE_FLAGS "-DIFC_GEOM_EXPORTS" PUBLIC_HEADER "${IFCGEOM_H_FILES}" ) list(APPEND kernel_libraries ${KERNEL_TARGET}) - target_link_libraries(${KERNEL_TARGET} ${${KERNEL_UPPER}_LIBRARIES} Eigen3::Eigen) + target_link_libraries(${KERNEL_TARGET} ${${KERNEL_UPPER}_LIBRARIES} IfcGeom Eigen3::Eigen) install( TARGETS ${KERNEL_TARGET} EXPORT ${IFCOPENSHELL_EXPORT_TARGETS} @@ -27,7 +27,7 @@ foreach(kernel ${GEOMETRY_KERNELS}) set_property(TARGET ${KERNEL_TARGET} APPEND_STRING PROPERTY COMPILE_FLAGS " -DCGAL_HAS_THREADS") set(KERNEL_TARGET_SIMPLE "${KERNEL_TARGET}_simple") - add_library(${KERNEL_TARGET_SIMPLE} OBJECT ${IFCGEOM_FILES}) + add_library(${KERNEL_TARGET_SIMPLE} ${IFCGEOM_FILES}) set_target_properties( ${KERNEL_TARGET_SIMPLE} PROPERTIES COMPILE_FLAGS "-DIFC_GEOM_EXPORTS -DIFOPSH_SIMPLE_KERNEL -DCGAL_HAS_THREADS" @@ -42,3 +42,5 @@ foreach(kernel ${GEOMETRY_KERNELS}) endforeach() set(kernel_libraries ${kernel_libraries} PARENT_SCOPE) + +install(FILES ifc_geomlibrary_api.h DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/ifcgeom/kernels/") diff --git a/src/ifcgeom/kernels/cgal/CgalKernel.cpp b/src/ifcgeom/kernels/cgal/CgalKernel.cpp index a2d4d01ebcc..1e4a8866b9d 100644 --- a/src/ifcgeom/kernels/cgal/CgalKernel.cpp +++ b/src/ifcgeom/kernels/cgal/CgalKernel.cpp @@ -1835,6 +1835,9 @@ bool CgalKernel::convert_impl(const taxonomy::boolean_result::ptr br, Conversion CGAL::Polygon_with_holes_2 pwh(p, ++it, loops.end()); CGAL::Gps_segment_traits_2 traits; if (!CGAL::are_holes_and_boundary_pairwise_disjoint(pwh, traits)) { +#ifdef IFOPSH_SIMPLE_KERNEL + throw std::runtime_error("Holes are not disjoint - use a different geometry kernel"); +#else // this is very slow. // the check is also slow... @@ -1851,6 +1854,7 @@ bool CgalKernel::convert_impl(const taxonomy::boolean_result::ptr br, Conversion result.difference(*it); } result.polygons_with_holes(std::back_inserter(pwhs)); +#endif } else { pwhs.push_back(pwh); } diff --git a/src/ifcgeom/kernels/opencascade/IfcGeomTree.h b/src/ifcgeom/kernels/opencascade/IfcGeomTree.h index 997391fcd68..46e0f067317 100644 --- a/src/ifcgeom/kernels/opencascade/IfcGeomTree.h +++ b/src/ifcgeom/kernels/opencascade/IfcGeomTree.h @@ -1792,6 +1792,10 @@ namespace IfcGeom { auto& vs = elem->geometry().verts(); auto& fs = elem->geometry().faces(); + if (vs.empty() || fs.empty()) { + return; + } + gp_Trsf tr; tr.SetValues( m(0, 0), m(0, 1), m(0, 2), m(0, 3), @@ -1859,23 +1863,36 @@ namespace IfcGeom { candidates.push_back({ std::abs(Z.Dot(ref)), ref }); } - if (candidates.empty()) { - { - gp_XYZ ref(0, 0, 1); - candidates.push_back({ std::abs(Z.Dot(ref)), ref }); + gp_Ax3 ax3; + gp_Trsf trsf2; + + for (size_t attempt = 0; attempt < 2; ++attempt) { + + if (candidates.empty() || attempt == 1) { + { + gp_XYZ ref(0, 0, 1); + candidates.push_back({std::abs(Z.Dot(ref)), ref}); + } + { + gp_XYZ ref(1, 0, 0); + candidates.push_back({std::abs(Z.Dot(ref)), ref}); + } } + + auto X = std::min_element(candidates.begin(), candidates.end(), [](auto& p1, auto& p2) { return p1.first < p2.first; })->second; + { - gp_XYZ ref(1, 0, 0); - candidates.push_back({ std::abs(Z.Dot(ref)), ref }); + try { + ax3 = gp_Ax3(gp::Origin(), Z, X); + trsf2.SetTransformation(gp::XOY(), ax3); + } catch (Standard_ConstructionError&) { + // Try again, likely we have all identical normals in candidates so + // we cannot find a suitable candidate and need the two default axes + continue; + } } } - auto X = std::min_element(candidates.begin(), candidates.end(), [](auto& p1, auto& p2) { return p1.first < p2.first; })->second; - - gp_Trsf trsf2; - gp_Ax3 ax3(gp::Origin(), Z, X); - trsf2.SetTransformation(gp::XOY(), ax3); - Bnd_Box tmp; for (auto& p : vs_transformed) { diff --git a/src/ifcgeom/kernels/opencascade/OpenCascadeKernel.cpp b/src/ifcgeom/kernels/opencascade/OpenCascadeKernel.cpp index fcb390b6cca..e8b672906e5 100644 --- a/src/ifcgeom/kernels/opencascade/OpenCascadeKernel.cpp +++ b/src/ifcgeom/kernels/opencascade/OpenCascadeKernel.cpp @@ -29,6 +29,7 @@ #include "base_utils.h" #include +#include namespace { struct opening_sorter { @@ -132,11 +133,24 @@ bool IfcGeom::OpenCascadeKernel::convert_openings(const IfcUtil::IfcBaseEntity* parts.push_back(it3_shape); } - for (auto& entity_part : parts) { + for (auto entity_part : parts) { bool is_manifold = util::is_manifold(entity_part); if (!is_manifold) { - Logger::Warning("Non-manifold first operand"); + if (settings_.get().get()) { + BOPAlgo_MakerVolume mv; + mv.AddArgument(entity_part); + mv.SetAvoidInternalShapes(true); + try { + mv.Perform(); + entity_part = mv.Shape(); + Logger::Warning("Sucessfully detected exterior volume to non-manifold first operand"); + } catch (const Standard_Failure& e) { + Logger::Warning("MakeVolume failed: " + std::string(e.GetMessageString()), entity); + } + } else { + Logger::Warning("Non-manifold first operand, use --make-volume to try and make manifold"); + } } TopoDS_Shape entity_part_result; @@ -241,1126 +255,28 @@ bool IfcGeom::OpenCascadeKernel::unify_shapes(const IfcGeom::ConversionResults& } bool IfcGeom::OpenCascadeKernel::convert_impl(const taxonomy::revolve::ptr r, IfcGeom::ConversionResults& results) { - - - gp_Ax1 ax( - convert_xyz(*r->axis_origin), - convert_xyz(*r->direction)); - - TopoDS_Shape face; - if (!convert(taxonomy::cast(r->basis), face)) { - return false; - } - - TopoDS_Shape shape; - if (r->angle) { - shape = BRepPrimAPI_MakeRevol(face, ax, *r->angle); - } else { - shape = BRepPrimAPI_MakeRevol(face, ax); - } - - results.emplace_back(ConversionResult( - r->instance->as()->id(), - r->matrix, - new OpenCascadeShape(shape), - r->surface_style - )); - return true; + return handle_occt_exception([&]() -> bool { + gp_Ax1 ax( + convert_xyz(*r->axis_origin), + convert_xyz(*r->direction)); + + TopoDS_Shape face; + if (!convert(taxonomy::cast(r->basis), face)) { + return false; + } + + TopoDS_Shape shape; + if (r->angle) { + shape = BRepPrimAPI_MakeRevol(face, ax, *r->angle); + } else { + shape = BRepPrimAPI_MakeRevol(face, ax); + } + + results.emplace_back(ConversionResult( + r->instance->as()->id(), + r->matrix, + new OpenCascadeShape(shape), + r->surface_style)); + return true; + }); } - -// IfcSchema::IfcRelVoidsElement::list::ptr IfcGeom::Kernel::find_openings(IfcSchema::IfcProduct* product) { -// std::vector rs; -// -// if (product->declaration().is(IfcSchema::IfcElement::Class()) && !product->declaration().is(IfcSchema::IfcOpeningElement::Class())) { -// IfcSchema::IfcElement* element = (IfcSchema::IfcElement*)product; -// auto rels = element->HasOpenings(); -// rs.insert(rs.end(), rels->begin(), rels->end()); -// } -// -// // Is the IfcElement a decomposition of an IfcElement with any IfcOpeningElements? -// IfcSchema::IfcObjectDefinition* obdef = product->as(); -// for (;;) { -// auto decomposes = obdef->Decomposes(); -// if (decomposes->size() != 1) break; -// IfcSchema::IfcObjectDefinition* rel_obdef = (*decomposes->begin())->RelatingObject(); -// if (rel_obdef->declaration().is(IfcSchema::IfcElement::Class()) && !rel_obdef->declaration().is(IfcSchema::IfcOpeningElement::Class())) { -// IfcSchema::IfcElement* element = (IfcSchema::IfcElement*)rel_obdef; -// auto rels = element->HasOpenings(); -// rs.insert(rs.end(), rels->begin(), rels->end()); -// } -// -// obdef = rel_obdef; -// } -// -// // Filter openings in Reference view, solely marked as Reference. -// IfcSchema::IfcRelVoidsElement::list::ptr openings(new IfcSchema::IfcRelVoidsElement::list); -// std::for_each(rs.begin(), rs.end(), [&openings](IfcSchema::IfcRelVoidsElement* rel) { -// if (rel->RelatedOpeningElement()->ObjectPlacement() && rel->RelatedOpeningElement()->Representation()) { -// auto reps = rel->RelatedOpeningElement()->Representation()->Representations(); -// if (!(reps->size() == 1 && (*reps->begin())->RepresentationIdentifier().get_value_or("") == "Reference")) { -// openings->push(rel); -// } -// } -// }); -// -// return openings; -// } -// -// const IfcSchema::IfcMaterial* IfcGeom::Kernel::get_single_material_association(const IfcSchema::IfcProduct* product) { -// IfcSchema::IfcMaterial* single_material = 0; -// IfcSchema::IfcRelAssociatesMaterial::list::ptr associated_materials = product->HasAssociations()->as(); -// if (associated_materials->size() == 1) { -// IfcSchema::IfcMaterialSelect* associated_material = (*associated_materials->begin())->RelatingMaterial(); -// single_material = associated_material->as(); -// -// // NB: IfcMaterialLayerSets are also considered, regardless of --enable-layerset-slicing. Picking -// // the first material (in accordance with other viewers) when layerset-slicing is disabled. -// if (!single_material && associated_material->as()) { -// IfcSchema::IfcMaterialLayerSet* layerset = associated_material->as()->ForLayerSet(); -// if (getValue(GV_LAYERSET_FIRST) > 0.0 ? layerset->MaterialLayers()->size() >= 1 : layerset->MaterialLayers()->size() == 1) { -// IfcSchema::IfcMaterialLayer* layer = (*layerset->MaterialLayers()->begin()); -// if (layer->Material()) { -// single_material = layer->Material(); -// } -// } -// } -// } -// return single_material; -// } -// -// IfcGeom::BRepElement* IfcGeom::Kernel::create_brep_for_representation_and_product( -// const IteratorSettings& settings, IfcSchema::IfcRepresentation* representation, IfcSchema::IfcProduct* product) -// { -// std::stringstream representation_id_builder; -// -// representation_id_builder << representation->data().id(); -// -// IfcGeom::Representation::BRep* shape; -// IfcGeom::ConversionResults shapes, shapes2; -// -// if (!convert_shapes(representation, shapes)) { -// return 0; -// } -// -// if (settings.get(IteratorSettings::APPLY_LAYERSETS)) { -// TopoDS_Shape merge; -// if (util::flatten_shape_list(shapes, merge, false, getValue(GV_PRECISION))) { -// if (util::count(merge, TopAbs_FACE) > 0) { -// std::vector thickness; -// std::vector layers; -// std::vector< std::vector > folded_layers; -// std::vector> styles; -// if (convert_layerset(product, layers, styles, thickness)) { -// -// IfcSchema::IfcRelAssociates::list::ptr associations = product->HasAssociations(); -// for (IfcSchema::IfcRelAssociates::list::it it = associations->begin(); it != associations->end(); ++it) { -// IfcSchema::IfcRelAssociatesMaterial* associates_material = (**it).as(); -// if (associates_material) { -// unsigned layerset_id = associates_material->RelatingMaterial()->data().id(); -// representation_id_builder << "-layerset-" << layerset_id; -// break; -// } -// } -// -// if (styles.size() > 1) { -// // If there's only a single layer there is no need to manipulate geometries. -// bool success = true; -// if (product->as() && fold_layers(product->as(), shapes, layers, thickness, folded_layers)) { -// if (util::apply_folded_layerset(shapes, folded_layers, styles, shapes2, getValue(GV_PRECISION))) { -// std::swap(shapes, shapes2); -// success = true; -// } -// } else { -// if (util::apply_layerset(shapes, layers, styles, shapes2, getValue(GV_PRECISION))) { -// std::swap(shapes, shapes2); -// success = true; -// } -// } -// -// if (!success) { -// Logger::Error("Failed processing layerset"); -// } -// } -// } -// } -// } -// } -// -// bool material_style_applied = false; -// -// const IfcSchema::IfcMaterial* single_material = get_single_material_association(product); -// if (single_material) { -// auto s = get_style(single_material); -// for (IfcGeom::ConversionResults::iterator it = shapes.begin(); it != shapes.end(); ++it) { -// if (!it->hasStyle() && s) { -// it->setStyle(s); -// material_style_applied = true; -// } -// } -// } else { -// bool some_items_without_style = false; -// for (IfcGeom::ConversionResults::iterator it = shapes.begin(); it != shapes.end(); ++it) { -// if (!it->hasStyle() && util::count(it->Shape(), TopAbs_FACE)) { -// some_items_without_style = true; -// break; -// } -// } -// if (some_items_without_style) { -// Logger::Warning("No material and surface styles for:", product); -// } -// } -// -// if (material_style_applied) { -// representation_id_builder << "-material-" << single_material->data().id(); -// } -// -// if (settings.force_space_transparency() >= 0. && product->declaration().is("IfcSpace")) { -// for (auto& s : shapes) { -// if (s.hasStyle()) { -// for (auto& p : style_cache) { -// if (p.second == s.StylePtr()) { -// std::const_pointer_cast(p.second)->Transparency() = settings.force_space_transparency(); -// } -// } -// } -// } -// } -// -// int parent_id = -1; -// try { -// IfcUtil::IfcBaseEntity* parent_object = get_decomposing_entity(product); -// if (parent_object && parent_object->as()) { -// parent_id = parent_object->data().id(); -// } -// } catch (const std::exception& e) { -// Logger::Error(e); -// } -// -// const std::string name = product->Name().get_value_or(""); -// const std::string guid = product->GlobalId(); -// -// gp_Trsf trsf; -// try { -// if (product->ObjectPlacement()) { -// convert(product->ObjectPlacement(), trsf); -// } -// } catch (const std::exception& e) { -// Logger::Error(e); -// } catch (...) { -// Logger::Error("Failed to construct placement"); -// } -// -// // Does the IfcElement have any IfcOpenings? -// // Note that openings for IfcOpeningElements are not processed -// IfcSchema::IfcRelVoidsElement::list::ptr openings = find_openings(product); -// -// const std::string product_type = product->declaration().name(); -// ElementSettings element_settings(settings, getValue(GV_LENGTH_UNIT), product_type); -// -// if (!settings.get(IfcGeom::IteratorSettings::DISABLE_OPENING_SUBTRACTIONS) && openings && openings->size()) { -// representation_id_builder << "-openings"; -// for (IfcSchema::IfcRelVoidsElement::list::it it = openings->begin(); it != openings->end(); ++it) { -// representation_id_builder << "-" << (*it)->data().id(); -// } -// -// IfcGeom::ConversionResults opened_shapes; -// bool caught_error = false; -// try { -// convert_openings(product, openings, shapes, trsf, opened_shapes); -// } catch (const std::exception& e) { -// Logger::Message(Logger::LOG_ERROR, std::string("Error processing openings for: ") + e.what() + ":", product); -// caught_error = true; -// } catch (...) { -// Logger::Message(Logger::LOG_ERROR, "Error processing openings for:", product); -// } -// -// if (caught_error && opened_shapes.size() < shapes.size()) { -// opened_shapes = shapes; -// } -// -// if (settings.get(IteratorSettings::USE_WORLD_COORDS)) { -// for (IfcGeom::ConversionResults::iterator it = opened_shapes.begin(); it != opened_shapes.end(); ++it) { -// it->prepend(trsf); -// } -// trsf = gp_Trsf(); -// representation_id_builder << "-world-coords"; -// } -// shape = new IfcGeom::Representation::BRep(element_settings, representation_id_builder.str(), opened_shapes); -// } else if (settings.get(IteratorSettings::USE_WORLD_COORDS)) { -// for (IfcGeom::ConversionResults::iterator it = shapes.begin(); it != shapes.end(); ++it) { -// it->prepend(trsf); -// } -// trsf = gp_Trsf(); -// representation_id_builder << "-world-coords"; -// shape = new IfcGeom::Representation::BRep(element_settings, representation_id_builder.str(), shapes); -// } else { -// shape = new IfcGeom::Representation::BRep(element_settings, representation_id_builder.str(), shapes); -// } -// -// std::string context_string = ""; -// if (representation->RepresentationIdentifier()) { -// context_string = *representation->RepresentationIdentifier(); -// } else if (representation->ContextOfItems()->ContextType()) { -// context_string = *representation->ContextOfItems()->ContextType(); -// } -// -// auto elem = new BRepElement( -// product->data().id(), -// parent_id, -// name, -// product_type, -// guid, -// context_string, -// trsf, -// boost::shared_ptr(shape), -// product -// ); -// -// if (settings.get(IteratorSettings::VALIDATE_QUANTITIES)) { -// auto rels = product->IsDefinedBy(); -// for (auto& rel : *rels) { -// if (rel->as()) { -// auto pdef = rel->as()->RelatingPropertyDefinition(); -// if (pdef->as()) { -// std::string organization_name; -// try { -// // A couple of files are not according to the schema here. -// organization_name = pdef->as()->OwnerHistory()->OwningApplication()->ApplicationDeveloper()->Name(); -// } catch (...) {} -// if (organization_name == "IfcOpenShell") { -// auto qs = pdef->as()->Quantities(); -// for (auto& q : *qs) { -// if (q->as() && q->Name() == "Total Surface Area") { -// double a_calc; -// double a_file = q->as()->AreaValue(); -// if (elem->geometry().calculate_surface_area(a_calc)) { -// double diff = std::abs(a_calc - a_file); -// if (diff / std::sqrt(a_file) > getValue(GV_PRECISION)) { -// Logger::Error("Validation of surface area failed for:", product); -// } else { -// Logger::Notice("Validation of surface area succeeded for:", product); -// } -// } else { -// Logger::Error("Validation of surface area failed for:", product); -// } -// } else if (q->as() && q->Name() == "Volume") { -// double v_calc; -// double v_file = q->as()->VolumeValue(); -// if (elem->geometry().calculate_volume(v_calc)) { -// double diff = std::abs(v_calc - v_file); -// if (diff / std::sqrt(v_file) > getValue(GV_PRECISION)) { -// Logger::Error("Validation of volume failed for:", product); -// } else { -// Logger::Notice("Validation of volume succeeded for:", product); -// } -// } else { -// Logger::Error("Validation of volume failed for:", product); -// } -// } else if (q->as() && q->Name() == "Shape Validation Properties") { -// auto qs2 = q->as()->HasQuantities(); -// bool all_succeeded = qs2->size() > 0; -// for (auto& q2 : *qs2) { -// if (q2->as() && q2->Name() == "Surface Genus" && q2->Description()) { -// int item_id = boost::lexical_cast((*q2->Description()).substr(1)); -// int genus = (int)q2->as()->CountValue(); -// for (auto& part : elem->geometry()) { -// if (part.ItemId() == item_id) { -// if (util::surface_genus(part.Shape()) != genus) { -// all_succeeded = false; -// } -// } -// } -// } -// } -// if (!all_succeeded) { -// Logger::Error("Validation of surface genus failed for:", product); -// } else { -// Logger::Notice("Validation of surface genus succeeded for:", product); -// } -// } -// } -// } -// } -// } -// } -// } -// -// return elem; -// } -// -// IfcSchema::IfcRepresentation* IfcGeom::Kernel::representation_mapped_to(const IfcSchema::IfcRepresentation* representation) { -// IfcSchema::IfcRepresentation* representation_mapped_to = 0; -// try { -// IfcSchema::IfcRepresentationItem::list::ptr items = representation->Items(); -// if (items->size() == 1) { -// IfcSchema::IfcRepresentationptr item = *items->begin(); -// if (item->declaration().is(IfcSchema::IfcMappedItem::Class())) { -// if (item->StyledByItem()->size() == 0) { -// IfcSchema::IfcMappedptr mapped_item = item->as(); -// if (is_identity_transform(mapped_item->MappingTarget())) { -// IfcSchema::IfcRepresentationMap* map = mapped_item->MappingSource(); -// if (is_identity_transform(map->MappingOrigin())) { -// representation_mapped_to = map->MappedRepresentation(); -// } -// } -// } -// } -// } -// } catch (const IfcParse::IfcException& e) { -// Logger::Error(e); -// // @todo reset representation_mapped_to to zero? -// } -// return representation_mapped_to; -// } -// -// IfcSchema::IfcProduct::list::ptr IfcGeom::Kernel::products_represented_by(const IfcSchema::IfcRepresentation* representation) { -// IfcSchema::IfcProduct::list::ptr products(new IfcSchema::IfcProduct::list); -// -// IfcSchema::IfcProductRepresentation::list::ptr prodreps = representation->OfProductRepresentation(); -// -// for (IfcSchema::IfcProductRepresentation::list::it it = prodreps->begin(); it != prodreps->end(); ++it) { -// // http://buildingsmart-tech.org/ifc/IFC2x3/TC1/html/ifcrepresentationresource/lexical/ifcproductrepresentation.htm -// // IFC2x Edition 3 NOTE Users should not instantiate the entity IfcProductRepresentation from IFC2x Edition 3 onwards. -// // It will be changed into an ABSTRACT supertype in future releases of IFC. -// -// // IfcProductRepresentation also lacks the INVERSE relation to IfcProduct -// // Let's find the IfcProducts that reference the IfcProductRepresentation anyway -// products->push((*it)->data().getInverse((&IfcSchema::IfcProduct::Class()), -1)->as()); -// } -// -// IfcSchema::IfcRepresentationMap::list::ptr maps = representation->RepresentationMap(); -// -// if (products->size() && maps->size()) { -// Logger::Warning("Representation used by IfcRepresentationMap and IfcProductDefinitionShape", representation); -// } -// -// if (prodreps->size() > 1) { -// Logger::Warning("Multiple IfcProductDefinitionShapes for representation", representation); -// } -// -// if (maps->size() > 1) { -// Logger::Warning("Multiple IfcRepresentationMaps for representation", representation); -// } -// -// if (maps->size() == 1) { -// IfcSchema::IfcRepresentationMap* map = *maps->begin(); -// if (is_identity_transform(map->MappingOrigin())) { -// IfcSchema::IfcMappedItem::list::ptr items = map->MapUsage(); -// for (IfcSchema::IfcMappedItem::list::it it = items->begin(); it != items->end(); ++it) { -// IfcSchema::IfcMappedptr item = *it; -// if (item->StyledByItem()->size() != 0) continue; -// -// if (!is_identity_transform(item->MappingTarget())) { -// continue; -// } -// -// IfcSchema::IfcRepresentation::list::ptr reps = item->data().getInverse((&IfcSchema::IfcRepresentation::Class()), -1)->as(); -// for (IfcSchema::IfcRepresentation::list::it jt = reps->begin(); jt != reps->end(); ++jt) { -// IfcSchema::IfcRepresentation* rep = *jt; -// if (rep->Items()->size() != 1) continue; -// IfcSchema::IfcProductRepresentation::list::ptr prodreps_mapped = rep->OfProductRepresentation(); -// for (IfcSchema::IfcProductRepresentation::list::it kt = prodreps_mapped->begin(); kt != prodreps_mapped->end(); ++kt) { -// IfcSchema::IfcProduct::list::ptr ps = (*kt)->data().getInverse((&IfcSchema::IfcProduct::Class()), -1)->as(); -// products->push(ps); -// } -// } -// } -// } -// } -// -// return products; -// } -// -// IfcGeom::BRepElement* IfcGeom::Kernel::create_brep_for_processed_representation( -// const IteratorSettings& /*settings*/, IfcSchema::IfcRepresentation* representation, IfcSchema::IfcProduct* product, -// IfcGeom::BRepElement* brep) -// { -// int parent_id = -1; -// try { -// IfcUtil::IfcBaseEntity* parent_object = get_decomposing_entity(product); -// if (parent_object && parent_object->as()) { -// parent_id = parent_object->data().id(); -// } -// } catch (const std::exception& e) { -// Logger::Error(e); -// } -// -// const std::string name = product->Name().get_value_or(""); -// const std::string guid = product->GlobalId(); -// -// gp_Trsf trsf; -// try { -// if (product->ObjectPlacement()) { -// convert(product->ObjectPlacement(), trsf); -// } -// } catch (const std::exception& e) { -// Logger::Error(e); -// } catch (...) { -// Logger::Error("Failed to construct placement"); -// } -// -// std::string context_string = ""; -// if (representation->RepresentationIdentifier()) { -// context_string = *representation->RepresentationIdentifier(); -// } else if (representation->ContextOfItems()->ContextType()) { -// context_string = *representation->ContextOfItems()->ContextType(); -// } -// -// const std::string product_type = product->declaration().name(); -// -// return new BRepElement( -// product->data().id(), -// parent_id, -// name, -// product_type, -// guid, -// context_string, -// trsf, -// brep->geometry_pointer(), -// product -// ); -// } -// -// bool IfcGeom::Kernel::convert_layerset(const IfcSchema::IfcProduct* product, std::vector& surfaces, std::vector>& styles, std::vector& thicknesses) { -// -// } -// -// bool IfcGeom::Kernel::find_wall_end_points(const IfcSchema::IfcWall* wall, gp_Pnt& start, gp_Pnt& end) { -// IfcSchema::IfcRepresentation* axis_representation = find_representation(wall, "Axis"); -// if (!axis_representation) { -// return false; -// } -// -// ConversionResults items; -// { -// Kernel temp = *this; -// temp.setValue(GV_DIMENSIONALITY, -1.); -// temp.convert_shapes(axis_representation, items); -// } -// -// TopoDS_Vertex a, b; -// for (ConversionResults::const_iterator it = items.begin(); it != items.end(); ++it) { -// TopExp_Explorer exp(it->Shape(), TopAbs_VERTEX); -// for (; exp.More(); exp.Next()) { -// b = TopoDS::Vertex(exp.Current()); -// if (a.IsNull()) { -// a = b; -// } -// } -// } -// -// if (a.IsNull() || b.IsNull()) { -// return false; -// } -// -// start = BRep_Tool::Pnt(a); -// end = BRep_Tool::Pnt(b); -// -// return true; -// } -// -// bool IfcGeom::Kernel::fold_layers(const IfcSchema::IfcWall* wall, const ConversionResults& items, const std::vector& surfaces, const std::vector& thicknesses, std::vector< std::vector >& result) { -// /* -// * @todo isn't it easier to do this based on the non-folded surfaces of -// * the connected walls and fold both pairs of layersets simultaneously? -// */ -// -// bool folds_made = false; -// -// IfcSchema::IfcRelConnectsPathElements::list::ptr connections(new IfcSchema::IfcRelConnectsPathElements::list); -// connections->push(wall->ConnectedFrom()->as()); -// connections->push(wall->ConnectedTo()->as()); -// -// typedef std::vector surfaces_t; -// typedef std::pair curve_on_surface; -// typedef std::vector curves_on_surfaces_t; -// typedef std::vector< std::pair< std::pair, const IfcSchema::IfcProduct*> > endpoint_connections_t; -// typedef std::vector< std::vector > result_t; -// endpoint_connections_t endpoint_connections; -// -// // Find the semantic connections to other wall elements when they are not connected 'AT_PATH' because -// // in that latter case no folds need to be made. -// for (IfcSchema::IfcRelConnectsPathElements::list::it it = connections->begin(); it != connections->end(); ++it) { -// IfcSchema::IfcRelConnectsPathElements* connection = *it; -// IfcSchema::IfcConnectionTypeEnum::Value own_type = connection->RelatedElement() == wall -// ? connection->RelatedConnectionType() -// : connection->RelatingConnectionType(); -// IfcSchema::IfcConnectionTypeEnum::Value other_type = connection->RelatedElement() == wall -// ? connection->RelatingConnectionType() -// : connection->RelatedConnectionType(); -// if (other_type != IfcSchema::IfcConnectionTypeEnum::IfcConnectionType_ATPATH && -// (own_type == IfcSchema::IfcConnectionTypeEnum::IfcConnectionType_ATEND || -// own_type == IfcSchema::IfcConnectionTypeEnum::IfcConnectionType_ATSTART)) { -// IfcSchema::IfcElement* other = connection->RelatedElement() == wall -// ? connection->RelatingElement() -// : connection->RelatedElement(); -// if (other->as()) { -// endpoint_connections.push_back(std::make_pair(std::make_pair(own_type, other_type), other)); -// } -// } -// } -// -// if (endpoint_connections.size() == 0) { -// return false; -// } -// -// // Count how many connections are made AT_START and AT_END respectively -// int connection_type_count[2] = { 0,0 }; -// for (endpoint_connections_t::const_iterator it = endpoint_connections.begin(); it != endpoint_connections.end(); ++it) { -// const int idx = it->first.first == IfcSchema::IfcConnectionTypeEnum::IfcConnectionType_ATSTART; -// connection_type_count[idx] ++; -// } -// -// gp_Trsf local; -// if (wall->ObjectPlacement()) { -// if (!convert(wall->ObjectPlacement(), local)) { -// return false; -// } -// } -// local.Invert(); -// -// { -// // Copy the unfolded surfaces -// result.resize(surfaces.size()); -// std::vector< std::vector >::iterator result_it = result.begin() + 1; -// std::vector::const_iterator input_it = surfaces.begin() + 1; -// for (; input_it != surfaces.end() - 1; ++result_it, ++input_it) { -// result_it->push_back(*input_it); -// } -// } -// -// const double total_thickness = std::accumulate(thicknesses.begin(), thicknesses.end(), 0.); -// -// gp_Pnt own_axis_start, own_axis_end; -// find_wall_end_points(wall, own_axis_start, own_axis_end); -// -// // Sometimes duplicate IfcRelConnectsPathElements exist. These are detected -// // and the counts of connections are decremented accordingly. -// for (int idx = 0; idx < 2; ++idx) { -// if (connection_type_count[idx] <= 1) { -// continue; -// } -// -// /* -// IfcSchema::IfcConnectionTypeEnum::Value connection_type = idx == 1 -// ? IfcSchema::IfcConnectionTypeEnum::IfcConnectionType_ATSTART -// : IfcSchema::IfcConnectionTypeEnum::IfcConnectionType_ATEND; -// */ -// -// std::set others; -// endpoint_connections_t::iterator it = endpoint_connections.begin(); -// while (it != endpoint_connections.end()) { -// const IfcSchema::IfcProduct* other = it->second; -// if (others.find(other) != others.end()) { -// it = endpoint_connections.erase(it); -// --connection_type_count[idx]; -// } else { -// others.insert(other); -// ++it; -// } -// } -// } -// -// // Check whether the end points are of the wall are really ~1 LayerThickness away from each other -// /* -// for (endpoint_connections_t::const_iterator it = endpoint_connections.begin(); it != endpoint_connections.end(); ++it) { -// IfcSchema::IfcConnectionTypeEnum::Value own_type = it->first.first; -// IfcSchema::IfcConnectionTypeEnum::Value other_type = it->first.second; -// -// gp_Pnt other_axis_start, other_axis_end; -// find_wall_end_points(it->second->as(), other_axis_start, other_axis_end); -// -// gp_Trsf other; -// if (!convert(it->second->ObjectPlacement(), other)) { -// continue; -// } -// -// other.Transforms(other_axis_start.ChangeCoord()); -// local.Transforms(other_axis_start.ChangeCoord()); -// other.Transforms(other_axis_end.ChangeCoord()); -// local.Transforms(other_axis_end.ChangeCoord()); -// -// const gp_Pnt& a = own_type == IfcSchema::IfcConnectionTypeEnum::IfcConnectionType_ATSTART -// ? own_axis_start -// : own_axis_end; -// -// const gp_Pnt& b = other_type == IfcSchema::IfcConnectionTypeEnum::IfcConnectionType_ATSTART -// ? other_axis_start -// : other_axis_end; -// -// const double d = a.Distance(b); -// } -// */ -// -// const double length_required = endpoint_connections.size() * total_thickness; -// // @todo this is not precisely the distance in case of curved walls. Also, it's safer -// // to first reproject the body onto the axis to get the precise curve parametrization -// // range. It's only a safeguard though, so can probably be approximated. -// const double axis_length = own_axis_start.Distance(own_axis_end); -// if (length_required > axis_length) { -// Logger::Warning("The wall axis is not long enough to accommodate the fold points"); -// return false; -// } -// -// for (endpoint_connections_t::const_iterator it = endpoint_connections.begin(); it != endpoint_connections.end(); ++it) { -// IfcSchema::IfcConnectionTypeEnum::Value connection_type = it->first.first; -// -// // If more than one wall connects to this start/end -point assume layers do not need to be folded -// const int idx = connection_type == IfcSchema::IfcConnectionTypeEnum::IfcConnectionType_ATSTART; -// if (connection_type_count[idx] > 1) continue; -// -// // Pick the corresponding point from the axis -// const gp_Pnt& own_end_point = connection_type == IfcSchema::IfcConnectionTypeEnum::IfcConnectionType_ATEND -// ? own_axis_end -// : own_axis_start; -// const IfcSchema::IfcProduct* other_wall = it->second; -// -// gp_Trsf other; -// if (other_wall->ObjectPlacement()) { -// if (!convert(other_wall->ObjectPlacement(), other)) { -// Logger::Error("Failed to convert placement", other_wall); -// continue; -// } -// } -// -// IfcSchema::IfcRepresentation* axis_representation = find_representation(other_wall, "Axis"); -// -// if (!axis_representation) { -// Logger::Warning("Joined wall has no axis representation", other_wall); -// continue; -// } -// -// ConversionResults axis_items; -// { -// Kernel temp = *this; -// temp.setValue(GV_DIMENSIONALITY, -1.); -// temp.convert_shapes(axis_representation, axis_items); -// } -// -// TopoDS_Shape axis_shape; -// util::flatten_shape_list(axis_items, axis_shape, false, getValue(GV_PRECISION)); -// -// // local and other are IfcLocalPlacements and therefore have a unit -// // scale factor that can be applied by means of TopoDS_Shape::Move() -// axis_shape.Move(other); -// axis_shape.Move(local); -// -// TopoDS_Shape body_shape; -// util::flatten_shape_list(items, body_shape, false, getValue(GV_PRECISION)); -// -// // Create a single paremetric range over a single curve -// // that represents the entire 1d domain of the other wall -// // Sometimes there are multiple edges in the Axis shape -// // but it is assumed these are colinear. -// Handle_Geom_Curve other_axis_curve; -// double axis_u1, axis_u2; -// { -// TopExp_Explorer exp(axis_shape, TopAbs_EDGE); -// if (!exp.More()) { -// return false; -// } -// -// TopoDS_Edge axis_edge = TopoDS::Edge(exp.Current()); -// other_axis_curve = BRep_Tool::Curve(axis_edge, axis_u1, axis_u2); -// -// gp_Pnt other_a_1, other_a_2; -// other_axis_curve->D0(axis_u1, other_a_1); -// other_axis_curve->D0(axis_u2, other_a_2); -// -// if (axis_u2 < axis_u1) { -// std::swap(axis_u1, axis_u2); -// } -// exp.Next(); -// -// for (; exp.More(); exp.Next()) { -// TopoDS_Edge axis_edge2 = TopoDS::Edge(exp.Current()); -// TopExp_Explorer exp2(axis_edge2, TopAbs_VERTEX); -// for (; exp2.More(); exp2.Next()) { -// gp_Pnt p = BRep_Tool::Pnt(TopoDS::Vertex(exp2.Current())); -// gp_Pnt pp; -// double u, d; -// if (util::project(other_axis_curve, p, pp, u, d)) { -// if (u < axis_u1) axis_u1 = u; -// if (u > axis_u2) axis_u2 = u; -// } -// } -// } -// } -// -// double layer_offset = 0; -// -// std::vector::const_iterator thickness = thicknesses.begin(); -// result_t::iterator result_vector = result.begin() + 1; -// -// // nb The first layer is never folded, because it corresponds -// // to one of the longitudinal faces of the wall. Hence the +1 -// for (surfaces_t::const_iterator jt = surfaces.begin() + 1; jt != surfaces.end() - 1; ++jt, ++result_vector) { -// layer_offset += *thickness++; -// -// bool found_intersection = false, parallel = false; -// boost::optional point_outside_param_range; -// -// const Handle_Geom_Surface& surface = *jt; -// -// // Find the intersection point between the layerset surface -// // and the other axis curve. If it's within the parametric -// // range of the other wall it means the walls are connected -// // with an angle. -// GeomAPI_IntCS intersections(other_axis_curve, surface); -// if (intersections.IsDone() && intersections.NbPoints() == 1) { -// const gp_Pnt& p = intersections.Point(1); -// -// double u, v, w; -// intersections.Parameters(1, u, v, w); -// -// gp_Pnt Pc, Ps; -// gp_Vec Vc, Vs1, Vs2; -// other_axis_curve->D1(w, Pc, Vc); -// surface->D1(u, v, Ps, Vs1, Vs2); -// Vs1.Cross(Vs2); -// -// if (Vs1.IsNormal(Vc, 1.e-5)) { -// Logger::Warning("Connected walls are parallel"); -// parallel = true; -// } else if (w < axis_u1 || w > axis_u2) { -// point_outside_param_range = p; -// } else { -// // Found an intersection. Layer end point is covered by connecting wall -// found_intersection = true; -// break; -// } -// } -// -// if (!parallel && !found_intersection && point_outside_param_range) { -// -// /* -// Is there a bug in Open Cascade related to the intersection -// of offset surfaces constructed from linear extrusions? -// Handle_Geom_Surface xy = new Geom_Plane(gp::Origin(), gp::DZ()); -// // Handle_Geom_Surface yz = new Geom_Plane(gp::Origin(), gp::DX()); -// // Handle_Geom_Surface yz2 = new Geom_OffsetSurface(yz, 1.); -// Handle_Geom_Curve ln = new Geom_Line(gp::Origin(), gp::DX()); -// Handle_Geom_Surface yz = new Geom_SurfaceOfLinearExtrusion(ln, gp::DZ()); -// Handle_Geom_Surface yz2 = new Geom_OffsetSurface(yz, 1.); -// intersect(xy, yz2); -// */ -// -// Handle_Geom_Surface plane = new Geom_Plane(*point_outside_param_range, gp::DZ()); -// -// // vertical edges at wall end point face. -// curves_on_surfaces_t layer_ends; -// util::intersect(surface, body_shape, layer_ends); -// -// Handle_Geom_Curve layer_body_intersection; -// Handle_Geom_Surface body_surface; -// double mind = std::numeric_limits::infinity(); -// for (curves_on_surfaces_t::const_iterator kt = layer_ends.begin(); kt != layer_ends.end(); ++kt) { -// gp_Pnt p; -// gp_Vec v; -// double u, d; -// kt->second->D1(0., p, v); -// if (ALMOST_THE_SAME(0., v.Dot(gp::DZ()))) { -// // Filter horizontal curves -// continue; -// } -// // Find vertical wall end point edge closest to end point associated with semantic connection -// if (util::project(kt->second, own_end_point, p, u, d)) { -// // In addition to closest, there is a length threshold based on thickness. -// // @todo ideally, first, the point closest to end-point is selected, and -// // after that the parallel check is performed. But threshold probably -// // functions good enough. -// if (d < total_thickness * 3 && d < mind) { -// GeomAdaptor_Curve GAC(other_axis_curve); -// GeomAdaptor_Surface GAS(kt->first); -// -// Extrema_ExtCS x(GAC, GAS, getValue(GV_PRECISION), getValue(GV_PRECISION)); -// -// if (x.IsParallel()) { -// body_surface = kt->first; -// layer_body_intersection = kt->second; -// mind = d; -// } -// } -// } -// } -// -// if (body_surface.IsNull()) { -// continue; -// } -// -// // Intersect vertical edge with ground plane for point. -// GeomAPI_IntCS intersection2(layer_body_intersection, plane); -// if (intersection2.IsDone() && intersection2.NbPoints() == 1) { -// const gp_Pnt& layer_end_point = intersection2.Point(1); -// -// // Intersect layerset surface with ground plane -// GeomAPI_IntSS intersection3(surface, plane, 1.e-7); -// if (intersection3.IsDone() && intersection3.NbLines() == 1) { -// Handle_Geom_Curve layer_line = intersection3.Line(1); -// GeomAdaptor_Curve layer_line_adaptor(layer_line); -// ShapeAnalysis_Curve sac; -// gp_Pnt layer_end_point_projected; double layer_end_point_param; -// sac.Project(layer_line, layer_end_point, 1e-3, layer_end_point_projected, layer_end_point_param, false); -// -// // Move point inwards by distance from other layerset -// GCPnts_AbscissaPoint dst(layer_line_adaptor, layer_offset, layer_end_point_param); -// if (dst.IsDone()) { -// // Convert parameter to point -// gp_Pnt layer_fold_point; -// layer_line->D0(dst.Parameter(), layer_fold_point); -// -// GeomAPI_IntSS intersection4(body_surface, plane, 1.e-7); -// if (intersection4.IsDone() && intersection4.NbLines() == 1) { -// Handle_Geom_Curve body_trim_curve = intersection4.Line(1); -// ShapeAnalysis_Curve sac2; -// gp_Pnt layer_fold_point_projected; double layer_fold_point_param; -// sac2.Project(body_trim_curve, layer_fold_point, 1.e-7, layer_fold_point_projected, layer_fold_point_param, false); -// Handle_Geom_Curve fold_curve = new Geom_OffsetCurve(body_trim_curve->Reversed(), layer_fold_point_projected.Distance(layer_fold_point), gp::DZ()); -// -// Handle_Geom_Surface fold_surface = new Geom_SurfaceOfLinearExtrusion(fold_curve, gp::DZ()); -// result_vector->push_back(fold_surface); -// folds_made = true; -// } -// } -// } -// } -// -// } -// -// } -// } -// -// return folds_made; -// } -// -// IfcSchema::IfcRepresentation* IfcGeom::Kernel::find_representation(const IfcSchema::IfcProduct* product, const std::string& identifier) { -// if (!product->Representation()) return 0; -// IfcSchema::IfcProductRepresentation* prod_rep = product->Representation(); -// IfcSchema::IfcRepresentation::list::ptr reps = prod_rep->Representations(); -// for (IfcSchema::IfcRepresentation::list::it it = reps->begin(); it != reps->end(); ++it) { -// if ((**it).RepresentationIdentifier() && (*(**it).RepresentationIdentifier()) == identifier) { -// return *it; -// } -// } -// return 0; -// } -// -// const IfcSchema::IfcRepresentationptr IfcGeom::Kernel::find_item_carrying_style(const IfcSchema::IfcRepresentationptr item) { -// if (item->StyledByItem()->size()) { -// return item; -// } -// -// while (item->declaration().is(IfcSchema::IfcBooleanResult::Class())) { -// // All instantiations of IfcBooleanOperand (type of FirstOperand) are subtypes of -// // IfcGeometricRepresentationItem -// item = item->as()->FirstOperand()->as(); -// if (item && item->StyledByItem()->size()) { -// return item; -// } -// } -// -// // TODO: Ideally this would be done for other entities (such as IfcCsgSolid) as well. -// // But neither are these very prevalent, nor does the current IfcOpenShell style -// // mechanism enable to conveniently style subshapes, which would be necessary for -// // distinctly styled union operands. -// -// return item; -// } -// -// bool IfcGeom::Kernel::is_identity_transform(IfcUtil::IfcBaseInterface* l) { -// IfcSchema::IfcAxis2Placement2D* ax2d; -// IfcSchema::IfcAxis2Placement3D* ax3d; -// -// IfcSchema::IfcCartesianTransformationOperator2D* op2d; -// IfcSchema::IfcCartesianTransformationOperator3D* op3d; -// IfcSchema::IfcCartesianTransformationOperator2DnonUniform* op2dnonu; -// IfcSchema::IfcCartesianTransformationOperator3DnonUniform* op3dnonu; -// -// if ((op2dnonu = l->as()) != 0) { -// gp_GTrsf2d gtrsf2d; -// convert(op2dnonu, gtrsf2d); -// return gtrsf2d.Form() == gp_Identity; -// } else if ((op2d = l->as()) != 0) { -// gp_Trsf2d trsf2d; -// convert(op2d, trsf2d); -// return trsf2d.Form() == gp_Identity; -// } else if ((op3dnonu = l->as()) != 0) { -// gp_GTrsf gtrsf; -// convert(op3dnonu, gtrsf); -// return gtrsf.Form() == gp_Identity; -// } else if ((op3d = l->as()) != 0) { -// gp_Trsf trsf; -// convert(op3d, trsf); -// return trsf.Form() == gp_Identity; -// } else if ((ax2d = l->as()) != 0) { -// gp_Trsf2d trsf2d; -// convert(ax2d, trsf2d); -// return trsf2d.Form() == gp_Identity; -// } else if ((ax3d = l->as()) != 0) { -// gp_Trsf trsf; -// convert(ax3d, trsf); -// return trsf.Form() == gp_Identity; -// } else { -// throw IfcParse::IfcException("Invalid valuation for IfcAxis2Placement / IfcCartesianTransformationOperator"); -// } -// } -// -// void IfcGeom::Kernel::set_conversion_placement_rel_to_type(const IfcParse::declaration* type) { -// placement_rel_to_type_ = type; -// } -// -// void IfcGeom::Kernel::set_conversion_placement_rel_to_instance(const IfcUtil::IfcBaseEntity* instance) { -// placement_rel_to_instance_ = instance; -// } -// -// -// namespace { -// -// bool process_colour(IfcSchema::IfcColourRgb* colour, double* rgb) { -// if (colour != 0) { -// rgb[0] = colour->Red(); -// rgb[1] = colour->Green(); -// rgb[2] = colour->Blue(); -// } -// return colour != 0; -// } -// -// bool process_colour(IfcSchema::IfcNormalisedRatioMeasure* factor, double* rgb) { -// if (factor != 0) { -// const double f = *factor; -// rgb[0] = rgb[1] = rgb[2] = f; -// } -// return factor != 0; -// } -// -// bool process_colour(IfcSchema::IfcColourOrFactor* colour_or_factor, double* rgb) { -// if (colour_or_factor == 0) { -// return false; -// } else if (colour_or_factor->declaration().is(IfcSchema::IfcColourRgb::Class())) { -// return process_colour(static_cast(colour_or_factor), rgb); -// } else if (colour_or_factor->declaration().is(IfcSchema::IfcNormalisedRatioMeasure::Class())) { -// return process_colour(static_cast(colour_or_factor), rgb); -// } else { -// return false; -// } -// } -// -// } -// -// #define Kernel POSTFIX_SCHEMA(Kernel) -// -// std::shared_ptr IfcGeom::Kernel::internalize_surface_style(const std::pair& shading_styles) { -// if (shading_styles.second == 0) { -// return 0; -// } -// int surface_style_id = shading_styles.first->data().id(); -// auto it = style_cache.find(surface_style_id); -// if (it != style_cache.end()) { -// return it->second; -// } -// -// -// IfcSchema::IfcSurfaceStyle* style = shading_styles.first->as(); -// IfcSchema::IfcSurfaceStyleShading* shading = shading_styles.second->as(); -// -// std::shared_ptr surface_style_ptr; -// -// if (style->Name()) { -// surface_style_ptr.reset(new SurfaceStyle(surface_style_id, *style->Name())); -// } else { -// surface_style_ptr.reset(new SurfaceStyle(surface_style_id)); -// } -// -// std::shared_ptr surface_style_ptr_const = std::const_pointer_cast(surface_style_ptr); -// SurfaceStyle& surface_style = *surface_style_ptr; -// -// double rgb[3]; -// if (process_colour(shading->SurfaceColour(), rgb)) { -// surface_style.Diffuse().reset(SurfaceStyle::ColorComponent(rgb[0], rgb[1], rgb[2])); -// } -// if (shading_styles.second->declaration().is(IfcSchema::IfcSurfaceStyleRendering::Class())) { -// IfcSchema::IfcSurfaceStyleRendering* rendering_style = static_cast(shading_styles.second); -// if (rendering_style->DiffuseColour() && process_colour(rendering_style->DiffuseColour(), rgb)) { -// SurfaceStyle::ColorComponent diffuse = surface_style.Diffuse().get_value_or(SurfaceStyle::ColorComponent(1, 1, 1)); -// surface_style.Diffuse().reset(SurfaceStyle::ColorComponent(diffuse.R() * rgb[0], diffuse.G() * rgb[1], diffuse.B() * rgb[2])); -// } -// if (rendering_style->DiffuseTransmissionColour()) { -// // Not supported -// } -// if (rendering_style->ReflectionColour()) { -// // Not supported -// } -// if (rendering_style->SpecularColour() && process_colour(rendering_style->SpecularColour(), rgb)) { -// surface_style.Specular().reset(SurfaceStyle::ColorComponent(rgb[0], rgb[1], rgb[2])); -// } -// if (rendering_style->SpecularHighlight()) { -// IfcSchema::IfcSpecularHighlightSelect* highlight = rendering_style->SpecularHighlight(); -// if (highlight->declaration().is(IfcSchema::IfcSpecularRoughness::Class())) { -// double roughness = *((IfcSchema::IfcSpecularRoughness*)highlight); -// if (roughness >= 1e-9) { -// surface_style.Specularity().reset(1.0 / roughness); -// } -// } else if (highlight->declaration().is(IfcSchema::IfcSpecularExponent::Class())) { -// surface_style.Specularity().reset(*((IfcSchema::IfcSpecularExponent*)highlight)); -// } -// } -// if (rendering_style->TransmissionColour()) { -// // Not supported -// } -// if (rendering_style->Transparency()) { -// const double d = *rendering_style->Transparency(); -// surface_style.Transparency().reset(d); -// } -// } -// return style_cache[surface_style_id] = surface_style_ptr_const; -// } -// -// std::shared_ptr IfcGeom::Kernel::get_style(const IfcSchema::IfcRepresentationptr item) { -// return internalize_surface_style(get_surface_style(item)); -// } -// -// std::shared_ptr IfcGeom::Kernel::get_style(const IfcSchema::IfcMaterial* material) { -// IfcSchema::IfcMaterialDefinitionRepresentation::list::ptr defs = material->HasRepresentation(); -// for (IfcSchema::IfcMaterialDefinitionRepresentation::list::it jt = defs->begin(); jt != defs->end(); ++jt) { -// IfcSchema::IfcRepresentation::list::ptr reps = (*jt)->Representations(); -// IfcSchema::IfcStyledItem::list::ptr styles(new IfcSchema::IfcStyledItem::list); -// for (IfcSchema::IfcRepresentation::list::it it = reps->begin(); it != reps->end(); ++it) { -// styles->push((**it).Items()->as()); -// } -// for (IfcSchema::IfcStyledItem::list::it it = styles->begin(); it != styles->end(); ++it) { -// const std::pair ss = get_surface_style(*it); -// if (ss.second) { -// return internalize_surface_style(ss); -// } -// } -// } -// auto material_style = std::make_shared(material->data().id(), material->Name()); -// return style_cache[material->data().id()] = material_style; -// } -// -// void IfcGeom::Kernel::apply_layerset(IfcGeom::ConversionResults& r, const ifcopenshell::geometry::layerset_information& info) { -// convert(info.layers); -// -// if (info.layers.empty()) { -// return; -// } -// -// if (axis_curve->DynamicType() == STANDARD_TYPE(Geom_Line)) { -// Handle_Geom_Line axis_line = Handle_Geom_Line::DownCast(axis_curve); -// // @todo note that this creates an offset into the wrong order, the cross product arguments should be -// // reversed. This causes some inversions later on, e.g. if(positive) { reverse(); } -// reference_surface = new Geom_Plane(axis_line->Lin().Location(), axis_line->Lin().Direction() ^ gp::DZ()); -// } else if (axis_curve->DynamicType() == STANDARD_TYPE(Geom_Circle)) { -// // @todo note that in this branch this inversion does not seem to take place. -// Handle_Geom_Circle axis_line = Handle_Geom_Circle::DownCast(axis_curve); -// reference_surface = new Geom_CylindricalSurface(axis_li->Position(), axis_line->Radius()); -// } else { -// Logger::Message(Logger::LOG_ERROR, "Unsupported underlying curve of Axis representation:", product); -// return false; -// } -// -// IfcGeom::ConversionResults r2; -// if (IfcGeom::util::apply_layerset(r, const std::vector&, ConversionResults& r2, double tol)) { -// std::swap(r, r2) -// } -// } \ No newline at end of file diff --git a/src/ifcgeom/kernels/opencascade/OpenCascadeKernel.h b/src/ifcgeom/kernels/opencascade/OpenCascadeKernel.h index 61b1a2c548d..add0c15a255 100644 --- a/src/ifcgeom/kernels/opencascade/OpenCascadeKernel.h +++ b/src/ifcgeom/kernels/opencascade/OpenCascadeKernel.h @@ -56,6 +56,21 @@ #include "../../../ifcgeom/taxonomy.h" #include "../../../ifcgeom/ConversionSettings.h" +namespace { +template +bool handle_occt_exception(Fn&& fn) { + try { + return std::forward(fn)(); + } catch (const Standard_Failure& e) { + if (e.GetMessageString() && strlen(e.GetMessageString())) { + throw std::runtime_error(e.GetMessageString()); + } else { + throw std::runtime_error("Unknown error creating geometry"); + } + } +} +} + namespace IfcGeom { class IFC_GEOMLIBRARY_API OpenCascadeKernel : public ifcopenshell::geometry::kernels::AbstractKernel { diff --git a/src/ifcgeom/kernels/opencascade/boolean_result.cpp b/src/ifcgeom/kernels/opencascade/boolean_result.cpp index 6750108a90b..64b65f5f2a2 100644 --- a/src/ifcgeom/kernels/opencascade/boolean_result.cpp +++ b/src/ifcgeom/kernels/opencascade/boolean_result.cpp @@ -84,6 +84,7 @@ namespace { } bool OpenCascadeKernel::convert_impl(const taxonomy::boolean_result::ptr br, ConversionResults& results) { + return handle_occt_exception([&]() -> bool { bool valid_result = false; bool first = true; const double tol = settings_.get().get(); @@ -196,4 +197,5 @@ bool OpenCascadeKernel::convert_impl(const taxonomy::boolean_result::ptr br, Con )); return true; + }); } diff --git a/src/ifcgeom/kernels/opencascade/boolean_utils.cpp b/src/ifcgeom/kernels/opencascade/boolean_utils.cpp index 975ee00d0de..d41f1e4adfe 100644 --- a/src/ifcgeom/kernels/opencascade/boolean_utils.cpp +++ b/src/ifcgeom/kernels/opencascade/boolean_utils.cpp @@ -1134,6 +1134,8 @@ bool IfcGeom::util::boolean_operation(const boolean_settings& settings, const To #endif builder->SetFuzzyValue(fuzz); builder->SetArguments(s1s); + // We use our own multi-threading in ifcopenshell on a per-product basis + builder->SetRunParallel(false); copy_operand(b, b_tmp); std::swap(b, b_tmp); builder->SetTools(b); diff --git a/src/ifcgeom/kernels/opencascade/extrusion.cpp b/src/ifcgeom/kernels/opencascade/extrusion.cpp index b1152a4158b..631c382bf83 100644 --- a/src/ifcgeom/kernels/opencascade/extrusion.cpp +++ b/src/ifcgeom/kernels/opencascade/extrusion.cpp @@ -72,6 +72,8 @@ bool OpenCascadeKernel::convert(const taxonomy::extrusion::ptr extrusion, TopoDS } bool OpenCascadeKernel::convert_impl(const taxonomy::extrusion::ptr extrusion, IfcGeom::ConversionResults& results) { + return handle_occt_exception([&]() -> bool { + TopoDS_Shape shape; if (!convert(extrusion, shape)) { return false; @@ -84,4 +86,6 @@ bool OpenCascadeKernel::convert_impl(const taxonomy::extrusion::ptr extrusion, I extrusion->surface_style )); return true; + + }); } diff --git a/src/ifcgeom/kernels/opencascade/face.cpp b/src/ifcgeom/kernels/opencascade/face.cpp index b2313487c18..661b725c1df 100644 --- a/src/ifcgeom/kernels/opencascade/face.cpp +++ b/src/ifcgeom/kernels/opencascade/face.cpp @@ -599,6 +599,8 @@ bool OpenCascadeKernel::convert(const taxonomy::face::ptr face, TopoDS_Shape& re } bool OpenCascadeKernel::convert_impl(const taxonomy::face::ptr face, IfcGeom::ConversionResults& results) { + return handle_occt_exception([&]() -> bool { + TopoDS_Shape shape; if (!convert(face, shape)) { return false; @@ -609,4 +611,6 @@ bool OpenCascadeKernel::convert_impl(const taxonomy::face::ptr face, IfcGeom::Co face->surface_style )); return true; + + }); } diff --git a/src/ifcgeom/kernels/opencascade/loft.cpp b/src/ifcgeom/kernels/opencascade/loft.cpp index 188150b6147..719e089278a 100644 --- a/src/ifcgeom/kernels/opencascade/loft.cpp +++ b/src/ifcgeom/kernels/opencascade/loft.cpp @@ -27,12 +27,34 @@ #include #include #include +#include using namespace ifcopenshell::geometry; using namespace ifcopenshell::geometry::kernels; using namespace IfcGeom; using namespace IfcGeom::util; +// @todo duplicated +namespace { +template > +bool has_intersection(const std::set& A, + const std::set& B) { + auto itA = A.begin(); + auto itB = B.begin(); + + while (itA != A.end() && itB != B.end()) { + if (Cmp()(*itA, *itB)) { + ++itA; + } else if (Cmp()(*itB, *itA)) { + ++itB; + } else { + return true; + } + } + return false; +} +} + bool OpenCascadeKernel::convert(const taxonomy::loft::ptr loft, TopoDS_Shape& result) { if (loft->children.size() < 2) { return false; @@ -60,49 +82,79 @@ bool OpenCascadeKernel::convert(const taxonomy::loft::ptr loft, TopoDS_Shape& re } if (non_polygonal) { - if (loft->children.size() == 2) { - BRep_Builder BB; - TopoDS_Shell comp; - BB.MakeShell(comp); + if (loft->children.size() < 2) { + Logger::Error("Not enough sections to loft"); + return false; + } + + std::vector> sections; + sections.reserve(loft->children.size()); + + TopoDS_Shape f0, f1; + + // Convert all children to vectors of wires + for (const auto& child : loft->children) { + TopoDS_Shape shape; + if (!convert(std::static_pointer_cast(child), shape)) { + return false; + } + if (shape.ShapeType() != TopAbs_FACE) { + return false; + } + // At least make sure to have outer wire consistent, but in reality + // this is probably not a concern given how to build up these faces + auto f = TopoDS::Face(shape); + + if (child == loft->children.front()) { + f0 = f; + } else if (child == loft->children.back()) { + f1 = f; + } + auto outer = BRepTools::OuterWire(f); + sections.emplace_back(); + sections.back().push_back(outer); + for (TopoDS_Iterator it(f); it.More(); it.Next()) { + if (outer != it.Value()) { + sections.back().push_back(TopoDS::Wire(it.Value())); + } + } + } - TopoDS_Shape f0, f1; - if (!convert(std::static_pointer_cast(loft->children.front()), f0) || - !convert(std::static_pointer_cast(loft->children.back()), f1)) - { + auto first_wire_count = sections.front().size(); + for (auto& section : sections) { + if (section.size() != first_wire_count) { + Logger::Error("Inconsistent number of wires in sections"); return false; } - if (f0.ShapeType() != TopAbs_FACE || f1.ShapeType() != TopAbs_FACE) { + } + + BRep_Builder BB; + TopoDS_Shell comp; + BB.MakeShell(comp); + + for (size_t i = 0; i < first_wire_count; ++i) { + // Rule=True uses linear interpolation. + // This is critical for preventing twists in roads/railings. + BRepOffsetAPI_ThruSections builder(false, true); + for (auto& ws : sections) { + builder.AddWire(ws[i]); + } + builder.Build(); + if (!builder.IsDone()) { return false; } - - TopExp_Explorer exp1(f0, TopAbs_WIRE); - TopExp_Explorer exp2(f1, TopAbs_WIRE); - for (; exp1.More() && exp2.More(); exp1.Next(), exp2.Next()) { - const auto& w1 = TopoDS::Wire(exp1.Current()); - const auto& w2 = TopoDS::Wire(exp2.Current()); - BRepOffsetAPI_ThruSections builder; - builder.AddWire(w1); - builder.AddWire(w2); - builder.Build(); - if (!builder.IsDone()) { - return false; - } - for (TopExp_Explorer exp(builder.Shape(), TopAbs_FACE); exp.More(); exp.Next()) { - BB.Add(comp, exp.Current()); - } + for (TopExp_Explorer exp(builder.Shape(), TopAbs_FACE); exp.More(); exp.Next()) { + BB.Add(comp, exp.Current()); } + } - BB.Add(comp, f0.Reversed()); - BB.Add(comp, f1); + BB.Add(comp, f0.Reversed()); + BB.Add(comp, f1); - result = BRepBuilderAPI_MakeSolid(comp).Solid(); + result = BRepBuilderAPI_MakeSolid(comp).Solid(); - return true; - } else { - Logger::Error("Lofting more than two sections is not supported"); - return false; - } + return true; } TopTools_ListOfShape faces; @@ -110,37 +162,130 @@ bool OpenCascadeKernel::convert(const taxonomy::loft::ptr loft, TopoDS_Shape& re BRep_Builder BB; BB.MakeCompound(comp); - // @todo this approach is - // potentially incorrect as there is no guarantee that the wires for - // subsequently placed profiles are traversed from an equivalent start vertex. + std::vector shps(loft->children.size()); + std::vector>> all_tags; + + // First convert all taxonomy items to TopoDS_Wire/Face + for (auto it = loft->children.begin(); it < loft->children.end(); ++it) { + auto i = std::distance(loft->children.begin(), it); + if ((*it)->kind() == taxonomy::FACE) { + if (!convert(std::static_pointer_cast((*it)), shps[i])) { + return false; + } + } + if ((*it)->kind() == taxonomy::LOOP) { + + // @todo duplicated with infra_sweep_helper + // I think make_loft() where should just return a shell instead, because + // this faceted lofting does not depend on any functionality in the geometry library + // and the branching with tags needs to be solved twice otherwise + auto loop_to_points = [](const taxonomy::loop::ptr& loop, const boost::optional>& input_tags) -> std::pair, std::vector>> { + std::vector points; + std::vector> tags; + std::vector::const_iterator tag_it; + + if (!loop->closed.get_value_or(false)) { + points = {boost::get(loop->children[0]->start)}; + if (input_tags) { + tags = {{input_tags->front()}}; + tag_it = ++input_tags->begin(); + } + } + for (auto& e : loop->children) { + const auto& p1 = boost::get(e->start); + const auto& p2 = boost::get(e->end); + if (input_tags && p1->ccomponents() == p2->ccomponents()) { + tags.back().insert(*tag_it); + ++tag_it; + } else { + points.push_back(p2); + if (input_tags) { + tags.emplace_back(); + tags.back().insert(*tag_it); + ++tag_it; + } + } + } + if (!input_tags) { + if (loop->closed.get_value_or(false)) { + // close polygon by referencing first point + points.push_back(points.front()); + } + } + return {points, tags}; + }; + + auto lp = std::static_pointer_cast(*it); + TopoDS_Wire w; + + if (lp->tags) { + auto [points, tags] = loop_to_points(lp, lp->tags); + BRepBuilderAPI_MakePolygon mp; + for (auto& p : points) { + const auto& xyz = p->ccomponents(); + mp.Add(gp_Pnt(xyz(0), xyz(1), xyz(2))); + } + w = mp.Wire(); + + if (lp->matrix && !lp->matrix->is_identity()) { + const auto& m = lp->matrix->ccomponents(); + gp_Trsf tr; + tr.SetValues( + m(0, 0), m(0, 1), m(0, 2), m(0, 3), m(1, 0), m(1, 1), m(1, 2), m(1, 3), m(2, 0), m(2, 1), m(2, 2), m(2, 3)); + w = TopoDS::Wire(BRepBuilderAPI_Transform(w, tr).Shape()); + } + + all_tags.push_back(tags); + } else { + if (!convert(std::static_pointer_cast((*it)), w)) { + return false; + } + } + + shps[i] = w; + } + if (shps[i].ShapeType() != TopAbs_FACE && shps[i].ShapeType() != TopAbs_WIRE) { + return false; + } + } + + /* + // With --dimensionality CURVES_SURFACES_AND_SOLIDS this will give the interpolated profiles as line geometry + { + for (auto& f : shps) { + BB.Add(comp, f); + } + } + result = comp; + return true; + */ - for (auto it = loft->children.begin(); it < loft->children.end() - 1; ++it) { + if (shps.size() < 2) { + Logger::Error("Not enough sections to loft"); + return false; + } + + if (shps[0].ShapeType() == TopAbs_FACE) { + // When processing a sectioned *surface* there are no + // begin and end caps that need to be added. + BB.Add(comp, shps.front().Reversed()); + BB.Add(comp, shps.back()); + } + + // @todo this approach is + // potentially incorrect as there is no guarantee that the wires for + // subsequently placed profiles are traversed from an equivalent start vertex. + for (auto it = shps.begin(); it < shps.end() - 1; ++it) { + auto ii = std::distance(shps.begin(), it); auto jt = it + 1; - std::array fa = { *it, *jt }; - std::array shps; + std::array::const_iterator, 2> fa = { it, jt }; std::vector> ws; ws.emplace_back(); for (int i = 0; i < 2; ++i) { - if (fa[i]->kind() == taxonomy::FACE) { - if (!convert(std::static_pointer_cast(fa[i]), shps[i])) { - return false; - } - } - if (fa[i]->kind() == taxonomy::LOOP) { - TopoDS_Wire w; - if (!convert(std::static_pointer_cast(fa[i]), w)) { - return false; - } - shps[i] = w; - } - if (shps[i].ShapeType() != TopAbs_FACE && shps[i].ShapeType() != TopAbs_WIRE) { - return false; - } - - if (shps[i].ShapeType() == TopAbs_FACE) { - ws[0][i] = BRepTools::OuterWire(TopoDS::Face(shps[i])); + if (fa[i]->ShapeType() == TopAbs_FACE) { + ws[0][i] = BRepTools::OuterWire(TopoDS::Face(*fa[i])); size_t j = 1; - for (TopExp_Explorer exp(shps[i], TopAbs_WIRE); exp.More(); exp.Next()) { + for (TopExp_Explorer exp(*fa[i], TopAbs_WIRE); exp.More(); exp.Next()) { if (exp.Current() != ws[0][i]) { while (ws.size() <= j) { ws.emplace_back(); @@ -149,21 +294,97 @@ bool OpenCascadeKernel::convert(const taxonomy::loft::ptr loft, TopoDS_Shape& re } } } else { - ws[0][i] = TopoDS::Wire(shps[i]); + ws[0][i] = TopoDS::Wire(*fa[i]); } } - if (shps[0].ShapeType() == TopAbs_FACE) { - // When processing a sectioned *surface* there are no - // begin and end caps that need to be added. - if (it == loft->children.begin()) { - // faces.Append(shps[0]); - BB.Add(comp, shps[0]); + + if (!all_tags.empty()) { + // only open profiles have tags for now, so there is only one wire, no inner wires + const auto& wp = ws[0]; + std::array, 2> profile_points; + std::array>>::const_iterator, 2> tag_pairs = { + all_tags.begin() + std::distance(shps.begin(), it), + all_tags.begin() + std::distance(shps.begin(), jt)}; + + for (size_t i = 0; i < 2; ++i) { + TopTools_IndexedDataMapOfShapeListOfShape ancestors; + const auto& wire = wp[i]; + auto& result = profile_points[i]; + + TopExp::MapShapesAndAncestors( + wire, + TopAbs_VERTEX, + TopAbs_EDGE, + ancestors); + + TopoDS_Vertex v0, vn, previous; + TopExp::Vertices(wire, v0, vn); + + TopoDS_Vertex curr = v0; + result.push_back(BRep_Tool::Pnt(curr)); + + while (true) { + if (curr.IsSame(vn)) { + break; + } + + const TopTools_ListOfShape& incidentEdges = ancestors.FindFromKey(curr); + + for (TopTools_ListIteratorOfListOfShape it(incidentEdges); it.More(); it.Next()) { + const TopoDS_Edge& e = TopoDS::Edge(it.Value()); + + TopoDS_Vertex ev0, ev1; + TopExp::Vertices(e, ev0, ev1); + + TopoDS_Vertex other_on_edge = curr.IsSame(ev0) ? ev1 : ev0; + if (other_on_edge.IsSame(previous)) { + continue; + } else { + previous = curr; + curr = other_on_edge; + result.push_back(BRep_Tool::Pnt(curr)); + break; + } + } + } + } + + auto a = profile_points[0].begin(); + auto b = profile_points[1].begin(); + auto c = tag_pairs[0]->begin(); + auto d = tag_pairs[1]->begin(); + + if (!has_intersection(*c, *d)) { + throw std::runtime_error("Starting vertices do not have corresponding tags"); } - if (jt == loft->children.end() - 1) { - // faces.Append(shps[1]); - BB.Add(comp, shps[1]); + + auto emit_triangle = [&](const gp_Pnt& p1, const gp_Pnt& p2, const gp_Pnt& p3) { + BB.Add(comp, BRepBuilderAPI_MakeFace(BRepBuilderAPI_MakePolygon(p1, p2, p3, true).Wire()).Face()); + }; + + while (c != (tag_pairs[0]->end() - 1) && d != (tag_pairs[0]->end() - 1)) { + if (c != (tag_pairs[0]->end() - 1) && has_intersection(*(c + 1), *d)) { + emit_triangle(*a, *(a + 1), *b); + ++a; + ++c; + } else if (d != (tag_pairs[1]->end() - 1) && has_intersection(*c, *(d + 1))) { + emit_triangle(*a, *(b + 1), *b); + ++b; + ++d; + } else if (c != (tag_pairs[0]->end() - 1) && d != (tag_pairs[1]->end() - 1) && has_intersection(*(c + 1), *(d + 1))) { + emit_triangle(*a, *(a + 1), *b); + emit_triangle(*(a + 1), *(b + 1), *b); + ++a; + ++b; + ++c; + ++d; + } else { + throw std::runtime_error("Unable to construct surface"); + } } - } + + continue; + } for (auto& wp : ws) { BRepTools_WireExplorer a(wp[0]); @@ -206,6 +427,8 @@ bool OpenCascadeKernel::convert(const taxonomy::loft::ptr loft, TopoDS_Shape& re } bool OpenCascadeKernel::convert_impl(const taxonomy::loft::ptr loft, IfcGeom::ConversionResults& results) { + return handle_occt_exception([&]() -> bool { + TopoDS_Shape shape; if (!convert(loft, shape)) { return false; @@ -217,4 +440,6 @@ bool OpenCascadeKernel::convert_impl(const taxonomy::loft::ptr loft, IfcGeom::Co loft->surface_style )); return true; + + }); } diff --git a/src/ifcgeom/kernels/opencascade/loop.cpp b/src/ifcgeom/kernels/opencascade/loop.cpp index 581cbf85677..5d8a538716a 100644 --- a/src/ifcgeom/kernels/opencascade/loop.cpp +++ b/src/ifcgeom/kernels/opencascade/loop.cpp @@ -378,6 +378,8 @@ bool OpenCascadeKernel::convert(const taxonomy::loop::ptr loop, TopoDS_Wire& wir } bool OpenCascadeKernel::convert_impl(const taxonomy::loop::ptr loop, IfcGeom::ConversionResults& results) { + return handle_occt_exception([&]() -> bool { + TopoDS_Wire shape; if (!convert(loop, shape)) { return false; @@ -389,9 +391,13 @@ bool OpenCascadeKernel::convert_impl(const taxonomy::loop::ptr loop, IfcGeom::Co loop->surface_style )); return true; + + }); } bool OpenCascadeKernel::convert_impl(const taxonomy::edge::ptr edge, IfcGeom::ConversionResults& results) { + return handle_occt_exception([&]() -> bool { + TopoDS_Wire shape = boost::get(convert_curve(edge)); results.emplace_back(ConversionResult( @@ -400,4 +406,6 @@ bool OpenCascadeKernel::convert_impl(const taxonomy::edge::ptr edge, IfcGeom::Co edge->surface_style )); return true; + + }); } diff --git a/src/ifcgeom/kernels/opencascade/shell.cpp b/src/ifcgeom/kernels/opencascade/shell.cpp index eacc87e12b6..4456895b12c 100644 --- a/src/ifcgeom/kernels/opencascade/shell.cpp +++ b/src/ifcgeom/kernels/opencascade/shell.cpp @@ -107,6 +107,8 @@ bool OpenCascadeKernel::convert(const taxonomy::shell::ptr l, TopoDS_Shape& shap } bool OpenCascadeKernel::convert_impl(const taxonomy::shell::ptr shell, IfcGeom::ConversionResults& results) { + return handle_occt_exception([&]() -> bool { + TopoDS_Shape shape; if (!convert(shell, shape)) { return false; @@ -118,4 +120,6 @@ bool OpenCascadeKernel::convert_impl(const taxonomy::shell::ptr shell, IfcGeom:: shell->surface_style )); return true; + + }); } diff --git a/src/ifcgeom/kernels/opencascade/solid.cpp b/src/ifcgeom/kernels/opencascade/solid.cpp index 4f308b0b06f..fb38c29789c 100644 --- a/src/ifcgeom/kernels/opencascade/solid.cpp +++ b/src/ifcgeom/kernels/opencascade/solid.cpp @@ -102,6 +102,8 @@ bool OpenCascadeKernel::convert(const taxonomy::solid::ptr solid, TopoDS_Shape& } bool OpenCascadeKernel::convert_impl(const taxonomy::solid::ptr solid, IfcGeom::ConversionResults& results) { + return handle_occt_exception([&]() -> bool { + TopoDS_Shape shape; if (!convert(solid, shape)) { return false; @@ -113,4 +115,6 @@ bool OpenCascadeKernel::convert_impl(const taxonomy::solid::ptr solid, IfcGeom:: solid->surface_style )); return true; + + }); } diff --git a/src/ifcgeom/kernels/opencascade/sweep_along_curve.cpp b/src/ifcgeom/kernels/opencascade/sweep_along_curve.cpp index c971291868c..510c8f182db 100644 --- a/src/ifcgeom/kernels/opencascade/sweep_along_curve.cpp +++ b/src/ifcgeom/kernels/opencascade/sweep_along_curve.cpp @@ -308,6 +308,8 @@ bool OpenCascadeKernel::convert(const taxonomy::sweep_along_curve::ptr scs, Topo } bool OpenCascadeKernel::convert_impl(const taxonomy::sweep_along_curve::ptr scs, IfcGeom::ConversionResults& results) { + return handle_occt_exception([&]() -> bool { + TopoDS_Shape shape; // For tiny radii occt will fail building the sweep, in which case we enlarge the inputs to occt, and add a scale matrix to the output bool enlarged = false; @@ -352,4 +354,6 @@ bool OpenCascadeKernel::convert_impl(const taxonomy::sweep_along_curve::ptr scs, scs->surface_style )); return true; + + }); } diff --git a/src/ifcgeom/mapping/CMakeLists.txt b/src/ifcgeom/mapping/CMakeLists.txt index 4e185b9fa9e..6369b98b60d 100644 --- a/src/ifcgeom/mapping/CMakeLists.txt +++ b/src/ifcgeom/mapping/CMakeLists.txt @@ -1,12 +1,21 @@ find_package(Eigen3 REQUIRED) +# When using `ENABLE_BUILD_OPTIMIZATIONS``/GL` compilation flags makes resulting mapping libs huge (e.g. 1.5GB each) +# and combining them together to a single IfcGeom won't be possible due to 4GB file size limit. +# So in this case we have to ensure each mapping is built as separate libs instead of .obj files to be linked together. +if(ENABLE_BUILD_OPTIMIZATIONS AND MSVC) + set(mapping_library_type "STATIC") +else() + set(mapping_library_type "OBJECT") +endif() + foreach(schema ${SCHEMA_VERSIONS}) file(GLOB IFCGEOM_I_FILES *.i) file(GLOB IFCGEOM_H_FILES *.h) file(GLOB IFCGEOM_CPP_FILES *.cpp) set(IFCGEOM_FILES ${IFCGEOM_CPP_FILES} ${IFCGEOM_H_FILES} ${IFCGEOM_I_FILES}) - add_library(geometry_mapping_ifc${schema} OBJECT ${IFCGEOM_FILES}) + add_library(geometry_mapping_ifc${schema} ${mapping_library_type} ${IFCGEOM_FILES}) set_target_properties( geometry_mapping_ifc${schema} PROPERTIES COMPILE_FLAGS "-DIFC_GEOM_EXPORTS -DIfcSchema=Ifc${schema}" diff --git a/src/ifcgeom/mapping/IfcObjectPlacement.cpp b/src/ifcgeom/mapping/IfcObjectPlacement.cpp index be0c222e08a..66744d5571d 100644 --- a/src/ifcgeom/mapping/IfcObjectPlacement.cpp +++ b/src/ifcgeom/mapping/IfcObjectPlacement.cpp @@ -21,7 +21,44 @@ #define mapping POSTFIX_SCHEMA(mapping) using namespace ifcopenshell::geometry; +#include + taxonomy::ptr mapping::map_impl(const IfcSchema::IfcObjectPlacement* inst) { + if (placement_rel_to_type_ || placement_rel_to_instance_) { + using QueueItem = std::pair; + std::deque q = {{inst, 0}}; + while (!q.empty()) { + auto [placement_entity, depth] = q.front(); + q.pop_front(); + + auto placement = placement_entity->as(); + if (!placement) { + continue; + } + + auto self_places = placement->PlacesObject(); + for (auto iter = self_places->begin(); iter != self_places->end(); ++iter) { + if ((placement_rel_to_type_ && (*iter)->declaration().is(*placement_rel_to_type_)) || + (placement_rel_to_instance_ && (*iter)->as() == placement_rel_to_instance_)) { + return taxonomy::make(); + } + } + + // Look for two levels deep, we want to know if we're at or *above* the + // element we're ignoring, but we don't want to traverse the entire model. +#ifdef SCHEMA_IfcObjectPlacement_HAS_ReferencedByPlacements + if (depth < 2) { + auto refs = placement->ReferencedByPlacements(); + for (auto& ref : *refs) { + q.emplace_back(ref, depth + 1); + } + } +#else + Logger::Warning("Using --site-local-placement or --building-local-placement on IFC4.2 might have issues"); +#endif + } + } + const IfcSchema::IfcObjectPlacement* relative_to = nullptr; const IfcUtil::IfcBaseInterface* transform; @@ -89,7 +126,7 @@ taxonomy::ptr mapping::map_impl(const IfcSchema::IfcObjectPlacement* inst) { if (fallback) { auto mapped_fallback = taxonomy::cast(map(fallback)); - if (mapped_fallback != result) { + if (!result->ccomponents().isApprox(mapped_fallback->ccomponents())) { Logger::Warning("Computed placement differs from fallback", inst); } } diff --git a/src/ifcgeom/mapping/IfcOpenCrossProfileDef.cpp b/src/ifcgeom/mapping/IfcOpenCrossProfileDef.cpp index 334be1324a8..7f3c4f43c1c 100644 --- a/src/ifcgeom/mapping/IfcOpenCrossProfileDef.cpp +++ b/src/ifcgeom/mapping/IfcOpenCrossProfileDef.cpp @@ -50,7 +50,6 @@ taxonomy::ptr mapping::map_impl(const IfcSchema::IfcOpenCrossProfileDef* inst) { if (tags.has_value() && !tags.get().empty()) { tag = tags.get()[0]; } - // start->tag = tag; auto widths = inst->Widths(); auto angles = inst->Slopes(); // these are actually angles, but the attribute is called Slopes @@ -79,16 +78,13 @@ taxonomy::ptr mapping::map_impl(const IfcSchema::IfcOpenCrossProfileDef* inst) { tag = tags.get()[i+1]; } - // points.push_back(taxonomy::make(x, y, z, tag)); points.push_back(taxonomy::make(x, y, z)); } auto mapped = polygon_from_points(points); - if (mapped->kind() == taxonomy::LOOP) { - auto r = taxonomy::loop::ptr((taxonomy::loop*)mapped->clone_()); - r->closed = false; - return r; - } + mapped->closed = false; + mapped->tags = tags; + return mapped; } diff --git a/src/ifcgeom/mapping/IfcPointByDistanceExpression.cpp b/src/ifcgeom/mapping/IfcPointByDistanceExpression.cpp index 180226fb820..f07234a8f16 100644 --- a/src/ifcgeom/mapping/IfcPointByDistanceExpression.cpp +++ b/src/ifcgeom/mapping/IfcPointByDistanceExpression.cpp @@ -52,6 +52,15 @@ taxonomy::ptr mapping::map_impl(const IfcSchema::IfcPointByDistanceExpression* i if (inst->OffsetVertical().has_value()) { auto offset_vertical = inst->OffsetVertical().get() * length_unit_; o += offset_vertical * z; + + auto tmp1 = (z * offset_vertical).eval(); + auto tmp2 = (Eigen::Vector3d(0, 0, 1) * offset_vertical).eval(); + auto tmp3 = (tmp1 - tmp2).eval(); + + std::ostringstream oss; + oss << "local z: " << z.x() << "," << z.y() << "," << z.z() << "; delta: " << tmp3.x() << "," << tmp3.y() << "," << tmp3.z(); + auto osss = oss.str(); + std::wcout << osss.c_str() << std::endl; } if (inst->OffsetLongitudinal().has_value()) { diff --git a/src/ifcgeom/mapping/IfcRevolvedAreaSolid.cpp b/src/ifcgeom/mapping/IfcRevolvedAreaSolid.cpp index 8b2fe01272f..f6a9fc861c0 100644 --- a/src/ifcgeom/mapping/IfcRevolvedAreaSolid.cpp +++ b/src/ifcgeom/mapping/IfcRevolvedAreaSolid.cpp @@ -43,11 +43,20 @@ taxonomy::ptr mapping::map_impl(const IfcSchema::IfcRevolvedAreaSolid* inst) { angle = ang; } + taxonomy::direction3::ptr axis; + if (inst->Axis()->Axis()) { + axis = taxonomy::cast(map(inst->Axis()->Axis())); + } else { + // IfcAxis1Placement.Axis is optional, and defaults to (0, 0, 1) if not provided. + axis = taxonomy::make(0, 0, 1); + } + + return taxonomy::make( matrix, taxonomy::cast(map(inst->SweptArea())), taxonomy::cast(map(inst->Axis()->Location())), - taxonomy::cast(map(inst->Axis()->Axis())), + axis, angle ); diff --git a/src/ifcgeom/mapping/IfcSectionedSolidHorizontal.cpp b/src/ifcgeom/mapping/IfcSectionedSolidHorizontal.cpp index a2bc648f084..f2556092b4c 100644 --- a/src/ifcgeom/mapping/IfcSectionedSolidHorizontal.cpp +++ b/src/ifcgeom/mapping/IfcSectionedSolidHorizontal.cpp @@ -61,33 +61,16 @@ taxonomy::ptr mapping::map_impl(const IfcSchema::IfcSectionedSolidHorizontal* in longitudes.push_back(*pbde->DistanceAlong()->as(true) * length_unit_); - // Corresponds to the profile X, Y directions (hopefully). Eigen::Vector3d po( - pbde->OffsetLateral().get_value_or(0.), - // @todo I don't understand whether vertical is an offset relative to the tangent plane or to the global XY plane - pbde->OffsetVertical().get_value_or(0.), - 0. - ); - - profile_offsets.push_back(po); - - boost::optional rot; - if (csp->Axis() && csp->RefDirection()) { - rot = taxonomy::matrix4( - Eigen::Vector3d(0, 0, 0), - taxonomy::cast(map(csp->Axis()))->ccomponents(), - taxonomy::cast(map(csp->RefDirection()))->ccomponents()).ccomponents().block<3,3>(0,0); - } else if (csp->Axis()) { - rot = taxonomy::matrix4( - Eigen::Vector3d(0, 0, 0), - taxonomy::cast(map(csp->Axis()))->ccomponents()).ccomponents().block<3, 3>(0, 0); - } else if (csp->RefDirection()) { - rot = taxonomy::matrix4( - Eigen::Vector3d(0, 0, 0), - Eigen::Vector3d(0, 0, 1), - taxonomy::cast(map(csp->RefDirection()))->ccomponents() - ).ccomponents().block<3, 3>(0, 0); - } + pbde->OffsetLateral().get_value_or(0.), + // @todo I don't understand whether vertical is an offset relative to the tangent plane or to the global XY plane + pbde->OffsetVertical().get_value_or(0.), + 0.); + + profile_offsets.push_back(po); + + auto axis2_placement_linear = taxonomy::cast(map(csp)); + boost::optional rot(axis2_placement_linear->ccomponents().block<3, 3>(0, 0)); profile_rotations.push_back(rot); } if (faces.size() != profile_offsets.size()) { diff --git a/src/ifcgeom/mapping/IfcSectionedSurface.cpp b/src/ifcgeom/mapping/IfcSectionedSurface.cpp index 49fde157590..efdeda5757e 100644 --- a/src/ifcgeom/mapping/IfcSectionedSurface.cpp +++ b/src/ifcgeom/mapping/IfcSectionedSurface.cpp @@ -63,36 +63,18 @@ taxonomy::ptr mapping::map_impl(const IfcSchema::IfcSectionedSurface* inst) { longitudes.push_back(*pbde->DistanceAlong()->as(true) * length_unit_); - // Corresponds to the profile X, Y directions (hopefully). - Eigen::Vector3d po( - pbde->OffsetLateral().get_value_or(0.), - // @todo I don't understand whether vertical is an offset relative to the tangent plane or to the global XY plane - pbde->OffsetVertical().get_value_or(0.), - 0. - ); - - profile_offsets.push_back(po); - - boost::optional rot; - if (csp->Axis() && csp->RefDirection()) { - rot = taxonomy::matrix4( - Eigen::Vector3d(0, 0, 0), - taxonomy::cast(map(csp->Axis()))->ccomponents(), - taxonomy::cast(map(csp->RefDirection()))->ccomponents()).ccomponents().block<3, 3>(0, 0); - } else if (csp->Axis()) { - rot = taxonomy::matrix4( - Eigen::Vector3d(0, 0, 0), - taxonomy::cast(map(csp->Axis()))->ccomponents()).ccomponents().block<3, 3>(0, 0); - } else if (csp->RefDirection()) { - rot = taxonomy::matrix4( - Eigen::Vector3d(0, 0, 0), - Eigen::Vector3d(0, 0, 1), - taxonomy::cast(map(csp->RefDirection()))->ccomponents()) - .ccomponents() - .block<3, 3>(0, 0); - } - profile_rotations.push_back(rot); - } + Eigen::Vector3d po( + pbde->OffsetLateral().get_value_or(0.), + // @todo I don't understand whether vertical is an offset relative to the tangent plane or to the global XY plane + pbde->OffsetVertical().get_value_or(0.), + 0.); + + profile_offsets.push_back(po); + + auto axis2_placement_linear = taxonomy::cast(map(csp)); + boost::optional rot(axis2_placement_linear->ccomponents().block<3, 3>(0, 0)); + profile_rotations.push_back(rot); + } #else return nullptr; #endif diff --git a/src/ifcgeom/mapping/IfcSurfaceOfRevolution.cpp b/src/ifcgeom/mapping/IfcSurfaceOfRevolution.cpp index f83c4ecf030..c5fe21b58b5 100644 --- a/src/ifcgeom/mapping/IfcSurfaceOfRevolution.cpp +++ b/src/ifcgeom/mapping/IfcSurfaceOfRevolution.cpp @@ -31,11 +31,19 @@ taxonomy::ptr mapping::map_impl(const IfcSchema::IfcSurfaceOfRevolution* inst) { matrix = taxonomy::cast(map(inst->Position())); } + taxonomy::direction3::ptr axis; + if (inst->AxisPosition()->Axis()) { + axis = taxonomy::cast(map(inst->AxisPosition()->Axis())); + } else { + // IfcAxis1Placement.Axis is optional, and defaults to (0, 0, 1) if not provided. + axis = taxonomy::make(0, 0, 1); + } + return taxonomy::make( matrix, taxonomy::cast(map(inst->SweptCurve())), taxonomy::cast(map(inst->AxisPosition()->Location())), - taxonomy::cast(map(inst->AxisPosition()->Axis())), + axis, boost::none ); } diff --git a/src/ifcgeom/mapping/IfcToroidalSurface.cpp b/src/ifcgeom/mapping/IfcToroidalSurface.cpp index ce17a37dbc3..d73e90bb1b6 100644 --- a/src/ifcgeom/mapping/IfcToroidalSurface.cpp +++ b/src/ifcgeom/mapping/IfcToroidalSurface.cpp @@ -24,16 +24,11 @@ using namespace ifcopenshell::geometry; #ifdef SCHEMA_HAS_IfcToroidalSurface taxonomy::ptr mapping::map_impl(const IfcSchema::IfcToroidalSurface* inst) { - return nullptr; - - /* - gp_Trsf trsf; - IfcGeom::Kernel::convert(inst->Position(), trsf); - - // IfcElementarySurface.Position has unit scale factor - face = BRepBuilderAPI_MakeFace(new Geom_ToroidalSurface(gp::XOY(), inst->MajorRadius() * length_unit_, inst->MinorRadius() * length_unit_), getValue(GV_PRECISION)).Face().Moved(trsf); - return true; - */ + auto c = taxonomy::make(); + c->radius1 = inst->MajorRadius() * length_unit_; + c->radius2 = inst->MinorRadius() * length_unit_; + c->matrix = taxonomy::cast(map(inst->Position())); + return c; } #endif diff --git a/src/ifcgeom/mapping/mapping.cpp b/src/ifcgeom/mapping/mapping.cpp index f98bfe232d1..edfdd3a13be 100644 --- a/src/ifcgeom/mapping/mapping.cpp +++ b/src/ifcgeom/mapping/mapping.cpp @@ -691,6 +691,10 @@ taxonomy::ptr mapping::map_impl(const IfcSchema::IfcSurfaceStyle* style) { } taxonomy::ptr mapping::map(const IfcBaseInterface* inst) { + if (inst == nullptr) { + Logger::Error("Warning nullptr passed to map() function"); + return nullptr; + } auto iden = inst->as()->identity(); if (use_caching_) { std::lock_guard guard(cache_guard_); diff --git a/src/ifcgeom/taxonomy.cpp b/src/ifcgeom/taxonomy.cpp index e03c1010a31..2ce115dfd1c 100644 --- a/src/ifcgeom/taxonomy.cpp +++ b/src/ifcgeom/taxonomy.cpp @@ -543,8 +543,8 @@ piecewise_function::const_ptr offset_function::get_offset() const { return offse ifcopenshell::geometry::taxonomy::collection::ptr ifcopenshell::geometry::flatten(const taxonomy::collection::ptr& deep) { auto flat = make(); ifcopenshell::geometry::visit(deep, [&flat](taxonomy::ptr i) { - flat->children.push_back(taxonomy::cast(clone(i))); - }); + flat->children.push_back(std::static_pointer_cast(clone(i))); + }); return flat; } @@ -822,11 +822,11 @@ namespace { boost::optional ifcopenshell::geometry::taxonomy::loop_to_function_item_upgrade_impl(ptr item) { - boost::optional fi_; + boost::optional function_item_; auto loop_ = dcast(item); if (loop_) { - if (loop_->fi.is_initialized()) { - fi_ = loop_->fi; + if (loop_->function_item.is_initialized()) { + function_item_ = loop_->function_item; } else { // piecewise_function is a specialization of function_item - callers don't need to know this detail piecewise_function::spans_t spans; @@ -880,9 +880,9 @@ boost::optional ifcopenshell::geometry::taxonomy::loop_to_fu return boost::none; } } - fi_ = make(0.0,spans); - loop_->fi = fi_; + function_item_ = make(0.0, spans); + loop_->function_item = function_item_; } } - return fi_; + return function_item_; } diff --git a/src/ifcgeom/taxonomy.h b/src/ifcgeom/taxonomy.h index d3ec5c5e17c..c1162eebb00 100644 --- a/src/ifcgeom/taxonomy.h +++ b/src/ifcgeom/taxonomy.h @@ -928,7 +928,8 @@ typedef item const* ptr; DECLARE_PTR(loop) boost::optional external, closed; - boost::optional fi; + boost::optional function_item; + boost::optional> tags; bool is_polyhedron() const { for (auto& e : children) { @@ -1067,8 +1068,10 @@ typedef item const* ptr; virtual kinds kind() const { return LOFT; } virtual void print_impl(std::ostream& o, int indent) const { - o << std::string(indent, ' ') << "axis" << std::endl; - axis->print(o, indent + 4); + if (axis) { + o << std::string(indent, ' ') << "axis" << std::endl; + axis->print(o, indent + 4); + } } virtual size_t calc_hash() const { @@ -1621,25 +1624,19 @@ typedef item const* ptr; for (auto& i : deep->children) { // @todo Sad... now that we have templated collection members, // we can't generally use collection_base anymore as a cast target. - if (auto s = taxonomy::dcast(i)) { + if (auto s = std::dynamic_pointer_cast(i)) { visit(s, fn); - } - else if (auto s = taxonomy::dcast(i)) { + } else if (auto s = std::dynamic_pointer_cast(i)) { visit(s, fn); - } - else if (auto s = taxonomy::dcast(i)) { + } else if (auto s = std::dynamic_pointer_cast(i)) { visit(s, fn); - } - else if (auto s = taxonomy::dcast(i)) { + } else if (auto s = std::dynamic_pointer_cast(i)) { visit(s, fn); - } - else if (auto s = taxonomy::dcast(i)) { + } else if (auto s = std::dynamic_pointer_cast(i)) { visit(s, fn); - } - else if (auto s = taxonomy::dcast(i)) { + } else if (auto s = std::dynamic_pointer_cast(i)) { visit(s, fn); - } - else if (auto s = taxonomy::dcast(i)) { + } else if (auto s = std::dynamic_pointer_cast(i)) { visit(s, fn); } else { diff --git a/src/ifcmcp/Makefile b/src/ifcmcp/Makefile new file mode 100644 index 00000000000..3dbcbb4e938 --- /dev/null +++ b/src/ifcmcp/Makefile @@ -0,0 +1,10 @@ +PACKAGE_NAME:=ifcmcp +include ../common.mk + +.PHONY: test +test: + pytest tests + +.PHONY: qa +qa: + black . diff --git a/src/ifcmcp/README.md b/src/ifcmcp/README.md new file mode 100644 index 00000000000..6d513bfd07c --- /dev/null +++ b/src/ifcmcp/README.md @@ -0,0 +1,400 @@ + +# ifcmcp + +An MCP (Model Context Protocol) server that wraps `ifcquery` and `ifcedit`, +holding the IFC model in memory across tool calls for fast interactive editing +sessions. + +## Installation + +```bash +pip install ifcopenshell-mcp +``` + +Requires `ifcopenshell`, `ifcquery`, and `ifcedit`. The `mcp` package is an optional dependency needed to run the server; install it with `pip install ifcopenshell-mcp[mcp]` or add `mcp` separately. + +## Running the server + +```bash +ifcmcp +``` + +This starts the server on stdio transport, suitable for use with Claude Code +or any MCP client. + +### Claude Code configuration + +Use the `claude mcp add` command: + +```bash +claude mcp add --transport stdio ifc -- ifcmcp +``` + +Or create a `.mcp.json` file in your project root: + +```json +{ + "mcpServers": { + "ifc": { + "type": "stdio", + "command": "ifcmcp" + } + } +} +``` + +After adding the server, restart Claude Code for the tools to become available. +Then load a model by asking Claude to use `ifc_load`: + +``` +load model.ifc using ifc_load +``` + +## Tools + +### Session + +#### ifc_new + +Create a new empty IFC model in memory, replacing any currently loaded model. + +``` +ifc_new() +ifc_new(schema="IFC4X3") +``` + +Default schema is `IFC4`. + +#### ifc_load + +Open an IFC file into memory. + +``` +ifc_load(path="/path/to/model.ifc") +-> "Loaded /path/to/model.ifc: schema IFC4, 1847 entities" +``` + +#### ifc_reset + +Unload the current model from memory, freeing all session state. + +``` +ifc_reset() +``` + +#### ifc_save + +Write the in-memory model to disk. Empty path overwrites the original file. + +``` +ifc_save() +ifc_save(path="/path/to/output.ifc") +``` + +### Query tools + +All query tools require a model to be loaded first via `ifc_load`. + +#### ifc_summary + +Model overview: schema, entity counts, project info. + +```json +{ + "schema": "IFC4", + "total_entities": 1847, + "project": {"id": 1, "name": "Office Building"}, + "types": {"IfcWall": 42, "IfcSlab": 12, "IfcWindow": 36} +} +``` + +#### ifc_tree + +Full spatial hierarchy from IfcProject down through sites, buildings, storeys, +and contained elements. + +```json +{ + "id": 1, + "type": "IfcProject", + "name": "Office Building", + "children": [ + { + "id": 2, + "type": "IfcSite", + "children": [{"id": 3, "type": "IfcBuilding", "children": ["..."]}] + } + ] +} +``` + +#### ifc_info + +Deep inspection of an entity by step ID: attributes, property sets, type, +material, container, and 4x4 placement matrix. + +``` +ifc_info(element_id=10) +``` + +#### ifc_select + +Filter elements using ifcopenshell selector syntax. + +``` +ifc_select(query="IfcWall") +ifc_select(query="IfcWindow") +``` + +Returns a sorted list of `{"id", "type", "name"}` references. + +#### ifc_relations + +Show all relationships for an element: hierarchy, children, type, groups, +systems, material, connections. + +``` +ifc_relations(element_id=10) +ifc_relations(element_id=10, traverse="up") +``` + +With `traverse="up"`, walks the hierarchy from element up to IfcProject. + +#### ifc_contexts + +List all geometric representation contexts and subcontexts in the loaded model. + +``` +ifc_contexts() +``` + +#### ifc_materials + +List all materials and material sets in the loaded model, with their assigned elements. + +``` +ifc_materials() +``` + +#### ifc_clash + +Check an element for geometric intersections and clearance violations. + +``` +ifc_clash(element_id=10) +ifc_clash(element_id=10, clearance=0.5, scope="all") +``` + +Parameters: + +- `clearance` -- minimum clearance distance in meters (0.0 = no clearance check) +- `tolerance` -- intersection tolerance in meters (default: 0.002) +- `scope` -- `"storey"` or `"all"` (default: `"storey"`) + +#### ifc_validate + +Check the model for schema and constraint violations. + +``` +ifc_validate() +ifc_validate(express_rules=True) +``` + +Returns `{"valid": true, "issues": []}` or `{"valid": false, "issues": [{"level": "ERROR", "message": "..."}]}`. + +#### ifc_schedule + +List all work schedules and their nested task trees. + +``` +ifc_schedule() +ifc_schedule(max_depth=1) # top-level phases only +``` + +`max_depth` limits subtask expansion. At the cutoff, `subtasks` is replaced +with `{"truncated": true, "count": N}` so you know children exist without +fetching them all. Omit for unlimited depth. + +#### ifc_cost + +List all cost schedules and their nested cost item trees. + +``` +ifc_cost() +ifc_cost(max_depth=2) # top two levels of the BoQ +``` + +`max_depth` limits cost item expansion, same truncation convention as +`ifc_schedule`. + +#### ifc_schema + +Return IFC class documentation for any entity type, using the loaded model's +schema version. + +``` +ifc_schema(entity_type="IfcWall") +ifc_schema(entity_type="IfcBuildingStorey") +``` + +Returns description, predefined types, spec URL, and attribute descriptions. +Returns `{"error": "Unknown entity: Foo"}` for unrecognised types. + +#### ifc_quantify + +Run quantity take-off (QTO) on the loaded model using an `ifc5d` rule. +Computes physical measurements (volume, area, length, count, weight) and +writes them back as `IfcElementQuantity` property sets. Modifies the model +in-place -- call `ifc_save()` when done. + +``` +ifc_quantify(rule="IFC4QtoBaseQuantities") +ifc_quantify(rule="IFC4QtoBaseQuantities", selector="IfcWall") +``` + +Available rules: `IFC4QtoBaseQuantities`, `IFC4X3QtoBaseQuantities`. + +`selector` is an optional ifcopenshell selector to restrict which elements +are quantified (default: all `IfcElement`). + +Returns `{"ok": true, "rule": "...", "elements_quantified": 42}`. + +### Drawing and rendering tools + +#### ifc_plot + +Generate a 2D technical drawing of the loaded model and return it as an inline image. + +``` +ifc_plot() +ifc_plot(selector="IfcWall", view="floorplan", scale=0.01, output_path="/tmp/plan.svg") +ifc_plot(element_ids=[10, 11], view="floorplan") +``` + +Parameters: + +- `selector` -- ifcopenshell selector to restrict plotted elements +- `element_ids` -- step IDs of elements to highlight; others are faded +- `view` -- `"floorplan"` (default), `"elevation"`, `"section"`, or `"auto"` +- `width_mm`, `height_mm` -- paper size in mm (default: 297 x 420) +- `scale` -- model-to-paper ratio (default: 0.01 = 1:100) +- `png_width`, `png_height` -- raster output size in pixels (default: 1024 x 1024) +- `output_path` -- optional path to also save to disk (`.svg` for vector, otherwise PNG) + +Returns an inline PNG the LLM can inspect. Requires `ifcopenshell.draw`. + +#### ifc_render + +Render the loaded model to a 3D PNG image. + +``` +ifc_render() +ifc_render(selector="IfcWall", view="iso", output_path="/tmp/model.png") +ifc_render(element_ids=[10, 11], view="south") +``` + +Parameters: + +- `selector` -- ifcopenshell selector to restrict rendered elements +- `element_ids` -- step IDs of elements to highlight; others are shown translucent +- `view` -- `"iso"` (default), `"top"`, `"south"`, `"north"`, `"east"`, or `"west"` +- `output_path` -- optional path to save the PNG to disk + +Returns an inline PNG. Requires `pyvista` and the IfcOpenShell C++ geometry bindings. + +### Shape builder tools + +#### ifc_shape_list + +List all available `ShapeBuilder` methods with brief descriptions. + +``` +ifc_shape_list() +``` + +#### ifc_shape_docs + +Show full documentation for a specific `ShapeBuilder` method. + +``` +ifc_shape_docs(method="extrude") +ifc_shape_docs(method="create_ellipse") +``` + +#### ifc_shape + +Execute a `ShapeBuilder` method on the loaded model. + +``` +ifc_shape(method="extrude", params='{"profile": "42", "magnitude": 3.0}') +``` + +`params` is a JSON string; entity references are resolved by step ID (same coercion as `ifc_edit`). + +### Edit discovery tools + +#### ifc_list + +List all API modules, or functions within a specific module. + +``` +ifc_list() # all modules +ifc_list(module="root") # functions in the root module +``` + +#### ifc_docs + +Show full documentation for an API function including parameters, types, +defaults, and descriptions. + +``` +ifc_docs(function_path="root.create_entity") +``` + +### Edit execution + +#### ifc_edit + +Execute an `ifcopenshell.api` mutation function. Parameters are passed as a +JSON string with string values that get coerced by ifcedit's type system. + +``` +ifc_edit( + function_path="root.create_entity", + params='{"ifc_class": "IfcWall", "name": "My Wall"}' +) +``` + +Returns `{"ok": true, "result": ...}` or `{"ok": false, "error": "..."}`. + +Does NOT auto-save -- call `ifc_save()` when ready to write changes to disk. + +**Parameter coercion:** + +| Type | JSON value | Python value | +|------|------------|--------------| +| `entity_instance` | `"42"` | resolved from model by step ID | +| `list[entity_instance]` | `"5,6,7"` | list of resolved entities | +| `dict` | `'{"key": "val"}'` | parsed JSON object | +| `bool` | `"true"` | `True` | +| `Optional[X]` | `"none"` | `None` | + +## Typical workflow + +1. **Load** a model: `ifc_load` +2. **Inspect** with query tools: `ifc_summary`, `ifc_tree`, `ifc_select`, `ifc_info`, `ifc_relations` +3. **Validate** if needed: `ifc_validate` +4. **Browse schedules / costs**: `ifc_schedule`, `ifc_cost` (use `max_depth=1` first on large projects) +5. **Look up IFC classes**: `ifc_schema` +6. **Find** the right API function: `ifc_list`, `ifc_docs` +7. **Edit** the model: `ifc_edit` +8. **Quantify** elements: `ifc_quantify` (writes QTO psets in-place) +9. **Verify** changes with query tools +10. **Save** when satisfied: `ifc_save` + +The model stays in memory across all calls, so multi-step editing sessions +are fast -- no file I/O between operations. + +## License + +LGPLv3+ -- see the IfcOpenShell project license. diff --git a/src/ifcmcp/ifcmcp/__init__.py b/src/ifcmcp/ifcmcp/__init__.py new file mode 100644 index 00000000000..92e1c230b65 --- /dev/null +++ b/src/ifcmcp/ifcmcp/__init__.py @@ -0,0 +1,20 @@ +# This file was generated with the assistance of an AI coding tool. +# IfcMCP - MCP server for IFC building models +# Copyright (C) 2026 Bruno Postle +# +# This file is part of IfcMCP. +# +# IfcMCP is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# IfcMCP is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with IfcMCP. If not, see . + +__version__ = version = "0.0.0" diff --git a/src/ifcmcp/ifcmcp/__main__.py b/src/ifcmcp/ifcmcp/__main__.py new file mode 100644 index 00000000000..da3f1deab72 --- /dev/null +++ b/src/ifcmcp/ifcmcp/__main__.py @@ -0,0 +1,48 @@ +# This file was generated with the assistance of an AI coding tool. +import argparse + +from ifcmcp import __version__ + + +def main(): + parser = argparse.ArgumentParser( + prog="python3 -m ifcmcp", + description=( + "ifcmcp — MCP server for IFC building models.\n\n" + "Runs a Model Context Protocol server over stdio so that MCP clients\n" + "can query and edit IFC files without writing them to disk between\n" + "operations.\n\n" + "Add to .mcp.json to configure:\n" + ' {"mcpServers": {"ifc": {"type": "stdio", "command": "python3", "args": ["-m", "ifcmcp"]}}}' + ), + formatter_class=argparse.RawDescriptionHelpFormatter, + ) + parser.add_argument("--version", action="version", version=f"ifcmcp {__version__}") + parser.add_argument( + "--transport", + choices=["stdio", "sse", "streamable-http"], + default="stdio", + help="MCP transport to use (default: stdio)", + ) + + args = parser.parse_args() + + try: + from mcp.server.fastmcp import FastMCP # noqa: F401 + except ImportError: + import sys + + print( + "error: the 'mcp' package is required to run the server.\n" "Install it with: pip install mcp", + file=sys.stderr, + ) + sys.exit(1) + + from ifcmcp.server import build_server + + server = build_server() + server.run(transport=args.transport) + + +if __name__ == "__main__": + main() diff --git a/src/ifcmcp/ifcmcp/core.py b/src/ifcmcp/ifcmcp/core.py new file mode 100644 index 00000000000..137cdbdce0e --- /dev/null +++ b/src/ifcmcp/ifcmcp/core.py @@ -0,0 +1,741 @@ +# This file was generated with the assistance of an AI coding tool. +from __future__ import annotations + +# inside ifcmcp/core.py +import json +from collections.abc import Callable # noqa: F401 — Callable used in helpers below +from dataclasses import dataclass +from typing import Any + +import ifcopenshell +from ifcedit.discover import function_docs, list_functions, list_modules +from ifcedit.quantify import run_quantify +from ifcedit.run import run_api +from ifcquery import clash as clash_mod +from ifcquery import contexts as contexts_mod +from ifcquery import cost as cost_mod +from ifcquery import ( + info, + relations, + schedule, + schema, + select, + summary, + tree, +) +from ifcquery import ( + materials as materials_mod, +) +from ifcquery import ( + plot as plot_mod, +) +from ifcquery import ( + render as render_mod, +) +from ifcquery import validate as validate_mod + + +def _jsonify(x: Any) -> Any: + """Convert IfcOpenShell objects / iterables into JSON-safe primitives.""" + if x is None or isinstance(x, (str, int, float, bool)): + return x + + # numpy arrays (and any array-like with tolist) + if hasattr(x, "tolist"): + return x.tolist() + + # IfcOpenShell entity instances: normalize + if isinstance(x, ifcopenshell.entity_instance): + return { + "id": int(x.id()), + "type": x.is_a(), + "repr": str(x), + "name": getattr(x, "Name", None), + } + + if isinstance(x, dict): + return {str(k): _jsonify(v) for k, v in x.items()} + + if isinstance(x, (list, tuple, set)): + return [_jsonify(v) for v in x] + + # Try JSON as-is, else fallback to string + try: + json.dumps(x) + return x + except Exception: + return str(x) + + +# --------------------------------------------------------------------------- +# Shape builder helpers +# --------------------------------------------------------------------------- + + +def _list_shape_methods() -> list[dict]: + """Introspect ShapeBuilder and return a summary of all public methods.""" + import inspect + + from ifcedit.discover import _extract_params + from ifcopenshell.util.shape_builder import ShapeBuilder + + results = [] + for name, fn in inspect.getmembers(ShapeBuilder, predicate=inspect.isfunction): + if name.startswith("_"): + continue + doc = fn.__doc__ or "" + description = doc.strip().split("\n")[0] if doc.strip() else "" + results.append({"method": name, "description": description, "params": _extract_params(fn)}) + return results + + +def _shape_method_docs(method_name: str) -> dict: + """Return full documentation for a single ShapeBuilder method.""" + import typing + + from ifcedit.discover import ( + _extract_params, + _format_type_hint, + _parse_docstring_body, + _parse_param_docs, + _parse_return_doc, + ) + from ifcopenshell.util.shape_builder import ShapeBuilder + + if method_name.startswith("_"): + raise ValueError(f"ShapeBuilder has no method '{method_name}'") + fn = getattr(ShapeBuilder, method_name, None) + if fn is None: + raise ValueError(f"ShapeBuilder has no method '{method_name}'") + + doc = fn.__doc__ or "" + description, long_description = _parse_docstring_body(doc) + params = _extract_params(fn) + for param in params: + param_desc = _parse_param_docs(doc) + if param["name"] in param_desc: + param["description"] = param_desc[param["name"]] + + try: + hints = typing.get_type_hints(fn) + except Exception: + hints = {} + + result: dict[str, Any] = { + "method": method_name, + "description": description, + "long_description": long_description, + "params": params, + } + return_type = _format_type_hint(hints.get("return")) + if return_type: + result["return_type"] = return_type + return_description = _parse_return_doc(doc) + if return_description: + result["return_description"] = return_description + return result + + +def _coerce_shape_params(fn: Callable, raw_kwargs: dict, model: ifcopenshell.file) -> dict: + """Coerce JSON-parsed kwargs to proper Python types for a ShapeBuilder method.""" + import inspect + import typing + + sig = inspect.signature(fn) + try: + hints = typing.get_type_hints(fn) + except Exception: + hints = {} + + return { + key: _coerce_shape_value(value, hints.get(key), model) + for key, value in raw_kwargs.items() + if key in sig.parameters and key != "self" + } + + +def _coerce_shape_value(value: Any, hint: Any, model: ifcopenshell.file) -> Any: + """Convert a single JSON-parsed value to the correct Python type.""" + import typing + + if hint is None or value is None: + return value + + origin = typing.get_origin(hint) + args = typing.get_args(hint) + + # Optional[X] / Union — try each non-None branch in order + if origin is typing.Union: + if value is None: + return None + for t in (a for a in args if a is not type(None)): + try: + return _coerce_shape_value(value, t, model) + except (ValueError, TypeError): + continue + return value + + # entity_instance: resolve integer or "#N" string step ID + if hint is ifcopenshell.entity_instance or ( + isinstance(hint, type) and issubclass(hint, ifcopenshell.entity_instance) + ): + entity_id = int(str(value).lstrip("#")) + entity = model.by_id(entity_id) + if entity is None: + raise ValueError(f"Entity #{entity_id} not found in model") + return entity + + # Sequence[entity_instance]: resolve each element in the list + import collections.abc + + if origin is not None and issubclass(origin, collections.abc.Sequence) and not isinstance(value, str): + if args and ( + args[0] is ifcopenshell.entity_instance + or (isinstance(args[0], type) and issubclass(args[0], ifcopenshell.entity_instance)) + ): + if isinstance(value, (list, tuple)): + return [_coerce_shape_value(v, args[0], model) for v in value] + + # bool: JSON gives actual bools; also accept string representations + if hint is bool: + if isinstance(value, bool): + return value + return str(value).lower() in ("true", "1", "yes") + + # Everything else (float, int, VectorType lists, dicts, Literals) passes through + return value + + +class IfcSessionError(RuntimeError): + pass + + +@dataclass +class IfcSession: + """In-memory IFC session (no FastMCP dependency). + + Designed to work in: + - FastMCP server (single global session) + - Embedded runtimes like Pyodide (one session per browser tab/worker) + """ + + model: ifcopenshell.file | None = None + model_path: str | None = None + + # ----------------- + # Session lifecycle + # ----------------- + def _require_model(self) -> ifcopenshell.file: + if self.model is None: + raise IfcSessionError("No model loaded. Call ifc_load() or ifc_new() first.") + return self.model + + def ifc_new(self, schema: str = "IFC4") -> dict[str, Any]: + """Create a new empty IFC model in memory.""" + self.model = ifcopenshell.file(schema=schema) + self.model_path = None + return {"ok": True, "schema": self.model.schema, "entities": sum(1 for _ in self.model)} + + def ifc_load(self, path: str) -> str: + """Open an IFC file into memory. Returns confirmation string.""" + self.model = ifcopenshell.open(path) + self.model_path = path + count = sum(1 for _ in self.model) + return f"Loaded {path}: schema {self.model.schema}, {count} entities" + + def ifc_save(self, path: str = "") -> str: + """Write the in-memory model to disk. Empty path overwrites the original file.""" + model = self._require_model() + target = path if path else self.model_path + if not target: + raise IfcSessionError("No path specified and no original path available.") + model.write(target) + return f"Saved to {target}" + + def ifc_reset(self) -> dict[str, Any]: + """Drop the in-memory model.""" + self.model = None + self.model_path = None + return {"ok": True} + + # ------------- + # Query tools + # ------------- + def ifc_summary(self) -> dict[str, Any]: + """Model overview: schema, entity counts, project info.""" + return summary.summary(self._require_model()) + + def ifc_tree(self) -> dict[str, Any] | list[dict[str, Any]]: + """Full spatial hierarchy tree (Project -> Site -> Building -> Storeys -> Elements).""" + return tree.tree(self._require_model()) + + def ifc_info(self, element_id: int) -> dict[str, Any]: + """Deep inspection of an entity by step ID (attributes, psets, placement, type, material).""" + model = self._require_model() + element = model.by_id(element_id) + if element is None: + raise IfcSessionError(f"Element #{element_id} not found.") + return info.info(model, element) + + def ifc_select(self, query: str) -> list[dict[str, Any]]: + """Filter elements using ifcopenshell selector syntax. + + Examples: ``IfcWall``, ``IfcWall, IfcColumn``, ``! IfcWall``, + ``IfcWall, Name = "My Wall"``, ``type = "Concrete Wall"``, + ``material = "Concrete"``. + """ + return select.select(self._require_model(), query) + + def ifc_relations(self, element_id: int, traverse: str = "") -> dict[str, Any] | list[dict[str, Any]]: + """Show relationships for an element. Set traverse='up' to walk hierarchy to IfcProject.""" + model = self._require_model() + element = model.by_id(element_id) + if element is None: + raise IfcSessionError(f"Element #{element_id} not found.") + return relations.relations(model, element, traverse=traverse if traverse else None) + + def ifc_clash( + self, + element_id: int, + clearance: float = 0.0, + tolerance: float = 0.002, + scope: str = "storey", + ) -> dict[str, Any]: + """Check element for geometric clashes. clearance=0.0 means no clearance check.""" + model = self._require_model() + element = model.by_id(element_id) + if element is None: + raise IfcSessionError(f"Element #{element_id} not found.") + return clash_mod.clash( + model, + element, + clearance=clearance if clearance and clearance > 0.0 else None, + tolerance=tolerance, + scope=scope, + ) + + def ifc_contexts(self) -> list[dict[str, Any]]: + """List all geometric representation contexts and subcontexts with their step IDs.""" + return contexts_mod.contexts(self._require_model()) + + def ifc_materials(self) -> list[dict[str, Any]]: + """List all materials and material sets (layers, constituents, profiles).""" + return materials_mod.materials(self._require_model()) + + # ------------------------ + # Edit discovery + execute + # ------------------------ + def ifc_list(self, module: str = "") -> list[dict]: + """List all API modules, or functions within a module. Empty module = all modules.""" + return list_functions(module) if module else list_modules() + + def ifc_docs(self, function_path: str) -> dict: + """Show full documentation for an API function. Input format: 'module.function'.""" + module, function = function_path.split(".", 1) + return function_docs(module, function) + + def ifc_edit(self, function_path: str, params: Any = "{}") -> dict: + """Execute an ifcopenshell.api mutation. + + params may be: + - JSON string + - dict (from tool calling / JS) + - JsProxy (handled upstream in embedded.py) + """ + model = self._require_model() + module, function = function_path.split(".", 1) + + if isinstance(params, str): + raw_kwargs = json.loads(params) if params.strip() else {} + elif isinstance(params, dict): + raw_kwargs = params + else: + # e.g. list/None/etc + raw_kwargs = dict(params) if params is not None else {} + + res = run_api(model, module, function, raw_kwargs) + return _jsonify(res) + + # ------------------------ + # Extended query + edit tools + # ------------------------ + def ifc_validate(self, express_rules: bool = False) -> dict[str, Any]: + """Validate the loaded model. Returns {'valid': bool, 'issues': [...]}.""" + return validate_mod.validate(self._require_model(), express_rules=express_rules) + + def ifc_schedule(self, max_depth: int | None = None) -> list[dict[str, Any]]: + """List work schedules and nested tasks from the model. + + max_depth limits subtask expansion (None = unlimited). At the cutoff, + subtasks is replaced with {"truncated": True, "count": N}. + """ + return schedule.schedule(self._require_model(), max_depth=max_depth) + + def ifc_cost(self, max_depth: int | None = None) -> list[dict[str, Any]]: + """List cost schedules and nested cost items from the model. + + max_depth limits cost item expansion (None = unlimited). At the cutoff, + subitems is replaced with {"truncated": True, "count": N}. + """ + return cost_mod.cost(self._require_model(), max_depth=max_depth) + + def ifc_schema(self, entity_type: str) -> dict[str, Any]: + """Return IFC class documentation for entity_type using the model's schema version.""" + return schema.schema(self._require_model(), entity_type) + + def ifc_plot( + self, + selector: str = "", + element_ids: list[int] | None = None, + view: str = "floorplan", + width_mm: float = 297.0, + height_mm: float = 420.0, + scale: float = 1.0 / 100.0, + png_width: int = 1024, + png_height: int = 1024, + output_format: str = "png", + ) -> bytes: + """Generate a 2D technical drawing (floor plan, elevation, or section) and return image bytes. + + Uses ifcopenshell.draw to produce SVG output which is rasterised to PNG via CairoSVG + when output_format is 'png'. + + :param selector: ifcopenshell selector to restrict plotted elements + (e.g. ``'IfcWall'``). Omit to plot the whole model. + :param element_ids: Step IDs of elements to highlight. Other elements + are faded to 10% opacity so the subject stands out. + :param view: Drawing view — ``floorplan`` (default), ``elevation``, + ``section``, or ``auto``. + :param width_mm: Paper width in mm (default 297 = A4). + :param height_mm: Paper height in mm (default 420 = A4). + :param scale: Model-to-paper scale ratio (default 0.01 = 1:100). + :param png_width: Raster output width in pixels (default 1024). + :param png_height: Raster output height in pixels (default 1024). + :param output_format: ``'svg'`` or ``'png'`` (default ``'png'``). + :return: SVG or PNG bytes depending on output_format. + """ + model = self._require_model() + return plot_mod.plot( + model, + output_format=output_format, + selector=selector if selector else None, + element_ids=element_ids, + view=view, + width_mm=width_mm, + height_mm=height_mm, + scale=scale, + png_width=png_width, + png_height=png_height, + ) + + def ifc_render( + self, + selector: str = "", + element_ids: list[int] | None = None, + view: str = "iso", + ) -> bytes: + """Render the loaded model to a PNG image and return raw bytes. + + :param selector: ifcopenshell selector to restrict rendered elements + (e.g. ``'IfcWall'``). Omit to render the whole model. + :param element_ids: Step IDs of elements to highlight. Other elements + are rendered in translucent grey. + :param view: Camera angle: ``iso``, ``top``, ``south``, ``north``, + ``east``, or ``west``. + :return: PNG image as raw bytes. + """ + model = self._require_model() + return render_mod.render( + model, + selector=selector if selector else None, + element_ids=element_ids, + view=view, + ) + + # ------------------------ + # Shape builder tools + # ------------------------ + def ifc_shape_list(self) -> list[dict]: + """List all ShapeBuilder geometry methods with one-line descriptions and parameter names.""" + return _list_shape_methods() + + def ifc_shape_docs(self, method: str) -> dict: + """Full documentation for a ShapeBuilder method: params, types, return value.""" + return _shape_method_docs(method) + + def ifc_shape(self, method: str, params: Any = "{}") -> dict: + """Call a ShapeBuilder method by name. Returns the created entity's step ID. + + params is a JSON string of keyword arguments. Pass entity references as integer + step IDs; vectors as JSON arrays (e.g. [1.0, 0.0, 0.0]). + """ + model = self._require_model() + + from ifcopenshell.util.shape_builder import ShapeBuilder + + if method.startswith("_"): + raise IfcSessionError(f"Private method '{method}' is not accessible") + fn = getattr(ShapeBuilder, method, None) + if fn is None: + return {"ok": False, "error": f"ShapeBuilder has no method '{method}'"} + + if isinstance(params, str): + raw_kwargs = json.loads(params) if params.strip() else {} + elif isinstance(params, dict): + raw_kwargs = params + else: + raw_kwargs = {} + + try: + coerced = _coerce_shape_params(fn, raw_kwargs, model) + result = fn(ShapeBuilder(model), **coerced) + return {"ok": True, "result": _jsonify(result)} + except Exception as e: + return {"ok": False, "error": f"{type(e).__name__}: {e}"} + + def ifc_quantify(self, rule: str, selector: str = "") -> dict[str, Any]: + """Run quantity take-off on the model using the named rule. + + Modifies the model in-place; call ifc_save() after. + """ + model = self._require_model() + return run_quantify(model, rule, selector=selector if selector else None) + + # ------------------------ + # Generic dispatcher + tool specs for LLMs + # ------------------------ + def dispatch(self, name: str, args: dict[str, Any] | None = None) -> Any: + args = args or {} + fn = getattr(self, name, None) + if not callable(fn): + raise IfcSessionError(f"Unknown tool: {name}") + return _jsonify(fn(**args)) + + def openai_tools(self) -> list[dict[str, Any]]: + """Tool schemas in the OpenAI 'Responses API' format (type=function).""" + # Keep schemas tight so the model calls tools correctly. + return [ + { + "type": "function", + "name": "ifc_new", + "description": "Create a new empty IFC model in memory.", + "parameters": { + "type": "object", + "properties": {"schema": {"type": "string", "description": "IFC schema, e.g. IFC4"}}, + "required": [], + "additionalProperties": False, + }, + }, + { + "type": "function", + "name": "ifc_summary", + "description": "Get a concise overview of the loaded IFC model.", + "parameters": {"type": "object", "properties": {}, "required": [], "additionalProperties": False}, + }, + { + "type": "function", + "name": "ifc_tree", + "description": "Get the full spatial hierarchy tree.", + "parameters": {"type": "object", "properties": {}, "required": [], "additionalProperties": False}, + }, + { + "type": "function", + "name": "ifc_select", + "description": ( + "Select elements using ifcopenshell selector syntax. " + "Examples: 'IfcWall', 'IfcWall, IfcColumn', '! IfcWall', " + "'IfcWall, Name = \"My Wall\"', 'type = \"Concrete Wall\"', " + "'material = \"Concrete\"'." + ), + "parameters": { + "type": "object", + "properties": {"query": {"type": "string"}}, + "required": ["query"], + "additionalProperties": False, + }, + }, + { + "type": "function", + "name": "ifc_info", + "description": "Inspect an entity by STEP id.", + "parameters": { + "type": "object", + "properties": {"element_id": {"type": "integer"}}, + "required": ["element_id"], + "additionalProperties": False, + }, + }, + { + "type": "function", + "name": "ifc_relations", + "description": "Get relationships for an element. traverse='up' walks to IfcProject.", + "parameters": { + "type": "object", + "properties": {"element_id": {"type": "integer"}, "traverse": {"type": "string"}}, + "required": ["element_id"], + "additionalProperties": False, + }, + }, + { + "type": "function", + "name": "ifc_clash", + "description": "Run clash/clearance checks for an element.", + "parameters": { + "type": "object", + "properties": { + "element_id": {"type": "integer"}, + "clearance": {"type": "number"}, + "tolerance": {"type": "number"}, + "scope": {"type": "string", "description": "storey or all"}, + }, + "required": ["element_id"], + "additionalProperties": False, + }, + }, + { + "type": "function", + "name": "ifc_contexts", + "description": "List all geometric representation contexts and subcontexts with their step IDs, context type, identifier, and target view. Use this to find the context ID required for geometry-creation API calls.", + "parameters": {"type": "object", "properties": {}, "required": [], "additionalProperties": False}, + }, + { + "type": "function", + "name": "ifc_materials", + "description": "List all materials and material sets (IfcMaterial, IfcMaterialLayerSet, IfcMaterialConstituentSet, IfcMaterialProfileSet) with their layers, constituents, or profiles.", + "parameters": {"type": "object", "properties": {}, "required": [], "additionalProperties": False}, + }, + { + "type": "function", + "name": "ifc_list", + "description": "List ifcopenshell.api modules or functions within a module.", + "parameters": { + "type": "object", + "properties": {"module": {"type": "string"}}, + "required": [], + "additionalProperties": False, + }, + }, + { + "type": "function", + "name": "ifc_docs", + "description": "Get documentation for an ifcopenshell.api function, 'module.function'.", + "parameters": { + "type": "object", + "properties": {"function_path": {"type": "string"}}, + "required": ["function_path"], + "additionalProperties": False, + }, + }, + { + "type": "function", + "name": "ifc_edit", + "description": "Execute an ifcopenshell.api mutation; params is a JSON string of stringly-typed kwargs.", + "parameters": { + "type": "object", + "properties": {"function_path": {"type": "string"}, "params": {"type": "string"}}, + "required": ["function_path"], + "additionalProperties": False, + }, + }, + { + "type": "function", + "name": "ifc_validate", + "description": "Validate the loaded model. Returns valid bool and list of issues.", + "parameters": { + "type": "object", + "properties": { + "express_rules": {"type": "boolean", "description": "Also check EXPRESS rules (slower)"} + }, + "required": [], + "additionalProperties": False, + }, + }, + { + "type": "function", + "name": "ifc_schedule", + "description": "List work schedules and nested tasks. Use max_depth=1 for top-level phases only on large projects.", + "parameters": { + "type": "object", + "properties": { + "max_depth": { + "type": "integer", + "description": "Max levels of subtask expansion (omit for unlimited)", + } + }, + "required": [], + "additionalProperties": False, + }, + }, + { + "type": "function", + "name": "ifc_cost", + "description": "List cost schedules and nested cost items. Use max_depth=1 for top-level sections only on large BoQs.", + "parameters": { + "type": "object", + "properties": { + "max_depth": { + "type": "integer", + "description": "Max levels of cost item expansion (omit for unlimited)", + } + }, + "required": [], + "additionalProperties": False, + }, + }, + { + "type": "function", + "name": "ifc_schema", + "description": "Return IFC class documentation for an entity type.", + "parameters": { + "type": "object", + "properties": {"entity_type": {"type": "string", "description": "IFC entity type, e.g. IfcWall"}}, + "required": ["entity_type"], + "additionalProperties": False, + }, + }, + { + "type": "function", + "name": "ifc_quantify", + "description": "Run quantity take-off (QTO) on the model. Modifies model in-place; call ifc_save() after.", + "parameters": { + "type": "object", + "properties": { + "rule": {"type": "string", "description": "QTO rule name, e.g. IFC4QtoBaseQuantities"}, + "selector": { + "type": "string", + "description": "ifcopenshell selector to restrict elements (default: all IfcElement)", + }, + }, + "required": ["rule"], + "additionalProperties": False, + }, + }, + { + "type": "function", + "name": "ifc_render", + "description": ( + "Render the loaded IFC model to a PNG image for visual inspection. " + "Use selector to restrict which elements are rendered (e.g. a single storey). " + "Use element_ids to highlight elements against a greyed-out background. " + "Returns base64-encoded PNG bytes." + ), + "parameters": { + "type": "object", + "properties": { + "selector": {"type": "string", "description": "ifcopenshell selector (default: whole model)"}, + "element_ids": { + "type": "array", + "items": {"type": "integer"}, + "description": "Step IDs of elements to highlight", + }, + "view": { + "type": "string", + "enum": ["iso", "top", "south", "north", "east", "west"], + "description": "Camera angle (default: iso)", + }, + }, + "required": [], + "additionalProperties": False, + }, + }, + ] diff --git a/src/ifcmcp/ifcmcp/embedded.py b/src/ifcmcp/ifcmcp/embedded.py new file mode 100644 index 00000000000..4ad99ba1faa --- /dev/null +++ b/src/ifcmcp/ifcmcp/embedded.py @@ -0,0 +1,60 @@ +# This file was generated with the assistance of an AI coding tool. +from __future__ import annotations + +from collections.abc import Mapping +from typing import Any + +from ifcmcp.core import IfcSession + +session = IfcSession() + +# Optional imports only available under Pyodide +try: + from pyodide.ffi import JsProxy, to_py # type: ignore +except Exception: # pragma: no cover + JsProxy = None # type: ignore + to_py = None # type: ignore + + +def _coerce_args(args: Any) -> dict[str, Any]: + """Convert JS objects / JsProxy / mappings into a real Python dict.""" + if args is None: + return {} + + # Pyodide: JS object arrives as JsProxy; convert recursively to Python. + if JsProxy is not None and isinstance(args, JsProxy): + # dict_converter=dict ensures JS object -> Python dict (not Map) + return to_py(args, dict_converter=dict) + + # Already a Python dict + if isinstance(args, dict): + return args + + # Any Mapping-like object + if isinstance(args, Mapping): + return dict(args) + + # Last resort: try dict() coercion + try: + return dict(args) + except Exception as e: + raise TypeError(f"Tool args must be a mapping/dict; got {type(args)}") from e + + +def tools_openai() -> list[dict[str, Any]]: + return session.openai_tools() + + +def call_tool(name: str, args: Any = None) -> dict[str, Any]: + """ + Non-throwing tool dispatcher. + Always returns: {"ok": bool, "data": ...} or {"ok": false, "error": "...", "error_type": "...", ...} + """ + try: + py_args = _coerce_args(args) + data = session.dispatch(name, py_args) + return {"ok": True, "data": data} + + except Exception as e: + # Keep it short; avoid full tracebacks in tool output unless debugging. + return {"ok": False, "error_type": type(e).__name__, "error": str(e)} diff --git a/src/ifcmcp/ifcmcp/server.py b/src/ifcmcp/ifcmcp/server.py new file mode 100644 index 00000000000..08ba86a2cb1 --- /dev/null +++ b/src/ifcmcp/ifcmcp/server.py @@ -0,0 +1,231 @@ +# This file was generated with the assistance of an AI coding tool. +from __future__ import annotations + +import base64 +from typing import Any + +from ifcmcp.core import IfcSession + +try: + from mcp.server.fastmcp import FastMCP # type: ignore + from mcp.types import ImageContent # type: ignore +except Exception: # pragma: no cover + FastMCP = None # type: ignore + ImageContent = None # type: ignore + + +def build_server() -> Any: + """Create the FastMCP server if the dependency is available.""" + if FastMCP is None: + raise ImportError( + "FastMCP is not installed. Install with: pip install ifcmcp[mcp] " "(or add 'mcp' to your environment)." + ) + + session = IfcSession() + + server = FastMCP( + name="ifc-mcp", + instructions=( + "MCP server for querying and editing IFC building models. " + "Load a file first with ifc_load, then use query/edit tools. " + "Save changes with ifc_save." + ), + ) + + # ---- Lifecycle ---- + @server.tool() + def ifc_new(schema: str = "IFC4") -> dict[str, Any]: + return session.ifc_new(schema=schema) + + @server.tool() + def ifc_load(path: str) -> str: + return session.ifc_load(path) + + @server.tool() + def ifc_save(path: str = "") -> str: + return session.ifc_save(path) + + @server.tool() + def ifc_reset() -> dict[str, Any]: + return session.ifc_reset() + + # ---- Query ---- + @server.tool() + def ifc_summary() -> dict[str, Any]: + return session.ifc_summary() + + @server.tool() + def ifc_tree() -> dict[str, Any] | list[dict[str, Any]]: + return session.ifc_tree() + + @server.tool() + def ifc_info(element_id: int) -> dict[str, Any]: + return session.ifc_info(element_id) + + @server.tool() + def ifc_select(query: str) -> list[dict[str, Any]]: + return session.ifc_select(query) + + @server.tool() + def ifc_relations(element_id: int, traverse: str = "") -> dict[str, Any] | list[dict[str, Any]]: + return session.ifc_relations(element_id, traverse=traverse) + + @server.tool() + def ifc_clash( + element_id: int, + clearance: float = 0.0, + tolerance: float = 0.002, + scope: str = "storey", + ) -> dict[str, Any]: + return session.ifc_clash( + element_id=element_id, + clearance=clearance, + tolerance=tolerance, + scope=scope, + ) + + @server.tool() + def ifc_contexts() -> list[dict[str, Any]]: + return session.ifc_contexts() + + @server.tool() + def ifc_materials() -> list[dict[str, Any]]: + return session.ifc_materials() + + # ---- Edit ---- + @server.tool() + def ifc_list(module: str = "") -> list[dict]: + return session.ifc_list(module=module) + + @server.tool() + def ifc_docs(function_path: str) -> dict: + return session.ifc_docs(function_path=function_path) + + @server.tool() + def ifc_edit(function_path: str, params: str = "{}") -> dict: + return session.ifc_edit(function_path=function_path, params=params) + + # ---- Extended query + edit ---- + @server.tool() + def ifc_validate(express_rules: bool = False) -> dict[str, Any]: + return session.ifc_validate(express_rules=express_rules) + + @server.tool() + def ifc_schedule(max_depth: int | None = None) -> list[dict[str, Any]]: + return session.ifc_schedule(max_depth=max_depth) + + @server.tool() + def ifc_cost(max_depth: int | None = None) -> list[dict[str, Any]]: + return session.ifc_cost(max_depth=max_depth) + + @server.tool() + def ifc_schema(entity_type: str) -> dict[str, Any]: + return session.ifc_schema(entity_type=entity_type) + + @server.tool() + def ifc_quantify(rule: str, selector: str = "") -> dict[str, Any]: + return session.ifc_quantify(rule=rule, selector=selector) + + # ---- Shape builder ---- + @server.tool() + def ifc_shape_list() -> list[dict]: + return session.ifc_shape_list() + + @server.tool() + def ifc_shape_docs(method: str) -> dict: + return session.ifc_shape_docs(method=method) + + @server.tool() + def ifc_shape(method: str, params: str = "{}") -> dict: + return session.ifc_shape(method=method, params=params) + + @server.tool(structured_output=False) + def ifc_plot( + selector: str = "", + element_ids: list[int] | None = None, + view: str = "floorplan", + width_mm: float = 297.0, + height_mm: float = 420.0, + scale: float = 1.0 / 100.0, + png_width: int = 1024, + png_height: int = 1024, + output_path: str = "", + ) -> list[ImageContent]: + """Generate a 2D technical drawing of the loaded IFC model. + + Returns an inline PNG image (floor plan, elevation, or section) that the + LLM can inspect to understand the 2D layout of the model. If + ``output_path`` is provided the drawing is also saved to disk — as SVG + when the path ends in ``.svg``, otherwise as PNG. + + :param selector: ifcopenshell selector to restrict plotted elements + (e.g. ``'IfcWall'``). Omit to plot the whole model. + :param element_ids: Step IDs of elements to highlight. Other elements + are faded so the subject stands out. + :param view: Drawing view — ``floorplan`` (default), ``elevation``, + ``section``, or ``auto``. + :param width_mm: Paper width in mm (default 297 = A4 landscape width). + :param height_mm: Paper height in mm (default 420 = A4 landscape height). + :param scale: Model-to-paper scale ratio (default 0.01 = 1:100). + :param png_width: Raster output width in pixels (default 1024). + :param png_height: Raster output height in pixels (default 1024). + :param output_path: Optional file path to save the drawing to disk. + """ + png_bytes = session.ifc_plot( + selector=selector, + element_ids=element_ids, + view=view, + width_mm=width_mm, + height_mm=height_mm, + scale=scale, + png_width=png_width, + png_height=png_height, + output_format="png", + ) + if output_path: + if output_path.endswith(".svg"): + svg_bytes = session.ifc_plot( + selector=selector, + element_ids=element_ids, + view=view, + width_mm=width_mm, + height_mm=height_mm, + scale=scale, + output_format="svg", + ) + with open(output_path, "wb") as f: + f.write(svg_bytes) + else: + with open(output_path, "wb") as f: + f.write(png_bytes) + return [ImageContent(type="image", data=base64.b64encode(png_bytes).decode(), mimeType="image/png")] + + @server.tool(structured_output=False) + def ifc_render( + selector: str = "", + element_ids: list[int] | None = None, + view: str = "iso", + output_path: str = "", + ) -> list[ImageContent]: + """Render the loaded IFC model to a PNG image. + + Returns an inline image the LLM can inspect to understand the spatial + layout of the model or a specific element in context. If + ``output_path`` is provided the PNG is also saved to that file path. + + :param selector: ifcopenshell selector to restrict rendered elements + (e.g. ``'IfcWall'``, ``'IfcBuildingStorey[Name="0"]'``). + Omit to render the whole model. + :param element_ids: Step IDs of elements to highlight. Other elements + are rendered in translucent grey so the subject stands out. + :param view: Camera angle — ``iso`` (default), ``top``, ``south``, + ``north``, ``east``, or ``west``. + :param output_path: Optional file path to save the PNG to disk. + """ + png_bytes = session.ifc_render(selector=selector, element_ids=element_ids, view=view) + if output_path: + with open(output_path, "wb") as f: + f.write(png_bytes) + return [ImageContent(type="image", data=base64.b64encode(png_bytes).decode(), mimeType="image/png")] + + return server diff --git a/src/ifcmcp/pyproject.toml b/src/ifcmcp/pyproject.toml new file mode 100644 index 00000000000..295954d0c5e --- /dev/null +++ b/src/ifcmcp/pyproject.toml @@ -0,0 +1,36 @@ +[build-system] +requires = ["setuptools>=61.0"] +build-backend = "setuptools.build_meta" + +[project] +name = "ifcopenshell-mcp" +version = "0.0.0" +authors = [ + { name="Bruno Postle", email="bruno@postle.net" }, +] +description = "MCP server for querying and editing IFC building models" +readme = "README.md" +keywords = ["IFC", "BIM", "MCP"] +classifiers = [ + "Programming Language :: Python :: 3", + "License :: OSI Approved :: GNU Lesser General Public License v3 or later (LGPLv3+)", +] +dependencies = ["ifcopenshell", "ifcquery", "ifcedit"] + +[project.optional-dependencies] +mcp = ["mcp"] + +[project.scripts] +ifcmcp = "ifcmcp.__main__:main" + +[project.urls] +Homepage = "http://ifcopenshell.org" +Documentation = "https://docs.ifcopenshell.org" +Issues = "https://github.com/IfcOpenShell/IfcOpenShell/issues" + +[tool.setuptools.packages.find] +include = ["ifcmcp*"] +exclude = ["test*"] + +[tool.ruff] +extend = "../../pyproject.toml" diff --git a/src/ifcmcp/tests/__init__.py b/src/ifcmcp/tests/__init__.py new file mode 100644 index 00000000000..0a3bc271a0d --- /dev/null +++ b/src/ifcmcp/tests/__init__.py @@ -0,0 +1 @@ +# This file was generated with the assistance of an AI coding tool. diff --git a/src/ifcmcp/tests/conftest.py b/src/ifcmcp/tests/conftest.py new file mode 100644 index 00000000000..9fae4aef922 --- /dev/null +++ b/src/ifcmcp/tests/conftest.py @@ -0,0 +1,59 @@ +# This file was generated with the assistance of an AI coding tool. +import ifcopenshell +import ifcopenshell.api.aggregate +import ifcopenshell.api.owner.settings +import ifcopenshell.api.project +import ifcopenshell.api.root +import ifcopenshell.api.spatial +import ifcopenshell.api.unit +import pytest + +from ifcmcp.core import IfcSession + + +@pytest.fixture +def session(): + return IfcSession() + + +@pytest.fixture +def model(): + """IFC4 model with a spatial hierarchy, a wall, and a slab.""" + f = ifcopenshell.api.project.create_file() + ifcopenshell.api.owner.settings.get_user = lambda ifc: (ifc.by_type("IfcPersonAndOrganization") or [None])[0] + ifcopenshell.api.owner.settings.get_application = lambda ifc: (ifc.by_type("IfcApplication") or [None])[0] + + project = ifcopenshell.api.root.create_entity(f, ifc_class="IfcProject", name="TestProject") + ifcopenshell.api.unit.assign_unit(f) + + site = ifcopenshell.api.root.create_entity(f, ifc_class="IfcSite", name="TestSite") + building = ifcopenshell.api.root.create_entity(f, ifc_class="IfcBuilding", name="TestBuilding") + storey = ifcopenshell.api.root.create_entity(f, ifc_class="IfcBuildingStorey", name="Ground Floor") + + ifcopenshell.api.aggregate.assign_object(f, products=[site], relating_object=project) + ifcopenshell.api.aggregate.assign_object(f, products=[building], relating_object=site) + ifcopenshell.api.aggregate.assign_object(f, products=[storey], relating_object=building) + + wall = ifcopenshell.api.root.create_entity(f, ifc_class="IfcWall", name="Wall001") + ifcopenshell.api.spatial.assign_container(f, products=[wall], relating_structure=storey) + + slab = ifcopenshell.api.root.create_entity(f, ifc_class="IfcSlab", name="Slab001") + ifcopenshell.api.spatial.assign_container(f, products=[slab], relating_structure=storey) + + return f + + +@pytest.fixture +def model_file(model, tmp_path): + """Write the model fixture to a temp file and return the path.""" + path = tmp_path / "test.ifc" + model.write(str(path)) + return str(path) + + +@pytest.fixture +def loaded_session(model): + """An IfcSession with an in-memory model already loaded (no file path).""" + s = IfcSession() + s.model = model + return s diff --git a/src/ifcmcp/tests/test_edit.py b/src/ifcmcp/tests/test_edit.py new file mode 100644 index 00000000000..778b2322493 --- /dev/null +++ b/src/ifcmcp/tests/test_edit.py @@ -0,0 +1,96 @@ +# This file was generated with the assistance of an AI coding tool. +import json + +import ifcopenshell +import pytest + +from ifcmcp.core import IfcSession, IfcSessionError + + +class TestNoModel: + def test_edit_no_model(self, session): + with pytest.raises(IfcSessionError, match="No model loaded"): + session.ifc_edit("root.create_entity") + + +class TestList: + def test_list_all_modules(self, loaded_session): + result = loaded_session.ifc_list() + assert isinstance(result, list) + assert len(result) > 0 + modules = [m["module"] for m in result] + assert "root" in modules + assert "spatial" in modules + + def test_list_module_functions(self, loaded_session): + result = loaded_session.ifc_list(module="root") + assert isinstance(result, list) + names = [f["name"] for f in result] + assert "create_entity" in names + + def test_list_empty_string_returns_modules(self, loaded_session): + result = loaded_session.ifc_list(module="") + assert isinstance(result, list) + assert any(m["module"] == "root" for m in result) + + +class TestDocs: + def test_docs_create_entity(self, loaded_session): + result = loaded_session.ifc_docs("root.create_entity") + assert result["module"] == "root" + assert result["function"] == "create_entity" + assert "params" in result + + def test_docs_bad_format(self, loaded_session): + with pytest.raises(ValueError): + loaded_session.ifc_docs("no_dot_here") + + +class TestEdit: + def test_create_entity(self, loaded_session): + result = loaded_session.ifc_edit("root.create_entity", json.dumps({"ifc_class": "IfcWall", "name": "NewWall"})) + assert result["ok"] is True + assert result["result"]["type"] == "IfcWall" + assert result["result"]["name"] == "NewWall" + + def test_create_entity_default_params(self, loaded_session): + result = loaded_session.ifc_edit("root.create_entity", "{}") + assert result["ok"] is True + + def test_unknown_function(self, loaded_session): + result = loaded_session.ifc_edit("root.nonexistent", "{}") + assert result["ok"] is False + assert "Cannot find" in result["error"] + + def test_unknown_parameter(self, loaded_session): + result = loaded_session.ifc_edit("root.create_entity", json.dumps({"bogus": "value"})) + assert result["ok"] is False + assert "Unknown parameter" in result["error"] + + def test_bad_json(self, loaded_session): + with pytest.raises(json.JSONDecodeError): + loaded_session.ifc_edit("root.create_entity", "not json") + + def test_edit_does_not_save(self, loaded_session, tmp_path): + """Verify that ifc_edit mutates the in-memory model but does not write to disk.""" + path = str(tmp_path / "test.ifc") + loaded_session.model.write(path) + loaded_session.model_path = path + + before_count = sum(1 for _ in loaded_session.model) + loaded_session.ifc_edit("root.create_entity", json.dumps({"ifc_class": "IfcWall", "name": "Unsaved"})) + after_count = sum(1 for _ in loaded_session.model) + assert after_count == before_count + 1 + + on_disk = ifcopenshell.open(path) + disk_count = sum(1 for _ in on_disk) + assert disk_count == before_count + + def test_assign_container(self, loaded_session): + wall = loaded_session.model.by_type("IfcWall")[0] + storey = loaded_session.model.by_type("IfcBuildingStorey")[0] + result = loaded_session.ifc_edit( + "spatial.assign_container", + json.dumps({"products": str(wall.id()), "relating_structure": str(storey.id())}), + ) + assert result["ok"] is True diff --git a/src/ifcmcp/tests/test_query.py b/src/ifcmcp/tests/test_query.py new file mode 100644 index 00000000000..e0a28ae1c0a --- /dev/null +++ b/src/ifcmcp/tests/test_query.py @@ -0,0 +1,113 @@ +# This file was generated with the assistance of an AI coding tool. +import pytest + +from ifcmcp.core import IfcSessionError + + +class TestNoModel: + """All query tools should fail when no model is loaded.""" + + def test_summary_no_model(self, session): + with pytest.raises(IfcSessionError, match="No model loaded"): + session.ifc_summary() + + def test_tree_no_model(self, session): + with pytest.raises(IfcSessionError, match="No model loaded"): + session.ifc_tree() + + def test_info_no_model(self, session): + with pytest.raises(IfcSessionError, match="No model loaded"): + session.ifc_info(1) + + def test_select_no_model(self, session): + with pytest.raises(IfcSessionError, match="No model loaded"): + session.ifc_select("IfcWall") + + def test_relations_no_model(self, session): + with pytest.raises(IfcSessionError, match="No model loaded"): + session.ifc_relations(1) + + +class TestSummary: + def test_schema(self, loaded_session): + result = loaded_session.ifc_summary() + assert result["schema"] == "IFC4" + + def test_total_entities(self, loaded_session): + result = loaded_session.ifc_summary() + assert result["total_entities"] > 0 + + def test_project_name(self, loaded_session): + result = loaded_session.ifc_summary() + assert result["project"]["name"] == "TestProject" + + def test_type_counts(self, loaded_session): + result = loaded_session.ifc_summary() + assert result["types"]["IfcWall"] == 1 + assert result["types"]["IfcSlab"] == 1 + + +class TestTree: + def test_root_is_project(self, loaded_session): + result = loaded_session.ifc_tree() + assert result["type"] == "IfcProject" + assert result["name"] == "TestProject" + + def test_hierarchy_depth(self, loaded_session): + result = loaded_session.ifc_tree() + site = result["children"][0] + assert site["type"] == "IfcSite" + building = site["children"][0] + assert building["type"] == "IfcBuilding" + storey = building["children"][0] + assert storey["type"] == "IfcBuildingStorey" + + +class TestInfo: + def test_wall_info(self, loaded_session): + wall = loaded_session.model.by_type("IfcWall")[0] + result = loaded_session.ifc_info(wall.id()) + assert result["id"] == wall.id() + assert result["type"] == "IfcWall" + + def test_invalid_id(self, loaded_session): + with pytest.raises(Exception): + loaded_session.ifc_info(999999) + + +class TestSelect: + def test_select_walls(self, loaded_session): + result = loaded_session.ifc_select("IfcWall") + assert len(result) == 1 + assert result[0]["type"] == "IfcWall" + assert result[0]["name"] == "Wall001" + + def test_select_slabs(self, loaded_session): + result = loaded_session.ifc_select("IfcSlab") + assert len(result) == 1 + assert result[0]["name"] == "Slab001" + + def test_select_no_match(self, loaded_session): + result = loaded_session.ifc_select("IfcWindow") + assert result == [] + + +class TestRelations: + def test_wall_relations(self, loaded_session): + wall = loaded_session.model.by_type("IfcWall")[0] + result = loaded_session.ifc_relations(wall.id()) + assert result["id"] == wall.id() + assert result["type"] == "IfcWall" + assert "hierarchy" in result + + def test_traverse_up(self, loaded_session): + wall = loaded_session.model.by_type("IfcWall")[0] + result = loaded_session.ifc_relations(wall.id(), traverse="up") + assert isinstance(result, list) + assert result[0]["type"] == "IfcWall" + assert result[-1]["type"] == "IfcProject" + + def test_traverse_empty_string_means_no_traverse(self, loaded_session): + wall = loaded_session.model.by_type("IfcWall")[0] + result = loaded_session.ifc_relations(wall.id(), traverse="") + assert isinstance(result, dict) diff --git a/src/ifcmcp/tests/test_server.py b/src/ifcmcp/tests/test_server.py new file mode 100644 index 00000000000..ed41434df73 --- /dev/null +++ b/src/ifcmcp/tests/test_server.py @@ -0,0 +1,106 @@ +# This file was generated with the assistance of an AI coding tool. +from unittest.mock import patch + +import pytest + +from ifcmcp.server import build_server + + +class TestServerRegistration: + def test_server_name(self): + server = build_server() + assert server.name == "ifc-mcp" + + def test_all_tools_registered(self): + server = build_server() + tools = [t.name for t in server._tool_manager.list_tools()] + expected = [ + "ifc_load", + "ifc_save", + "ifc_summary", + "ifc_tree", + "ifc_info", + "ifc_select", + "ifc_relations", + "ifc_clash", + "ifc_list", + "ifc_docs", + "ifc_edit", + ] + for name in expected: + assert name in tools, f"Tool {name} not registered" + + +@pytest.fixture +def tool_fns(): + """Return a dict of tool name → raw function from a freshly built server.""" + server = build_server() + return {t.name: t.fn for t in server._tool_manager.list_tools()} + + +PNG_FAKE = b"\x89PNG\r\n\x1a\nFAKE" +SVG_FAKE = b"FAKE" + + +class TestRenderOutputPath: + def test_no_output_path_no_file_written(self, tool_fns, tmp_path): + with patch("ifcmcp.core.IfcSession.ifc_render", return_value=PNG_FAKE): + tool_fns["ifc_render"](selector="", element_ids=None, view="iso", output_path="") + assert list(tmp_path.iterdir()) == [] + + def test_png_output_path_writes_file(self, tool_fns, tmp_path): + out = str(tmp_path / "render.png") + with patch("ifcmcp.core.IfcSession.ifc_render", return_value=PNG_FAKE): + tool_fns["ifc_render"](selector="", element_ids=None, view="iso", output_path=out) + assert open(out, "rb").read() == PNG_FAKE + + +class TestPlotOutputPath: + def test_no_output_path_no_file_written(self, tool_fns, tmp_path): + with patch("ifcmcp.core.IfcSession.ifc_plot", return_value=PNG_FAKE): + tool_fns["ifc_plot"]( + selector="", + element_ids=None, + view="floorplan", + width_mm=297.0, + height_mm=420.0, + scale=0.01, + png_width=1024, + png_height=1024, + output_path="", + ) + assert list(tmp_path.iterdir()) == [] + + def test_png_output_path_writes_png(self, tool_fns, tmp_path): + out = str(tmp_path / "plot.png") + with patch("ifcmcp.core.IfcSession.ifc_plot", return_value=PNG_FAKE): + tool_fns["ifc_plot"]( + selector="", + element_ids=None, + view="floorplan", + width_mm=297.0, + height_mm=420.0, + scale=0.01, + png_width=1024, + png_height=1024, + output_path=out, + ) + assert open(out, "rb").read() == PNG_FAKE + + def test_svg_output_path_writes_svg(self, tool_fns, tmp_path): + out = str(tmp_path / "plot.svg") + # ifc_plot is called twice: once with "png" for the inline image, + # once with "svg" for the file. + with patch("ifcmcp.core.IfcSession.ifc_plot", side_effect=[PNG_FAKE, SVG_FAKE]): + tool_fns["ifc_plot"]( + selector="", + element_ids=None, + view="floorplan", + width_mm=297.0, + height_mm=420.0, + scale=0.01, + png_width=1024, + png_height=1024, + output_path=out, + ) + assert open(out, "rb").read() == SVG_FAKE diff --git a/src/ifcmcp/tests/test_session.py b/src/ifcmcp/tests/test_session.py new file mode 100644 index 00000000000..4fa59120c0c --- /dev/null +++ b/src/ifcmcp/tests/test_session.py @@ -0,0 +1,62 @@ +# This file was generated with the assistance of an AI coding tool. +from unittest.mock import patch + +import ifcopenshell +import pytest + +from ifcmcp.core import IfcSession, IfcSessionError + + +class TestLoad: + def test_load_file(self, session, model_file): + result = session.ifc_load(model_file) + assert "IFC4" in result + assert session.model is not None + assert session.model_path == model_file + + def test_load_sets_entity_count(self, session, model_file): + result = session.ifc_load(model_file) + assert "entities" in result + + def test_load_nonexistent_file(self, session): + with pytest.raises(Exception): + session.ifc_load("/nonexistent/path/model.ifc") + + +class TestSave: + def test_save_no_model(self, session): + with pytest.raises(IfcSessionError, match="No model loaded"): + session.ifc_save() + + def test_save_overwrites_original(self, session, model_file): + session.ifc_load(model_file) + result = session.ifc_save() + assert model_file in result + + def test_save_to_new_path(self, session, model_file, tmp_path): + session.ifc_load(model_file) + new_path = str(tmp_path / "output.ifc") + result = session.ifc_save(new_path) + assert new_path in result + reloaded = ifcopenshell.open(new_path) + assert reloaded.schema == "IFC4" + + def test_save_no_path_no_original(self, loaded_session): + with pytest.raises(IfcSessionError, match="No path specified"): + loaded_session.ifc_save() + + +class TestIfcPlotOutputFormat: + """ifc_plot should pass output_format through to the underlying plot function.""" + + def test_default_output_format_is_png(self, loaded_session): + with patch("ifcmcp.core.plot_mod.plot", return_value=b"PNG_FAKE") as mock_plot: + loaded_session.ifc_plot() + mock_plot.assert_called_once() + assert mock_plot.call_args.kwargs["output_format"] == "png" + + def test_svg_output_format(self, loaded_session): + with patch("ifcmcp.core.plot_mod.plot", return_value=b"SVG_FAKE") as mock_plot: + result = loaded_session.ifc_plot(output_format="svg") + assert result == b"SVG_FAKE" + assert mock_plot.call_args.kwargs["output_format"] == "svg" diff --git a/src/ifcmcp/tests/test_shape.py b/src/ifcmcp/tests/test_shape.py new file mode 100644 index 00000000000..1b657d5730f --- /dev/null +++ b/src/ifcmcp/tests/test_shape.py @@ -0,0 +1,141 @@ +# This file was generated with the assistance of an AI coding tool. +import json + +import pytest + +from ifcmcp.core import IfcSessionError + + +class TestShapeList: + def test_returns_list(self, loaded_session): + result = loaded_session.ifc_shape_list() + assert isinstance(result, list) + assert len(result) > 0 + + def test_has_expected_methods(self, loaded_session): + result = loaded_session.ifc_shape_list() + names = [m["method"] for m in result] + assert "polyline" in names + assert "rectangle" in names + assert "extrude" in names + assert "profile" in names + assert "get_representation" in names + + def test_well_documented_methods_have_descriptions(self, loaded_session): + result = loaded_session.ifc_shape_list() + by_name = {m["method"]: m for m in result} + # These methods have detailed docstrings + for name in ("polyline", "extrude", "rectangle", "profile", "get_representation"): + assert by_name[name]["description"], f"'{name}' has no description" + + def test_no_private_methods(self, loaded_session): + result = loaded_session.ifc_shape_list() + assert not any(m["method"].startswith("_") for m in result) + + def test_does_not_require_model(self, session): + # ifc_shape_list is pure introspection — no model needed + result = session.ifc_shape_list() + assert isinstance(result, list) + + +class TestShapeDocs: + def test_extrude_docs(self, loaded_session): + result = loaded_session.ifc_shape_docs("extrude") + assert result["method"] == "extrude" + assert result["description"] + assert "params" in result + param_names = [p["name"] for p in result["params"]] + assert "profile_or_curve" in param_names + assert "magnitude" in param_names + + def test_has_return_type(self, loaded_session): + result = loaded_session.ifc_shape_docs("rectangle") + assert "return_type" in result + + def test_has_param_descriptions(self, loaded_session): + result = loaded_session.ifc_shape_docs("polyline") + params_with_desc = [p for p in result["params"] if "description" in p] + assert len(params_with_desc) > 0 + + def test_unknown_method(self, loaded_session): + with pytest.raises(ValueError, match="no method"): + loaded_session.ifc_shape_docs("nonexistent_method") + + def test_private_method_rejected(self, loaded_session): + with pytest.raises(ValueError): + loaded_session.ifc_shape_docs("__init__") + + def test_does_not_require_model(self, session): + result = session.ifc_shape_docs("circle") + assert result["method"] == "circle" + + +class TestShapeExecute: + def test_rectangle(self, loaded_session): + result = loaded_session.ifc_shape("rectangle", json.dumps({"size": [4.0, 0.2]})) + assert result["ok"] is True + assert result["result"]["type"] == "IfcIndexedPolyCurve" + + def test_circle(self, loaded_session): + result = loaded_session.ifc_shape("circle", json.dumps({"center": [0.0, 0.0], "radius": 0.5})) + assert result["ok"] is True + assert result["result"]["type"] == "IfcCircle" + + def test_extrude_chained_from_rectangle(self, loaded_session): + rect = loaded_session.ifc_shape("rectangle", json.dumps({"size": [4.0, 0.2]})) + rect_id = rect["result"]["id"] + result = loaded_session.ifc_shape("extrude", json.dumps({"profile_or_curve": rect_id, "magnitude": 3.0})) + assert result["ok"] is True + assert result["result"]["type"] == "IfcExtrudedAreaSolid" + + def test_entity_id_as_integer(self, loaded_session): + """Entity IDs should be accepted as plain integers (from JSON).""" + rect = loaded_session.ifc_shape("rectangle", json.dumps({"size": [1.0, 1.0]})) + rect_id = rect["result"]["id"] + # Pass as int, not string + result = loaded_session.ifc_shape("extrude", json.dumps({"profile_or_curve": rect_id, "magnitude": 1.0})) + assert result["ok"] is True + + def test_rotate_2d_point_returns_list(self, loaded_session): + """Methods returning numpy arrays should give back plain lists.""" + result = loaded_session.ifc_shape( + "rotate_2d_point", json.dumps({"point_2d": [1.0, 0.0], "angle": 90.0, "counter_clockwise": True}) + ) + assert result["ok"] is True + assert isinstance(result["result"], list) + assert len(result["result"]) == 2 + + def test_set_polyline_coords_returns_none(self, loaded_session): + """In-place methods that return None should give ok=True, result=None.""" + rect = loaded_session.ifc_shape("rectangle", json.dumps({"size": [2.0, 2.0]})) + rect_id = rect["result"]["id"] + result = loaded_session.ifc_shape( + "set_polyline_coords", + json.dumps({"polyline": rect_id, "coords": [[0.0, 0.0], [3.0, 0.0], [3.0, 3.0], [0.0, 3.0]]}), + ) + assert result["ok"] is True + assert result["result"] is None + + def test_unknown_method(self, loaded_session): + result = loaded_session.ifc_shape("nonexistent_method", "{}") + assert result["ok"] is False + assert "error" in result + + def test_private_method_rejected(self, loaded_session): + with pytest.raises(IfcSessionError): + loaded_session.ifc_shape("__init__", "{}") + + def test_no_model_raises(self, session): + with pytest.raises(IfcSessionError, match="No model loaded"): + session.ifc_shape("rectangle", "{}") + + def test_params_as_dict(self, loaded_session): + """params can be passed as a dict (not just a JSON string).""" + result = loaded_session.ifc_shape("rectangle", {"size": [2.0, 1.0]}) + assert result["ok"] is True + + def test_error_on_bad_params(self, loaded_session): + """Bad parameters should give ok=False with an error message.""" + result = loaded_session.ifc_shape("extrude", json.dumps({"profile_or_curve": 999999, "magnitude": 1.0})) + assert result["ok"] is False + assert "error" in result diff --git a/src/ifcopenshell-python/Makefile b/src/ifcopenshell-python/Makefile index 78370a46fbd..7d6592635d9 100644 --- a/src/ifcopenshell-python/Makefile +++ b/src/ifcopenshell-python/Makefile @@ -5,8 +5,8 @@ VERSION_DATE:=$(shell date '+%y%m%d') PYVERSION:=py311 PLATFORM:=linux64 -PYTHON:=python3.11 -PIP:=pip3.11 +PYTHON:=python3 +PIP:=pip3 SED:=sed -i VENV_ACTIVATE:=bin/activate @@ -27,29 +27,15 @@ SED:=sed -i '' -e endif endif -# TODO: we should simplify this at some point... -ifeq ($(PYVERSION), py39) -PYNUMBER:=39 -endif -ifeq ($(PYVERSION), py310) -PYNUMBER:=310 -endif -ifeq ($(PYVERSION), py311) -PYNUMBER:=311 -endif -ifeq ($(PYVERSION), py312) -PYNUMBER:=312 -endif -ifeq ($(PYVERSION), py313) -PYNUMBER:=313 -endif -ifeq ($(PYVERSION), py314) -PYNUMBER:=314 -endif -ifndef PYNUMBER -$(error Unsupported PYVERSION '$(PYVERSION)') +SUPPORTED_PYVERSIONS := py310 py311 py312 py313 py314 + +ifeq ($(filter $(PYVERSION),$(SUPPORTED_PYVERSIONS)),) +$(error Unsupported PYVERSION=$(PYVERSION). Must be one of $(SUPPORTED_PYVERSIONS)) endif +PYMINOR:=$(subst py3,,$(PYVERSION)) +PYNUMBER:=3$(PYMINOR) + # We actually do support glibc 2.28-2.30 (see #5636) # but those are old and there's no demand for it. ifeq ($(PLATFORM), linux64) @@ -68,14 +54,15 @@ ifeq ($(PLATFORM), win64) PLATFORMTAG:=win_amd64 endif -BINARY_VERSION:=0.8.4 -BUILD_COMMIT:=e8eb5e4 +BINARY_VERSION:=0.8.5 +BUILD_COMMIT:=1c5b825 IOS_URL:=https://s3.amazonaws.com/ifcopenshell-builds/ifcopenshell-python-$(PYNUMBER)-v$(BINARY_VERSION)-$(BUILD_COMMIT)-$(PLATFORM).zip IFCCONVERT_URL:=https://s3.amazonaws.com/ifcopenshell-builds/IfcConvert-v$(BINARY_VERSION)-$(BUILD_COMMIT)-$(PLATFORM).zip .PHONY: build-urls build-urls: @echo "You can provide one of the 4 platforms (linux64, macos64, macosm164, win64) using 'PLATFORM=xxx'." + @echo "And Python version using 'PYNUMBER=xx' (e.g. 'PYNUMBER=311')." @echo ${IOS_URL} @echo ${IFCCONVERT_URL} @@ -92,10 +79,6 @@ test-parallel: test-mathutils: pytest -p no:pytest-blender test/util/test_shape_builder.py -.PHONY: build-ids-docs -build-ids-docs: - mkdir -p test/build - cd test && python ids_doc_generator.py .PHONY: qa qa: diff --git a/src/ifcopenshell-python/docs/ifcconvert.rst b/src/ifcopenshell-python/docs/ifcconvert.rst index bbdbe0c14c3..beef450578d 100644 --- a/src/ifcopenshell-python/docs/ifcconvert.rst +++ b/src/ifcopenshell-python/docs/ifcconvert.rst @@ -12,7 +12,8 @@ table below. +=========================+=========================+======================+ | .ifc | .obj, .dae, .glb, .stp, | IfcConvert | | | .igs, .xml, .svg, .h5, | | -| | .ttl, .ifc | | +| | .ttl, .ifc, .rdb, | | +| | .json (xeokit) | | +-------------------------+-------------------------+----------------------+ | .ifc | .dae, .abc, .usd, .obj, | Bonsai_ | | | .ply, .stl, .fbx, .glb, | | diff --git a/src/ifcopenshell-python/docs/ifcconvert/usage.rst b/src/ifcopenshell-python/docs/ifcconvert/usage.rst index 2c8ffeee5c0..3c6846d25bd 100644 --- a/src/ifcopenshell-python/docs/ifcconvert/usage.rst +++ b/src/ifcopenshell-python/docs/ifcconvert/usage.rst @@ -70,7 +70,7 @@ CLI Manual $ IfcConvert -h - IfcOpenShell IfcConvert 0.8.1-c49ca69 (OCC 7.8.1) + IfcOpenShell IfcConvert 0.8.4-158fe92 (OCC 7.8.1) Usage: IfcConvert [options] [] Converts (the geometry in) an IFC file into one of the following formats: @@ -80,6 +80,8 @@ CLI Manual .stp STEP Standard for the Exchange of Product Data .igs IGES Initial Graphics Exchange Specification .xml XML Property definitions and decomposition tree + .json JSON Property definitions and decomposition tree in xeokit json format + .rdb RocksDB RocksDB Key-Value store serialization of IFC data .svg SVG Scalable Vector Graphics (2D floor plan) .h5 HDF Hierarchical Data Format storing positions, normals and indices .ttl TTL/WKT RDF Turtle with Well-Known-Text geometry @@ -108,7 +110,8 @@ CLI Manual Geometry options: --kernel arg (=opencascade) Geometry kernel to use (opencascade, - cgal, cgal-simple). + cgal, cgal-simple, hybrid-cgal-simple-o + pencascade). -j [ --threads ] arg (=1) Number of parallel processing threads for geometry interpretation. --center-model Centers the elements by applying the @@ -118,6 +121,11 @@ CLI Manual --center-model-geometry Centers the elements by applying the center point of all mesh vertices as an offset. + --model-offset arg Applies an arbitrary offset of form + 'x;y;z' to all placements. + --model-rotation arg Applies an arbitrary quaternion + rotation of form 'x;y;z;w' to all + placements. --include arg Specifies that the instances that match a specific filtering criteria are to be included in the geometrical output: @@ -207,13 +215,12 @@ CLI Manual of surface normals, even if the faces are not properly oriented in the IFC file. - --length-unit arg (= 1) - --angle-unit arg (= 1) - --precision arg (= 1e-05) --dimensionality arg (= 1) Specifies whether to include curves and/or surfaces and solids in the output result. Defaults to only - surfaces and solids. + surfaces and solids (SURFACES_AND_SOLID + S). Other possible values are CURVES, + CURVES_SURFACES_AND_SOLIDS. --layerset-first Assigns the first layer material of the layerset to the complete product. --disable-boolean-result Specifies whether to disable the @@ -262,9 +269,11 @@ CLI Manual geometrical output back to the unit of measure in which it is defined in the IFC file. Default is to use meters. - --context-ids arg - --context-ids arg - --context-ids arg + --context-ids arg List of comma separated context ids to + process - e.g. '15,29' (no quotes + needed). + --context-types arg Currently option has no effect. + --context-identifiers arg Currently option has no effect. --iterator-output arg (= 0) --disable-opening-subtractions Specifies whether to disable the boolean subtraction of @@ -304,10 +313,18 @@ CLI Manual geometry output. --circle-segments arg (= 16) Number of segments to approximate full circles in CGAL kernel. + --cgal-smooth-angle-degrees arg (= -1) + Angle in degrees under which adjacent + facets will have averaged vertex + normals in CGAL output. NB irrespective + of original IFC geometry types. + Defaults to -1 to disable smoothing. --keep-bounding-boxes Default is to removes IfcBoundingBox from model prior to converting geometry.Setting this option disables that behaviour + --compute-curvature Specifies whether function_item_evaluat + or.evaluate() computes curvature. --function-step-type arg (= 0) Indicates the method used for defining step size when evaluating function-based curves. Provides @@ -320,12 +337,24 @@ CLI Manual parallel. May decrease performance, but also decrease output size (in the future) - --model-offset arg Applies an arbitrary offset of form - 'x,y,z' to all placements. - --model-rotation arg Applies an arbitrary quaternion - rotation of form 'x,y,z,w' to all - placements. + --permissive-shape-reuse Traverse geometry-level transformations + and apply to product-level placement in + order to increase reuse of geometries --triangulation-type arg (= 0) Type of planar facet to be emitted + --cgal-original-edges Try to emit original edge face boundary + edges instead of recomputed ones based + on face normal. Falls back to + triangulated data in case of boolean + operands and faces with holes. + --cache-shapes Experimental as not all topology hash + functions fully implemented + --max-offset arg Maximum translation offset to be + observed after which median offset in + model gets removed and logged. Requires + --no-parallel-mapping. + --max-offset-deviation arg To retain field of view, completely + remove elements outside of the median + offset. Requires --no-parallel-mapping. Serialization options: --bounds arg Specifies the bounding rectangle, for @@ -421,3 +450,8 @@ CLI Manual --wkt-use-section Use a geometrical section rather than full polyhedral output and footprint in TTL WKT + --separate-z-up-node Introduce a separate Z-Up node into the + GlTF hierarchy instead of multiplying + the transform into the root node + matrices + diff --git a/src/ifcopenshell-python/docs/ifcedit.rst b/src/ifcopenshell-python/docs/ifcedit.rst new file mode 100644 index 00000000000..d5db9b7c825 --- /dev/null +++ b/src/ifcopenshell-python/docs/ifcedit.rst @@ -0,0 +1,119 @@ +.. This file was generated with the assistance of an AI coding tool. + +IfcEdit +======= + +IfcEdit is a CLI wrapper for the full ``ifcopenshell.api`` mutation API. It +exposes all editor functions — over 350 across 30+ modules — without requiring +you to write a Python script. It supports four subcommands: + +- **list** — list all API modules, or all functions within a module +- **docs** — show full documentation for a function (parameters, types, descriptions) +- **run** — execute a mutation against an IFC file +- **foreach** — apply an API function to each element in a JSON array read from stdin +- **quantify** — run quantity take-off using ifc5d rules; requires the IfcOpenShell C++ geometry bindings + +Installation +------------ + +:: + + pip install ifcedit + +Or install from source: + +1. :doc:`Install IfcOpenShell ` +2. `Clone the IfcOpenShell repository `_. +3. ``cd /path/to/IfcOpenShell/src/ifcedit`` +4. ``pip install .`` + +Usage +----- + +Discover available API functions:: + + $ ifcedit list + $ ifcedit list root + $ ifcedit list geometry + +Read documentation for a function:: + + $ ifcedit docs root.remove_product + $ ifcedit docs type.assign_type + +Execute a mutation (overwrites the input file by default):: + + $ ifcedit run model.ifc root.remove_product --product 42 + $ ifcedit run model.ifc type.assign_type --related_objects 10 --relating_type 20 + +Write to a separate output file:: + + $ ifcedit run model.ifc root.create_entity -o output.ifc --ifc_class IfcWall + +Dry-run to validate without modifying the file:: + + $ ifcedit run model.ifc root.remove_product --dry-run --product 42 + +Apply an API function to each element in a JSON array from stdin (``{field}`` +placeholders are substituted from each item; model is opened and saved once):: + + $ ifcquery model.ifc select 'IfcWindow' | ifcedit foreach model.ifc root.remove_product --product {id} + $ ifcquery model.ifc select 'IfcDoor' | ifcedit foreach model.ifc attribute.edit_attributes \ + --product {id} --attributes '{"Name": "Door"}' + +Write to a separate output file instead of overwriting:: + + $ ifcquery model.ifc select 'IfcWall' | ifcedit foreach model.ifc root.remove_product -o output.ifc --product {id} + +Quantity take-off (writes ``IfcElementQuantity`` psets back to the file; requires C++ geometry bindings):: + + $ ifcedit quantify list + $ ifcedit quantify run model.ifc IFC4QtoBaseQuantities + $ ifcedit quantify run model.ifc IFC4QtoBaseQuantities --selector IfcWall + $ ifcedit quantify run model.ifc IFC4QtoBaseQuantities -o model_qto.ifc + +Parameter types +--------------- + +IfcEdit automatically coerces CLI string arguments to the correct Python types +using the type hints on each API function: + +.. list-table:: + :header-rows: 1 + + * - Type + - CLI input + - Python value + * - ``str`` + - ``"hello"`` + - ``"hello"`` + * - ``int`` + - ``"42"`` or ``"#42"`` + - ``42`` + * - ``float`` + - ``"3.14"`` + - ``3.14`` + * - ``bool`` + - ``"true"``, ``"1"``, ``"yes"`` + - ``True`` + * - ``Optional[X]`` + - ``"none"`` + - ``None`` + * - ``entity_instance`` + - ``"42"`` or ``"#42"`` + - resolved from model by step ID + * - ``list[entity_instance]`` + - ``"5,6,7"`` + - list of resolved entities + * - ``dict`` + - ``'{"key": "val"}'`` + - parsed JSON object + * - ``Literal["A", "B"]`` + - ``"A"`` + - validated against allowed values + +.. seealso:: + + Use :doc:`IfcQuery ` for read-only inspection of IFC files, and + :doc:`IfcMCP ` for interactive AI-assisted editing with an in-memory + session. diff --git a/src/ifcopenshell-python/docs/ifcmcp.rst b/src/ifcopenshell-python/docs/ifcmcp.rst new file mode 100644 index 00000000000..2f7f0c39f06 --- /dev/null +++ b/src/ifcopenshell-python/docs/ifcmcp.rst @@ -0,0 +1,110 @@ +.. This file was generated with the assistance of an AI coding tool. + +IfcMCP +====== + +IfcMCP is an MCP (Model Context Protocol) server that exposes IfcOpenShell +query and edit tools to AI coding assistants such as Claude. It wraps +:doc:`IfcQuery ` and :doc:`IfcEdit `, holding the IFC model +in memory across tool calls so no file I/O is required between operations. + +The ``ifcmcp`` package can also be used directly as a Python library without +the MCP server layer. + +Installation +------------ + +To use IfcMCP as an MCP server, install it together with the ``mcp`` package:: + + pip install 'ifcmcp[mcp]' + +If you only want to use the library directly (without an MCP client):: + + pip install ifcmcp + +Or install from source: + +1. :doc:`Install IfcOpenShell ` +2. `Clone the IfcOpenShell repository `_. +3. ``cd /path/to/IfcOpenShell/src/ifcmcp`` +4. ``pip install '.[mcp]'`` + +Setup +----- + +Add the server to your MCP client. For Claude Code:: + + claude mcp add --transport stdio ifc -- ifcmcp + +Or add to ``.mcp.json``: + +.. code-block:: json + + { + "mcpServers": { + "ifc": { + "type": "stdio", + "command": "ifcmcp" + } + } + } + +Available tools +--------------- + +**Session tools** + +- ``ifc_new(schema="IFC4")`` — create a new empty model in memory +- ``ifc_load(path)`` — open an IFC file into memory +- ``ifc_reset()`` — unload the current model, freeing all session state +- ``ifc_save(path="")`` — write model to disk; empty path overwrites the original + +**Query tools** + +- ``ifc_summary()`` — schema version, entity counts, project metadata +- ``ifc_tree()`` — full spatial hierarchy +- ``ifc_info(element_id)`` — deep inspection by step ID +- ``ifc_select(query)`` — filter elements by IFC class +- ``ifc_relations(element_id, traverse="")`` — relationships for an element +- ``ifc_clash(element_id, ...)`` — geometric intersection and clearance checks +- ``ifc_validate(express_rules=False)`` — schema and constraint validation +- ``ifc_schedule(max_depth=None)`` — work schedules with nested task trees +- ``ifc_cost(max_depth=None)`` — cost schedules with nested cost item trees +- ``ifc_schema(entity_type)`` — IFC class documentation +- ``ifc_contexts()`` — geometric representation contexts +- ``ifc_materials()`` — material definitions + +**Drawing and rendering tools** + +- ``ifc_plot(...)`` — generate a 2D drawing via ``ifcopenshell.draw`` and return it as an inline image the AI assistant can inspect; SVG always available, PNG requires ``cairosvg`` +- ``ifc_render(...)`` — off-screen 3D render returned as an inline PNG image the AI assistant can inspect; requires ``pyvista`` and the IfcOpenShell C++ geometry bindings + +**ShapeBuilder tools** + +- ``ifc_shape_list()`` — list all available ``ShapeBuilder`` methods +- ``ifc_shape_docs(method)`` — documentation for a specific ``ShapeBuilder`` method +- ``ifc_shape(method, params="{}")`` — execute a ``ShapeBuilder`` method; entity references resolved by step ID + +**Edit tools** + +- ``ifc_list(module="")`` — list API modules or functions +- ``ifc_docs(function_path)`` — documentation for an API function +- ``ifc_edit(function_path, params="{}")`` — execute an ``ifcopenshell.api`` mutation +- ``ifc_quantify(rule, selector="")`` — run quantity take-off; writes ``IfcElementQuantity`` psets in-place + +Typical workflow +---------------- + +.. code-block:: text + + ifc_load("/path/to/model.ifc") + ifc_summary() + ifc_tree() + ifc_info(42) + ifc_edit("root.remove_product", '{"product": "42"}') + ifc_save() + +.. seealso:: + + :doc:`IfcQuery ` and :doc:`IfcEdit ` provide the same + functionality as standalone CLI tools for scripting and automation. diff --git a/src/ifcopenshell-python/docs/ifcopenshell-python/geometry_creation.rst b/src/ifcopenshell-python/docs/ifcopenshell-python/geometry_creation.rst index 65c21cafef3..3aa34a3aa83 100644 --- a/src/ifcopenshell-python/docs/ifcopenshell-python/geometry_creation.rst +++ b/src/ifcopenshell-python/docs/ifcopenshell-python/geometry_creation.rst @@ -340,8 +340,12 @@ In IFC, meshes may be stored as **Faceted BReps**, **Tessellations**, or # These vertices and faces represent a 2m square 1m high pyramid in SI units. # Note how they are nested lists. Each nested list represents a "mesh". There may be multiple meshes. - vertices = [[(0.,0.,0.), (0.,2.,0.), (2.,2.,0.), (2.,0.,0.), (1.,1.,1.)]] - faces = [[(0,1,2,3), (0,4,1), (1,4,2), (2,4,3), (3,4,0)]] + vertices = [ + [(0.,0.,0.), (0.,2.,0.), (2.,2.,0.), (2.,0.,0.), (1.,1.,1.)] # A single mesh + ] + faces = [ + [(0,1,2,3), (0,4,1), (1,4,2), (2,4,3), (3,4,0)] # A single mesh + ] representation = ifcopenshell.api.geometry.add_mesh_representation(model, context=body, vertices=vertices, faces=faces) .. image:: images/mesh-representation.png @@ -771,3 +775,52 @@ responsibility to make sure the geometry is correct. # Assign our new body geometry back to our beam ifcopenshell.api.geometry.assign_representation(model, product=beam, representation=representation) + +Moving assemblies +----------------- + +When moving an assembly and you want all children to follow, pass +``should_transform_children=True``. The default (``False``) rewrites each +child's local placement to preserve its world position, so the parent moves +but the children stay where they are. + +.. code-block:: python + + matrix = numpy.eye(4) + matrix[:,3][0:3] = (0, 0, 6) + + # Move the assembly; children travel with it. + ifcopenshell.api.geometry.edit_object_placement(model, + product=assembly, matrix=matrix, is_si=True, + should_transform_children=True) + +Clipping normals convention +--------------------------- + +The ``normal`` passed to :func:`geometry.clip_solid`, +:func:`geometry.clip_solid_bounded`, and the ``clippings`` parameter of +:func:`geometry.add_wall_representation` points toward the **removed** +material (the discarded side), not toward the kept material. + +.. code-block:: python + + # Clip the top of a wall to a lean-to slope. + # normal points upward into the wedge that will be removed. + bcr = ifcopenshell.api.geometry.clip_solid(model, + item=extrusion, + location=[0.0, 0.0, 3.26], + normal=[0.419, 0.0, 0.908]) + shape_representation.RepresentationType = "Clipping" + +Opening lifecycle +----------------- + +``feature.remove_feature`` permanently deletes the feature entity from the +model. Any fillings (windows, doors) that occupied the opening become +orphaned and must be separately removed via ``root.remove_product``. + +.. code-block:: python + + # Remove a window and its opening from a wall. + ifcopenshell.api.root.remove_product(model, product=window) + ifcopenshell.api.feature.remove_feature(model, feature=opening) diff --git a/src/ifcopenshell-python/docs/ifcopenshell-python/geometry_processing.rst b/src/ifcopenshell-python/docs/ifcopenshell-python/geometry_processing.rst index 0c4753807aa..6058781de43 100644 --- a/src/ifcopenshell-python/docs/ifcopenshell-python/geometry_processing.rst +++ b/src/ifcopenshell-python/docs/ifcopenshell-python/geometry_processing.rst @@ -19,7 +19,6 @@ edges, and faces, or alternatively an OpenCASCADE BRep. applications. See the `Geometry iterator`_ section below after reading this to see how to process geometry with multiple threads. - Here is a simple example of processing a single wall into a list of vertices and faces. In this example, a ``shape`` variable is returned, which holds geometry related information in ``shape.geometry``: @@ -33,8 +32,12 @@ related information in ``shape.geometry``: ifc_file = ifcopenshell.open('model.ifc') element = ifc_file.by_type('IfcWall')[0] + # Create a shape using a hybrid of the cgal-simple geometry kernel and opencascade as a fallback + # Choosing a geometry kernel has a big impact on speed and capability. + # It is recommended to use the "hybrid-cgal-simple-opencascade" kernel. settings = ifcopenshell.geom.settings() - shape = ifcopenshell.geom.create_shape(settings, element) + shape = ifcopenshell.geom.create_shape( + settings, element, geometry_library="hybrid-cgal-simple-opencascade") # The GUID of the element we processed print(shape.guid) @@ -224,7 +227,8 @@ Here is a simple example in Python: ifc_file = ifcopenshell.open('model.ifc') settings = ifcopenshell.geom.settings() - iterator = ifcopenshell.geom.iterator(settings, ifc_file, multiprocessing.cpu_count()) + iterator = ifcopenshell.geom.iterator( + settings, ifc_file, multiprocessing.cpu_count(), geometry_library="hybrid-cgal-simple-opencascade") if iterator.initialize(): while True: shape = iterator.get() @@ -252,7 +256,9 @@ only process wall elements. .. code-block:: python walls = ifc.by_type('IfcWall') - iterator = ifcopenshell.geom.iterator(settings, ifc, multiprocessing.cpu_count(), include=walls) + iterator = ifcopenshell.geom.iterator( + settings, ifc, multiprocessing.cpu_count(), + include=walls, geometry_library="hybrid-cgal-simple-opencascade") .. note:: diff --git a/src/ifcopenshell-python/docs/ifcopenshell-python/selector_syntax.rst b/src/ifcopenshell-python/docs/ifcopenshell-python/selector_syntax.rst index 67f7b792b34..5ae16c5ec01 100644 --- a/src/ifcopenshell-python/docs/ifcopenshell-python/selector_syntax.rst +++ b/src/ifcopenshell-python/docs/ifcopenshell-python/selector_syntax.rst @@ -252,8 +252,13 @@ nest formulas, for example ``concat(title("foo"), lower("Bar"))`` will produce "``number({{value}}[, {{decimal_separator}}[, {{thousands_separator}}]])``", "``number(1234.56, "","", ""."")``", "``1.234,56``", "Formats {{value}} with an optional custom {{decimal_separator}} and {{thousands_separator}}. The default separators are ``.`` and ``,``." "``metric_length({{value}}, {{precision}}, {{decimals}})``", "``metric_length(3.123, 0.1, 2)``", "``3.10``", "Rounds ``{{value}}`` to the nearest ``{{precision}}`` then displays using a certain amount of decimal places." "``imperial_length({{value}}, {{precision}}, {{input_unit}}, {{output_unit}}, {{suppress_zero_inches}})``", "``imperial_length(3.0, 4, ""foot"", ""foot"", true)`` OR ``imperial_length(3.0, 4, ""foot"", ""foot"", false)``", "``3'`` OR ``3' - 0""``", "The ``{{value}}`` may be specified either as ``foot`` or ``inch`` depending on ``{{input_unit}}``. The ``{{value}}`` is then rounded to the nearest ``1/{{precision}}`` inch, then formatted using fractional feet and inches if ``{{output_unit}}`` is set to ``foot``, or just inches if ``{{output_unit}}`` is set to ``inch``. When ``{{suppress_zero_inches}}`` is ``true`` (default), measurements with zero inches will omit the inch portion (e.g., ``3'`` instead of ``3' - 0""``)." + "``sort({{values}})``", "``sort({{mats.Name}})``", "``Name1, Name2``", "Sorts a list of items." + "``reverse({{values}})``", "``reverse({{mats.Name}})``", "``Name2, Name1``", "Reverses a list of items." + "``join({{separator}}, {{values}})``", "``join(""-"", {{mats.Name}})``", "``Name1-Name2``", "Joins a list of items with a custom separator. By default, all lists a rendered as comma separated." + "``{{value1}}[+-*/]{{value2}}``", "``{{z}}+3``", "``5``", "Does arithmetic. Typical operators such as +, -, \*, and / are allowed and can be mixed with other variables and formatting functions." -When using queries in an IfcAnnotation tag surround with backticks. -Examples: -````number({{Qto_WallBaseQuantities.Width}}, ",",".")```` or -````round({{Qto_BuildingElementProxyQuantities.NetVolume}},.1)```` +When using queries in an IfcAnnotation tag surround with backticks. Examples: + +- ````number({{Qto_WallBaseQuantities.Width}}, ",",".")```` +- ````round({{Qto_BuildingElementProxyQuantities.NetVolume}},.1)```` +- ````join(", OVER ", reverse({{material.item.Material.Name}}))```` diff --git a/src/ifcopenshell-python/docs/ifcopenshell/geometry_settings.rst b/src/ifcopenshell-python/docs/ifcopenshell/geometry_settings.rst index a41489a4ddb..f73c7edc28c 100644 --- a/src/ifcopenshell-python/docs/ifcopenshell/geometry_settings.rst +++ b/src/ifcopenshell-python/docs/ifcopenshell/geometry_settings.rst @@ -111,6 +111,32 @@ In Python, this is set when the iterator is constructed: import multiprocessing iterator = ifcopenshell.geom.iterator(settings, ifc_file, num_threads=multiprocessing.cpu_count()) +geometry_library +^^^^^^^^^^^^^^^^ + ++--------+-------------------+-------------+ +| Type | IfcConvert Option | Default | ++========+===================+=============+ +| STRING | ``--kernel`` | opencascade | ++--------+-------------------+-------------+ + +IfcOpenShell supports multiple geometry kernels to process geometry. Choosing the geometry kernel has trade-offs on geometric support, speed, and maturity. It is possible and recommended to chose a hybrid geometry kernel by providing the name ``hybrid-kernelX-kernelY``, where ``kernelX`` is the name of the first kernel to try, and ``kernelY`` is the name of the fallback kernel, for example ``hybrid-cgal-simple-opencascade``. + +.. csv-table:: + :header: "Comparison", "cgal-simple", "cgal", "opencascade" + + "Speed", "Very fast", "Fast", "Slow" + "Curves in extrusion footprints", "Only circle and ellipse arcs are converted to polylines", "Only circle and ellipse arcs are converted to polylines", "Full support including beziers and nurbs" + "Advanced (curved) breps", "No", "No", "Full support" + "Boolean operations", "No", "Full support", "Full support" + "Boolean operations with tolerance / fuzziness handling", "No", "Only manifold inputs", "Full support, including non-manifold inputs" + "Sweeps along alignment curves", "Partial", "Partial", "Full support" + +.. code-block:: python + + iterator = ifcopenshell.geom.iterator(settings, ifc_file, geometry_library="hybrid-cgal-simple-opencascade") + ifcopenshell.geom.create_shape(settings, element, geometry_library="opencascade") + Iterator settings ----------------- diff --git a/src/ifcopenshell-python/docs/ifcopenshell/getting_started.rst b/src/ifcopenshell-python/docs/ifcopenshell/getting_started.rst index 351dec6a618..92f89def7fc 100644 --- a/src/ifcopenshell-python/docs/ifcopenshell/getting_started.rst +++ b/src/ifcopenshell-python/docs/ifcopenshell/getting_started.rst @@ -30,7 +30,7 @@ would be with the use of templates as shown below. #include "ifcparse/Ifc4.h" #include "ifcparse/Ifc4x3_add2.h" - #define IFC_SCHEMA_SEQ (4x3_rc2)(4)(2x3) // TODO: Enumerate through all IFC schemas you want to be able to process + #define IFC_SCHEMA_SEQ (4x3_add2)(4)(2x3) // TODO: Enumerate through all IFC schemas you want to be able to process #define EXPAND_AND_CONCATENATE(elem) Ifc##elem #define PROCESS_FOR_SCHEMA(r, data, elem) if (schema_version == BOOST_PP_STRINGIZE(elem)) { parseIfc(file); } else diff --git a/src/ifcopenshell-python/docs/ifcquery.rst b/src/ifcopenshell-python/docs/ifcquery.rst new file mode 100644 index 00000000000..8735b63da22 --- /dev/null +++ b/src/ifcopenshell-python/docs/ifcquery.rst @@ -0,0 +1,102 @@ +.. This file was generated with the assistance of an AI coding tool. + +IfcQuery +======== + +IfcQuery is a CLI tool for querying and inspecting IFC building models. It +provides read-only subcommands for common inspection tasks, all outputting JSON +so results can be piped into other tools. + +Subcommands: + +- **summary** — schema version, entity counts, project metadata +- **tree** — full spatial hierarchy (IfcProject → Site → Building → Storeys → Spaces → Elements) +- **info** — deep inspection of any entity by step ID (attributes, property sets, placement matrix, type, material) +- **select** — filter elements by IFC class using the IfcOpenShell selector syntax +- **relations** — relationships for an element; use ``--traverse up`` to walk the hierarchy to IfcProject +- **clash** — geometric intersection and clearance checks; requires the IfcOpenShell C++ geometry bindings +- **validate** — schema and constraint validation; add ``--rules`` for a full EXPRESS check +- **schedule** — work schedules with nested task trees +- **cost** — cost schedules with nested cost item trees +- **schema** — IFC class documentation using the loaded model's schema version +- **contexts** — geometric representation contexts +- **materials** — material definitions (IfcMaterial, layer sets, constituent sets, profile sets) +- **plot** — generate a drawing (SVG or PNG) using ``ifcopenshell.draw``; PNG output requires ``cairosvg`` +- **render** — off-screen 3D render to a PNG image; requires ``pyvista`` and the IfcOpenShell C++ geometry bindings + +All subcommands accept ``--format json|text|ids`` to control output (default: ``json``): + +- ``json`` — structured JSON, suitable for piping to ``jq`` or ``ifcedit foreach`` +- ``text`` — indented human-readable output +- ``ids`` — comma-separated step IDs extracted from list results, suitable for piping directly into ``ifcedit run`` parameters + +Installation +------------ + +:: + + pip install ifcquery + +For PNG output from ``plot``, also install ``cairosvg``:: + + pip install cairosvg + +For 3D rendering with ``render``, also install ``pyvista``:: + + pip install pyvista + +Or install from source: + +1. :doc:`Install IfcOpenShell ` +2. `Clone the IfcOpenShell repository `_. +3. ``cd /path/to/IfcOpenShell/src/ifcquery`` +4. ``pip install .`` + +Usage +----- + +:: + + $ ifcquery model.ifc summary + $ ifcquery model.ifc tree + $ ifcquery model.ifc info 42 + $ ifcquery model.ifc select 'IfcWall' + $ ifcquery model.ifc relations 42 + $ ifcquery model.ifc relations 42 --traverse up + $ ifcquery model.ifc validate + $ ifcquery model.ifc validate --rules + $ ifcquery model.ifc schedule + $ ifcquery model.ifc cost + $ ifcquery model.ifc schema IfcWall + $ ifcquery model.ifc materials + $ ifcquery model.ifc plot -o floorplan.svg --out-format svg --view floorplan + $ ifcquery model.ifc plot -o floorplan.png --view floorplan + $ ifcquery model.ifc render -o model.png + $ ifcquery model.ifc --format ids select 'IfcWall' + +Scripting with ifcedit +---------------------- + +``ifcquery`` and ``ifcedit`` are designed to compose. Use ``--format ids`` to +pass query results directly into ``ifcedit run`` parameters, or pipe JSON into +``ifcedit foreach`` to apply an operation to every matching element:: + + # Aggregate — pass all IDs as a list parameter + $ ifcedit run model.ifc spatial.unassign_container \ + --products "$(ifcquery model.ifc --format ids select 'IfcWall')" + + # Fan-out — one operation per element, model opened and saved once + $ ifcquery model.ifc select 'IfcWindow' | ifcedit foreach model.ifc root.remove_product --product {id} + + # Render an element highlighted against everything related to it + $ ifcquery model.ifc render -o relations.png \ + --element "$(ifcquery model.ifc --format ids relations 42)" + + # Render a clash — subject and clashing elements highlighted together + $ ifcquery model.ifc render -o clash.png \ + --element "$(ifcquery model.ifc --format ids clash 42)" + +.. seealso:: + + Use :doc:`IfcEdit ` to make mutations to IFC files from the command + line, and :doc:`IfcMCP ` for interactive AI-assisted editing. diff --git a/src/ifcopenshell-python/docs/index.rst b/src/ifcopenshell-python/docs/index.rst index 8d241bbf745..895dbece889 100644 --- a/src/ifcopenshell-python/docs/index.rst +++ b/src/ifcopenshell-python/docs/index.rst @@ -30,9 +30,12 @@ Let's learn IfcOpenShell! ifcclash ifccsv ifcdiff + ifcedit ifcfm ifcmax + ifcmcp ifcpatch + ifcquery ifcsverchok ifctester other diff --git a/src/ifcopenshell-python/docs/introduction.rst b/src/ifcopenshell-python/docs/introduction.rst index 58430b6da89..39b963e8f72 100644 --- a/src/ifcopenshell-python/docs/introduction.rst +++ b/src/ifcopenshell-python/docs/introduction.rst @@ -69,9 +69,12 @@ IfcOpenShell is a modular ecosystem of tools that work together, where each tool "`IfcClash `_", "A CLI utility and library that lets you perform clash detection on one or more IFC models. Clashes are defined in terms of clash sets with filters using the IFC query syntax." "`IfcCSV `_", "View and edit IFC data using spreadsheets or tabular datasets, such as CSV, ODS, XLSX, Pandas DataFrames, and regular Python lists." "`IfcDiff `_", "A CLI utility and library that lets you compare the changes between two IFC models." + "`IfcEdit `_", "A CLI wrapper for all ifcopenshell.api mutation functions. Browse available API modules, read per-function documentation, and run any API function against an IFC file from the command line." "`IfcFM `_", "A highly standards-compliant tool (e.g. COBie 2.4, COBie 3.0, AOH-BSEM) to convert FM data in IFC databases to spreadsheets and other machine readable formats, such as ODS, XLSX, CSV, Pandas, XML, and JSON." "`IfcMax `_", "A 3ds Max importer plugin able to import the IFC file format." + "`IfcMCP `_", "An MCP (Model Context Protocol) server that exposes IfcOpenShell query and edit tools to AI coding assistants. Loads a model into memory and keeps it there across tool calls, so no file I/O is needed between operations." "`IfcPatch `_", "A CLI utility and library that lets you run and distribute predetermined modifications on an IFC file, known as a patch recipe. Useful in deploying a data pipeline or batch-fixing external models." + "`IfcQuery `_", "A CLI tool for querying and inspecting IFC building models. Subcommands cover spatial hierarchy, element inspection, relationship traversal, clash detection, schema documentation, work schedules, and cost schedules." "`IfcSverchok `_", "A node based visual programming add-on for Blender to interact with IFC and Sverchok." "`IfcTester `_", "Author and read Information Delivery Specification (IDS) files. You can validate IFC models against IDS and generate reports in multiple formats. It works from the command line, as a web app, or as a library." "`VoxelisationToolkit `_", "Converts .ifc geometry into voxels, and lets you perform voxel based geometric analysis." diff --git a/src/ifcopenshell-python/ifcopenshell/__init__.py b/src/ifcopenshell-python/ifcopenshell/__init__.py index 9d472d3b1d7..7d247c6faba 100644 --- a/src/ifcopenshell-python/ifcopenshell/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/__init__.py @@ -53,6 +53,7 @@ for wall in walls: print(wall.Name) """ + from __future__ import annotations import os @@ -102,6 +103,7 @@ "file", "guid", "ifcopenshell_wrapper", + "rocksdb_lazy_instance", "sqlite", "sqlite_entity", "stream", @@ -109,8 +111,8 @@ ] try: - from .stream import stream, stream_entity - from .stream import stream as _stream + from .stream import stream, stream_entity # ty: ignore[possibly-missing-import] + from .stream import stream as _stream # ty: ignore[possibly-missing-import] except: pass @@ -129,17 +131,21 @@ class SchemaError(Error): @overload def open( - path: Union[os.PathLike, str], format: Optional[str] = None, *, should_stream: Literal[False] = False + path: Union[os.PathLike, str], format: SupportedFormat = None, *, should_stream: Literal[False] = False ) -> Union[_file, sqlite]: ... @overload -def open(path: Union[os.PathLike, str], format: Optional[str] = None, *, should_stream: Literal[True]) -> _stream: ... +def open(path: Union[os.PathLike, str], format: SupportedFormat = None, *, should_stream: Literal[True]) -> _stream: ... @overload def open( - path: Union[os.PathLike, str], format: Optional[str] = None, *, should_stream: bool = False, readonly: bool = False + path: Union[os.PathLike, str], + format: SupportedFormat = None, + *, + should_stream: bool = False, + readonly: bool = False, ) -> Union[_file, sqlite, _stream]: ... def open( path: Union[os.PathLike, str], - format: Optional[str] = None, + format: SupportedFormat = None, should_stream: bool = False, readonly: bool = False, mmap: bool = False, @@ -151,8 +157,7 @@ def open( for reading large files. You can specify a file format. If no format is given, it is guessed from - its extension. Currently supported specified format: .ifc | .ifcZIP | - .ifcXML. + its extension. You can then filter by element ID, class, etc, and subscript by id or guid. @@ -197,11 +202,13 @@ def open( for ty in bypass_types: f.bypass_type(ty) if mmap: - f.initialize(str(path.absolute()), mmap=mmap) + # mmap parameter is only available for builds with USE_MMAP, not used in our main builds + f.initialize(str(path.absolute()), mmap=mmap) # ty: ignore[unknown-argument] else: f.initialize(str(path.absolute())) elif mmap: - f = ifcopenshell_wrapper.open(str(path.absolute()), mmap=mmap) + # mmap parameter is only available for builds with USE_MMAP, not used in our main builds + f = ifcopenshell_wrapper.open(str(path.absolute()), mmap=mmap) # ty: ignore[unknown-argument] else: f = ifcopenshell_wrapper.open(str(path.absolute())) return file(f) @@ -284,7 +291,10 @@ def schema_by_name( return ifcopenshell_wrapper.schema_by_name(schema) -def guess_format(path: Path) -> Literal[".ifc", ".ifcZIP", ".ifcXML", ".ifcJSON", ".ifcSQLite", None]: +SupportedFormat = Literal[".ifc", ".ifcZIP", ".ifcXML", ".ifcJSON", ".ifcSQLite", "rocksdb", None] + + +def guess_format(path: Path) -> SupportedFormat: """Guesses the IFC format using file extension IFCs may be serialised as different formats. The most common is a ``.ifc`` diff --git a/src/ifcopenshell-python/ifcopenshell/api/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/__init__.py index 49c3b471dd5..f485e865fb9 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/__init__.py @@ -42,7 +42,6 @@ import inspect import json from collections.abc import Callable -from functools import partial from typing import TYPE_CHECKING, Any, Optional import numpy @@ -90,11 +89,7 @@ def renamed_arguments_deprecation( # "group.add_group": partial( # renamed_arguments_deprecation, arguments_remapped={"Name": "name", "Description": "description"} # ), -ARGUMENTS_DEPRECATION: dict[str, Callable[[str, dict[str, Any]], tuple[str, dict[str, Any]]]] = { - "control.assign_control": partial( - batching_argument_deprecation, prev_argument="related_object", new_argument="related_objects" - ), -} +ARGUMENTS_DEPRECATION: dict[str, Callable[[str, dict[str, Any]], tuple[str, dict[str, Any]]]] = {} CACHED_USECASE_CLASSES: dict[str, Callable] = {} diff --git a/src/ifcopenshell-python/ifcopenshell/api/alignment/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/alignment/__init__.py index 790125cb0be..2662015313f 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/alignment/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/alignment/__init__.py @@ -125,4 +125,5 @@ "name_segments", "register_referent_name_callback", "update_fallback_position", + "get_mapped_segments", ] diff --git a/src/ifcopenshell-python/ifcopenshell/api/alignment/_add_segment_to_curve.py b/src/ifcopenshell-python/ifcopenshell/api/alignment/_add_segment_to_curve.py index 934e456b572..e24a946ae7b 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/alignment/_add_segment_to_curve.py +++ b/src/ifcopenshell-python/ifcopenshell/api/alignment/_add_segment_to_curve.py @@ -19,7 +19,6 @@ import numpy as np import ifcopenshell -import ifcopenshell.api import ifcopenshell.api.alignment import ifcopenshell.geom import ifcopenshell.ifcopenshell_wrapper as ifcopenshell_wrapper diff --git a/src/ifcopenshell-python/ifcopenshell/api/alignment/_add_segment_to_layout.py b/src/ifcopenshell-python/ifcopenshell/api/alignment/_add_segment_to_layout.py index 999bf2f80fe..70914a33531 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/alignment/_add_segment_to_layout.py +++ b/src/ifcopenshell-python/ifcopenshell/api/alignment/_add_segment_to_layout.py @@ -17,7 +17,6 @@ # along with IfcOpenShell. If not, see . import math -from collections.abc import Sequence import numpy as np diff --git a/src/ifcopenshell-python/ifcopenshell/api/alignment/_add_zero_length_segment.py b/src/ifcopenshell-python/ifcopenshell/api/alignment/_add_zero_length_segment.py index 00ac9d6000e..71da0d39388 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/alignment/_add_zero_length_segment.py +++ b/src/ifcopenshell-python/ifcopenshell/api/alignment/_add_zero_length_segment.py @@ -18,7 +18,6 @@ import ifcopenshell import ifcopenshell.api.alignment -import ifcopenshell.util import ifcopenshell.util.alignment from ifcopenshell import entity_instance from ifcopenshell.api.alignment._get_segment_start_point_label import ( diff --git a/src/ifcopenshell-python/ifcopenshell/api/alignment/_create_geometric_representation.py b/src/ifcopenshell-python/ifcopenshell/api/alignment/_create_geometric_representation.py index 30b91bb0a02..933ee3a470e 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/alignment/_create_geometric_representation.py +++ b/src/ifcopenshell-python/ifcopenshell/api/alignment/_create_geometric_representation.py @@ -16,8 +16,6 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . -import math -from collections.abc import Sequence import ifcopenshell import ifcopenshell.api.alignment diff --git a/src/ifcopenshell-python/ifcopenshell/api/alignment/_create_offset_curve_representation.py b/src/ifcopenshell-python/ifcopenshell/api/alignment/_create_offset_curve_representation.py index 31f0c583aa3..28a9f6ef496 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/alignment/_create_offset_curve_representation.py +++ b/src/ifcopenshell-python/ifcopenshell/api/alignment/_create_offset_curve_representation.py @@ -16,7 +16,6 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . -import math from collections.abc import Sequence import ifcopenshell @@ -29,7 +28,7 @@ def _create_offset_curve_representation( file: ifcopenshell.file, alignment: entity_instance, offsets: Sequence[entity_instance] ) -> None: """ - Create geometric representation for the alignment based on an IfcPolyline + Create geometric representation for the alignment based on an IfcOffsetByDistances curve :param alignment: The alignment for which the representation is being created :return: None @@ -38,6 +37,11 @@ def _create_offset_curve_representation( if not alignment.is_a(expected_type): raise TypeError(f"Expected {expected_type} but got {alignment.is_a()}") + expected_type = "IfcPointByDistanceExpression" + for offset in offsets: + if not offset.is_a(expected_type): + raise TypeError(f"Expected {expected_type} but got {offset.is_a()}") + axis_geom_subcontext = ifcopenshell.api.alignment.get_axis_subcontext(file) basis_curve = offsets[0].BasisCurve # IfcPointByDistanceExpression.BasisCurve diff --git a/src/ifcopenshell-python/ifcopenshell/api/alignment/_create_polyline_representation.py b/src/ifcopenshell-python/ifcopenshell/api/alignment/_create_polyline_representation.py index c745e6b9ac1..4d31917faea 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/alignment/_create_polyline_representation.py +++ b/src/ifcopenshell-python/ifcopenshell/api/alignment/_create_polyline_representation.py @@ -16,7 +16,6 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . -import math from collections.abc import Sequence import ifcopenshell diff --git a/src/ifcopenshell-python/ifcopenshell/api/alignment/_get_cant_segment.py b/src/ifcopenshell-python/ifcopenshell/api/alignment/_get_cant_segment.py index 27a781c505c..2abd74c1890 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/alignment/_get_cant_segment.py +++ b/src/ifcopenshell-python/ifcopenshell/api/alignment/_get_cant_segment.py @@ -16,12 +16,8 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . -import math -from collections.abc import Sequence -import ifcopenshell import ifcopenshell.api.alignment -import ifcopenshell.api.geometry from ifcopenshell import entity_instance diff --git a/src/ifcopenshell-python/ifcopenshell/api/alignment/_get_segment_start_point_label.py b/src/ifcopenshell-python/ifcopenshell/api/alignment/_get_segment_start_point_label.py index 34b30b9f59b..6e5453489bf 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/alignment/_get_segment_start_point_label.py +++ b/src/ifcopenshell-python/ifcopenshell/api/alignment/_get_segment_start_point_label.py @@ -16,9 +16,7 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . -from collections.abc import Sequence -import ifcopenshell from ifcopenshell import entity_instance _horizontal_callback = None diff --git a/src/ifcopenshell-python/ifcopenshell/api/alignment/_map_alignment_cant_segment.py b/src/ifcopenshell-python/ifcopenshell/api/alignment/_map_alignment_cant_segment.py index e5b9ea0381b..d7ae7526b41 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/alignment/_map_alignment_cant_segment.py +++ b/src/ifcopenshell-python/ifcopenshell/api/alignment/_map_alignment_cant_segment.py @@ -21,7 +21,6 @@ import ifcopenshell from ifcopenshell import entity_instance -from ifcopenshell.api.alignment import get_axis_subcontext def _get_axis(file: ifcopenshell.file, Ds: float, rail_head_distance: float) -> entity_instance: diff --git a/src/ifcopenshell-python/ifcopenshell/api/alignment/_map_alignment_horizontal_segment.py b/src/ifcopenshell-python/ifcopenshell/api/alignment/_map_alignment_horizontal_segment.py index 17de77a7ad5..0ab7d7334b4 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/alignment/_map_alignment_horizontal_segment.py +++ b/src/ifcopenshell-python/ifcopenshell/api/alignment/_map_alignment_horizontal_segment.py @@ -21,7 +21,6 @@ import ifcopenshell import ifcopenshell.ifcopenshell_wrapper as ifcopenshell_wrapper -import ifcopenshell.util import ifcopenshell.util.unit from ifcopenshell import entity_instance from ifcopenshell.api.alignment._get_cant_segment import _get_cant_segment diff --git a/src/ifcopenshell-python/ifcopenshell/api/alignment/_map_alignment_vertical_segment.py b/src/ifcopenshell-python/ifcopenshell/api/alignment/_map_alignment_vertical_segment.py index e47a50d5cef..707cf0cba19 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/alignment/_map_alignment_vertical_segment.py +++ b/src/ifcopenshell-python/ifcopenshell/api/alignment/_map_alignment_vertical_segment.py @@ -20,7 +20,7 @@ from collections.abc import Sequence import ifcopenshell -from ifcopenshell import entity_instance, ifcopenshell_wrapper +from ifcopenshell import entity_instance def _polynomial_length(A: float, B: float, C: float, L: float) -> float: diff --git a/src/ifcopenshell-python/ifcopenshell/api/alignment/_update_curve_segment_transition_code.py b/src/ifcopenshell-python/ifcopenshell/api/alignment/_update_curve_segment_transition_code.py index 5e1c2d01236..367bf2e2fda 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/alignment/_update_curve_segment_transition_code.py +++ b/src/ifcopenshell-python/ifcopenshell/api/alignment/_update_curve_segment_transition_code.py @@ -16,14 +16,9 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . -import math -import numpy as np - -import ifcopenshell import ifcopenshell.api.alignment -import ifcopenshell.geom -from ifcopenshell import entity_instance, ifcopenshell_wrapper +from ifcopenshell import entity_instance def _update_curve_segment_transition_code(prev_segment: entity_instance, segment: entity_instance) -> None: diff --git a/src/ifcopenshell-python/ifcopenshell/api/alignment/add_stationing_referent.py b/src/ifcopenshell-python/ifcopenshell/api/alignment/add_stationing_referent.py index bccc7b02138..2d70ace789e 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/alignment/add_stationing_referent.py +++ b/src/ifcopenshell-python/ifcopenshell/api/alignment/add_stationing_referent.py @@ -20,7 +20,6 @@ import ifcopenshell import ifcopenshell.api.alignment -import ifcopenshell.api.nest import ifcopenshell.api.pset import ifcopenshell.geom import ifcopenshell.guid diff --git a/src/ifcopenshell-python/ifcopenshell/api/alignment/add_vertical_layout.py b/src/ifcopenshell-python/ifcopenshell/api/alignment/add_vertical_layout.py index 41daef657ce..09feb78a400 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/alignment/add_vertical_layout.py +++ b/src/ifcopenshell-python/ifcopenshell/api/alignment/add_vertical_layout.py @@ -17,7 +17,6 @@ # along with IfcOpenShell. If not, see . import ifcopenshell -import ifcopenshell.api import ifcopenshell.api.aggregate import ifcopenshell.api.alignment import ifcopenshell.api.geometry diff --git a/src/ifcopenshell-python/ifcopenshell/api/alignment/create_as_offset_curve.py b/src/ifcopenshell-python/ifcopenshell/api/alignment/create_as_offset_curve.py index f4bc35773aa..6ac56af3629 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/alignment/create_as_offset_curve.py +++ b/src/ifcopenshell-python/ifcopenshell/api/alignment/create_as_offset_curve.py @@ -20,9 +20,6 @@ import ifcopenshell import ifcopenshell.api.aggregate -import ifcopenshell.api.alignment -import ifcopenshell.api.nest -import ifcopenshell.util.alignment from ifcopenshell import entity_instance from ifcopenshell.api.alignment._create_offset_curve_representation import ( _create_offset_curve_representation, @@ -42,7 +39,7 @@ def create_as_offset_curve( :param file: :param name: name assigned to IfcAlignment.Name - :param offsets: offsets from the basis curve that defines the offset curve, expected to be IfcOffsetCurveByDistances. + :param offsets: offsets from the basis curve that defines the offset curve, expected to be IfcPointByDistanceExpression. :param start_station: station value at the start of the alignment :return: Returns an IfcAlignment """ diff --git a/src/ifcopenshell-python/ifcopenshell/api/alignment/create_by_pi_method.py b/src/ifcopenshell-python/ifcopenshell/api/alignment/create_by_pi_method.py index 09a0f0ecb6d..e6ceba05721 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/alignment/create_by_pi_method.py +++ b/src/ifcopenshell-python/ifcopenshell/api/alignment/create_by_pi_method.py @@ -19,9 +19,7 @@ from collections.abc import Sequence import ifcopenshell -import ifcopenshell.api.aggregate import ifcopenshell.api.alignment -import ifcopenshell.api.nest from ifcopenshell import entity_instance diff --git a/src/ifcopenshell-python/ifcopenshell/api/alignment/create_from_csv.py b/src/ifcopenshell-python/ifcopenshell/api/alignment/create_from_csv.py index ce7192611cd..3bd8ed275d6 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/alignment/create_from_csv.py +++ b/src/ifcopenshell-python/ifcopenshell/api/alignment/create_from_csv.py @@ -17,13 +17,10 @@ # along with IfcOpenShell. If not, see . import csv -from collections.abc import Sequence import ifcopenshell -import ifcopenshell.api import ifcopenshell.api.alignment from ifcopenshell import entity_instance -from ifcopenshell.api.alignment import get_axis_subcontext def create_from_csv(file: ifcopenshell.file, filepath: str) -> entity_instance: diff --git a/src/ifcopenshell-python/ifcopenshell/api/alignment/create_layout_segment.py b/src/ifcopenshell-python/ifcopenshell/api/alignment/create_layout_segment.py index 6fd6876e08a..52f329694b9 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/alignment/create_layout_segment.py +++ b/src/ifcopenshell-python/ifcopenshell/api/alignment/create_layout_segment.py @@ -16,7 +16,6 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . -import math from typing import Union import numpy as np diff --git a/src/ifcopenshell-python/ifcopenshell/api/alignment/get_alignment_layout_nest.py b/src/ifcopenshell-python/ifcopenshell/api/alignment/get_alignment_layout_nest.py index b870fd16929..2a6287f6ebf 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/alignment/get_alignment_layout_nest.py +++ b/src/ifcopenshell-python/ifcopenshell/api/alignment/get_alignment_layout_nest.py @@ -16,7 +16,6 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . -import ifcopenshell from ifcopenshell import entity_instance diff --git a/src/ifcopenshell-python/ifcopenshell/api/alignment/get_alignment_layouts.py b/src/ifcopenshell-python/ifcopenshell/api/alignment/get_alignment_layouts.py index 4b4a1a17d33..5e05cf1fe48 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/alignment/get_alignment_layouts.py +++ b/src/ifcopenshell-python/ifcopenshell/api/alignment/get_alignment_layouts.py @@ -18,9 +18,6 @@ from collections.abc import Sequence -import ifcopenshell -import ifcopenshell.util -import ifcopenshell.util.representation from ifcopenshell import entity_instance diff --git a/src/ifcopenshell-python/ifcopenshell/api/alignment/get_alignment_segment_nest.py b/src/ifcopenshell-python/ifcopenshell/api/alignment/get_alignment_segment_nest.py index fba39617eab..4fc732ed0cf 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/alignment/get_alignment_segment_nest.py +++ b/src/ifcopenshell-python/ifcopenshell/api/alignment/get_alignment_segment_nest.py @@ -16,7 +16,6 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . -import ifcopenshell from ifcopenshell import entity_instance diff --git a/src/ifcopenshell-python/ifcopenshell/api/alignment/get_basis_curve.py b/src/ifcopenshell-python/ifcopenshell/api/alignment/get_basis_curve.py index 0bf28746fe8..7057640e021 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/alignment/get_basis_curve.py +++ b/src/ifcopenshell-python/ifcopenshell/api/alignment/get_basis_curve.py @@ -16,8 +16,6 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . -import ifcopenshell -import ifcopenshell.util import ifcopenshell.util.representation from ifcopenshell import entity_instance diff --git a/src/ifcopenshell-python/ifcopenshell/api/alignment/get_child_alignments.py b/src/ifcopenshell-python/ifcopenshell/api/alignment/get_child_alignments.py index ccc8f012146..db3a74b35b0 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/alignment/get_child_alignments.py +++ b/src/ifcopenshell-python/ifcopenshell/api/alignment/get_child_alignments.py @@ -18,9 +18,6 @@ from collections.abc import Sequence -import ifcopenshell -import ifcopenshell.util -import ifcopenshell.util.element from ifcopenshell import entity_instance diff --git a/src/ifcopenshell-python/ifcopenshell/api/alignment/get_curve.py b/src/ifcopenshell-python/ifcopenshell/api/alignment/get_curve.py index 6b1a7172d9c..1bf320db606 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/alignment/get_curve.py +++ b/src/ifcopenshell-python/ifcopenshell/api/alignment/get_curve.py @@ -16,8 +16,6 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . -import ifcopenshell -import ifcopenshell.util import ifcopenshell.util.representation from ifcopenshell import entity_instance diff --git a/src/ifcopenshell-python/ifcopenshell/api/alignment/get_curve_segment_transition_code.py b/src/ifcopenshell-python/ifcopenshell/api/alignment/get_curve_segment_transition_code.py index 6711935e6fb..7fe4d30513d 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/alignment/get_curve_segment_transition_code.py +++ b/src/ifcopenshell-python/ifcopenshell/api/alignment/get_curve_segment_transition_code.py @@ -16,12 +16,9 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . -import math import numpy as np -import ifcopenshell -import ifcopenshell.api import ifcopenshell.geom from ifcopenshell import entity_instance, ifcopenshell_wrapper diff --git a/src/ifcopenshell-python/ifcopenshell/api/alignment/get_layout_curve.py b/src/ifcopenshell-python/ifcopenshell/api/alignment/get_layout_curve.py index 0b5a70b1274..4b26754ee8b 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/alignment/get_layout_curve.py +++ b/src/ifcopenshell-python/ifcopenshell/api/alignment/get_layout_curve.py @@ -16,7 +16,6 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . -import ifcopenshell import ifcopenshell.api.alignment from ifcopenshell import entity_instance diff --git a/src/ifcopenshell-python/ifcopenshell/api/alignment/get_layout_segments.py b/src/ifcopenshell-python/ifcopenshell/api/alignment/get_layout_segments.py index 34cfd90a1d5..758693081ba 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/alignment/get_layout_segments.py +++ b/src/ifcopenshell-python/ifcopenshell/api/alignment/get_layout_segments.py @@ -18,9 +18,6 @@ from collections.abc import Sequence -import ifcopenshell -import ifcopenshell.util -import ifcopenshell.util.element from ifcopenshell import entity_instance diff --git a/src/ifcopenshell-python/ifcopenshell/api/alignment/get_mapped_segments.py b/src/ifcopenshell-python/ifcopenshell/api/alignment/get_mapped_segments.py index 2e10aa9824a..0b8a3b65b38 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/alignment/get_mapped_segments.py +++ b/src/ifcopenshell-python/ifcopenshell/api/alignment/get_mapped_segments.py @@ -18,7 +18,6 @@ from collections.abc import Sequence -import ifcopenshell import ifcopenshell.api.alignment from ifcopenshell import entity_instance diff --git a/src/ifcopenshell-python/ifcopenshell/api/alignment/get_parent_alignment.py b/src/ifcopenshell-python/ifcopenshell/api/alignment/get_parent_alignment.py index 333bfc01e5c..d99d832fd2d 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/alignment/get_parent_alignment.py +++ b/src/ifcopenshell-python/ifcopenshell/api/alignment/get_parent_alignment.py @@ -16,9 +16,6 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . -import ifcopenshell -import ifcopenshell.util -import ifcopenshell.util.representation from ifcopenshell import entity_instance diff --git a/src/ifcopenshell-python/ifcopenshell/api/alignment/has_zero_length_segment.py b/src/ifcopenshell-python/ifcopenshell/api/alignment/has_zero_length_segment.py index 036e4de59ad..7daa9f23f13 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/alignment/has_zero_length_segment.py +++ b/src/ifcopenshell-python/ifcopenshell/api/alignment/has_zero_length_segment.py @@ -16,9 +16,6 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . -import ifcopenshell -import ifcopenshell.api.alignment -import ifcopenshell.util.element from ifcopenshell import entity_instance diff --git a/src/ifcopenshell-python/ifcopenshell/api/alignment/layout_horizontal_alignment_by_pi_method.py b/src/ifcopenshell-python/ifcopenshell/api/alignment/layout_horizontal_alignment_by_pi_method.py index ed157c3c90f..676e03e4296 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/alignment/layout_horizontal_alignment_by_pi_method.py +++ b/src/ifcopenshell-python/ifcopenshell/api/alignment/layout_horizontal_alignment_by_pi_method.py @@ -21,7 +21,6 @@ import ifcopenshell import ifcopenshell.api.alignment -import ifcopenshell.util import ifcopenshell.util.unit from ifcopenshell import entity_instance diff --git a/src/ifcopenshell-python/ifcopenshell/api/alignment/name_segments.py b/src/ifcopenshell-python/ifcopenshell/api/alignment/name_segments.py index 60363320887..e010119b1a5 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/alignment/name_segments.py +++ b/src/ifcopenshell-python/ifcopenshell/api/alignment/name_segments.py @@ -16,7 +16,6 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . -import ifcopenshell from ifcopenshell import entity_instance diff --git a/src/ifcopenshell-python/ifcopenshell/api/alignment/util.py b/src/ifcopenshell-python/ifcopenshell/api/alignment/util.py index 144311a3df3..c36e635768b 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/alignment/util.py +++ b/src/ifcopenshell-python/ifcopenshell/api/alignment/util.py @@ -16,17 +16,11 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . -import math import numpy as np import ifcopenshell -import ifcopenshell.api.alignment import ifcopenshell.geom -import ifcopenshell.guid -import ifcopenshell.template -import ifcopenshell.util -import ifcopenshell.util.alignment from ifcopenshell import entity_instance, ifcopenshell_wrapper diff --git a/src/ifcopenshell-python/ifcopenshell/api/attribute/edit_attributes.py b/src/ifcopenshell-python/ifcopenshell/api/attribute/edit_attributes.py index 2e679fd4090..1f46e70921d 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/attribute/edit_attributes.py +++ b/src/ifcopenshell-python/ifcopenshell/api/attribute/edit_attributes.py @@ -16,7 +16,6 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . -import sys from types import EllipsisType from typing import Any, Union diff --git a/src/ifcopenshell-python/ifcopenshell/api/boundary/assign_connection_geometry.py b/src/ifcopenshell-python/ifcopenshell/api/boundary/assign_connection_geometry.py index f974ea2cd22..9d988a4e82f 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/boundary/assign_connection_geometry.py +++ b/src/ifcopenshell-python/ifcopenshell/api/boundary/assign_connection_geometry.py @@ -108,7 +108,7 @@ def execute(self): self.rel_space_boundary.ConnectionGeometry = connection_geometry def create_point(self, point: npt.NDArray) -> ifcopenshell.entity_instance: - return self.file.create_enitty("IfcCartesianPoint", ifc_safe_vector_type(point / self.unit_scale)) + return self.file.create_entity("IfcCartesianPoint", ifc_safe_vector_type(point / self.unit_scale)) def close_polyline( self, points: tuple[ifcopenshell.entity_instance, ...] @@ -127,7 +127,7 @@ def create_plane( return self.file.createIfcPlane( self.file.createIfcAxis2Placement3D( self.create_point(location), - self.file.createIfcDirection(axis), - self.file.createIfcDirection(ref_direction), + self.file.createIfcDirection(ifc_safe_vector_type(axis)), + self.file.createIfcDirection(ifc_safe_vector_type(ref_direction)), ) ) diff --git a/src/ifcopenshell-python/ifcopenshell/api/boundary/edit_attributes.py b/src/ifcopenshell-python/ifcopenshell/api/boundary/edit_attributes.py index ee11094d131..4fa5516bc67 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/boundary/edit_attributes.py +++ b/src/ifcopenshell-python/ifcopenshell/api/boundary/edit_attributes.py @@ -27,12 +27,11 @@ def edit_attributes( related_building_element: ifcopenshell.entity_instance, parent_boundary: Optional[ifcopenshell.entity_instance] = None, corresponding_boundary: Optional[ifcopenshell.entity_instance] = None, + physical_or_virtual: str = "NOTDEFINED", + internal_or_external: str = "NOTDEFINED", ) -> None: """Modify the relationships of a space boundary relationship - Currently this function is quite minimal and offers no advantage to - manual assignment of the space boundary attributes. - :param entity: The IfcRelSpaceBoundary to modify :param relating_space: The IfcSpace or IfcExternalSpatialElement that the space boundary is related to. @@ -44,17 +43,18 @@ def edit_attributes( :param corresponding_boundary: The other IfcRelSpaceBoundary on the other side of the related element. The pair together represents a thermal boundary. This only applies to 2nd level boundaries. + :param physical_or_virtual: IfcPhysicalOrVirtualEnum value: "PHYSICAL", + "VIRTUAL", or "NOTDEFINED". + :param internal_or_external: IfcInternalOrExternalEnum value: + "INTERNAL", "EXTERNAL", "EXTERNAL_EARTH", "EXTERNAL_WATER", + "EXTERNAL_FIRE", or "NOTDEFINED". :return: None """ - entity = entity - relating_space = relating_space - related_building_element = related_building_element - parent_boundary = parent_boundary - corresponding_boundary = corresponding_boundary - entity.RelatingSpace = relating_space entity.RelatedBuildingElement = related_building_element if hasattr(entity, "ParentBoundary"): entity.ParentBoundary = parent_boundary if hasattr(entity, "CorrespondingBoundary"): entity.CorrespondingBoundary = corresponding_boundary + entity.PhysicalOrVirtualBoundary = physical_or_virtual + entity.InternalOrExternalBoundary = internal_or_external diff --git a/src/ifcopenshell-python/ifcopenshell/api/classification/add_classification.py b/src/ifcopenshell-python/ifcopenshell/api/classification/add_classification.py index 6642e618b46..50cff831944 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/classification/add_classification.py +++ b/src/ifcopenshell-python/ifcopenshell/api/classification/add_classification.py @@ -16,7 +16,7 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . -from typing import Any, Union +from typing import Union import ifcopenshell import ifcopenshell.guid diff --git a/src/ifcopenshell-python/ifcopenshell/api/cogo/assign_survey_point.py b/src/ifcopenshell-python/ifcopenshell/api/cogo/assign_survey_point.py index be9e650ac79..5117998c6f0 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/cogo/assign_survey_point.py +++ b/src/ifcopenshell-python/ifcopenshell/api/cogo/assign_survey_point.py @@ -16,9 +16,7 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . -import typing -import ifcopenshell from ifcopenshell import entity_instance diff --git a/src/ifcopenshell-python/ifcopenshell/api/cogo/edit_survey_point.py b/src/ifcopenshell-python/ifcopenshell/api/cogo/edit_survey_point.py index 3c7d4784417..1ee499e026b 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/cogo/edit_survey_point.py +++ b/src/ifcopenshell-python/ifcopenshell/api/cogo/edit_survey_point.py @@ -16,9 +16,7 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . -import typing -import ifcopenshell from ifcopenshell import entity_instance diff --git a/src/ifcopenshell-python/ifcopenshell/api/context/remove_context.py b/src/ifcopenshell-python/ifcopenshell/api/context/remove_context.py index bb4dcff79a1..806782b1e46 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/context/remove_context.py +++ b/src/ifcopenshell-python/ifcopenshell/api/context/remove_context.py @@ -51,8 +51,10 @@ def remove_context(file: ifcopenshell.file, context: ifcopenshell.entity_instanc new = context.ParentContext for inverse in file.get_inverse(context): if inverse.is_a("IfcCoordinateOperation"): + # Trick to make sure the coordinate operation is not referenced + # by a context so we can delete it safely inverse.SourceCRS = inverse.TargetCRS - ifcopenshell.util.element.remove_deep(file, inverse) + ifcopenshell.util.element.remove_deep2(file, inverse) else: ifcopenshell.util.element.replace_attribute(inverse, context, new) file.remove(context) diff --git a/src/ifcopenshell-python/ifcopenshell/api/cost/calculate_cost_item_resource_value.py b/src/ifcopenshell-python/ifcopenshell/api/cost/calculate_cost_item_resource_value.py index fc53e2ff3da..e37b597b3d6 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/cost/calculate_cost_item_resource_value.py +++ b/src/ifcopenshell-python/ifcopenshell/api/cost/calculate_cost_item_resource_value.py @@ -17,7 +17,6 @@ # along with IfcOpenShell. If not, see . import ifcopenshell.api.cost -import ifcopenshell.util.date import ifcopenshell.util.resource diff --git a/src/ifcopenshell-python/ifcopenshell/api/cost/edit_cost_value.py b/src/ifcopenshell-python/ifcopenshell/api/cost/edit_cost_value.py index e1be5539223..3a9bbe0cdec 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/cost/edit_cost_value.py +++ b/src/ifcopenshell-python/ifcopenshell/api/cost/edit_cost_value.py @@ -59,6 +59,6 @@ def edit_cost_value( value["ValueComponent"], ) value = file.create_entity("IfcMeasureWithUnit", value_component, value["UnitComponent"]) - if old_unit_basis and file.get_total_inverses(old_unit_basis) == 0: - ifcopenshell.util.element.remove_deep(file, old_unit_basis) + if old_unit_basis: + ifcopenshell.util.element.remove_deep2(file, old_unit_basis) setattr(cost_value, name, value) diff --git a/src/ifcopenshell-python/ifcopenshell/api/cost/edit_cost_value_formula.py b/src/ifcopenshell-python/ifcopenshell/api/cost/edit_cost_value_formula.py index 213940904d5..1fd46a41c3b 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/cost/edit_cost_value_formula.py +++ b/src/ifcopenshell-python/ifcopenshell/api/cost/edit_cost_value_formula.py @@ -21,8 +21,6 @@ import ifcopenshell import ifcopenshell.api.cost import ifcopenshell.util.cost -import ifcopenshell.util.element -import ifcopenshell.util.unit def edit_cost_value_formula(file: ifcopenshell.file, cost_value: ifcopenshell.entity_instance, formula: str) -> None: diff --git a/src/ifcopenshell-python/ifcopenshell/api/cost/remove_cost_item.py b/src/ifcopenshell-python/ifcopenshell/api/cost/remove_cost_item.py index ce1aa5545ef..9b90cce2e88 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/cost/remove_cost_item.py +++ b/src/ifcopenshell-python/ifcopenshell/api/cost/remove_cost_item.py @@ -51,7 +51,7 @@ def remove_cost_item(file: ifcopenshell.file, cost_item: ifcopenshell.entity_ins if history: ifcopenshell.util.element.remove_deep2(file, history) elif inverse.is_a("IfcRelAssignsToControl"): - if len(inverse.RelatedObjects) >= 2 or inverse.RelatingControl == cost_item: + if len(inverse.RelatedObjects) >= 2: continue history = inverse.OwnerHistory file.remove(inverse) diff --git a/src/ifcopenshell-python/ifcopenshell/api/feature/remove_feature.py b/src/ifcopenshell-python/ifcopenshell/api/feature/remove_feature.py index ff847b39eb2..100e8862148 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/feature/remove_feature.py +++ b/src/ifcopenshell-python/ifcopenshell/api/feature/remove_feature.py @@ -22,11 +22,13 @@ def remove_feature(file: ifcopenshell.file, feature: ifcopenshell.entity_instance) -> None: - """Remove a feature + """Permanently delete a feature element and its void or projection relationship. - Fillings are retained as orphans. Featured elements remain. Features - cannot exist by themselves, so not only is the relationship removed, the - feature is also removed. + The feature entity (e.g. IfcOpeningElement) is removed from the model + along with its IfcRelVoidsElement or IfcRelProjectsElement relationship. + The host element (wall, slab, etc.) is unaffected. Any fillings (windows, + doors) that occupied the opening become orphaned and must be separately + deleted via root.remove_product. :param feature: The IfcFeatureElement to remove. diff --git a/src/ifcopenshell-python/ifcopenshell/api/geometry/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/__init__.py index 44728c29022..d845f4dc834 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/geometry/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/__init__.py @@ -25,7 +25,10 @@ from .. import wrap_usecases from .add_axis_representation import add_axis_representation +from .add_topology_representation import add_topology_representation from .add_boolean import add_boolean +from .clip_solid import clip_solid +from .clip_solid_bounded import clip_solid_bounded from .add_door_representation import add_door_representation from .add_footprint_representation import add_footprint_representation from .add_mesh_representation import add_mesh_representation @@ -50,6 +53,7 @@ from .disconnect_path import disconnect_path from .edit_object_placement import edit_object_placement from .map_representation import map_representation +from .copy_representation import copy_representation from .regenerate_wall_representation import regenerate_wall_representation from .remove_boolean import remove_boolean from .remove_representation import remove_representation @@ -60,7 +64,11 @@ __all__ = [ "add_axis_representation", + "add_topology_representation", "add_boolean", + "clip_solid", + "clip_solid_bounded", + "copy_representation", "add_door_representation", "add_footprint_representation", "add_mesh_representation", diff --git a/src/ifcopenshell-python/ifcopenshell/api/geometry/add_boolean.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/add_boolean.py index 910df42d8c3..80ebf5bb898 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/geometry/add_boolean.py +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/add_boolean.py @@ -31,17 +31,6 @@ def add_boolean( ) -> list[ifcopenshell.entity_instance]: """Adds a boolean operation to two or more representation items - If an IfcBooleanOperand is part of the top level items in an - IfcShapeRepresentation, it will be removed from that level whilst being - added to the IfcBooleanResult. This is because it is generally intuitive - that an item is either participating in a boolean operation, or being an - item in its own right, but not both. - - However, if an IfcBooleanOperand is part of another boolean operation - already, it will not be removed from the existing operation. A new - operation will be created, and therefore it will participate in two - operations. - This function protects against recursive booleans. After a boolean operation is made, since the items of @@ -101,9 +90,6 @@ def is_operand(item): booleans = [] for second_item in second_items: - for inverse in file.get_inverse(second_item): - if inverse.is_a("IfcShapeRepresentation"): - inverse.Items = list(set(inverse.Items) - {second_item}) if first.is_a("IfcTesselatedFaceSet"): first.Closed = True # For now, trust the user to do the right thing. if second_item.is_a("IfcTesselatedFaceSet"): diff --git a/src/ifcopenshell-python/ifcopenshell/api/geometry/add_representation.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/add_representation.py index d77655a60cd..e756cb07cf2 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/geometry/add_representation.py +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/add_representation.py @@ -20,15 +20,15 @@ import math from typing import TYPE_CHECKING, Any, Literal, Optional, Union -import bmesh -import bpy.types +import bmesh # pyright: ignore[reportMissingImports] # ty:ignore[unresolved-import] +import bpy # pyright: ignore[reportMissingImports] # ty:ignore[unresolved-import] import numpy as np import numpy.typing as npt -from mathutils import Matrix, Vector +from mathutils import Matrix, Vector # pyright: ignore[reportMissingImports] # ty:ignore[unresolved-import] import ifcopenshell.util.shape_builder import ifcopenshell.util.unit -from ifcopenshell.util.shape_builder import VectorType, ifc_safe_vector_type +from ifcopenshell.util.shape_builder import ifc_safe_vector_type if TYPE_CHECKING: import bonsai.tool as tool diff --git a/src/ifcopenshell-python/ifcopenshell/api/geometry/add_slab_representation.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/add_slab_representation.py index 284f6e7c305..6e600eca9a7 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/geometry/add_slab_representation.py +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/add_slab_representation.py @@ -17,7 +17,7 @@ # along with IfcOpenShell. If not, see . from math import cos, sin -from typing import Any, Optional, Union +from typing import Optional, Union import ifcopenshell.util.element import ifcopenshell.util.unit diff --git a/src/ifcopenshell-python/ifcopenshell/api/geometry/add_topology_representation.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/add_topology_representation.py new file mode 100644 index 00000000000..e01284fd4f0 --- /dev/null +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/add_topology_representation.py @@ -0,0 +1,97 @@ +# IfcOpenShell - IFC toolkit and geometry engine +# Copyright (C) 2026 Dion Moult +# +# This file is part of IfcOpenShell. +# +# IfcOpenShell is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# IfcOpenShell is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with IfcOpenShell. If not, see . +# This file was generated with the assistance of an AI coding tool. + +from typing import Optional + +import ifcopenshell + +_ITEM_TYPE_TO_REP_TYPE = { + "IfcVertex": "Vertex", + "IfcVertexPoint": "Vertex", + "IfcEdge": "Edge", + "IfcOrientedEdge": "Edge", + "IfcEdgeCurve": "Edge", + "IfcEdgeLoop": "Edge", + "IfcPath": "Edge", + "IfcFace": "Face", + "IfcFaceSurface": "Face", + "IfcAdvancedFace": "Face", + "IfcClosedShell": "Face", + "IfcOpenShell": "Face", + "IfcConnectedFaceSet": "Face", +} + + +def add_topology_representation( + file: ifcopenshell.file, + context: ifcopenshell.entity_instance, + item: ifcopenshell.entity_instance, + representation_identifier: Optional[str] = None, + representation_type: Optional[str] = None, +) -> ifcopenshell.entity_instance: + """Adds an IfcTopologyRepresentation for a structural element + + Structural analysis elements (IfcStructuralSurfaceMember, + IfcStructuralCurveMember) use topology representations rather than solid + geometry. This is analogous to :func:`add_axis_representation` and + :func:`add_profile_representation` but produces an + IfcTopologyRepresentation instead of an IfcShapeRepresentation. + + The representation type ("Face", "Edge", "Vertex") is inferred from the + item's IFC class if not provided explicitly. + + :param context: The IfcGeometricRepresentationContext for the + representation, typically a Reference context. + :param item: The IfcTopologicalRepresentationItem (e.g. IfcFaceSurface, + IfcEdge) to include in the representation. + :param representation_identifier: The RepresentationIdentifier string. + Defaults to the context's ContextIdentifier. + :param representation_type: The RepresentationType string ("Face", + "Edge", "Vertex"). Inferred from item class if not given. + :return: The newly created IfcTopologyRepresentation entity. + + Example: + + .. code:: python + + context = ifcopenshell.util.representation.get_context( + model, "Model", "Reference", "GRAPH_VIEW") + face = model.createIfcFaceSurface(bounds, surface, True) + rep = ifcopenshell.api.geometry.add_topology_representation( + model, context=context, item=face) + ifcopenshell.api.geometry.assign_representation( + model, product=member, representation=rep) + """ + if representation_identifier is None: + representation_identifier = context.ContextIdentifier + + if representation_type is None: + for ifc_class, rep_type in _ITEM_TYPE_TO_REP_TYPE.items(): + if item.is_a(ifc_class): + representation_type = rep_type + break + else: + representation_type = "Undefined" + + return file.createIfcTopologyRepresentation( + context, + representation_identifier, + representation_type, + [item], + ) diff --git a/src/ifcopenshell-python/ifcopenshell/api/geometry/add_wall_representation.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/add_wall_representation.py index 4c108dc7df0..c5424718963 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/geometry/add_wall_representation.py +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/add_wall_representation.py @@ -16,7 +16,7 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . -from math import cos, pi, sin +from math import cos, sin from typing import Any, Optional, Union import ifcopenshell.util.element @@ -47,7 +47,9 @@ def add_wall_representation( :param thickness: The thickness of the wall in meters. :param x_angle: The slope angle along the wall's X-axis, in radians. :param clippings: List of clipping definitions. Clippings can be `Clipping` objects - or dictionaries of arguments for `Clipping.parse`. + or dictionaries of arguments for `Clipping.parse`. Each clipping has a + ``normal`` that points toward the removed material (the discarded side), + not toward the kept material; see :func:`clip_solid` for details. :param booleans: List of any existing IfcBooleanResults. :return: IfcShapeRepresentation. """ diff --git a/src/ifcopenshell-python/ifcopenshell/api/geometry/assign_representation.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/assign_representation.py index 158f0152ac1..a1e03ece8b7 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/geometry/assign_representation.py +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/assign_representation.py @@ -16,7 +16,6 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . -from typing import Any import ifcopenshell.api.geometry import ifcopenshell.api.owner diff --git a/src/ifcopenshell-python/ifcopenshell/api/geometry/clip_solid.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/clip_solid.py new file mode 100644 index 00000000000..a83fd4385f4 --- /dev/null +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/clip_solid.py @@ -0,0 +1,86 @@ +# IfcOpenShell - IFC toolkit and geometry engine +# Copyright (C) 2026 Dion Moult +# +# This file is part of IfcOpenShell. +# +# IfcOpenShell is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# IfcOpenShell is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with IfcOpenShell. If not, see . + +from __future__ import annotations + +import json +from typing import Optional, Sequence + +import ifcopenshell.api.pset +import ifcopenshell.util.element +import ifcopenshell.util.unit +from ifcopenshell.util.data import Clipping + + +def clip_solid( + file: ifcopenshell.file, + item: ifcopenshell.entity_instance, + location: Sequence[float], + normal: Sequence[float], + element: Optional[ifcopenshell.entity_instance] = None, +) -> ifcopenshell.entity_instance: + """Clip a solid with a half-space plane, returning an IfcBooleanClippingResult. + + Convenience wrapper around :class:`ifcopenshell.util.data.Clipping` for + use with any solid. This is the same convention used by the ``clippings`` + parameter of :func:`add_wall_representation`. + + .. warning:: + + The ``normal`` points toward the **removed** material (the discarded + side), not toward the kept material. For a slope clip the normal + points upward into the removed wedge above the slope line. For a + side mitre the normal points outward away from the wall body. + + After clipping, set the parent ``IfcShapeRepresentation`` + ``RepresentationType`` to ``"Clipping"``. + + Example — trim an extruded solid to a lean-to slope (removed material is + above the slope):: + + bcr = ifcopenshell.api.run( + "geometry.clip_solid", model, + item=extrusion, + location=[0.0, 0.0, 3.26], + normal=[0.419, 0.0, 0.908], # points UP toward removed material + ) + + :param item: The solid to clip (``IfcSweptAreaSolid``, ``IfcSweptDiskSolid``, + or ``IfcBooleanClippingResult``). + :param location: A point on the clipping plane in the representation's + local coordinate system. + :param normal: Plane normal pointing toward the material to be removed + (see warning above). + :param element: If provided, the resulting ``IfcBooleanClippingResult`` is + registered in the element's ``BBIM_Boolean`` property set so that + :func:`regenerate_wall_representation` preserves it during regeneration. + :return: The resulting ``IfcBooleanClippingResult``. + """ + unit_scale = ifcopenshell.util.unit.calculate_unit_scale(file) + clipping = Clipping(location=tuple(location), normal=tuple(normal)) + result = clipping.apply(file, item, unit_scale) + if element is not None: + pset_data = ifcopenshell.util.element.get_pset(element, "BBIM_Boolean") + if pset_data: + pset = file.by_id(pset_data["id"]) + data = list(set(json.loads(pset_data["Data"]) + [result.id()])) + else: + pset = ifcopenshell.api.pset.add_pset(file, product=element, name="BBIM_Boolean") + data = [result.id()] + ifcopenshell.api.pset.edit_pset(file, pset=pset, properties={"Data": json.dumps(data)}) + return result diff --git a/src/ifcopenshell-python/ifcopenshell/api/geometry/clip_solid_bounded.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/clip_solid_bounded.py new file mode 100644 index 00000000000..ac2e39c741b --- /dev/null +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/clip_solid_bounded.py @@ -0,0 +1,116 @@ +# IfcOpenShell - IFC toolkit and geometry engine +# Copyright (C) 2026 Dion Moult +# +# This file is part of IfcOpenShell. +# +# IfcOpenShell is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# IfcOpenShell is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with IfcOpenShell. If not, see . + +from __future__ import annotations + +import json +from typing import Optional, Sequence + +import numpy as np + +import ifcopenshell.api.pset +import ifcopenshell.util.element +import ifcopenshell.util.unit +from ifcopenshell.util.shape_builder import ShapeBuilder + + +def clip_solid_bounded( + file: ifcopenshell.file, + item: ifcopenshell.entity_instance, + location: Sequence[float], + normal: Sequence[float], + boundary_points: Sequence[Sequence[float]], + boundary_position: Sequence[float] = (0.0, 0.0, 0.0), + element: Optional[ifcopenshell.entity_instance] = None, +) -> ifcopenshell.entity_instance: + """Clip a solid with a polygonally bounded half-space, returning an IfcBooleanClippingResult. + + Like :func:`clip_solid`, but the boolean subtraction is restricted to the + region enclosed by ``boundary_points`` rather than extending across the + entire half-space. The clipping plane is still infinite, but material is + only removed within the extruded footprint of the polygon. + + The ``normal`` convention is the same as :func:`clip_solid`: it points + toward the **removed** material. + + After clipping, set the parent ``IfcShapeRepresentation`` + ``RepresentationType`` to ``"Clipping"``. + + Example:: + + bcr = ifcopenshell.api.run( + "geometry.clip_solid_bounded", model, + item=extrusion, + location=[2.5, 0.0, 2.0], + normal=[0.6, 0.0, 0.8], + boundary_points=[[2.0, 0.0], [3.0, 0.0], [3.0, 2.0], [2.0, 2.0]], + ) + + :param item: The solid to clip (``IfcSweptAreaSolid``, ``IfcSweptDiskSolid``, + or ``IfcBooleanClippingResult``). + :param location: A point on the clipping plane in the representation's + local coordinate system. + :param normal: Plane normal pointing toward the material to be removed. + :param boundary_points: 2D ``[x, y]`` points defining the closed polygonal + boundary in the coordinate system of ``boundary_position``. The polygon + is automatically closed — do not repeat the first point. + :param boundary_position: 3D origin of the boundary coordinate system + (axes default to the global X/Y/Z directions). Defaults to the origin. + :param element: If provided, the resulting ``IfcBooleanClippingResult`` is + registered in the element's ``BBIM_Boolean`` property set so that + :func:`regenerate_wall_representation` preserves it during regeneration. + :return: The resulting ``IfcBooleanClippingResult``. + """ + unit_scale = ifcopenshell.util.unit.calculate_unit_scale(file) + builder = ShapeBuilder(file) + + normal_arr = np.array(normal) + if np.allclose(normal_arr, [0.0, 0.0, 1.0], atol=1e-2) or np.allclose(normal_arr, [0.0, 0.0, -1.0], atol=1e-2): + arbitrary_vector = np.array([0.0, 1.0, 0.0]) + else: + arbitrary_vector = np.array([0.0, 0.0, 1.0]) + x_axis = np.cross(normal_arr, arbitrary_vector) + x_axis /= np.linalg.norm(x_axis) + + scaled_location = [i / unit_scale for i in location] + plane_placement = builder.create_axis2_placement_3d(scaled_location, normal, x_axis) + plane = file.create_entity("IfcPlane", plane_placement) + + scaled_boundary_position = [i / unit_scale for i in boundary_position] + boundary_pos_entity = file.create_entity( + "IfcAxis2Placement3D", + file.create_entity("IfcCartesianPoint", scaled_boundary_position), + ) + + scaled_pts = [[p[0] / unit_scale, p[1] / unit_scale] for p in boundary_points] + scaled_pts.append(scaled_pts[0]) # close the polygon + ifc_pts = [file.create_entity("IfcCartesianPoint", p) for p in scaled_pts] + boundary = file.createIfcPolyline(ifc_pts) + + half_space = file.create_entity("IfcPolygonalBoundedHalfSpace", plane, False, boundary_pos_entity, boundary) + result = file.create_entity("IfcBooleanClippingResult", "DIFFERENCE", item, half_space) + if element is not None: + pset_data = ifcopenshell.util.element.get_pset(element, "BBIM_Boolean") + if pset_data: + pset = file.by_id(pset_data["id"]) + data = list(set(json.loads(pset_data["Data"]) + [result.id()])) + else: + pset = ifcopenshell.api.pset.add_pset(file, product=element, name="BBIM_Boolean") + data = [result.id()] + ifcopenshell.api.pset.edit_pset(file, pset=pset, properties={"Data": json.dumps(data)}) + return result diff --git a/src/ifcopenshell-python/ifcopenshell/api/geometry/connect_path.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/connect_path.py index 3135bef1168..64c9fddb62e 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/geometry/connect_path.py +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/connect_path.py @@ -31,6 +31,7 @@ def connect_path( relating_connection: str = "NOTDEFINED", related_connection: str = "NOTDEFINED", description: Optional[str] = None, + connection_geometry: Optional[ifcopenshell.entity_instance] = None, ) -> ifcopenshell.entity_instance: incompatible_connections: list[ifcopenshell.entity_instance] = [] for rel in relating_element.ConnectedTo: @@ -73,6 +74,7 @@ def connect_path( ifcopenshell.guid.new(), OwnerHistory=ifcopenshell.api.owner.create_owner_history(file), Description=description, + ConnectionGeometry=connection_geometry, RelatingElement=relating_element, RelatedElement=related_element, RelatingConnectionType=relating_connection, diff --git a/src/ifcopenshell-python/ifcopenshell/api/geometry/copy_representation.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/copy_representation.py new file mode 100644 index 00000000000..c2b4c485a9e --- /dev/null +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/copy_representation.py @@ -0,0 +1,76 @@ +# IfcOpenShell - IFC toolkit and geometry engine +# Copyright (C) 2026 Dion Moult +# +# This file is part of IfcOpenShell. +# +# IfcOpenShell is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# IfcOpenShell is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with IfcOpenShell. If not, see . + +from __future__ import annotations + +from typing import Optional + +import ifcopenshell.api.geometry +import ifcopenshell.util.element +import ifcopenshell.util.representation + + +def copy_representation( + file: ifcopenshell.file, + source: ifcopenshell.entity_instance, + target: ifcopenshell.entity_instance, + context_identifier: str = "Body", +) -> Optional[ifcopenshell.entity_instance]: + """Copy a geometric representation from one element to another. + + Finds the named representation on ``source``, deep-copies its entity + graph (geometry items, profiles, placements, etc.), and assigns the copy + to ``target``. Representation contexts are shared rather than copied. + If ``target`` already has a matching representation it is removed and + replaced. + + If no matching representation is found on ``source``, returns ``None`` + and leaves ``target`` unchanged. + + :param source: The element to copy the representation from. + :param target: The element to assign the copied representation to. + :param context_identifier: The RepresentationIdentifier to look up on + ``source`` (e.g. ``"Body"``, ``"Axis"``, ``"Box"``). + Defaults to ``"Body"``. + :return: The newly created IfcShapeRepresentation, or None if no + matching representation was found on ``source``. + + Example: + + .. code:: python + + wall_a = model.by_id(1) + wall_b = model.by_id(2) + + # Give wall_b the same body geometry as wall_a. + ifcopenshell.api.geometry.copy_representation(model, + source=wall_a, target=wall_b) + """ + source_rep = ifcopenshell.util.representation.get_representation(source, "Model", context_identifier) + if source_rep is None: + return None + + new_rep = ifcopenshell.util.element.copy_deep(file, source_rep, exclude=["IfcGeometricRepresentationContext"]) + + existing_rep = ifcopenshell.util.representation.get_representation(target, "Model", context_identifier) + if existing_rep: + ifcopenshell.api.geometry.unassign_representation(file, product=target, representation=existing_rep) + ifcopenshell.api.geometry.remove_representation(file, representation=existing_rep) + + ifcopenshell.api.geometry.assign_representation(file, product=target, representation=new_rep) + return new_rep diff --git a/src/ifcopenshell-python/ifcopenshell/api/geometry/disconnect_path.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/disconnect_path.py index 6e04a9df731..625bfd329cc 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/geometry/disconnect_path.py +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/disconnect_path.py @@ -19,7 +19,6 @@ from typing import Optional import ifcopenshell -import ifcopenshell.api import ifcopenshell.util.element diff --git a/src/ifcopenshell-python/ifcopenshell/api/geometry/edit_object_placement.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/edit_object_placement.py index 7fbe44ce12b..0d86b997f5f 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/geometry/edit_object_placement.py +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/edit_object_placement.py @@ -52,10 +52,11 @@ def edit_object_placement( :param is_si: If True, the matrix is given in SI units. If false, in project units. :param should_transform_children: A child element is a nested element, - opening, filling, etc. If true, child elements will move along with the - parent. If false, child elements will stay where they are. Because most - placements in IFC are relative, this means that if a child moves, we - actually don't change their placement. + opening, filling, etc. If True, child elements move along with the + parent; pass True when moving an assembly (roof, furniture group, etc.) + and you want all children to follow. If False (default), child elements + keep their current world positions; their local placements are rewritten + to compensate for the parent move. :return: The new or updated IfcLocalPlacement entity """ usecase = Usecase() diff --git a/src/ifcopenshell-python/ifcopenshell/api/geometry/regenerate_wall_representation.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/regenerate_wall_representation.py index 9143577438b..e59c6e1efa1 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/geometry/regenerate_wall_representation.py +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/regenerate_wall_representation.py @@ -69,6 +69,12 @@ def regenerate_wall_representation( additional extrusions are generated for each connection that boolean difference the base extrusion. + Clippings applied via :func:`geometry.clip_solid` or + :func:`geometry.clip_solid_bounded` are preserved only if the ``element`` + parameter was passed when creating them, which registers the result in the + ``BBIM_Boolean`` property set. Clippings created without that parameter + are silently discarded during regeneration. + This will also update the axis line representation (e.g. trim the axis line to any connections). diff --git a/src/ifcopenshell-python/ifcopenshell/api/geometry/validate_type.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/validate_type.py index 46bec8757b9..3731b2fffc3 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/geometry/validate_type.py +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/validate_type.py @@ -83,6 +83,7 @@ def is_operand(item: ifcopenshell.entity_instance) -> bool: if remaining_items: ifcopenshell.api.geometry.add_boolean(file, preferred_item, remaining_items, "UNION") + representation.Items = [i for i in representation.Items if i not in remaining_items] representation.RepresentationType = ifcopenshell.util.representation.guess_type(representation.Items) if representation.RepresentationType == "CSG": diff --git a/src/ifcopenshell-python/ifcopenshell/api/georeference/add_georeferencing.py b/src/ifcopenshell-python/ifcopenshell/api/georeference/add_georeferencing.py index 43ccaea2bca..c7e6dfba801 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/georeference/add_georeferencing.py +++ b/src/ifcopenshell-python/ifcopenshell/api/georeference/add_georeferencing.py @@ -17,6 +17,7 @@ # along with IfcOpenShell. If not, see . import ifcopenshell +import ifcopenshell.api.georeference import ifcopenshell.api.pset import ifcopenshell.util.element @@ -63,8 +64,13 @@ def add_georeferencing(file: ifcopenshell.file, ifc_class: str = "IfcMapConversi }, ) return - if file.by_type("IfcProjectedCRS"): + has_crs = bool(file.by_type("IfcProjectedCRS")) + has_conversion = bool(file.by_type("IfcCoordinateOperation")) + if has_crs and has_conversion: return + if has_crs or has_conversion: + # This is technically invalid, but we shall forgive the industry here if they are wrong ... + ifcopenshell.api.georeference.remove_georeferencing(file) source_crs = None for context in file.by_type("IfcGeometricRepresentationContext", include_subtypes=False): if context.ContextType == "Model": diff --git a/src/ifcopenshell-python/ifcopenshell/api/grid/create_grid_axis.py b/src/ifcopenshell-python/ifcopenshell/api/grid/create_grid_axis.py index 7500ab1f55b..da01050d924 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/grid/create_grid_axis.py +++ b/src/ifcopenshell-python/ifcopenshell/api/grid/create_grid_axis.py @@ -15,7 +15,7 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . -from typing import Literal, Optional +from typing import Literal import ifcopenshell diff --git a/src/ifcopenshell-python/ifcopenshell/api/grid/remove_grid_axis.py b/src/ifcopenshell-python/ifcopenshell/api/grid/remove_grid_axis.py index 652fc89f56e..f9bcacba8d0 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/grid/remove_grid_axis.py +++ b/src/ifcopenshell-python/ifcopenshell/api/grid/remove_grid_axis.py @@ -42,7 +42,5 @@ def remove_grid_axis(file: ifcopenshell.file, axis: ifcopenshell.entity_instance ifcopenshell.api.grid.remove_grid_axis(model, axis=axis_2) """ axis_curve = axis.AxisCurve - if file.get_total_inverses(axis_curve) == 1: - ifcopenshell.util.element.remove_deep(file, axis_curve) - file.remove(axis_curve) file.remove(axis) + ifcopenshell.util.element.remove_deep2(file, axis_curve) diff --git a/src/ifcopenshell-python/ifcopenshell/api/layer/add_layer.py b/src/ifcopenshell-python/ifcopenshell/api/layer/add_layer.py index cd614653260..a2491068487 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/layer/add_layer.py +++ b/src/ifcopenshell-python/ifcopenshell/api/layer/add_layer.py @@ -15,7 +15,6 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . -from typing import Optional import ifcopenshell diff --git a/src/ifcopenshell-python/ifcopenshell/api/layer/unassign_layer.py b/src/ifcopenshell-python/ifcopenshell/api/layer/unassign_layer.py index 3eb0ed8fa1b..1fc6b9762d0 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/layer/unassign_layer.py +++ b/src/ifcopenshell-python/ifcopenshell/api/layer/unassign_layer.py @@ -17,7 +17,6 @@ # along with IfcOpenShell. If not, see . import ifcopenshell -import ifcopenshell.util.element def unassign_layer( diff --git a/src/ifcopenshell-python/ifcopenshell/api/library/add_library.py b/src/ifcopenshell-python/ifcopenshell/api/library/add_library.py index debdded93a3..7b144adb370 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/library/add_library.py +++ b/src/ifcopenshell-python/ifcopenshell/api/library/add_library.py @@ -17,8 +17,6 @@ # along with IfcOpenShell. If not, see . import ifcopenshell -import ifcopenshell.util.date -import ifcopenshell.util.schema def add_library(file: ifcopenshell.file, name: str) -> ifcopenshell.entity_instance: diff --git a/src/ifcopenshell-python/ifcopenshell/api/material/assign_profile.py b/src/ifcopenshell-python/ifcopenshell/api/material/assign_profile.py index 23a5a216b83..4ed83c6a928 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/material/assign_profile.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/assign_profile.py @@ -16,7 +16,6 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . -from typing import Any import ifcopenshell.util.representation diff --git a/src/ifcopenshell-python/ifcopenshell/api/material/unassign_material.py b/src/ifcopenshell-python/ifcopenshell/api/material/unassign_material.py index 00a39a4120f..e7e2542d125 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/material/unassign_material.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/unassign_material.py @@ -16,7 +16,6 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . -from typing import Any import ifcopenshell import ifcopenshell.api.owner diff --git a/src/ifcopenshell-python/ifcopenshell/api/nest/assign_object.py b/src/ifcopenshell-python/ifcopenshell/api/nest/assign_object.py index d3432b617fc..579d0e7a118 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/nest/assign_object.py +++ b/src/ifcopenshell-python/ifcopenshell/api/nest/assign_object.py @@ -19,7 +19,9 @@ from typing import Union import ifcopenshell +import ifcopenshell.api.aggregate import ifcopenshell.api.owner +import ifcopenshell.api.spatial import ifcopenshell.guid import ifcopenshell.util.element @@ -137,7 +139,10 @@ def assign_object( if not objects_to_change: return is_nested_by - # NOTE: An object can both be nested and assigned to a container or an aggregate. + # Can be either only nested, aggregated, or contained at the same time. + possibly_contained = [o for o in objects_without_nests if hasattr(o, "ContainedInStructure")] + ifcopenshell.api.spatial.unassign_container(file, products=possibly_contained) + ifcopenshell.api.aggregate.unassign_object(file, products=objects_without_nests) # unassign elements from previous nests for nests in previous_nests_rels: diff --git a/src/ifcopenshell-python/ifcopenshell/api/owner/add_application.py b/src/ifcopenshell-python/ifcopenshell/api/owner/add_application.py index 8387ecf8712..e2869325d55 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/owner/add_application.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/add_application.py @@ -16,7 +16,7 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . -from typing import Any, Optional, Union +from typing import Optional, Union import ifcopenshell.api import ifcopenshell.api.owner diff --git a/src/ifcopenshell-python/ifcopenshell/api/owner/update_owner_history.py b/src/ifcopenshell-python/ifcopenshell/api/owner/update_owner_history.py index 7df304778ab..0c29c70018c 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/owner/update_owner_history.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/update_owner_history.py @@ -20,7 +20,6 @@ from typing import Union import ifcopenshell -import ifcopenshell.api import ifcopenshell.api.owner.settings import ifcopenshell.util.element diff --git a/src/ifcopenshell-python/ifcopenshell/api/project/append_asset.py b/src/ifcopenshell-python/ifcopenshell/api/project/append_asset.py index c3f55d6795f..8a8f2307a4e 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/project/append_asset.py +++ b/src/ifcopenshell-python/ifcopenshell/api/project/append_asset.py @@ -40,7 +40,7 @@ "IfcProfileDef", "IfcPresentationStyle", ] -APPENDABLE_ASSET_TYPES = get_args(APPENDABLE_ASSET) +APPENDABLE_ASSET_TYPES: tuple[APPENDABLE_ASSET, ...] = get_args(APPENDABLE_ASSET) MATERIAL_SETS = ("IfcMaterialLayerSet", "IfcMaterialConstituentSet", "IfcMaterialProfileSet") @@ -243,6 +243,59 @@ def by_guid(self, guid: str) -> Union[ifcopenshell.entity_instance, None]: except RuntimeError: return None + def material_sets_are_equal(self, set1: ifcopenshell.entity_instance, set2: ifcopenshell.entity_instance) -> bool: + """Check if two material sets are structurally equivalent.""" + if set1.is_a() != set2.is_a(): + return False + + ifc_class = set1.is_a() + + if ifc_class == "IfcMaterialLayerSet": + layers1 = set1.MaterialLayers or [] + layers2 = set2.MaterialLayers or [] + if len(layers1) != len(layers2): + return False + for l1, l2 in zip(layers1, layers2): + if (l1.Material is None) != (l2.Material is None): + return False + if l1.Material and l1.Material.Name != l2.Material.Name: + return False + if l1.LayerThickness != l2.LayerThickness: + return False + + elif ifc_class == "IfcMaterialConstituentSet": + constituents1 = set1.MaterialConstituents or [] + constituents2 = set2.MaterialConstituents or [] + if len(constituents1) != len(constituents2): + return False + for c1, c2 in zip(constituents1, constituents2): + if (c1.Material is None) != (c2.Material is None): + return False + if c1.Material and c1.Material.Name != c2.Material.Name: + return False + if c1.Name != c2.Name: + return False + + elif ifc_class == "IfcMaterialProfileSet": + profiles1 = set1.MaterialProfiles or [] + profiles2 = set2.MaterialProfiles or [] + if len(profiles1) != len(profiles2): + return False + for p1, p2 in zip(profiles1, profiles2): + if (p1.Material is None) != (p2.Material is None): + return False + if p1.Material and p1.Material.Name != p2.Material.Name: + return False + if (p1.Profile is None) != (p2.Profile is None): + return False + if p1.Profile: + profile_name1 = getattr(p1.Profile, "ProfileName", None) + profile_name2 = getattr(p2.Profile, "ProfileName", None) + if profile_name1 != profile_name2: + return False + + return True + def get_existing_element(self, element: ifcopenshell.entity_instance) -> Union[ifcopenshell.entity_instance, None]: """Get existing element for a library element. @@ -264,13 +317,17 @@ def get_existing_element(self, element: ifcopenshell.entity_instance) -> Union[i name = element.Name return next((e for e in self.file.by_type("IfcMaterial") if e.Name == name), None) - elif element in MATERIAL_SETS: + elif element.is_a() in MATERIAL_SETS: ifc_class = element.is_a() name_attr = "LayerSetName" if ifc_class == "IfcMaterialLayerSet" else "Name" material_set_name = getattr(element, name_attr) if material_set_name is None: return - return next((e for e in self.file.by_type(ifc_class) if getattr(e, name_attr) == material_set_name), None) + for candidate in self.file.by_type(ifc_class): + if getattr(candidate, name_attr) == material_set_name: + if self.material_sets_are_equal(element, candidate): + return candidate + return None elif element.is_a("IfcProfileDef"): profile_name = element.ProfileName @@ -324,6 +381,7 @@ def append_presentation_style(self): def append_type_product(self): self.whitelisted_inverse_attributes = { "IfcObjectDefinition": ["HasAssociations"], + "IfcDistributionElementType": ["IsNestedBy"], self.base_material_class: ["HasExternalReferences", "HasProperties", "HasRepresentation"], "IfcRepresentationItem": ["StyledByItem", "LayerAssignment"], "IfcRepresentation": ["LayerAssignments"], @@ -340,6 +398,7 @@ def append_product(self): "IfcObjectDefinition": ["HasAssociations"], "IfcObject": ["IsDefinedBy.IfcRelDefinesByProperties"], "IfcElement": ["HasOpenings"], + "IfcDistributionElement": ["IsNestedBy"], self.base_material_class: ["HasExternalReferences", "HasProperties", "HasRepresentation"], "IfcRepresentationItem": [ "StyledByItem", @@ -372,7 +431,7 @@ def append_product(self): ) ifcopenshell.api.type.assign_type( self.file, - should_run_listeners=False, + should_run_listeners=False, # ty:ignore[unknown-argument] related_objects=[element], relating_type=new_type, should_map_representations=False, @@ -512,6 +571,8 @@ def is_another_asset(self, element: ifcopenshell.entity_instance) -> bool: return False elif element.is_a("IfcRoot") and self.by_guid(element.GlobalId) is not None: return False + elif element.is_a("IfcDistributionPort"): + return False elif element.is_a(self.target_class): return True elif self.target_class == "IfcProduct" and element.is_a("IfcTypeProduct"): @@ -665,12 +726,11 @@ def get_existing_element_( name_attr = "LayerSetName" if ifc_class == "IfcMaterialLayerSet" else "Name" material_set_name = getattr(element, name_attr) if material_set_name is not None: - existing_material_set = next( - (e for e in ifc_file.by_type(ifc_class) if getattr(e, name_attr) == material_set_name), None - ) - if existing_material_set is not None: - reuse_identities[element_identity] = existing_material_set - return existing_material_set + for candidate in ifc_file.by_type(ifc_class): + if getattr(candidate, name_attr) == material_set_name: + if self.material_sets_are_equal(element, candidate): + reuse_identities[element_identity] = candidate + return candidate elif element.is_a("IfcPresentationStyle"): style_name = element.Name diff --git a/src/ifcopenshell-python/ifcopenshell/api/project/create_file.py b/src/ifcopenshell-python/ifcopenshell/api/project/create_file.py index e122ba766b2..a28f6dfa464 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/project/create_file.py +++ b/src/ifcopenshell-python/ifcopenshell/api/project/create_file.py @@ -53,9 +53,7 @@ def create_file(version: ifcopenshell.util.schema.IFC_SCHEMA = "IFC4") -> ifcope """ file = ifcopenshell.file(schema=version) file.header.file_name.name = "/dev/null" # Hehehe - file.header.file_name.time_stamp = ( - datetime.datetime.utcnow().replace(tzinfo=datetime.timezone.utc).astimezone().replace(microsecond=0).isoformat() - ) + file.header.file_name.time_stamp = datetime.datetime.now().astimezone().replace(microsecond=0).isoformat() file.header.file_name.preprocessor_version = "IfcOpenShell {}".format(ifcopenshell.version) file.header.file_name.originating_system = "IfcOpenShell {}".format(ifcopenshell.version) file.header.file_name.authorization = "Nobody" diff --git a/src/ifcopenshell-python/ifcopenshell/api/pset/assign_pset.py b/src/ifcopenshell-python/ifcopenshell/api/pset/assign_pset.py index eef7f6e8e9f..908ffd9aad7 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/pset/assign_pset.py +++ b/src/ifcopenshell-python/ifcopenshell/api/pset/assign_pset.py @@ -21,7 +21,6 @@ import ifcopenshell import ifcopenshell.api.owner import ifcopenshell.guid -import ifcopenshell.util.element def assign_pset( diff --git a/src/ifcopenshell-python/ifcopenshell/api/pset/unassign_pset.py b/src/ifcopenshell-python/ifcopenshell/api/pset/unassign_pset.py index 24256f77feb..e172f7fed11 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/pset/unassign_pset.py +++ b/src/ifcopenshell-python/ifcopenshell/api/pset/unassign_pset.py @@ -17,8 +17,6 @@ # along with IfcOpenShell. If not, see . import ifcopenshell -import ifcopenshell.api.owner -import ifcopenshell.guid import ifcopenshell.util.element diff --git a/src/ifcopenshell-python/ifcopenshell/api/pset/unshare_pset.py b/src/ifcopenshell-python/ifcopenshell/api/pset/unshare_pset.py index 051905b2b7f..d272f984951 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/pset/unshare_pset.py +++ b/src/ifcopenshell-python/ifcopenshell/api/pset/unshare_pset.py @@ -17,9 +17,7 @@ # along with IfcOpenShell. If not, see . import ifcopenshell -import ifcopenshell.api.owner import ifcopenshell.api.pset -import ifcopenshell.guid import ifcopenshell.util.element diff --git a/src/ifcopenshell-python/ifcopenshell/api/pset_template/remove_prop_template.py b/src/ifcopenshell-python/ifcopenshell/api/pset_template/remove_prop_template.py index ca8d5ba55e4..2f81494bc75 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/pset_template/remove_prop_template.py +++ b/src/ifcopenshell-python/ifcopenshell/api/pset_template/remove_prop_template.py @@ -22,9 +22,9 @@ def remove_prop_template(file: ifcopenshell.file, prop_template: ifcopenshell.entity_instance) -> None: """Removes a property template - Note that a property set template should always have at least one - property template to be valid, so take care when removing property - templates. + Note that a property set template should always have at least one property + template to be valid. So a property set template will not be removed if it + is the only template ina a property ste template. :param prop_template: The IfcSimplePropertyTemplate to remove. :return: None @@ -43,10 +43,8 @@ def remove_prop_template(file: ifcopenshell.file, prop_template: ifcopenshell.en ifcopenshell.api.pset_template.remove_prop_template(model, prop_template=prop2) """ for inverse in file.get_inverse(prop_template): - if len(inverse.HasPropertyTemplates) == 1: - inverse.HasPropertyTemplates = [] - else: + if len(inverse.HasPropertyTemplates) > 1: has_property_templates = list(inverse.HasPropertyTemplates) has_property_templates.remove(prop_template) inverse.HasPropertyTemplates = has_property_templates - ifcopenshell.util.element.remove_deep(file, prop_template) + ifcopenshell.util.element.remove_deep2(file, prop_template) diff --git a/src/ifcopenshell-python/ifcopenshell/api/pset_template/remove_pset_template.py b/src/ifcopenshell-python/ifcopenshell/api/pset_template/remove_pset_template.py index 07d5cf6daf7..5ff3cf6c388 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/pset_template/remove_pset_template.py +++ b/src/ifcopenshell-python/ifcopenshell/api/pset_template/remove_pset_template.py @@ -38,4 +38,4 @@ def remove_pset_template(file: ifcopenshell.file, pset_template: ifcopenshell.en # Let's remove the template. ifcopenshell.api.pset_template.remove_pset_template(model, pset_template=template) """ - ifcopenshell.util.element.remove_deep(file, pset_template) + ifcopenshell.util.element.remove_deep2(file, pset_template) diff --git a/src/ifcopenshell-python/ifcopenshell/api/resource/add_resource_quantity.py b/src/ifcopenshell-python/ifcopenshell/api/resource/add_resource_quantity.py index fc67a8d3c7a..ceb49681b5e 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/resource/add_resource_quantity.py +++ b/src/ifcopenshell-python/ifcopenshell/api/resource/add_resource_quantity.py @@ -79,5 +79,5 @@ def add_resource_quantity( old_quantity = resource.BaseQuantity resource.BaseQuantity = quantity if old_quantity: - ifcopenshell.util.element.remove_deep(file, old_quantity) + ifcopenshell.util.element.remove_deep2(file, old_quantity) return quantity diff --git a/src/ifcopenshell-python/ifcopenshell/api/resource/calculate_resource_usage.py b/src/ifcopenshell-python/ifcopenshell/api/resource/calculate_resource_usage.py index 24815d45e0b..5c707fc5ded 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/resource/calculate_resource_usage.py +++ b/src/ifcopenshell-python/ifcopenshell/api/resource/calculate_resource_usage.py @@ -16,12 +16,10 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . -import math import ifcopenshell.api import ifcopenshell.util.constraint import ifcopenshell.util.date -import ifcopenshell.util.element import ifcopenshell.util.resource diff --git a/src/ifcopenshell-python/ifcopenshell/api/resource/calculate_resource_work.py b/src/ifcopenshell-python/ifcopenshell/api/resource/calculate_resource_work.py index 0ec5f56fe41..fc597cce3a1 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/resource/calculate_resource_work.py +++ b/src/ifcopenshell-python/ifcopenshell/api/resource/calculate_resource_work.py @@ -18,8 +18,6 @@ import ifcopenshell.api.resource import ifcopenshell.util.constraint -import ifcopenshell.util.date -import ifcopenshell.util.element import ifcopenshell.util.resource diff --git a/src/ifcopenshell-python/ifcopenshell/api/resource/remove_resource_quantity.py b/src/ifcopenshell-python/ifcopenshell/api/resource/remove_resource_quantity.py index a6b014e1db8..afb470565da 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/resource/remove_resource_quantity.py +++ b/src/ifcopenshell-python/ifcopenshell/api/resource/remove_resource_quantity.py @@ -47,4 +47,4 @@ def remove_resource_quantity(file: ifcopenshell.file, resource: ifcopenshell.ent old_quantity = resource.BaseQuantity resource.BaseQuantity = None if old_quantity: - ifcopenshell.util.element.remove_deep(file, old_quantity) + ifcopenshell.util.element.remove_deep2(file, old_quantity) diff --git a/src/ifcopenshell-python/ifcopenshell/api/root/copy_class.py b/src/ifcopenshell-python/ifcopenshell/api/root/copy_class.py index 867f25f7274..f8c0efb7bb9 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/root/copy_class.py +++ b/src/ifcopenshell-python/ifcopenshell/api/root/copy_class.py @@ -16,7 +16,6 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . -from typing import Any import ifcopenshell import ifcopenshell.api.geometry @@ -25,7 +24,6 @@ import ifcopenshell.api.system import ifcopenshell.util.element import ifcopenshell.util.placement -import ifcopenshell.util.system def copy_class(file: ifcopenshell.file, product: ifcopenshell.entity_instance) -> ifcopenshell.entity_instance: diff --git a/src/ifcopenshell-python/ifcopenshell/api/root/create_entity.py b/src/ifcopenshell-python/ifcopenshell/api/root/create_entity.py index 6afe5ec3a6e..3179884d807 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/root/create_entity.py +++ b/src/ifcopenshell-python/ifcopenshell/api/root/create_entity.py @@ -16,7 +16,7 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . -from typing import Any, Optional +from typing import Optional import ifcopenshell import ifcopenshell.api.owner diff --git a/src/ifcopenshell-python/ifcopenshell/api/root/reassign_class.py b/src/ifcopenshell-python/ifcopenshell/api/root/reassign_class.py index c7971bc4f7a..e8ed2b71732 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/root/reassign_class.py +++ b/src/ifcopenshell-python/ifcopenshell/api/root/reassign_class.py @@ -24,7 +24,6 @@ import ifcopenshell.api.pset import ifcopenshell.api.spatial import ifcopenshell.api.type -import ifcopenshell.guid import ifcopenshell.util.element import ifcopenshell.util.representation import ifcopenshell.util.schema diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/add_time_period.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/add_time_period.py index 8a72d2044d9..e10bc4ccb6e 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/add_time_period.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/add_time_period.py @@ -16,7 +16,7 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . -from datetime import datetime, time, timedelta +from datetime import time from typing import Optional, Union import ifcopenshell.api diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_process.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_process.py index 302445483b4..e7cca1dafa8 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_process.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_process.py @@ -26,7 +26,7 @@ def assign_process( relating_process: ifcopenshell.entity_instance, related_object: ifcopenshell.entity_instance, ) -> ifcopenshell.entity_instance: - """Assigns an object to be related to a process, typically a construction task + """Assigns an object as an input, control, or resource of a process Processes work using the ICOM (Input, Controls, Outputs, Mechanisms) paradigm in IFC. This process model is commonly used in modeling @@ -63,6 +63,17 @@ def assign_process( For resources, any construction resource may be assigned to a task. + .. warning:: + + This function creates an **Input** relationship + (``IfcRelAssignsToProcess``), meaning the product is *consumed* or + *operated on* by the task — the typical case is demolition or + maintenance. + + If the task *constructs or installs* a product (e.g. erecting a wall + or fitting a window), use :func:`assign_product` instead, which + creates an **Output** relationship (``IfcRelAssignsToProduct``). + :param relating_process: The IfcProcess (typically IfcTask) that the input, control, or resource is related to. :param related_object: The IfcProduct (for input), IfcCostItem (for @@ -77,7 +88,7 @@ def assign_process( # need to be part of a work schedule. schedule = ifcopenshell.api.sequence.add_work_schedule(model, name="Construction Schedule A") - # Let's create a construction task. Note that the predefined type is + # Let's create a demolition task. Note that the predefined type is # important to distinguish types of tasks. task = ifcopenshell.api.sequence.add_task(model, work_schedule=schedule, name="Demolish existing", identification="A", predefined_type="DEMOLITION") @@ -85,8 +96,12 @@ def assign_process( # Let's say we have a wall somewhere. wall = ifcopenshell.api.root.create_entity(model, ifc_class="IfcWall") - # Let's demolish that wall! + # The wall is an INPUT to the demolition task (it will be consumed). ifcopenshell.api.sequence.assign_process(model, relating_process=task, related_object=wall) + + # For a construction task that BUILDS a wall, use assign_product instead: + # build_task = ifcopenshell.api.sequence.add_task(model, ..., predefined_type="CONSTRUCTION") + # ifcopenshell.api.sequence.assign_product(model, relating_product=wall, related_object=build_task) """ if related_object.HasAssignments: for assignment in related_object.HasAssignments: diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/create_baseline.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/create_baseline.py index f70ead281f1..5a53add4485 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/create_baseline.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/create_baseline.py @@ -23,9 +23,7 @@ import ifcopenshell.api.owner import ifcopenshell.api.sequence import ifcopenshell.guid -import ifcopenshell.util.element import ifcopenshell.util.sequence -import ifcopenshell.util.system def create_baseline( diff --git a/src/ifcopenshell-python/ifcopenshell/api/spatial/reference_structure.py b/src/ifcopenshell-python/ifcopenshell/api/spatial/reference_structure.py index 4446971f0da..f19be2360b6 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/spatial/reference_structure.py +++ b/src/ifcopenshell-python/ifcopenshell/api/spatial/reference_structure.py @@ -63,14 +63,15 @@ def reference_structure( storey1 = ifcopenshell.api.root.create_entity(model, ifc_class="IfcBuildingStorey") storey2 = ifcopenshell.api.root.create_entity(model, ifc_class="IfcBuildingStorey") storey3 = ifcopenshell.api.root.create_entity(model, ifc_class="IfcBuildingStorey") + space = ifcopenshell.api.root.create_entity(model, ifc_class="IfcSpace") # The project contains a site (note that project aggregation is a special case in IFC) ifcopenshell.api.aggregate.assign_object(model, products=[site], relating_object=project) # The site has a building, the building has a storey, and the storey has a space ifcopenshell.api.aggregate.assign_object(model, products=[building], relating_object=site) - ifcopenshell.api.aggregate.assign_object(model, products=[storey], relating_object=building) - ifcopenshell.api.aggregate.assign_object(model, products=[space], relating_object=storey) + ifcopenshell.api.aggregate.assign_object(model, products=[storey1,storey2,storey3], relating_object=building) + ifcopenshell.api.aggregate.assign_object(model, products=[space], relating_object=storey1) # Create a column, this column spans 3 storeys column = ifcopenshell.api.root.create_entity(model, ifc_class="IfcWall") @@ -80,7 +81,11 @@ def reference_structure( # And referenced in the others ifcopenshell.api.spatial.reference_structure( - model, products=[column], relating_structure=[storey2, storey3] + model, products=[column], relating_structure=storey2 + ) + + ifcopenshell.api.spatial.reference_structure( + model, products=[column], relating_structure=storey3 ) """ diff --git a/src/ifcopenshell-python/ifcopenshell/api/structural/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/structural/__init__.py index 2baa262432f..8a21e73602b 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/structural/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/structural/__init__.py @@ -30,7 +30,9 @@ from .add_structural_load_case import add_structural_load_case from .add_structural_load_group import add_structural_load_group from .add_structural_member_connection import add_structural_member_connection +from .assign_product import assign_product from .assign_structural_analysis_model import assign_structural_analysis_model +from .assign_to_building import assign_to_building from .edit_structural_analysis_model import edit_structural_analysis_model from .edit_structural_boundary_condition import edit_structural_boundary_condition from .edit_structural_connection_cs import edit_structural_connection_cs @@ -57,7 +59,9 @@ "add_structural_load_case", "add_structural_load_group", "add_structural_member_connection", + "assign_product", "assign_structural_analysis_model", + "assign_to_building", "edit_structural_analysis_model", "edit_structural_boundary_condition", "edit_structural_connection_cs", diff --git a/src/ifcopenshell-python/ifcopenshell/api/structural/assign_product.py b/src/ifcopenshell-python/ifcopenshell/api/structural/assign_product.py new file mode 100644 index 00000000000..a30672facd6 --- /dev/null +++ b/src/ifcopenshell-python/ifcopenshell/api/structural/assign_product.py @@ -0,0 +1,64 @@ +# IfcOpenShell - IFC toolkit and geometry engine +# Copyright (C) 2026 Dion Moult +# +# This file is part of IfcOpenShell. +# +# IfcOpenShell is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# IfcOpenShell is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with IfcOpenShell. If not, see . +# This file was generated with the assistance of an AI coding tool. + +import ifcopenshell +import ifcopenshell.api.root + + +def assign_product( + file: ifcopenshell.file, + relating_product: ifcopenshell.entity_instance, + related_object: ifcopenshell.entity_instance, +) -> ifcopenshell.entity_instance: + """Links an object to a product via IfcRelAssignsToProduct + + Typically used to associate a physical building element with a structural + analysis member (IfcStructuralSurfaceMember, IfcStructuralCurveMember) so + that analysis results can be traced back to the physical model. + + :param relating_product: The IfcProduct that the object is assigned to, + typically an IfcStructuralMember. + :param related_object: The IfcObjectDefinition being assigned, typically + a physical building element such as an IfcWall or IfcSlab. + :return: The IfcRelAssignsToProduct relationship. + + Example: + + .. code:: python + + wall = ifcopenshell.api.root.create_entity(model, ifc_class="IfcWall") + member = ifcopenshell.api.root.create_entity( + model, ifc_class="IfcStructuralSurfaceMember") + ifcopenshell.api.structural.assign_product(model, + relating_product=member, related_object=wall) + """ + for rel in relating_product.ReferencedBy or []: + if not rel.is_a("IfcRelAssignsToProduct"): + continue + if related_object in rel.RelatedObjects: + return rel + related_objects = list(rel.RelatedObjects) + related_objects.append(related_object) + rel.RelatedObjects = related_objects + return rel + + rel = ifcopenshell.api.root.create_entity(file, ifc_class="IfcRelAssignsToProduct") + rel.RelatingProduct = relating_product + rel.RelatedObjects = [related_object] + return rel diff --git a/src/ifcopenshell-python/ifcopenshell/api/structural/assign_structural_analysis_model.py b/src/ifcopenshell-python/ifcopenshell/api/structural/assign_structural_analysis_model.py index e378b3d9842..01254d7985c 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/structural/assign_structural_analysis_model.py +++ b/src/ifcopenshell-python/ifcopenshell/api/structural/assign_structural_analysis_model.py @@ -20,8 +20,6 @@ import ifcopenshell import ifcopenshell.api.group -import ifcopenshell.api.owner -import ifcopenshell.guid def assign_structural_analysis_model( diff --git a/src/ifcopenshell-python/ifcopenshell/api/structural/assign_to_building.py b/src/ifcopenshell-python/ifcopenshell/api/structural/assign_to_building.py new file mode 100644 index 00000000000..7e70f202722 --- /dev/null +++ b/src/ifcopenshell-python/ifcopenshell/api/structural/assign_to_building.py @@ -0,0 +1,64 @@ +# IfcOpenShell - IFC toolkit and geometry engine +# Copyright (C) 2026 Dion Moult +# +# This file is part of IfcOpenShell. +# +# IfcOpenShell is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# IfcOpenShell is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with IfcOpenShell. If not, see . +# This file was generated with the assistance of an AI coding tool. + +import ifcopenshell +import ifcopenshell.api.owner +import ifcopenshell.guid + + +def assign_to_building( + file: ifcopenshell.file, + structural_analysis_model: ifcopenshell.entity_instance, + building: ifcopenshell.entity_instance, +) -> ifcopenshell.entity_instance: + """Associates a structural analysis model with a building via IfcRelServicesBuildings + + The existing :func:`assign_structural_analysis_model` handles + IfcRelAssignsToGroup (linking structural members to the analysis model). + This function handles the separate model-to-building relationship, which + records which building the structural analysis model serves. + + :param structural_analysis_model: The IfcStructuralAnalysisModel to + associate with the building. + :param building: The IfcBuilding (or other IfcSpatialStructureElement) + that the structural analysis model serves. + :return: The IfcRelServicesBuildings relationship. + + Example: + + .. code:: python + + building = ifcopenshell.util.selector.filter_elements(model, "IfcBuilding")[0] + model_ = ifcopenshell.api.structural.add_structural_analysis_model(model) + ifcopenshell.api.structural.assign_to_building(model, + structural_analysis_model=model_, building=building) + """ + for rel in structural_analysis_model.ServicesBuildings or []: + if building in rel.RelatedBuildings: + return rel + rel.RelatedBuildings = list(rel.RelatedBuildings) + [building] + return rel + + return file.create_entity( + "IfcRelServicesBuildings", + ifcopenshell.guid.new(), + OwnerHistory=ifcopenshell.api.owner.create_owner_history(file), + RelatingSystem=structural_analysis_model, + RelatedBuildings=[building], + ) diff --git a/src/ifcopenshell-python/ifcopenshell/api/structural/remove_structural_load_case.py b/src/ifcopenshell-python/ifcopenshell/api/structural/remove_structural_load_case.py index 401db40dbcd..6b381f81a16 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/structural/remove_structural_load_case.py +++ b/src/ifcopenshell-python/ifcopenshell/api/structural/remove_structural_load_case.py @@ -17,7 +17,6 @@ # along with IfcOpenShell. If not, see . import ifcopenshell -import ifcopenshell.api import ifcopenshell.util.element diff --git a/src/ifcopenshell-python/ifcopenshell/api/structural/remove_structural_load_group.py b/src/ifcopenshell-python/ifcopenshell/api/structural/remove_structural_load_group.py index 25acbbe9cce..26da2d157f1 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/structural/remove_structural_load_group.py +++ b/src/ifcopenshell-python/ifcopenshell/api/structural/remove_structural_load_group.py @@ -17,7 +17,6 @@ # along with IfcOpenShell. If not, see . import ifcopenshell -import ifcopenshell.api import ifcopenshell.util.element diff --git a/src/ifcopenshell-python/ifcopenshell/api/structural/unassign_structural_analysis_model.py b/src/ifcopenshell-python/ifcopenshell/api/structural/unassign_structural_analysis_model.py index 2053e7d075f..fcb3a2ead3d 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/structural/unassign_structural_analysis_model.py +++ b/src/ifcopenshell-python/ifcopenshell/api/structural/unassign_structural_analysis_model.py @@ -18,8 +18,6 @@ import ifcopenshell import ifcopenshell.api.group -import ifcopenshell.api.owner -import ifcopenshell.util.element def unassign_structural_analysis_model( diff --git a/src/ifcopenshell-python/ifcopenshell/api/style/add_surface_textures.py b/src/ifcopenshell-python/ifcopenshell/api/style/add_surface_textures.py index a0765bbf8d3..7ef4858041f 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/style/add_surface_textures.py +++ b/src/ifcopenshell-python/ifcopenshell/api/style/add_surface_textures.py @@ -20,10 +20,9 @@ from typing import TYPE_CHECKING, Any, Optional import ifcopenshell -import ifcopenshell.api if TYPE_CHECKING: - import bpy + import bpy # pyright: ignore[reportMissingImports] # ty:ignore[unresolved-import] def add_surface_textures( diff --git a/src/ifcopenshell-python/ifcopenshell/api/system/assign_port.py b/src/ifcopenshell-python/ifcopenshell/api/system/assign_port.py index 20e2ec26b83..5422695fe59 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/system/assign_port.py +++ b/src/ifcopenshell-python/ifcopenshell/api/system/assign_port.py @@ -16,7 +16,6 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . -from typing import Any import ifcopenshell import ifcopenshell.api.geometry diff --git a/src/ifcopenshell-python/ifcopenshell/api/system/disconnect_port.py b/src/ifcopenshell-python/ifcopenshell/api/system/disconnect_port.py index 8ffbfcf3802..7ae790e753e 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/system/disconnect_port.py +++ b/src/ifcopenshell-python/ifcopenshell/api/system/disconnect_port.py @@ -17,7 +17,6 @@ # along with IfcOpenShell. If not, see . import ifcopenshell -import ifcopenshell.api import ifcopenshell.util.element diff --git a/src/ifcopenshell-python/ifcopenshell/api/system/unassign_system.py b/src/ifcopenshell-python/ifcopenshell/api/system/unassign_system.py index 29215240947..725abc6fe32 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/system/unassign_system.py +++ b/src/ifcopenshell-python/ifcopenshell/api/system/unassign_system.py @@ -18,7 +18,6 @@ import ifcopenshell import ifcopenshell.api.group -import ifcopenshell.util.element def unassign_system( diff --git a/src/ifcopenshell-python/ifcopenshell/api/type/map_type_representations.py b/src/ifcopenshell-python/ifcopenshell/api/type/map_type_representations.py index 0c4c66ae160..5e2f7de9895 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/type/map_type_representations.py +++ b/src/ifcopenshell-python/ifcopenshell/api/type/map_type_representations.py @@ -18,7 +18,6 @@ import ifcopenshell import ifcopenshell.api.geometry -import ifcopenshell.util.element def map_type_representations( diff --git a/src/ifcopenshell-python/ifcopenshell/api/unit/add_derived_unit.py b/src/ifcopenshell-python/ifcopenshell/api/unit/add_derived_unit.py index 5cd167e66de..2c308b42d9f 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/unit/add_derived_unit.py +++ b/src/ifcopenshell-python/ifcopenshell/api/unit/add_derived_unit.py @@ -16,7 +16,6 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . -from typing import Any, Optional import ifcopenshell.util.unit diff --git a/src/ifcopenshell-python/ifcopenshell/api/unit/remove_unit.py b/src/ifcopenshell-python/ifcopenshell/api/unit/remove_unit.py index 36ab2f73a29..2611df0b4e7 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/unit/remove_unit.py +++ b/src/ifcopenshell-python/ifcopenshell/api/unit/remove_unit.py @@ -47,4 +47,5 @@ def remove_unit(file: ifcopenshell.file, unit: ifcopenshell.entity_instance) -> unit_assignment.Units = units else: file.remove(unit_assignment) - ifcopenshell.util.element.remove_deep(file, unit) + # TODO handle other possible unit inverses + ifcopenshell.util.element.remove_deep2(file, unit) diff --git a/src/ifcopenshell-python/ifcopenshell/draw.py b/src/ifcopenshell-python/ifcopenshell/draw.py index 15ad2ef11f7..ba78f0d48da 100644 --- a/src/ifcopenshell-python/ifcopenshell/draw.py +++ b/src/ifcopenshell-python/ifcopenshell/draw.py @@ -42,6 +42,8 @@ DO_NOTHING = lambda *args: None +ARRANGE_POLYGON_SETTINGS = W.arrange_polygon_settings() if hasattr(W, "arrange_polygon_settings") else None + @dataclass class draw_settings: @@ -536,7 +538,7 @@ def has_relevant_zone(i): *(tup for i, tup in enumerate(zip(path_objects, section_polies, polies)) if has_relevant_zone(i)) ) - arranged = W.arrange_polygons(polies) + arranged = W.arrange_polygons(*filter(None, (ARRANGE_POLYGON_SETTINGS,)), polies) svg_data_3 = W.polygons_to_svg(arranged, False) dom3 = parseString(svg_data_3) svg3 = dom3.childNodes[0] @@ -670,7 +672,6 @@ def classes(): if __name__ == "__main__": import argparse - import sys import time times = [] diff --git a/src/ifcopenshell-python/ifcopenshell/express/bootstrap.py b/src/ifcopenshell-python/ifcopenshell/express/bootstrap.py index 9ff87d5ad0f..ef3c3c3ef02 100644 --- a/src/ifcopenshell-python/ifcopenshell/express/bootstrap.py +++ b/src/ifcopenshell-python/ifcopenshell/express/bootstrap.py @@ -163,7 +163,18 @@ def find_bytype(expr, ty, li=None): terminals = reduce(lambda x, y: x | y, (find_bytype(e, Terminal) for id, e in express)) keywords = list(filter(operator.attrgetter("is_keyword"), terminals)) negated_keywords = map(lambda s: "~%s" % s, keywords) -no_action = {"letter", "digit", "digits", "real_literal", "integer_literal", "string_literal", "simple_string_literal", "letter", "not_quote", "not_paren_star_quote_special"} +no_action = { + "letter", + "digit", + "digits", + "real_literal", + "integer_literal", + "string_literal", + "simple_string_literal", + "letter", + "not_quote", + "not_paren_star_quote_special", +} while True: emitted_in_loop = set() @@ -194,7 +205,9 @@ def find_bytype(expr, ty, li=None): if id in to_combine: stmt = "Suppress%s" % stmt if id not in no_action and not isinstance(expr.contents, Keyword): - children = list(map(operator.attrgetter('contents'), reduce(lambda x, y: x | y, (find_bytype(e, Keyword) for e in [expr])))) + children = list( + map(operator.attrgetter("contents"), reduce(lambda x, y: x | y, (find_bytype(e, Keyword) for e in [expr]))) + ) has_duplicates = len(children) > len(set(children)) node_type = "ListNode" if ("ZeroOrMore" in stmt or has_duplicates) else "Node" action = ".setParseAction(%s)" % ( @@ -243,5 +256,4 @@ def parse(fn: str) -> mapping.Mapping: mdl = importlib.import_module(output) mdl.Generator(m).emit() sys.stdout.write(m.schema.name) -""" % ("\n ".join(statements)) - ) +""" % ("\n ".join(statements))) diff --git a/src/ifcopenshell-python/ifcopenshell/express/cat.py b/src/ifcopenshell-python/ifcopenshell/express/cat.py index d6e7b2c880d..373afeb1d5a 100644 --- a/src/ifcopenshell-python/ifcopenshell/express/cat.py +++ b/src/ifcopenshell-python/ifcopenshell/express/cat.py @@ -1,15 +1,16 @@ import sys, fileinput -if sys.platform == "win32" and not hasattr(sys.stdout, 'buffer'): +if sys.platform == "win32" and not hasattr(sys.stdout, "buffer"): import os, msvcrt + msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY) files = sys.argv[1:] -if files[0] == '-o': - b = open(files[1], 'wb') +if files[0] == "-o": + b = open(files[1], "wb") files = files[2:] else: - b = getattr(sys.stdout, 'buffer', sys.stdout) + b = getattr(sys.stdout, "buffer", sys.stdout) -for line in fileinput.input(files=files, mode='rb'): +for line in fileinput.input(files=files, mode="rb"): b.write(line) diff --git a/src/ifcopenshell-python/ifcopenshell/express/codegen.py b/src/ifcopenshell-python/ifcopenshell/express/codegen.py index fe997091b13..dfcf5083c89 100644 --- a/src/ifcopenshell-python/ifcopenshell/express/codegen.py +++ b/src/ifcopenshell-python/ifcopenshell/express/codegen.py @@ -26,7 +26,7 @@ def indent(n, s): else: strs = s splitted = itertools.chain.from_iterable(map(functools.partial(str.split, sep="\n"), map(str, strs))) - return "\n".join(" "*n + l for l in splitted) + return "\n".join(" " * n + l for l in splitted) class Base: diff --git a/src/ifcopenshell-python/ifcopenshell/express/header.py b/src/ifcopenshell-python/ifcopenshell/express/header.py index 4cc8c8ea844..60593549259 100644 --- a/src/ifcopenshell-python/ifcopenshell/express/header.py +++ b/src/ifcopenshell-python/ifcopenshell/express/header.py @@ -28,6 +28,7 @@ USE_VIRTUAL_INHERITANCE = True + class Header(codegen.Base): def __init__(self, mapping): declarations = [] diff --git a/src/ifcopenshell-python/ifcopenshell/express/implementation.py b/src/ifcopenshell-python/ifcopenshell/express/implementation.py index 248bbd6e86d..bc4b080ad63 100644 --- a/src/ifcopenshell-python/ifcopenshell/express/implementation.py +++ b/src/ifcopenshell-python/ifcopenshell/express/implementation.py @@ -69,7 +69,7 @@ def __init__(self, mapping): templates.enum_from_string_stmt % dict(context, **locals()) for value in enum.values ), ) - + if USE_VIRTUAL_INHERITANCE: for name, enum in mapping.schema.selects.items(): write( @@ -118,10 +118,7 @@ def find_template(arg): null_check = "" if arg["is_optional"]: - attr_check = ( - "if(get_attribute_value(%d).isNull()) { return %%s; }" - % (arg["index"] - 1,) - ) + attr_check = "if(get_attribute_value(%d).isNull()) { return %%s; }" % (arg["index"] - 1,) if "boost::optional" in arg["full_type"]: null_check = attr_check % "boost::none" else: @@ -157,7 +154,7 @@ def find_template(arg): return templates.set_attr_stmt_enum elif arg["is_templated_list"] and not (select or simple or express): return templates.set_attr_stmt_array - elif arg["full_type"].endswith('*'): + elif arg["full_type"].endswith("*"): return templates.set_attr_instance else: return templates.set_attr_stmt @@ -178,7 +175,9 @@ def find_template(arg): "non_optional_type": arg["non_optional_type"].replace("::Value", ""), "star_if_optional": "*" if "boost::optional" in arg["full_type"] else "", "check_optional_set_begin": "if (v) {" if "boost::optional" in arg["full_type"] else "", - "check_optional_set_else": "} else {" if "boost::optional" in arg["full_type"] else "if constexpr (false)", + "check_optional_set_else": ( + "} else {" if "boost::optional" in arg["full_type"] else "if constexpr (false)" + ), "check_optional_set_end": "}" if "boost::optional" in arg["full_type"] else "", }, ) @@ -193,11 +192,15 @@ def find_template(arg): tmpl = ( templates.constructor_stmt_array if arg["is_templated_list"] - else templates.constructor_stmt_enum - if arg["is_enum"] - else templates.constructor_stmt_instance - if arg["full_type"].endswith('*') - else templates.constructor_stmt + else ( + templates.constructor_stmt_enum + if arg["is_enum"] + else ( + templates.constructor_stmt_instance + if arg["full_type"].endswith("*") + else templates.constructor_stmt + ) + ) ) impl = tmpl % { "name": deref_name, @@ -321,7 +324,7 @@ def get_parent_id(s): else templates.simpletype_impl_is_without_supertype ) - constructor = templates.constructor_single_initlist# if superclass else templates.constructor + constructor = templates.constructor_single_initlist # if superclass else templates.constructor simpletype_impl_cast = ( templates.simpletype_impl_cast_templated @@ -374,8 +377,21 @@ def compose(params, schema_name=schema_name, schema_name_upper=schema_name_upper ("IfcEntityInstanceData&& e",), "", ), - ("", "", constructor, "", ("%s v" % type_str,), ("set_attribute_value(0, v%s);" % ("->generalize()" if mapping.is_templated_list(type) else ""))) if mapping.simple_type_parent(class_name) is None else \ - ("v", "", constructor, "", ("%s v" % type_str,), ""), + ( + ( + "", + "", + constructor, + "", + ("%s v" % type_str,), + ( + "set_attribute_value(0, v%s);" + % ("->generalize()" if mapping.is_templated_list(type) else "") + ), + ) + if mapping.simple_type_parent(class_name) is None + else ("v", "", constructor, "", ("%s v" % type_str,), "") + ), ("", "", templates.cast_function, type_str, (), simpletype_impl_cast), ), ), diff --git a/src/ifcopenshell-python/ifcopenshell/express/mapping.py b/src/ifcopenshell-python/ifcopenshell/express/mapping.py index 7ebac2478b0..609f346c2c1 100644 --- a/src/ifcopenshell-python/ifcopenshell/express/mapping.py +++ b/src/ifcopenshell-python/ifcopenshell/express/mapping.py @@ -25,6 +25,7 @@ from header import USE_VIRTUAL_INHERITANCE + class Mapping: express_to_cpp_typemapping = { diff --git a/src/ifcopenshell-python/ifcopenshell/express/nodes.py b/src/ifcopenshell-python/ifcopenshell/express/nodes.py index 34d3ef747b3..2b8b872c833 100644 --- a/src/ifcopenshell-python/ifcopenshell/express/nodes.py +++ b/src/ifcopenshell-python/ifcopenshell/express/nodes.py @@ -23,6 +23,7 @@ import collections import bootstrap + class Node: def __init__(self, s, loc, tokens, rule=None): self.rule = rule or (type(self).__name__) @@ -58,15 +59,15 @@ def __init__(self, s, loc, tokens, rule=None): rules_as_list = set() for t in self.tokens: - r = getattr(t, 'rule', None) + r = getattr(t, "rule", None) if r: rules_as_list.add(r) self.dict_tokens[r].append(t) - + for r, t in tokens.asDict().items(): if r not in rules_as_list: self.dict_tokens[r].append(t) - + self.flat = sum([getattr(t, "flat", [t]) for t in self.tokens], []) def __repr__(self): @@ -74,7 +75,7 @@ def __repr__(self): def __iter__(self): return iter(self.tokens) - + # Somehow indexing messes up the pyparsing results, so instead of x[0] use list(x)[0] # def __getitem__(self, i): # return self.tokens[i] @@ -110,7 +111,7 @@ def whitespace(t): return "".join(whitespace(term) for term in exp.flat) -class TypeDeclaration(Node): +class TypeDeclaration(Node): name = property(lambda self: self.type_id[0]) utype = property(lambda self: self.underlying_type.any().any()) type = property(lambda self: self.utype[0] if isinstance(self.utype, list) else self.utype) @@ -245,7 +246,8 @@ def __repr__(self): def do_try(fn): try: return fn() - except: pass + except: + pass def get_rule_id(x): @@ -255,8 +257,14 @@ def get_rule_id(x): if matches: return matches[0] + rule_dependencies = { - k: list(map(operator.attrgetter('contents'), bootstrap.reduce(lambda x, y: x | y, (bootstrap.find_bytype(e, bootstrap.Keyword) for e in [v])))) \ + k: list( + map( + operator.attrgetter("contents"), + bootstrap.reduce(lambda x, y: x | y, (bootstrap.find_bytype(e, bootstrap.Keyword) for e in [v])), + ) + ) for k, v in bootstrap.express } @@ -264,16 +272,17 @@ def get_rule_id(x): rule_definitions = {k: v for k, v in bootstrap.express} + def to_tree(x, key=None): - + def prune(di): # translate class names back to grammar rules if nested actions are encountered di = {get_rule_id(k) or k: v for k, v in di.items()} - + def replace_synonyms(x): for y in x: yield y - if False: # y in di: + if False: # y in di: # production element from grammar is found in parsed data, # return that. @@ -292,19 +301,21 @@ def is_synonym(rl): yield S # Do this recursively yield from replace_synonyms([S]) - + # is this a concatenation with zero or more synonyms? then also processs that # @todo catches: # - simple_expression = term { add_like_op term } . # but should probably also work on # - a = b { b } # in which case the second Concat would be eliminated - elif isinstance(rule, bootstrap.Concat) and \ - len(rule.contents) == 2 and \ - is_synonym(rule.contents[0]) and \ - isinstance(rule.contents[1].contents, bootstrap.Repeated) and \ - isinstance(rule.contents[1].contents.contents[0], bootstrap.Concat) and \ - str(rule.contents[1].contents.contents[0].contents[1]) == str(rule.contents[0]): + elif ( + isinstance(rule, bootstrap.Concat) + and len(rule.contents) == 2 + and is_synonym(rule.contents[0]) + and isinstance(rule.contents[1].contents, bootstrap.Repeated) + and isinstance(rule.contents[1].contents.contents[0], bootstrap.Concat) + and str(rule.contents[1].contents.contents[0].contents[1]) == str(rule.contents[0]) + ): S = is_synonym(rule.contents[0]) yield S # Do this recursively @@ -315,13 +326,13 @@ def is_synonym(rl): if key == "aggregation_types": # hack hack hack apparently the parser can't distinguish these subrules += list(replace_synonyms(rule_dependencies["general_aggregation_types"])) - + if rule_dependencies[key] and not subrules: # sometimes an intermediate production rule is missing # from the pyparsing output, e.g from parameter to simple_expression # directly. Recover from this. subrules = sum(map(rule_dependencies.__getitem__, rule_dependencies[key]), []) - + if not isinstance(rule_definitions[key], bootstrap.Union): # Filter out terminals when not a union. E.g no # reason to retain TYPE, END_TYPE, but operators @@ -331,7 +342,7 @@ def is_synonym(rl): vs = list(di.values()) return {k: v for k, v in di.items() if k in subrules or (k == key and len(vs) == 1 and vs[0] not in all_rules)} - + def simplify(di): if isinstance(di, list): if set(map(type, di)) == {str} and set(map(len, di)) == {1}: @@ -343,11 +354,11 @@ def simplify(di): return {k: simplify(v) for k, v in di.items()} else: return di - + if isinstance(x, ListNode): d = to_tree(x.dict_tokens, key=get_rule_id(x) or key) - if key == 'if_stmt': + if key == "if_stmt": # The definition of if statement if (roughy): # 'if' expr 'then' stmt+ 'else' stmt+ # this causes stmt to be joined under the same @@ -355,39 +366,41 @@ def simplify(di): # `else_stmt` that collects the second group # of stmts. - statements = x.dict_tokens['stmt'] - + statements = x.dict_tokens["stmt"] + else_index = None if_nesting = 0 - for i, tk in enumerate(x.flat): - if tk == 'if': if_nesting += 1 - if tk == 'end_if': if_nesting -= 1 - if tk == 'else' and if_nesting == 1: + for i, tk in enumerate(x.flat): + if tk == "if": + if_nesting += 1 + if tk == "end_if": + if_nesting -= 1 + if tk == "else" and if_nesting == 1: else_index = i if else_index: indices = [] for s in statements: for i in range(max(indices, default=0), len(x.flat)): - if x.flat[i:i+len(s.flat)] == s.flat: + if x.flat[i : i + len(s.flat)] == s.flat: indices.append(i) break assert len(indices) == len(statements) before_else = [i < else_index for i in indices] - else_stmt = [st for b, st in zip(before_else, d['stmt']) if not b] - d['stmt'] = [st for b, st in zip(before_else, d['stmt']) if b] + else_stmt = [st for b, st in zip(before_else, d["stmt"]) if not b] + d["stmt"] = [st for b, st in zip(before_else, d["stmt"]) if b] if else_stmt: - d['else_stmt'] = else_stmt - - if key == 'formal_parameter': + d["else_stmt"] = else_stmt + + if key == "formal_parameter": # Not so pretty hack to fix the overwriting of simple_id-like # ast nodes. The full solution would probably to register parse # actions. And directly reassign. - pid = d['parameter_id'][0][0] - d['parameter_id'][0] = x.flat[:x.flat.index(pid)+1:2] + pid = d["parameter_id"][0][0] + d["parameter_id"][0] = x.flat[: x.flat.index(pid) + 1 : 2] if key is None: return {get_rule_id(x): d} @@ -400,7 +413,10 @@ def simplify(di): elif isinstance(x, dict): # d = {k: to_tree(v, key=k) for k, v in x.items()} # not fully understood, but when finding specific node Types and production rules, prioritize the former - d = {get_rule_id(k) or k: to_tree(v, key=k) for k, v in sorted(x.items(), key=lambda p: get_rule_id(p[0]) is not None)} + d = { + get_rule_id(k) or k: to_tree(v, key=k) + for k, v in sorted(x.items(), key=lambda p: get_rule_id(p[0]) is not None) + } return simplify(prune(d)) elif isinstance(x, list): return [to_tree(v, key=key) for v in x] @@ -459,7 +475,8 @@ def get_sub_types(self): else: constraint = self.supertype_rule[0] return [ - list(list(s)[0])[0].simple_id for s in list(list(list(constraint.subtype_constraint[0].supertype_expression[0])[0])[0].one_of[0])[2::2] + list(list(s)[0])[0].simple_id + for s in list(list(list(constraint.subtype_constraint[0].supertype_expression[0])[0])[0].one_of[0])[2::2] ] sub_types = property(get_sub_types) @@ -576,10 +593,11 @@ class ProcedureDeclaration(ListNode): @property def name(self): return self.flat[1] - - + + class FunctionDeclaration(ProcedureDeclaration): pass - + + class RuleDeclaration(ProcedureDeclaration): pass diff --git a/src/ifcopenshell-python/ifcopenshell/express/rule_compiler.py b/src/ifcopenshell-python/ifcopenshell/express/rule_compiler.py index 545d68c50a7..a77936d8537 100644 --- a/src/ifcopenshell-python/ifcopenshell/express/rule_compiler.py +++ b/src/ifcopenshell-python/ifcopenshell/express/rule_compiler.py @@ -48,11 +48,7 @@ def write_to_graph(val, name=None): # bootstrap.py that result in an intermediate list index node in to_tree() # Start with the intermediate nodes and filter out root (needs to have predecessors) - intermediate = [ - n - for n in g.nodes - if g.nodes[n].get("label") is None and list(g.predecessors(n)) - ] + intermediate = [n for n in g.nodes if g.nodes[n].get("label") is None and list(g.predecessors(n))] for n in intermediate: pr = list(g.predecessors(n)) @@ -82,8 +78,7 @@ def write_to_graph(val, name=None): for n in g.nodes: if ( len(list(g.successors(n))) == 0 - and g.nodes[n].get("label") - not in ifcopenshell.express.express_parser.all_rules + and g.nodes[n].get("label") not in ifcopenshell.express.express_parser.all_rules ): g.nodes[n]["is_terminal"] = True @@ -105,8 +100,7 @@ def nodename(n): def format(di): Q = '"' inner = ",".join( - f"{k}={'' if v.startswith('<') else Q}{v}{'' if v.startswith('<') else Q}" - for k, v in di.items() + f"{k}={'' if v.startswith('<') else Q}{v}{'' if v.startswith('<') else Q}" for k, v in di.items() ) if inner: inner = f"[{inner}]" @@ -179,9 +173,7 @@ def inner(): def has_inverse(self, a): for r in self.rules: - if a in map( - lambda n: self.graph.nodes[n].get("label"), self.graph.predecessors(r) - ): + if a in map(lambda n: self.graph.nodes[n].get("label"), self.graph.predecessors(r)): return True return False @@ -190,10 +182,7 @@ def __iter__(self): yield context(self.graph, [r]) def descendants(self): - return [ - b.rules[0][len(self.rules[0]) + 1 :] - for b in self.branches(allow_multiple=True) - ] + return [b.rules[0][len(self.rules[0]) + 1 :] for b in self.branches(allow_multiple=True)] def __repr__(self): try: @@ -206,14 +195,11 @@ def __str__(self): assert len(self.rules) == 1 nodes = itertools.chain( self.rules, - itertools.chain.from_iterable( - dict(nx.bfs_successors(self.graph, self.rules[0])).values() - ), + itertools.chain.from_iterable(dict(nx.bfs_successors(self.graph, self.rules[0])).values()), ) terminals_or_values = list( filter( - lambda n: self.graph.nodes[n].get("is_terminal") - or self.graph.nodes[n].get("value"), + lambda n: self.graph.nodes[n].get("is_terminal") or self.graph.nodes[n].get("value"), nodes, ) ) @@ -375,9 +361,7 @@ def calc_{class_name}_{str(derived_attr.attribute_decl.redeclared_attribute.qual """ if context.entity_body.derive_clause: - statements.extend( - map(format_derived, context.entity_body.derive_clause.branches()) - ) + statements.extend(map(format_derived, context.entity_body.derive_clause.branches())) return "\n\n".join(statements) @@ -420,10 +404,12 @@ def concat(a, b, **kwargs): exclude=[context.rel_op_extended], ) else: - if len(context.simple_expression.branches()) == 2 and str(context.rel_op_extended) == 'in': + if len(context.simple_expression.branches()) == 2 and str(context.rel_op_extended) == "in": # IfcBlobTexture try: - is_literal_str_list = set(map(type, ast.literal_eval(str(context.simple_expression.branches()[1])))) == {str} + is_literal_str_list = set( + map(type, ast.literal_eval(str(context.simple_expression.branches()[1]))) + ) == {str} except: is_literal_str_list = False if is_literal_str_list: @@ -567,9 +553,7 @@ def process_function_decl(context): str.lower, map( str, - context.function_head.formal_parameter.parameter_id.branches( - allow_multiple=True - ), + context.function_head.formal_parameter.parameter_id.branches(allow_multiple=True), ), ) return f"def {context.function_head.function_id}({', '.join(arguments)}):\n{indent(4, context.algorithm_head.local_decl)}\n{indent(4, context.stmt.branches())}" @@ -582,9 +566,7 @@ def process_query(context): def process_local_variable(context): if context.expression: expr = str(context.expression) - if ( - context.parameter_type.generalized_types.general_aggregation_types.general_set_type - ): + if context.parameter_type.generalized_types.general_aggregation_types.general_set_type: expr = re.sub(r"(\[[^\]]*\])", "express_set(\\1)", expr) return "%s = %s" % (str(context.variable_id).lower(), expr) @@ -623,9 +605,7 @@ def process_assignment(context): if m := re.match(r"^([^\[]+)\[([^\[]+)\]$", lhs): # @todo ugly regex hack aggr, index = m.groups() - return ( - f"temp = list({aggr})\ntemp[{index}] = {context.expression}\n{aggr} = temp" - ) + return f"temp = list({aggr})\ntemp[{index}] = {context.expression}\n{aggr} = temp" else: return "%s = %s" % (lhs, context.expression) @@ -643,11 +623,7 @@ def process_case_action(context): def process_case_statement(context): branches = context.branches( - exclude=[ - getattr(context, v) - for v in context.descendants() - if not v.startswith("case_action") - ] + exclude=[getattr(context, v) for v in context.descendants() if not v.startswith("case_action")] ) if context.stmt and context.stmt.branches(): branches += [f"else:\n{indent(4, context.stmt)}"] @@ -658,9 +634,7 @@ def process_aggregate_initializer(context): if context.element.repetition: return "([%s] * %s)" % (context.element.expression, context.element.repetition) else: - return "[%s]" % ",".join( - map(str, context.element.branches() if context.element else ()) - ) + return "[%s]" % ",".join(map(str, context.element.branches() if context.element else ())) def process_index(context): @@ -676,9 +650,7 @@ def process_index(context): codegen_rule("function_call", process_function_call) codegen_rule( "actual_parameter_list", - lambda context: ",".join( - map(str, context.expression.branches() if context.expression else []) - ), + lambda context: ",".join(map(str, context.expression.branches() if context.expression else [])), ) codegen_rule("entity_decl", functools.partial(process_type_decl, "entity")) codegen_rule("rule_decl", process_rule_decl) @@ -696,9 +668,7 @@ def process_index(context): codegen_rule("primary", simple_concat) codegen_rule("qualifier", simple_concat) codegen_rule("return_stmt", lambda context: "return %s" % context) -codegen_rule( - "compound_stmt", lambda context: "\n".join(map(str, context.stmt.branches())) -) +codegen_rule("compound_stmt", lambda context: "\n".join(map(str, context.stmt.branches()))) codegen_rule("if_stmt", process_if_stmt) codegen_rule("repeat_stmt", process_repeat_stmt) # codegen_rule("index", lambda context: '**express_index(%s)' % context) @@ -707,19 +677,14 @@ def process_index(context): codegen_rule("group_qualifier", lambda context: empty()) codegen_rule("attribute_qualifier", lambda context: ".%s" % context) codegen_rule("rel_op", process_rel_op) -codegen_rule( - "built_in_constant", lambda context: "None" if str(context) == "?" else str(context) -) +codegen_rule("built_in_constant", lambda context: "None" if str(context) == "?" else str(context)) codegen_rule("assignment_stmt", process_assignment) codegen_rule("local_variable", process_local_variable) codegen_rule("local_decl", lambda context: "\n".join(map(str, context.branches()))) codegen_rule("general_ref/parameter_ref", make_lowercase) codegen_rule( "qualifiable_factor/attribute_ref", - make_lowercase_if( - lambda context: str(context) - not in set(map(str, schema.all_declarations.keys())) - ), + make_lowercase_if(lambda context: str(context) not in set(map(str, schema.all_declarations.keys()))), ) codegen_rule("case_action", process_case_action) codegen_rule("case_stmt", process_case_statement) @@ -750,6 +715,14 @@ def visit_Attribute(self, node): if node.attr == "create_entity": return node + if node.attr.startswith("__"): + return node + + # Don't rewrite at module scope (top-level, no indent) + enclosing_stmt = next((p for p in parents if isinstance(p, ast.stmt)), None) + if enclosing_stmt is not None and isinstance(getattr(enclosing_stmt, "parent", None), ast.Module): + return node + new_value = self.visit(node.value) # Replace the Attribute node with a call to the built-in `getattr` function @@ -816,17 +789,17 @@ def assign_parent_refs(self, tree): import subprocess schema = ifcopenshell.express.express_parser.parse(sys.argv[1]).schema - + try: ifcopenshell.ifcopenshell_wrapper.schema_by_name(schema.name) except: # @nb note the difference here between: - # + # # - ifcopenshell.express.express_parser.parse # - ifcopenshell.express.parse.parse - # + # # First generates a pyparsing AST - # + # # Second populates a latebound schema # that can be registered in C++. builder = ifcopenshell.express.parse(sys.argv[1]) @@ -842,18 +815,21 @@ def assign_parent_refs(self, tree): print( """ +def is_indeterminate(v): + return v is None or type(v).__name__ == 'indeterminate_type' + def exists(v): if callable(v): try: return v() is not None except IndexError as e: return False - else: return v is not None + else: return not is_indeterminate(v) """, "\n", file=output, sep="\n", ) print( - "def nvl(v, default): return v if v is not None else default", + "def nvl(v, default): return v if not is_indeterminate(v) else default", "\n", file=output, sep="\n", @@ -871,14 +847,14 @@ def is_entity(inst): def express_len(v): if isinstance(v, ifcopenshell.entity_instance) and not is_entity(v): v = v[0] - elif v is None or v is INDETERMINATE: + elif is_indeterminate(v): return INDETERMINATE return len(v) old_range = range def range(*args): - if INDETERMINATE in args: + if any(map(is_indeterminate, args)): return yield from old_range(*args) @@ -1045,13 +1021,13 @@ def __iter__(self): if isinstance(v, str): nl = "\n" es = "\\n" - n[ - "label" - ] = f'<
    {n.get("label")}
    {v.replace("<", "<").replace(">", ">").replace(nl, "
    ")}
    >' + n["label"] = ( + f'<
    {n.get("label")}
    {v.replace("<", "<").replace(">", ">").replace(nl, "
    ")}
    >' + ) elif isinstance(v, empty): - n[ - "label" - ] = f'<
    {n.get("label")}
    ---
    >' + n["label"] = ( + f'<
    {n.get("label")}
    ---
    >' + ) fn = f"{nm}.dot" write_dot(fn, G) diff --git a/src/ifcopenshell-python/ifcopenshell/express/rule_executor.py b/src/ifcopenshell-python/ifcopenshell/express/rule_executor.py index 9201e480bef..68240aeddd7 100644 --- a/src/ifcopenshell-python/ifcopenshell/express/rule_executor.py +++ b/src/ifcopenshell-python/ifcopenshell/express/rule_executor.py @@ -9,24 +9,28 @@ def reverse_compile(s): - return re.sub(r'\bself\b', 'SELF', re.sub( - r"\s*\-\s*EXPRESS_ONE_BASED_INDEXING", - "", + return re.sub( + r"\bself\b", + "SELF", re.sub( - ", )?+.(, INDETERMINATE)\\"[::-1], - "]\\1[", + r"\s*\-\s*EXPRESS_ONE_BASED_INDEXING", + "", re.sub( - r", '(\w+)', INDETERMINATE\)", - ".\\1", - s.strip() - .replace("len(", "SIZEOF(") - .replace("assert ", "") - .replace(" is not False", "") - .replace("express_getattr(", "") - .replace("express_getitem(", ""), + ", )?+.(, INDETERMINATE)\\"[::-1], + "]\\1[", + re.sub( + r", '(\w+)', INDETERMINATE\)", + ".\\1", + s.strip() + .replace("len(", "SIZEOF(") + .replace("assert ", "") + .replace(" is not False", "") + .replace("express_getattr(", "") + .replace("express_getitem(", ""), + )[::-1], )[::-1], - )[::-1], - )) + ), + ) @dataclass @@ -68,9 +72,13 @@ def run(f: ifcopenshell.file, logger: Logger) -> None: if hasattr(logger, "set_instance"): # when using the json logger, we notify it of the relevant instance - pre_annotate_instance = lambda instance: logger.set_state('instance', instance) if hasattr(logger, 'set_state') else None + pre_annotate_instance = lambda instance: ( + logger.set_state("instance", instance) if hasattr(logger, "set_state") else None + ) post_annotate_instance = lambda instance: instance - pre_annotate_attribute = lambda attribute: logger.set_state('attribute', attribute) if hasattr(logger, 'set_state') else None + pre_annotate_attribute = lambda attribute: ( + logger.set_state("attribute", attribute) if hasattr(logger, "set_state") else None + ) post_annotate_attribute = lambda attribute: None else: # when using the normal text logger the instance is appended to the method @@ -90,13 +98,13 @@ def run(f: ifcopenshell.file, logger: Logger) -> None: import time import subprocess - current_dir_files = {fn.lower(): fn for fn in os.listdir('.')} - schema_name = str(f.schema_identifier).split(' ')[-1].lower() - schema_path = current_dir_files.get(schema_name + '.exp') - fn = schema_path[:-4] + '.py' + current_dir_files = {fn.lower(): fn for fn in os.listdir(".")} + schema_name = str(f.schema_identifier).split(" ")[-1].lower() + schema_path = current_dir_files.get(schema_name + ".exp") + fn = schema_path[:-4] + ".py" if not os.path.exists(fn): subprocess.run([sys.executable, "-m", "ifcopenshell.express.rule_compiler", schema_path, fn], check=True) - time.sleep(1.) + time.sleep(1.0) source = open(fn, "r").read() a = ast.parse(source) @@ -108,12 +116,14 @@ def run(f: ifcopenshell.file, logger: Logger) -> None: rules = list(filter(lambda x: hasattr(x, "SCOPE"), scope.values())) - if hasattr(logger, 'set_state'): - logger.set_state('type', 'global_rule') + if hasattr(logger, "set_state"): + logger.set_state("type", "global_rule") for R in [r for r in rules if r.SCOPE == "file"]: try: R()(f) + except RecursionError as e: + logger.info(str(e)) except Exception as e: ln = e.__traceback__.tb_next.tb_lineno pre_annotate_attribute(R.__name__) @@ -127,17 +137,15 @@ def run(f: ifcopenshell.file, logger: Logger) -> None: ) ) - if hasattr(logger, 'set_state'): - logger.set_state('type', 'simpletype_rule') + if hasattr(logger, "set_state"): + logger.set_state("type", "simpletype_rule") types = {} subtypes = collections.defaultdict(list) for d in S.declarations(): if isinstance(d, ifcopenshell.ifcopenshell_wrapper.type_declaration): types[d.name()] = d - if isinstance( - d.declared_type(), ifcopenshell.ifcopenshell_wrapper.named_type - ): + if isinstance(d.declared_type(), ifcopenshell.ifcopenshell_wrapper.named_type): subtypes[d.declared_type().declared_type().name()].append(d.name()) D = collections.defaultdict(list) @@ -170,6 +178,8 @@ def check(value, type, instance): for R in D[type_name(type)]: try: R()(fix_type(value)) + except RecursionError as e: + logger.info(str(e)) except Exception as e: ln = e.__traceback__.tb_next.tb_lineno pre_annotate_instance(instance) @@ -220,6 +230,8 @@ def check(value, type, instance): for inst in f: try: values = list(inst) + except RecursionError as e: + logger.info(str(e)) except Exception as e: if hasattr(logger, "set_state"): logger.error(str(e)) @@ -228,22 +240,22 @@ def check(value, type, instance): continue entity = S.declaration_by_name(inst.is_a()) attrs = entity.all_attributes() - for i, (attr, val, is_derived) in enumerate( - zip(attrs, values, entity.derived()) - ): + for i, (attr, val, is_derived) in enumerate(zip(attrs, values, entity.derived())): if is_derived: # @todo pass else: check(val, attr.type_of_attribute(), instance=inst) - if hasattr(logger, 'set_state'): - logger.set_state('type', 'entity_rule') + if hasattr(logger, "set_state"): + logger.set_state("type", "entity_rule") for R in [r for r in rules if r.SCOPE == "entity"]: for inst in f.by_type(R.TYPE_NAME): try: R()(inst) + except RecursionError as e: + logger.info(str(e)) except Exception as e: ln = e.__traceback__.tb_next.tb_lineno pre_annotate_instance(inst) diff --git a/src/ifcopenshell-python/ifcopenshell/express/rules/IFC2X3.py b/src/ifcopenshell-python/ifcopenshell/express/rules/IFC2X3.py index e5ddfdad00d..33f8b79c6fb 100644 --- a/src/ifcopenshell-python/ifcopenshell/express/rules/IFC2X3.py +++ b/src/ifcopenshell-python/ifcopenshell/express/rules/IFC2X3.py @@ -1,5 +1,8 @@ import ifcopenshell +def is_indeterminate(v): + return v is None or type(v).__name__ == 'indeterminate_type' + def exists(v): if callable(v): try: @@ -7,10 +10,10 @@ def exists(v): except IndexError as e: return False else: - return v is not None + return not is_indeterminate(v) def nvl(v, default): - return v if v is not None else default + return v if not is_indeterminate(v) else default def is_entity(inst): if isinstance(inst, ifcopenshell.entity_instance): @@ -22,13 +25,13 @@ def is_entity(inst): def express_len(v): if isinstance(v, ifcopenshell.entity_instance) and (not is_entity(v)): v = v[0] - elif v is None or v is INDETERMINATE: + elif is_indeterminate(v): return INDETERMINATE return len(v) old_range = range def range(*args): - if INDETERMINATE in args: + if any(map(is_indeterminate, args)): return yield from old_range(*args) sizeof = express_len @@ -149,1479 +152,1479 @@ class enum_namespace: def __getattr__(self, k): return express_getattr(k, 'upper', INDETERMINATE)() IfcActionSourceTypeEnum = enum_namespace() -dead_load_g = express_getattr(IfcActionSourceTypeEnum, 'DEAD_LOAD_G', INDETERMINATE) -completion_g1 = express_getattr(IfcActionSourceTypeEnum, 'COMPLETION_G1', INDETERMINATE) -live_load_q = express_getattr(IfcActionSourceTypeEnum, 'LIVE_LOAD_Q', INDETERMINATE) -snow_s = express_getattr(IfcActionSourceTypeEnum, 'SNOW_S', INDETERMINATE) -wind_w = express_getattr(IfcActionSourceTypeEnum, 'WIND_W', INDETERMINATE) -prestressing_p = express_getattr(IfcActionSourceTypeEnum, 'PRESTRESSING_P', INDETERMINATE) -settlement_u = express_getattr(IfcActionSourceTypeEnum, 'SETTLEMENT_U', INDETERMINATE) -temperature_t = express_getattr(IfcActionSourceTypeEnum, 'TEMPERATURE_T', INDETERMINATE) -earthquake_e = express_getattr(IfcActionSourceTypeEnum, 'EARTHQUAKE_E', INDETERMINATE) -fire = express_getattr(IfcActionSourceTypeEnum, 'FIRE', INDETERMINATE) -impulse = express_getattr(IfcActionSourceTypeEnum, 'IMPULSE', INDETERMINATE) -impact = express_getattr(IfcActionSourceTypeEnum, 'IMPACT', INDETERMINATE) -transport = express_getattr(IfcActionSourceTypeEnum, 'TRANSPORT', INDETERMINATE) -erection = express_getattr(IfcActionSourceTypeEnum, 'ERECTION', INDETERMINATE) -propping = express_getattr(IfcActionSourceTypeEnum, 'PROPPING', INDETERMINATE) -system_imperfection = express_getattr(IfcActionSourceTypeEnum, 'SYSTEM_IMPERFECTION', INDETERMINATE) -shrinkage = express_getattr(IfcActionSourceTypeEnum, 'SHRINKAGE', INDETERMINATE) -creep = express_getattr(IfcActionSourceTypeEnum, 'CREEP', INDETERMINATE) -lack_of_fit = express_getattr(IfcActionSourceTypeEnum, 'LACK_OF_FIT', INDETERMINATE) -buoyancy = express_getattr(IfcActionSourceTypeEnum, 'BUOYANCY', INDETERMINATE) -ice = express_getattr(IfcActionSourceTypeEnum, 'ICE', INDETERMINATE) -current = express_getattr(IfcActionSourceTypeEnum, 'CURRENT', INDETERMINATE) -wave = express_getattr(IfcActionSourceTypeEnum, 'WAVE', INDETERMINATE) -rain = express_getattr(IfcActionSourceTypeEnum, 'RAIN', INDETERMINATE) -brakes = express_getattr(IfcActionSourceTypeEnum, 'BRAKES', INDETERMINATE) -userdefined = express_getattr(IfcActionSourceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcActionSourceTypeEnum, 'NOTDEFINED', INDETERMINATE) +dead_load_g = IfcActionSourceTypeEnum.DEAD_LOAD_G +completion_g1 = IfcActionSourceTypeEnum.COMPLETION_G1 +live_load_q = IfcActionSourceTypeEnum.LIVE_LOAD_Q +snow_s = IfcActionSourceTypeEnum.SNOW_S +wind_w = IfcActionSourceTypeEnum.WIND_W +prestressing_p = IfcActionSourceTypeEnum.PRESTRESSING_P +settlement_u = IfcActionSourceTypeEnum.SETTLEMENT_U +temperature_t = IfcActionSourceTypeEnum.TEMPERATURE_T +earthquake_e = IfcActionSourceTypeEnum.EARTHQUAKE_E +fire = IfcActionSourceTypeEnum.FIRE +impulse = IfcActionSourceTypeEnum.IMPULSE +impact = IfcActionSourceTypeEnum.IMPACT +transport = IfcActionSourceTypeEnum.TRANSPORT +erection = IfcActionSourceTypeEnum.ERECTION +propping = IfcActionSourceTypeEnum.PROPPING +system_imperfection = IfcActionSourceTypeEnum.SYSTEM_IMPERFECTION +shrinkage = IfcActionSourceTypeEnum.SHRINKAGE +creep = IfcActionSourceTypeEnum.CREEP +lack_of_fit = IfcActionSourceTypeEnum.LACK_OF_FIT +buoyancy = IfcActionSourceTypeEnum.BUOYANCY +ice = IfcActionSourceTypeEnum.ICE +current = IfcActionSourceTypeEnum.CURRENT +wave = IfcActionSourceTypeEnum.WAVE +rain = IfcActionSourceTypeEnum.RAIN +brakes = IfcActionSourceTypeEnum.BRAKES +userdefined = IfcActionSourceTypeEnum.USERDEFINED +notdefined = IfcActionSourceTypeEnum.NOTDEFINED IfcActionTypeEnum = enum_namespace() -permanent_g = express_getattr(IfcActionTypeEnum, 'PERMANENT_G', INDETERMINATE) -variable_q = express_getattr(IfcActionTypeEnum, 'VARIABLE_Q', INDETERMINATE) -extraordinary_a = express_getattr(IfcActionTypeEnum, 'EXTRAORDINARY_A', INDETERMINATE) -userdefined = express_getattr(IfcActionTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcActionTypeEnum, 'NOTDEFINED', INDETERMINATE) +permanent_g = IfcActionTypeEnum.PERMANENT_G +variable_q = IfcActionTypeEnum.VARIABLE_Q +extraordinary_a = IfcActionTypeEnum.EXTRAORDINARY_A +userdefined = IfcActionTypeEnum.USERDEFINED +notdefined = IfcActionTypeEnum.NOTDEFINED IfcActuatorTypeEnum = enum_namespace() -electricactuator = express_getattr(IfcActuatorTypeEnum, 'ELECTRICACTUATOR', INDETERMINATE) -handoperatedactuator = express_getattr(IfcActuatorTypeEnum, 'HANDOPERATEDACTUATOR', INDETERMINATE) -hydraulicactuator = express_getattr(IfcActuatorTypeEnum, 'HYDRAULICACTUATOR', INDETERMINATE) -pneumaticactuator = express_getattr(IfcActuatorTypeEnum, 'PNEUMATICACTUATOR', INDETERMINATE) -thermostaticactuator = express_getattr(IfcActuatorTypeEnum, 'THERMOSTATICACTUATOR', INDETERMINATE) -userdefined = express_getattr(IfcActuatorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcActuatorTypeEnum, 'NOTDEFINED', INDETERMINATE) +electricactuator = IfcActuatorTypeEnum.ELECTRICACTUATOR +handoperatedactuator = IfcActuatorTypeEnum.HANDOPERATEDACTUATOR +hydraulicactuator = IfcActuatorTypeEnum.HYDRAULICACTUATOR +pneumaticactuator = IfcActuatorTypeEnum.PNEUMATICACTUATOR +thermostaticactuator = IfcActuatorTypeEnum.THERMOSTATICACTUATOR +userdefined = IfcActuatorTypeEnum.USERDEFINED +notdefined = IfcActuatorTypeEnum.NOTDEFINED IfcAddressTypeEnum = enum_namespace() -office = express_getattr(IfcAddressTypeEnum, 'OFFICE', INDETERMINATE) -site = express_getattr(IfcAddressTypeEnum, 'SITE', INDETERMINATE) -home = express_getattr(IfcAddressTypeEnum, 'HOME', INDETERMINATE) -distributionpoint = express_getattr(IfcAddressTypeEnum, 'DISTRIBUTIONPOINT', INDETERMINATE) -userdefined = express_getattr(IfcAddressTypeEnum, 'USERDEFINED', INDETERMINATE) +office = IfcAddressTypeEnum.OFFICE +site = IfcAddressTypeEnum.SITE +home = IfcAddressTypeEnum.HOME +distributionpoint = IfcAddressTypeEnum.DISTRIBUTIONPOINT +userdefined = IfcAddressTypeEnum.USERDEFINED IfcAheadOrBehind = enum_namespace() -ahead = express_getattr(IfcAheadOrBehind, 'AHEAD', INDETERMINATE) -behind = express_getattr(IfcAheadOrBehind, 'BEHIND', INDETERMINATE) +ahead = IfcAheadOrBehind.AHEAD +behind = IfcAheadOrBehind.BEHIND IfcAirTerminalBoxTypeEnum = enum_namespace() -constantflow = express_getattr(IfcAirTerminalBoxTypeEnum, 'CONSTANTFLOW', INDETERMINATE) -variableflowpressuredependant = express_getattr(IfcAirTerminalBoxTypeEnum, 'VARIABLEFLOWPRESSUREDEPENDANT', INDETERMINATE) -variableflowpressureindependant = express_getattr(IfcAirTerminalBoxTypeEnum, 'VARIABLEFLOWPRESSUREINDEPENDANT', INDETERMINATE) -userdefined = express_getattr(IfcAirTerminalBoxTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAirTerminalBoxTypeEnum, 'NOTDEFINED', INDETERMINATE) +constantflow = IfcAirTerminalBoxTypeEnum.CONSTANTFLOW +variableflowpressuredependant = IfcAirTerminalBoxTypeEnum.VARIABLEFLOWPRESSUREDEPENDANT +variableflowpressureindependant = IfcAirTerminalBoxTypeEnum.VARIABLEFLOWPRESSUREINDEPENDANT +userdefined = IfcAirTerminalBoxTypeEnum.USERDEFINED +notdefined = IfcAirTerminalBoxTypeEnum.NOTDEFINED IfcAirTerminalTypeEnum = enum_namespace() -grille = express_getattr(IfcAirTerminalTypeEnum, 'GRILLE', INDETERMINATE) -register = express_getattr(IfcAirTerminalTypeEnum, 'REGISTER', INDETERMINATE) -diffuser = express_getattr(IfcAirTerminalTypeEnum, 'DIFFUSER', INDETERMINATE) -eyeball = express_getattr(IfcAirTerminalTypeEnum, 'EYEBALL', INDETERMINATE) -iris = express_getattr(IfcAirTerminalTypeEnum, 'IRIS', INDETERMINATE) -lineargrille = express_getattr(IfcAirTerminalTypeEnum, 'LINEARGRILLE', INDETERMINATE) -lineardiffuser = express_getattr(IfcAirTerminalTypeEnum, 'LINEARDIFFUSER', INDETERMINATE) -userdefined = express_getattr(IfcAirTerminalTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAirTerminalTypeEnum, 'NOTDEFINED', INDETERMINATE) +grille = IfcAirTerminalTypeEnum.GRILLE +register = IfcAirTerminalTypeEnum.REGISTER +diffuser = IfcAirTerminalTypeEnum.DIFFUSER +eyeball = IfcAirTerminalTypeEnum.EYEBALL +iris = IfcAirTerminalTypeEnum.IRIS +lineargrille = IfcAirTerminalTypeEnum.LINEARGRILLE +lineardiffuser = IfcAirTerminalTypeEnum.LINEARDIFFUSER +userdefined = IfcAirTerminalTypeEnum.USERDEFINED +notdefined = IfcAirTerminalTypeEnum.NOTDEFINED IfcAirToAirHeatRecoveryTypeEnum = enum_namespace() -fixedplatecounterflowexchanger = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'FIXEDPLATECOUNTERFLOWEXCHANGER', INDETERMINATE) -fixedplatecrossflowexchanger = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'FIXEDPLATECROSSFLOWEXCHANGER', INDETERMINATE) -fixedplateparallelflowexchanger = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'FIXEDPLATEPARALLELFLOWEXCHANGER', INDETERMINATE) -rotarywheel = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'ROTARYWHEEL', INDETERMINATE) -runaroundcoilloop = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'RUNAROUNDCOILLOOP', INDETERMINATE) -heatpipe = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'HEATPIPE', INDETERMINATE) -twintowerenthalpyrecoveryloops = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'TWINTOWERENTHALPYRECOVERYLOOPS', INDETERMINATE) -thermosiphonsealedtubeheatexchangers = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'THERMOSIPHONSEALEDTUBEHEATEXCHANGERS', INDETERMINATE) -thermosiphoncoiltypeheatexchangers = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'THERMOSIPHONCOILTYPEHEATEXCHANGERS', INDETERMINATE) -userdefined = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'NOTDEFINED', INDETERMINATE) +fixedplatecounterflowexchanger = IfcAirToAirHeatRecoveryTypeEnum.FIXEDPLATECOUNTERFLOWEXCHANGER +fixedplatecrossflowexchanger = IfcAirToAirHeatRecoveryTypeEnum.FIXEDPLATECROSSFLOWEXCHANGER +fixedplateparallelflowexchanger = IfcAirToAirHeatRecoveryTypeEnum.FIXEDPLATEPARALLELFLOWEXCHANGER +rotarywheel = IfcAirToAirHeatRecoveryTypeEnum.ROTARYWHEEL +runaroundcoilloop = IfcAirToAirHeatRecoveryTypeEnum.RUNAROUNDCOILLOOP +heatpipe = IfcAirToAirHeatRecoveryTypeEnum.HEATPIPE +twintowerenthalpyrecoveryloops = IfcAirToAirHeatRecoveryTypeEnum.TWINTOWERENTHALPYRECOVERYLOOPS +thermosiphonsealedtubeheatexchangers = IfcAirToAirHeatRecoveryTypeEnum.THERMOSIPHONSEALEDTUBEHEATEXCHANGERS +thermosiphoncoiltypeheatexchangers = IfcAirToAirHeatRecoveryTypeEnum.THERMOSIPHONCOILTYPEHEATEXCHANGERS +userdefined = IfcAirToAirHeatRecoveryTypeEnum.USERDEFINED +notdefined = IfcAirToAirHeatRecoveryTypeEnum.NOTDEFINED IfcAlarmTypeEnum = enum_namespace() -bell = express_getattr(IfcAlarmTypeEnum, 'BELL', INDETERMINATE) -breakglassbutton = express_getattr(IfcAlarmTypeEnum, 'BREAKGLASSBUTTON', INDETERMINATE) -light = express_getattr(IfcAlarmTypeEnum, 'LIGHT', INDETERMINATE) -manualpullbox = express_getattr(IfcAlarmTypeEnum, 'MANUALPULLBOX', INDETERMINATE) -siren = express_getattr(IfcAlarmTypeEnum, 'SIREN', INDETERMINATE) -whistle = express_getattr(IfcAlarmTypeEnum, 'WHISTLE', INDETERMINATE) -userdefined = express_getattr(IfcAlarmTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAlarmTypeEnum, 'NOTDEFINED', INDETERMINATE) +bell = IfcAlarmTypeEnum.BELL +breakglassbutton = IfcAlarmTypeEnum.BREAKGLASSBUTTON +light = IfcAlarmTypeEnum.LIGHT +manualpullbox = IfcAlarmTypeEnum.MANUALPULLBOX +siren = IfcAlarmTypeEnum.SIREN +whistle = IfcAlarmTypeEnum.WHISTLE +userdefined = IfcAlarmTypeEnum.USERDEFINED +notdefined = IfcAlarmTypeEnum.NOTDEFINED IfcAnalysisModelTypeEnum = enum_namespace() -in_plane_loading_2d = express_getattr(IfcAnalysisModelTypeEnum, 'IN_PLANE_LOADING_2D', INDETERMINATE) -out_plane_loading_2d = express_getattr(IfcAnalysisModelTypeEnum, 'OUT_PLANE_LOADING_2D', INDETERMINATE) -loading_3d = express_getattr(IfcAnalysisModelTypeEnum, 'LOADING_3D', INDETERMINATE) -userdefined = express_getattr(IfcAnalysisModelTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAnalysisModelTypeEnum, 'NOTDEFINED', INDETERMINATE) +in_plane_loading_2d = IfcAnalysisModelTypeEnum.IN_PLANE_LOADING_2D +out_plane_loading_2d = IfcAnalysisModelTypeEnum.OUT_PLANE_LOADING_2D +loading_3d = IfcAnalysisModelTypeEnum.LOADING_3D +userdefined = IfcAnalysisModelTypeEnum.USERDEFINED +notdefined = IfcAnalysisModelTypeEnum.NOTDEFINED IfcAnalysisTheoryTypeEnum = enum_namespace() -first_order_theory = express_getattr(IfcAnalysisTheoryTypeEnum, 'FIRST_ORDER_THEORY', INDETERMINATE) -second_order_theory = express_getattr(IfcAnalysisTheoryTypeEnum, 'SECOND_ORDER_THEORY', INDETERMINATE) -third_order_theory = express_getattr(IfcAnalysisTheoryTypeEnum, 'THIRD_ORDER_THEORY', INDETERMINATE) -full_nonlinear_theory = express_getattr(IfcAnalysisTheoryTypeEnum, 'FULL_NONLINEAR_THEORY', INDETERMINATE) -userdefined = express_getattr(IfcAnalysisTheoryTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAnalysisTheoryTypeEnum, 'NOTDEFINED', INDETERMINATE) +first_order_theory = IfcAnalysisTheoryTypeEnum.FIRST_ORDER_THEORY +second_order_theory = IfcAnalysisTheoryTypeEnum.SECOND_ORDER_THEORY +third_order_theory = IfcAnalysisTheoryTypeEnum.THIRD_ORDER_THEORY +full_nonlinear_theory = IfcAnalysisTheoryTypeEnum.FULL_NONLINEAR_THEORY +userdefined = IfcAnalysisTheoryTypeEnum.USERDEFINED +notdefined = IfcAnalysisTheoryTypeEnum.NOTDEFINED IfcArithmeticOperatorEnum = enum_namespace() -add = express_getattr(IfcArithmeticOperatorEnum, 'ADD', INDETERMINATE) -divide = express_getattr(IfcArithmeticOperatorEnum, 'DIVIDE', INDETERMINATE) -multiply = express_getattr(IfcArithmeticOperatorEnum, 'MULTIPLY', INDETERMINATE) -subtract = express_getattr(IfcArithmeticOperatorEnum, 'SUBTRACT', INDETERMINATE) +add = IfcArithmeticOperatorEnum.ADD +divide = IfcArithmeticOperatorEnum.DIVIDE +multiply = IfcArithmeticOperatorEnum.MULTIPLY +subtract = IfcArithmeticOperatorEnum.SUBTRACT IfcAssemblyPlaceEnum = enum_namespace() -site = express_getattr(IfcAssemblyPlaceEnum, 'SITE', INDETERMINATE) -factory = express_getattr(IfcAssemblyPlaceEnum, 'FACTORY', INDETERMINATE) -notdefined = express_getattr(IfcAssemblyPlaceEnum, 'NOTDEFINED', INDETERMINATE) +site = IfcAssemblyPlaceEnum.SITE +factory = IfcAssemblyPlaceEnum.FACTORY +notdefined = IfcAssemblyPlaceEnum.NOTDEFINED IfcBSplineCurveForm = enum_namespace() -polyline_form = express_getattr(IfcBSplineCurveForm, 'POLYLINE_FORM', INDETERMINATE) -circular_arc = express_getattr(IfcBSplineCurveForm, 'CIRCULAR_ARC', INDETERMINATE) -elliptic_arc = express_getattr(IfcBSplineCurveForm, 'ELLIPTIC_ARC', INDETERMINATE) -parabolic_arc = express_getattr(IfcBSplineCurveForm, 'PARABOLIC_ARC', INDETERMINATE) -hyperbolic_arc = express_getattr(IfcBSplineCurveForm, 'HYPERBOLIC_ARC', INDETERMINATE) -unspecified = express_getattr(IfcBSplineCurveForm, 'UNSPECIFIED', INDETERMINATE) +polyline_form = IfcBSplineCurveForm.POLYLINE_FORM +circular_arc = IfcBSplineCurveForm.CIRCULAR_ARC +elliptic_arc = IfcBSplineCurveForm.ELLIPTIC_ARC +parabolic_arc = IfcBSplineCurveForm.PARABOLIC_ARC +hyperbolic_arc = IfcBSplineCurveForm.HYPERBOLIC_ARC +unspecified = IfcBSplineCurveForm.UNSPECIFIED IfcBeamTypeEnum = enum_namespace() -beam = express_getattr(IfcBeamTypeEnum, 'BEAM', INDETERMINATE) -joist = express_getattr(IfcBeamTypeEnum, 'JOIST', INDETERMINATE) -lintel = express_getattr(IfcBeamTypeEnum, 'LINTEL', INDETERMINATE) -t_beam = express_getattr(IfcBeamTypeEnum, 'T_BEAM', INDETERMINATE) -userdefined = express_getattr(IfcBeamTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBeamTypeEnum, 'NOTDEFINED', INDETERMINATE) +beam = IfcBeamTypeEnum.BEAM +joist = IfcBeamTypeEnum.JOIST +lintel = IfcBeamTypeEnum.LINTEL +t_beam = IfcBeamTypeEnum.T_BEAM +userdefined = IfcBeamTypeEnum.USERDEFINED +notdefined = IfcBeamTypeEnum.NOTDEFINED IfcBenchmarkEnum = enum_namespace() -greaterthan = express_getattr(IfcBenchmarkEnum, 'GREATERTHAN', INDETERMINATE) -greaterthanorequalto = express_getattr(IfcBenchmarkEnum, 'GREATERTHANOREQUALTO', INDETERMINATE) -lessthan = express_getattr(IfcBenchmarkEnum, 'LESSTHAN', INDETERMINATE) -lessthanorequalto = express_getattr(IfcBenchmarkEnum, 'LESSTHANOREQUALTO', INDETERMINATE) -equalto = express_getattr(IfcBenchmarkEnum, 'EQUALTO', INDETERMINATE) -notequalto = express_getattr(IfcBenchmarkEnum, 'NOTEQUALTO', INDETERMINATE) +greaterthan = IfcBenchmarkEnum.GREATERTHAN +greaterthanorequalto = IfcBenchmarkEnum.GREATERTHANOREQUALTO +lessthan = IfcBenchmarkEnum.LESSTHAN +lessthanorequalto = IfcBenchmarkEnum.LESSTHANOREQUALTO +equalto = IfcBenchmarkEnum.EQUALTO +notequalto = IfcBenchmarkEnum.NOTEQUALTO IfcBoilerTypeEnum = enum_namespace() -water = express_getattr(IfcBoilerTypeEnum, 'WATER', INDETERMINATE) -steam = express_getattr(IfcBoilerTypeEnum, 'STEAM', INDETERMINATE) -userdefined = express_getattr(IfcBoilerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBoilerTypeEnum, 'NOTDEFINED', INDETERMINATE) +water = IfcBoilerTypeEnum.WATER +steam = IfcBoilerTypeEnum.STEAM +userdefined = IfcBoilerTypeEnum.USERDEFINED +notdefined = IfcBoilerTypeEnum.NOTDEFINED IfcBooleanOperator = enum_namespace() -union = express_getattr(IfcBooleanOperator, 'UNION', INDETERMINATE) -intersection = express_getattr(IfcBooleanOperator, 'INTERSECTION', INDETERMINATE) -difference = express_getattr(IfcBooleanOperator, 'DIFFERENCE', INDETERMINATE) +union = IfcBooleanOperator.UNION +intersection = IfcBooleanOperator.INTERSECTION +difference = IfcBooleanOperator.DIFFERENCE IfcBuildingElementProxyTypeEnum = enum_namespace() -userdefined = express_getattr(IfcBuildingElementProxyTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBuildingElementProxyTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcBuildingElementProxyTypeEnum.USERDEFINED +notdefined = IfcBuildingElementProxyTypeEnum.NOTDEFINED IfcCableCarrierFittingTypeEnum = enum_namespace() -bend = express_getattr(IfcCableCarrierFittingTypeEnum, 'BEND', INDETERMINATE) -cross = express_getattr(IfcCableCarrierFittingTypeEnum, 'CROSS', INDETERMINATE) -reducer = express_getattr(IfcCableCarrierFittingTypeEnum, 'REDUCER', INDETERMINATE) -tee = express_getattr(IfcCableCarrierFittingTypeEnum, 'TEE', INDETERMINATE) -userdefined = express_getattr(IfcCableCarrierFittingTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCableCarrierFittingTypeEnum, 'NOTDEFINED', INDETERMINATE) +bend = IfcCableCarrierFittingTypeEnum.BEND +cross = IfcCableCarrierFittingTypeEnum.CROSS +reducer = IfcCableCarrierFittingTypeEnum.REDUCER +tee = IfcCableCarrierFittingTypeEnum.TEE +userdefined = IfcCableCarrierFittingTypeEnum.USERDEFINED +notdefined = IfcCableCarrierFittingTypeEnum.NOTDEFINED IfcCableCarrierSegmentTypeEnum = enum_namespace() -cableladdersegment = express_getattr(IfcCableCarrierSegmentTypeEnum, 'CABLELADDERSEGMENT', INDETERMINATE) -cabletraysegment = express_getattr(IfcCableCarrierSegmentTypeEnum, 'CABLETRAYSEGMENT', INDETERMINATE) -cabletrunkingsegment = express_getattr(IfcCableCarrierSegmentTypeEnum, 'CABLETRUNKINGSEGMENT', INDETERMINATE) -conduitsegment = express_getattr(IfcCableCarrierSegmentTypeEnum, 'CONDUITSEGMENT', INDETERMINATE) -userdefined = express_getattr(IfcCableCarrierSegmentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCableCarrierSegmentTypeEnum, 'NOTDEFINED', INDETERMINATE) +cableladdersegment = IfcCableCarrierSegmentTypeEnum.CABLELADDERSEGMENT +cabletraysegment = IfcCableCarrierSegmentTypeEnum.CABLETRAYSEGMENT +cabletrunkingsegment = IfcCableCarrierSegmentTypeEnum.CABLETRUNKINGSEGMENT +conduitsegment = IfcCableCarrierSegmentTypeEnum.CONDUITSEGMENT +userdefined = IfcCableCarrierSegmentTypeEnum.USERDEFINED +notdefined = IfcCableCarrierSegmentTypeEnum.NOTDEFINED IfcCableSegmentTypeEnum = enum_namespace() -cablesegment = express_getattr(IfcCableSegmentTypeEnum, 'CABLESEGMENT', INDETERMINATE) -conductorsegment = express_getattr(IfcCableSegmentTypeEnum, 'CONDUCTORSEGMENT', INDETERMINATE) -userdefined = express_getattr(IfcCableSegmentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCableSegmentTypeEnum, 'NOTDEFINED', INDETERMINATE) +cablesegment = IfcCableSegmentTypeEnum.CABLESEGMENT +conductorsegment = IfcCableSegmentTypeEnum.CONDUCTORSEGMENT +userdefined = IfcCableSegmentTypeEnum.USERDEFINED +notdefined = IfcCableSegmentTypeEnum.NOTDEFINED IfcChangeActionEnum = enum_namespace() -nochange = express_getattr(IfcChangeActionEnum, 'NOCHANGE', INDETERMINATE) -modified = express_getattr(IfcChangeActionEnum, 'MODIFIED', INDETERMINATE) -added = express_getattr(IfcChangeActionEnum, 'ADDED', INDETERMINATE) -deleted = express_getattr(IfcChangeActionEnum, 'DELETED', INDETERMINATE) -modifiedadded = express_getattr(IfcChangeActionEnum, 'MODIFIEDADDED', INDETERMINATE) -modifieddeleted = express_getattr(IfcChangeActionEnum, 'MODIFIEDDELETED', INDETERMINATE) +nochange = IfcChangeActionEnum.NOCHANGE +modified = IfcChangeActionEnum.MODIFIED +added = IfcChangeActionEnum.ADDED +deleted = IfcChangeActionEnum.DELETED +modifiedadded = IfcChangeActionEnum.MODIFIEDADDED +modifieddeleted = IfcChangeActionEnum.MODIFIEDDELETED IfcChillerTypeEnum = enum_namespace() -aircooled = express_getattr(IfcChillerTypeEnum, 'AIRCOOLED', INDETERMINATE) -watercooled = express_getattr(IfcChillerTypeEnum, 'WATERCOOLED', INDETERMINATE) -heatrecovery = express_getattr(IfcChillerTypeEnum, 'HEATRECOVERY', INDETERMINATE) -userdefined = express_getattr(IfcChillerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcChillerTypeEnum, 'NOTDEFINED', INDETERMINATE) +aircooled = IfcChillerTypeEnum.AIRCOOLED +watercooled = IfcChillerTypeEnum.WATERCOOLED +heatrecovery = IfcChillerTypeEnum.HEATRECOVERY +userdefined = IfcChillerTypeEnum.USERDEFINED +notdefined = IfcChillerTypeEnum.NOTDEFINED IfcCoilTypeEnum = enum_namespace() -dxcoolingcoil = express_getattr(IfcCoilTypeEnum, 'DXCOOLINGCOIL', INDETERMINATE) -watercoolingcoil = express_getattr(IfcCoilTypeEnum, 'WATERCOOLINGCOIL', INDETERMINATE) -steamheatingcoil = express_getattr(IfcCoilTypeEnum, 'STEAMHEATINGCOIL', INDETERMINATE) -waterheatingcoil = express_getattr(IfcCoilTypeEnum, 'WATERHEATINGCOIL', INDETERMINATE) -electricheatingcoil = express_getattr(IfcCoilTypeEnum, 'ELECTRICHEATINGCOIL', INDETERMINATE) -gasheatingcoil = express_getattr(IfcCoilTypeEnum, 'GASHEATINGCOIL', INDETERMINATE) -userdefined = express_getattr(IfcCoilTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCoilTypeEnum, 'NOTDEFINED', INDETERMINATE) +dxcoolingcoil = IfcCoilTypeEnum.DXCOOLINGCOIL +watercoolingcoil = IfcCoilTypeEnum.WATERCOOLINGCOIL +steamheatingcoil = IfcCoilTypeEnum.STEAMHEATINGCOIL +waterheatingcoil = IfcCoilTypeEnum.WATERHEATINGCOIL +electricheatingcoil = IfcCoilTypeEnum.ELECTRICHEATINGCOIL +gasheatingcoil = IfcCoilTypeEnum.GASHEATINGCOIL +userdefined = IfcCoilTypeEnum.USERDEFINED +notdefined = IfcCoilTypeEnum.NOTDEFINED IfcColumnTypeEnum = enum_namespace() -column = express_getattr(IfcColumnTypeEnum, 'COLUMN', INDETERMINATE) -userdefined = express_getattr(IfcColumnTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcColumnTypeEnum, 'NOTDEFINED', INDETERMINATE) +column = IfcColumnTypeEnum.COLUMN +userdefined = IfcColumnTypeEnum.USERDEFINED +notdefined = IfcColumnTypeEnum.NOTDEFINED IfcCompressorTypeEnum = enum_namespace() -dynamic = express_getattr(IfcCompressorTypeEnum, 'DYNAMIC', INDETERMINATE) -reciprocating = express_getattr(IfcCompressorTypeEnum, 'RECIPROCATING', INDETERMINATE) -rotary = express_getattr(IfcCompressorTypeEnum, 'ROTARY', INDETERMINATE) -scroll = express_getattr(IfcCompressorTypeEnum, 'SCROLL', INDETERMINATE) -trochoidal = express_getattr(IfcCompressorTypeEnum, 'TROCHOIDAL', INDETERMINATE) -singlestage = express_getattr(IfcCompressorTypeEnum, 'SINGLESTAGE', INDETERMINATE) -booster = express_getattr(IfcCompressorTypeEnum, 'BOOSTER', INDETERMINATE) -opentype = express_getattr(IfcCompressorTypeEnum, 'OPENTYPE', INDETERMINATE) -hermetic = express_getattr(IfcCompressorTypeEnum, 'HERMETIC', INDETERMINATE) -semihermetic = express_getattr(IfcCompressorTypeEnum, 'SEMIHERMETIC', INDETERMINATE) -weldedshellhermetic = express_getattr(IfcCompressorTypeEnum, 'WELDEDSHELLHERMETIC', INDETERMINATE) -rollingpiston = express_getattr(IfcCompressorTypeEnum, 'ROLLINGPISTON', INDETERMINATE) -rotaryvane = express_getattr(IfcCompressorTypeEnum, 'ROTARYVANE', INDETERMINATE) -singlescrew = express_getattr(IfcCompressorTypeEnum, 'SINGLESCREW', INDETERMINATE) -twinscrew = express_getattr(IfcCompressorTypeEnum, 'TWINSCREW', INDETERMINATE) -userdefined = express_getattr(IfcCompressorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCompressorTypeEnum, 'NOTDEFINED', INDETERMINATE) +dynamic = IfcCompressorTypeEnum.DYNAMIC +reciprocating = IfcCompressorTypeEnum.RECIPROCATING +rotary = IfcCompressorTypeEnum.ROTARY +scroll = IfcCompressorTypeEnum.SCROLL +trochoidal = IfcCompressorTypeEnum.TROCHOIDAL +singlestage = IfcCompressorTypeEnum.SINGLESTAGE +booster = IfcCompressorTypeEnum.BOOSTER +opentype = IfcCompressorTypeEnum.OPENTYPE +hermetic = IfcCompressorTypeEnum.HERMETIC +semihermetic = IfcCompressorTypeEnum.SEMIHERMETIC +weldedshellhermetic = IfcCompressorTypeEnum.WELDEDSHELLHERMETIC +rollingpiston = IfcCompressorTypeEnum.ROLLINGPISTON +rotaryvane = IfcCompressorTypeEnum.ROTARYVANE +singlescrew = IfcCompressorTypeEnum.SINGLESCREW +twinscrew = IfcCompressorTypeEnum.TWINSCREW +userdefined = IfcCompressorTypeEnum.USERDEFINED +notdefined = IfcCompressorTypeEnum.NOTDEFINED IfcCondenserTypeEnum = enum_namespace() -watercooledshelltube = express_getattr(IfcCondenserTypeEnum, 'WATERCOOLEDSHELLTUBE', INDETERMINATE) -watercooledshellcoil = express_getattr(IfcCondenserTypeEnum, 'WATERCOOLEDSHELLCOIL', INDETERMINATE) -watercooledtubeintube = express_getattr(IfcCondenserTypeEnum, 'WATERCOOLEDTUBEINTUBE', INDETERMINATE) -watercooledbrazedplate = express_getattr(IfcCondenserTypeEnum, 'WATERCOOLEDBRAZEDPLATE', INDETERMINATE) -aircooled = express_getattr(IfcCondenserTypeEnum, 'AIRCOOLED', INDETERMINATE) -evaporativecooled = express_getattr(IfcCondenserTypeEnum, 'EVAPORATIVECOOLED', INDETERMINATE) -userdefined = express_getattr(IfcCondenserTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCondenserTypeEnum, 'NOTDEFINED', INDETERMINATE) +watercooledshelltube = IfcCondenserTypeEnum.WATERCOOLEDSHELLTUBE +watercooledshellcoil = IfcCondenserTypeEnum.WATERCOOLEDSHELLCOIL +watercooledtubeintube = IfcCondenserTypeEnum.WATERCOOLEDTUBEINTUBE +watercooledbrazedplate = IfcCondenserTypeEnum.WATERCOOLEDBRAZEDPLATE +aircooled = IfcCondenserTypeEnum.AIRCOOLED +evaporativecooled = IfcCondenserTypeEnum.EVAPORATIVECOOLED +userdefined = IfcCondenserTypeEnum.USERDEFINED +notdefined = IfcCondenserTypeEnum.NOTDEFINED IfcConnectionTypeEnum = enum_namespace() -atpath = express_getattr(IfcConnectionTypeEnum, 'ATPATH', INDETERMINATE) -atstart = express_getattr(IfcConnectionTypeEnum, 'ATSTART', INDETERMINATE) -atend = express_getattr(IfcConnectionTypeEnum, 'ATEND', INDETERMINATE) -notdefined = express_getattr(IfcConnectionTypeEnum, 'NOTDEFINED', INDETERMINATE) +atpath = IfcConnectionTypeEnum.ATPATH +atstart = IfcConnectionTypeEnum.ATSTART +atend = IfcConnectionTypeEnum.ATEND +notdefined = IfcConnectionTypeEnum.NOTDEFINED IfcConstraintEnum = enum_namespace() -hard = express_getattr(IfcConstraintEnum, 'HARD', INDETERMINATE) -soft = express_getattr(IfcConstraintEnum, 'SOFT', INDETERMINATE) -advisory = express_getattr(IfcConstraintEnum, 'ADVISORY', INDETERMINATE) -userdefined = express_getattr(IfcConstraintEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcConstraintEnum, 'NOTDEFINED', INDETERMINATE) +hard = IfcConstraintEnum.HARD +soft = IfcConstraintEnum.SOFT +advisory = IfcConstraintEnum.ADVISORY +userdefined = IfcConstraintEnum.USERDEFINED +notdefined = IfcConstraintEnum.NOTDEFINED IfcControllerTypeEnum = enum_namespace() -floating = express_getattr(IfcControllerTypeEnum, 'FLOATING', INDETERMINATE) -proportional = express_getattr(IfcControllerTypeEnum, 'PROPORTIONAL', INDETERMINATE) -proportionalintegral = express_getattr(IfcControllerTypeEnum, 'PROPORTIONALINTEGRAL', INDETERMINATE) -proportionalintegralderivative = express_getattr(IfcControllerTypeEnum, 'PROPORTIONALINTEGRALDERIVATIVE', INDETERMINATE) -timedtwoposition = express_getattr(IfcControllerTypeEnum, 'TIMEDTWOPOSITION', INDETERMINATE) -twoposition = express_getattr(IfcControllerTypeEnum, 'TWOPOSITION', INDETERMINATE) -userdefined = express_getattr(IfcControllerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcControllerTypeEnum, 'NOTDEFINED', INDETERMINATE) +floating = IfcControllerTypeEnum.FLOATING +proportional = IfcControllerTypeEnum.PROPORTIONAL +proportionalintegral = IfcControllerTypeEnum.PROPORTIONALINTEGRAL +proportionalintegralderivative = IfcControllerTypeEnum.PROPORTIONALINTEGRALDERIVATIVE +timedtwoposition = IfcControllerTypeEnum.TIMEDTWOPOSITION +twoposition = IfcControllerTypeEnum.TWOPOSITION +userdefined = IfcControllerTypeEnum.USERDEFINED +notdefined = IfcControllerTypeEnum.NOTDEFINED IfcCooledBeamTypeEnum = enum_namespace() -active = express_getattr(IfcCooledBeamTypeEnum, 'ACTIVE', INDETERMINATE) -passive = express_getattr(IfcCooledBeamTypeEnum, 'PASSIVE', INDETERMINATE) -userdefined = express_getattr(IfcCooledBeamTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCooledBeamTypeEnum, 'NOTDEFINED', INDETERMINATE) +active = IfcCooledBeamTypeEnum.ACTIVE +passive = IfcCooledBeamTypeEnum.PASSIVE +userdefined = IfcCooledBeamTypeEnum.USERDEFINED +notdefined = IfcCooledBeamTypeEnum.NOTDEFINED IfcCoolingTowerTypeEnum = enum_namespace() -naturaldraft = express_getattr(IfcCoolingTowerTypeEnum, 'NATURALDRAFT', INDETERMINATE) -mechanicalinduceddraft = express_getattr(IfcCoolingTowerTypeEnum, 'MECHANICALINDUCEDDRAFT', INDETERMINATE) -mechanicalforceddraft = express_getattr(IfcCoolingTowerTypeEnum, 'MECHANICALFORCEDDRAFT', INDETERMINATE) -userdefined = express_getattr(IfcCoolingTowerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCoolingTowerTypeEnum, 'NOTDEFINED', INDETERMINATE) +naturaldraft = IfcCoolingTowerTypeEnum.NATURALDRAFT +mechanicalinduceddraft = IfcCoolingTowerTypeEnum.MECHANICALINDUCEDDRAFT +mechanicalforceddraft = IfcCoolingTowerTypeEnum.MECHANICALFORCEDDRAFT +userdefined = IfcCoolingTowerTypeEnum.USERDEFINED +notdefined = IfcCoolingTowerTypeEnum.NOTDEFINED IfcCostScheduleTypeEnum = enum_namespace() -budget = express_getattr(IfcCostScheduleTypeEnum, 'BUDGET', INDETERMINATE) -costplan = express_getattr(IfcCostScheduleTypeEnum, 'COSTPLAN', INDETERMINATE) -estimate = express_getattr(IfcCostScheduleTypeEnum, 'ESTIMATE', INDETERMINATE) -tender = express_getattr(IfcCostScheduleTypeEnum, 'TENDER', INDETERMINATE) -pricedbillofquantities = express_getattr(IfcCostScheduleTypeEnum, 'PRICEDBILLOFQUANTITIES', INDETERMINATE) -unpricedbillofquantities = express_getattr(IfcCostScheduleTypeEnum, 'UNPRICEDBILLOFQUANTITIES', INDETERMINATE) -scheduleofrates = express_getattr(IfcCostScheduleTypeEnum, 'SCHEDULEOFRATES', INDETERMINATE) -userdefined = express_getattr(IfcCostScheduleTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCostScheduleTypeEnum, 'NOTDEFINED', INDETERMINATE) +budget = IfcCostScheduleTypeEnum.BUDGET +costplan = IfcCostScheduleTypeEnum.COSTPLAN +estimate = IfcCostScheduleTypeEnum.ESTIMATE +tender = IfcCostScheduleTypeEnum.TENDER +pricedbillofquantities = IfcCostScheduleTypeEnum.PRICEDBILLOFQUANTITIES +unpricedbillofquantities = IfcCostScheduleTypeEnum.UNPRICEDBILLOFQUANTITIES +scheduleofrates = IfcCostScheduleTypeEnum.SCHEDULEOFRATES +userdefined = IfcCostScheduleTypeEnum.USERDEFINED +notdefined = IfcCostScheduleTypeEnum.NOTDEFINED IfcCoveringTypeEnum = enum_namespace() -ceiling = express_getattr(IfcCoveringTypeEnum, 'CEILING', INDETERMINATE) -flooring = express_getattr(IfcCoveringTypeEnum, 'FLOORING', INDETERMINATE) -cladding = express_getattr(IfcCoveringTypeEnum, 'CLADDING', INDETERMINATE) -roofing = express_getattr(IfcCoveringTypeEnum, 'ROOFING', INDETERMINATE) -insulation = express_getattr(IfcCoveringTypeEnum, 'INSULATION', INDETERMINATE) -membrane = express_getattr(IfcCoveringTypeEnum, 'MEMBRANE', INDETERMINATE) -sleeving = express_getattr(IfcCoveringTypeEnum, 'SLEEVING', INDETERMINATE) -wrapping = express_getattr(IfcCoveringTypeEnum, 'WRAPPING', INDETERMINATE) -userdefined = express_getattr(IfcCoveringTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCoveringTypeEnum, 'NOTDEFINED', INDETERMINATE) +ceiling = IfcCoveringTypeEnum.CEILING +flooring = IfcCoveringTypeEnum.FLOORING +cladding = IfcCoveringTypeEnum.CLADDING +roofing = IfcCoveringTypeEnum.ROOFING +insulation = IfcCoveringTypeEnum.INSULATION +membrane = IfcCoveringTypeEnum.MEMBRANE +sleeving = IfcCoveringTypeEnum.SLEEVING +wrapping = IfcCoveringTypeEnum.WRAPPING +userdefined = IfcCoveringTypeEnum.USERDEFINED +notdefined = IfcCoveringTypeEnum.NOTDEFINED IfcCurrencyEnum = enum_namespace() -aed = express_getattr(IfcCurrencyEnum, 'AED', INDETERMINATE) -aes = express_getattr(IfcCurrencyEnum, 'AES', INDETERMINATE) -ats = express_getattr(IfcCurrencyEnum, 'ATS', INDETERMINATE) -aud = express_getattr(IfcCurrencyEnum, 'AUD', INDETERMINATE) -bbd = express_getattr(IfcCurrencyEnum, 'BBD', INDETERMINATE) -beg = express_getattr(IfcCurrencyEnum, 'BEG', INDETERMINATE) -bgl = express_getattr(IfcCurrencyEnum, 'BGL', INDETERMINATE) -bhd = express_getattr(IfcCurrencyEnum, 'BHD', INDETERMINATE) -bmd = express_getattr(IfcCurrencyEnum, 'BMD', INDETERMINATE) -bnd = express_getattr(IfcCurrencyEnum, 'BND', INDETERMINATE) -brl = express_getattr(IfcCurrencyEnum, 'BRL', INDETERMINATE) -bsd = express_getattr(IfcCurrencyEnum, 'BSD', INDETERMINATE) -bwp = express_getattr(IfcCurrencyEnum, 'BWP', INDETERMINATE) -bzd = express_getattr(IfcCurrencyEnum, 'BZD', INDETERMINATE) -cad = express_getattr(IfcCurrencyEnum, 'CAD', INDETERMINATE) -cbd = express_getattr(IfcCurrencyEnum, 'CBD', INDETERMINATE) -chf = express_getattr(IfcCurrencyEnum, 'CHF', INDETERMINATE) -clp = express_getattr(IfcCurrencyEnum, 'CLP', INDETERMINATE) -cny = express_getattr(IfcCurrencyEnum, 'CNY', INDETERMINATE) -cys = express_getattr(IfcCurrencyEnum, 'CYS', INDETERMINATE) -czk = express_getattr(IfcCurrencyEnum, 'CZK', INDETERMINATE) -ddp = express_getattr(IfcCurrencyEnum, 'DDP', INDETERMINATE) -dem = express_getattr(IfcCurrencyEnum, 'DEM', INDETERMINATE) -dkk = express_getattr(IfcCurrencyEnum, 'DKK', INDETERMINATE) -egl = express_getattr(IfcCurrencyEnum, 'EGL', INDETERMINATE) -est = express_getattr(IfcCurrencyEnum, 'EST', INDETERMINATE) -eur = express_getattr(IfcCurrencyEnum, 'EUR', INDETERMINATE) -fak = express_getattr(IfcCurrencyEnum, 'FAK', INDETERMINATE) -fim = express_getattr(IfcCurrencyEnum, 'FIM', INDETERMINATE) -fjd = express_getattr(IfcCurrencyEnum, 'FJD', INDETERMINATE) -fkp = express_getattr(IfcCurrencyEnum, 'FKP', INDETERMINATE) -frf = express_getattr(IfcCurrencyEnum, 'FRF', INDETERMINATE) -gbp = express_getattr(IfcCurrencyEnum, 'GBP', INDETERMINATE) -gip = express_getattr(IfcCurrencyEnum, 'GIP', INDETERMINATE) -gmd = express_getattr(IfcCurrencyEnum, 'GMD', INDETERMINATE) -grx = express_getattr(IfcCurrencyEnum, 'GRX', INDETERMINATE) -hkd = express_getattr(IfcCurrencyEnum, 'HKD', INDETERMINATE) -huf = express_getattr(IfcCurrencyEnum, 'HUF', INDETERMINATE) -ick = express_getattr(IfcCurrencyEnum, 'ICK', INDETERMINATE) -idr = express_getattr(IfcCurrencyEnum, 'IDR', INDETERMINATE) -ils = express_getattr(IfcCurrencyEnum, 'ILS', INDETERMINATE) -inr = express_getattr(IfcCurrencyEnum, 'INR', INDETERMINATE) -irp = express_getattr(IfcCurrencyEnum, 'IRP', INDETERMINATE) -itl = express_getattr(IfcCurrencyEnum, 'ITL', INDETERMINATE) -jmd = express_getattr(IfcCurrencyEnum, 'JMD', INDETERMINATE) -jod = express_getattr(IfcCurrencyEnum, 'JOD', INDETERMINATE) -jpy = express_getattr(IfcCurrencyEnum, 'JPY', INDETERMINATE) -kes = express_getattr(IfcCurrencyEnum, 'KES', INDETERMINATE) -krw = express_getattr(IfcCurrencyEnum, 'KRW', INDETERMINATE) -kwd = express_getattr(IfcCurrencyEnum, 'KWD', INDETERMINATE) -kyd = express_getattr(IfcCurrencyEnum, 'KYD', INDETERMINATE) -lkr = express_getattr(IfcCurrencyEnum, 'LKR', INDETERMINATE) -luf = express_getattr(IfcCurrencyEnum, 'LUF', INDETERMINATE) -mtl = express_getattr(IfcCurrencyEnum, 'MTL', INDETERMINATE) -mur = express_getattr(IfcCurrencyEnum, 'MUR', INDETERMINATE) -mxn = express_getattr(IfcCurrencyEnum, 'MXN', INDETERMINATE) -myr = express_getattr(IfcCurrencyEnum, 'MYR', INDETERMINATE) -nlg = express_getattr(IfcCurrencyEnum, 'NLG', INDETERMINATE) -nzd = express_getattr(IfcCurrencyEnum, 'NZD', INDETERMINATE) -omr = express_getattr(IfcCurrencyEnum, 'OMR', INDETERMINATE) -pgk = express_getattr(IfcCurrencyEnum, 'PGK', INDETERMINATE) -php = express_getattr(IfcCurrencyEnum, 'PHP', INDETERMINATE) -pkr = express_getattr(IfcCurrencyEnum, 'PKR', INDETERMINATE) -pln = express_getattr(IfcCurrencyEnum, 'PLN', INDETERMINATE) -ptn = express_getattr(IfcCurrencyEnum, 'PTN', INDETERMINATE) -qar = express_getattr(IfcCurrencyEnum, 'QAR', INDETERMINATE) -rur = express_getattr(IfcCurrencyEnum, 'RUR', INDETERMINATE) -sar = express_getattr(IfcCurrencyEnum, 'SAR', INDETERMINATE) -scr = express_getattr(IfcCurrencyEnum, 'SCR', INDETERMINATE) -sek = express_getattr(IfcCurrencyEnum, 'SEK', INDETERMINATE) -sgd = express_getattr(IfcCurrencyEnum, 'SGD', INDETERMINATE) -skp = express_getattr(IfcCurrencyEnum, 'SKP', INDETERMINATE) -thb = express_getattr(IfcCurrencyEnum, 'THB', INDETERMINATE) -trl = express_getattr(IfcCurrencyEnum, 'TRL', INDETERMINATE) -ttd = express_getattr(IfcCurrencyEnum, 'TTD', INDETERMINATE) -twd = express_getattr(IfcCurrencyEnum, 'TWD', INDETERMINATE) -usd = express_getattr(IfcCurrencyEnum, 'USD', INDETERMINATE) -veb = express_getattr(IfcCurrencyEnum, 'VEB', INDETERMINATE) -vnd = express_getattr(IfcCurrencyEnum, 'VND', INDETERMINATE) -xeu = express_getattr(IfcCurrencyEnum, 'XEU', INDETERMINATE) -zar = express_getattr(IfcCurrencyEnum, 'ZAR', INDETERMINATE) -zwd = express_getattr(IfcCurrencyEnum, 'ZWD', INDETERMINATE) -nok = express_getattr(IfcCurrencyEnum, 'NOK', INDETERMINATE) +aed = IfcCurrencyEnum.AED +aes = IfcCurrencyEnum.AES +ats = IfcCurrencyEnum.ATS +aud = IfcCurrencyEnum.AUD +bbd = IfcCurrencyEnum.BBD +beg = IfcCurrencyEnum.BEG +bgl = IfcCurrencyEnum.BGL +bhd = IfcCurrencyEnum.BHD +bmd = IfcCurrencyEnum.BMD +bnd = IfcCurrencyEnum.BND +brl = IfcCurrencyEnum.BRL +bsd = IfcCurrencyEnum.BSD +bwp = IfcCurrencyEnum.BWP +bzd = IfcCurrencyEnum.BZD +cad = IfcCurrencyEnum.CAD +cbd = IfcCurrencyEnum.CBD +chf = IfcCurrencyEnum.CHF +clp = IfcCurrencyEnum.CLP +cny = IfcCurrencyEnum.CNY +cys = IfcCurrencyEnum.CYS +czk = IfcCurrencyEnum.CZK +ddp = IfcCurrencyEnum.DDP +dem = IfcCurrencyEnum.DEM +dkk = IfcCurrencyEnum.DKK +egl = IfcCurrencyEnum.EGL +est = IfcCurrencyEnum.EST +eur = IfcCurrencyEnum.EUR +fak = IfcCurrencyEnum.FAK +fim = IfcCurrencyEnum.FIM +fjd = IfcCurrencyEnum.FJD +fkp = IfcCurrencyEnum.FKP +frf = IfcCurrencyEnum.FRF +gbp = IfcCurrencyEnum.GBP +gip = IfcCurrencyEnum.GIP +gmd = IfcCurrencyEnum.GMD +grx = IfcCurrencyEnum.GRX +hkd = IfcCurrencyEnum.HKD +huf = IfcCurrencyEnum.HUF +ick = IfcCurrencyEnum.ICK +idr = IfcCurrencyEnum.IDR +ils = IfcCurrencyEnum.ILS +inr = IfcCurrencyEnum.INR +irp = IfcCurrencyEnum.IRP +itl = IfcCurrencyEnum.ITL +jmd = IfcCurrencyEnum.JMD +jod = IfcCurrencyEnum.JOD +jpy = IfcCurrencyEnum.JPY +kes = IfcCurrencyEnum.KES +krw = IfcCurrencyEnum.KRW +kwd = IfcCurrencyEnum.KWD +kyd = IfcCurrencyEnum.KYD +lkr = IfcCurrencyEnum.LKR +luf = IfcCurrencyEnum.LUF +mtl = IfcCurrencyEnum.MTL +mur = IfcCurrencyEnum.MUR +mxn = IfcCurrencyEnum.MXN +myr = IfcCurrencyEnum.MYR +nlg = IfcCurrencyEnum.NLG +nzd = IfcCurrencyEnum.NZD +omr = IfcCurrencyEnum.OMR +pgk = IfcCurrencyEnum.PGK +php = IfcCurrencyEnum.PHP +pkr = IfcCurrencyEnum.PKR +pln = IfcCurrencyEnum.PLN +ptn = IfcCurrencyEnum.PTN +qar = IfcCurrencyEnum.QAR +rur = IfcCurrencyEnum.RUR +sar = IfcCurrencyEnum.SAR +scr = IfcCurrencyEnum.SCR +sek = IfcCurrencyEnum.SEK +sgd = IfcCurrencyEnum.SGD +skp = IfcCurrencyEnum.SKP +thb = IfcCurrencyEnum.THB +trl = IfcCurrencyEnum.TRL +ttd = IfcCurrencyEnum.TTD +twd = IfcCurrencyEnum.TWD +usd = IfcCurrencyEnum.USD +veb = IfcCurrencyEnum.VEB +vnd = IfcCurrencyEnum.VND +xeu = IfcCurrencyEnum.XEU +zar = IfcCurrencyEnum.ZAR +zwd = IfcCurrencyEnum.ZWD +nok = IfcCurrencyEnum.NOK IfcCurtainWallTypeEnum = enum_namespace() -userdefined = express_getattr(IfcCurtainWallTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCurtainWallTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcCurtainWallTypeEnum.USERDEFINED +notdefined = IfcCurtainWallTypeEnum.NOTDEFINED IfcDamperTypeEnum = enum_namespace() -controldamper = express_getattr(IfcDamperTypeEnum, 'CONTROLDAMPER', INDETERMINATE) -firedamper = express_getattr(IfcDamperTypeEnum, 'FIREDAMPER', INDETERMINATE) -smokedamper = express_getattr(IfcDamperTypeEnum, 'SMOKEDAMPER', INDETERMINATE) -firesmokedamper = express_getattr(IfcDamperTypeEnum, 'FIRESMOKEDAMPER', INDETERMINATE) -backdraftdamper = express_getattr(IfcDamperTypeEnum, 'BACKDRAFTDAMPER', INDETERMINATE) -reliefdamper = express_getattr(IfcDamperTypeEnum, 'RELIEFDAMPER', INDETERMINATE) -blastdamper = express_getattr(IfcDamperTypeEnum, 'BLASTDAMPER', INDETERMINATE) -gravitydamper = express_getattr(IfcDamperTypeEnum, 'GRAVITYDAMPER', INDETERMINATE) -gravityreliefdamper = express_getattr(IfcDamperTypeEnum, 'GRAVITYRELIEFDAMPER', INDETERMINATE) -balancingdamper = express_getattr(IfcDamperTypeEnum, 'BALANCINGDAMPER', INDETERMINATE) -fumehoodexhaust = express_getattr(IfcDamperTypeEnum, 'FUMEHOODEXHAUST', INDETERMINATE) -userdefined = express_getattr(IfcDamperTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDamperTypeEnum, 'NOTDEFINED', INDETERMINATE) +controldamper = IfcDamperTypeEnum.CONTROLDAMPER +firedamper = IfcDamperTypeEnum.FIREDAMPER +smokedamper = IfcDamperTypeEnum.SMOKEDAMPER +firesmokedamper = IfcDamperTypeEnum.FIRESMOKEDAMPER +backdraftdamper = IfcDamperTypeEnum.BACKDRAFTDAMPER +reliefdamper = IfcDamperTypeEnum.RELIEFDAMPER +blastdamper = IfcDamperTypeEnum.BLASTDAMPER +gravitydamper = IfcDamperTypeEnum.GRAVITYDAMPER +gravityreliefdamper = IfcDamperTypeEnum.GRAVITYRELIEFDAMPER +balancingdamper = IfcDamperTypeEnum.BALANCINGDAMPER +fumehoodexhaust = IfcDamperTypeEnum.FUMEHOODEXHAUST +userdefined = IfcDamperTypeEnum.USERDEFINED +notdefined = IfcDamperTypeEnum.NOTDEFINED IfcDataOriginEnum = enum_namespace() -measured = express_getattr(IfcDataOriginEnum, 'MEASURED', INDETERMINATE) -predicted = express_getattr(IfcDataOriginEnum, 'PREDICTED', INDETERMINATE) -simulated = express_getattr(IfcDataOriginEnum, 'SIMULATED', INDETERMINATE) -userdefined = express_getattr(IfcDataOriginEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDataOriginEnum, 'NOTDEFINED', INDETERMINATE) +measured = IfcDataOriginEnum.MEASURED +predicted = IfcDataOriginEnum.PREDICTED +simulated = IfcDataOriginEnum.SIMULATED +userdefined = IfcDataOriginEnum.USERDEFINED +notdefined = IfcDataOriginEnum.NOTDEFINED IfcDerivedUnitEnum = enum_namespace() -angularvelocityunit = express_getattr(IfcDerivedUnitEnum, 'ANGULARVELOCITYUNIT', INDETERMINATE) -compoundplaneangleunit = express_getattr(IfcDerivedUnitEnum, 'COMPOUNDPLANEANGLEUNIT', INDETERMINATE) -dynamicviscosityunit = express_getattr(IfcDerivedUnitEnum, 'DYNAMICVISCOSITYUNIT', INDETERMINATE) -heatfluxdensityunit = express_getattr(IfcDerivedUnitEnum, 'HEATFLUXDENSITYUNIT', INDETERMINATE) -integercountrateunit = express_getattr(IfcDerivedUnitEnum, 'INTEGERCOUNTRATEUNIT', INDETERMINATE) -isothermalmoisturecapacityunit = express_getattr(IfcDerivedUnitEnum, 'ISOTHERMALMOISTURECAPACITYUNIT', INDETERMINATE) -kinematicviscosityunit = express_getattr(IfcDerivedUnitEnum, 'KINEMATICVISCOSITYUNIT', INDETERMINATE) -linearvelocityunit = express_getattr(IfcDerivedUnitEnum, 'LINEARVELOCITYUNIT', INDETERMINATE) -massdensityunit = express_getattr(IfcDerivedUnitEnum, 'MASSDENSITYUNIT', INDETERMINATE) -massflowrateunit = express_getattr(IfcDerivedUnitEnum, 'MASSFLOWRATEUNIT', INDETERMINATE) -moisturediffusivityunit = express_getattr(IfcDerivedUnitEnum, 'MOISTUREDIFFUSIVITYUNIT', INDETERMINATE) -molecularweightunit = express_getattr(IfcDerivedUnitEnum, 'MOLECULARWEIGHTUNIT', INDETERMINATE) -specificheatcapacityunit = express_getattr(IfcDerivedUnitEnum, 'SPECIFICHEATCAPACITYUNIT', INDETERMINATE) -thermaladmittanceunit = express_getattr(IfcDerivedUnitEnum, 'THERMALADMITTANCEUNIT', INDETERMINATE) -thermalconductanceunit = express_getattr(IfcDerivedUnitEnum, 'THERMALCONDUCTANCEUNIT', INDETERMINATE) -thermalresistanceunit = express_getattr(IfcDerivedUnitEnum, 'THERMALRESISTANCEUNIT', INDETERMINATE) -thermaltransmittanceunit = express_getattr(IfcDerivedUnitEnum, 'THERMALTRANSMITTANCEUNIT', INDETERMINATE) -vaporpermeabilityunit = express_getattr(IfcDerivedUnitEnum, 'VAPORPERMEABILITYUNIT', INDETERMINATE) -volumetricflowrateunit = express_getattr(IfcDerivedUnitEnum, 'VOLUMETRICFLOWRATEUNIT', INDETERMINATE) -rotationalfrequencyunit = express_getattr(IfcDerivedUnitEnum, 'ROTATIONALFREQUENCYUNIT', INDETERMINATE) -torqueunit = express_getattr(IfcDerivedUnitEnum, 'TORQUEUNIT', INDETERMINATE) -momentofinertiaunit = express_getattr(IfcDerivedUnitEnum, 'MOMENTOFINERTIAUNIT', INDETERMINATE) -linearmomentunit = express_getattr(IfcDerivedUnitEnum, 'LINEARMOMENTUNIT', INDETERMINATE) -linearforceunit = express_getattr(IfcDerivedUnitEnum, 'LINEARFORCEUNIT', INDETERMINATE) -planarforceunit = express_getattr(IfcDerivedUnitEnum, 'PLANARFORCEUNIT', INDETERMINATE) -modulusofelasticityunit = express_getattr(IfcDerivedUnitEnum, 'MODULUSOFELASTICITYUNIT', INDETERMINATE) -shearmodulusunit = express_getattr(IfcDerivedUnitEnum, 'SHEARMODULUSUNIT', INDETERMINATE) -linearstiffnessunit = express_getattr(IfcDerivedUnitEnum, 'LINEARSTIFFNESSUNIT', INDETERMINATE) -rotationalstiffnessunit = express_getattr(IfcDerivedUnitEnum, 'ROTATIONALSTIFFNESSUNIT', INDETERMINATE) -modulusofsubgradereactionunit = express_getattr(IfcDerivedUnitEnum, 'MODULUSOFSUBGRADEREACTIONUNIT', INDETERMINATE) -accelerationunit = express_getattr(IfcDerivedUnitEnum, 'ACCELERATIONUNIT', INDETERMINATE) -curvatureunit = express_getattr(IfcDerivedUnitEnum, 'CURVATUREUNIT', INDETERMINATE) -heatingvalueunit = express_getattr(IfcDerivedUnitEnum, 'HEATINGVALUEUNIT', INDETERMINATE) -ionconcentrationunit = express_getattr(IfcDerivedUnitEnum, 'IONCONCENTRATIONUNIT', INDETERMINATE) -luminousintensitydistributionunit = express_getattr(IfcDerivedUnitEnum, 'LUMINOUSINTENSITYDISTRIBUTIONUNIT', INDETERMINATE) -massperlengthunit = express_getattr(IfcDerivedUnitEnum, 'MASSPERLENGTHUNIT', INDETERMINATE) -modulusoflinearsubgradereactionunit = express_getattr(IfcDerivedUnitEnum, 'MODULUSOFLINEARSUBGRADEREACTIONUNIT', INDETERMINATE) -modulusofrotationalsubgradereactionunit = express_getattr(IfcDerivedUnitEnum, 'MODULUSOFROTATIONALSUBGRADEREACTIONUNIT', INDETERMINATE) -phunit = express_getattr(IfcDerivedUnitEnum, 'PHUNIT', INDETERMINATE) -rotationalmassunit = express_getattr(IfcDerivedUnitEnum, 'ROTATIONALMASSUNIT', INDETERMINATE) -sectionareaintegralunit = express_getattr(IfcDerivedUnitEnum, 'SECTIONAREAINTEGRALUNIT', INDETERMINATE) -sectionmodulusunit = express_getattr(IfcDerivedUnitEnum, 'SECTIONMODULUSUNIT', INDETERMINATE) -soundpowerunit = express_getattr(IfcDerivedUnitEnum, 'SOUNDPOWERUNIT', INDETERMINATE) -soundpressureunit = express_getattr(IfcDerivedUnitEnum, 'SOUNDPRESSUREUNIT', INDETERMINATE) -temperaturegradientunit = express_getattr(IfcDerivedUnitEnum, 'TEMPERATUREGRADIENTUNIT', INDETERMINATE) -thermalexpansioncoefficientunit = express_getattr(IfcDerivedUnitEnum, 'THERMALEXPANSIONCOEFFICIENTUNIT', INDETERMINATE) -warpingconstantunit = express_getattr(IfcDerivedUnitEnum, 'WARPINGCONSTANTUNIT', INDETERMINATE) -warpingmomentunit = express_getattr(IfcDerivedUnitEnum, 'WARPINGMOMENTUNIT', INDETERMINATE) -userdefined = express_getattr(IfcDerivedUnitEnum, 'USERDEFINED', INDETERMINATE) +angularvelocityunit = IfcDerivedUnitEnum.ANGULARVELOCITYUNIT +compoundplaneangleunit = IfcDerivedUnitEnum.COMPOUNDPLANEANGLEUNIT +dynamicviscosityunit = IfcDerivedUnitEnum.DYNAMICVISCOSITYUNIT +heatfluxdensityunit = IfcDerivedUnitEnum.HEATFLUXDENSITYUNIT +integercountrateunit = IfcDerivedUnitEnum.INTEGERCOUNTRATEUNIT +isothermalmoisturecapacityunit = IfcDerivedUnitEnum.ISOTHERMALMOISTURECAPACITYUNIT +kinematicviscosityunit = IfcDerivedUnitEnum.KINEMATICVISCOSITYUNIT +linearvelocityunit = IfcDerivedUnitEnum.LINEARVELOCITYUNIT +massdensityunit = IfcDerivedUnitEnum.MASSDENSITYUNIT +massflowrateunit = IfcDerivedUnitEnum.MASSFLOWRATEUNIT +moisturediffusivityunit = IfcDerivedUnitEnum.MOISTUREDIFFUSIVITYUNIT +molecularweightunit = IfcDerivedUnitEnum.MOLECULARWEIGHTUNIT +specificheatcapacityunit = IfcDerivedUnitEnum.SPECIFICHEATCAPACITYUNIT +thermaladmittanceunit = IfcDerivedUnitEnum.THERMALADMITTANCEUNIT +thermalconductanceunit = IfcDerivedUnitEnum.THERMALCONDUCTANCEUNIT +thermalresistanceunit = IfcDerivedUnitEnum.THERMALRESISTANCEUNIT +thermaltransmittanceunit = IfcDerivedUnitEnum.THERMALTRANSMITTANCEUNIT +vaporpermeabilityunit = IfcDerivedUnitEnum.VAPORPERMEABILITYUNIT +volumetricflowrateunit = IfcDerivedUnitEnum.VOLUMETRICFLOWRATEUNIT +rotationalfrequencyunit = IfcDerivedUnitEnum.ROTATIONALFREQUENCYUNIT +torqueunit = IfcDerivedUnitEnum.TORQUEUNIT +momentofinertiaunit = IfcDerivedUnitEnum.MOMENTOFINERTIAUNIT +linearmomentunit = IfcDerivedUnitEnum.LINEARMOMENTUNIT +linearforceunit = IfcDerivedUnitEnum.LINEARFORCEUNIT +planarforceunit = IfcDerivedUnitEnum.PLANARFORCEUNIT +modulusofelasticityunit = IfcDerivedUnitEnum.MODULUSOFELASTICITYUNIT +shearmodulusunit = IfcDerivedUnitEnum.SHEARMODULUSUNIT +linearstiffnessunit = IfcDerivedUnitEnum.LINEARSTIFFNESSUNIT +rotationalstiffnessunit = IfcDerivedUnitEnum.ROTATIONALSTIFFNESSUNIT +modulusofsubgradereactionunit = IfcDerivedUnitEnum.MODULUSOFSUBGRADEREACTIONUNIT +accelerationunit = IfcDerivedUnitEnum.ACCELERATIONUNIT +curvatureunit = IfcDerivedUnitEnum.CURVATUREUNIT +heatingvalueunit = IfcDerivedUnitEnum.HEATINGVALUEUNIT +ionconcentrationunit = IfcDerivedUnitEnum.IONCONCENTRATIONUNIT +luminousintensitydistributionunit = IfcDerivedUnitEnum.LUMINOUSINTENSITYDISTRIBUTIONUNIT +massperlengthunit = IfcDerivedUnitEnum.MASSPERLENGTHUNIT +modulusoflinearsubgradereactionunit = IfcDerivedUnitEnum.MODULUSOFLINEARSUBGRADEREACTIONUNIT +modulusofrotationalsubgradereactionunit = IfcDerivedUnitEnum.MODULUSOFROTATIONALSUBGRADEREACTIONUNIT +phunit = IfcDerivedUnitEnum.PHUNIT +rotationalmassunit = IfcDerivedUnitEnum.ROTATIONALMASSUNIT +sectionareaintegralunit = IfcDerivedUnitEnum.SECTIONAREAINTEGRALUNIT +sectionmodulusunit = IfcDerivedUnitEnum.SECTIONMODULUSUNIT +soundpowerunit = IfcDerivedUnitEnum.SOUNDPOWERUNIT +soundpressureunit = IfcDerivedUnitEnum.SOUNDPRESSUREUNIT +temperaturegradientunit = IfcDerivedUnitEnum.TEMPERATUREGRADIENTUNIT +thermalexpansioncoefficientunit = IfcDerivedUnitEnum.THERMALEXPANSIONCOEFFICIENTUNIT +warpingconstantunit = IfcDerivedUnitEnum.WARPINGCONSTANTUNIT +warpingmomentunit = IfcDerivedUnitEnum.WARPINGMOMENTUNIT +userdefined = IfcDerivedUnitEnum.USERDEFINED IfcDimensionExtentUsage = enum_namespace() -origin = express_getattr(IfcDimensionExtentUsage, 'ORIGIN', INDETERMINATE) -target = express_getattr(IfcDimensionExtentUsage, 'TARGET', INDETERMINATE) +origin = IfcDimensionExtentUsage.ORIGIN +target = IfcDimensionExtentUsage.TARGET IfcDirectionSenseEnum = enum_namespace() -positive = express_getattr(IfcDirectionSenseEnum, 'POSITIVE', INDETERMINATE) -negative = express_getattr(IfcDirectionSenseEnum, 'NEGATIVE', INDETERMINATE) +positive = IfcDirectionSenseEnum.POSITIVE +negative = IfcDirectionSenseEnum.NEGATIVE IfcDistributionChamberElementTypeEnum = enum_namespace() -formedduct = express_getattr(IfcDistributionChamberElementTypeEnum, 'FORMEDDUCT', INDETERMINATE) -inspectionchamber = express_getattr(IfcDistributionChamberElementTypeEnum, 'INSPECTIONCHAMBER', INDETERMINATE) -inspectionpit = express_getattr(IfcDistributionChamberElementTypeEnum, 'INSPECTIONPIT', INDETERMINATE) -manhole = express_getattr(IfcDistributionChamberElementTypeEnum, 'MANHOLE', INDETERMINATE) -meterchamber = express_getattr(IfcDistributionChamberElementTypeEnum, 'METERCHAMBER', INDETERMINATE) -sump = express_getattr(IfcDistributionChamberElementTypeEnum, 'SUMP', INDETERMINATE) -trench = express_getattr(IfcDistributionChamberElementTypeEnum, 'TRENCH', INDETERMINATE) -valvechamber = express_getattr(IfcDistributionChamberElementTypeEnum, 'VALVECHAMBER', INDETERMINATE) -userdefined = express_getattr(IfcDistributionChamberElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDistributionChamberElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +formedduct = IfcDistributionChamberElementTypeEnum.FORMEDDUCT +inspectionchamber = IfcDistributionChamberElementTypeEnum.INSPECTIONCHAMBER +inspectionpit = IfcDistributionChamberElementTypeEnum.INSPECTIONPIT +manhole = IfcDistributionChamberElementTypeEnum.MANHOLE +meterchamber = IfcDistributionChamberElementTypeEnum.METERCHAMBER +sump = IfcDistributionChamberElementTypeEnum.SUMP +trench = IfcDistributionChamberElementTypeEnum.TRENCH +valvechamber = IfcDistributionChamberElementTypeEnum.VALVECHAMBER +userdefined = IfcDistributionChamberElementTypeEnum.USERDEFINED +notdefined = IfcDistributionChamberElementTypeEnum.NOTDEFINED IfcDocumentConfidentialityEnum = enum_namespace() -public = express_getattr(IfcDocumentConfidentialityEnum, 'PUBLIC', INDETERMINATE) -restricted = express_getattr(IfcDocumentConfidentialityEnum, 'RESTRICTED', INDETERMINATE) -confidential = express_getattr(IfcDocumentConfidentialityEnum, 'CONFIDENTIAL', INDETERMINATE) -personal = express_getattr(IfcDocumentConfidentialityEnum, 'PERSONAL', INDETERMINATE) -userdefined = express_getattr(IfcDocumentConfidentialityEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDocumentConfidentialityEnum, 'NOTDEFINED', INDETERMINATE) +public = IfcDocumentConfidentialityEnum.PUBLIC +restricted = IfcDocumentConfidentialityEnum.RESTRICTED +confidential = IfcDocumentConfidentialityEnum.CONFIDENTIAL +personal = IfcDocumentConfidentialityEnum.PERSONAL +userdefined = IfcDocumentConfidentialityEnum.USERDEFINED +notdefined = IfcDocumentConfidentialityEnum.NOTDEFINED IfcDocumentStatusEnum = enum_namespace() -draft = express_getattr(IfcDocumentStatusEnum, 'DRAFT', INDETERMINATE) -finaldraft = express_getattr(IfcDocumentStatusEnum, 'FINALDRAFT', INDETERMINATE) -final = express_getattr(IfcDocumentStatusEnum, 'FINAL', INDETERMINATE) -revision = express_getattr(IfcDocumentStatusEnum, 'REVISION', INDETERMINATE) -notdefined = express_getattr(IfcDocumentStatusEnum, 'NOTDEFINED', INDETERMINATE) +draft = IfcDocumentStatusEnum.DRAFT +finaldraft = IfcDocumentStatusEnum.FINALDRAFT +final = IfcDocumentStatusEnum.FINAL +revision = IfcDocumentStatusEnum.REVISION +notdefined = IfcDocumentStatusEnum.NOTDEFINED IfcDoorPanelOperationEnum = enum_namespace() -swinging = express_getattr(IfcDoorPanelOperationEnum, 'SWINGING', INDETERMINATE) -double_acting = express_getattr(IfcDoorPanelOperationEnum, 'DOUBLE_ACTING', INDETERMINATE) -sliding = express_getattr(IfcDoorPanelOperationEnum, 'SLIDING', INDETERMINATE) -folding = express_getattr(IfcDoorPanelOperationEnum, 'FOLDING', INDETERMINATE) -revolving = express_getattr(IfcDoorPanelOperationEnum, 'REVOLVING', INDETERMINATE) -rollingup = express_getattr(IfcDoorPanelOperationEnum, 'ROLLINGUP', INDETERMINATE) -userdefined = express_getattr(IfcDoorPanelOperationEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDoorPanelOperationEnum, 'NOTDEFINED', INDETERMINATE) +swinging = IfcDoorPanelOperationEnum.SWINGING +double_acting = IfcDoorPanelOperationEnum.DOUBLE_ACTING +sliding = IfcDoorPanelOperationEnum.SLIDING +folding = IfcDoorPanelOperationEnum.FOLDING +revolving = IfcDoorPanelOperationEnum.REVOLVING +rollingup = IfcDoorPanelOperationEnum.ROLLINGUP +userdefined = IfcDoorPanelOperationEnum.USERDEFINED +notdefined = IfcDoorPanelOperationEnum.NOTDEFINED IfcDoorPanelPositionEnum = enum_namespace() -left = express_getattr(IfcDoorPanelPositionEnum, 'LEFT', INDETERMINATE) -middle = express_getattr(IfcDoorPanelPositionEnum, 'MIDDLE', INDETERMINATE) -right = express_getattr(IfcDoorPanelPositionEnum, 'RIGHT', INDETERMINATE) -notdefined = express_getattr(IfcDoorPanelPositionEnum, 'NOTDEFINED', INDETERMINATE) +left = IfcDoorPanelPositionEnum.LEFT +middle = IfcDoorPanelPositionEnum.MIDDLE +right = IfcDoorPanelPositionEnum.RIGHT +notdefined = IfcDoorPanelPositionEnum.NOTDEFINED IfcDoorStyleConstructionEnum = enum_namespace() -aluminium = express_getattr(IfcDoorStyleConstructionEnum, 'ALUMINIUM', INDETERMINATE) -high_grade_steel = express_getattr(IfcDoorStyleConstructionEnum, 'HIGH_GRADE_STEEL', INDETERMINATE) -steel = express_getattr(IfcDoorStyleConstructionEnum, 'STEEL', INDETERMINATE) -wood = express_getattr(IfcDoorStyleConstructionEnum, 'WOOD', INDETERMINATE) -aluminium_wood = express_getattr(IfcDoorStyleConstructionEnum, 'ALUMINIUM_WOOD', INDETERMINATE) -aluminium_plastic = express_getattr(IfcDoorStyleConstructionEnum, 'ALUMINIUM_PLASTIC', INDETERMINATE) -plastic = express_getattr(IfcDoorStyleConstructionEnum, 'PLASTIC', INDETERMINATE) -userdefined = express_getattr(IfcDoorStyleConstructionEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDoorStyleConstructionEnum, 'NOTDEFINED', INDETERMINATE) +aluminium = IfcDoorStyleConstructionEnum.ALUMINIUM +high_grade_steel = IfcDoorStyleConstructionEnum.HIGH_GRADE_STEEL +steel = IfcDoorStyleConstructionEnum.STEEL +wood = IfcDoorStyleConstructionEnum.WOOD +aluminium_wood = IfcDoorStyleConstructionEnum.ALUMINIUM_WOOD +aluminium_plastic = IfcDoorStyleConstructionEnum.ALUMINIUM_PLASTIC +plastic = IfcDoorStyleConstructionEnum.PLASTIC +userdefined = IfcDoorStyleConstructionEnum.USERDEFINED +notdefined = IfcDoorStyleConstructionEnum.NOTDEFINED IfcDoorStyleOperationEnum = enum_namespace() -single_swing_left = express_getattr(IfcDoorStyleOperationEnum, 'SINGLE_SWING_LEFT', INDETERMINATE) -single_swing_right = express_getattr(IfcDoorStyleOperationEnum, 'SINGLE_SWING_RIGHT', INDETERMINATE) -double_door_single_swing = express_getattr(IfcDoorStyleOperationEnum, 'DOUBLE_DOOR_SINGLE_SWING', INDETERMINATE) -double_door_single_swing_opposite_left = express_getattr(IfcDoorStyleOperationEnum, 'DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_LEFT', INDETERMINATE) -double_door_single_swing_opposite_right = express_getattr(IfcDoorStyleOperationEnum, 'DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_RIGHT', INDETERMINATE) -double_swing_left = express_getattr(IfcDoorStyleOperationEnum, 'DOUBLE_SWING_LEFT', INDETERMINATE) -double_swing_right = express_getattr(IfcDoorStyleOperationEnum, 'DOUBLE_SWING_RIGHT', INDETERMINATE) -double_door_double_swing = express_getattr(IfcDoorStyleOperationEnum, 'DOUBLE_DOOR_DOUBLE_SWING', INDETERMINATE) -sliding_to_left = express_getattr(IfcDoorStyleOperationEnum, 'SLIDING_TO_LEFT', INDETERMINATE) -sliding_to_right = express_getattr(IfcDoorStyleOperationEnum, 'SLIDING_TO_RIGHT', INDETERMINATE) -double_door_sliding = express_getattr(IfcDoorStyleOperationEnum, 'DOUBLE_DOOR_SLIDING', INDETERMINATE) -folding_to_left = express_getattr(IfcDoorStyleOperationEnum, 'FOLDING_TO_LEFT', INDETERMINATE) -folding_to_right = express_getattr(IfcDoorStyleOperationEnum, 'FOLDING_TO_RIGHT', INDETERMINATE) -double_door_folding = express_getattr(IfcDoorStyleOperationEnum, 'DOUBLE_DOOR_FOLDING', INDETERMINATE) -revolving = express_getattr(IfcDoorStyleOperationEnum, 'REVOLVING', INDETERMINATE) -rollingup = express_getattr(IfcDoorStyleOperationEnum, 'ROLLINGUP', INDETERMINATE) -userdefined = express_getattr(IfcDoorStyleOperationEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDoorStyleOperationEnum, 'NOTDEFINED', INDETERMINATE) +single_swing_left = IfcDoorStyleOperationEnum.SINGLE_SWING_LEFT +single_swing_right = IfcDoorStyleOperationEnum.SINGLE_SWING_RIGHT +double_door_single_swing = IfcDoorStyleOperationEnum.DOUBLE_DOOR_SINGLE_SWING +double_door_single_swing_opposite_left = IfcDoorStyleOperationEnum.DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_LEFT +double_door_single_swing_opposite_right = IfcDoorStyleOperationEnum.DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_RIGHT +double_swing_left = IfcDoorStyleOperationEnum.DOUBLE_SWING_LEFT +double_swing_right = IfcDoorStyleOperationEnum.DOUBLE_SWING_RIGHT +double_door_double_swing = IfcDoorStyleOperationEnum.DOUBLE_DOOR_DOUBLE_SWING +sliding_to_left = IfcDoorStyleOperationEnum.SLIDING_TO_LEFT +sliding_to_right = IfcDoorStyleOperationEnum.SLIDING_TO_RIGHT +double_door_sliding = IfcDoorStyleOperationEnum.DOUBLE_DOOR_SLIDING +folding_to_left = IfcDoorStyleOperationEnum.FOLDING_TO_LEFT +folding_to_right = IfcDoorStyleOperationEnum.FOLDING_TO_RIGHT +double_door_folding = IfcDoorStyleOperationEnum.DOUBLE_DOOR_FOLDING +revolving = IfcDoorStyleOperationEnum.REVOLVING +rollingup = IfcDoorStyleOperationEnum.ROLLINGUP +userdefined = IfcDoorStyleOperationEnum.USERDEFINED +notdefined = IfcDoorStyleOperationEnum.NOTDEFINED IfcDuctFittingTypeEnum = enum_namespace() -bend = express_getattr(IfcDuctFittingTypeEnum, 'BEND', INDETERMINATE) -connector = express_getattr(IfcDuctFittingTypeEnum, 'CONNECTOR', INDETERMINATE) -entry = express_getattr(IfcDuctFittingTypeEnum, 'ENTRY', INDETERMINATE) -exit = express_getattr(IfcDuctFittingTypeEnum, 'EXIT', INDETERMINATE) -junction = express_getattr(IfcDuctFittingTypeEnum, 'JUNCTION', INDETERMINATE) -obstruction = express_getattr(IfcDuctFittingTypeEnum, 'OBSTRUCTION', INDETERMINATE) -transition = express_getattr(IfcDuctFittingTypeEnum, 'TRANSITION', INDETERMINATE) -userdefined = express_getattr(IfcDuctFittingTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDuctFittingTypeEnum, 'NOTDEFINED', INDETERMINATE) +bend = IfcDuctFittingTypeEnum.BEND +connector = IfcDuctFittingTypeEnum.CONNECTOR +entry = IfcDuctFittingTypeEnum.ENTRY +exit = IfcDuctFittingTypeEnum.EXIT +junction = IfcDuctFittingTypeEnum.JUNCTION +obstruction = IfcDuctFittingTypeEnum.OBSTRUCTION +transition = IfcDuctFittingTypeEnum.TRANSITION +userdefined = IfcDuctFittingTypeEnum.USERDEFINED +notdefined = IfcDuctFittingTypeEnum.NOTDEFINED IfcDuctSegmentTypeEnum = enum_namespace() -rigidsegment = express_getattr(IfcDuctSegmentTypeEnum, 'RIGIDSEGMENT', INDETERMINATE) -flexiblesegment = express_getattr(IfcDuctSegmentTypeEnum, 'FLEXIBLESEGMENT', INDETERMINATE) -userdefined = express_getattr(IfcDuctSegmentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDuctSegmentTypeEnum, 'NOTDEFINED', INDETERMINATE) +rigidsegment = IfcDuctSegmentTypeEnum.RIGIDSEGMENT +flexiblesegment = IfcDuctSegmentTypeEnum.FLEXIBLESEGMENT +userdefined = IfcDuctSegmentTypeEnum.USERDEFINED +notdefined = IfcDuctSegmentTypeEnum.NOTDEFINED IfcDuctSilencerTypeEnum = enum_namespace() -flatoval = express_getattr(IfcDuctSilencerTypeEnum, 'FLATOVAL', INDETERMINATE) -rectangular = express_getattr(IfcDuctSilencerTypeEnum, 'RECTANGULAR', INDETERMINATE) -round = express_getattr(IfcDuctSilencerTypeEnum, 'ROUND', INDETERMINATE) -userdefined = express_getattr(IfcDuctSilencerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDuctSilencerTypeEnum, 'NOTDEFINED', INDETERMINATE) +flatoval = IfcDuctSilencerTypeEnum.FLATOVAL +rectangular = IfcDuctSilencerTypeEnum.RECTANGULAR +round = IfcDuctSilencerTypeEnum.ROUND +userdefined = IfcDuctSilencerTypeEnum.USERDEFINED +notdefined = IfcDuctSilencerTypeEnum.NOTDEFINED IfcElectricApplianceTypeEnum = enum_namespace() -computer = express_getattr(IfcElectricApplianceTypeEnum, 'COMPUTER', INDETERMINATE) -directwaterheater = express_getattr(IfcElectricApplianceTypeEnum, 'DIRECTWATERHEATER', INDETERMINATE) -dishwasher = express_getattr(IfcElectricApplianceTypeEnum, 'DISHWASHER', INDETERMINATE) -electriccooker = express_getattr(IfcElectricApplianceTypeEnum, 'ELECTRICCOOKER', INDETERMINATE) -electricheater = express_getattr(IfcElectricApplianceTypeEnum, 'ELECTRICHEATER', INDETERMINATE) -facsimile = express_getattr(IfcElectricApplianceTypeEnum, 'FACSIMILE', INDETERMINATE) -freestandingfan = express_getattr(IfcElectricApplianceTypeEnum, 'FREESTANDINGFAN', INDETERMINATE) -freezer = express_getattr(IfcElectricApplianceTypeEnum, 'FREEZER', INDETERMINATE) -fridge_freezer = express_getattr(IfcElectricApplianceTypeEnum, 'FRIDGE_FREEZER', INDETERMINATE) -handdryer = express_getattr(IfcElectricApplianceTypeEnum, 'HANDDRYER', INDETERMINATE) -indirectwaterheater = express_getattr(IfcElectricApplianceTypeEnum, 'INDIRECTWATERHEATER', INDETERMINATE) -microwave = express_getattr(IfcElectricApplianceTypeEnum, 'MICROWAVE', INDETERMINATE) -photocopier = express_getattr(IfcElectricApplianceTypeEnum, 'PHOTOCOPIER', INDETERMINATE) -printer = express_getattr(IfcElectricApplianceTypeEnum, 'PRINTER', INDETERMINATE) -refrigerator = express_getattr(IfcElectricApplianceTypeEnum, 'REFRIGERATOR', INDETERMINATE) -radiantheater = express_getattr(IfcElectricApplianceTypeEnum, 'RADIANTHEATER', INDETERMINATE) -scanner = express_getattr(IfcElectricApplianceTypeEnum, 'SCANNER', INDETERMINATE) -telephone = express_getattr(IfcElectricApplianceTypeEnum, 'TELEPHONE', INDETERMINATE) -tumbledryer = express_getattr(IfcElectricApplianceTypeEnum, 'TUMBLEDRYER', INDETERMINATE) -tv = express_getattr(IfcElectricApplianceTypeEnum, 'TV', INDETERMINATE) -vendingmachine = express_getattr(IfcElectricApplianceTypeEnum, 'VENDINGMACHINE', INDETERMINATE) -washingmachine = express_getattr(IfcElectricApplianceTypeEnum, 'WASHINGMACHINE', INDETERMINATE) -waterheater = express_getattr(IfcElectricApplianceTypeEnum, 'WATERHEATER', INDETERMINATE) -watercooler = express_getattr(IfcElectricApplianceTypeEnum, 'WATERCOOLER', INDETERMINATE) -userdefined = express_getattr(IfcElectricApplianceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcElectricApplianceTypeEnum, 'NOTDEFINED', INDETERMINATE) +computer = IfcElectricApplianceTypeEnum.COMPUTER +directwaterheater = IfcElectricApplianceTypeEnum.DIRECTWATERHEATER +dishwasher = IfcElectricApplianceTypeEnum.DISHWASHER +electriccooker = IfcElectricApplianceTypeEnum.ELECTRICCOOKER +electricheater = IfcElectricApplianceTypeEnum.ELECTRICHEATER +facsimile = IfcElectricApplianceTypeEnum.FACSIMILE +freestandingfan = IfcElectricApplianceTypeEnum.FREESTANDINGFAN +freezer = IfcElectricApplianceTypeEnum.FREEZER +fridge_freezer = IfcElectricApplianceTypeEnum.FRIDGE_FREEZER +handdryer = IfcElectricApplianceTypeEnum.HANDDRYER +indirectwaterheater = IfcElectricApplianceTypeEnum.INDIRECTWATERHEATER +microwave = IfcElectricApplianceTypeEnum.MICROWAVE +photocopier = IfcElectricApplianceTypeEnum.PHOTOCOPIER +printer = IfcElectricApplianceTypeEnum.PRINTER +refrigerator = IfcElectricApplianceTypeEnum.REFRIGERATOR +radiantheater = IfcElectricApplianceTypeEnum.RADIANTHEATER +scanner = IfcElectricApplianceTypeEnum.SCANNER +telephone = IfcElectricApplianceTypeEnum.TELEPHONE +tumbledryer = IfcElectricApplianceTypeEnum.TUMBLEDRYER +tv = IfcElectricApplianceTypeEnum.TV +vendingmachine = IfcElectricApplianceTypeEnum.VENDINGMACHINE +washingmachine = IfcElectricApplianceTypeEnum.WASHINGMACHINE +waterheater = IfcElectricApplianceTypeEnum.WATERHEATER +watercooler = IfcElectricApplianceTypeEnum.WATERCOOLER +userdefined = IfcElectricApplianceTypeEnum.USERDEFINED +notdefined = IfcElectricApplianceTypeEnum.NOTDEFINED IfcElectricCurrentEnum = enum_namespace() -alternating = express_getattr(IfcElectricCurrentEnum, 'ALTERNATING', INDETERMINATE) -direct = express_getattr(IfcElectricCurrentEnum, 'DIRECT', INDETERMINATE) -notdefined = express_getattr(IfcElectricCurrentEnum, 'NOTDEFINED', INDETERMINATE) +alternating = IfcElectricCurrentEnum.ALTERNATING +direct = IfcElectricCurrentEnum.DIRECT +notdefined = IfcElectricCurrentEnum.NOTDEFINED IfcElectricDistributionPointFunctionEnum = enum_namespace() -alarmpanel = express_getattr(IfcElectricDistributionPointFunctionEnum, 'ALARMPANEL', INDETERMINATE) -consumerunit = express_getattr(IfcElectricDistributionPointFunctionEnum, 'CONSUMERUNIT', INDETERMINATE) -controlpanel = express_getattr(IfcElectricDistributionPointFunctionEnum, 'CONTROLPANEL', INDETERMINATE) -distributionboard = express_getattr(IfcElectricDistributionPointFunctionEnum, 'DISTRIBUTIONBOARD', INDETERMINATE) -gasdetectorpanel = express_getattr(IfcElectricDistributionPointFunctionEnum, 'GASDETECTORPANEL', INDETERMINATE) -indicatorpanel = express_getattr(IfcElectricDistributionPointFunctionEnum, 'INDICATORPANEL', INDETERMINATE) -mimicpanel = express_getattr(IfcElectricDistributionPointFunctionEnum, 'MIMICPANEL', INDETERMINATE) -motorcontrolcentre = express_getattr(IfcElectricDistributionPointFunctionEnum, 'MOTORCONTROLCENTRE', INDETERMINATE) -switchboard = express_getattr(IfcElectricDistributionPointFunctionEnum, 'SWITCHBOARD', INDETERMINATE) -userdefined = express_getattr(IfcElectricDistributionPointFunctionEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcElectricDistributionPointFunctionEnum, 'NOTDEFINED', INDETERMINATE) +alarmpanel = IfcElectricDistributionPointFunctionEnum.ALARMPANEL +consumerunit = IfcElectricDistributionPointFunctionEnum.CONSUMERUNIT +controlpanel = IfcElectricDistributionPointFunctionEnum.CONTROLPANEL +distributionboard = IfcElectricDistributionPointFunctionEnum.DISTRIBUTIONBOARD +gasdetectorpanel = IfcElectricDistributionPointFunctionEnum.GASDETECTORPANEL +indicatorpanel = IfcElectricDistributionPointFunctionEnum.INDICATORPANEL +mimicpanel = IfcElectricDistributionPointFunctionEnum.MIMICPANEL +motorcontrolcentre = IfcElectricDistributionPointFunctionEnum.MOTORCONTROLCENTRE +switchboard = IfcElectricDistributionPointFunctionEnum.SWITCHBOARD +userdefined = IfcElectricDistributionPointFunctionEnum.USERDEFINED +notdefined = IfcElectricDistributionPointFunctionEnum.NOTDEFINED IfcElectricFlowStorageDeviceTypeEnum = enum_namespace() -battery = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'BATTERY', INDETERMINATE) -capacitorbank = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'CAPACITORBANK', INDETERMINATE) -harmonicfilter = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'HARMONICFILTER', INDETERMINATE) -inductorbank = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'INDUCTORBANK', INDETERMINATE) -ups = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'UPS', INDETERMINATE) -userdefined = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'NOTDEFINED', INDETERMINATE) +battery = IfcElectricFlowStorageDeviceTypeEnum.BATTERY +capacitorbank = IfcElectricFlowStorageDeviceTypeEnum.CAPACITORBANK +harmonicfilter = IfcElectricFlowStorageDeviceTypeEnum.HARMONICFILTER +inductorbank = IfcElectricFlowStorageDeviceTypeEnum.INDUCTORBANK +ups = IfcElectricFlowStorageDeviceTypeEnum.UPS +userdefined = IfcElectricFlowStorageDeviceTypeEnum.USERDEFINED +notdefined = IfcElectricFlowStorageDeviceTypeEnum.NOTDEFINED IfcElectricGeneratorTypeEnum = enum_namespace() -userdefined = express_getattr(IfcElectricGeneratorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcElectricGeneratorTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcElectricGeneratorTypeEnum.USERDEFINED +notdefined = IfcElectricGeneratorTypeEnum.NOTDEFINED IfcElectricHeaterTypeEnum = enum_namespace() -electricpointheater = express_getattr(IfcElectricHeaterTypeEnum, 'ELECTRICPOINTHEATER', INDETERMINATE) -electriccableheater = express_getattr(IfcElectricHeaterTypeEnum, 'ELECTRICCABLEHEATER', INDETERMINATE) -electricmatheater = express_getattr(IfcElectricHeaterTypeEnum, 'ELECTRICMATHEATER', INDETERMINATE) -userdefined = express_getattr(IfcElectricHeaterTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcElectricHeaterTypeEnum, 'NOTDEFINED', INDETERMINATE) +electricpointheater = IfcElectricHeaterTypeEnum.ELECTRICPOINTHEATER +electriccableheater = IfcElectricHeaterTypeEnum.ELECTRICCABLEHEATER +electricmatheater = IfcElectricHeaterTypeEnum.ELECTRICMATHEATER +userdefined = IfcElectricHeaterTypeEnum.USERDEFINED +notdefined = IfcElectricHeaterTypeEnum.NOTDEFINED IfcElectricMotorTypeEnum = enum_namespace() -dc = express_getattr(IfcElectricMotorTypeEnum, 'DC', INDETERMINATE) -induction = express_getattr(IfcElectricMotorTypeEnum, 'INDUCTION', INDETERMINATE) -polyphase = express_getattr(IfcElectricMotorTypeEnum, 'POLYPHASE', INDETERMINATE) -reluctancesynchronous = express_getattr(IfcElectricMotorTypeEnum, 'RELUCTANCESYNCHRONOUS', INDETERMINATE) -synchronous = express_getattr(IfcElectricMotorTypeEnum, 'SYNCHRONOUS', INDETERMINATE) -userdefined = express_getattr(IfcElectricMotorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcElectricMotorTypeEnum, 'NOTDEFINED', INDETERMINATE) +dc = IfcElectricMotorTypeEnum.DC +induction = IfcElectricMotorTypeEnum.INDUCTION +polyphase = IfcElectricMotorTypeEnum.POLYPHASE +reluctancesynchronous = IfcElectricMotorTypeEnum.RELUCTANCESYNCHRONOUS +synchronous = IfcElectricMotorTypeEnum.SYNCHRONOUS +userdefined = IfcElectricMotorTypeEnum.USERDEFINED +notdefined = IfcElectricMotorTypeEnum.NOTDEFINED IfcElectricTimeControlTypeEnum = enum_namespace() -timeclock = express_getattr(IfcElectricTimeControlTypeEnum, 'TIMECLOCK', INDETERMINATE) -timedelay = express_getattr(IfcElectricTimeControlTypeEnum, 'TIMEDELAY', INDETERMINATE) -relay = express_getattr(IfcElectricTimeControlTypeEnum, 'RELAY', INDETERMINATE) -userdefined = express_getattr(IfcElectricTimeControlTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcElectricTimeControlTypeEnum, 'NOTDEFINED', INDETERMINATE) +timeclock = IfcElectricTimeControlTypeEnum.TIMECLOCK +timedelay = IfcElectricTimeControlTypeEnum.TIMEDELAY +relay = IfcElectricTimeControlTypeEnum.RELAY +userdefined = IfcElectricTimeControlTypeEnum.USERDEFINED +notdefined = IfcElectricTimeControlTypeEnum.NOTDEFINED IfcElementAssemblyTypeEnum = enum_namespace() -accessory_assembly = express_getattr(IfcElementAssemblyTypeEnum, 'ACCESSORY_ASSEMBLY', INDETERMINATE) -arch = express_getattr(IfcElementAssemblyTypeEnum, 'ARCH', INDETERMINATE) -beam_grid = express_getattr(IfcElementAssemblyTypeEnum, 'BEAM_GRID', INDETERMINATE) -braced_frame = express_getattr(IfcElementAssemblyTypeEnum, 'BRACED_FRAME', INDETERMINATE) -girder = express_getattr(IfcElementAssemblyTypeEnum, 'GIRDER', INDETERMINATE) -reinforcement_unit = express_getattr(IfcElementAssemblyTypeEnum, 'REINFORCEMENT_UNIT', INDETERMINATE) -rigid_frame = express_getattr(IfcElementAssemblyTypeEnum, 'RIGID_FRAME', INDETERMINATE) -slab_field = express_getattr(IfcElementAssemblyTypeEnum, 'SLAB_FIELD', INDETERMINATE) -truss = express_getattr(IfcElementAssemblyTypeEnum, 'TRUSS', INDETERMINATE) -userdefined = express_getattr(IfcElementAssemblyTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcElementAssemblyTypeEnum, 'NOTDEFINED', INDETERMINATE) +accessory_assembly = IfcElementAssemblyTypeEnum.ACCESSORY_ASSEMBLY +arch = IfcElementAssemblyTypeEnum.ARCH +beam_grid = IfcElementAssemblyTypeEnum.BEAM_GRID +braced_frame = IfcElementAssemblyTypeEnum.BRACED_FRAME +girder = IfcElementAssemblyTypeEnum.GIRDER +reinforcement_unit = IfcElementAssemblyTypeEnum.REINFORCEMENT_UNIT +rigid_frame = IfcElementAssemblyTypeEnum.RIGID_FRAME +slab_field = IfcElementAssemblyTypeEnum.SLAB_FIELD +truss = IfcElementAssemblyTypeEnum.TRUSS +userdefined = IfcElementAssemblyTypeEnum.USERDEFINED +notdefined = IfcElementAssemblyTypeEnum.NOTDEFINED IfcElementCompositionEnum = enum_namespace() -complex = express_getattr(IfcElementCompositionEnum, 'COMPLEX', INDETERMINATE) -element = express_getattr(IfcElementCompositionEnum, 'ELEMENT', INDETERMINATE) -partial = express_getattr(IfcElementCompositionEnum, 'PARTIAL', INDETERMINATE) +complex = IfcElementCompositionEnum.COMPLEX +element = IfcElementCompositionEnum.ELEMENT +partial = IfcElementCompositionEnum.PARTIAL IfcEnergySequenceEnum = enum_namespace() -primary = express_getattr(IfcEnergySequenceEnum, 'PRIMARY', INDETERMINATE) -secondary = express_getattr(IfcEnergySequenceEnum, 'SECONDARY', INDETERMINATE) -tertiary = express_getattr(IfcEnergySequenceEnum, 'TERTIARY', INDETERMINATE) -auxiliary = express_getattr(IfcEnergySequenceEnum, 'AUXILIARY', INDETERMINATE) -userdefined = express_getattr(IfcEnergySequenceEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcEnergySequenceEnum, 'NOTDEFINED', INDETERMINATE) +primary = IfcEnergySequenceEnum.PRIMARY +secondary = IfcEnergySequenceEnum.SECONDARY +tertiary = IfcEnergySequenceEnum.TERTIARY +auxiliary = IfcEnergySequenceEnum.AUXILIARY +userdefined = IfcEnergySequenceEnum.USERDEFINED +notdefined = IfcEnergySequenceEnum.NOTDEFINED IfcEnvironmentalImpactCategoryEnum = enum_namespace() -combinedvalue = express_getattr(IfcEnvironmentalImpactCategoryEnum, 'COMBINEDVALUE', INDETERMINATE) -disposal = express_getattr(IfcEnvironmentalImpactCategoryEnum, 'DISPOSAL', INDETERMINATE) -extraction = express_getattr(IfcEnvironmentalImpactCategoryEnum, 'EXTRACTION', INDETERMINATE) -installation = express_getattr(IfcEnvironmentalImpactCategoryEnum, 'INSTALLATION', INDETERMINATE) -manufacture = express_getattr(IfcEnvironmentalImpactCategoryEnum, 'MANUFACTURE', INDETERMINATE) -transportation = express_getattr(IfcEnvironmentalImpactCategoryEnum, 'TRANSPORTATION', INDETERMINATE) -userdefined = express_getattr(IfcEnvironmentalImpactCategoryEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcEnvironmentalImpactCategoryEnum, 'NOTDEFINED', INDETERMINATE) +combinedvalue = IfcEnvironmentalImpactCategoryEnum.COMBINEDVALUE +disposal = IfcEnvironmentalImpactCategoryEnum.DISPOSAL +extraction = IfcEnvironmentalImpactCategoryEnum.EXTRACTION +installation = IfcEnvironmentalImpactCategoryEnum.INSTALLATION +manufacture = IfcEnvironmentalImpactCategoryEnum.MANUFACTURE +transportation = IfcEnvironmentalImpactCategoryEnum.TRANSPORTATION +userdefined = IfcEnvironmentalImpactCategoryEnum.USERDEFINED +notdefined = IfcEnvironmentalImpactCategoryEnum.NOTDEFINED IfcEvaporativeCoolerTypeEnum = enum_namespace() -directevaporativerandommediaaircooler = express_getattr(IfcEvaporativeCoolerTypeEnum, 'DIRECTEVAPORATIVERANDOMMEDIAAIRCOOLER', INDETERMINATE) -directevaporativerigidmediaaircooler = express_getattr(IfcEvaporativeCoolerTypeEnum, 'DIRECTEVAPORATIVERIGIDMEDIAAIRCOOLER', INDETERMINATE) -directevaporativeslingerspackagedaircooler = express_getattr(IfcEvaporativeCoolerTypeEnum, 'DIRECTEVAPORATIVESLINGERSPACKAGEDAIRCOOLER', INDETERMINATE) -directevaporativepackagedrotaryaircooler = express_getattr(IfcEvaporativeCoolerTypeEnum, 'DIRECTEVAPORATIVEPACKAGEDROTARYAIRCOOLER', INDETERMINATE) -directevaporativeairwasher = express_getattr(IfcEvaporativeCoolerTypeEnum, 'DIRECTEVAPORATIVEAIRWASHER', INDETERMINATE) -indirectevaporativepackageaircooler = express_getattr(IfcEvaporativeCoolerTypeEnum, 'INDIRECTEVAPORATIVEPACKAGEAIRCOOLER', INDETERMINATE) -indirectevaporativewetcoil = express_getattr(IfcEvaporativeCoolerTypeEnum, 'INDIRECTEVAPORATIVEWETCOIL', INDETERMINATE) -indirectevaporativecoolingtowerorcoilcooler = express_getattr(IfcEvaporativeCoolerTypeEnum, 'INDIRECTEVAPORATIVECOOLINGTOWERORCOILCOOLER', INDETERMINATE) -indirectdirectcombination = express_getattr(IfcEvaporativeCoolerTypeEnum, 'INDIRECTDIRECTCOMBINATION', INDETERMINATE) -userdefined = express_getattr(IfcEvaporativeCoolerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcEvaporativeCoolerTypeEnum, 'NOTDEFINED', INDETERMINATE) +directevaporativerandommediaaircooler = IfcEvaporativeCoolerTypeEnum.DIRECTEVAPORATIVERANDOMMEDIAAIRCOOLER +directevaporativerigidmediaaircooler = IfcEvaporativeCoolerTypeEnum.DIRECTEVAPORATIVERIGIDMEDIAAIRCOOLER +directevaporativeslingerspackagedaircooler = IfcEvaporativeCoolerTypeEnum.DIRECTEVAPORATIVESLINGERSPACKAGEDAIRCOOLER +directevaporativepackagedrotaryaircooler = IfcEvaporativeCoolerTypeEnum.DIRECTEVAPORATIVEPACKAGEDROTARYAIRCOOLER +directevaporativeairwasher = IfcEvaporativeCoolerTypeEnum.DIRECTEVAPORATIVEAIRWASHER +indirectevaporativepackageaircooler = IfcEvaporativeCoolerTypeEnum.INDIRECTEVAPORATIVEPACKAGEAIRCOOLER +indirectevaporativewetcoil = IfcEvaporativeCoolerTypeEnum.INDIRECTEVAPORATIVEWETCOIL +indirectevaporativecoolingtowerorcoilcooler = IfcEvaporativeCoolerTypeEnum.INDIRECTEVAPORATIVECOOLINGTOWERORCOILCOOLER +indirectdirectcombination = IfcEvaporativeCoolerTypeEnum.INDIRECTDIRECTCOMBINATION +userdefined = IfcEvaporativeCoolerTypeEnum.USERDEFINED +notdefined = IfcEvaporativeCoolerTypeEnum.NOTDEFINED IfcEvaporatorTypeEnum = enum_namespace() -directexpansionshellandtube = express_getattr(IfcEvaporatorTypeEnum, 'DIRECTEXPANSIONSHELLANDTUBE', INDETERMINATE) -directexpansiontubeintube = express_getattr(IfcEvaporatorTypeEnum, 'DIRECTEXPANSIONTUBEINTUBE', INDETERMINATE) -directexpansionbrazedplate = express_getattr(IfcEvaporatorTypeEnum, 'DIRECTEXPANSIONBRAZEDPLATE', INDETERMINATE) -floodedshellandtube = express_getattr(IfcEvaporatorTypeEnum, 'FLOODEDSHELLANDTUBE', INDETERMINATE) -shellandcoil = express_getattr(IfcEvaporatorTypeEnum, 'SHELLANDCOIL', INDETERMINATE) -userdefined = express_getattr(IfcEvaporatorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcEvaporatorTypeEnum, 'NOTDEFINED', INDETERMINATE) +directexpansionshellandtube = IfcEvaporatorTypeEnum.DIRECTEXPANSIONSHELLANDTUBE +directexpansiontubeintube = IfcEvaporatorTypeEnum.DIRECTEXPANSIONTUBEINTUBE +directexpansionbrazedplate = IfcEvaporatorTypeEnum.DIRECTEXPANSIONBRAZEDPLATE +floodedshellandtube = IfcEvaporatorTypeEnum.FLOODEDSHELLANDTUBE +shellandcoil = IfcEvaporatorTypeEnum.SHELLANDCOIL +userdefined = IfcEvaporatorTypeEnum.USERDEFINED +notdefined = IfcEvaporatorTypeEnum.NOTDEFINED IfcFanTypeEnum = enum_namespace() -centrifugalforwardcurved = express_getattr(IfcFanTypeEnum, 'CENTRIFUGALFORWARDCURVED', INDETERMINATE) -centrifugalradial = express_getattr(IfcFanTypeEnum, 'CENTRIFUGALRADIAL', INDETERMINATE) -centrifugalbackwardinclinedcurved = express_getattr(IfcFanTypeEnum, 'CENTRIFUGALBACKWARDINCLINEDCURVED', INDETERMINATE) -centrifugalairfoil = express_getattr(IfcFanTypeEnum, 'CENTRIFUGALAIRFOIL', INDETERMINATE) -tubeaxial = express_getattr(IfcFanTypeEnum, 'TUBEAXIAL', INDETERMINATE) -vaneaxial = express_getattr(IfcFanTypeEnum, 'VANEAXIAL', INDETERMINATE) -propelloraxial = express_getattr(IfcFanTypeEnum, 'PROPELLORAXIAL', INDETERMINATE) -userdefined = express_getattr(IfcFanTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFanTypeEnum, 'NOTDEFINED', INDETERMINATE) +centrifugalforwardcurved = IfcFanTypeEnum.CENTRIFUGALFORWARDCURVED +centrifugalradial = IfcFanTypeEnum.CENTRIFUGALRADIAL +centrifugalbackwardinclinedcurved = IfcFanTypeEnum.CENTRIFUGALBACKWARDINCLINEDCURVED +centrifugalairfoil = IfcFanTypeEnum.CENTRIFUGALAIRFOIL +tubeaxial = IfcFanTypeEnum.TUBEAXIAL +vaneaxial = IfcFanTypeEnum.VANEAXIAL +propelloraxial = IfcFanTypeEnum.PROPELLORAXIAL +userdefined = IfcFanTypeEnum.USERDEFINED +notdefined = IfcFanTypeEnum.NOTDEFINED IfcFilterTypeEnum = enum_namespace() -airparticlefilter = express_getattr(IfcFilterTypeEnum, 'AIRPARTICLEFILTER', INDETERMINATE) -odorfilter = express_getattr(IfcFilterTypeEnum, 'ODORFILTER', INDETERMINATE) -oilfilter = express_getattr(IfcFilterTypeEnum, 'OILFILTER', INDETERMINATE) -strainer = express_getattr(IfcFilterTypeEnum, 'STRAINER', INDETERMINATE) -waterfilter = express_getattr(IfcFilterTypeEnum, 'WATERFILTER', INDETERMINATE) -userdefined = express_getattr(IfcFilterTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFilterTypeEnum, 'NOTDEFINED', INDETERMINATE) +airparticlefilter = IfcFilterTypeEnum.AIRPARTICLEFILTER +odorfilter = IfcFilterTypeEnum.ODORFILTER +oilfilter = IfcFilterTypeEnum.OILFILTER +strainer = IfcFilterTypeEnum.STRAINER +waterfilter = IfcFilterTypeEnum.WATERFILTER +userdefined = IfcFilterTypeEnum.USERDEFINED +notdefined = IfcFilterTypeEnum.NOTDEFINED IfcFireSuppressionTerminalTypeEnum = enum_namespace() -breechinginlet = express_getattr(IfcFireSuppressionTerminalTypeEnum, 'BREECHINGINLET', INDETERMINATE) -firehydrant = express_getattr(IfcFireSuppressionTerminalTypeEnum, 'FIREHYDRANT', INDETERMINATE) -hosereel = express_getattr(IfcFireSuppressionTerminalTypeEnum, 'HOSEREEL', INDETERMINATE) -sprinkler = express_getattr(IfcFireSuppressionTerminalTypeEnum, 'SPRINKLER', INDETERMINATE) -sprinklerdeflector = express_getattr(IfcFireSuppressionTerminalTypeEnum, 'SPRINKLERDEFLECTOR', INDETERMINATE) -userdefined = express_getattr(IfcFireSuppressionTerminalTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFireSuppressionTerminalTypeEnum, 'NOTDEFINED', INDETERMINATE) +breechinginlet = IfcFireSuppressionTerminalTypeEnum.BREECHINGINLET +firehydrant = IfcFireSuppressionTerminalTypeEnum.FIREHYDRANT +hosereel = IfcFireSuppressionTerminalTypeEnum.HOSEREEL +sprinkler = IfcFireSuppressionTerminalTypeEnum.SPRINKLER +sprinklerdeflector = IfcFireSuppressionTerminalTypeEnum.SPRINKLERDEFLECTOR +userdefined = IfcFireSuppressionTerminalTypeEnum.USERDEFINED +notdefined = IfcFireSuppressionTerminalTypeEnum.NOTDEFINED IfcFlowDirectionEnum = enum_namespace() -source = express_getattr(IfcFlowDirectionEnum, 'SOURCE', INDETERMINATE) -sink = express_getattr(IfcFlowDirectionEnum, 'SINK', INDETERMINATE) -sourceandsink = express_getattr(IfcFlowDirectionEnum, 'SOURCEANDSINK', INDETERMINATE) -notdefined = express_getattr(IfcFlowDirectionEnum, 'NOTDEFINED', INDETERMINATE) +source = IfcFlowDirectionEnum.SOURCE +sink = IfcFlowDirectionEnum.SINK +sourceandsink = IfcFlowDirectionEnum.SOURCEANDSINK +notdefined = IfcFlowDirectionEnum.NOTDEFINED IfcFlowInstrumentTypeEnum = enum_namespace() -pressuregauge = express_getattr(IfcFlowInstrumentTypeEnum, 'PRESSUREGAUGE', INDETERMINATE) -thermometer = express_getattr(IfcFlowInstrumentTypeEnum, 'THERMOMETER', INDETERMINATE) -ammeter = express_getattr(IfcFlowInstrumentTypeEnum, 'AMMETER', INDETERMINATE) -frequencymeter = express_getattr(IfcFlowInstrumentTypeEnum, 'FREQUENCYMETER', INDETERMINATE) -powerfactormeter = express_getattr(IfcFlowInstrumentTypeEnum, 'POWERFACTORMETER', INDETERMINATE) -phaseanglemeter = express_getattr(IfcFlowInstrumentTypeEnum, 'PHASEANGLEMETER', INDETERMINATE) -voltmeter_peak = express_getattr(IfcFlowInstrumentTypeEnum, 'VOLTMETER_PEAK', INDETERMINATE) -voltmeter_rms = express_getattr(IfcFlowInstrumentTypeEnum, 'VOLTMETER_RMS', INDETERMINATE) -userdefined = express_getattr(IfcFlowInstrumentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFlowInstrumentTypeEnum, 'NOTDEFINED', INDETERMINATE) +pressuregauge = IfcFlowInstrumentTypeEnum.PRESSUREGAUGE +thermometer = IfcFlowInstrumentTypeEnum.THERMOMETER +ammeter = IfcFlowInstrumentTypeEnum.AMMETER +frequencymeter = IfcFlowInstrumentTypeEnum.FREQUENCYMETER +powerfactormeter = IfcFlowInstrumentTypeEnum.POWERFACTORMETER +phaseanglemeter = IfcFlowInstrumentTypeEnum.PHASEANGLEMETER +voltmeter_peak = IfcFlowInstrumentTypeEnum.VOLTMETER_PEAK +voltmeter_rms = IfcFlowInstrumentTypeEnum.VOLTMETER_RMS +userdefined = IfcFlowInstrumentTypeEnum.USERDEFINED +notdefined = IfcFlowInstrumentTypeEnum.NOTDEFINED IfcFlowMeterTypeEnum = enum_namespace() -electricmeter = express_getattr(IfcFlowMeterTypeEnum, 'ELECTRICMETER', INDETERMINATE) -energymeter = express_getattr(IfcFlowMeterTypeEnum, 'ENERGYMETER', INDETERMINATE) -flowmeter = express_getattr(IfcFlowMeterTypeEnum, 'FLOWMETER', INDETERMINATE) -gasmeter = express_getattr(IfcFlowMeterTypeEnum, 'GASMETER', INDETERMINATE) -oilmeter = express_getattr(IfcFlowMeterTypeEnum, 'OILMETER', INDETERMINATE) -watermeter = express_getattr(IfcFlowMeterTypeEnum, 'WATERMETER', INDETERMINATE) -userdefined = express_getattr(IfcFlowMeterTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFlowMeterTypeEnum, 'NOTDEFINED', INDETERMINATE) +electricmeter = IfcFlowMeterTypeEnum.ELECTRICMETER +energymeter = IfcFlowMeterTypeEnum.ENERGYMETER +flowmeter = IfcFlowMeterTypeEnum.FLOWMETER +gasmeter = IfcFlowMeterTypeEnum.GASMETER +oilmeter = IfcFlowMeterTypeEnum.OILMETER +watermeter = IfcFlowMeterTypeEnum.WATERMETER +userdefined = IfcFlowMeterTypeEnum.USERDEFINED +notdefined = IfcFlowMeterTypeEnum.NOTDEFINED IfcFootingTypeEnum = enum_namespace() -footing_beam = express_getattr(IfcFootingTypeEnum, 'FOOTING_BEAM', INDETERMINATE) -pad_footing = express_getattr(IfcFootingTypeEnum, 'PAD_FOOTING', INDETERMINATE) -pile_cap = express_getattr(IfcFootingTypeEnum, 'PILE_CAP', INDETERMINATE) -strip_footing = express_getattr(IfcFootingTypeEnum, 'STRIP_FOOTING', INDETERMINATE) -userdefined = express_getattr(IfcFootingTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFootingTypeEnum, 'NOTDEFINED', INDETERMINATE) +footing_beam = IfcFootingTypeEnum.FOOTING_BEAM +pad_footing = IfcFootingTypeEnum.PAD_FOOTING +pile_cap = IfcFootingTypeEnum.PILE_CAP +strip_footing = IfcFootingTypeEnum.STRIP_FOOTING +userdefined = IfcFootingTypeEnum.USERDEFINED +notdefined = IfcFootingTypeEnum.NOTDEFINED IfcGasTerminalTypeEnum = enum_namespace() -gasappliance = express_getattr(IfcGasTerminalTypeEnum, 'GASAPPLIANCE', INDETERMINATE) -gasbooster = express_getattr(IfcGasTerminalTypeEnum, 'GASBOOSTER', INDETERMINATE) -gasburner = express_getattr(IfcGasTerminalTypeEnum, 'GASBURNER', INDETERMINATE) -userdefined = express_getattr(IfcGasTerminalTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcGasTerminalTypeEnum, 'NOTDEFINED', INDETERMINATE) +gasappliance = IfcGasTerminalTypeEnum.GASAPPLIANCE +gasbooster = IfcGasTerminalTypeEnum.GASBOOSTER +gasburner = IfcGasTerminalTypeEnum.GASBURNER +userdefined = IfcGasTerminalTypeEnum.USERDEFINED +notdefined = IfcGasTerminalTypeEnum.NOTDEFINED IfcGeometricProjectionEnum = enum_namespace() -graph_view = express_getattr(IfcGeometricProjectionEnum, 'GRAPH_VIEW', INDETERMINATE) -sketch_view = express_getattr(IfcGeometricProjectionEnum, 'SKETCH_VIEW', INDETERMINATE) -model_view = express_getattr(IfcGeometricProjectionEnum, 'MODEL_VIEW', INDETERMINATE) -plan_view = express_getattr(IfcGeometricProjectionEnum, 'PLAN_VIEW', INDETERMINATE) -reflected_plan_view = express_getattr(IfcGeometricProjectionEnum, 'REFLECTED_PLAN_VIEW', INDETERMINATE) -section_view = express_getattr(IfcGeometricProjectionEnum, 'SECTION_VIEW', INDETERMINATE) -elevation_view = express_getattr(IfcGeometricProjectionEnum, 'ELEVATION_VIEW', INDETERMINATE) -userdefined = express_getattr(IfcGeometricProjectionEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcGeometricProjectionEnum, 'NOTDEFINED', INDETERMINATE) +graph_view = IfcGeometricProjectionEnum.GRAPH_VIEW +sketch_view = IfcGeometricProjectionEnum.SKETCH_VIEW +model_view = IfcGeometricProjectionEnum.MODEL_VIEW +plan_view = IfcGeometricProjectionEnum.PLAN_VIEW +reflected_plan_view = IfcGeometricProjectionEnum.REFLECTED_PLAN_VIEW +section_view = IfcGeometricProjectionEnum.SECTION_VIEW +elevation_view = IfcGeometricProjectionEnum.ELEVATION_VIEW +userdefined = IfcGeometricProjectionEnum.USERDEFINED +notdefined = IfcGeometricProjectionEnum.NOTDEFINED IfcGlobalOrLocalEnum = enum_namespace() -global_coords = express_getattr(IfcGlobalOrLocalEnum, 'GLOBAL_COORDS', INDETERMINATE) -local_coords = express_getattr(IfcGlobalOrLocalEnum, 'LOCAL_COORDS', INDETERMINATE) +global_coords = IfcGlobalOrLocalEnum.GLOBAL_COORDS +local_coords = IfcGlobalOrLocalEnum.LOCAL_COORDS IfcHeatExchangerTypeEnum = enum_namespace() -plate = express_getattr(IfcHeatExchangerTypeEnum, 'PLATE', INDETERMINATE) -shellandtube = express_getattr(IfcHeatExchangerTypeEnum, 'SHELLANDTUBE', INDETERMINATE) -userdefined = express_getattr(IfcHeatExchangerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcHeatExchangerTypeEnum, 'NOTDEFINED', INDETERMINATE) +plate = IfcHeatExchangerTypeEnum.PLATE +shellandtube = IfcHeatExchangerTypeEnum.SHELLANDTUBE +userdefined = IfcHeatExchangerTypeEnum.USERDEFINED +notdefined = IfcHeatExchangerTypeEnum.NOTDEFINED IfcHumidifierTypeEnum = enum_namespace() -steaminjection = express_getattr(IfcHumidifierTypeEnum, 'STEAMINJECTION', INDETERMINATE) -adiabaticairwasher = express_getattr(IfcHumidifierTypeEnum, 'ADIABATICAIRWASHER', INDETERMINATE) -adiabaticpan = express_getattr(IfcHumidifierTypeEnum, 'ADIABATICPAN', INDETERMINATE) -adiabaticwettedelement = express_getattr(IfcHumidifierTypeEnum, 'ADIABATICWETTEDELEMENT', INDETERMINATE) -adiabaticatomizing = express_getattr(IfcHumidifierTypeEnum, 'ADIABATICATOMIZING', INDETERMINATE) -adiabaticultrasonic = express_getattr(IfcHumidifierTypeEnum, 'ADIABATICULTRASONIC', INDETERMINATE) -adiabaticrigidmedia = express_getattr(IfcHumidifierTypeEnum, 'ADIABATICRIGIDMEDIA', INDETERMINATE) -adiabaticcompressedairnozzle = express_getattr(IfcHumidifierTypeEnum, 'ADIABATICCOMPRESSEDAIRNOZZLE', INDETERMINATE) -assistedelectric = express_getattr(IfcHumidifierTypeEnum, 'ASSISTEDELECTRIC', INDETERMINATE) -assistednaturalgas = express_getattr(IfcHumidifierTypeEnum, 'ASSISTEDNATURALGAS', INDETERMINATE) -assistedpropane = express_getattr(IfcHumidifierTypeEnum, 'ASSISTEDPROPANE', INDETERMINATE) -assistedbutane = express_getattr(IfcHumidifierTypeEnum, 'ASSISTEDBUTANE', INDETERMINATE) -assistedsteam = express_getattr(IfcHumidifierTypeEnum, 'ASSISTEDSTEAM', INDETERMINATE) -userdefined = express_getattr(IfcHumidifierTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcHumidifierTypeEnum, 'NOTDEFINED', INDETERMINATE) +steaminjection = IfcHumidifierTypeEnum.STEAMINJECTION +adiabaticairwasher = IfcHumidifierTypeEnum.ADIABATICAIRWASHER +adiabaticpan = IfcHumidifierTypeEnum.ADIABATICPAN +adiabaticwettedelement = IfcHumidifierTypeEnum.ADIABATICWETTEDELEMENT +adiabaticatomizing = IfcHumidifierTypeEnum.ADIABATICATOMIZING +adiabaticultrasonic = IfcHumidifierTypeEnum.ADIABATICULTRASONIC +adiabaticrigidmedia = IfcHumidifierTypeEnum.ADIABATICRIGIDMEDIA +adiabaticcompressedairnozzle = IfcHumidifierTypeEnum.ADIABATICCOMPRESSEDAIRNOZZLE +assistedelectric = IfcHumidifierTypeEnum.ASSISTEDELECTRIC +assistednaturalgas = IfcHumidifierTypeEnum.ASSISTEDNATURALGAS +assistedpropane = IfcHumidifierTypeEnum.ASSISTEDPROPANE +assistedbutane = IfcHumidifierTypeEnum.ASSISTEDBUTANE +assistedsteam = IfcHumidifierTypeEnum.ASSISTEDSTEAM +userdefined = IfcHumidifierTypeEnum.USERDEFINED +notdefined = IfcHumidifierTypeEnum.NOTDEFINED IfcInternalOrExternalEnum = enum_namespace() -internal = express_getattr(IfcInternalOrExternalEnum, 'INTERNAL', INDETERMINATE) -external = express_getattr(IfcInternalOrExternalEnum, 'EXTERNAL', INDETERMINATE) -notdefined = express_getattr(IfcInternalOrExternalEnum, 'NOTDEFINED', INDETERMINATE) +internal = IfcInternalOrExternalEnum.INTERNAL +external = IfcInternalOrExternalEnum.EXTERNAL +notdefined = IfcInternalOrExternalEnum.NOTDEFINED IfcInventoryTypeEnum = enum_namespace() -assetinventory = express_getattr(IfcInventoryTypeEnum, 'ASSETINVENTORY', INDETERMINATE) -spaceinventory = express_getattr(IfcInventoryTypeEnum, 'SPACEINVENTORY', INDETERMINATE) -furnitureinventory = express_getattr(IfcInventoryTypeEnum, 'FURNITUREINVENTORY', INDETERMINATE) -userdefined = express_getattr(IfcInventoryTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcInventoryTypeEnum, 'NOTDEFINED', INDETERMINATE) +assetinventory = IfcInventoryTypeEnum.ASSETINVENTORY +spaceinventory = IfcInventoryTypeEnum.SPACEINVENTORY +furnitureinventory = IfcInventoryTypeEnum.FURNITUREINVENTORY +userdefined = IfcInventoryTypeEnum.USERDEFINED +notdefined = IfcInventoryTypeEnum.NOTDEFINED IfcJunctionBoxTypeEnum = enum_namespace() -userdefined = express_getattr(IfcJunctionBoxTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcJunctionBoxTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcJunctionBoxTypeEnum.USERDEFINED +notdefined = IfcJunctionBoxTypeEnum.NOTDEFINED IfcLampTypeEnum = enum_namespace() -compactfluorescent = express_getattr(IfcLampTypeEnum, 'COMPACTFLUORESCENT', INDETERMINATE) -fluorescent = express_getattr(IfcLampTypeEnum, 'FLUORESCENT', INDETERMINATE) -highpressuremercury = express_getattr(IfcLampTypeEnum, 'HIGHPRESSUREMERCURY', INDETERMINATE) -highpressuresodium = express_getattr(IfcLampTypeEnum, 'HIGHPRESSURESODIUM', INDETERMINATE) -metalhalide = express_getattr(IfcLampTypeEnum, 'METALHALIDE', INDETERMINATE) -tungstenfilament = express_getattr(IfcLampTypeEnum, 'TUNGSTENFILAMENT', INDETERMINATE) -userdefined = express_getattr(IfcLampTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcLampTypeEnum, 'NOTDEFINED', INDETERMINATE) +compactfluorescent = IfcLampTypeEnum.COMPACTFLUORESCENT +fluorescent = IfcLampTypeEnum.FLUORESCENT +highpressuremercury = IfcLampTypeEnum.HIGHPRESSUREMERCURY +highpressuresodium = IfcLampTypeEnum.HIGHPRESSURESODIUM +metalhalide = IfcLampTypeEnum.METALHALIDE +tungstenfilament = IfcLampTypeEnum.TUNGSTENFILAMENT +userdefined = IfcLampTypeEnum.USERDEFINED +notdefined = IfcLampTypeEnum.NOTDEFINED IfcLayerSetDirectionEnum = enum_namespace() -axis1 = express_getattr(IfcLayerSetDirectionEnum, 'AXIS1', INDETERMINATE) -axis2 = express_getattr(IfcLayerSetDirectionEnum, 'AXIS2', INDETERMINATE) -axis3 = express_getattr(IfcLayerSetDirectionEnum, 'AXIS3', INDETERMINATE) +axis1 = IfcLayerSetDirectionEnum.AXIS1 +axis2 = IfcLayerSetDirectionEnum.AXIS2 +axis3 = IfcLayerSetDirectionEnum.AXIS3 IfcLightDistributionCurveEnum = enum_namespace() -type_a = express_getattr(IfcLightDistributionCurveEnum, 'TYPE_A', INDETERMINATE) -type_b = express_getattr(IfcLightDistributionCurveEnum, 'TYPE_B', INDETERMINATE) -type_c = express_getattr(IfcLightDistributionCurveEnum, 'TYPE_C', INDETERMINATE) -notdefined = express_getattr(IfcLightDistributionCurveEnum, 'NOTDEFINED', INDETERMINATE) +type_a = IfcLightDistributionCurveEnum.TYPE_A +type_b = IfcLightDistributionCurveEnum.TYPE_B +type_c = IfcLightDistributionCurveEnum.TYPE_C +notdefined = IfcLightDistributionCurveEnum.NOTDEFINED IfcLightEmissionSourceEnum = enum_namespace() -compactfluorescent = express_getattr(IfcLightEmissionSourceEnum, 'COMPACTFLUORESCENT', INDETERMINATE) -fluorescent = express_getattr(IfcLightEmissionSourceEnum, 'FLUORESCENT', INDETERMINATE) -highpressuremercury = express_getattr(IfcLightEmissionSourceEnum, 'HIGHPRESSUREMERCURY', INDETERMINATE) -highpressuresodium = express_getattr(IfcLightEmissionSourceEnum, 'HIGHPRESSURESODIUM', INDETERMINATE) -lightemittingdiode = express_getattr(IfcLightEmissionSourceEnum, 'LIGHTEMITTINGDIODE', INDETERMINATE) -lowpressuresodium = express_getattr(IfcLightEmissionSourceEnum, 'LOWPRESSURESODIUM', INDETERMINATE) -lowvoltagehalogen = express_getattr(IfcLightEmissionSourceEnum, 'LOWVOLTAGEHALOGEN', INDETERMINATE) -mainvoltagehalogen = express_getattr(IfcLightEmissionSourceEnum, 'MAINVOLTAGEHALOGEN', INDETERMINATE) -metalhalide = express_getattr(IfcLightEmissionSourceEnum, 'METALHALIDE', INDETERMINATE) -tungstenfilament = express_getattr(IfcLightEmissionSourceEnum, 'TUNGSTENFILAMENT', INDETERMINATE) -notdefined = express_getattr(IfcLightEmissionSourceEnum, 'NOTDEFINED', INDETERMINATE) +compactfluorescent = IfcLightEmissionSourceEnum.COMPACTFLUORESCENT +fluorescent = IfcLightEmissionSourceEnum.FLUORESCENT +highpressuremercury = IfcLightEmissionSourceEnum.HIGHPRESSUREMERCURY +highpressuresodium = IfcLightEmissionSourceEnum.HIGHPRESSURESODIUM +lightemittingdiode = IfcLightEmissionSourceEnum.LIGHTEMITTINGDIODE +lowpressuresodium = IfcLightEmissionSourceEnum.LOWPRESSURESODIUM +lowvoltagehalogen = IfcLightEmissionSourceEnum.LOWVOLTAGEHALOGEN +mainvoltagehalogen = IfcLightEmissionSourceEnum.MAINVOLTAGEHALOGEN +metalhalide = IfcLightEmissionSourceEnum.METALHALIDE +tungstenfilament = IfcLightEmissionSourceEnum.TUNGSTENFILAMENT +notdefined = IfcLightEmissionSourceEnum.NOTDEFINED IfcLightFixtureTypeEnum = enum_namespace() -pointsource = express_getattr(IfcLightFixtureTypeEnum, 'POINTSOURCE', INDETERMINATE) -directionsource = express_getattr(IfcLightFixtureTypeEnum, 'DIRECTIONSOURCE', INDETERMINATE) -userdefined = express_getattr(IfcLightFixtureTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcLightFixtureTypeEnum, 'NOTDEFINED', INDETERMINATE) +pointsource = IfcLightFixtureTypeEnum.POINTSOURCE +directionsource = IfcLightFixtureTypeEnum.DIRECTIONSOURCE +userdefined = IfcLightFixtureTypeEnum.USERDEFINED +notdefined = IfcLightFixtureTypeEnum.NOTDEFINED IfcLoadGroupTypeEnum = enum_namespace() -load_group = express_getattr(IfcLoadGroupTypeEnum, 'LOAD_GROUP', INDETERMINATE) -load_case = express_getattr(IfcLoadGroupTypeEnum, 'LOAD_CASE', INDETERMINATE) -load_combination_group = express_getattr(IfcLoadGroupTypeEnum, 'LOAD_COMBINATION_GROUP', INDETERMINATE) -load_combination = express_getattr(IfcLoadGroupTypeEnum, 'LOAD_COMBINATION', INDETERMINATE) -userdefined = express_getattr(IfcLoadGroupTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcLoadGroupTypeEnum, 'NOTDEFINED', INDETERMINATE) +load_group = IfcLoadGroupTypeEnum.LOAD_GROUP +load_case = IfcLoadGroupTypeEnum.LOAD_CASE +load_combination_group = IfcLoadGroupTypeEnum.LOAD_COMBINATION_GROUP +load_combination = IfcLoadGroupTypeEnum.LOAD_COMBINATION +userdefined = IfcLoadGroupTypeEnum.USERDEFINED +notdefined = IfcLoadGroupTypeEnum.NOTDEFINED IfcLogicalOperatorEnum = enum_namespace() -logicaland = express_getattr(IfcLogicalOperatorEnum, 'LOGICALAND', INDETERMINATE) -logicalor = express_getattr(IfcLogicalOperatorEnum, 'LOGICALOR', INDETERMINATE) +logicaland = IfcLogicalOperatorEnum.LOGICALAND +logicalor = IfcLogicalOperatorEnum.LOGICALOR IfcMemberTypeEnum = enum_namespace() -brace = express_getattr(IfcMemberTypeEnum, 'BRACE', INDETERMINATE) -chord = express_getattr(IfcMemberTypeEnum, 'CHORD', INDETERMINATE) -collar = express_getattr(IfcMemberTypeEnum, 'COLLAR', INDETERMINATE) -member = express_getattr(IfcMemberTypeEnum, 'MEMBER', INDETERMINATE) -mullion = express_getattr(IfcMemberTypeEnum, 'MULLION', INDETERMINATE) -plate = express_getattr(IfcMemberTypeEnum, 'PLATE', INDETERMINATE) -post = express_getattr(IfcMemberTypeEnum, 'POST', INDETERMINATE) -purlin = express_getattr(IfcMemberTypeEnum, 'PURLIN', INDETERMINATE) -rafter = express_getattr(IfcMemberTypeEnum, 'RAFTER', INDETERMINATE) -stringer = express_getattr(IfcMemberTypeEnum, 'STRINGER', INDETERMINATE) -strut = express_getattr(IfcMemberTypeEnum, 'STRUT', INDETERMINATE) -stud = express_getattr(IfcMemberTypeEnum, 'STUD', INDETERMINATE) -userdefined = express_getattr(IfcMemberTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcMemberTypeEnum, 'NOTDEFINED', INDETERMINATE) +brace = IfcMemberTypeEnum.BRACE +chord = IfcMemberTypeEnum.CHORD +collar = IfcMemberTypeEnum.COLLAR +member = IfcMemberTypeEnum.MEMBER +mullion = IfcMemberTypeEnum.MULLION +plate = IfcMemberTypeEnum.PLATE +post = IfcMemberTypeEnum.POST +purlin = IfcMemberTypeEnum.PURLIN +rafter = IfcMemberTypeEnum.RAFTER +stringer = IfcMemberTypeEnum.STRINGER +strut = IfcMemberTypeEnum.STRUT +stud = IfcMemberTypeEnum.STUD +userdefined = IfcMemberTypeEnum.USERDEFINED +notdefined = IfcMemberTypeEnum.NOTDEFINED IfcMotorConnectionTypeEnum = enum_namespace() -beltdrive = express_getattr(IfcMotorConnectionTypeEnum, 'BELTDRIVE', INDETERMINATE) -coupling = express_getattr(IfcMotorConnectionTypeEnum, 'COUPLING', INDETERMINATE) -directdrive = express_getattr(IfcMotorConnectionTypeEnum, 'DIRECTDRIVE', INDETERMINATE) -userdefined = express_getattr(IfcMotorConnectionTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcMotorConnectionTypeEnum, 'NOTDEFINED', INDETERMINATE) +beltdrive = IfcMotorConnectionTypeEnum.BELTDRIVE +coupling = IfcMotorConnectionTypeEnum.COUPLING +directdrive = IfcMotorConnectionTypeEnum.DIRECTDRIVE +userdefined = IfcMotorConnectionTypeEnum.USERDEFINED +notdefined = IfcMotorConnectionTypeEnum.NOTDEFINED IfcNullStyle = enum_namespace() -null = express_getattr(IfcNullStyle, 'NULL', INDETERMINATE) +null = IfcNullStyle.NULL IfcObjectTypeEnum = enum_namespace() -product = express_getattr(IfcObjectTypeEnum, 'PRODUCT', INDETERMINATE) -process = express_getattr(IfcObjectTypeEnum, 'PROCESS', INDETERMINATE) -control = express_getattr(IfcObjectTypeEnum, 'CONTROL', INDETERMINATE) -resource = express_getattr(IfcObjectTypeEnum, 'RESOURCE', INDETERMINATE) -actor = express_getattr(IfcObjectTypeEnum, 'ACTOR', INDETERMINATE) -group = express_getattr(IfcObjectTypeEnum, 'GROUP', INDETERMINATE) -project = express_getattr(IfcObjectTypeEnum, 'PROJECT', INDETERMINATE) -notdefined = express_getattr(IfcObjectTypeEnum, 'NOTDEFINED', INDETERMINATE) +product = IfcObjectTypeEnum.PRODUCT +process = IfcObjectTypeEnum.PROCESS +control = IfcObjectTypeEnum.CONTROL +resource = IfcObjectTypeEnum.RESOURCE +actor = IfcObjectTypeEnum.ACTOR +group = IfcObjectTypeEnum.GROUP +project = IfcObjectTypeEnum.PROJECT +notdefined = IfcObjectTypeEnum.NOTDEFINED IfcObjectiveEnum = enum_namespace() -codecompliance = express_getattr(IfcObjectiveEnum, 'CODECOMPLIANCE', INDETERMINATE) -designintent = express_getattr(IfcObjectiveEnum, 'DESIGNINTENT', INDETERMINATE) -healthandsafety = express_getattr(IfcObjectiveEnum, 'HEALTHANDSAFETY', INDETERMINATE) -requirement = express_getattr(IfcObjectiveEnum, 'REQUIREMENT', INDETERMINATE) -specification = express_getattr(IfcObjectiveEnum, 'SPECIFICATION', INDETERMINATE) -triggercondition = express_getattr(IfcObjectiveEnum, 'TRIGGERCONDITION', INDETERMINATE) -userdefined = express_getattr(IfcObjectiveEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcObjectiveEnum, 'NOTDEFINED', INDETERMINATE) +codecompliance = IfcObjectiveEnum.CODECOMPLIANCE +designintent = IfcObjectiveEnum.DESIGNINTENT +healthandsafety = IfcObjectiveEnum.HEALTHANDSAFETY +requirement = IfcObjectiveEnum.REQUIREMENT +specification = IfcObjectiveEnum.SPECIFICATION +triggercondition = IfcObjectiveEnum.TRIGGERCONDITION +userdefined = IfcObjectiveEnum.USERDEFINED +notdefined = IfcObjectiveEnum.NOTDEFINED IfcOccupantTypeEnum = enum_namespace() -assignee = express_getattr(IfcOccupantTypeEnum, 'ASSIGNEE', INDETERMINATE) -assignor = express_getattr(IfcOccupantTypeEnum, 'ASSIGNOR', INDETERMINATE) -lessee = express_getattr(IfcOccupantTypeEnum, 'LESSEE', INDETERMINATE) -lessor = express_getattr(IfcOccupantTypeEnum, 'LESSOR', INDETERMINATE) -lettingagent = express_getattr(IfcOccupantTypeEnum, 'LETTINGAGENT', INDETERMINATE) -owner = express_getattr(IfcOccupantTypeEnum, 'OWNER', INDETERMINATE) -tenant = express_getattr(IfcOccupantTypeEnum, 'TENANT', INDETERMINATE) -userdefined = express_getattr(IfcOccupantTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcOccupantTypeEnum, 'NOTDEFINED', INDETERMINATE) +assignee = IfcOccupantTypeEnum.ASSIGNEE +assignor = IfcOccupantTypeEnum.ASSIGNOR +lessee = IfcOccupantTypeEnum.LESSEE +lessor = IfcOccupantTypeEnum.LESSOR +lettingagent = IfcOccupantTypeEnum.LETTINGAGENT +owner = IfcOccupantTypeEnum.OWNER +tenant = IfcOccupantTypeEnum.TENANT +userdefined = IfcOccupantTypeEnum.USERDEFINED +notdefined = IfcOccupantTypeEnum.NOTDEFINED IfcOutletTypeEnum = enum_namespace() -audiovisualoutlet = express_getattr(IfcOutletTypeEnum, 'AUDIOVISUALOUTLET', INDETERMINATE) -communicationsoutlet = express_getattr(IfcOutletTypeEnum, 'COMMUNICATIONSOUTLET', INDETERMINATE) -poweroutlet = express_getattr(IfcOutletTypeEnum, 'POWEROUTLET', INDETERMINATE) -userdefined = express_getattr(IfcOutletTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcOutletTypeEnum, 'NOTDEFINED', INDETERMINATE) +audiovisualoutlet = IfcOutletTypeEnum.AUDIOVISUALOUTLET +communicationsoutlet = IfcOutletTypeEnum.COMMUNICATIONSOUTLET +poweroutlet = IfcOutletTypeEnum.POWEROUTLET +userdefined = IfcOutletTypeEnum.USERDEFINED +notdefined = IfcOutletTypeEnum.NOTDEFINED IfcPermeableCoveringOperationEnum = enum_namespace() -grill = express_getattr(IfcPermeableCoveringOperationEnum, 'GRILL', INDETERMINATE) -louver = express_getattr(IfcPermeableCoveringOperationEnum, 'LOUVER', INDETERMINATE) -screen = express_getattr(IfcPermeableCoveringOperationEnum, 'SCREEN', INDETERMINATE) -userdefined = express_getattr(IfcPermeableCoveringOperationEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPermeableCoveringOperationEnum, 'NOTDEFINED', INDETERMINATE) +grill = IfcPermeableCoveringOperationEnum.GRILL +louver = IfcPermeableCoveringOperationEnum.LOUVER +screen = IfcPermeableCoveringOperationEnum.SCREEN +userdefined = IfcPermeableCoveringOperationEnum.USERDEFINED +notdefined = IfcPermeableCoveringOperationEnum.NOTDEFINED IfcPhysicalOrVirtualEnum = enum_namespace() -physical = express_getattr(IfcPhysicalOrVirtualEnum, 'PHYSICAL', INDETERMINATE) -virtual = express_getattr(IfcPhysicalOrVirtualEnum, 'VIRTUAL', INDETERMINATE) -notdefined = express_getattr(IfcPhysicalOrVirtualEnum, 'NOTDEFINED', INDETERMINATE) +physical = IfcPhysicalOrVirtualEnum.PHYSICAL +virtual = IfcPhysicalOrVirtualEnum.VIRTUAL +notdefined = IfcPhysicalOrVirtualEnum.NOTDEFINED IfcPileConstructionEnum = enum_namespace() -cast_in_place = express_getattr(IfcPileConstructionEnum, 'CAST_IN_PLACE', INDETERMINATE) -composite = express_getattr(IfcPileConstructionEnum, 'COMPOSITE', INDETERMINATE) -precast_concrete = express_getattr(IfcPileConstructionEnum, 'PRECAST_CONCRETE', INDETERMINATE) -prefab_steel = express_getattr(IfcPileConstructionEnum, 'PREFAB_STEEL', INDETERMINATE) -userdefined = express_getattr(IfcPileConstructionEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPileConstructionEnum, 'NOTDEFINED', INDETERMINATE) +cast_in_place = IfcPileConstructionEnum.CAST_IN_PLACE +composite = IfcPileConstructionEnum.COMPOSITE +precast_concrete = IfcPileConstructionEnum.PRECAST_CONCRETE +prefab_steel = IfcPileConstructionEnum.PREFAB_STEEL +userdefined = IfcPileConstructionEnum.USERDEFINED +notdefined = IfcPileConstructionEnum.NOTDEFINED IfcPileTypeEnum = enum_namespace() -cohesion = express_getattr(IfcPileTypeEnum, 'COHESION', INDETERMINATE) -friction = express_getattr(IfcPileTypeEnum, 'FRICTION', INDETERMINATE) -support = express_getattr(IfcPileTypeEnum, 'SUPPORT', INDETERMINATE) -userdefined = express_getattr(IfcPileTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPileTypeEnum, 'NOTDEFINED', INDETERMINATE) +cohesion = IfcPileTypeEnum.COHESION +friction = IfcPileTypeEnum.FRICTION +support = IfcPileTypeEnum.SUPPORT +userdefined = IfcPileTypeEnum.USERDEFINED +notdefined = IfcPileTypeEnum.NOTDEFINED IfcPipeFittingTypeEnum = enum_namespace() -bend = express_getattr(IfcPipeFittingTypeEnum, 'BEND', INDETERMINATE) -connector = express_getattr(IfcPipeFittingTypeEnum, 'CONNECTOR', INDETERMINATE) -entry = express_getattr(IfcPipeFittingTypeEnum, 'ENTRY', INDETERMINATE) -exit = express_getattr(IfcPipeFittingTypeEnum, 'EXIT', INDETERMINATE) -junction = express_getattr(IfcPipeFittingTypeEnum, 'JUNCTION', INDETERMINATE) -obstruction = express_getattr(IfcPipeFittingTypeEnum, 'OBSTRUCTION', INDETERMINATE) -transition = express_getattr(IfcPipeFittingTypeEnum, 'TRANSITION', INDETERMINATE) -userdefined = express_getattr(IfcPipeFittingTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPipeFittingTypeEnum, 'NOTDEFINED', INDETERMINATE) +bend = IfcPipeFittingTypeEnum.BEND +connector = IfcPipeFittingTypeEnum.CONNECTOR +entry = IfcPipeFittingTypeEnum.ENTRY +exit = IfcPipeFittingTypeEnum.EXIT +junction = IfcPipeFittingTypeEnum.JUNCTION +obstruction = IfcPipeFittingTypeEnum.OBSTRUCTION +transition = IfcPipeFittingTypeEnum.TRANSITION +userdefined = IfcPipeFittingTypeEnum.USERDEFINED +notdefined = IfcPipeFittingTypeEnum.NOTDEFINED IfcPipeSegmentTypeEnum = enum_namespace() -flexiblesegment = express_getattr(IfcPipeSegmentTypeEnum, 'FLEXIBLESEGMENT', INDETERMINATE) -rigidsegment = express_getattr(IfcPipeSegmentTypeEnum, 'RIGIDSEGMENT', INDETERMINATE) -gutter = express_getattr(IfcPipeSegmentTypeEnum, 'GUTTER', INDETERMINATE) -spool = express_getattr(IfcPipeSegmentTypeEnum, 'SPOOL', INDETERMINATE) -userdefined = express_getattr(IfcPipeSegmentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPipeSegmentTypeEnum, 'NOTDEFINED', INDETERMINATE) +flexiblesegment = IfcPipeSegmentTypeEnum.FLEXIBLESEGMENT +rigidsegment = IfcPipeSegmentTypeEnum.RIGIDSEGMENT +gutter = IfcPipeSegmentTypeEnum.GUTTER +spool = IfcPipeSegmentTypeEnum.SPOOL +userdefined = IfcPipeSegmentTypeEnum.USERDEFINED +notdefined = IfcPipeSegmentTypeEnum.NOTDEFINED IfcPlateTypeEnum = enum_namespace() -curtain_panel = express_getattr(IfcPlateTypeEnum, 'CURTAIN_PANEL', INDETERMINATE) -sheet = express_getattr(IfcPlateTypeEnum, 'SHEET', INDETERMINATE) -userdefined = express_getattr(IfcPlateTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPlateTypeEnum, 'NOTDEFINED', INDETERMINATE) +curtain_panel = IfcPlateTypeEnum.CURTAIN_PANEL +sheet = IfcPlateTypeEnum.SHEET +userdefined = IfcPlateTypeEnum.USERDEFINED +notdefined = IfcPlateTypeEnum.NOTDEFINED IfcProcedureTypeEnum = enum_namespace() -advice_caution = express_getattr(IfcProcedureTypeEnum, 'ADVICE_CAUTION', INDETERMINATE) -advice_note = express_getattr(IfcProcedureTypeEnum, 'ADVICE_NOTE', INDETERMINATE) -advice_warning = express_getattr(IfcProcedureTypeEnum, 'ADVICE_WARNING', INDETERMINATE) -calibration = express_getattr(IfcProcedureTypeEnum, 'CALIBRATION', INDETERMINATE) -diagnostic = express_getattr(IfcProcedureTypeEnum, 'DIAGNOSTIC', INDETERMINATE) -shutdown = express_getattr(IfcProcedureTypeEnum, 'SHUTDOWN', INDETERMINATE) -startup = express_getattr(IfcProcedureTypeEnum, 'STARTUP', INDETERMINATE) -userdefined = express_getattr(IfcProcedureTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcProcedureTypeEnum, 'NOTDEFINED', INDETERMINATE) +advice_caution = IfcProcedureTypeEnum.ADVICE_CAUTION +advice_note = IfcProcedureTypeEnum.ADVICE_NOTE +advice_warning = IfcProcedureTypeEnum.ADVICE_WARNING +calibration = IfcProcedureTypeEnum.CALIBRATION +diagnostic = IfcProcedureTypeEnum.DIAGNOSTIC +shutdown = IfcProcedureTypeEnum.SHUTDOWN +startup = IfcProcedureTypeEnum.STARTUP +userdefined = IfcProcedureTypeEnum.USERDEFINED +notdefined = IfcProcedureTypeEnum.NOTDEFINED IfcProfileTypeEnum = enum_namespace() -curve = express_getattr(IfcProfileTypeEnum, 'CURVE', INDETERMINATE) -area = express_getattr(IfcProfileTypeEnum, 'AREA', INDETERMINATE) +curve = IfcProfileTypeEnum.CURVE +area = IfcProfileTypeEnum.AREA IfcProjectOrderRecordTypeEnum = enum_namespace() -change = express_getattr(IfcProjectOrderRecordTypeEnum, 'CHANGE', INDETERMINATE) -maintenance = express_getattr(IfcProjectOrderRecordTypeEnum, 'MAINTENANCE', INDETERMINATE) -move = express_getattr(IfcProjectOrderRecordTypeEnum, 'MOVE', INDETERMINATE) -purchase = express_getattr(IfcProjectOrderRecordTypeEnum, 'PURCHASE', INDETERMINATE) -work = express_getattr(IfcProjectOrderRecordTypeEnum, 'WORK', INDETERMINATE) -userdefined = express_getattr(IfcProjectOrderRecordTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcProjectOrderRecordTypeEnum, 'NOTDEFINED', INDETERMINATE) +change = IfcProjectOrderRecordTypeEnum.CHANGE +maintenance = IfcProjectOrderRecordTypeEnum.MAINTENANCE +move = IfcProjectOrderRecordTypeEnum.MOVE +purchase = IfcProjectOrderRecordTypeEnum.PURCHASE +work = IfcProjectOrderRecordTypeEnum.WORK +userdefined = IfcProjectOrderRecordTypeEnum.USERDEFINED +notdefined = IfcProjectOrderRecordTypeEnum.NOTDEFINED IfcProjectOrderTypeEnum = enum_namespace() -changeorder = express_getattr(IfcProjectOrderTypeEnum, 'CHANGEORDER', INDETERMINATE) -maintenanceworkorder = express_getattr(IfcProjectOrderTypeEnum, 'MAINTENANCEWORKORDER', INDETERMINATE) -moveorder = express_getattr(IfcProjectOrderTypeEnum, 'MOVEORDER', INDETERMINATE) -purchaseorder = express_getattr(IfcProjectOrderTypeEnum, 'PURCHASEORDER', INDETERMINATE) -workorder = express_getattr(IfcProjectOrderTypeEnum, 'WORKORDER', INDETERMINATE) -userdefined = express_getattr(IfcProjectOrderTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcProjectOrderTypeEnum, 'NOTDEFINED', INDETERMINATE) +changeorder = IfcProjectOrderTypeEnum.CHANGEORDER +maintenanceworkorder = IfcProjectOrderTypeEnum.MAINTENANCEWORKORDER +moveorder = IfcProjectOrderTypeEnum.MOVEORDER +purchaseorder = IfcProjectOrderTypeEnum.PURCHASEORDER +workorder = IfcProjectOrderTypeEnum.WORKORDER +userdefined = IfcProjectOrderTypeEnum.USERDEFINED +notdefined = IfcProjectOrderTypeEnum.NOTDEFINED IfcProjectedOrTrueLengthEnum = enum_namespace() -projected_length = express_getattr(IfcProjectedOrTrueLengthEnum, 'PROJECTED_LENGTH', INDETERMINATE) -true_length = express_getattr(IfcProjectedOrTrueLengthEnum, 'TRUE_LENGTH', INDETERMINATE) +projected_length = IfcProjectedOrTrueLengthEnum.PROJECTED_LENGTH +true_length = IfcProjectedOrTrueLengthEnum.TRUE_LENGTH IfcPropertySourceEnum = enum_namespace() -design = express_getattr(IfcPropertySourceEnum, 'DESIGN', INDETERMINATE) -designmaximum = express_getattr(IfcPropertySourceEnum, 'DESIGNMAXIMUM', INDETERMINATE) -designminimum = express_getattr(IfcPropertySourceEnum, 'DESIGNMINIMUM', INDETERMINATE) -simulated = express_getattr(IfcPropertySourceEnum, 'SIMULATED', INDETERMINATE) -asbuilt = express_getattr(IfcPropertySourceEnum, 'ASBUILT', INDETERMINATE) -commissioning = express_getattr(IfcPropertySourceEnum, 'COMMISSIONING', INDETERMINATE) -measured = express_getattr(IfcPropertySourceEnum, 'MEASURED', INDETERMINATE) -userdefined = express_getattr(IfcPropertySourceEnum, 'USERDEFINED', INDETERMINATE) -notknown = express_getattr(IfcPropertySourceEnum, 'NOTKNOWN', INDETERMINATE) +design = IfcPropertySourceEnum.DESIGN +designmaximum = IfcPropertySourceEnum.DESIGNMAXIMUM +designminimum = IfcPropertySourceEnum.DESIGNMINIMUM +simulated = IfcPropertySourceEnum.SIMULATED +asbuilt = IfcPropertySourceEnum.ASBUILT +commissioning = IfcPropertySourceEnum.COMMISSIONING +measured = IfcPropertySourceEnum.MEASURED +userdefined = IfcPropertySourceEnum.USERDEFINED +notknown = IfcPropertySourceEnum.NOTKNOWN IfcProtectiveDeviceTypeEnum = enum_namespace() -fusedisconnector = express_getattr(IfcProtectiveDeviceTypeEnum, 'FUSEDISCONNECTOR', INDETERMINATE) -circuitbreaker = express_getattr(IfcProtectiveDeviceTypeEnum, 'CIRCUITBREAKER', INDETERMINATE) -earthfailuredevice = express_getattr(IfcProtectiveDeviceTypeEnum, 'EARTHFAILUREDEVICE', INDETERMINATE) -residualcurrentcircuitbreaker = express_getattr(IfcProtectiveDeviceTypeEnum, 'RESIDUALCURRENTCIRCUITBREAKER', INDETERMINATE) -residualcurrentswitch = express_getattr(IfcProtectiveDeviceTypeEnum, 'RESIDUALCURRENTSWITCH', INDETERMINATE) -varistor = express_getattr(IfcProtectiveDeviceTypeEnum, 'VARISTOR', INDETERMINATE) -userdefined = express_getattr(IfcProtectiveDeviceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcProtectiveDeviceTypeEnum, 'NOTDEFINED', INDETERMINATE) +fusedisconnector = IfcProtectiveDeviceTypeEnum.FUSEDISCONNECTOR +circuitbreaker = IfcProtectiveDeviceTypeEnum.CIRCUITBREAKER +earthfailuredevice = IfcProtectiveDeviceTypeEnum.EARTHFAILUREDEVICE +residualcurrentcircuitbreaker = IfcProtectiveDeviceTypeEnum.RESIDUALCURRENTCIRCUITBREAKER +residualcurrentswitch = IfcProtectiveDeviceTypeEnum.RESIDUALCURRENTSWITCH +varistor = IfcProtectiveDeviceTypeEnum.VARISTOR +userdefined = IfcProtectiveDeviceTypeEnum.USERDEFINED +notdefined = IfcProtectiveDeviceTypeEnum.NOTDEFINED IfcPumpTypeEnum = enum_namespace() -circulator = express_getattr(IfcPumpTypeEnum, 'CIRCULATOR', INDETERMINATE) -endsuction = express_getattr(IfcPumpTypeEnum, 'ENDSUCTION', INDETERMINATE) -splitcase = express_getattr(IfcPumpTypeEnum, 'SPLITCASE', INDETERMINATE) -verticalinline = express_getattr(IfcPumpTypeEnum, 'VERTICALINLINE', INDETERMINATE) -verticalturbine = express_getattr(IfcPumpTypeEnum, 'VERTICALTURBINE', INDETERMINATE) -userdefined = express_getattr(IfcPumpTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPumpTypeEnum, 'NOTDEFINED', INDETERMINATE) +circulator = IfcPumpTypeEnum.CIRCULATOR +endsuction = IfcPumpTypeEnum.ENDSUCTION +splitcase = IfcPumpTypeEnum.SPLITCASE +verticalinline = IfcPumpTypeEnum.VERTICALINLINE +verticalturbine = IfcPumpTypeEnum.VERTICALTURBINE +userdefined = IfcPumpTypeEnum.USERDEFINED +notdefined = IfcPumpTypeEnum.NOTDEFINED IfcRailingTypeEnum = enum_namespace() -handrail = express_getattr(IfcRailingTypeEnum, 'HANDRAIL', INDETERMINATE) -guardrail = express_getattr(IfcRailingTypeEnum, 'GUARDRAIL', INDETERMINATE) -balustrade = express_getattr(IfcRailingTypeEnum, 'BALUSTRADE', INDETERMINATE) -userdefined = express_getattr(IfcRailingTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcRailingTypeEnum, 'NOTDEFINED', INDETERMINATE) +handrail = IfcRailingTypeEnum.HANDRAIL +guardrail = IfcRailingTypeEnum.GUARDRAIL +balustrade = IfcRailingTypeEnum.BALUSTRADE +userdefined = IfcRailingTypeEnum.USERDEFINED +notdefined = IfcRailingTypeEnum.NOTDEFINED IfcRampFlightTypeEnum = enum_namespace() -straight = express_getattr(IfcRampFlightTypeEnum, 'STRAIGHT', INDETERMINATE) -spiral = express_getattr(IfcRampFlightTypeEnum, 'SPIRAL', INDETERMINATE) -userdefined = express_getattr(IfcRampFlightTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcRampFlightTypeEnum, 'NOTDEFINED', INDETERMINATE) +straight = IfcRampFlightTypeEnum.STRAIGHT +spiral = IfcRampFlightTypeEnum.SPIRAL +userdefined = IfcRampFlightTypeEnum.USERDEFINED +notdefined = IfcRampFlightTypeEnum.NOTDEFINED IfcRampTypeEnum = enum_namespace() -straight_run_ramp = express_getattr(IfcRampTypeEnum, 'STRAIGHT_RUN_RAMP', INDETERMINATE) -two_straight_run_ramp = express_getattr(IfcRampTypeEnum, 'TWO_STRAIGHT_RUN_RAMP', INDETERMINATE) -quarter_turn_ramp = express_getattr(IfcRampTypeEnum, 'QUARTER_TURN_RAMP', INDETERMINATE) -two_quarter_turn_ramp = express_getattr(IfcRampTypeEnum, 'TWO_QUARTER_TURN_RAMP', INDETERMINATE) -half_turn_ramp = express_getattr(IfcRampTypeEnum, 'HALF_TURN_RAMP', INDETERMINATE) -spiral_ramp = express_getattr(IfcRampTypeEnum, 'SPIRAL_RAMP', INDETERMINATE) -userdefined = express_getattr(IfcRampTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcRampTypeEnum, 'NOTDEFINED', INDETERMINATE) +straight_run_ramp = IfcRampTypeEnum.STRAIGHT_RUN_RAMP +two_straight_run_ramp = IfcRampTypeEnum.TWO_STRAIGHT_RUN_RAMP +quarter_turn_ramp = IfcRampTypeEnum.QUARTER_TURN_RAMP +two_quarter_turn_ramp = IfcRampTypeEnum.TWO_QUARTER_TURN_RAMP +half_turn_ramp = IfcRampTypeEnum.HALF_TURN_RAMP +spiral_ramp = IfcRampTypeEnum.SPIRAL_RAMP +userdefined = IfcRampTypeEnum.USERDEFINED +notdefined = IfcRampTypeEnum.NOTDEFINED IfcReflectanceMethodEnum = enum_namespace() -blinn = express_getattr(IfcReflectanceMethodEnum, 'BLINN', INDETERMINATE) -flat = express_getattr(IfcReflectanceMethodEnum, 'FLAT', INDETERMINATE) -glass = express_getattr(IfcReflectanceMethodEnum, 'GLASS', INDETERMINATE) -matt = express_getattr(IfcReflectanceMethodEnum, 'MATT', INDETERMINATE) -metal = express_getattr(IfcReflectanceMethodEnum, 'METAL', INDETERMINATE) -mirror = express_getattr(IfcReflectanceMethodEnum, 'MIRROR', INDETERMINATE) -phong = express_getattr(IfcReflectanceMethodEnum, 'PHONG', INDETERMINATE) -plastic = express_getattr(IfcReflectanceMethodEnum, 'PLASTIC', INDETERMINATE) -strauss = express_getattr(IfcReflectanceMethodEnum, 'STRAUSS', INDETERMINATE) -notdefined = express_getattr(IfcReflectanceMethodEnum, 'NOTDEFINED', INDETERMINATE) +blinn = IfcReflectanceMethodEnum.BLINN +flat = IfcReflectanceMethodEnum.FLAT +glass = IfcReflectanceMethodEnum.GLASS +matt = IfcReflectanceMethodEnum.MATT +metal = IfcReflectanceMethodEnum.METAL +mirror = IfcReflectanceMethodEnum.MIRROR +phong = IfcReflectanceMethodEnum.PHONG +plastic = IfcReflectanceMethodEnum.PLASTIC +strauss = IfcReflectanceMethodEnum.STRAUSS +notdefined = IfcReflectanceMethodEnum.NOTDEFINED IfcReinforcingBarRoleEnum = enum_namespace() -main = express_getattr(IfcReinforcingBarRoleEnum, 'MAIN', INDETERMINATE) -shear = express_getattr(IfcReinforcingBarRoleEnum, 'SHEAR', INDETERMINATE) -ligature = express_getattr(IfcReinforcingBarRoleEnum, 'LIGATURE', INDETERMINATE) -stud = express_getattr(IfcReinforcingBarRoleEnum, 'STUD', INDETERMINATE) -punching = express_getattr(IfcReinforcingBarRoleEnum, 'PUNCHING', INDETERMINATE) -edge = express_getattr(IfcReinforcingBarRoleEnum, 'EDGE', INDETERMINATE) -ring = express_getattr(IfcReinforcingBarRoleEnum, 'RING', INDETERMINATE) -userdefined = express_getattr(IfcReinforcingBarRoleEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcReinforcingBarRoleEnum, 'NOTDEFINED', INDETERMINATE) +main = IfcReinforcingBarRoleEnum.MAIN +shear = IfcReinforcingBarRoleEnum.SHEAR +ligature = IfcReinforcingBarRoleEnum.LIGATURE +stud = IfcReinforcingBarRoleEnum.STUD +punching = IfcReinforcingBarRoleEnum.PUNCHING +edge = IfcReinforcingBarRoleEnum.EDGE +ring = IfcReinforcingBarRoleEnum.RING +userdefined = IfcReinforcingBarRoleEnum.USERDEFINED +notdefined = IfcReinforcingBarRoleEnum.NOTDEFINED IfcReinforcingBarSurfaceEnum = enum_namespace() -plain = express_getattr(IfcReinforcingBarSurfaceEnum, 'PLAIN', INDETERMINATE) -textured = express_getattr(IfcReinforcingBarSurfaceEnum, 'TEXTURED', INDETERMINATE) +plain = IfcReinforcingBarSurfaceEnum.PLAIN +textured = IfcReinforcingBarSurfaceEnum.TEXTURED IfcResourceConsumptionEnum = enum_namespace() -consumed = express_getattr(IfcResourceConsumptionEnum, 'CONSUMED', INDETERMINATE) -partiallyconsumed = express_getattr(IfcResourceConsumptionEnum, 'PARTIALLYCONSUMED', INDETERMINATE) -notconsumed = express_getattr(IfcResourceConsumptionEnum, 'NOTCONSUMED', INDETERMINATE) -occupied = express_getattr(IfcResourceConsumptionEnum, 'OCCUPIED', INDETERMINATE) -partiallyoccupied = express_getattr(IfcResourceConsumptionEnum, 'PARTIALLYOCCUPIED', INDETERMINATE) -notoccupied = express_getattr(IfcResourceConsumptionEnum, 'NOTOCCUPIED', INDETERMINATE) -userdefined = express_getattr(IfcResourceConsumptionEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcResourceConsumptionEnum, 'NOTDEFINED', INDETERMINATE) +consumed = IfcResourceConsumptionEnum.CONSUMED +partiallyconsumed = IfcResourceConsumptionEnum.PARTIALLYCONSUMED +notconsumed = IfcResourceConsumptionEnum.NOTCONSUMED +occupied = IfcResourceConsumptionEnum.OCCUPIED +partiallyoccupied = IfcResourceConsumptionEnum.PARTIALLYOCCUPIED +notoccupied = IfcResourceConsumptionEnum.NOTOCCUPIED +userdefined = IfcResourceConsumptionEnum.USERDEFINED +notdefined = IfcResourceConsumptionEnum.NOTDEFINED IfcRibPlateDirectionEnum = enum_namespace() -direction_x = express_getattr(IfcRibPlateDirectionEnum, 'DIRECTION_X', INDETERMINATE) -direction_y = express_getattr(IfcRibPlateDirectionEnum, 'DIRECTION_Y', INDETERMINATE) +direction_x = IfcRibPlateDirectionEnum.DIRECTION_X +direction_y = IfcRibPlateDirectionEnum.DIRECTION_Y IfcRoleEnum = enum_namespace() -supplier = express_getattr(IfcRoleEnum, 'SUPPLIER', INDETERMINATE) -manufacturer = express_getattr(IfcRoleEnum, 'MANUFACTURER', INDETERMINATE) -contractor = express_getattr(IfcRoleEnum, 'CONTRACTOR', INDETERMINATE) -subcontractor = express_getattr(IfcRoleEnum, 'SUBCONTRACTOR', INDETERMINATE) -architect = express_getattr(IfcRoleEnum, 'ARCHITECT', INDETERMINATE) -structuralengineer = express_getattr(IfcRoleEnum, 'STRUCTURALENGINEER', INDETERMINATE) -costengineer = express_getattr(IfcRoleEnum, 'COSTENGINEER', INDETERMINATE) -client = express_getattr(IfcRoleEnum, 'CLIENT', INDETERMINATE) -buildingowner = express_getattr(IfcRoleEnum, 'BUILDINGOWNER', INDETERMINATE) -buildingoperator = express_getattr(IfcRoleEnum, 'BUILDINGOPERATOR', INDETERMINATE) -mechanicalengineer = express_getattr(IfcRoleEnum, 'MECHANICALENGINEER', INDETERMINATE) -electricalengineer = express_getattr(IfcRoleEnum, 'ELECTRICALENGINEER', INDETERMINATE) -projectmanager = express_getattr(IfcRoleEnum, 'PROJECTMANAGER', INDETERMINATE) -facilitiesmanager = express_getattr(IfcRoleEnum, 'FACILITIESMANAGER', INDETERMINATE) -civilengineer = express_getattr(IfcRoleEnum, 'CIVILENGINEER', INDETERMINATE) -comissioningengineer = express_getattr(IfcRoleEnum, 'COMISSIONINGENGINEER', INDETERMINATE) -engineer = express_getattr(IfcRoleEnum, 'ENGINEER', INDETERMINATE) -owner = express_getattr(IfcRoleEnum, 'OWNER', INDETERMINATE) -consultant = express_getattr(IfcRoleEnum, 'CONSULTANT', INDETERMINATE) -constructionmanager = express_getattr(IfcRoleEnum, 'CONSTRUCTIONMANAGER', INDETERMINATE) -fieldconstructionmanager = express_getattr(IfcRoleEnum, 'FIELDCONSTRUCTIONMANAGER', INDETERMINATE) -reseller = express_getattr(IfcRoleEnum, 'RESELLER', INDETERMINATE) -userdefined = express_getattr(IfcRoleEnum, 'USERDEFINED', INDETERMINATE) +supplier = IfcRoleEnum.SUPPLIER +manufacturer = IfcRoleEnum.MANUFACTURER +contractor = IfcRoleEnum.CONTRACTOR +subcontractor = IfcRoleEnum.SUBCONTRACTOR +architect = IfcRoleEnum.ARCHITECT +structuralengineer = IfcRoleEnum.STRUCTURALENGINEER +costengineer = IfcRoleEnum.COSTENGINEER +client = IfcRoleEnum.CLIENT +buildingowner = IfcRoleEnum.BUILDINGOWNER +buildingoperator = IfcRoleEnum.BUILDINGOPERATOR +mechanicalengineer = IfcRoleEnum.MECHANICALENGINEER +electricalengineer = IfcRoleEnum.ELECTRICALENGINEER +projectmanager = IfcRoleEnum.PROJECTMANAGER +facilitiesmanager = IfcRoleEnum.FACILITIESMANAGER +civilengineer = IfcRoleEnum.CIVILENGINEER +comissioningengineer = IfcRoleEnum.COMISSIONINGENGINEER +engineer = IfcRoleEnum.ENGINEER +owner = IfcRoleEnum.OWNER +consultant = IfcRoleEnum.CONSULTANT +constructionmanager = IfcRoleEnum.CONSTRUCTIONMANAGER +fieldconstructionmanager = IfcRoleEnum.FIELDCONSTRUCTIONMANAGER +reseller = IfcRoleEnum.RESELLER +userdefined = IfcRoleEnum.USERDEFINED IfcRoofTypeEnum = enum_namespace() -flat_roof = express_getattr(IfcRoofTypeEnum, 'FLAT_ROOF', INDETERMINATE) -shed_roof = express_getattr(IfcRoofTypeEnum, 'SHED_ROOF', INDETERMINATE) -gable_roof = express_getattr(IfcRoofTypeEnum, 'GABLE_ROOF', INDETERMINATE) -hip_roof = express_getattr(IfcRoofTypeEnum, 'HIP_ROOF', INDETERMINATE) -hipped_gable_roof = express_getattr(IfcRoofTypeEnum, 'HIPPED_GABLE_ROOF', INDETERMINATE) -gambrel_roof = express_getattr(IfcRoofTypeEnum, 'GAMBREL_ROOF', INDETERMINATE) -mansard_roof = express_getattr(IfcRoofTypeEnum, 'MANSARD_ROOF', INDETERMINATE) -barrel_roof = express_getattr(IfcRoofTypeEnum, 'BARREL_ROOF', INDETERMINATE) -rainbow_roof = express_getattr(IfcRoofTypeEnum, 'RAINBOW_ROOF', INDETERMINATE) -butterfly_roof = express_getattr(IfcRoofTypeEnum, 'BUTTERFLY_ROOF', INDETERMINATE) -pavilion_roof = express_getattr(IfcRoofTypeEnum, 'PAVILION_ROOF', INDETERMINATE) -dome_roof = express_getattr(IfcRoofTypeEnum, 'DOME_ROOF', INDETERMINATE) -freeform = express_getattr(IfcRoofTypeEnum, 'FREEFORM', INDETERMINATE) -notdefined = express_getattr(IfcRoofTypeEnum, 'NOTDEFINED', INDETERMINATE) +flat_roof = IfcRoofTypeEnum.FLAT_ROOF +shed_roof = IfcRoofTypeEnum.SHED_ROOF +gable_roof = IfcRoofTypeEnum.GABLE_ROOF +hip_roof = IfcRoofTypeEnum.HIP_ROOF +hipped_gable_roof = IfcRoofTypeEnum.HIPPED_GABLE_ROOF +gambrel_roof = IfcRoofTypeEnum.GAMBREL_ROOF +mansard_roof = IfcRoofTypeEnum.MANSARD_ROOF +barrel_roof = IfcRoofTypeEnum.BARREL_ROOF +rainbow_roof = IfcRoofTypeEnum.RAINBOW_ROOF +butterfly_roof = IfcRoofTypeEnum.BUTTERFLY_ROOF +pavilion_roof = IfcRoofTypeEnum.PAVILION_ROOF +dome_roof = IfcRoofTypeEnum.DOME_ROOF +freeform = IfcRoofTypeEnum.FREEFORM +notdefined = IfcRoofTypeEnum.NOTDEFINED IfcSIPrefix = enum_namespace() -exa = express_getattr(IfcSIPrefix, 'EXA', INDETERMINATE) -peta = express_getattr(IfcSIPrefix, 'PETA', INDETERMINATE) -tera = express_getattr(IfcSIPrefix, 'TERA', INDETERMINATE) -giga = express_getattr(IfcSIPrefix, 'GIGA', INDETERMINATE) -mega = express_getattr(IfcSIPrefix, 'MEGA', INDETERMINATE) -kilo = express_getattr(IfcSIPrefix, 'KILO', INDETERMINATE) -hecto = express_getattr(IfcSIPrefix, 'HECTO', INDETERMINATE) -deca = express_getattr(IfcSIPrefix, 'DECA', INDETERMINATE) -deci = express_getattr(IfcSIPrefix, 'DECI', INDETERMINATE) -centi = express_getattr(IfcSIPrefix, 'CENTI', INDETERMINATE) -milli = express_getattr(IfcSIPrefix, 'MILLI', INDETERMINATE) -micro = express_getattr(IfcSIPrefix, 'MICRO', INDETERMINATE) -nano = express_getattr(IfcSIPrefix, 'NANO', INDETERMINATE) -pico = express_getattr(IfcSIPrefix, 'PICO', INDETERMINATE) -femto = express_getattr(IfcSIPrefix, 'FEMTO', INDETERMINATE) -atto = express_getattr(IfcSIPrefix, 'ATTO', INDETERMINATE) +exa = IfcSIPrefix.EXA +peta = IfcSIPrefix.PETA +tera = IfcSIPrefix.TERA +giga = IfcSIPrefix.GIGA +mega = IfcSIPrefix.MEGA +kilo = IfcSIPrefix.KILO +hecto = IfcSIPrefix.HECTO +deca = IfcSIPrefix.DECA +deci = IfcSIPrefix.DECI +centi = IfcSIPrefix.CENTI +milli = IfcSIPrefix.MILLI +micro = IfcSIPrefix.MICRO +nano = IfcSIPrefix.NANO +pico = IfcSIPrefix.PICO +femto = IfcSIPrefix.FEMTO +atto = IfcSIPrefix.ATTO IfcSIUnitName = enum_namespace() -ampere = express_getattr(IfcSIUnitName, 'AMPERE', INDETERMINATE) -becquerel = express_getattr(IfcSIUnitName, 'BECQUEREL', INDETERMINATE) -candela = express_getattr(IfcSIUnitName, 'CANDELA', INDETERMINATE) -coulomb = express_getattr(IfcSIUnitName, 'COULOMB', INDETERMINATE) -cubic_metre = express_getattr(IfcSIUnitName, 'CUBIC_METRE', INDETERMINATE) -degree_celsius = express_getattr(IfcSIUnitName, 'DEGREE_CELSIUS', INDETERMINATE) -farad = express_getattr(IfcSIUnitName, 'FARAD', INDETERMINATE) -gram = express_getattr(IfcSIUnitName, 'GRAM', INDETERMINATE) -gray = express_getattr(IfcSIUnitName, 'GRAY', INDETERMINATE) -henry = express_getattr(IfcSIUnitName, 'HENRY', INDETERMINATE) -hertz = express_getattr(IfcSIUnitName, 'HERTZ', INDETERMINATE) -joule = express_getattr(IfcSIUnitName, 'JOULE', INDETERMINATE) -kelvin = express_getattr(IfcSIUnitName, 'KELVIN', INDETERMINATE) -lumen = express_getattr(IfcSIUnitName, 'LUMEN', INDETERMINATE) -lux = express_getattr(IfcSIUnitName, 'LUX', INDETERMINATE) -metre = express_getattr(IfcSIUnitName, 'METRE', INDETERMINATE) -mole = express_getattr(IfcSIUnitName, 'MOLE', INDETERMINATE) -newton = express_getattr(IfcSIUnitName, 'NEWTON', INDETERMINATE) -ohm = express_getattr(IfcSIUnitName, 'OHM', INDETERMINATE) -pascal = express_getattr(IfcSIUnitName, 'PASCAL', INDETERMINATE) -radian = express_getattr(IfcSIUnitName, 'RADIAN', INDETERMINATE) -second = express_getattr(IfcSIUnitName, 'SECOND', INDETERMINATE) -siemens = express_getattr(IfcSIUnitName, 'SIEMENS', INDETERMINATE) -sievert = express_getattr(IfcSIUnitName, 'SIEVERT', INDETERMINATE) -square_metre = express_getattr(IfcSIUnitName, 'SQUARE_METRE', INDETERMINATE) -steradian = express_getattr(IfcSIUnitName, 'STERADIAN', INDETERMINATE) -tesla = express_getattr(IfcSIUnitName, 'TESLA', INDETERMINATE) -volt = express_getattr(IfcSIUnitName, 'VOLT', INDETERMINATE) -watt = express_getattr(IfcSIUnitName, 'WATT', INDETERMINATE) -weber = express_getattr(IfcSIUnitName, 'WEBER', INDETERMINATE) +ampere = IfcSIUnitName.AMPERE +becquerel = IfcSIUnitName.BECQUEREL +candela = IfcSIUnitName.CANDELA +coulomb = IfcSIUnitName.COULOMB +cubic_metre = IfcSIUnitName.CUBIC_METRE +degree_celsius = IfcSIUnitName.DEGREE_CELSIUS +farad = IfcSIUnitName.FARAD +gram = IfcSIUnitName.GRAM +gray = IfcSIUnitName.GRAY +henry = IfcSIUnitName.HENRY +hertz = IfcSIUnitName.HERTZ +joule = IfcSIUnitName.JOULE +kelvin = IfcSIUnitName.KELVIN +lumen = IfcSIUnitName.LUMEN +lux = IfcSIUnitName.LUX +metre = IfcSIUnitName.METRE +mole = IfcSIUnitName.MOLE +newton = IfcSIUnitName.NEWTON +ohm = IfcSIUnitName.OHM +pascal = IfcSIUnitName.PASCAL +radian = IfcSIUnitName.RADIAN +second = IfcSIUnitName.SECOND +siemens = IfcSIUnitName.SIEMENS +sievert = IfcSIUnitName.SIEVERT +square_metre = IfcSIUnitName.SQUARE_METRE +steradian = IfcSIUnitName.STERADIAN +tesla = IfcSIUnitName.TESLA +volt = IfcSIUnitName.VOLT +watt = IfcSIUnitName.WATT +weber = IfcSIUnitName.WEBER IfcSanitaryTerminalTypeEnum = enum_namespace() -bath = express_getattr(IfcSanitaryTerminalTypeEnum, 'BATH', INDETERMINATE) -bidet = express_getattr(IfcSanitaryTerminalTypeEnum, 'BIDET', INDETERMINATE) -cistern = express_getattr(IfcSanitaryTerminalTypeEnum, 'CISTERN', INDETERMINATE) -shower = express_getattr(IfcSanitaryTerminalTypeEnum, 'SHOWER', INDETERMINATE) -sink = express_getattr(IfcSanitaryTerminalTypeEnum, 'SINK', INDETERMINATE) -sanitaryfountain = express_getattr(IfcSanitaryTerminalTypeEnum, 'SANITARYFOUNTAIN', INDETERMINATE) -toiletpan = express_getattr(IfcSanitaryTerminalTypeEnum, 'TOILETPAN', INDETERMINATE) -urinal = express_getattr(IfcSanitaryTerminalTypeEnum, 'URINAL', INDETERMINATE) -washhandbasin = express_getattr(IfcSanitaryTerminalTypeEnum, 'WASHHANDBASIN', INDETERMINATE) -wcseat = express_getattr(IfcSanitaryTerminalTypeEnum, 'WCSEAT', INDETERMINATE) -userdefined = express_getattr(IfcSanitaryTerminalTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSanitaryTerminalTypeEnum, 'NOTDEFINED', INDETERMINATE) +bath = IfcSanitaryTerminalTypeEnum.BATH +bidet = IfcSanitaryTerminalTypeEnum.BIDET +cistern = IfcSanitaryTerminalTypeEnum.CISTERN +shower = IfcSanitaryTerminalTypeEnum.SHOWER +sink = IfcSanitaryTerminalTypeEnum.SINK +sanitaryfountain = IfcSanitaryTerminalTypeEnum.SANITARYFOUNTAIN +toiletpan = IfcSanitaryTerminalTypeEnum.TOILETPAN +urinal = IfcSanitaryTerminalTypeEnum.URINAL +washhandbasin = IfcSanitaryTerminalTypeEnum.WASHHANDBASIN +wcseat = IfcSanitaryTerminalTypeEnum.WCSEAT +userdefined = IfcSanitaryTerminalTypeEnum.USERDEFINED +notdefined = IfcSanitaryTerminalTypeEnum.NOTDEFINED IfcSectionTypeEnum = enum_namespace() -uniform = express_getattr(IfcSectionTypeEnum, 'UNIFORM', INDETERMINATE) -tapered = express_getattr(IfcSectionTypeEnum, 'TAPERED', INDETERMINATE) +uniform = IfcSectionTypeEnum.UNIFORM +tapered = IfcSectionTypeEnum.TAPERED IfcSensorTypeEnum = enum_namespace() -co2sensor = express_getattr(IfcSensorTypeEnum, 'CO2SENSOR', INDETERMINATE) -firesensor = express_getattr(IfcSensorTypeEnum, 'FIRESENSOR', INDETERMINATE) -flowsensor = express_getattr(IfcSensorTypeEnum, 'FLOWSENSOR', INDETERMINATE) -gassensor = express_getattr(IfcSensorTypeEnum, 'GASSENSOR', INDETERMINATE) -heatsensor = express_getattr(IfcSensorTypeEnum, 'HEATSENSOR', INDETERMINATE) -humiditysensor = express_getattr(IfcSensorTypeEnum, 'HUMIDITYSENSOR', INDETERMINATE) -lightsensor = express_getattr(IfcSensorTypeEnum, 'LIGHTSENSOR', INDETERMINATE) -moisturesensor = express_getattr(IfcSensorTypeEnum, 'MOISTURESENSOR', INDETERMINATE) -movementsensor = express_getattr(IfcSensorTypeEnum, 'MOVEMENTSENSOR', INDETERMINATE) -pressuresensor = express_getattr(IfcSensorTypeEnum, 'PRESSURESENSOR', INDETERMINATE) -smokesensor = express_getattr(IfcSensorTypeEnum, 'SMOKESENSOR', INDETERMINATE) -soundsensor = express_getattr(IfcSensorTypeEnum, 'SOUNDSENSOR', INDETERMINATE) -temperaturesensor = express_getattr(IfcSensorTypeEnum, 'TEMPERATURESENSOR', INDETERMINATE) -userdefined = express_getattr(IfcSensorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSensorTypeEnum, 'NOTDEFINED', INDETERMINATE) +co2sensor = IfcSensorTypeEnum.CO2SENSOR +firesensor = IfcSensorTypeEnum.FIRESENSOR +flowsensor = IfcSensorTypeEnum.FLOWSENSOR +gassensor = IfcSensorTypeEnum.GASSENSOR +heatsensor = IfcSensorTypeEnum.HEATSENSOR +humiditysensor = IfcSensorTypeEnum.HUMIDITYSENSOR +lightsensor = IfcSensorTypeEnum.LIGHTSENSOR +moisturesensor = IfcSensorTypeEnum.MOISTURESENSOR +movementsensor = IfcSensorTypeEnum.MOVEMENTSENSOR +pressuresensor = IfcSensorTypeEnum.PRESSURESENSOR +smokesensor = IfcSensorTypeEnum.SMOKESENSOR +soundsensor = IfcSensorTypeEnum.SOUNDSENSOR +temperaturesensor = IfcSensorTypeEnum.TEMPERATURESENSOR +userdefined = IfcSensorTypeEnum.USERDEFINED +notdefined = IfcSensorTypeEnum.NOTDEFINED IfcSequenceEnum = enum_namespace() -start_start = express_getattr(IfcSequenceEnum, 'START_START', INDETERMINATE) -start_finish = express_getattr(IfcSequenceEnum, 'START_FINISH', INDETERMINATE) -finish_start = express_getattr(IfcSequenceEnum, 'FINISH_START', INDETERMINATE) -finish_finish = express_getattr(IfcSequenceEnum, 'FINISH_FINISH', INDETERMINATE) -notdefined = express_getattr(IfcSequenceEnum, 'NOTDEFINED', INDETERMINATE) +start_start = IfcSequenceEnum.START_START +start_finish = IfcSequenceEnum.START_FINISH +finish_start = IfcSequenceEnum.FINISH_START +finish_finish = IfcSequenceEnum.FINISH_FINISH +notdefined = IfcSequenceEnum.NOTDEFINED IfcServiceLifeFactorTypeEnum = enum_namespace() -a_qualityofcomponents = express_getattr(IfcServiceLifeFactorTypeEnum, 'A_QUALITYOFCOMPONENTS', INDETERMINATE) -b_designlevel = express_getattr(IfcServiceLifeFactorTypeEnum, 'B_DESIGNLEVEL', INDETERMINATE) -c_workexecutionlevel = express_getattr(IfcServiceLifeFactorTypeEnum, 'C_WORKEXECUTIONLEVEL', INDETERMINATE) -d_indoorenvironment = express_getattr(IfcServiceLifeFactorTypeEnum, 'D_INDOORENVIRONMENT', INDETERMINATE) -e_outdoorenvironment = express_getattr(IfcServiceLifeFactorTypeEnum, 'E_OUTDOORENVIRONMENT', INDETERMINATE) -f_inuseconditions = express_getattr(IfcServiceLifeFactorTypeEnum, 'F_INUSECONDITIONS', INDETERMINATE) -g_maintenancelevel = express_getattr(IfcServiceLifeFactorTypeEnum, 'G_MAINTENANCELEVEL', INDETERMINATE) -userdefined = express_getattr(IfcServiceLifeFactorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcServiceLifeFactorTypeEnum, 'NOTDEFINED', INDETERMINATE) +a_qualityofcomponents = IfcServiceLifeFactorTypeEnum.A_QUALITYOFCOMPONENTS +b_designlevel = IfcServiceLifeFactorTypeEnum.B_DESIGNLEVEL +c_workexecutionlevel = IfcServiceLifeFactorTypeEnum.C_WORKEXECUTIONLEVEL +d_indoorenvironment = IfcServiceLifeFactorTypeEnum.D_INDOORENVIRONMENT +e_outdoorenvironment = IfcServiceLifeFactorTypeEnum.E_OUTDOORENVIRONMENT +f_inuseconditions = IfcServiceLifeFactorTypeEnum.F_INUSECONDITIONS +g_maintenancelevel = IfcServiceLifeFactorTypeEnum.G_MAINTENANCELEVEL +userdefined = IfcServiceLifeFactorTypeEnum.USERDEFINED +notdefined = IfcServiceLifeFactorTypeEnum.NOTDEFINED IfcServiceLifeTypeEnum = enum_namespace() -actualservicelife = express_getattr(IfcServiceLifeTypeEnum, 'ACTUALSERVICELIFE', INDETERMINATE) -expectedservicelife = express_getattr(IfcServiceLifeTypeEnum, 'EXPECTEDSERVICELIFE', INDETERMINATE) -optimisticreferenceservicelife = express_getattr(IfcServiceLifeTypeEnum, 'OPTIMISTICREFERENCESERVICELIFE', INDETERMINATE) -pessimisticreferenceservicelife = express_getattr(IfcServiceLifeTypeEnum, 'PESSIMISTICREFERENCESERVICELIFE', INDETERMINATE) -referenceservicelife = express_getattr(IfcServiceLifeTypeEnum, 'REFERENCESERVICELIFE', INDETERMINATE) +actualservicelife = IfcServiceLifeTypeEnum.ACTUALSERVICELIFE +expectedservicelife = IfcServiceLifeTypeEnum.EXPECTEDSERVICELIFE +optimisticreferenceservicelife = IfcServiceLifeTypeEnum.OPTIMISTICREFERENCESERVICELIFE +pessimisticreferenceservicelife = IfcServiceLifeTypeEnum.PESSIMISTICREFERENCESERVICELIFE +referenceservicelife = IfcServiceLifeTypeEnum.REFERENCESERVICELIFE IfcSlabTypeEnum = enum_namespace() -floor = express_getattr(IfcSlabTypeEnum, 'FLOOR', INDETERMINATE) -roof = express_getattr(IfcSlabTypeEnum, 'ROOF', INDETERMINATE) -landing = express_getattr(IfcSlabTypeEnum, 'LANDING', INDETERMINATE) -baseslab = express_getattr(IfcSlabTypeEnum, 'BASESLAB', INDETERMINATE) -userdefined = express_getattr(IfcSlabTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSlabTypeEnum, 'NOTDEFINED', INDETERMINATE) +floor = IfcSlabTypeEnum.FLOOR +roof = IfcSlabTypeEnum.ROOF +landing = IfcSlabTypeEnum.LANDING +baseslab = IfcSlabTypeEnum.BASESLAB +userdefined = IfcSlabTypeEnum.USERDEFINED +notdefined = IfcSlabTypeEnum.NOTDEFINED IfcSoundScaleEnum = enum_namespace() -dba = express_getattr(IfcSoundScaleEnum, 'DBA', INDETERMINATE) -dbb = express_getattr(IfcSoundScaleEnum, 'DBB', INDETERMINATE) -dbc = express_getattr(IfcSoundScaleEnum, 'DBC', INDETERMINATE) -nc = express_getattr(IfcSoundScaleEnum, 'NC', INDETERMINATE) -nr = express_getattr(IfcSoundScaleEnum, 'NR', INDETERMINATE) -userdefined = express_getattr(IfcSoundScaleEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSoundScaleEnum, 'NOTDEFINED', INDETERMINATE) +dba = IfcSoundScaleEnum.DBA +dbb = IfcSoundScaleEnum.DBB +dbc = IfcSoundScaleEnum.DBC +nc = IfcSoundScaleEnum.NC +nr = IfcSoundScaleEnum.NR +userdefined = IfcSoundScaleEnum.USERDEFINED +notdefined = IfcSoundScaleEnum.NOTDEFINED IfcSpaceHeaterTypeEnum = enum_namespace() -sectionalradiator = express_getattr(IfcSpaceHeaterTypeEnum, 'SECTIONALRADIATOR', INDETERMINATE) -panelradiator = express_getattr(IfcSpaceHeaterTypeEnum, 'PANELRADIATOR', INDETERMINATE) -tubularradiator = express_getattr(IfcSpaceHeaterTypeEnum, 'TUBULARRADIATOR', INDETERMINATE) -convector = express_getattr(IfcSpaceHeaterTypeEnum, 'CONVECTOR', INDETERMINATE) -baseboardheater = express_getattr(IfcSpaceHeaterTypeEnum, 'BASEBOARDHEATER', INDETERMINATE) -finnedtubeunit = express_getattr(IfcSpaceHeaterTypeEnum, 'FINNEDTUBEUNIT', INDETERMINATE) -unitheater = express_getattr(IfcSpaceHeaterTypeEnum, 'UNITHEATER', INDETERMINATE) -userdefined = express_getattr(IfcSpaceHeaterTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSpaceHeaterTypeEnum, 'NOTDEFINED', INDETERMINATE) +sectionalradiator = IfcSpaceHeaterTypeEnum.SECTIONALRADIATOR +panelradiator = IfcSpaceHeaterTypeEnum.PANELRADIATOR +tubularradiator = IfcSpaceHeaterTypeEnum.TUBULARRADIATOR +convector = IfcSpaceHeaterTypeEnum.CONVECTOR +baseboardheater = IfcSpaceHeaterTypeEnum.BASEBOARDHEATER +finnedtubeunit = IfcSpaceHeaterTypeEnum.FINNEDTUBEUNIT +unitheater = IfcSpaceHeaterTypeEnum.UNITHEATER +userdefined = IfcSpaceHeaterTypeEnum.USERDEFINED +notdefined = IfcSpaceHeaterTypeEnum.NOTDEFINED IfcSpaceTypeEnum = enum_namespace() -userdefined = express_getattr(IfcSpaceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSpaceTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcSpaceTypeEnum.USERDEFINED +notdefined = IfcSpaceTypeEnum.NOTDEFINED IfcStackTerminalTypeEnum = enum_namespace() -birdcage = express_getattr(IfcStackTerminalTypeEnum, 'BIRDCAGE', INDETERMINATE) -cowl = express_getattr(IfcStackTerminalTypeEnum, 'COWL', INDETERMINATE) -rainwaterhopper = express_getattr(IfcStackTerminalTypeEnum, 'RAINWATERHOPPER', INDETERMINATE) -userdefined = express_getattr(IfcStackTerminalTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcStackTerminalTypeEnum, 'NOTDEFINED', INDETERMINATE) +birdcage = IfcStackTerminalTypeEnum.BIRDCAGE +cowl = IfcStackTerminalTypeEnum.COWL +rainwaterhopper = IfcStackTerminalTypeEnum.RAINWATERHOPPER +userdefined = IfcStackTerminalTypeEnum.USERDEFINED +notdefined = IfcStackTerminalTypeEnum.NOTDEFINED IfcStairFlightTypeEnum = enum_namespace() -straight = express_getattr(IfcStairFlightTypeEnum, 'STRAIGHT', INDETERMINATE) -winder = express_getattr(IfcStairFlightTypeEnum, 'WINDER', INDETERMINATE) -spiral = express_getattr(IfcStairFlightTypeEnum, 'SPIRAL', INDETERMINATE) -curved = express_getattr(IfcStairFlightTypeEnum, 'CURVED', INDETERMINATE) -freeform = express_getattr(IfcStairFlightTypeEnum, 'FREEFORM', INDETERMINATE) -userdefined = express_getattr(IfcStairFlightTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcStairFlightTypeEnum, 'NOTDEFINED', INDETERMINATE) +straight = IfcStairFlightTypeEnum.STRAIGHT +winder = IfcStairFlightTypeEnum.WINDER +spiral = IfcStairFlightTypeEnum.SPIRAL +curved = IfcStairFlightTypeEnum.CURVED +freeform = IfcStairFlightTypeEnum.FREEFORM +userdefined = IfcStairFlightTypeEnum.USERDEFINED +notdefined = IfcStairFlightTypeEnum.NOTDEFINED IfcStairTypeEnum = enum_namespace() -straight_run_stair = express_getattr(IfcStairTypeEnum, 'STRAIGHT_RUN_STAIR', INDETERMINATE) -two_straight_run_stair = express_getattr(IfcStairTypeEnum, 'TWO_STRAIGHT_RUN_STAIR', INDETERMINATE) -quarter_winding_stair = express_getattr(IfcStairTypeEnum, 'QUARTER_WINDING_STAIR', INDETERMINATE) -quarter_turn_stair = express_getattr(IfcStairTypeEnum, 'QUARTER_TURN_STAIR', INDETERMINATE) -half_winding_stair = express_getattr(IfcStairTypeEnum, 'HALF_WINDING_STAIR', INDETERMINATE) -half_turn_stair = express_getattr(IfcStairTypeEnum, 'HALF_TURN_STAIR', INDETERMINATE) -two_quarter_winding_stair = express_getattr(IfcStairTypeEnum, 'TWO_QUARTER_WINDING_STAIR', INDETERMINATE) -two_quarter_turn_stair = express_getattr(IfcStairTypeEnum, 'TWO_QUARTER_TURN_STAIR', INDETERMINATE) -three_quarter_winding_stair = express_getattr(IfcStairTypeEnum, 'THREE_QUARTER_WINDING_STAIR', INDETERMINATE) -three_quarter_turn_stair = express_getattr(IfcStairTypeEnum, 'THREE_QUARTER_TURN_STAIR', INDETERMINATE) -spiral_stair = express_getattr(IfcStairTypeEnum, 'SPIRAL_STAIR', INDETERMINATE) -double_return_stair = express_getattr(IfcStairTypeEnum, 'DOUBLE_RETURN_STAIR', INDETERMINATE) -curved_run_stair = express_getattr(IfcStairTypeEnum, 'CURVED_RUN_STAIR', INDETERMINATE) -two_curved_run_stair = express_getattr(IfcStairTypeEnum, 'TWO_CURVED_RUN_STAIR', INDETERMINATE) -userdefined = express_getattr(IfcStairTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcStairTypeEnum, 'NOTDEFINED', INDETERMINATE) +straight_run_stair = IfcStairTypeEnum.STRAIGHT_RUN_STAIR +two_straight_run_stair = IfcStairTypeEnum.TWO_STRAIGHT_RUN_STAIR +quarter_winding_stair = IfcStairTypeEnum.QUARTER_WINDING_STAIR +quarter_turn_stair = IfcStairTypeEnum.QUARTER_TURN_STAIR +half_winding_stair = IfcStairTypeEnum.HALF_WINDING_STAIR +half_turn_stair = IfcStairTypeEnum.HALF_TURN_STAIR +two_quarter_winding_stair = IfcStairTypeEnum.TWO_QUARTER_WINDING_STAIR +two_quarter_turn_stair = IfcStairTypeEnum.TWO_QUARTER_TURN_STAIR +three_quarter_winding_stair = IfcStairTypeEnum.THREE_QUARTER_WINDING_STAIR +three_quarter_turn_stair = IfcStairTypeEnum.THREE_QUARTER_TURN_STAIR +spiral_stair = IfcStairTypeEnum.SPIRAL_STAIR +double_return_stair = IfcStairTypeEnum.DOUBLE_RETURN_STAIR +curved_run_stair = IfcStairTypeEnum.CURVED_RUN_STAIR +two_curved_run_stair = IfcStairTypeEnum.TWO_CURVED_RUN_STAIR +userdefined = IfcStairTypeEnum.USERDEFINED +notdefined = IfcStairTypeEnum.NOTDEFINED IfcStateEnum = enum_namespace() -readwrite = express_getattr(IfcStateEnum, 'READWRITE', INDETERMINATE) -readonly = express_getattr(IfcStateEnum, 'READONLY', INDETERMINATE) -locked = express_getattr(IfcStateEnum, 'LOCKED', INDETERMINATE) -readwritelocked = express_getattr(IfcStateEnum, 'READWRITELOCKED', INDETERMINATE) -readonlylocked = express_getattr(IfcStateEnum, 'READONLYLOCKED', INDETERMINATE) +readwrite = IfcStateEnum.READWRITE +readonly = IfcStateEnum.READONLY +locked = IfcStateEnum.LOCKED +readwritelocked = IfcStateEnum.READWRITELOCKED +readonlylocked = IfcStateEnum.READONLYLOCKED IfcStructuralCurveTypeEnum = enum_namespace() -rigid_joined_member = express_getattr(IfcStructuralCurveTypeEnum, 'RIGID_JOINED_MEMBER', INDETERMINATE) -pin_joined_member = express_getattr(IfcStructuralCurveTypeEnum, 'PIN_JOINED_MEMBER', INDETERMINATE) -cable = express_getattr(IfcStructuralCurveTypeEnum, 'CABLE', INDETERMINATE) -tension_member = express_getattr(IfcStructuralCurveTypeEnum, 'TENSION_MEMBER', INDETERMINATE) -compression_member = express_getattr(IfcStructuralCurveTypeEnum, 'COMPRESSION_MEMBER', INDETERMINATE) -userdefined = express_getattr(IfcStructuralCurveTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcStructuralCurveTypeEnum, 'NOTDEFINED', INDETERMINATE) +rigid_joined_member = IfcStructuralCurveTypeEnum.RIGID_JOINED_MEMBER +pin_joined_member = IfcStructuralCurveTypeEnum.PIN_JOINED_MEMBER +cable = IfcStructuralCurveTypeEnum.CABLE +tension_member = IfcStructuralCurveTypeEnum.TENSION_MEMBER +compression_member = IfcStructuralCurveTypeEnum.COMPRESSION_MEMBER +userdefined = IfcStructuralCurveTypeEnum.USERDEFINED +notdefined = IfcStructuralCurveTypeEnum.NOTDEFINED IfcStructuralSurfaceTypeEnum = enum_namespace() -bending_element = express_getattr(IfcStructuralSurfaceTypeEnum, 'BENDING_ELEMENT', INDETERMINATE) -membrane_element = express_getattr(IfcStructuralSurfaceTypeEnum, 'MEMBRANE_ELEMENT', INDETERMINATE) -shell = express_getattr(IfcStructuralSurfaceTypeEnum, 'SHELL', INDETERMINATE) -userdefined = express_getattr(IfcStructuralSurfaceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcStructuralSurfaceTypeEnum, 'NOTDEFINED', INDETERMINATE) +bending_element = IfcStructuralSurfaceTypeEnum.BENDING_ELEMENT +membrane_element = IfcStructuralSurfaceTypeEnum.MEMBRANE_ELEMENT +shell = IfcStructuralSurfaceTypeEnum.SHELL +userdefined = IfcStructuralSurfaceTypeEnum.USERDEFINED +notdefined = IfcStructuralSurfaceTypeEnum.NOTDEFINED IfcSurfaceSide = enum_namespace() -positive = express_getattr(IfcSurfaceSide, 'POSITIVE', INDETERMINATE) -negative = express_getattr(IfcSurfaceSide, 'NEGATIVE', INDETERMINATE) -both = express_getattr(IfcSurfaceSide, 'BOTH', INDETERMINATE) +positive = IfcSurfaceSide.POSITIVE +negative = IfcSurfaceSide.NEGATIVE +both = IfcSurfaceSide.BOTH IfcSurfaceTextureEnum = enum_namespace() -bump = express_getattr(IfcSurfaceTextureEnum, 'BUMP', INDETERMINATE) -opacity = express_getattr(IfcSurfaceTextureEnum, 'OPACITY', INDETERMINATE) -reflection = express_getattr(IfcSurfaceTextureEnum, 'REFLECTION', INDETERMINATE) -selfillumination = express_getattr(IfcSurfaceTextureEnum, 'SELFILLUMINATION', INDETERMINATE) -shininess = express_getattr(IfcSurfaceTextureEnum, 'SHININESS', INDETERMINATE) -specular = express_getattr(IfcSurfaceTextureEnum, 'SPECULAR', INDETERMINATE) -texture = express_getattr(IfcSurfaceTextureEnum, 'TEXTURE', INDETERMINATE) -transparencymap = express_getattr(IfcSurfaceTextureEnum, 'TRANSPARENCYMAP', INDETERMINATE) -notdefined = express_getattr(IfcSurfaceTextureEnum, 'NOTDEFINED', INDETERMINATE) +bump = IfcSurfaceTextureEnum.BUMP +opacity = IfcSurfaceTextureEnum.OPACITY +reflection = IfcSurfaceTextureEnum.REFLECTION +selfillumination = IfcSurfaceTextureEnum.SELFILLUMINATION +shininess = IfcSurfaceTextureEnum.SHININESS +specular = IfcSurfaceTextureEnum.SPECULAR +texture = IfcSurfaceTextureEnum.TEXTURE +transparencymap = IfcSurfaceTextureEnum.TRANSPARENCYMAP +notdefined = IfcSurfaceTextureEnum.NOTDEFINED IfcSwitchingDeviceTypeEnum = enum_namespace() -contactor = express_getattr(IfcSwitchingDeviceTypeEnum, 'CONTACTOR', INDETERMINATE) -emergencystop = express_getattr(IfcSwitchingDeviceTypeEnum, 'EMERGENCYSTOP', INDETERMINATE) -starter = express_getattr(IfcSwitchingDeviceTypeEnum, 'STARTER', INDETERMINATE) -switchdisconnector = express_getattr(IfcSwitchingDeviceTypeEnum, 'SWITCHDISCONNECTOR', INDETERMINATE) -toggleswitch = express_getattr(IfcSwitchingDeviceTypeEnum, 'TOGGLESWITCH', INDETERMINATE) -userdefined = express_getattr(IfcSwitchingDeviceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSwitchingDeviceTypeEnum, 'NOTDEFINED', INDETERMINATE) +contactor = IfcSwitchingDeviceTypeEnum.CONTACTOR +emergencystop = IfcSwitchingDeviceTypeEnum.EMERGENCYSTOP +starter = IfcSwitchingDeviceTypeEnum.STARTER +switchdisconnector = IfcSwitchingDeviceTypeEnum.SWITCHDISCONNECTOR +toggleswitch = IfcSwitchingDeviceTypeEnum.TOGGLESWITCH +userdefined = IfcSwitchingDeviceTypeEnum.USERDEFINED +notdefined = IfcSwitchingDeviceTypeEnum.NOTDEFINED IfcTankTypeEnum = enum_namespace() -preformed = express_getattr(IfcTankTypeEnum, 'PREFORMED', INDETERMINATE) -sectional = express_getattr(IfcTankTypeEnum, 'SECTIONAL', INDETERMINATE) -expansion = express_getattr(IfcTankTypeEnum, 'EXPANSION', INDETERMINATE) -pressurevessel = express_getattr(IfcTankTypeEnum, 'PRESSUREVESSEL', INDETERMINATE) -userdefined = express_getattr(IfcTankTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTankTypeEnum, 'NOTDEFINED', INDETERMINATE) +preformed = IfcTankTypeEnum.PREFORMED +sectional = IfcTankTypeEnum.SECTIONAL +expansion = IfcTankTypeEnum.EXPANSION +pressurevessel = IfcTankTypeEnum.PRESSUREVESSEL +userdefined = IfcTankTypeEnum.USERDEFINED +notdefined = IfcTankTypeEnum.NOTDEFINED IfcTendonTypeEnum = enum_namespace() -strand = express_getattr(IfcTendonTypeEnum, 'STRAND', INDETERMINATE) -wire = express_getattr(IfcTendonTypeEnum, 'WIRE', INDETERMINATE) -bar = express_getattr(IfcTendonTypeEnum, 'BAR', INDETERMINATE) -coated = express_getattr(IfcTendonTypeEnum, 'COATED', INDETERMINATE) -userdefined = express_getattr(IfcTendonTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTendonTypeEnum, 'NOTDEFINED', INDETERMINATE) +strand = IfcTendonTypeEnum.STRAND +wire = IfcTendonTypeEnum.WIRE +bar = IfcTendonTypeEnum.BAR +coated = IfcTendonTypeEnum.COATED +userdefined = IfcTendonTypeEnum.USERDEFINED +notdefined = IfcTendonTypeEnum.NOTDEFINED IfcTextPath = enum_namespace() -left = express_getattr(IfcTextPath, 'LEFT', INDETERMINATE) -right = express_getattr(IfcTextPath, 'RIGHT', INDETERMINATE) -up = express_getattr(IfcTextPath, 'UP', INDETERMINATE) -down = express_getattr(IfcTextPath, 'DOWN', INDETERMINATE) +left = IfcTextPath.LEFT +right = IfcTextPath.RIGHT +up = IfcTextPath.UP +down = IfcTextPath.DOWN IfcThermalLoadSourceEnum = enum_namespace() -people = express_getattr(IfcThermalLoadSourceEnum, 'PEOPLE', INDETERMINATE) -lighting = express_getattr(IfcThermalLoadSourceEnum, 'LIGHTING', INDETERMINATE) -equipment = express_getattr(IfcThermalLoadSourceEnum, 'EQUIPMENT', INDETERMINATE) -ventilationindoorair = express_getattr(IfcThermalLoadSourceEnum, 'VENTILATIONINDOORAIR', INDETERMINATE) -ventilationoutsideair = express_getattr(IfcThermalLoadSourceEnum, 'VENTILATIONOUTSIDEAIR', INDETERMINATE) -recirculatedair = express_getattr(IfcThermalLoadSourceEnum, 'RECIRCULATEDAIR', INDETERMINATE) -exhaustair = express_getattr(IfcThermalLoadSourceEnum, 'EXHAUSTAIR', INDETERMINATE) -airexchangerate = express_getattr(IfcThermalLoadSourceEnum, 'AIREXCHANGERATE', INDETERMINATE) -drybulbtemperature = express_getattr(IfcThermalLoadSourceEnum, 'DRYBULBTEMPERATURE', INDETERMINATE) -relativehumidity = express_getattr(IfcThermalLoadSourceEnum, 'RELATIVEHUMIDITY', INDETERMINATE) -infiltration = express_getattr(IfcThermalLoadSourceEnum, 'INFILTRATION', INDETERMINATE) -userdefined = express_getattr(IfcThermalLoadSourceEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcThermalLoadSourceEnum, 'NOTDEFINED', INDETERMINATE) +people = IfcThermalLoadSourceEnum.PEOPLE +lighting = IfcThermalLoadSourceEnum.LIGHTING +equipment = IfcThermalLoadSourceEnum.EQUIPMENT +ventilationindoorair = IfcThermalLoadSourceEnum.VENTILATIONINDOORAIR +ventilationoutsideair = IfcThermalLoadSourceEnum.VENTILATIONOUTSIDEAIR +recirculatedair = IfcThermalLoadSourceEnum.RECIRCULATEDAIR +exhaustair = IfcThermalLoadSourceEnum.EXHAUSTAIR +airexchangerate = IfcThermalLoadSourceEnum.AIREXCHANGERATE +drybulbtemperature = IfcThermalLoadSourceEnum.DRYBULBTEMPERATURE +relativehumidity = IfcThermalLoadSourceEnum.RELATIVEHUMIDITY +infiltration = IfcThermalLoadSourceEnum.INFILTRATION +userdefined = IfcThermalLoadSourceEnum.USERDEFINED +notdefined = IfcThermalLoadSourceEnum.NOTDEFINED IfcThermalLoadTypeEnum = enum_namespace() -sensible = express_getattr(IfcThermalLoadTypeEnum, 'SENSIBLE', INDETERMINATE) -latent = express_getattr(IfcThermalLoadTypeEnum, 'LATENT', INDETERMINATE) -radiant = express_getattr(IfcThermalLoadTypeEnum, 'RADIANT', INDETERMINATE) -notdefined = express_getattr(IfcThermalLoadTypeEnum, 'NOTDEFINED', INDETERMINATE) +sensible = IfcThermalLoadTypeEnum.SENSIBLE +latent = IfcThermalLoadTypeEnum.LATENT +radiant = IfcThermalLoadTypeEnum.RADIANT +notdefined = IfcThermalLoadTypeEnum.NOTDEFINED IfcTimeSeriesDataTypeEnum = enum_namespace() -continuous = express_getattr(IfcTimeSeriesDataTypeEnum, 'CONTINUOUS', INDETERMINATE) -discrete = express_getattr(IfcTimeSeriesDataTypeEnum, 'DISCRETE', INDETERMINATE) -discretebinary = express_getattr(IfcTimeSeriesDataTypeEnum, 'DISCRETEBINARY', INDETERMINATE) -piecewisebinary = express_getattr(IfcTimeSeriesDataTypeEnum, 'PIECEWISEBINARY', INDETERMINATE) -piecewiseconstant = express_getattr(IfcTimeSeriesDataTypeEnum, 'PIECEWISECONSTANT', INDETERMINATE) -piecewisecontinuous = express_getattr(IfcTimeSeriesDataTypeEnum, 'PIECEWISECONTINUOUS', INDETERMINATE) -notdefined = express_getattr(IfcTimeSeriesDataTypeEnum, 'NOTDEFINED', INDETERMINATE) +continuous = IfcTimeSeriesDataTypeEnum.CONTINUOUS +discrete = IfcTimeSeriesDataTypeEnum.DISCRETE +discretebinary = IfcTimeSeriesDataTypeEnum.DISCRETEBINARY +piecewisebinary = IfcTimeSeriesDataTypeEnum.PIECEWISEBINARY +piecewiseconstant = IfcTimeSeriesDataTypeEnum.PIECEWISECONSTANT +piecewisecontinuous = IfcTimeSeriesDataTypeEnum.PIECEWISECONTINUOUS +notdefined = IfcTimeSeriesDataTypeEnum.NOTDEFINED IfcTimeSeriesScheduleTypeEnum = enum_namespace() -annual = express_getattr(IfcTimeSeriesScheduleTypeEnum, 'ANNUAL', INDETERMINATE) -monthly = express_getattr(IfcTimeSeriesScheduleTypeEnum, 'MONTHLY', INDETERMINATE) -weekly = express_getattr(IfcTimeSeriesScheduleTypeEnum, 'WEEKLY', INDETERMINATE) -daily = express_getattr(IfcTimeSeriesScheduleTypeEnum, 'DAILY', INDETERMINATE) -userdefined = express_getattr(IfcTimeSeriesScheduleTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTimeSeriesScheduleTypeEnum, 'NOTDEFINED', INDETERMINATE) +annual = IfcTimeSeriesScheduleTypeEnum.ANNUAL +monthly = IfcTimeSeriesScheduleTypeEnum.MONTHLY +weekly = IfcTimeSeriesScheduleTypeEnum.WEEKLY +daily = IfcTimeSeriesScheduleTypeEnum.DAILY +userdefined = IfcTimeSeriesScheduleTypeEnum.USERDEFINED +notdefined = IfcTimeSeriesScheduleTypeEnum.NOTDEFINED IfcTransformerTypeEnum = enum_namespace() -current = express_getattr(IfcTransformerTypeEnum, 'CURRENT', INDETERMINATE) -frequency = express_getattr(IfcTransformerTypeEnum, 'FREQUENCY', INDETERMINATE) -voltage = express_getattr(IfcTransformerTypeEnum, 'VOLTAGE', INDETERMINATE) -userdefined = express_getattr(IfcTransformerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTransformerTypeEnum, 'NOTDEFINED', INDETERMINATE) +current = IfcTransformerTypeEnum.CURRENT +frequency = IfcTransformerTypeEnum.FREQUENCY +voltage = IfcTransformerTypeEnum.VOLTAGE +userdefined = IfcTransformerTypeEnum.USERDEFINED +notdefined = IfcTransformerTypeEnum.NOTDEFINED IfcTransitionCode = enum_namespace() -discontinuous = express_getattr(IfcTransitionCode, 'DISCONTINUOUS', INDETERMINATE) -continuous = express_getattr(IfcTransitionCode, 'CONTINUOUS', INDETERMINATE) -contsamegradient = express_getattr(IfcTransitionCode, 'CONTSAMEGRADIENT', INDETERMINATE) -contsamegradientsamecurvature = express_getattr(IfcTransitionCode, 'CONTSAMEGRADIENTSAMECURVATURE', INDETERMINATE) +discontinuous = IfcTransitionCode.DISCONTINUOUS +continuous = IfcTransitionCode.CONTINUOUS +contsamegradient = IfcTransitionCode.CONTSAMEGRADIENT +contsamegradientsamecurvature = IfcTransitionCode.CONTSAMEGRADIENTSAMECURVATURE IfcTransportElementTypeEnum = enum_namespace() -elevator = express_getattr(IfcTransportElementTypeEnum, 'ELEVATOR', INDETERMINATE) -escalator = express_getattr(IfcTransportElementTypeEnum, 'ESCALATOR', INDETERMINATE) -movingwalkway = express_getattr(IfcTransportElementTypeEnum, 'MOVINGWALKWAY', INDETERMINATE) -userdefined = express_getattr(IfcTransportElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTransportElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +elevator = IfcTransportElementTypeEnum.ELEVATOR +escalator = IfcTransportElementTypeEnum.ESCALATOR +movingwalkway = IfcTransportElementTypeEnum.MOVINGWALKWAY +userdefined = IfcTransportElementTypeEnum.USERDEFINED +notdefined = IfcTransportElementTypeEnum.NOTDEFINED IfcTrimmingPreference = enum_namespace() -cartesian = express_getattr(IfcTrimmingPreference, 'CARTESIAN', INDETERMINATE) -parameter = express_getattr(IfcTrimmingPreference, 'PARAMETER', INDETERMINATE) -unspecified = express_getattr(IfcTrimmingPreference, 'UNSPECIFIED', INDETERMINATE) +cartesian = IfcTrimmingPreference.CARTESIAN +parameter = IfcTrimmingPreference.PARAMETER +unspecified = IfcTrimmingPreference.UNSPECIFIED IfcTubeBundleTypeEnum = enum_namespace() -finned = express_getattr(IfcTubeBundleTypeEnum, 'FINNED', INDETERMINATE) -userdefined = express_getattr(IfcTubeBundleTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTubeBundleTypeEnum, 'NOTDEFINED', INDETERMINATE) +finned = IfcTubeBundleTypeEnum.FINNED +userdefined = IfcTubeBundleTypeEnum.USERDEFINED +notdefined = IfcTubeBundleTypeEnum.NOTDEFINED IfcUnitEnum = enum_namespace() -absorbeddoseunit = express_getattr(IfcUnitEnum, 'ABSORBEDDOSEUNIT', INDETERMINATE) -amountofsubstanceunit = express_getattr(IfcUnitEnum, 'AMOUNTOFSUBSTANCEUNIT', INDETERMINATE) -areaunit = express_getattr(IfcUnitEnum, 'AREAUNIT', INDETERMINATE) -doseequivalentunit = express_getattr(IfcUnitEnum, 'DOSEEQUIVALENTUNIT', INDETERMINATE) -electriccapacitanceunit = express_getattr(IfcUnitEnum, 'ELECTRICCAPACITANCEUNIT', INDETERMINATE) -electricchargeunit = express_getattr(IfcUnitEnum, 'ELECTRICCHARGEUNIT', INDETERMINATE) -electricconductanceunit = express_getattr(IfcUnitEnum, 'ELECTRICCONDUCTANCEUNIT', INDETERMINATE) -electriccurrentunit = express_getattr(IfcUnitEnum, 'ELECTRICCURRENTUNIT', INDETERMINATE) -electricresistanceunit = express_getattr(IfcUnitEnum, 'ELECTRICRESISTANCEUNIT', INDETERMINATE) -electricvoltageunit = express_getattr(IfcUnitEnum, 'ELECTRICVOLTAGEUNIT', INDETERMINATE) -energyunit = express_getattr(IfcUnitEnum, 'ENERGYUNIT', INDETERMINATE) -forceunit = express_getattr(IfcUnitEnum, 'FORCEUNIT', INDETERMINATE) -frequencyunit = express_getattr(IfcUnitEnum, 'FREQUENCYUNIT', INDETERMINATE) -illuminanceunit = express_getattr(IfcUnitEnum, 'ILLUMINANCEUNIT', INDETERMINATE) -inductanceunit = express_getattr(IfcUnitEnum, 'INDUCTANCEUNIT', INDETERMINATE) -lengthunit = express_getattr(IfcUnitEnum, 'LENGTHUNIT', INDETERMINATE) -luminousfluxunit = express_getattr(IfcUnitEnum, 'LUMINOUSFLUXUNIT', INDETERMINATE) -luminousintensityunit = express_getattr(IfcUnitEnum, 'LUMINOUSINTENSITYUNIT', INDETERMINATE) -magneticfluxdensityunit = express_getattr(IfcUnitEnum, 'MAGNETICFLUXDENSITYUNIT', INDETERMINATE) -magneticfluxunit = express_getattr(IfcUnitEnum, 'MAGNETICFLUXUNIT', INDETERMINATE) -massunit = express_getattr(IfcUnitEnum, 'MASSUNIT', INDETERMINATE) -planeangleunit = express_getattr(IfcUnitEnum, 'PLANEANGLEUNIT', INDETERMINATE) -powerunit = express_getattr(IfcUnitEnum, 'POWERUNIT', INDETERMINATE) -pressureunit = express_getattr(IfcUnitEnum, 'PRESSUREUNIT', INDETERMINATE) -radioactivityunit = express_getattr(IfcUnitEnum, 'RADIOACTIVITYUNIT', INDETERMINATE) -solidangleunit = express_getattr(IfcUnitEnum, 'SOLIDANGLEUNIT', INDETERMINATE) -thermodynamictemperatureunit = express_getattr(IfcUnitEnum, 'THERMODYNAMICTEMPERATUREUNIT', INDETERMINATE) -timeunit = express_getattr(IfcUnitEnum, 'TIMEUNIT', INDETERMINATE) -volumeunit = express_getattr(IfcUnitEnum, 'VOLUMEUNIT', INDETERMINATE) -userdefined = express_getattr(IfcUnitEnum, 'USERDEFINED', INDETERMINATE) +absorbeddoseunit = IfcUnitEnum.ABSORBEDDOSEUNIT +amountofsubstanceunit = IfcUnitEnum.AMOUNTOFSUBSTANCEUNIT +areaunit = IfcUnitEnum.AREAUNIT +doseequivalentunit = IfcUnitEnum.DOSEEQUIVALENTUNIT +electriccapacitanceunit = IfcUnitEnum.ELECTRICCAPACITANCEUNIT +electricchargeunit = IfcUnitEnum.ELECTRICCHARGEUNIT +electricconductanceunit = IfcUnitEnum.ELECTRICCONDUCTANCEUNIT +electriccurrentunit = IfcUnitEnum.ELECTRICCURRENTUNIT +electricresistanceunit = IfcUnitEnum.ELECTRICRESISTANCEUNIT +electricvoltageunit = IfcUnitEnum.ELECTRICVOLTAGEUNIT +energyunit = IfcUnitEnum.ENERGYUNIT +forceunit = IfcUnitEnum.FORCEUNIT +frequencyunit = IfcUnitEnum.FREQUENCYUNIT +illuminanceunit = IfcUnitEnum.ILLUMINANCEUNIT +inductanceunit = IfcUnitEnum.INDUCTANCEUNIT +lengthunit = IfcUnitEnum.LENGTHUNIT +luminousfluxunit = IfcUnitEnum.LUMINOUSFLUXUNIT +luminousintensityunit = IfcUnitEnum.LUMINOUSINTENSITYUNIT +magneticfluxdensityunit = IfcUnitEnum.MAGNETICFLUXDENSITYUNIT +magneticfluxunit = IfcUnitEnum.MAGNETICFLUXUNIT +massunit = IfcUnitEnum.MASSUNIT +planeangleunit = IfcUnitEnum.PLANEANGLEUNIT +powerunit = IfcUnitEnum.POWERUNIT +pressureunit = IfcUnitEnum.PRESSUREUNIT +radioactivityunit = IfcUnitEnum.RADIOACTIVITYUNIT +solidangleunit = IfcUnitEnum.SOLIDANGLEUNIT +thermodynamictemperatureunit = IfcUnitEnum.THERMODYNAMICTEMPERATUREUNIT +timeunit = IfcUnitEnum.TIMEUNIT +volumeunit = IfcUnitEnum.VOLUMEUNIT +userdefined = IfcUnitEnum.USERDEFINED IfcUnitaryEquipmentTypeEnum = enum_namespace() -airhandler = express_getattr(IfcUnitaryEquipmentTypeEnum, 'AIRHANDLER', INDETERMINATE) -airconditioningunit = express_getattr(IfcUnitaryEquipmentTypeEnum, 'AIRCONDITIONINGUNIT', INDETERMINATE) -splitsystem = express_getattr(IfcUnitaryEquipmentTypeEnum, 'SPLITSYSTEM', INDETERMINATE) -rooftopunit = express_getattr(IfcUnitaryEquipmentTypeEnum, 'ROOFTOPUNIT', INDETERMINATE) -userdefined = express_getattr(IfcUnitaryEquipmentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcUnitaryEquipmentTypeEnum, 'NOTDEFINED', INDETERMINATE) +airhandler = IfcUnitaryEquipmentTypeEnum.AIRHANDLER +airconditioningunit = IfcUnitaryEquipmentTypeEnum.AIRCONDITIONINGUNIT +splitsystem = IfcUnitaryEquipmentTypeEnum.SPLITSYSTEM +rooftopunit = IfcUnitaryEquipmentTypeEnum.ROOFTOPUNIT +userdefined = IfcUnitaryEquipmentTypeEnum.USERDEFINED +notdefined = IfcUnitaryEquipmentTypeEnum.NOTDEFINED IfcValveTypeEnum = enum_namespace() -airrelease = express_getattr(IfcValveTypeEnum, 'AIRRELEASE', INDETERMINATE) -antivacuum = express_getattr(IfcValveTypeEnum, 'ANTIVACUUM', INDETERMINATE) -changeover = express_getattr(IfcValveTypeEnum, 'CHANGEOVER', INDETERMINATE) -check = express_getattr(IfcValveTypeEnum, 'CHECK', INDETERMINATE) -commissioning = express_getattr(IfcValveTypeEnum, 'COMMISSIONING', INDETERMINATE) -diverting = express_getattr(IfcValveTypeEnum, 'DIVERTING', INDETERMINATE) -drawoffcock = express_getattr(IfcValveTypeEnum, 'DRAWOFFCOCK', INDETERMINATE) -doublecheck = express_getattr(IfcValveTypeEnum, 'DOUBLECHECK', INDETERMINATE) -doubleregulating = express_getattr(IfcValveTypeEnum, 'DOUBLEREGULATING', INDETERMINATE) -faucet = express_getattr(IfcValveTypeEnum, 'FAUCET', INDETERMINATE) -flushing = express_getattr(IfcValveTypeEnum, 'FLUSHING', INDETERMINATE) -gascock = express_getattr(IfcValveTypeEnum, 'GASCOCK', INDETERMINATE) -gastap = express_getattr(IfcValveTypeEnum, 'GASTAP', INDETERMINATE) -isolating = express_getattr(IfcValveTypeEnum, 'ISOLATING', INDETERMINATE) -mixing = express_getattr(IfcValveTypeEnum, 'MIXING', INDETERMINATE) -pressurereducing = express_getattr(IfcValveTypeEnum, 'PRESSUREREDUCING', INDETERMINATE) -pressurerelief = express_getattr(IfcValveTypeEnum, 'PRESSURERELIEF', INDETERMINATE) -regulating = express_getattr(IfcValveTypeEnum, 'REGULATING', INDETERMINATE) -safetycutoff = express_getattr(IfcValveTypeEnum, 'SAFETYCUTOFF', INDETERMINATE) -steamtrap = express_getattr(IfcValveTypeEnum, 'STEAMTRAP', INDETERMINATE) -stopcock = express_getattr(IfcValveTypeEnum, 'STOPCOCK', INDETERMINATE) -userdefined = express_getattr(IfcValveTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcValveTypeEnum, 'NOTDEFINED', INDETERMINATE) +airrelease = IfcValveTypeEnum.AIRRELEASE +antivacuum = IfcValveTypeEnum.ANTIVACUUM +changeover = IfcValveTypeEnum.CHANGEOVER +check = IfcValveTypeEnum.CHECK +commissioning = IfcValveTypeEnum.COMMISSIONING +diverting = IfcValveTypeEnum.DIVERTING +drawoffcock = IfcValveTypeEnum.DRAWOFFCOCK +doublecheck = IfcValveTypeEnum.DOUBLECHECK +doubleregulating = IfcValveTypeEnum.DOUBLEREGULATING +faucet = IfcValveTypeEnum.FAUCET +flushing = IfcValveTypeEnum.FLUSHING +gascock = IfcValveTypeEnum.GASCOCK +gastap = IfcValveTypeEnum.GASTAP +isolating = IfcValveTypeEnum.ISOLATING +mixing = IfcValveTypeEnum.MIXING +pressurereducing = IfcValveTypeEnum.PRESSUREREDUCING +pressurerelief = IfcValveTypeEnum.PRESSURERELIEF +regulating = IfcValveTypeEnum.REGULATING +safetycutoff = IfcValveTypeEnum.SAFETYCUTOFF +steamtrap = IfcValveTypeEnum.STEAMTRAP +stopcock = IfcValveTypeEnum.STOPCOCK +userdefined = IfcValveTypeEnum.USERDEFINED +notdefined = IfcValveTypeEnum.NOTDEFINED IfcVibrationIsolatorTypeEnum = enum_namespace() -compression = express_getattr(IfcVibrationIsolatorTypeEnum, 'COMPRESSION', INDETERMINATE) -spring = express_getattr(IfcVibrationIsolatorTypeEnum, 'SPRING', INDETERMINATE) -userdefined = express_getattr(IfcVibrationIsolatorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcVibrationIsolatorTypeEnum, 'NOTDEFINED', INDETERMINATE) +compression = IfcVibrationIsolatorTypeEnum.COMPRESSION +spring = IfcVibrationIsolatorTypeEnum.SPRING +userdefined = IfcVibrationIsolatorTypeEnum.USERDEFINED +notdefined = IfcVibrationIsolatorTypeEnum.NOTDEFINED IfcWallTypeEnum = enum_namespace() -standard = express_getattr(IfcWallTypeEnum, 'STANDARD', INDETERMINATE) -polygonal = express_getattr(IfcWallTypeEnum, 'POLYGONAL', INDETERMINATE) -shear = express_getattr(IfcWallTypeEnum, 'SHEAR', INDETERMINATE) -elementedwall = express_getattr(IfcWallTypeEnum, 'ELEMENTEDWALL', INDETERMINATE) -plumbingwall = express_getattr(IfcWallTypeEnum, 'PLUMBINGWALL', INDETERMINATE) -userdefined = express_getattr(IfcWallTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcWallTypeEnum, 'NOTDEFINED', INDETERMINATE) +standard = IfcWallTypeEnum.STANDARD +polygonal = IfcWallTypeEnum.POLYGONAL +shear = IfcWallTypeEnum.SHEAR +elementedwall = IfcWallTypeEnum.ELEMENTEDWALL +plumbingwall = IfcWallTypeEnum.PLUMBINGWALL +userdefined = IfcWallTypeEnum.USERDEFINED +notdefined = IfcWallTypeEnum.NOTDEFINED IfcWasteTerminalTypeEnum = enum_namespace() -floortrap = express_getattr(IfcWasteTerminalTypeEnum, 'FLOORTRAP', INDETERMINATE) -floorwaste = express_getattr(IfcWasteTerminalTypeEnum, 'FLOORWASTE', INDETERMINATE) -gullysump = express_getattr(IfcWasteTerminalTypeEnum, 'GULLYSUMP', INDETERMINATE) -gullytrap = express_getattr(IfcWasteTerminalTypeEnum, 'GULLYTRAP', INDETERMINATE) -greaseinterceptor = express_getattr(IfcWasteTerminalTypeEnum, 'GREASEINTERCEPTOR', INDETERMINATE) -oilinterceptor = express_getattr(IfcWasteTerminalTypeEnum, 'OILINTERCEPTOR', INDETERMINATE) -petrolinterceptor = express_getattr(IfcWasteTerminalTypeEnum, 'PETROLINTERCEPTOR', INDETERMINATE) -roofdrain = express_getattr(IfcWasteTerminalTypeEnum, 'ROOFDRAIN', INDETERMINATE) -wastedisposalunit = express_getattr(IfcWasteTerminalTypeEnum, 'WASTEDISPOSALUNIT', INDETERMINATE) -wastetrap = express_getattr(IfcWasteTerminalTypeEnum, 'WASTETRAP', INDETERMINATE) -userdefined = express_getattr(IfcWasteTerminalTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcWasteTerminalTypeEnum, 'NOTDEFINED', INDETERMINATE) +floortrap = IfcWasteTerminalTypeEnum.FLOORTRAP +floorwaste = IfcWasteTerminalTypeEnum.FLOORWASTE +gullysump = IfcWasteTerminalTypeEnum.GULLYSUMP +gullytrap = IfcWasteTerminalTypeEnum.GULLYTRAP +greaseinterceptor = IfcWasteTerminalTypeEnum.GREASEINTERCEPTOR +oilinterceptor = IfcWasteTerminalTypeEnum.OILINTERCEPTOR +petrolinterceptor = IfcWasteTerminalTypeEnum.PETROLINTERCEPTOR +roofdrain = IfcWasteTerminalTypeEnum.ROOFDRAIN +wastedisposalunit = IfcWasteTerminalTypeEnum.WASTEDISPOSALUNIT +wastetrap = IfcWasteTerminalTypeEnum.WASTETRAP +userdefined = IfcWasteTerminalTypeEnum.USERDEFINED +notdefined = IfcWasteTerminalTypeEnum.NOTDEFINED IfcWindowPanelOperationEnum = enum_namespace() -sidehungrighthand = express_getattr(IfcWindowPanelOperationEnum, 'SIDEHUNGRIGHTHAND', INDETERMINATE) -sidehunglefthand = express_getattr(IfcWindowPanelOperationEnum, 'SIDEHUNGLEFTHAND', INDETERMINATE) -tiltandturnrighthand = express_getattr(IfcWindowPanelOperationEnum, 'TILTANDTURNRIGHTHAND', INDETERMINATE) -tiltandturnlefthand = express_getattr(IfcWindowPanelOperationEnum, 'TILTANDTURNLEFTHAND', INDETERMINATE) -tophung = express_getattr(IfcWindowPanelOperationEnum, 'TOPHUNG', INDETERMINATE) -bottomhung = express_getattr(IfcWindowPanelOperationEnum, 'BOTTOMHUNG', INDETERMINATE) -pivothorizontal = express_getattr(IfcWindowPanelOperationEnum, 'PIVOTHORIZONTAL', INDETERMINATE) -pivotvertical = express_getattr(IfcWindowPanelOperationEnum, 'PIVOTVERTICAL', INDETERMINATE) -slidinghorizontal = express_getattr(IfcWindowPanelOperationEnum, 'SLIDINGHORIZONTAL', INDETERMINATE) -slidingvertical = express_getattr(IfcWindowPanelOperationEnum, 'SLIDINGVERTICAL', INDETERMINATE) -removablecasement = express_getattr(IfcWindowPanelOperationEnum, 'REMOVABLECASEMENT', INDETERMINATE) -fixedcasement = express_getattr(IfcWindowPanelOperationEnum, 'FIXEDCASEMENT', INDETERMINATE) -otheroperation = express_getattr(IfcWindowPanelOperationEnum, 'OTHEROPERATION', INDETERMINATE) -notdefined = express_getattr(IfcWindowPanelOperationEnum, 'NOTDEFINED', INDETERMINATE) +sidehungrighthand = IfcWindowPanelOperationEnum.SIDEHUNGRIGHTHAND +sidehunglefthand = IfcWindowPanelOperationEnum.SIDEHUNGLEFTHAND +tiltandturnrighthand = IfcWindowPanelOperationEnum.TILTANDTURNRIGHTHAND +tiltandturnlefthand = IfcWindowPanelOperationEnum.TILTANDTURNLEFTHAND +tophung = IfcWindowPanelOperationEnum.TOPHUNG +bottomhung = IfcWindowPanelOperationEnum.BOTTOMHUNG +pivothorizontal = IfcWindowPanelOperationEnum.PIVOTHORIZONTAL +pivotvertical = IfcWindowPanelOperationEnum.PIVOTVERTICAL +slidinghorizontal = IfcWindowPanelOperationEnum.SLIDINGHORIZONTAL +slidingvertical = IfcWindowPanelOperationEnum.SLIDINGVERTICAL +removablecasement = IfcWindowPanelOperationEnum.REMOVABLECASEMENT +fixedcasement = IfcWindowPanelOperationEnum.FIXEDCASEMENT +otheroperation = IfcWindowPanelOperationEnum.OTHEROPERATION +notdefined = IfcWindowPanelOperationEnum.NOTDEFINED IfcWindowPanelPositionEnum = enum_namespace() -left = express_getattr(IfcWindowPanelPositionEnum, 'LEFT', INDETERMINATE) -middle = express_getattr(IfcWindowPanelPositionEnum, 'MIDDLE', INDETERMINATE) -right = express_getattr(IfcWindowPanelPositionEnum, 'RIGHT', INDETERMINATE) -bottom = express_getattr(IfcWindowPanelPositionEnum, 'BOTTOM', INDETERMINATE) -top = express_getattr(IfcWindowPanelPositionEnum, 'TOP', INDETERMINATE) -notdefined = express_getattr(IfcWindowPanelPositionEnum, 'NOTDEFINED', INDETERMINATE) +left = IfcWindowPanelPositionEnum.LEFT +middle = IfcWindowPanelPositionEnum.MIDDLE +right = IfcWindowPanelPositionEnum.RIGHT +bottom = IfcWindowPanelPositionEnum.BOTTOM +top = IfcWindowPanelPositionEnum.TOP +notdefined = IfcWindowPanelPositionEnum.NOTDEFINED IfcWindowStyleConstructionEnum = enum_namespace() -aluminium = express_getattr(IfcWindowStyleConstructionEnum, 'ALUMINIUM', INDETERMINATE) -high_grade_steel = express_getattr(IfcWindowStyleConstructionEnum, 'HIGH_GRADE_STEEL', INDETERMINATE) -steel = express_getattr(IfcWindowStyleConstructionEnum, 'STEEL', INDETERMINATE) -wood = express_getattr(IfcWindowStyleConstructionEnum, 'WOOD', INDETERMINATE) -aluminium_wood = express_getattr(IfcWindowStyleConstructionEnum, 'ALUMINIUM_WOOD', INDETERMINATE) -plastic = express_getattr(IfcWindowStyleConstructionEnum, 'PLASTIC', INDETERMINATE) -other_construction = express_getattr(IfcWindowStyleConstructionEnum, 'OTHER_CONSTRUCTION', INDETERMINATE) -notdefined = express_getattr(IfcWindowStyleConstructionEnum, 'NOTDEFINED', INDETERMINATE) +aluminium = IfcWindowStyleConstructionEnum.ALUMINIUM +high_grade_steel = IfcWindowStyleConstructionEnum.HIGH_GRADE_STEEL +steel = IfcWindowStyleConstructionEnum.STEEL +wood = IfcWindowStyleConstructionEnum.WOOD +aluminium_wood = IfcWindowStyleConstructionEnum.ALUMINIUM_WOOD +plastic = IfcWindowStyleConstructionEnum.PLASTIC +other_construction = IfcWindowStyleConstructionEnum.OTHER_CONSTRUCTION +notdefined = IfcWindowStyleConstructionEnum.NOTDEFINED IfcWindowStyleOperationEnum = enum_namespace() -single_panel = express_getattr(IfcWindowStyleOperationEnum, 'SINGLE_PANEL', INDETERMINATE) -double_panel_vertical = express_getattr(IfcWindowStyleOperationEnum, 'DOUBLE_PANEL_VERTICAL', INDETERMINATE) -double_panel_horizontal = express_getattr(IfcWindowStyleOperationEnum, 'DOUBLE_PANEL_HORIZONTAL', INDETERMINATE) -triple_panel_vertical = express_getattr(IfcWindowStyleOperationEnum, 'TRIPLE_PANEL_VERTICAL', INDETERMINATE) -triple_panel_bottom = express_getattr(IfcWindowStyleOperationEnum, 'TRIPLE_PANEL_BOTTOM', INDETERMINATE) -triple_panel_top = express_getattr(IfcWindowStyleOperationEnum, 'TRIPLE_PANEL_TOP', INDETERMINATE) -triple_panel_left = express_getattr(IfcWindowStyleOperationEnum, 'TRIPLE_PANEL_LEFT', INDETERMINATE) -triple_panel_right = express_getattr(IfcWindowStyleOperationEnum, 'TRIPLE_PANEL_RIGHT', INDETERMINATE) -triple_panel_horizontal = express_getattr(IfcWindowStyleOperationEnum, 'TRIPLE_PANEL_HORIZONTAL', INDETERMINATE) -userdefined = express_getattr(IfcWindowStyleOperationEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcWindowStyleOperationEnum, 'NOTDEFINED', INDETERMINATE) +single_panel = IfcWindowStyleOperationEnum.SINGLE_PANEL +double_panel_vertical = IfcWindowStyleOperationEnum.DOUBLE_PANEL_VERTICAL +double_panel_horizontal = IfcWindowStyleOperationEnum.DOUBLE_PANEL_HORIZONTAL +triple_panel_vertical = IfcWindowStyleOperationEnum.TRIPLE_PANEL_VERTICAL +triple_panel_bottom = IfcWindowStyleOperationEnum.TRIPLE_PANEL_BOTTOM +triple_panel_top = IfcWindowStyleOperationEnum.TRIPLE_PANEL_TOP +triple_panel_left = IfcWindowStyleOperationEnum.TRIPLE_PANEL_LEFT +triple_panel_right = IfcWindowStyleOperationEnum.TRIPLE_PANEL_RIGHT +triple_panel_horizontal = IfcWindowStyleOperationEnum.TRIPLE_PANEL_HORIZONTAL +userdefined = IfcWindowStyleOperationEnum.USERDEFINED +notdefined = IfcWindowStyleOperationEnum.NOTDEFINED IfcWorkControlTypeEnum = enum_namespace() -actual = express_getattr(IfcWorkControlTypeEnum, 'ACTUAL', INDETERMINATE) -baseline = express_getattr(IfcWorkControlTypeEnum, 'BASELINE', INDETERMINATE) -planned = express_getattr(IfcWorkControlTypeEnum, 'PLANNED', INDETERMINATE) -userdefined = express_getattr(IfcWorkControlTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcWorkControlTypeEnum, 'NOTDEFINED', INDETERMINATE) +actual = IfcWorkControlTypeEnum.ACTUAL +baseline = IfcWorkControlTypeEnum.BASELINE +planned = IfcWorkControlTypeEnum.PLANNED +userdefined = IfcWorkControlTypeEnum.USERDEFINED +notdefined = IfcWorkControlTypeEnum.NOTDEFINED def Ifc2DCompositeCurve(*args, **kwargs): return ifcopenshell.create_entity('Ifc2DCompositeCurve', 'IFC2X3', *args, **kwargs) diff --git a/src/ifcopenshell-python/ifcopenshell/express/rules/IFC4.py b/src/ifcopenshell-python/ifcopenshell/express/rules/IFC4.py index bf5e86438f4..791737c57a0 100644 --- a/src/ifcopenshell-python/ifcopenshell/express/rules/IFC4.py +++ b/src/ifcopenshell-python/ifcopenshell/express/rules/IFC4.py @@ -1,5 +1,8 @@ import ifcopenshell +def is_indeterminate(v): + return v is None or type(v).__name__ == 'indeterminate_type' + def exists(v): if callable(v): try: @@ -7,10 +10,10 @@ def exists(v): except IndexError as e: return False else: - return v is not None + return not is_indeterminate(v) def nvl(v, default): - return v if v is not None else default + return v if not is_indeterminate(v) else default def is_entity(inst): if isinstance(inst, ifcopenshell.entity_instance): @@ -22,13 +25,13 @@ def is_entity(inst): def express_len(v): if isinstance(v, ifcopenshell.entity_instance) and (not is_entity(v)): v = v[0] - elif v is None or v is INDETERMINATE: + elif is_indeterminate(v): return INDETERMINATE return len(v) old_range = range def range(*args): - if INDETERMINATE in args: + if any(map(is_indeterminate, args)): return yield from old_range(*args) sizeof = express_len @@ -149,1844 +152,1844 @@ class enum_namespace: def __getattr__(self, k): return express_getattr(k, 'upper', INDETERMINATE)() IfcActionRequestTypeEnum = enum_namespace() -email = express_getattr(IfcActionRequestTypeEnum, 'EMAIL', INDETERMINATE) -fax = express_getattr(IfcActionRequestTypeEnum, 'FAX', INDETERMINATE) -phone = express_getattr(IfcActionRequestTypeEnum, 'PHONE', INDETERMINATE) -post = express_getattr(IfcActionRequestTypeEnum, 'POST', INDETERMINATE) -verbal = express_getattr(IfcActionRequestTypeEnum, 'VERBAL', INDETERMINATE) -userdefined = express_getattr(IfcActionRequestTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcActionRequestTypeEnum, 'NOTDEFINED', INDETERMINATE) +email = IfcActionRequestTypeEnum.EMAIL +fax = IfcActionRequestTypeEnum.FAX +phone = IfcActionRequestTypeEnum.PHONE +post = IfcActionRequestTypeEnum.POST +verbal = IfcActionRequestTypeEnum.VERBAL +userdefined = IfcActionRequestTypeEnum.USERDEFINED +notdefined = IfcActionRequestTypeEnum.NOTDEFINED IfcActionSourceTypeEnum = enum_namespace() -dead_load_g = express_getattr(IfcActionSourceTypeEnum, 'DEAD_LOAD_G', INDETERMINATE) -completion_g1 = express_getattr(IfcActionSourceTypeEnum, 'COMPLETION_G1', INDETERMINATE) -live_load_q = express_getattr(IfcActionSourceTypeEnum, 'LIVE_LOAD_Q', INDETERMINATE) -snow_s = express_getattr(IfcActionSourceTypeEnum, 'SNOW_S', INDETERMINATE) -wind_w = express_getattr(IfcActionSourceTypeEnum, 'WIND_W', INDETERMINATE) -prestressing_p = express_getattr(IfcActionSourceTypeEnum, 'PRESTRESSING_P', INDETERMINATE) -settlement_u = express_getattr(IfcActionSourceTypeEnum, 'SETTLEMENT_U', INDETERMINATE) -temperature_t = express_getattr(IfcActionSourceTypeEnum, 'TEMPERATURE_T', INDETERMINATE) -earthquake_e = express_getattr(IfcActionSourceTypeEnum, 'EARTHQUAKE_E', INDETERMINATE) -fire = express_getattr(IfcActionSourceTypeEnum, 'FIRE', INDETERMINATE) -impulse = express_getattr(IfcActionSourceTypeEnum, 'IMPULSE', INDETERMINATE) -impact = express_getattr(IfcActionSourceTypeEnum, 'IMPACT', INDETERMINATE) -transport = express_getattr(IfcActionSourceTypeEnum, 'TRANSPORT', INDETERMINATE) -erection = express_getattr(IfcActionSourceTypeEnum, 'ERECTION', INDETERMINATE) -propping = express_getattr(IfcActionSourceTypeEnum, 'PROPPING', INDETERMINATE) -system_imperfection = express_getattr(IfcActionSourceTypeEnum, 'SYSTEM_IMPERFECTION', INDETERMINATE) -shrinkage = express_getattr(IfcActionSourceTypeEnum, 'SHRINKAGE', INDETERMINATE) -creep = express_getattr(IfcActionSourceTypeEnum, 'CREEP', INDETERMINATE) -lack_of_fit = express_getattr(IfcActionSourceTypeEnum, 'LACK_OF_FIT', INDETERMINATE) -buoyancy = express_getattr(IfcActionSourceTypeEnum, 'BUOYANCY', INDETERMINATE) -ice = express_getattr(IfcActionSourceTypeEnum, 'ICE', INDETERMINATE) -current = express_getattr(IfcActionSourceTypeEnum, 'CURRENT', INDETERMINATE) -wave = express_getattr(IfcActionSourceTypeEnum, 'WAVE', INDETERMINATE) -rain = express_getattr(IfcActionSourceTypeEnum, 'RAIN', INDETERMINATE) -brakes = express_getattr(IfcActionSourceTypeEnum, 'BRAKES', INDETERMINATE) -userdefined = express_getattr(IfcActionSourceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcActionSourceTypeEnum, 'NOTDEFINED', INDETERMINATE) +dead_load_g = IfcActionSourceTypeEnum.DEAD_LOAD_G +completion_g1 = IfcActionSourceTypeEnum.COMPLETION_G1 +live_load_q = IfcActionSourceTypeEnum.LIVE_LOAD_Q +snow_s = IfcActionSourceTypeEnum.SNOW_S +wind_w = IfcActionSourceTypeEnum.WIND_W +prestressing_p = IfcActionSourceTypeEnum.PRESTRESSING_P +settlement_u = IfcActionSourceTypeEnum.SETTLEMENT_U +temperature_t = IfcActionSourceTypeEnum.TEMPERATURE_T +earthquake_e = IfcActionSourceTypeEnum.EARTHQUAKE_E +fire = IfcActionSourceTypeEnum.FIRE +impulse = IfcActionSourceTypeEnum.IMPULSE +impact = IfcActionSourceTypeEnum.IMPACT +transport = IfcActionSourceTypeEnum.TRANSPORT +erection = IfcActionSourceTypeEnum.ERECTION +propping = IfcActionSourceTypeEnum.PROPPING +system_imperfection = IfcActionSourceTypeEnum.SYSTEM_IMPERFECTION +shrinkage = IfcActionSourceTypeEnum.SHRINKAGE +creep = IfcActionSourceTypeEnum.CREEP +lack_of_fit = IfcActionSourceTypeEnum.LACK_OF_FIT +buoyancy = IfcActionSourceTypeEnum.BUOYANCY +ice = IfcActionSourceTypeEnum.ICE +current = IfcActionSourceTypeEnum.CURRENT +wave = IfcActionSourceTypeEnum.WAVE +rain = IfcActionSourceTypeEnum.RAIN +brakes = IfcActionSourceTypeEnum.BRAKES +userdefined = IfcActionSourceTypeEnum.USERDEFINED +notdefined = IfcActionSourceTypeEnum.NOTDEFINED IfcActionTypeEnum = enum_namespace() -permanent_g = express_getattr(IfcActionTypeEnum, 'PERMANENT_G', INDETERMINATE) -variable_q = express_getattr(IfcActionTypeEnum, 'VARIABLE_Q', INDETERMINATE) -extraordinary_a = express_getattr(IfcActionTypeEnum, 'EXTRAORDINARY_A', INDETERMINATE) -userdefined = express_getattr(IfcActionTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcActionTypeEnum, 'NOTDEFINED', INDETERMINATE) +permanent_g = IfcActionTypeEnum.PERMANENT_G +variable_q = IfcActionTypeEnum.VARIABLE_Q +extraordinary_a = IfcActionTypeEnum.EXTRAORDINARY_A +userdefined = IfcActionTypeEnum.USERDEFINED +notdefined = IfcActionTypeEnum.NOTDEFINED IfcActuatorTypeEnum = enum_namespace() -electricactuator = express_getattr(IfcActuatorTypeEnum, 'ELECTRICACTUATOR', INDETERMINATE) -handoperatedactuator = express_getattr(IfcActuatorTypeEnum, 'HANDOPERATEDACTUATOR', INDETERMINATE) -hydraulicactuator = express_getattr(IfcActuatorTypeEnum, 'HYDRAULICACTUATOR', INDETERMINATE) -pneumaticactuator = express_getattr(IfcActuatorTypeEnum, 'PNEUMATICACTUATOR', INDETERMINATE) -thermostaticactuator = express_getattr(IfcActuatorTypeEnum, 'THERMOSTATICACTUATOR', INDETERMINATE) -userdefined = express_getattr(IfcActuatorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcActuatorTypeEnum, 'NOTDEFINED', INDETERMINATE) +electricactuator = IfcActuatorTypeEnum.ELECTRICACTUATOR +handoperatedactuator = IfcActuatorTypeEnum.HANDOPERATEDACTUATOR +hydraulicactuator = IfcActuatorTypeEnum.HYDRAULICACTUATOR +pneumaticactuator = IfcActuatorTypeEnum.PNEUMATICACTUATOR +thermostaticactuator = IfcActuatorTypeEnum.THERMOSTATICACTUATOR +userdefined = IfcActuatorTypeEnum.USERDEFINED +notdefined = IfcActuatorTypeEnum.NOTDEFINED IfcAddressTypeEnum = enum_namespace() -office = express_getattr(IfcAddressTypeEnum, 'OFFICE', INDETERMINATE) -site = express_getattr(IfcAddressTypeEnum, 'SITE', INDETERMINATE) -home = express_getattr(IfcAddressTypeEnum, 'HOME', INDETERMINATE) -distributionpoint = express_getattr(IfcAddressTypeEnum, 'DISTRIBUTIONPOINT', INDETERMINATE) -userdefined = express_getattr(IfcAddressTypeEnum, 'USERDEFINED', INDETERMINATE) +office = IfcAddressTypeEnum.OFFICE +site = IfcAddressTypeEnum.SITE +home = IfcAddressTypeEnum.HOME +distributionpoint = IfcAddressTypeEnum.DISTRIBUTIONPOINT +userdefined = IfcAddressTypeEnum.USERDEFINED IfcAirTerminalBoxTypeEnum = enum_namespace() -constantflow = express_getattr(IfcAirTerminalBoxTypeEnum, 'CONSTANTFLOW', INDETERMINATE) -variableflowpressuredependant = express_getattr(IfcAirTerminalBoxTypeEnum, 'VARIABLEFLOWPRESSUREDEPENDANT', INDETERMINATE) -variableflowpressureindependant = express_getattr(IfcAirTerminalBoxTypeEnum, 'VARIABLEFLOWPRESSUREINDEPENDANT', INDETERMINATE) -userdefined = express_getattr(IfcAirTerminalBoxTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAirTerminalBoxTypeEnum, 'NOTDEFINED', INDETERMINATE) +constantflow = IfcAirTerminalBoxTypeEnum.CONSTANTFLOW +variableflowpressuredependant = IfcAirTerminalBoxTypeEnum.VARIABLEFLOWPRESSUREDEPENDANT +variableflowpressureindependant = IfcAirTerminalBoxTypeEnum.VARIABLEFLOWPRESSUREINDEPENDANT +userdefined = IfcAirTerminalBoxTypeEnum.USERDEFINED +notdefined = IfcAirTerminalBoxTypeEnum.NOTDEFINED IfcAirTerminalTypeEnum = enum_namespace() -diffuser = express_getattr(IfcAirTerminalTypeEnum, 'DIFFUSER', INDETERMINATE) -grille = express_getattr(IfcAirTerminalTypeEnum, 'GRILLE', INDETERMINATE) -louvre = express_getattr(IfcAirTerminalTypeEnum, 'LOUVRE', INDETERMINATE) -register = express_getattr(IfcAirTerminalTypeEnum, 'REGISTER', INDETERMINATE) -userdefined = express_getattr(IfcAirTerminalTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAirTerminalTypeEnum, 'NOTDEFINED', INDETERMINATE) +diffuser = IfcAirTerminalTypeEnum.DIFFUSER +grille = IfcAirTerminalTypeEnum.GRILLE +louvre = IfcAirTerminalTypeEnum.LOUVRE +register = IfcAirTerminalTypeEnum.REGISTER +userdefined = IfcAirTerminalTypeEnum.USERDEFINED +notdefined = IfcAirTerminalTypeEnum.NOTDEFINED IfcAirToAirHeatRecoveryTypeEnum = enum_namespace() -fixedplatecounterflowexchanger = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'FIXEDPLATECOUNTERFLOWEXCHANGER', INDETERMINATE) -fixedplatecrossflowexchanger = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'FIXEDPLATECROSSFLOWEXCHANGER', INDETERMINATE) -fixedplateparallelflowexchanger = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'FIXEDPLATEPARALLELFLOWEXCHANGER', INDETERMINATE) -rotarywheel = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'ROTARYWHEEL', INDETERMINATE) -runaroundcoilloop = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'RUNAROUNDCOILLOOP', INDETERMINATE) -heatpipe = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'HEATPIPE', INDETERMINATE) -twintowerenthalpyrecoveryloops = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'TWINTOWERENTHALPYRECOVERYLOOPS', INDETERMINATE) -thermosiphonsealedtubeheatexchangers = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'THERMOSIPHONSEALEDTUBEHEATEXCHANGERS', INDETERMINATE) -thermosiphoncoiltypeheatexchangers = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'THERMOSIPHONCOILTYPEHEATEXCHANGERS', INDETERMINATE) -userdefined = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'NOTDEFINED', INDETERMINATE) +fixedplatecounterflowexchanger = IfcAirToAirHeatRecoveryTypeEnum.FIXEDPLATECOUNTERFLOWEXCHANGER +fixedplatecrossflowexchanger = IfcAirToAirHeatRecoveryTypeEnum.FIXEDPLATECROSSFLOWEXCHANGER +fixedplateparallelflowexchanger = IfcAirToAirHeatRecoveryTypeEnum.FIXEDPLATEPARALLELFLOWEXCHANGER +rotarywheel = IfcAirToAirHeatRecoveryTypeEnum.ROTARYWHEEL +runaroundcoilloop = IfcAirToAirHeatRecoveryTypeEnum.RUNAROUNDCOILLOOP +heatpipe = IfcAirToAirHeatRecoveryTypeEnum.HEATPIPE +twintowerenthalpyrecoveryloops = IfcAirToAirHeatRecoveryTypeEnum.TWINTOWERENTHALPYRECOVERYLOOPS +thermosiphonsealedtubeheatexchangers = IfcAirToAirHeatRecoveryTypeEnum.THERMOSIPHONSEALEDTUBEHEATEXCHANGERS +thermosiphoncoiltypeheatexchangers = IfcAirToAirHeatRecoveryTypeEnum.THERMOSIPHONCOILTYPEHEATEXCHANGERS +userdefined = IfcAirToAirHeatRecoveryTypeEnum.USERDEFINED +notdefined = IfcAirToAirHeatRecoveryTypeEnum.NOTDEFINED IfcAlarmTypeEnum = enum_namespace() -bell = express_getattr(IfcAlarmTypeEnum, 'BELL', INDETERMINATE) -breakglassbutton = express_getattr(IfcAlarmTypeEnum, 'BREAKGLASSBUTTON', INDETERMINATE) -light = express_getattr(IfcAlarmTypeEnum, 'LIGHT', INDETERMINATE) -manualpullbox = express_getattr(IfcAlarmTypeEnum, 'MANUALPULLBOX', INDETERMINATE) -siren = express_getattr(IfcAlarmTypeEnum, 'SIREN', INDETERMINATE) -whistle = express_getattr(IfcAlarmTypeEnum, 'WHISTLE', INDETERMINATE) -userdefined = express_getattr(IfcAlarmTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAlarmTypeEnum, 'NOTDEFINED', INDETERMINATE) +bell = IfcAlarmTypeEnum.BELL +breakglassbutton = IfcAlarmTypeEnum.BREAKGLASSBUTTON +light = IfcAlarmTypeEnum.LIGHT +manualpullbox = IfcAlarmTypeEnum.MANUALPULLBOX +siren = IfcAlarmTypeEnum.SIREN +whistle = IfcAlarmTypeEnum.WHISTLE +userdefined = IfcAlarmTypeEnum.USERDEFINED +notdefined = IfcAlarmTypeEnum.NOTDEFINED IfcAnalysisModelTypeEnum = enum_namespace() -in_plane_loading_2d = express_getattr(IfcAnalysisModelTypeEnum, 'IN_PLANE_LOADING_2D', INDETERMINATE) -out_plane_loading_2d = express_getattr(IfcAnalysisModelTypeEnum, 'OUT_PLANE_LOADING_2D', INDETERMINATE) -loading_3d = express_getattr(IfcAnalysisModelTypeEnum, 'LOADING_3D', INDETERMINATE) -userdefined = express_getattr(IfcAnalysisModelTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAnalysisModelTypeEnum, 'NOTDEFINED', INDETERMINATE) +in_plane_loading_2d = IfcAnalysisModelTypeEnum.IN_PLANE_LOADING_2D +out_plane_loading_2d = IfcAnalysisModelTypeEnum.OUT_PLANE_LOADING_2D +loading_3d = IfcAnalysisModelTypeEnum.LOADING_3D +userdefined = IfcAnalysisModelTypeEnum.USERDEFINED +notdefined = IfcAnalysisModelTypeEnum.NOTDEFINED IfcAnalysisTheoryTypeEnum = enum_namespace() -first_order_theory = express_getattr(IfcAnalysisTheoryTypeEnum, 'FIRST_ORDER_THEORY', INDETERMINATE) -second_order_theory = express_getattr(IfcAnalysisTheoryTypeEnum, 'SECOND_ORDER_THEORY', INDETERMINATE) -third_order_theory = express_getattr(IfcAnalysisTheoryTypeEnum, 'THIRD_ORDER_THEORY', INDETERMINATE) -full_nonlinear_theory = express_getattr(IfcAnalysisTheoryTypeEnum, 'FULL_NONLINEAR_THEORY', INDETERMINATE) -userdefined = express_getattr(IfcAnalysisTheoryTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAnalysisTheoryTypeEnum, 'NOTDEFINED', INDETERMINATE) +first_order_theory = IfcAnalysisTheoryTypeEnum.FIRST_ORDER_THEORY +second_order_theory = IfcAnalysisTheoryTypeEnum.SECOND_ORDER_THEORY +third_order_theory = IfcAnalysisTheoryTypeEnum.THIRD_ORDER_THEORY +full_nonlinear_theory = IfcAnalysisTheoryTypeEnum.FULL_NONLINEAR_THEORY +userdefined = IfcAnalysisTheoryTypeEnum.USERDEFINED +notdefined = IfcAnalysisTheoryTypeEnum.NOTDEFINED IfcArithmeticOperatorEnum = enum_namespace() -add = express_getattr(IfcArithmeticOperatorEnum, 'ADD', INDETERMINATE) -divide = express_getattr(IfcArithmeticOperatorEnum, 'DIVIDE', INDETERMINATE) -multiply = express_getattr(IfcArithmeticOperatorEnum, 'MULTIPLY', INDETERMINATE) -subtract = express_getattr(IfcArithmeticOperatorEnum, 'SUBTRACT', INDETERMINATE) +add = IfcArithmeticOperatorEnum.ADD +divide = IfcArithmeticOperatorEnum.DIVIDE +multiply = IfcArithmeticOperatorEnum.MULTIPLY +subtract = IfcArithmeticOperatorEnum.SUBTRACT IfcAssemblyPlaceEnum = enum_namespace() -site = express_getattr(IfcAssemblyPlaceEnum, 'SITE', INDETERMINATE) -factory = express_getattr(IfcAssemblyPlaceEnum, 'FACTORY', INDETERMINATE) -notdefined = express_getattr(IfcAssemblyPlaceEnum, 'NOTDEFINED', INDETERMINATE) +site = IfcAssemblyPlaceEnum.SITE +factory = IfcAssemblyPlaceEnum.FACTORY +notdefined = IfcAssemblyPlaceEnum.NOTDEFINED IfcAudioVisualApplianceTypeEnum = enum_namespace() -amplifier = express_getattr(IfcAudioVisualApplianceTypeEnum, 'AMPLIFIER', INDETERMINATE) -camera = express_getattr(IfcAudioVisualApplianceTypeEnum, 'CAMERA', INDETERMINATE) -display = express_getattr(IfcAudioVisualApplianceTypeEnum, 'DISPLAY', INDETERMINATE) -microphone = express_getattr(IfcAudioVisualApplianceTypeEnum, 'MICROPHONE', INDETERMINATE) -player = express_getattr(IfcAudioVisualApplianceTypeEnum, 'PLAYER', INDETERMINATE) -projector = express_getattr(IfcAudioVisualApplianceTypeEnum, 'PROJECTOR', INDETERMINATE) -receiver = express_getattr(IfcAudioVisualApplianceTypeEnum, 'RECEIVER', INDETERMINATE) -speaker = express_getattr(IfcAudioVisualApplianceTypeEnum, 'SPEAKER', INDETERMINATE) -switcher = express_getattr(IfcAudioVisualApplianceTypeEnum, 'SWITCHER', INDETERMINATE) -telephone = express_getattr(IfcAudioVisualApplianceTypeEnum, 'TELEPHONE', INDETERMINATE) -tuner = express_getattr(IfcAudioVisualApplianceTypeEnum, 'TUNER', INDETERMINATE) -userdefined = express_getattr(IfcAudioVisualApplianceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAudioVisualApplianceTypeEnum, 'NOTDEFINED', INDETERMINATE) +amplifier = IfcAudioVisualApplianceTypeEnum.AMPLIFIER +camera = IfcAudioVisualApplianceTypeEnum.CAMERA +display = IfcAudioVisualApplianceTypeEnum.DISPLAY +microphone = IfcAudioVisualApplianceTypeEnum.MICROPHONE +player = IfcAudioVisualApplianceTypeEnum.PLAYER +projector = IfcAudioVisualApplianceTypeEnum.PROJECTOR +receiver = IfcAudioVisualApplianceTypeEnum.RECEIVER +speaker = IfcAudioVisualApplianceTypeEnum.SPEAKER +switcher = IfcAudioVisualApplianceTypeEnum.SWITCHER +telephone = IfcAudioVisualApplianceTypeEnum.TELEPHONE +tuner = IfcAudioVisualApplianceTypeEnum.TUNER +userdefined = IfcAudioVisualApplianceTypeEnum.USERDEFINED +notdefined = IfcAudioVisualApplianceTypeEnum.NOTDEFINED IfcBSplineCurveForm = enum_namespace() -polyline_form = express_getattr(IfcBSplineCurveForm, 'POLYLINE_FORM', INDETERMINATE) -circular_arc = express_getattr(IfcBSplineCurveForm, 'CIRCULAR_ARC', INDETERMINATE) -elliptic_arc = express_getattr(IfcBSplineCurveForm, 'ELLIPTIC_ARC', INDETERMINATE) -parabolic_arc = express_getattr(IfcBSplineCurveForm, 'PARABOLIC_ARC', INDETERMINATE) -hyperbolic_arc = express_getattr(IfcBSplineCurveForm, 'HYPERBOLIC_ARC', INDETERMINATE) -unspecified = express_getattr(IfcBSplineCurveForm, 'UNSPECIFIED', INDETERMINATE) +polyline_form = IfcBSplineCurveForm.POLYLINE_FORM +circular_arc = IfcBSplineCurveForm.CIRCULAR_ARC +elliptic_arc = IfcBSplineCurveForm.ELLIPTIC_ARC +parabolic_arc = IfcBSplineCurveForm.PARABOLIC_ARC +hyperbolic_arc = IfcBSplineCurveForm.HYPERBOLIC_ARC +unspecified = IfcBSplineCurveForm.UNSPECIFIED IfcBSplineSurfaceForm = enum_namespace() -plane_surf = express_getattr(IfcBSplineSurfaceForm, 'PLANE_SURF', INDETERMINATE) -cylindrical_surf = express_getattr(IfcBSplineSurfaceForm, 'CYLINDRICAL_SURF', INDETERMINATE) -conical_surf = express_getattr(IfcBSplineSurfaceForm, 'CONICAL_SURF', INDETERMINATE) -spherical_surf = express_getattr(IfcBSplineSurfaceForm, 'SPHERICAL_SURF', INDETERMINATE) -toroidal_surf = express_getattr(IfcBSplineSurfaceForm, 'TOROIDAL_SURF', INDETERMINATE) -surf_of_revolution = express_getattr(IfcBSplineSurfaceForm, 'SURF_OF_REVOLUTION', INDETERMINATE) -ruled_surf = express_getattr(IfcBSplineSurfaceForm, 'RULED_SURF', INDETERMINATE) -generalised_cone = express_getattr(IfcBSplineSurfaceForm, 'GENERALISED_CONE', INDETERMINATE) -quadric_surf = express_getattr(IfcBSplineSurfaceForm, 'QUADRIC_SURF', INDETERMINATE) -surf_of_linear_extrusion = express_getattr(IfcBSplineSurfaceForm, 'SURF_OF_LINEAR_EXTRUSION', INDETERMINATE) -unspecified = express_getattr(IfcBSplineSurfaceForm, 'UNSPECIFIED', INDETERMINATE) +plane_surf = IfcBSplineSurfaceForm.PLANE_SURF +cylindrical_surf = IfcBSplineSurfaceForm.CYLINDRICAL_SURF +conical_surf = IfcBSplineSurfaceForm.CONICAL_SURF +spherical_surf = IfcBSplineSurfaceForm.SPHERICAL_SURF +toroidal_surf = IfcBSplineSurfaceForm.TOROIDAL_SURF +surf_of_revolution = IfcBSplineSurfaceForm.SURF_OF_REVOLUTION +ruled_surf = IfcBSplineSurfaceForm.RULED_SURF +generalised_cone = IfcBSplineSurfaceForm.GENERALISED_CONE +quadric_surf = IfcBSplineSurfaceForm.QUADRIC_SURF +surf_of_linear_extrusion = IfcBSplineSurfaceForm.SURF_OF_LINEAR_EXTRUSION +unspecified = IfcBSplineSurfaceForm.UNSPECIFIED IfcBeamTypeEnum = enum_namespace() -beam = express_getattr(IfcBeamTypeEnum, 'BEAM', INDETERMINATE) -joist = express_getattr(IfcBeamTypeEnum, 'JOIST', INDETERMINATE) -hollowcore = express_getattr(IfcBeamTypeEnum, 'HOLLOWCORE', INDETERMINATE) -lintel = express_getattr(IfcBeamTypeEnum, 'LINTEL', INDETERMINATE) -spandrel = express_getattr(IfcBeamTypeEnum, 'SPANDREL', INDETERMINATE) -t_beam = express_getattr(IfcBeamTypeEnum, 'T_BEAM', INDETERMINATE) -userdefined = express_getattr(IfcBeamTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBeamTypeEnum, 'NOTDEFINED', INDETERMINATE) +beam = IfcBeamTypeEnum.BEAM +joist = IfcBeamTypeEnum.JOIST +hollowcore = IfcBeamTypeEnum.HOLLOWCORE +lintel = IfcBeamTypeEnum.LINTEL +spandrel = IfcBeamTypeEnum.SPANDREL +t_beam = IfcBeamTypeEnum.T_BEAM +userdefined = IfcBeamTypeEnum.USERDEFINED +notdefined = IfcBeamTypeEnum.NOTDEFINED IfcBenchmarkEnum = enum_namespace() -greaterthan = express_getattr(IfcBenchmarkEnum, 'GREATERTHAN', INDETERMINATE) -greaterthanorequalto = express_getattr(IfcBenchmarkEnum, 'GREATERTHANOREQUALTO', INDETERMINATE) -lessthan = express_getattr(IfcBenchmarkEnum, 'LESSTHAN', INDETERMINATE) -lessthanorequalto = express_getattr(IfcBenchmarkEnum, 'LESSTHANOREQUALTO', INDETERMINATE) -equalto = express_getattr(IfcBenchmarkEnum, 'EQUALTO', INDETERMINATE) -notequalto = express_getattr(IfcBenchmarkEnum, 'NOTEQUALTO', INDETERMINATE) -includes = express_getattr(IfcBenchmarkEnum, 'INCLUDES', INDETERMINATE) -notincludes = express_getattr(IfcBenchmarkEnum, 'NOTINCLUDES', INDETERMINATE) -includedin = express_getattr(IfcBenchmarkEnum, 'INCLUDEDIN', INDETERMINATE) -notincludedin = express_getattr(IfcBenchmarkEnum, 'NOTINCLUDEDIN', INDETERMINATE) +greaterthan = IfcBenchmarkEnum.GREATERTHAN +greaterthanorequalto = IfcBenchmarkEnum.GREATERTHANOREQUALTO +lessthan = IfcBenchmarkEnum.LESSTHAN +lessthanorequalto = IfcBenchmarkEnum.LESSTHANOREQUALTO +equalto = IfcBenchmarkEnum.EQUALTO +notequalto = IfcBenchmarkEnum.NOTEQUALTO +includes = IfcBenchmarkEnum.INCLUDES +notincludes = IfcBenchmarkEnum.NOTINCLUDES +includedin = IfcBenchmarkEnum.INCLUDEDIN +notincludedin = IfcBenchmarkEnum.NOTINCLUDEDIN IfcBoilerTypeEnum = enum_namespace() -water = express_getattr(IfcBoilerTypeEnum, 'WATER', INDETERMINATE) -steam = express_getattr(IfcBoilerTypeEnum, 'STEAM', INDETERMINATE) -userdefined = express_getattr(IfcBoilerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBoilerTypeEnum, 'NOTDEFINED', INDETERMINATE) +water = IfcBoilerTypeEnum.WATER +steam = IfcBoilerTypeEnum.STEAM +userdefined = IfcBoilerTypeEnum.USERDEFINED +notdefined = IfcBoilerTypeEnum.NOTDEFINED IfcBooleanOperator = enum_namespace() -union = express_getattr(IfcBooleanOperator, 'UNION', INDETERMINATE) -intersection = express_getattr(IfcBooleanOperator, 'INTERSECTION', INDETERMINATE) -difference = express_getattr(IfcBooleanOperator, 'DIFFERENCE', INDETERMINATE) +union = IfcBooleanOperator.UNION +intersection = IfcBooleanOperator.INTERSECTION +difference = IfcBooleanOperator.DIFFERENCE IfcBuildingElementPartTypeEnum = enum_namespace() -insulation = express_getattr(IfcBuildingElementPartTypeEnum, 'INSULATION', INDETERMINATE) -precastpanel = express_getattr(IfcBuildingElementPartTypeEnum, 'PRECASTPANEL', INDETERMINATE) -userdefined = express_getattr(IfcBuildingElementPartTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBuildingElementPartTypeEnum, 'NOTDEFINED', INDETERMINATE) +insulation = IfcBuildingElementPartTypeEnum.INSULATION +precastpanel = IfcBuildingElementPartTypeEnum.PRECASTPANEL +userdefined = IfcBuildingElementPartTypeEnum.USERDEFINED +notdefined = IfcBuildingElementPartTypeEnum.NOTDEFINED IfcBuildingElementProxyTypeEnum = enum_namespace() -complex = express_getattr(IfcBuildingElementProxyTypeEnum, 'COMPLEX', INDETERMINATE) -element = express_getattr(IfcBuildingElementProxyTypeEnum, 'ELEMENT', INDETERMINATE) -partial = express_getattr(IfcBuildingElementProxyTypeEnum, 'PARTIAL', INDETERMINATE) -provisionforvoid = express_getattr(IfcBuildingElementProxyTypeEnum, 'PROVISIONFORVOID', INDETERMINATE) -provisionforspace = express_getattr(IfcBuildingElementProxyTypeEnum, 'PROVISIONFORSPACE', INDETERMINATE) -userdefined = express_getattr(IfcBuildingElementProxyTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBuildingElementProxyTypeEnum, 'NOTDEFINED', INDETERMINATE) +complex = IfcBuildingElementProxyTypeEnum.COMPLEX +element = IfcBuildingElementProxyTypeEnum.ELEMENT +partial = IfcBuildingElementProxyTypeEnum.PARTIAL +provisionforvoid = IfcBuildingElementProxyTypeEnum.PROVISIONFORVOID +provisionforspace = IfcBuildingElementProxyTypeEnum.PROVISIONFORSPACE +userdefined = IfcBuildingElementProxyTypeEnum.USERDEFINED +notdefined = IfcBuildingElementProxyTypeEnum.NOTDEFINED IfcBuildingSystemTypeEnum = enum_namespace() -fenestration = express_getattr(IfcBuildingSystemTypeEnum, 'FENESTRATION', INDETERMINATE) -foundation = express_getattr(IfcBuildingSystemTypeEnum, 'FOUNDATION', INDETERMINATE) -loadbearing = express_getattr(IfcBuildingSystemTypeEnum, 'LOADBEARING', INDETERMINATE) -outershell = express_getattr(IfcBuildingSystemTypeEnum, 'OUTERSHELL', INDETERMINATE) -shading = express_getattr(IfcBuildingSystemTypeEnum, 'SHADING', INDETERMINATE) -transport = express_getattr(IfcBuildingSystemTypeEnum, 'TRANSPORT', INDETERMINATE) -userdefined = express_getattr(IfcBuildingSystemTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBuildingSystemTypeEnum, 'NOTDEFINED', INDETERMINATE) +fenestration = IfcBuildingSystemTypeEnum.FENESTRATION +foundation = IfcBuildingSystemTypeEnum.FOUNDATION +loadbearing = IfcBuildingSystemTypeEnum.LOADBEARING +outershell = IfcBuildingSystemTypeEnum.OUTERSHELL +shading = IfcBuildingSystemTypeEnum.SHADING +transport = IfcBuildingSystemTypeEnum.TRANSPORT +userdefined = IfcBuildingSystemTypeEnum.USERDEFINED +notdefined = IfcBuildingSystemTypeEnum.NOTDEFINED IfcBurnerTypeEnum = enum_namespace() -userdefined = express_getattr(IfcBurnerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBurnerTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcBurnerTypeEnum.USERDEFINED +notdefined = IfcBurnerTypeEnum.NOTDEFINED IfcCableCarrierFittingTypeEnum = enum_namespace() -bend = express_getattr(IfcCableCarrierFittingTypeEnum, 'BEND', INDETERMINATE) -cross = express_getattr(IfcCableCarrierFittingTypeEnum, 'CROSS', INDETERMINATE) -reducer = express_getattr(IfcCableCarrierFittingTypeEnum, 'REDUCER', INDETERMINATE) -tee = express_getattr(IfcCableCarrierFittingTypeEnum, 'TEE', INDETERMINATE) -userdefined = express_getattr(IfcCableCarrierFittingTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCableCarrierFittingTypeEnum, 'NOTDEFINED', INDETERMINATE) +bend = IfcCableCarrierFittingTypeEnum.BEND +cross = IfcCableCarrierFittingTypeEnum.CROSS +reducer = IfcCableCarrierFittingTypeEnum.REDUCER +tee = IfcCableCarrierFittingTypeEnum.TEE +userdefined = IfcCableCarrierFittingTypeEnum.USERDEFINED +notdefined = IfcCableCarrierFittingTypeEnum.NOTDEFINED IfcCableCarrierSegmentTypeEnum = enum_namespace() -cableladdersegment = express_getattr(IfcCableCarrierSegmentTypeEnum, 'CABLELADDERSEGMENT', INDETERMINATE) -cabletraysegment = express_getattr(IfcCableCarrierSegmentTypeEnum, 'CABLETRAYSEGMENT', INDETERMINATE) -cabletrunkingsegment = express_getattr(IfcCableCarrierSegmentTypeEnum, 'CABLETRUNKINGSEGMENT', INDETERMINATE) -conduitsegment = express_getattr(IfcCableCarrierSegmentTypeEnum, 'CONDUITSEGMENT', INDETERMINATE) -userdefined = express_getattr(IfcCableCarrierSegmentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCableCarrierSegmentTypeEnum, 'NOTDEFINED', INDETERMINATE) +cableladdersegment = IfcCableCarrierSegmentTypeEnum.CABLELADDERSEGMENT +cabletraysegment = IfcCableCarrierSegmentTypeEnum.CABLETRAYSEGMENT +cabletrunkingsegment = IfcCableCarrierSegmentTypeEnum.CABLETRUNKINGSEGMENT +conduitsegment = IfcCableCarrierSegmentTypeEnum.CONDUITSEGMENT +userdefined = IfcCableCarrierSegmentTypeEnum.USERDEFINED +notdefined = IfcCableCarrierSegmentTypeEnum.NOTDEFINED IfcCableFittingTypeEnum = enum_namespace() -connector = express_getattr(IfcCableFittingTypeEnum, 'CONNECTOR', INDETERMINATE) -entry = express_getattr(IfcCableFittingTypeEnum, 'ENTRY', INDETERMINATE) -exit = express_getattr(IfcCableFittingTypeEnum, 'EXIT', INDETERMINATE) -junction = express_getattr(IfcCableFittingTypeEnum, 'JUNCTION', INDETERMINATE) -transition = express_getattr(IfcCableFittingTypeEnum, 'TRANSITION', INDETERMINATE) -userdefined = express_getattr(IfcCableFittingTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCableFittingTypeEnum, 'NOTDEFINED', INDETERMINATE) +connector = IfcCableFittingTypeEnum.CONNECTOR +entry = IfcCableFittingTypeEnum.ENTRY +exit = IfcCableFittingTypeEnum.EXIT +junction = IfcCableFittingTypeEnum.JUNCTION +transition = IfcCableFittingTypeEnum.TRANSITION +userdefined = IfcCableFittingTypeEnum.USERDEFINED +notdefined = IfcCableFittingTypeEnum.NOTDEFINED IfcCableSegmentTypeEnum = enum_namespace() -busbarsegment = express_getattr(IfcCableSegmentTypeEnum, 'BUSBARSEGMENT', INDETERMINATE) -cablesegment = express_getattr(IfcCableSegmentTypeEnum, 'CABLESEGMENT', INDETERMINATE) -conductorsegment = express_getattr(IfcCableSegmentTypeEnum, 'CONDUCTORSEGMENT', INDETERMINATE) -coresegment = express_getattr(IfcCableSegmentTypeEnum, 'CORESEGMENT', INDETERMINATE) -userdefined = express_getattr(IfcCableSegmentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCableSegmentTypeEnum, 'NOTDEFINED', INDETERMINATE) +busbarsegment = IfcCableSegmentTypeEnum.BUSBARSEGMENT +cablesegment = IfcCableSegmentTypeEnum.CABLESEGMENT +conductorsegment = IfcCableSegmentTypeEnum.CONDUCTORSEGMENT +coresegment = IfcCableSegmentTypeEnum.CORESEGMENT +userdefined = IfcCableSegmentTypeEnum.USERDEFINED +notdefined = IfcCableSegmentTypeEnum.NOTDEFINED IfcChangeActionEnum = enum_namespace() -nochange = express_getattr(IfcChangeActionEnum, 'NOCHANGE', INDETERMINATE) -modified = express_getattr(IfcChangeActionEnum, 'MODIFIED', INDETERMINATE) -added = express_getattr(IfcChangeActionEnum, 'ADDED', INDETERMINATE) -deleted = express_getattr(IfcChangeActionEnum, 'DELETED', INDETERMINATE) -notdefined = express_getattr(IfcChangeActionEnum, 'NOTDEFINED', INDETERMINATE) +nochange = IfcChangeActionEnum.NOCHANGE +modified = IfcChangeActionEnum.MODIFIED +added = IfcChangeActionEnum.ADDED +deleted = IfcChangeActionEnum.DELETED +notdefined = IfcChangeActionEnum.NOTDEFINED IfcChillerTypeEnum = enum_namespace() -aircooled = express_getattr(IfcChillerTypeEnum, 'AIRCOOLED', INDETERMINATE) -watercooled = express_getattr(IfcChillerTypeEnum, 'WATERCOOLED', INDETERMINATE) -heatrecovery = express_getattr(IfcChillerTypeEnum, 'HEATRECOVERY', INDETERMINATE) -userdefined = express_getattr(IfcChillerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcChillerTypeEnum, 'NOTDEFINED', INDETERMINATE) +aircooled = IfcChillerTypeEnum.AIRCOOLED +watercooled = IfcChillerTypeEnum.WATERCOOLED +heatrecovery = IfcChillerTypeEnum.HEATRECOVERY +userdefined = IfcChillerTypeEnum.USERDEFINED +notdefined = IfcChillerTypeEnum.NOTDEFINED IfcChimneyTypeEnum = enum_namespace() -userdefined = express_getattr(IfcChimneyTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcChimneyTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcChimneyTypeEnum.USERDEFINED +notdefined = IfcChimneyTypeEnum.NOTDEFINED IfcCoilTypeEnum = enum_namespace() -dxcoolingcoil = express_getattr(IfcCoilTypeEnum, 'DXCOOLINGCOIL', INDETERMINATE) -electricheatingcoil = express_getattr(IfcCoilTypeEnum, 'ELECTRICHEATINGCOIL', INDETERMINATE) -gasheatingcoil = express_getattr(IfcCoilTypeEnum, 'GASHEATINGCOIL', INDETERMINATE) -hydroniccoil = express_getattr(IfcCoilTypeEnum, 'HYDRONICCOIL', INDETERMINATE) -steamheatingcoil = express_getattr(IfcCoilTypeEnum, 'STEAMHEATINGCOIL', INDETERMINATE) -watercoolingcoil = express_getattr(IfcCoilTypeEnum, 'WATERCOOLINGCOIL', INDETERMINATE) -waterheatingcoil = express_getattr(IfcCoilTypeEnum, 'WATERHEATINGCOIL', INDETERMINATE) -userdefined = express_getattr(IfcCoilTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCoilTypeEnum, 'NOTDEFINED', INDETERMINATE) +dxcoolingcoil = IfcCoilTypeEnum.DXCOOLINGCOIL +electricheatingcoil = IfcCoilTypeEnum.ELECTRICHEATINGCOIL +gasheatingcoil = IfcCoilTypeEnum.GASHEATINGCOIL +hydroniccoil = IfcCoilTypeEnum.HYDRONICCOIL +steamheatingcoil = IfcCoilTypeEnum.STEAMHEATINGCOIL +watercoolingcoil = IfcCoilTypeEnum.WATERCOOLINGCOIL +waterheatingcoil = IfcCoilTypeEnum.WATERHEATINGCOIL +userdefined = IfcCoilTypeEnum.USERDEFINED +notdefined = IfcCoilTypeEnum.NOTDEFINED IfcColumnTypeEnum = enum_namespace() -column = express_getattr(IfcColumnTypeEnum, 'COLUMN', INDETERMINATE) -pilaster = express_getattr(IfcColumnTypeEnum, 'PILASTER', INDETERMINATE) -userdefined = express_getattr(IfcColumnTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcColumnTypeEnum, 'NOTDEFINED', INDETERMINATE) +column = IfcColumnTypeEnum.COLUMN +pilaster = IfcColumnTypeEnum.PILASTER +userdefined = IfcColumnTypeEnum.USERDEFINED +notdefined = IfcColumnTypeEnum.NOTDEFINED IfcCommunicationsApplianceTypeEnum = enum_namespace() -antenna = express_getattr(IfcCommunicationsApplianceTypeEnum, 'ANTENNA', INDETERMINATE) -computer = express_getattr(IfcCommunicationsApplianceTypeEnum, 'COMPUTER', INDETERMINATE) -fax = express_getattr(IfcCommunicationsApplianceTypeEnum, 'FAX', INDETERMINATE) -gateway = express_getattr(IfcCommunicationsApplianceTypeEnum, 'GATEWAY', INDETERMINATE) -modem = express_getattr(IfcCommunicationsApplianceTypeEnum, 'MODEM', INDETERMINATE) -networkappliance = express_getattr(IfcCommunicationsApplianceTypeEnum, 'NETWORKAPPLIANCE', INDETERMINATE) -networkbridge = express_getattr(IfcCommunicationsApplianceTypeEnum, 'NETWORKBRIDGE', INDETERMINATE) -networkhub = express_getattr(IfcCommunicationsApplianceTypeEnum, 'NETWORKHUB', INDETERMINATE) -printer = express_getattr(IfcCommunicationsApplianceTypeEnum, 'PRINTER', INDETERMINATE) -repeater = express_getattr(IfcCommunicationsApplianceTypeEnum, 'REPEATER', INDETERMINATE) -router = express_getattr(IfcCommunicationsApplianceTypeEnum, 'ROUTER', INDETERMINATE) -scanner = express_getattr(IfcCommunicationsApplianceTypeEnum, 'SCANNER', INDETERMINATE) -userdefined = express_getattr(IfcCommunicationsApplianceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCommunicationsApplianceTypeEnum, 'NOTDEFINED', INDETERMINATE) +antenna = IfcCommunicationsApplianceTypeEnum.ANTENNA +computer = IfcCommunicationsApplianceTypeEnum.COMPUTER +fax = IfcCommunicationsApplianceTypeEnum.FAX +gateway = IfcCommunicationsApplianceTypeEnum.GATEWAY +modem = IfcCommunicationsApplianceTypeEnum.MODEM +networkappliance = IfcCommunicationsApplianceTypeEnum.NETWORKAPPLIANCE +networkbridge = IfcCommunicationsApplianceTypeEnum.NETWORKBRIDGE +networkhub = IfcCommunicationsApplianceTypeEnum.NETWORKHUB +printer = IfcCommunicationsApplianceTypeEnum.PRINTER +repeater = IfcCommunicationsApplianceTypeEnum.REPEATER +router = IfcCommunicationsApplianceTypeEnum.ROUTER +scanner = IfcCommunicationsApplianceTypeEnum.SCANNER +userdefined = IfcCommunicationsApplianceTypeEnum.USERDEFINED +notdefined = IfcCommunicationsApplianceTypeEnum.NOTDEFINED IfcComplexPropertyTemplateTypeEnum = enum_namespace() -p_complex = express_getattr(IfcComplexPropertyTemplateTypeEnum, 'P_COMPLEX', INDETERMINATE) -q_complex = express_getattr(IfcComplexPropertyTemplateTypeEnum, 'Q_COMPLEX', INDETERMINATE) +p_complex = IfcComplexPropertyTemplateTypeEnum.P_COMPLEX +q_complex = IfcComplexPropertyTemplateTypeEnum.Q_COMPLEX IfcCompressorTypeEnum = enum_namespace() -dynamic = express_getattr(IfcCompressorTypeEnum, 'DYNAMIC', INDETERMINATE) -reciprocating = express_getattr(IfcCompressorTypeEnum, 'RECIPROCATING', INDETERMINATE) -rotary = express_getattr(IfcCompressorTypeEnum, 'ROTARY', INDETERMINATE) -scroll = express_getattr(IfcCompressorTypeEnum, 'SCROLL', INDETERMINATE) -trochoidal = express_getattr(IfcCompressorTypeEnum, 'TROCHOIDAL', INDETERMINATE) -singlestage = express_getattr(IfcCompressorTypeEnum, 'SINGLESTAGE', INDETERMINATE) -booster = express_getattr(IfcCompressorTypeEnum, 'BOOSTER', INDETERMINATE) -opentype = express_getattr(IfcCompressorTypeEnum, 'OPENTYPE', INDETERMINATE) -hermetic = express_getattr(IfcCompressorTypeEnum, 'HERMETIC', INDETERMINATE) -semihermetic = express_getattr(IfcCompressorTypeEnum, 'SEMIHERMETIC', INDETERMINATE) -weldedshellhermetic = express_getattr(IfcCompressorTypeEnum, 'WELDEDSHELLHERMETIC', INDETERMINATE) -rollingpiston = express_getattr(IfcCompressorTypeEnum, 'ROLLINGPISTON', INDETERMINATE) -rotaryvane = express_getattr(IfcCompressorTypeEnum, 'ROTARYVANE', INDETERMINATE) -singlescrew = express_getattr(IfcCompressorTypeEnum, 'SINGLESCREW', INDETERMINATE) -twinscrew = express_getattr(IfcCompressorTypeEnum, 'TWINSCREW', INDETERMINATE) -userdefined = express_getattr(IfcCompressorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCompressorTypeEnum, 'NOTDEFINED', INDETERMINATE) +dynamic = IfcCompressorTypeEnum.DYNAMIC +reciprocating = IfcCompressorTypeEnum.RECIPROCATING +rotary = IfcCompressorTypeEnum.ROTARY +scroll = IfcCompressorTypeEnum.SCROLL +trochoidal = IfcCompressorTypeEnum.TROCHOIDAL +singlestage = IfcCompressorTypeEnum.SINGLESTAGE +booster = IfcCompressorTypeEnum.BOOSTER +opentype = IfcCompressorTypeEnum.OPENTYPE +hermetic = IfcCompressorTypeEnum.HERMETIC +semihermetic = IfcCompressorTypeEnum.SEMIHERMETIC +weldedshellhermetic = IfcCompressorTypeEnum.WELDEDSHELLHERMETIC +rollingpiston = IfcCompressorTypeEnum.ROLLINGPISTON +rotaryvane = IfcCompressorTypeEnum.ROTARYVANE +singlescrew = IfcCompressorTypeEnum.SINGLESCREW +twinscrew = IfcCompressorTypeEnum.TWINSCREW +userdefined = IfcCompressorTypeEnum.USERDEFINED +notdefined = IfcCompressorTypeEnum.NOTDEFINED IfcCondenserTypeEnum = enum_namespace() -aircooled = express_getattr(IfcCondenserTypeEnum, 'AIRCOOLED', INDETERMINATE) -evaporativecooled = express_getattr(IfcCondenserTypeEnum, 'EVAPORATIVECOOLED', INDETERMINATE) -watercooled = express_getattr(IfcCondenserTypeEnum, 'WATERCOOLED', INDETERMINATE) -watercooledbrazedplate = express_getattr(IfcCondenserTypeEnum, 'WATERCOOLEDBRAZEDPLATE', INDETERMINATE) -watercooledshellcoil = express_getattr(IfcCondenserTypeEnum, 'WATERCOOLEDSHELLCOIL', INDETERMINATE) -watercooledshelltube = express_getattr(IfcCondenserTypeEnum, 'WATERCOOLEDSHELLTUBE', INDETERMINATE) -watercooledtubeintube = express_getattr(IfcCondenserTypeEnum, 'WATERCOOLEDTUBEINTUBE', INDETERMINATE) -userdefined = express_getattr(IfcCondenserTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCondenserTypeEnum, 'NOTDEFINED', INDETERMINATE) +aircooled = IfcCondenserTypeEnum.AIRCOOLED +evaporativecooled = IfcCondenserTypeEnum.EVAPORATIVECOOLED +watercooled = IfcCondenserTypeEnum.WATERCOOLED +watercooledbrazedplate = IfcCondenserTypeEnum.WATERCOOLEDBRAZEDPLATE +watercooledshellcoil = IfcCondenserTypeEnum.WATERCOOLEDSHELLCOIL +watercooledshelltube = IfcCondenserTypeEnum.WATERCOOLEDSHELLTUBE +watercooledtubeintube = IfcCondenserTypeEnum.WATERCOOLEDTUBEINTUBE +userdefined = IfcCondenserTypeEnum.USERDEFINED +notdefined = IfcCondenserTypeEnum.NOTDEFINED IfcConnectionTypeEnum = enum_namespace() -atpath = express_getattr(IfcConnectionTypeEnum, 'ATPATH', INDETERMINATE) -atstart = express_getattr(IfcConnectionTypeEnum, 'ATSTART', INDETERMINATE) -atend = express_getattr(IfcConnectionTypeEnum, 'ATEND', INDETERMINATE) -notdefined = express_getattr(IfcConnectionTypeEnum, 'NOTDEFINED', INDETERMINATE) +atpath = IfcConnectionTypeEnum.ATPATH +atstart = IfcConnectionTypeEnum.ATSTART +atend = IfcConnectionTypeEnum.ATEND +notdefined = IfcConnectionTypeEnum.NOTDEFINED IfcConstraintEnum = enum_namespace() -hard = express_getattr(IfcConstraintEnum, 'HARD', INDETERMINATE) -soft = express_getattr(IfcConstraintEnum, 'SOFT', INDETERMINATE) -advisory = express_getattr(IfcConstraintEnum, 'ADVISORY', INDETERMINATE) -userdefined = express_getattr(IfcConstraintEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcConstraintEnum, 'NOTDEFINED', INDETERMINATE) +hard = IfcConstraintEnum.HARD +soft = IfcConstraintEnum.SOFT +advisory = IfcConstraintEnum.ADVISORY +userdefined = IfcConstraintEnum.USERDEFINED +notdefined = IfcConstraintEnum.NOTDEFINED IfcConstructionEquipmentResourceTypeEnum = enum_namespace() -demolishing = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'DEMOLISHING', INDETERMINATE) -earthmoving = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'EARTHMOVING', INDETERMINATE) -erecting = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'ERECTING', INDETERMINATE) -heating = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'HEATING', INDETERMINATE) -lighting = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'LIGHTING', INDETERMINATE) -paving = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'PAVING', INDETERMINATE) -pumping = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'PUMPING', INDETERMINATE) -transporting = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'TRANSPORTING', INDETERMINATE) -userdefined = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'NOTDEFINED', INDETERMINATE) +demolishing = IfcConstructionEquipmentResourceTypeEnum.DEMOLISHING +earthmoving = IfcConstructionEquipmentResourceTypeEnum.EARTHMOVING +erecting = IfcConstructionEquipmentResourceTypeEnum.ERECTING +heating = IfcConstructionEquipmentResourceTypeEnum.HEATING +lighting = IfcConstructionEquipmentResourceTypeEnum.LIGHTING +paving = IfcConstructionEquipmentResourceTypeEnum.PAVING +pumping = IfcConstructionEquipmentResourceTypeEnum.PUMPING +transporting = IfcConstructionEquipmentResourceTypeEnum.TRANSPORTING +userdefined = IfcConstructionEquipmentResourceTypeEnum.USERDEFINED +notdefined = IfcConstructionEquipmentResourceTypeEnum.NOTDEFINED IfcConstructionMaterialResourceTypeEnum = enum_namespace() -aggregates = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'AGGREGATES', INDETERMINATE) -concrete = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'CONCRETE', INDETERMINATE) -drywall = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'DRYWALL', INDETERMINATE) -fuel = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'FUEL', INDETERMINATE) -gypsum = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'GYPSUM', INDETERMINATE) -masonry = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'MASONRY', INDETERMINATE) -metal = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'METAL', INDETERMINATE) -plastic = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'PLASTIC', INDETERMINATE) -wood = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'WOOD', INDETERMINATE) -notdefined = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'NOTDEFINED', INDETERMINATE) -userdefined = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'USERDEFINED', INDETERMINATE) +aggregates = IfcConstructionMaterialResourceTypeEnum.AGGREGATES +concrete = IfcConstructionMaterialResourceTypeEnum.CONCRETE +drywall = IfcConstructionMaterialResourceTypeEnum.DRYWALL +fuel = IfcConstructionMaterialResourceTypeEnum.FUEL +gypsum = IfcConstructionMaterialResourceTypeEnum.GYPSUM +masonry = IfcConstructionMaterialResourceTypeEnum.MASONRY +metal = IfcConstructionMaterialResourceTypeEnum.METAL +plastic = IfcConstructionMaterialResourceTypeEnum.PLASTIC +wood = IfcConstructionMaterialResourceTypeEnum.WOOD +notdefined = IfcConstructionMaterialResourceTypeEnum.NOTDEFINED +userdefined = IfcConstructionMaterialResourceTypeEnum.USERDEFINED IfcConstructionProductResourceTypeEnum = enum_namespace() -assembly = express_getattr(IfcConstructionProductResourceTypeEnum, 'ASSEMBLY', INDETERMINATE) -formwork = express_getattr(IfcConstructionProductResourceTypeEnum, 'FORMWORK', INDETERMINATE) -userdefined = express_getattr(IfcConstructionProductResourceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcConstructionProductResourceTypeEnum, 'NOTDEFINED', INDETERMINATE) +assembly = IfcConstructionProductResourceTypeEnum.ASSEMBLY +formwork = IfcConstructionProductResourceTypeEnum.FORMWORK +userdefined = IfcConstructionProductResourceTypeEnum.USERDEFINED +notdefined = IfcConstructionProductResourceTypeEnum.NOTDEFINED IfcControllerTypeEnum = enum_namespace() -floating = express_getattr(IfcControllerTypeEnum, 'FLOATING', INDETERMINATE) -programmable = express_getattr(IfcControllerTypeEnum, 'PROGRAMMABLE', INDETERMINATE) -proportional = express_getattr(IfcControllerTypeEnum, 'PROPORTIONAL', INDETERMINATE) -multiposition = express_getattr(IfcControllerTypeEnum, 'MULTIPOSITION', INDETERMINATE) -twoposition = express_getattr(IfcControllerTypeEnum, 'TWOPOSITION', INDETERMINATE) -userdefined = express_getattr(IfcControllerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcControllerTypeEnum, 'NOTDEFINED', INDETERMINATE) +floating = IfcControllerTypeEnum.FLOATING +programmable = IfcControllerTypeEnum.PROGRAMMABLE +proportional = IfcControllerTypeEnum.PROPORTIONAL +multiposition = IfcControllerTypeEnum.MULTIPOSITION +twoposition = IfcControllerTypeEnum.TWOPOSITION +userdefined = IfcControllerTypeEnum.USERDEFINED +notdefined = IfcControllerTypeEnum.NOTDEFINED IfcCooledBeamTypeEnum = enum_namespace() -active = express_getattr(IfcCooledBeamTypeEnum, 'ACTIVE', INDETERMINATE) -passive = express_getattr(IfcCooledBeamTypeEnum, 'PASSIVE', INDETERMINATE) -userdefined = express_getattr(IfcCooledBeamTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCooledBeamTypeEnum, 'NOTDEFINED', INDETERMINATE) +active = IfcCooledBeamTypeEnum.ACTIVE +passive = IfcCooledBeamTypeEnum.PASSIVE +userdefined = IfcCooledBeamTypeEnum.USERDEFINED +notdefined = IfcCooledBeamTypeEnum.NOTDEFINED IfcCoolingTowerTypeEnum = enum_namespace() -naturaldraft = express_getattr(IfcCoolingTowerTypeEnum, 'NATURALDRAFT', INDETERMINATE) -mechanicalinduceddraft = express_getattr(IfcCoolingTowerTypeEnum, 'MECHANICALINDUCEDDRAFT', INDETERMINATE) -mechanicalforceddraft = express_getattr(IfcCoolingTowerTypeEnum, 'MECHANICALFORCEDDRAFT', INDETERMINATE) -userdefined = express_getattr(IfcCoolingTowerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCoolingTowerTypeEnum, 'NOTDEFINED', INDETERMINATE) +naturaldraft = IfcCoolingTowerTypeEnum.NATURALDRAFT +mechanicalinduceddraft = IfcCoolingTowerTypeEnum.MECHANICALINDUCEDDRAFT +mechanicalforceddraft = IfcCoolingTowerTypeEnum.MECHANICALFORCEDDRAFT +userdefined = IfcCoolingTowerTypeEnum.USERDEFINED +notdefined = IfcCoolingTowerTypeEnum.NOTDEFINED IfcCostItemTypeEnum = enum_namespace() -userdefined = express_getattr(IfcCostItemTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCostItemTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcCostItemTypeEnum.USERDEFINED +notdefined = IfcCostItemTypeEnum.NOTDEFINED IfcCostScheduleTypeEnum = enum_namespace() -budget = express_getattr(IfcCostScheduleTypeEnum, 'BUDGET', INDETERMINATE) -costplan = express_getattr(IfcCostScheduleTypeEnum, 'COSTPLAN', INDETERMINATE) -estimate = express_getattr(IfcCostScheduleTypeEnum, 'ESTIMATE', INDETERMINATE) -tender = express_getattr(IfcCostScheduleTypeEnum, 'TENDER', INDETERMINATE) -pricedbillofquantities = express_getattr(IfcCostScheduleTypeEnum, 'PRICEDBILLOFQUANTITIES', INDETERMINATE) -unpricedbillofquantities = express_getattr(IfcCostScheduleTypeEnum, 'UNPRICEDBILLOFQUANTITIES', INDETERMINATE) -scheduleofrates = express_getattr(IfcCostScheduleTypeEnum, 'SCHEDULEOFRATES', INDETERMINATE) -userdefined = express_getattr(IfcCostScheduleTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCostScheduleTypeEnum, 'NOTDEFINED', INDETERMINATE) +budget = IfcCostScheduleTypeEnum.BUDGET +costplan = IfcCostScheduleTypeEnum.COSTPLAN +estimate = IfcCostScheduleTypeEnum.ESTIMATE +tender = IfcCostScheduleTypeEnum.TENDER +pricedbillofquantities = IfcCostScheduleTypeEnum.PRICEDBILLOFQUANTITIES +unpricedbillofquantities = IfcCostScheduleTypeEnum.UNPRICEDBILLOFQUANTITIES +scheduleofrates = IfcCostScheduleTypeEnum.SCHEDULEOFRATES +userdefined = IfcCostScheduleTypeEnum.USERDEFINED +notdefined = IfcCostScheduleTypeEnum.NOTDEFINED IfcCoveringTypeEnum = enum_namespace() -ceiling = express_getattr(IfcCoveringTypeEnum, 'CEILING', INDETERMINATE) -flooring = express_getattr(IfcCoveringTypeEnum, 'FLOORING', INDETERMINATE) -cladding = express_getattr(IfcCoveringTypeEnum, 'CLADDING', INDETERMINATE) -roofing = express_getattr(IfcCoveringTypeEnum, 'ROOFING', INDETERMINATE) -molding = express_getattr(IfcCoveringTypeEnum, 'MOLDING', INDETERMINATE) -skirtingboard = express_getattr(IfcCoveringTypeEnum, 'SKIRTINGBOARD', INDETERMINATE) -insulation = express_getattr(IfcCoveringTypeEnum, 'INSULATION', INDETERMINATE) -membrane = express_getattr(IfcCoveringTypeEnum, 'MEMBRANE', INDETERMINATE) -sleeving = express_getattr(IfcCoveringTypeEnum, 'SLEEVING', INDETERMINATE) -wrapping = express_getattr(IfcCoveringTypeEnum, 'WRAPPING', INDETERMINATE) -userdefined = express_getattr(IfcCoveringTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCoveringTypeEnum, 'NOTDEFINED', INDETERMINATE) +ceiling = IfcCoveringTypeEnum.CEILING +flooring = IfcCoveringTypeEnum.FLOORING +cladding = IfcCoveringTypeEnum.CLADDING +roofing = IfcCoveringTypeEnum.ROOFING +molding = IfcCoveringTypeEnum.MOLDING +skirtingboard = IfcCoveringTypeEnum.SKIRTINGBOARD +insulation = IfcCoveringTypeEnum.INSULATION +membrane = IfcCoveringTypeEnum.MEMBRANE +sleeving = IfcCoveringTypeEnum.SLEEVING +wrapping = IfcCoveringTypeEnum.WRAPPING +userdefined = IfcCoveringTypeEnum.USERDEFINED +notdefined = IfcCoveringTypeEnum.NOTDEFINED IfcCrewResourceTypeEnum = enum_namespace() -office = express_getattr(IfcCrewResourceTypeEnum, 'OFFICE', INDETERMINATE) -site = express_getattr(IfcCrewResourceTypeEnum, 'SITE', INDETERMINATE) -userdefined = express_getattr(IfcCrewResourceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCrewResourceTypeEnum, 'NOTDEFINED', INDETERMINATE) +office = IfcCrewResourceTypeEnum.OFFICE +site = IfcCrewResourceTypeEnum.SITE +userdefined = IfcCrewResourceTypeEnum.USERDEFINED +notdefined = IfcCrewResourceTypeEnum.NOTDEFINED IfcCurtainWallTypeEnum = enum_namespace() -userdefined = express_getattr(IfcCurtainWallTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCurtainWallTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcCurtainWallTypeEnum.USERDEFINED +notdefined = IfcCurtainWallTypeEnum.NOTDEFINED IfcCurveInterpolationEnum = enum_namespace() -linear = express_getattr(IfcCurveInterpolationEnum, 'LINEAR', INDETERMINATE) -log_linear = express_getattr(IfcCurveInterpolationEnum, 'LOG_LINEAR', INDETERMINATE) -log_log = express_getattr(IfcCurveInterpolationEnum, 'LOG_LOG', INDETERMINATE) -notdefined = express_getattr(IfcCurveInterpolationEnum, 'NOTDEFINED', INDETERMINATE) +linear = IfcCurveInterpolationEnum.LINEAR +log_linear = IfcCurveInterpolationEnum.LOG_LINEAR +log_log = IfcCurveInterpolationEnum.LOG_LOG +notdefined = IfcCurveInterpolationEnum.NOTDEFINED IfcDamperTypeEnum = enum_namespace() -backdraftdamper = express_getattr(IfcDamperTypeEnum, 'BACKDRAFTDAMPER', INDETERMINATE) -balancingdamper = express_getattr(IfcDamperTypeEnum, 'BALANCINGDAMPER', INDETERMINATE) -blastdamper = express_getattr(IfcDamperTypeEnum, 'BLASTDAMPER', INDETERMINATE) -controldamper = express_getattr(IfcDamperTypeEnum, 'CONTROLDAMPER', INDETERMINATE) -firedamper = express_getattr(IfcDamperTypeEnum, 'FIREDAMPER', INDETERMINATE) -firesmokedamper = express_getattr(IfcDamperTypeEnum, 'FIRESMOKEDAMPER', INDETERMINATE) -fumehoodexhaust = express_getattr(IfcDamperTypeEnum, 'FUMEHOODEXHAUST', INDETERMINATE) -gravitydamper = express_getattr(IfcDamperTypeEnum, 'GRAVITYDAMPER', INDETERMINATE) -gravityreliefdamper = express_getattr(IfcDamperTypeEnum, 'GRAVITYRELIEFDAMPER', INDETERMINATE) -reliefdamper = express_getattr(IfcDamperTypeEnum, 'RELIEFDAMPER', INDETERMINATE) -smokedamper = express_getattr(IfcDamperTypeEnum, 'SMOKEDAMPER', INDETERMINATE) -userdefined = express_getattr(IfcDamperTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDamperTypeEnum, 'NOTDEFINED', INDETERMINATE) +backdraftdamper = IfcDamperTypeEnum.BACKDRAFTDAMPER +balancingdamper = IfcDamperTypeEnum.BALANCINGDAMPER +blastdamper = IfcDamperTypeEnum.BLASTDAMPER +controldamper = IfcDamperTypeEnum.CONTROLDAMPER +firedamper = IfcDamperTypeEnum.FIREDAMPER +firesmokedamper = IfcDamperTypeEnum.FIRESMOKEDAMPER +fumehoodexhaust = IfcDamperTypeEnum.FUMEHOODEXHAUST +gravitydamper = IfcDamperTypeEnum.GRAVITYDAMPER +gravityreliefdamper = IfcDamperTypeEnum.GRAVITYRELIEFDAMPER +reliefdamper = IfcDamperTypeEnum.RELIEFDAMPER +smokedamper = IfcDamperTypeEnum.SMOKEDAMPER +userdefined = IfcDamperTypeEnum.USERDEFINED +notdefined = IfcDamperTypeEnum.NOTDEFINED IfcDataOriginEnum = enum_namespace() -measured = express_getattr(IfcDataOriginEnum, 'MEASURED', INDETERMINATE) -predicted = express_getattr(IfcDataOriginEnum, 'PREDICTED', INDETERMINATE) -simulated = express_getattr(IfcDataOriginEnum, 'SIMULATED', INDETERMINATE) -userdefined = express_getattr(IfcDataOriginEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDataOriginEnum, 'NOTDEFINED', INDETERMINATE) +measured = IfcDataOriginEnum.MEASURED +predicted = IfcDataOriginEnum.PREDICTED +simulated = IfcDataOriginEnum.SIMULATED +userdefined = IfcDataOriginEnum.USERDEFINED +notdefined = IfcDataOriginEnum.NOTDEFINED IfcDerivedUnitEnum = enum_namespace() -angularvelocityunit = express_getattr(IfcDerivedUnitEnum, 'ANGULARVELOCITYUNIT', INDETERMINATE) -areadensityunit = express_getattr(IfcDerivedUnitEnum, 'AREADENSITYUNIT', INDETERMINATE) -compoundplaneangleunit = express_getattr(IfcDerivedUnitEnum, 'COMPOUNDPLANEANGLEUNIT', INDETERMINATE) -dynamicviscosityunit = express_getattr(IfcDerivedUnitEnum, 'DYNAMICVISCOSITYUNIT', INDETERMINATE) -heatfluxdensityunit = express_getattr(IfcDerivedUnitEnum, 'HEATFLUXDENSITYUNIT', INDETERMINATE) -integercountrateunit = express_getattr(IfcDerivedUnitEnum, 'INTEGERCOUNTRATEUNIT', INDETERMINATE) -isothermalmoisturecapacityunit = express_getattr(IfcDerivedUnitEnum, 'ISOTHERMALMOISTURECAPACITYUNIT', INDETERMINATE) -kinematicviscosityunit = express_getattr(IfcDerivedUnitEnum, 'KINEMATICVISCOSITYUNIT', INDETERMINATE) -linearvelocityunit = express_getattr(IfcDerivedUnitEnum, 'LINEARVELOCITYUNIT', INDETERMINATE) -massdensityunit = express_getattr(IfcDerivedUnitEnum, 'MASSDENSITYUNIT', INDETERMINATE) -massflowrateunit = express_getattr(IfcDerivedUnitEnum, 'MASSFLOWRATEUNIT', INDETERMINATE) -moisturediffusivityunit = express_getattr(IfcDerivedUnitEnum, 'MOISTUREDIFFUSIVITYUNIT', INDETERMINATE) -molecularweightunit = express_getattr(IfcDerivedUnitEnum, 'MOLECULARWEIGHTUNIT', INDETERMINATE) -specificheatcapacityunit = express_getattr(IfcDerivedUnitEnum, 'SPECIFICHEATCAPACITYUNIT', INDETERMINATE) -thermaladmittanceunit = express_getattr(IfcDerivedUnitEnum, 'THERMALADMITTANCEUNIT', INDETERMINATE) -thermalconductanceunit = express_getattr(IfcDerivedUnitEnum, 'THERMALCONDUCTANCEUNIT', INDETERMINATE) -thermalresistanceunit = express_getattr(IfcDerivedUnitEnum, 'THERMALRESISTANCEUNIT', INDETERMINATE) -thermaltransmittanceunit = express_getattr(IfcDerivedUnitEnum, 'THERMALTRANSMITTANCEUNIT', INDETERMINATE) -vaporpermeabilityunit = express_getattr(IfcDerivedUnitEnum, 'VAPORPERMEABILITYUNIT', INDETERMINATE) -volumetricflowrateunit = express_getattr(IfcDerivedUnitEnum, 'VOLUMETRICFLOWRATEUNIT', INDETERMINATE) -rotationalfrequencyunit = express_getattr(IfcDerivedUnitEnum, 'ROTATIONALFREQUENCYUNIT', INDETERMINATE) -torqueunit = express_getattr(IfcDerivedUnitEnum, 'TORQUEUNIT', INDETERMINATE) -momentofinertiaunit = express_getattr(IfcDerivedUnitEnum, 'MOMENTOFINERTIAUNIT', INDETERMINATE) -linearmomentunit = express_getattr(IfcDerivedUnitEnum, 'LINEARMOMENTUNIT', INDETERMINATE) -linearforceunit = express_getattr(IfcDerivedUnitEnum, 'LINEARFORCEUNIT', INDETERMINATE) -planarforceunit = express_getattr(IfcDerivedUnitEnum, 'PLANARFORCEUNIT', INDETERMINATE) -modulusofelasticityunit = express_getattr(IfcDerivedUnitEnum, 'MODULUSOFELASTICITYUNIT', INDETERMINATE) -shearmodulusunit = express_getattr(IfcDerivedUnitEnum, 'SHEARMODULUSUNIT', INDETERMINATE) -linearstiffnessunit = express_getattr(IfcDerivedUnitEnum, 'LINEARSTIFFNESSUNIT', INDETERMINATE) -rotationalstiffnessunit = express_getattr(IfcDerivedUnitEnum, 'ROTATIONALSTIFFNESSUNIT', INDETERMINATE) -modulusofsubgradereactionunit = express_getattr(IfcDerivedUnitEnum, 'MODULUSOFSUBGRADEREACTIONUNIT', INDETERMINATE) -accelerationunit = express_getattr(IfcDerivedUnitEnum, 'ACCELERATIONUNIT', INDETERMINATE) -curvatureunit = express_getattr(IfcDerivedUnitEnum, 'CURVATUREUNIT', INDETERMINATE) -heatingvalueunit = express_getattr(IfcDerivedUnitEnum, 'HEATINGVALUEUNIT', INDETERMINATE) -ionconcentrationunit = express_getattr(IfcDerivedUnitEnum, 'IONCONCENTRATIONUNIT', INDETERMINATE) -luminousintensitydistributionunit = express_getattr(IfcDerivedUnitEnum, 'LUMINOUSINTENSITYDISTRIBUTIONUNIT', INDETERMINATE) -massperlengthunit = express_getattr(IfcDerivedUnitEnum, 'MASSPERLENGTHUNIT', INDETERMINATE) -modulusoflinearsubgradereactionunit = express_getattr(IfcDerivedUnitEnum, 'MODULUSOFLINEARSUBGRADEREACTIONUNIT', INDETERMINATE) -modulusofrotationalsubgradereactionunit = express_getattr(IfcDerivedUnitEnum, 'MODULUSOFROTATIONALSUBGRADEREACTIONUNIT', INDETERMINATE) -phunit = express_getattr(IfcDerivedUnitEnum, 'PHUNIT', INDETERMINATE) -rotationalmassunit = express_getattr(IfcDerivedUnitEnum, 'ROTATIONALMASSUNIT', INDETERMINATE) -sectionareaintegralunit = express_getattr(IfcDerivedUnitEnum, 'SECTIONAREAINTEGRALUNIT', INDETERMINATE) -sectionmodulusunit = express_getattr(IfcDerivedUnitEnum, 'SECTIONMODULUSUNIT', INDETERMINATE) -soundpowerlevelunit = express_getattr(IfcDerivedUnitEnum, 'SOUNDPOWERLEVELUNIT', INDETERMINATE) -soundpowerunit = express_getattr(IfcDerivedUnitEnum, 'SOUNDPOWERUNIT', INDETERMINATE) -soundpressurelevelunit = express_getattr(IfcDerivedUnitEnum, 'SOUNDPRESSURELEVELUNIT', INDETERMINATE) -soundpressureunit = express_getattr(IfcDerivedUnitEnum, 'SOUNDPRESSUREUNIT', INDETERMINATE) -temperaturegradientunit = express_getattr(IfcDerivedUnitEnum, 'TEMPERATUREGRADIENTUNIT', INDETERMINATE) -temperaturerateofchangeunit = express_getattr(IfcDerivedUnitEnum, 'TEMPERATURERATEOFCHANGEUNIT', INDETERMINATE) -thermalexpansioncoefficientunit = express_getattr(IfcDerivedUnitEnum, 'THERMALEXPANSIONCOEFFICIENTUNIT', INDETERMINATE) -warpingconstantunit = express_getattr(IfcDerivedUnitEnum, 'WARPINGCONSTANTUNIT', INDETERMINATE) -warpingmomentunit = express_getattr(IfcDerivedUnitEnum, 'WARPINGMOMENTUNIT', INDETERMINATE) -userdefined = express_getattr(IfcDerivedUnitEnum, 'USERDEFINED', INDETERMINATE) +angularvelocityunit = IfcDerivedUnitEnum.ANGULARVELOCITYUNIT +areadensityunit = IfcDerivedUnitEnum.AREADENSITYUNIT +compoundplaneangleunit = IfcDerivedUnitEnum.COMPOUNDPLANEANGLEUNIT +dynamicviscosityunit = IfcDerivedUnitEnum.DYNAMICVISCOSITYUNIT +heatfluxdensityunit = IfcDerivedUnitEnum.HEATFLUXDENSITYUNIT +integercountrateunit = IfcDerivedUnitEnum.INTEGERCOUNTRATEUNIT +isothermalmoisturecapacityunit = IfcDerivedUnitEnum.ISOTHERMALMOISTURECAPACITYUNIT +kinematicviscosityunit = IfcDerivedUnitEnum.KINEMATICVISCOSITYUNIT +linearvelocityunit = IfcDerivedUnitEnum.LINEARVELOCITYUNIT +massdensityunit = IfcDerivedUnitEnum.MASSDENSITYUNIT +massflowrateunit = IfcDerivedUnitEnum.MASSFLOWRATEUNIT +moisturediffusivityunit = IfcDerivedUnitEnum.MOISTUREDIFFUSIVITYUNIT +molecularweightunit = IfcDerivedUnitEnum.MOLECULARWEIGHTUNIT +specificheatcapacityunit = IfcDerivedUnitEnum.SPECIFICHEATCAPACITYUNIT +thermaladmittanceunit = IfcDerivedUnitEnum.THERMALADMITTANCEUNIT +thermalconductanceunit = IfcDerivedUnitEnum.THERMALCONDUCTANCEUNIT +thermalresistanceunit = IfcDerivedUnitEnum.THERMALRESISTANCEUNIT +thermaltransmittanceunit = IfcDerivedUnitEnum.THERMALTRANSMITTANCEUNIT +vaporpermeabilityunit = IfcDerivedUnitEnum.VAPORPERMEABILITYUNIT +volumetricflowrateunit = IfcDerivedUnitEnum.VOLUMETRICFLOWRATEUNIT +rotationalfrequencyunit = IfcDerivedUnitEnum.ROTATIONALFREQUENCYUNIT +torqueunit = IfcDerivedUnitEnum.TORQUEUNIT +momentofinertiaunit = IfcDerivedUnitEnum.MOMENTOFINERTIAUNIT +linearmomentunit = IfcDerivedUnitEnum.LINEARMOMENTUNIT +linearforceunit = IfcDerivedUnitEnum.LINEARFORCEUNIT +planarforceunit = IfcDerivedUnitEnum.PLANARFORCEUNIT +modulusofelasticityunit = IfcDerivedUnitEnum.MODULUSOFELASTICITYUNIT +shearmodulusunit = IfcDerivedUnitEnum.SHEARMODULUSUNIT +linearstiffnessunit = IfcDerivedUnitEnum.LINEARSTIFFNESSUNIT +rotationalstiffnessunit = IfcDerivedUnitEnum.ROTATIONALSTIFFNESSUNIT +modulusofsubgradereactionunit = IfcDerivedUnitEnum.MODULUSOFSUBGRADEREACTIONUNIT +accelerationunit = IfcDerivedUnitEnum.ACCELERATIONUNIT +curvatureunit = IfcDerivedUnitEnum.CURVATUREUNIT +heatingvalueunit = IfcDerivedUnitEnum.HEATINGVALUEUNIT +ionconcentrationunit = IfcDerivedUnitEnum.IONCONCENTRATIONUNIT +luminousintensitydistributionunit = IfcDerivedUnitEnum.LUMINOUSINTENSITYDISTRIBUTIONUNIT +massperlengthunit = IfcDerivedUnitEnum.MASSPERLENGTHUNIT +modulusoflinearsubgradereactionunit = IfcDerivedUnitEnum.MODULUSOFLINEARSUBGRADEREACTIONUNIT +modulusofrotationalsubgradereactionunit = IfcDerivedUnitEnum.MODULUSOFROTATIONALSUBGRADEREACTIONUNIT +phunit = IfcDerivedUnitEnum.PHUNIT +rotationalmassunit = IfcDerivedUnitEnum.ROTATIONALMASSUNIT +sectionareaintegralunit = IfcDerivedUnitEnum.SECTIONAREAINTEGRALUNIT +sectionmodulusunit = IfcDerivedUnitEnum.SECTIONMODULUSUNIT +soundpowerlevelunit = IfcDerivedUnitEnum.SOUNDPOWERLEVELUNIT +soundpowerunit = IfcDerivedUnitEnum.SOUNDPOWERUNIT +soundpressurelevelunit = IfcDerivedUnitEnum.SOUNDPRESSURELEVELUNIT +soundpressureunit = IfcDerivedUnitEnum.SOUNDPRESSUREUNIT +temperaturegradientunit = IfcDerivedUnitEnum.TEMPERATUREGRADIENTUNIT +temperaturerateofchangeunit = IfcDerivedUnitEnum.TEMPERATURERATEOFCHANGEUNIT +thermalexpansioncoefficientunit = IfcDerivedUnitEnum.THERMALEXPANSIONCOEFFICIENTUNIT +warpingconstantunit = IfcDerivedUnitEnum.WARPINGCONSTANTUNIT +warpingmomentunit = IfcDerivedUnitEnum.WARPINGMOMENTUNIT +userdefined = IfcDerivedUnitEnum.USERDEFINED IfcDirectionSenseEnum = enum_namespace() -positive = express_getattr(IfcDirectionSenseEnum, 'POSITIVE', INDETERMINATE) -negative = express_getattr(IfcDirectionSenseEnum, 'NEGATIVE', INDETERMINATE) +positive = IfcDirectionSenseEnum.POSITIVE +negative = IfcDirectionSenseEnum.NEGATIVE IfcDiscreteAccessoryTypeEnum = enum_namespace() -anchorplate = express_getattr(IfcDiscreteAccessoryTypeEnum, 'ANCHORPLATE', INDETERMINATE) -bracket = express_getattr(IfcDiscreteAccessoryTypeEnum, 'BRACKET', INDETERMINATE) -shoe = express_getattr(IfcDiscreteAccessoryTypeEnum, 'SHOE', INDETERMINATE) -userdefined = express_getattr(IfcDiscreteAccessoryTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDiscreteAccessoryTypeEnum, 'NOTDEFINED', INDETERMINATE) +anchorplate = IfcDiscreteAccessoryTypeEnum.ANCHORPLATE +bracket = IfcDiscreteAccessoryTypeEnum.BRACKET +shoe = IfcDiscreteAccessoryTypeEnum.SHOE +userdefined = IfcDiscreteAccessoryTypeEnum.USERDEFINED +notdefined = IfcDiscreteAccessoryTypeEnum.NOTDEFINED IfcDistributionChamberElementTypeEnum = enum_namespace() -formedduct = express_getattr(IfcDistributionChamberElementTypeEnum, 'FORMEDDUCT', INDETERMINATE) -inspectionchamber = express_getattr(IfcDistributionChamberElementTypeEnum, 'INSPECTIONCHAMBER', INDETERMINATE) -inspectionpit = express_getattr(IfcDistributionChamberElementTypeEnum, 'INSPECTIONPIT', INDETERMINATE) -manhole = express_getattr(IfcDistributionChamberElementTypeEnum, 'MANHOLE', INDETERMINATE) -meterchamber = express_getattr(IfcDistributionChamberElementTypeEnum, 'METERCHAMBER', INDETERMINATE) -sump = express_getattr(IfcDistributionChamberElementTypeEnum, 'SUMP', INDETERMINATE) -trench = express_getattr(IfcDistributionChamberElementTypeEnum, 'TRENCH', INDETERMINATE) -valvechamber = express_getattr(IfcDistributionChamberElementTypeEnum, 'VALVECHAMBER', INDETERMINATE) -userdefined = express_getattr(IfcDistributionChamberElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDistributionChamberElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +formedduct = IfcDistributionChamberElementTypeEnum.FORMEDDUCT +inspectionchamber = IfcDistributionChamberElementTypeEnum.INSPECTIONCHAMBER +inspectionpit = IfcDistributionChamberElementTypeEnum.INSPECTIONPIT +manhole = IfcDistributionChamberElementTypeEnum.MANHOLE +meterchamber = IfcDistributionChamberElementTypeEnum.METERCHAMBER +sump = IfcDistributionChamberElementTypeEnum.SUMP +trench = IfcDistributionChamberElementTypeEnum.TRENCH +valvechamber = IfcDistributionChamberElementTypeEnum.VALVECHAMBER +userdefined = IfcDistributionChamberElementTypeEnum.USERDEFINED +notdefined = IfcDistributionChamberElementTypeEnum.NOTDEFINED IfcDistributionPortTypeEnum = enum_namespace() -cable = express_getattr(IfcDistributionPortTypeEnum, 'CABLE', INDETERMINATE) -cablecarrier = express_getattr(IfcDistributionPortTypeEnum, 'CABLECARRIER', INDETERMINATE) -duct = express_getattr(IfcDistributionPortTypeEnum, 'DUCT', INDETERMINATE) -pipe = express_getattr(IfcDistributionPortTypeEnum, 'PIPE', INDETERMINATE) -userdefined = express_getattr(IfcDistributionPortTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDistributionPortTypeEnum, 'NOTDEFINED', INDETERMINATE) +cable = IfcDistributionPortTypeEnum.CABLE +cablecarrier = IfcDistributionPortTypeEnum.CABLECARRIER +duct = IfcDistributionPortTypeEnum.DUCT +pipe = IfcDistributionPortTypeEnum.PIPE +userdefined = IfcDistributionPortTypeEnum.USERDEFINED +notdefined = IfcDistributionPortTypeEnum.NOTDEFINED IfcDistributionSystemEnum = enum_namespace() -airconditioning = express_getattr(IfcDistributionSystemEnum, 'AIRCONDITIONING', INDETERMINATE) -audiovisual = express_getattr(IfcDistributionSystemEnum, 'AUDIOVISUAL', INDETERMINATE) -chemical = express_getattr(IfcDistributionSystemEnum, 'CHEMICAL', INDETERMINATE) -chilledwater = express_getattr(IfcDistributionSystemEnum, 'CHILLEDWATER', INDETERMINATE) -communication = express_getattr(IfcDistributionSystemEnum, 'COMMUNICATION', INDETERMINATE) -compressedair = express_getattr(IfcDistributionSystemEnum, 'COMPRESSEDAIR', INDETERMINATE) -condenserwater = express_getattr(IfcDistributionSystemEnum, 'CONDENSERWATER', INDETERMINATE) -control = express_getattr(IfcDistributionSystemEnum, 'CONTROL', INDETERMINATE) -conveying = express_getattr(IfcDistributionSystemEnum, 'CONVEYING', INDETERMINATE) -data = express_getattr(IfcDistributionSystemEnum, 'DATA', INDETERMINATE) -disposal = express_getattr(IfcDistributionSystemEnum, 'DISPOSAL', INDETERMINATE) -domesticcoldwater = express_getattr(IfcDistributionSystemEnum, 'DOMESTICCOLDWATER', INDETERMINATE) -domestichotwater = express_getattr(IfcDistributionSystemEnum, 'DOMESTICHOTWATER', INDETERMINATE) -drainage = express_getattr(IfcDistributionSystemEnum, 'DRAINAGE', INDETERMINATE) -earthing = express_getattr(IfcDistributionSystemEnum, 'EARTHING', INDETERMINATE) -electrical = express_getattr(IfcDistributionSystemEnum, 'ELECTRICAL', INDETERMINATE) -electroacoustic = express_getattr(IfcDistributionSystemEnum, 'ELECTROACOUSTIC', INDETERMINATE) -exhaust = express_getattr(IfcDistributionSystemEnum, 'EXHAUST', INDETERMINATE) -fireprotection = express_getattr(IfcDistributionSystemEnum, 'FIREPROTECTION', INDETERMINATE) -fuel = express_getattr(IfcDistributionSystemEnum, 'FUEL', INDETERMINATE) -gas = express_getattr(IfcDistributionSystemEnum, 'GAS', INDETERMINATE) -hazardous = express_getattr(IfcDistributionSystemEnum, 'HAZARDOUS', INDETERMINATE) -heating = express_getattr(IfcDistributionSystemEnum, 'HEATING', INDETERMINATE) -lighting = express_getattr(IfcDistributionSystemEnum, 'LIGHTING', INDETERMINATE) -lightningprotection = express_getattr(IfcDistributionSystemEnum, 'LIGHTNINGPROTECTION', INDETERMINATE) -municipalsolidwaste = express_getattr(IfcDistributionSystemEnum, 'MUNICIPALSOLIDWASTE', INDETERMINATE) -oil = express_getattr(IfcDistributionSystemEnum, 'OIL', INDETERMINATE) -operational = express_getattr(IfcDistributionSystemEnum, 'OPERATIONAL', INDETERMINATE) -powergeneration = express_getattr(IfcDistributionSystemEnum, 'POWERGENERATION', INDETERMINATE) -rainwater = express_getattr(IfcDistributionSystemEnum, 'RAINWATER', INDETERMINATE) -refrigeration = express_getattr(IfcDistributionSystemEnum, 'REFRIGERATION', INDETERMINATE) -security = express_getattr(IfcDistributionSystemEnum, 'SECURITY', INDETERMINATE) -sewage = express_getattr(IfcDistributionSystemEnum, 'SEWAGE', INDETERMINATE) -signal = express_getattr(IfcDistributionSystemEnum, 'SIGNAL', INDETERMINATE) -stormwater = express_getattr(IfcDistributionSystemEnum, 'STORMWATER', INDETERMINATE) -telephone = express_getattr(IfcDistributionSystemEnum, 'TELEPHONE', INDETERMINATE) -tv = express_getattr(IfcDistributionSystemEnum, 'TV', INDETERMINATE) -vacuum = express_getattr(IfcDistributionSystemEnum, 'VACUUM', INDETERMINATE) -vent = express_getattr(IfcDistributionSystemEnum, 'VENT', INDETERMINATE) -ventilation = express_getattr(IfcDistributionSystemEnum, 'VENTILATION', INDETERMINATE) -wastewater = express_getattr(IfcDistributionSystemEnum, 'WASTEWATER', INDETERMINATE) -watersupply = express_getattr(IfcDistributionSystemEnum, 'WATERSUPPLY', INDETERMINATE) -userdefined = express_getattr(IfcDistributionSystemEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDistributionSystemEnum, 'NOTDEFINED', INDETERMINATE) +airconditioning = IfcDistributionSystemEnum.AIRCONDITIONING +audiovisual = IfcDistributionSystemEnum.AUDIOVISUAL +chemical = IfcDistributionSystemEnum.CHEMICAL +chilledwater = IfcDistributionSystemEnum.CHILLEDWATER +communication = IfcDistributionSystemEnum.COMMUNICATION +compressedair = IfcDistributionSystemEnum.COMPRESSEDAIR +condenserwater = IfcDistributionSystemEnum.CONDENSERWATER +control = IfcDistributionSystemEnum.CONTROL +conveying = IfcDistributionSystemEnum.CONVEYING +data = IfcDistributionSystemEnum.DATA +disposal = IfcDistributionSystemEnum.DISPOSAL +domesticcoldwater = IfcDistributionSystemEnum.DOMESTICCOLDWATER +domestichotwater = IfcDistributionSystemEnum.DOMESTICHOTWATER +drainage = IfcDistributionSystemEnum.DRAINAGE +earthing = IfcDistributionSystemEnum.EARTHING +electrical = IfcDistributionSystemEnum.ELECTRICAL +electroacoustic = IfcDistributionSystemEnum.ELECTROACOUSTIC +exhaust = IfcDistributionSystemEnum.EXHAUST +fireprotection = IfcDistributionSystemEnum.FIREPROTECTION +fuel = IfcDistributionSystemEnum.FUEL +gas = IfcDistributionSystemEnum.GAS +hazardous = IfcDistributionSystemEnum.HAZARDOUS +heating = IfcDistributionSystemEnum.HEATING +lighting = IfcDistributionSystemEnum.LIGHTING +lightningprotection = IfcDistributionSystemEnum.LIGHTNINGPROTECTION +municipalsolidwaste = IfcDistributionSystemEnum.MUNICIPALSOLIDWASTE +oil = IfcDistributionSystemEnum.OIL +operational = IfcDistributionSystemEnum.OPERATIONAL +powergeneration = IfcDistributionSystemEnum.POWERGENERATION +rainwater = IfcDistributionSystemEnum.RAINWATER +refrigeration = IfcDistributionSystemEnum.REFRIGERATION +security = IfcDistributionSystemEnum.SECURITY +sewage = IfcDistributionSystemEnum.SEWAGE +signal = IfcDistributionSystemEnum.SIGNAL +stormwater = IfcDistributionSystemEnum.STORMWATER +telephone = IfcDistributionSystemEnum.TELEPHONE +tv = IfcDistributionSystemEnum.TV +vacuum = IfcDistributionSystemEnum.VACUUM +vent = IfcDistributionSystemEnum.VENT +ventilation = IfcDistributionSystemEnum.VENTILATION +wastewater = IfcDistributionSystemEnum.WASTEWATER +watersupply = IfcDistributionSystemEnum.WATERSUPPLY +userdefined = IfcDistributionSystemEnum.USERDEFINED +notdefined = IfcDistributionSystemEnum.NOTDEFINED IfcDocumentConfidentialityEnum = enum_namespace() -public = express_getattr(IfcDocumentConfidentialityEnum, 'PUBLIC', INDETERMINATE) -restricted = express_getattr(IfcDocumentConfidentialityEnum, 'RESTRICTED', INDETERMINATE) -confidential = express_getattr(IfcDocumentConfidentialityEnum, 'CONFIDENTIAL', INDETERMINATE) -personal = express_getattr(IfcDocumentConfidentialityEnum, 'PERSONAL', INDETERMINATE) -userdefined = express_getattr(IfcDocumentConfidentialityEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDocumentConfidentialityEnum, 'NOTDEFINED', INDETERMINATE) +public = IfcDocumentConfidentialityEnum.PUBLIC +restricted = IfcDocumentConfidentialityEnum.RESTRICTED +confidential = IfcDocumentConfidentialityEnum.CONFIDENTIAL +personal = IfcDocumentConfidentialityEnum.PERSONAL +userdefined = IfcDocumentConfidentialityEnum.USERDEFINED +notdefined = IfcDocumentConfidentialityEnum.NOTDEFINED IfcDocumentStatusEnum = enum_namespace() -draft = express_getattr(IfcDocumentStatusEnum, 'DRAFT', INDETERMINATE) -finaldraft = express_getattr(IfcDocumentStatusEnum, 'FINALDRAFT', INDETERMINATE) -final = express_getattr(IfcDocumentStatusEnum, 'FINAL', INDETERMINATE) -revision = express_getattr(IfcDocumentStatusEnum, 'REVISION', INDETERMINATE) -notdefined = express_getattr(IfcDocumentStatusEnum, 'NOTDEFINED', INDETERMINATE) +draft = IfcDocumentStatusEnum.DRAFT +finaldraft = IfcDocumentStatusEnum.FINALDRAFT +final = IfcDocumentStatusEnum.FINAL +revision = IfcDocumentStatusEnum.REVISION +notdefined = IfcDocumentStatusEnum.NOTDEFINED IfcDoorPanelOperationEnum = enum_namespace() -swinging = express_getattr(IfcDoorPanelOperationEnum, 'SWINGING', INDETERMINATE) -double_acting = express_getattr(IfcDoorPanelOperationEnum, 'DOUBLE_ACTING', INDETERMINATE) -sliding = express_getattr(IfcDoorPanelOperationEnum, 'SLIDING', INDETERMINATE) -folding = express_getattr(IfcDoorPanelOperationEnum, 'FOLDING', INDETERMINATE) -revolving = express_getattr(IfcDoorPanelOperationEnum, 'REVOLVING', INDETERMINATE) -rollingup = express_getattr(IfcDoorPanelOperationEnum, 'ROLLINGUP', INDETERMINATE) -fixedpanel = express_getattr(IfcDoorPanelOperationEnum, 'FIXEDPANEL', INDETERMINATE) -userdefined = express_getattr(IfcDoorPanelOperationEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDoorPanelOperationEnum, 'NOTDEFINED', INDETERMINATE) +swinging = IfcDoorPanelOperationEnum.SWINGING +double_acting = IfcDoorPanelOperationEnum.DOUBLE_ACTING +sliding = IfcDoorPanelOperationEnum.SLIDING +folding = IfcDoorPanelOperationEnum.FOLDING +revolving = IfcDoorPanelOperationEnum.REVOLVING +rollingup = IfcDoorPanelOperationEnum.ROLLINGUP +fixedpanel = IfcDoorPanelOperationEnum.FIXEDPANEL +userdefined = IfcDoorPanelOperationEnum.USERDEFINED +notdefined = IfcDoorPanelOperationEnum.NOTDEFINED IfcDoorPanelPositionEnum = enum_namespace() -left = express_getattr(IfcDoorPanelPositionEnum, 'LEFT', INDETERMINATE) -middle = express_getattr(IfcDoorPanelPositionEnum, 'MIDDLE', INDETERMINATE) -right = express_getattr(IfcDoorPanelPositionEnum, 'RIGHT', INDETERMINATE) -notdefined = express_getattr(IfcDoorPanelPositionEnum, 'NOTDEFINED', INDETERMINATE) +left = IfcDoorPanelPositionEnum.LEFT +middle = IfcDoorPanelPositionEnum.MIDDLE +right = IfcDoorPanelPositionEnum.RIGHT +notdefined = IfcDoorPanelPositionEnum.NOTDEFINED IfcDoorStyleConstructionEnum = enum_namespace() -aluminium = express_getattr(IfcDoorStyleConstructionEnum, 'ALUMINIUM', INDETERMINATE) -high_grade_steel = express_getattr(IfcDoorStyleConstructionEnum, 'HIGH_GRADE_STEEL', INDETERMINATE) -steel = express_getattr(IfcDoorStyleConstructionEnum, 'STEEL', INDETERMINATE) -wood = express_getattr(IfcDoorStyleConstructionEnum, 'WOOD', INDETERMINATE) -aluminium_wood = express_getattr(IfcDoorStyleConstructionEnum, 'ALUMINIUM_WOOD', INDETERMINATE) -aluminium_plastic = express_getattr(IfcDoorStyleConstructionEnum, 'ALUMINIUM_PLASTIC', INDETERMINATE) -plastic = express_getattr(IfcDoorStyleConstructionEnum, 'PLASTIC', INDETERMINATE) -userdefined = express_getattr(IfcDoorStyleConstructionEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDoorStyleConstructionEnum, 'NOTDEFINED', INDETERMINATE) +aluminium = IfcDoorStyleConstructionEnum.ALUMINIUM +high_grade_steel = IfcDoorStyleConstructionEnum.HIGH_GRADE_STEEL +steel = IfcDoorStyleConstructionEnum.STEEL +wood = IfcDoorStyleConstructionEnum.WOOD +aluminium_wood = IfcDoorStyleConstructionEnum.ALUMINIUM_WOOD +aluminium_plastic = IfcDoorStyleConstructionEnum.ALUMINIUM_PLASTIC +plastic = IfcDoorStyleConstructionEnum.PLASTIC +userdefined = IfcDoorStyleConstructionEnum.USERDEFINED +notdefined = IfcDoorStyleConstructionEnum.NOTDEFINED IfcDoorStyleOperationEnum = enum_namespace() -single_swing_left = express_getattr(IfcDoorStyleOperationEnum, 'SINGLE_SWING_LEFT', INDETERMINATE) -single_swing_right = express_getattr(IfcDoorStyleOperationEnum, 'SINGLE_SWING_RIGHT', INDETERMINATE) -double_door_single_swing = express_getattr(IfcDoorStyleOperationEnum, 'DOUBLE_DOOR_SINGLE_SWING', INDETERMINATE) -double_door_single_swing_opposite_left = express_getattr(IfcDoorStyleOperationEnum, 'DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_LEFT', INDETERMINATE) -double_door_single_swing_opposite_right = express_getattr(IfcDoorStyleOperationEnum, 'DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_RIGHT', INDETERMINATE) -double_swing_left = express_getattr(IfcDoorStyleOperationEnum, 'DOUBLE_SWING_LEFT', INDETERMINATE) -double_swing_right = express_getattr(IfcDoorStyleOperationEnum, 'DOUBLE_SWING_RIGHT', INDETERMINATE) -double_door_double_swing = express_getattr(IfcDoorStyleOperationEnum, 'DOUBLE_DOOR_DOUBLE_SWING', INDETERMINATE) -sliding_to_left = express_getattr(IfcDoorStyleOperationEnum, 'SLIDING_TO_LEFT', INDETERMINATE) -sliding_to_right = express_getattr(IfcDoorStyleOperationEnum, 'SLIDING_TO_RIGHT', INDETERMINATE) -double_door_sliding = express_getattr(IfcDoorStyleOperationEnum, 'DOUBLE_DOOR_SLIDING', INDETERMINATE) -folding_to_left = express_getattr(IfcDoorStyleOperationEnum, 'FOLDING_TO_LEFT', INDETERMINATE) -folding_to_right = express_getattr(IfcDoorStyleOperationEnum, 'FOLDING_TO_RIGHT', INDETERMINATE) -double_door_folding = express_getattr(IfcDoorStyleOperationEnum, 'DOUBLE_DOOR_FOLDING', INDETERMINATE) -revolving = express_getattr(IfcDoorStyleOperationEnum, 'REVOLVING', INDETERMINATE) -rollingup = express_getattr(IfcDoorStyleOperationEnum, 'ROLLINGUP', INDETERMINATE) -userdefined = express_getattr(IfcDoorStyleOperationEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDoorStyleOperationEnum, 'NOTDEFINED', INDETERMINATE) +single_swing_left = IfcDoorStyleOperationEnum.SINGLE_SWING_LEFT +single_swing_right = IfcDoorStyleOperationEnum.SINGLE_SWING_RIGHT +double_door_single_swing = IfcDoorStyleOperationEnum.DOUBLE_DOOR_SINGLE_SWING +double_door_single_swing_opposite_left = IfcDoorStyleOperationEnum.DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_LEFT +double_door_single_swing_opposite_right = IfcDoorStyleOperationEnum.DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_RIGHT +double_swing_left = IfcDoorStyleOperationEnum.DOUBLE_SWING_LEFT +double_swing_right = IfcDoorStyleOperationEnum.DOUBLE_SWING_RIGHT +double_door_double_swing = IfcDoorStyleOperationEnum.DOUBLE_DOOR_DOUBLE_SWING +sliding_to_left = IfcDoorStyleOperationEnum.SLIDING_TO_LEFT +sliding_to_right = IfcDoorStyleOperationEnum.SLIDING_TO_RIGHT +double_door_sliding = IfcDoorStyleOperationEnum.DOUBLE_DOOR_SLIDING +folding_to_left = IfcDoorStyleOperationEnum.FOLDING_TO_LEFT +folding_to_right = IfcDoorStyleOperationEnum.FOLDING_TO_RIGHT +double_door_folding = IfcDoorStyleOperationEnum.DOUBLE_DOOR_FOLDING +revolving = IfcDoorStyleOperationEnum.REVOLVING +rollingup = IfcDoorStyleOperationEnum.ROLLINGUP +userdefined = IfcDoorStyleOperationEnum.USERDEFINED +notdefined = IfcDoorStyleOperationEnum.NOTDEFINED IfcDoorTypeEnum = enum_namespace() -door = express_getattr(IfcDoorTypeEnum, 'DOOR', INDETERMINATE) -gate = express_getattr(IfcDoorTypeEnum, 'GATE', INDETERMINATE) -trapdoor = express_getattr(IfcDoorTypeEnum, 'TRAPDOOR', INDETERMINATE) -userdefined = express_getattr(IfcDoorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDoorTypeEnum, 'NOTDEFINED', INDETERMINATE) +door = IfcDoorTypeEnum.DOOR +gate = IfcDoorTypeEnum.GATE +trapdoor = IfcDoorTypeEnum.TRAPDOOR +userdefined = IfcDoorTypeEnum.USERDEFINED +notdefined = IfcDoorTypeEnum.NOTDEFINED IfcDoorTypeOperationEnum = enum_namespace() -single_swing_left = express_getattr(IfcDoorTypeOperationEnum, 'SINGLE_SWING_LEFT', INDETERMINATE) -single_swing_right = express_getattr(IfcDoorTypeOperationEnum, 'SINGLE_SWING_RIGHT', INDETERMINATE) -double_door_single_swing = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_DOOR_SINGLE_SWING', INDETERMINATE) -double_door_single_swing_opposite_left = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_LEFT', INDETERMINATE) -double_door_single_swing_opposite_right = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_RIGHT', INDETERMINATE) -double_swing_left = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_SWING_LEFT', INDETERMINATE) -double_swing_right = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_SWING_RIGHT', INDETERMINATE) -double_door_double_swing = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_DOOR_DOUBLE_SWING', INDETERMINATE) -sliding_to_left = express_getattr(IfcDoorTypeOperationEnum, 'SLIDING_TO_LEFT', INDETERMINATE) -sliding_to_right = express_getattr(IfcDoorTypeOperationEnum, 'SLIDING_TO_RIGHT', INDETERMINATE) -double_door_sliding = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_DOOR_SLIDING', INDETERMINATE) -folding_to_left = express_getattr(IfcDoorTypeOperationEnum, 'FOLDING_TO_LEFT', INDETERMINATE) -folding_to_right = express_getattr(IfcDoorTypeOperationEnum, 'FOLDING_TO_RIGHT', INDETERMINATE) -double_door_folding = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_DOOR_FOLDING', INDETERMINATE) -revolving = express_getattr(IfcDoorTypeOperationEnum, 'REVOLVING', INDETERMINATE) -rollingup = express_getattr(IfcDoorTypeOperationEnum, 'ROLLINGUP', INDETERMINATE) -swing_fixed_left = express_getattr(IfcDoorTypeOperationEnum, 'SWING_FIXED_LEFT', INDETERMINATE) -swing_fixed_right = express_getattr(IfcDoorTypeOperationEnum, 'SWING_FIXED_RIGHT', INDETERMINATE) -userdefined = express_getattr(IfcDoorTypeOperationEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDoorTypeOperationEnum, 'NOTDEFINED', INDETERMINATE) +single_swing_left = IfcDoorTypeOperationEnum.SINGLE_SWING_LEFT +single_swing_right = IfcDoorTypeOperationEnum.SINGLE_SWING_RIGHT +double_door_single_swing = IfcDoorTypeOperationEnum.DOUBLE_DOOR_SINGLE_SWING +double_door_single_swing_opposite_left = IfcDoorTypeOperationEnum.DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_LEFT +double_door_single_swing_opposite_right = IfcDoorTypeOperationEnum.DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_RIGHT +double_swing_left = IfcDoorTypeOperationEnum.DOUBLE_SWING_LEFT +double_swing_right = IfcDoorTypeOperationEnum.DOUBLE_SWING_RIGHT +double_door_double_swing = IfcDoorTypeOperationEnum.DOUBLE_DOOR_DOUBLE_SWING +sliding_to_left = IfcDoorTypeOperationEnum.SLIDING_TO_LEFT +sliding_to_right = IfcDoorTypeOperationEnum.SLIDING_TO_RIGHT +double_door_sliding = IfcDoorTypeOperationEnum.DOUBLE_DOOR_SLIDING +folding_to_left = IfcDoorTypeOperationEnum.FOLDING_TO_LEFT +folding_to_right = IfcDoorTypeOperationEnum.FOLDING_TO_RIGHT +double_door_folding = IfcDoorTypeOperationEnum.DOUBLE_DOOR_FOLDING +revolving = IfcDoorTypeOperationEnum.REVOLVING +rollingup = IfcDoorTypeOperationEnum.ROLLINGUP +swing_fixed_left = IfcDoorTypeOperationEnum.SWING_FIXED_LEFT +swing_fixed_right = IfcDoorTypeOperationEnum.SWING_FIXED_RIGHT +userdefined = IfcDoorTypeOperationEnum.USERDEFINED +notdefined = IfcDoorTypeOperationEnum.NOTDEFINED IfcDuctFittingTypeEnum = enum_namespace() -bend = express_getattr(IfcDuctFittingTypeEnum, 'BEND', INDETERMINATE) -connector = express_getattr(IfcDuctFittingTypeEnum, 'CONNECTOR', INDETERMINATE) -entry = express_getattr(IfcDuctFittingTypeEnum, 'ENTRY', INDETERMINATE) -exit = express_getattr(IfcDuctFittingTypeEnum, 'EXIT', INDETERMINATE) -junction = express_getattr(IfcDuctFittingTypeEnum, 'JUNCTION', INDETERMINATE) -obstruction = express_getattr(IfcDuctFittingTypeEnum, 'OBSTRUCTION', INDETERMINATE) -transition = express_getattr(IfcDuctFittingTypeEnum, 'TRANSITION', INDETERMINATE) -userdefined = express_getattr(IfcDuctFittingTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDuctFittingTypeEnum, 'NOTDEFINED', INDETERMINATE) +bend = IfcDuctFittingTypeEnum.BEND +connector = IfcDuctFittingTypeEnum.CONNECTOR +entry = IfcDuctFittingTypeEnum.ENTRY +exit = IfcDuctFittingTypeEnum.EXIT +junction = IfcDuctFittingTypeEnum.JUNCTION +obstruction = IfcDuctFittingTypeEnum.OBSTRUCTION +transition = IfcDuctFittingTypeEnum.TRANSITION +userdefined = IfcDuctFittingTypeEnum.USERDEFINED +notdefined = IfcDuctFittingTypeEnum.NOTDEFINED IfcDuctSegmentTypeEnum = enum_namespace() -rigidsegment = express_getattr(IfcDuctSegmentTypeEnum, 'RIGIDSEGMENT', INDETERMINATE) -flexiblesegment = express_getattr(IfcDuctSegmentTypeEnum, 'FLEXIBLESEGMENT', INDETERMINATE) -userdefined = express_getattr(IfcDuctSegmentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDuctSegmentTypeEnum, 'NOTDEFINED', INDETERMINATE) +rigidsegment = IfcDuctSegmentTypeEnum.RIGIDSEGMENT +flexiblesegment = IfcDuctSegmentTypeEnum.FLEXIBLESEGMENT +userdefined = IfcDuctSegmentTypeEnum.USERDEFINED +notdefined = IfcDuctSegmentTypeEnum.NOTDEFINED IfcDuctSilencerTypeEnum = enum_namespace() -flatoval = express_getattr(IfcDuctSilencerTypeEnum, 'FLATOVAL', INDETERMINATE) -rectangular = express_getattr(IfcDuctSilencerTypeEnum, 'RECTANGULAR', INDETERMINATE) -round = express_getattr(IfcDuctSilencerTypeEnum, 'ROUND', INDETERMINATE) -userdefined = express_getattr(IfcDuctSilencerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDuctSilencerTypeEnum, 'NOTDEFINED', INDETERMINATE) +flatoval = IfcDuctSilencerTypeEnum.FLATOVAL +rectangular = IfcDuctSilencerTypeEnum.RECTANGULAR +round = IfcDuctSilencerTypeEnum.ROUND +userdefined = IfcDuctSilencerTypeEnum.USERDEFINED +notdefined = IfcDuctSilencerTypeEnum.NOTDEFINED IfcElectricApplianceTypeEnum = enum_namespace() -dishwasher = express_getattr(IfcElectricApplianceTypeEnum, 'DISHWASHER', INDETERMINATE) -electriccooker = express_getattr(IfcElectricApplianceTypeEnum, 'ELECTRICCOOKER', INDETERMINATE) -freestandingelectricheater = express_getattr(IfcElectricApplianceTypeEnum, 'FREESTANDINGELECTRICHEATER', INDETERMINATE) -freestandingfan = express_getattr(IfcElectricApplianceTypeEnum, 'FREESTANDINGFAN', INDETERMINATE) -freestandingwaterheater = express_getattr(IfcElectricApplianceTypeEnum, 'FREESTANDINGWATERHEATER', INDETERMINATE) -freestandingwatercooler = express_getattr(IfcElectricApplianceTypeEnum, 'FREESTANDINGWATERCOOLER', INDETERMINATE) -freezer = express_getattr(IfcElectricApplianceTypeEnum, 'FREEZER', INDETERMINATE) -fridge_freezer = express_getattr(IfcElectricApplianceTypeEnum, 'FRIDGE_FREEZER', INDETERMINATE) -handdryer = express_getattr(IfcElectricApplianceTypeEnum, 'HANDDRYER', INDETERMINATE) -kitchenmachine = express_getattr(IfcElectricApplianceTypeEnum, 'KITCHENMACHINE', INDETERMINATE) -microwave = express_getattr(IfcElectricApplianceTypeEnum, 'MICROWAVE', INDETERMINATE) -photocopier = express_getattr(IfcElectricApplianceTypeEnum, 'PHOTOCOPIER', INDETERMINATE) -refrigerator = express_getattr(IfcElectricApplianceTypeEnum, 'REFRIGERATOR', INDETERMINATE) -tumbledryer = express_getattr(IfcElectricApplianceTypeEnum, 'TUMBLEDRYER', INDETERMINATE) -vendingmachine = express_getattr(IfcElectricApplianceTypeEnum, 'VENDINGMACHINE', INDETERMINATE) -washingmachine = express_getattr(IfcElectricApplianceTypeEnum, 'WASHINGMACHINE', INDETERMINATE) -userdefined = express_getattr(IfcElectricApplianceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcElectricApplianceTypeEnum, 'NOTDEFINED', INDETERMINATE) +dishwasher = IfcElectricApplianceTypeEnum.DISHWASHER +electriccooker = IfcElectricApplianceTypeEnum.ELECTRICCOOKER +freestandingelectricheater = IfcElectricApplianceTypeEnum.FREESTANDINGELECTRICHEATER +freestandingfan = IfcElectricApplianceTypeEnum.FREESTANDINGFAN +freestandingwaterheater = IfcElectricApplianceTypeEnum.FREESTANDINGWATERHEATER +freestandingwatercooler = IfcElectricApplianceTypeEnum.FREESTANDINGWATERCOOLER +freezer = IfcElectricApplianceTypeEnum.FREEZER +fridge_freezer = IfcElectricApplianceTypeEnum.FRIDGE_FREEZER +handdryer = IfcElectricApplianceTypeEnum.HANDDRYER +kitchenmachine = IfcElectricApplianceTypeEnum.KITCHENMACHINE +microwave = IfcElectricApplianceTypeEnum.MICROWAVE +photocopier = IfcElectricApplianceTypeEnum.PHOTOCOPIER +refrigerator = IfcElectricApplianceTypeEnum.REFRIGERATOR +tumbledryer = IfcElectricApplianceTypeEnum.TUMBLEDRYER +vendingmachine = IfcElectricApplianceTypeEnum.VENDINGMACHINE +washingmachine = IfcElectricApplianceTypeEnum.WASHINGMACHINE +userdefined = IfcElectricApplianceTypeEnum.USERDEFINED +notdefined = IfcElectricApplianceTypeEnum.NOTDEFINED IfcElectricDistributionBoardTypeEnum = enum_namespace() -consumerunit = express_getattr(IfcElectricDistributionBoardTypeEnum, 'CONSUMERUNIT', INDETERMINATE) -distributionboard = express_getattr(IfcElectricDistributionBoardTypeEnum, 'DISTRIBUTIONBOARD', INDETERMINATE) -motorcontrolcentre = express_getattr(IfcElectricDistributionBoardTypeEnum, 'MOTORCONTROLCENTRE', INDETERMINATE) -switchboard = express_getattr(IfcElectricDistributionBoardTypeEnum, 'SWITCHBOARD', INDETERMINATE) -userdefined = express_getattr(IfcElectricDistributionBoardTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcElectricDistributionBoardTypeEnum, 'NOTDEFINED', INDETERMINATE) +consumerunit = IfcElectricDistributionBoardTypeEnum.CONSUMERUNIT +distributionboard = IfcElectricDistributionBoardTypeEnum.DISTRIBUTIONBOARD +motorcontrolcentre = IfcElectricDistributionBoardTypeEnum.MOTORCONTROLCENTRE +switchboard = IfcElectricDistributionBoardTypeEnum.SWITCHBOARD +userdefined = IfcElectricDistributionBoardTypeEnum.USERDEFINED +notdefined = IfcElectricDistributionBoardTypeEnum.NOTDEFINED IfcElectricFlowStorageDeviceTypeEnum = enum_namespace() -battery = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'BATTERY', INDETERMINATE) -capacitorbank = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'CAPACITORBANK', INDETERMINATE) -harmonicfilter = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'HARMONICFILTER', INDETERMINATE) -inductorbank = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'INDUCTORBANK', INDETERMINATE) -ups = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'UPS', INDETERMINATE) -userdefined = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'NOTDEFINED', INDETERMINATE) +battery = IfcElectricFlowStorageDeviceTypeEnum.BATTERY +capacitorbank = IfcElectricFlowStorageDeviceTypeEnum.CAPACITORBANK +harmonicfilter = IfcElectricFlowStorageDeviceTypeEnum.HARMONICFILTER +inductorbank = IfcElectricFlowStorageDeviceTypeEnum.INDUCTORBANK +ups = IfcElectricFlowStorageDeviceTypeEnum.UPS +userdefined = IfcElectricFlowStorageDeviceTypeEnum.USERDEFINED +notdefined = IfcElectricFlowStorageDeviceTypeEnum.NOTDEFINED IfcElectricGeneratorTypeEnum = enum_namespace() -chp = express_getattr(IfcElectricGeneratorTypeEnum, 'CHP', INDETERMINATE) -enginegenerator = express_getattr(IfcElectricGeneratorTypeEnum, 'ENGINEGENERATOR', INDETERMINATE) -standalone = express_getattr(IfcElectricGeneratorTypeEnum, 'STANDALONE', INDETERMINATE) -userdefined = express_getattr(IfcElectricGeneratorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcElectricGeneratorTypeEnum, 'NOTDEFINED', INDETERMINATE) +chp = IfcElectricGeneratorTypeEnum.CHP +enginegenerator = IfcElectricGeneratorTypeEnum.ENGINEGENERATOR +standalone = IfcElectricGeneratorTypeEnum.STANDALONE +userdefined = IfcElectricGeneratorTypeEnum.USERDEFINED +notdefined = IfcElectricGeneratorTypeEnum.NOTDEFINED IfcElectricMotorTypeEnum = enum_namespace() -dc = express_getattr(IfcElectricMotorTypeEnum, 'DC', INDETERMINATE) -induction = express_getattr(IfcElectricMotorTypeEnum, 'INDUCTION', INDETERMINATE) -polyphase = express_getattr(IfcElectricMotorTypeEnum, 'POLYPHASE', INDETERMINATE) -reluctancesynchronous = express_getattr(IfcElectricMotorTypeEnum, 'RELUCTANCESYNCHRONOUS', INDETERMINATE) -synchronous = express_getattr(IfcElectricMotorTypeEnum, 'SYNCHRONOUS', INDETERMINATE) -userdefined = express_getattr(IfcElectricMotorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcElectricMotorTypeEnum, 'NOTDEFINED', INDETERMINATE) +dc = IfcElectricMotorTypeEnum.DC +induction = IfcElectricMotorTypeEnum.INDUCTION +polyphase = IfcElectricMotorTypeEnum.POLYPHASE +reluctancesynchronous = IfcElectricMotorTypeEnum.RELUCTANCESYNCHRONOUS +synchronous = IfcElectricMotorTypeEnum.SYNCHRONOUS +userdefined = IfcElectricMotorTypeEnum.USERDEFINED +notdefined = IfcElectricMotorTypeEnum.NOTDEFINED IfcElectricTimeControlTypeEnum = enum_namespace() -timeclock = express_getattr(IfcElectricTimeControlTypeEnum, 'TIMECLOCK', INDETERMINATE) -timedelay = express_getattr(IfcElectricTimeControlTypeEnum, 'TIMEDELAY', INDETERMINATE) -relay = express_getattr(IfcElectricTimeControlTypeEnum, 'RELAY', INDETERMINATE) -userdefined = express_getattr(IfcElectricTimeControlTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcElectricTimeControlTypeEnum, 'NOTDEFINED', INDETERMINATE) +timeclock = IfcElectricTimeControlTypeEnum.TIMECLOCK +timedelay = IfcElectricTimeControlTypeEnum.TIMEDELAY +relay = IfcElectricTimeControlTypeEnum.RELAY +userdefined = IfcElectricTimeControlTypeEnum.USERDEFINED +notdefined = IfcElectricTimeControlTypeEnum.NOTDEFINED IfcElementAssemblyTypeEnum = enum_namespace() -accessory_assembly = express_getattr(IfcElementAssemblyTypeEnum, 'ACCESSORY_ASSEMBLY', INDETERMINATE) -arch = express_getattr(IfcElementAssemblyTypeEnum, 'ARCH', INDETERMINATE) -beam_grid = express_getattr(IfcElementAssemblyTypeEnum, 'BEAM_GRID', INDETERMINATE) -braced_frame = express_getattr(IfcElementAssemblyTypeEnum, 'BRACED_FRAME', INDETERMINATE) -girder = express_getattr(IfcElementAssemblyTypeEnum, 'GIRDER', INDETERMINATE) -reinforcement_unit = express_getattr(IfcElementAssemblyTypeEnum, 'REINFORCEMENT_UNIT', INDETERMINATE) -rigid_frame = express_getattr(IfcElementAssemblyTypeEnum, 'RIGID_FRAME', INDETERMINATE) -slab_field = express_getattr(IfcElementAssemblyTypeEnum, 'SLAB_FIELD', INDETERMINATE) -truss = express_getattr(IfcElementAssemblyTypeEnum, 'TRUSS', INDETERMINATE) -userdefined = express_getattr(IfcElementAssemblyTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcElementAssemblyTypeEnum, 'NOTDEFINED', INDETERMINATE) +accessory_assembly = IfcElementAssemblyTypeEnum.ACCESSORY_ASSEMBLY +arch = IfcElementAssemblyTypeEnum.ARCH +beam_grid = IfcElementAssemblyTypeEnum.BEAM_GRID +braced_frame = IfcElementAssemblyTypeEnum.BRACED_FRAME +girder = IfcElementAssemblyTypeEnum.GIRDER +reinforcement_unit = IfcElementAssemblyTypeEnum.REINFORCEMENT_UNIT +rigid_frame = IfcElementAssemblyTypeEnum.RIGID_FRAME +slab_field = IfcElementAssemblyTypeEnum.SLAB_FIELD +truss = IfcElementAssemblyTypeEnum.TRUSS +userdefined = IfcElementAssemblyTypeEnum.USERDEFINED +notdefined = IfcElementAssemblyTypeEnum.NOTDEFINED IfcElementCompositionEnum = enum_namespace() -complex = express_getattr(IfcElementCompositionEnum, 'COMPLEX', INDETERMINATE) -element = express_getattr(IfcElementCompositionEnum, 'ELEMENT', INDETERMINATE) -partial = express_getattr(IfcElementCompositionEnum, 'PARTIAL', INDETERMINATE) +complex = IfcElementCompositionEnum.COMPLEX +element = IfcElementCompositionEnum.ELEMENT +partial = IfcElementCompositionEnum.PARTIAL IfcEngineTypeEnum = enum_namespace() -externalcombustion = express_getattr(IfcEngineTypeEnum, 'EXTERNALCOMBUSTION', INDETERMINATE) -internalcombustion = express_getattr(IfcEngineTypeEnum, 'INTERNALCOMBUSTION', INDETERMINATE) -userdefined = express_getattr(IfcEngineTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcEngineTypeEnum, 'NOTDEFINED', INDETERMINATE) +externalcombustion = IfcEngineTypeEnum.EXTERNALCOMBUSTION +internalcombustion = IfcEngineTypeEnum.INTERNALCOMBUSTION +userdefined = IfcEngineTypeEnum.USERDEFINED +notdefined = IfcEngineTypeEnum.NOTDEFINED IfcEvaporativeCoolerTypeEnum = enum_namespace() -directevaporativerandommediaaircooler = express_getattr(IfcEvaporativeCoolerTypeEnum, 'DIRECTEVAPORATIVERANDOMMEDIAAIRCOOLER', INDETERMINATE) -directevaporativerigidmediaaircooler = express_getattr(IfcEvaporativeCoolerTypeEnum, 'DIRECTEVAPORATIVERIGIDMEDIAAIRCOOLER', INDETERMINATE) -directevaporativeslingerspackagedaircooler = express_getattr(IfcEvaporativeCoolerTypeEnum, 'DIRECTEVAPORATIVESLINGERSPACKAGEDAIRCOOLER', INDETERMINATE) -directevaporativepackagedrotaryaircooler = express_getattr(IfcEvaporativeCoolerTypeEnum, 'DIRECTEVAPORATIVEPACKAGEDROTARYAIRCOOLER', INDETERMINATE) -directevaporativeairwasher = express_getattr(IfcEvaporativeCoolerTypeEnum, 'DIRECTEVAPORATIVEAIRWASHER', INDETERMINATE) -indirectevaporativepackageaircooler = express_getattr(IfcEvaporativeCoolerTypeEnum, 'INDIRECTEVAPORATIVEPACKAGEAIRCOOLER', INDETERMINATE) -indirectevaporativewetcoil = express_getattr(IfcEvaporativeCoolerTypeEnum, 'INDIRECTEVAPORATIVEWETCOIL', INDETERMINATE) -indirectevaporativecoolingtowerorcoilcooler = express_getattr(IfcEvaporativeCoolerTypeEnum, 'INDIRECTEVAPORATIVECOOLINGTOWERORCOILCOOLER', INDETERMINATE) -indirectdirectcombination = express_getattr(IfcEvaporativeCoolerTypeEnum, 'INDIRECTDIRECTCOMBINATION', INDETERMINATE) -userdefined = express_getattr(IfcEvaporativeCoolerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcEvaporativeCoolerTypeEnum, 'NOTDEFINED', INDETERMINATE) +directevaporativerandommediaaircooler = IfcEvaporativeCoolerTypeEnum.DIRECTEVAPORATIVERANDOMMEDIAAIRCOOLER +directevaporativerigidmediaaircooler = IfcEvaporativeCoolerTypeEnum.DIRECTEVAPORATIVERIGIDMEDIAAIRCOOLER +directevaporativeslingerspackagedaircooler = IfcEvaporativeCoolerTypeEnum.DIRECTEVAPORATIVESLINGERSPACKAGEDAIRCOOLER +directevaporativepackagedrotaryaircooler = IfcEvaporativeCoolerTypeEnum.DIRECTEVAPORATIVEPACKAGEDROTARYAIRCOOLER +directevaporativeairwasher = IfcEvaporativeCoolerTypeEnum.DIRECTEVAPORATIVEAIRWASHER +indirectevaporativepackageaircooler = IfcEvaporativeCoolerTypeEnum.INDIRECTEVAPORATIVEPACKAGEAIRCOOLER +indirectevaporativewetcoil = IfcEvaporativeCoolerTypeEnum.INDIRECTEVAPORATIVEWETCOIL +indirectevaporativecoolingtowerorcoilcooler = IfcEvaporativeCoolerTypeEnum.INDIRECTEVAPORATIVECOOLINGTOWERORCOILCOOLER +indirectdirectcombination = IfcEvaporativeCoolerTypeEnum.INDIRECTDIRECTCOMBINATION +userdefined = IfcEvaporativeCoolerTypeEnum.USERDEFINED +notdefined = IfcEvaporativeCoolerTypeEnum.NOTDEFINED IfcEvaporatorTypeEnum = enum_namespace() -directexpansion = express_getattr(IfcEvaporatorTypeEnum, 'DIRECTEXPANSION', INDETERMINATE) -directexpansionshellandtube = express_getattr(IfcEvaporatorTypeEnum, 'DIRECTEXPANSIONSHELLANDTUBE', INDETERMINATE) -directexpansiontubeintube = express_getattr(IfcEvaporatorTypeEnum, 'DIRECTEXPANSIONTUBEINTUBE', INDETERMINATE) -directexpansionbrazedplate = express_getattr(IfcEvaporatorTypeEnum, 'DIRECTEXPANSIONBRAZEDPLATE', INDETERMINATE) -floodedshellandtube = express_getattr(IfcEvaporatorTypeEnum, 'FLOODEDSHELLANDTUBE', INDETERMINATE) -shellandcoil = express_getattr(IfcEvaporatorTypeEnum, 'SHELLANDCOIL', INDETERMINATE) -userdefined = express_getattr(IfcEvaporatorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcEvaporatorTypeEnum, 'NOTDEFINED', INDETERMINATE) +directexpansion = IfcEvaporatorTypeEnum.DIRECTEXPANSION +directexpansionshellandtube = IfcEvaporatorTypeEnum.DIRECTEXPANSIONSHELLANDTUBE +directexpansiontubeintube = IfcEvaporatorTypeEnum.DIRECTEXPANSIONTUBEINTUBE +directexpansionbrazedplate = IfcEvaporatorTypeEnum.DIRECTEXPANSIONBRAZEDPLATE +floodedshellandtube = IfcEvaporatorTypeEnum.FLOODEDSHELLANDTUBE +shellandcoil = IfcEvaporatorTypeEnum.SHELLANDCOIL +userdefined = IfcEvaporatorTypeEnum.USERDEFINED +notdefined = IfcEvaporatorTypeEnum.NOTDEFINED IfcEventTriggerTypeEnum = enum_namespace() -eventrule = express_getattr(IfcEventTriggerTypeEnum, 'EVENTRULE', INDETERMINATE) -eventmessage = express_getattr(IfcEventTriggerTypeEnum, 'EVENTMESSAGE', INDETERMINATE) -eventtime = express_getattr(IfcEventTriggerTypeEnum, 'EVENTTIME', INDETERMINATE) -eventcomplex = express_getattr(IfcEventTriggerTypeEnum, 'EVENTCOMPLEX', INDETERMINATE) -userdefined = express_getattr(IfcEventTriggerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcEventTriggerTypeEnum, 'NOTDEFINED', INDETERMINATE) +eventrule = IfcEventTriggerTypeEnum.EVENTRULE +eventmessage = IfcEventTriggerTypeEnum.EVENTMESSAGE +eventtime = IfcEventTriggerTypeEnum.EVENTTIME +eventcomplex = IfcEventTriggerTypeEnum.EVENTCOMPLEX +userdefined = IfcEventTriggerTypeEnum.USERDEFINED +notdefined = IfcEventTriggerTypeEnum.NOTDEFINED IfcEventTypeEnum = enum_namespace() -startevent = express_getattr(IfcEventTypeEnum, 'STARTEVENT', INDETERMINATE) -endevent = express_getattr(IfcEventTypeEnum, 'ENDEVENT', INDETERMINATE) -intermediateevent = express_getattr(IfcEventTypeEnum, 'INTERMEDIATEEVENT', INDETERMINATE) -userdefined = express_getattr(IfcEventTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcEventTypeEnum, 'NOTDEFINED', INDETERMINATE) +startevent = IfcEventTypeEnum.STARTEVENT +endevent = IfcEventTypeEnum.ENDEVENT +intermediateevent = IfcEventTypeEnum.INTERMEDIATEEVENT +userdefined = IfcEventTypeEnum.USERDEFINED +notdefined = IfcEventTypeEnum.NOTDEFINED IfcExternalSpatialElementTypeEnum = enum_namespace() -external = express_getattr(IfcExternalSpatialElementTypeEnum, 'EXTERNAL', INDETERMINATE) -external_earth = express_getattr(IfcExternalSpatialElementTypeEnum, 'EXTERNAL_EARTH', INDETERMINATE) -external_water = express_getattr(IfcExternalSpatialElementTypeEnum, 'EXTERNAL_WATER', INDETERMINATE) -external_fire = express_getattr(IfcExternalSpatialElementTypeEnum, 'EXTERNAL_FIRE', INDETERMINATE) -userdefined = express_getattr(IfcExternalSpatialElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcExternalSpatialElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +external = IfcExternalSpatialElementTypeEnum.EXTERNAL +external_earth = IfcExternalSpatialElementTypeEnum.EXTERNAL_EARTH +external_water = IfcExternalSpatialElementTypeEnum.EXTERNAL_WATER +external_fire = IfcExternalSpatialElementTypeEnum.EXTERNAL_FIRE +userdefined = IfcExternalSpatialElementTypeEnum.USERDEFINED +notdefined = IfcExternalSpatialElementTypeEnum.NOTDEFINED IfcFanTypeEnum = enum_namespace() -centrifugalforwardcurved = express_getattr(IfcFanTypeEnum, 'CENTRIFUGALFORWARDCURVED', INDETERMINATE) -centrifugalradial = express_getattr(IfcFanTypeEnum, 'CENTRIFUGALRADIAL', INDETERMINATE) -centrifugalbackwardinclinedcurved = express_getattr(IfcFanTypeEnum, 'CENTRIFUGALBACKWARDINCLINEDCURVED', INDETERMINATE) -centrifugalairfoil = express_getattr(IfcFanTypeEnum, 'CENTRIFUGALAIRFOIL', INDETERMINATE) -tubeaxial = express_getattr(IfcFanTypeEnum, 'TUBEAXIAL', INDETERMINATE) -vaneaxial = express_getattr(IfcFanTypeEnum, 'VANEAXIAL', INDETERMINATE) -propelloraxial = express_getattr(IfcFanTypeEnum, 'PROPELLORAXIAL', INDETERMINATE) -userdefined = express_getattr(IfcFanTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFanTypeEnum, 'NOTDEFINED', INDETERMINATE) +centrifugalforwardcurved = IfcFanTypeEnum.CENTRIFUGALFORWARDCURVED +centrifugalradial = IfcFanTypeEnum.CENTRIFUGALRADIAL +centrifugalbackwardinclinedcurved = IfcFanTypeEnum.CENTRIFUGALBACKWARDINCLINEDCURVED +centrifugalairfoil = IfcFanTypeEnum.CENTRIFUGALAIRFOIL +tubeaxial = IfcFanTypeEnum.TUBEAXIAL +vaneaxial = IfcFanTypeEnum.VANEAXIAL +propelloraxial = IfcFanTypeEnum.PROPELLORAXIAL +userdefined = IfcFanTypeEnum.USERDEFINED +notdefined = IfcFanTypeEnum.NOTDEFINED IfcFastenerTypeEnum = enum_namespace() -glue = express_getattr(IfcFastenerTypeEnum, 'GLUE', INDETERMINATE) -mortar = express_getattr(IfcFastenerTypeEnum, 'MORTAR', INDETERMINATE) -weld = express_getattr(IfcFastenerTypeEnum, 'WELD', INDETERMINATE) -userdefined = express_getattr(IfcFastenerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFastenerTypeEnum, 'NOTDEFINED', INDETERMINATE) +glue = IfcFastenerTypeEnum.GLUE +mortar = IfcFastenerTypeEnum.MORTAR +weld = IfcFastenerTypeEnum.WELD +userdefined = IfcFastenerTypeEnum.USERDEFINED +notdefined = IfcFastenerTypeEnum.NOTDEFINED IfcFilterTypeEnum = enum_namespace() -airparticlefilter = express_getattr(IfcFilterTypeEnum, 'AIRPARTICLEFILTER', INDETERMINATE) -compressedairfilter = express_getattr(IfcFilterTypeEnum, 'COMPRESSEDAIRFILTER', INDETERMINATE) -odorfilter = express_getattr(IfcFilterTypeEnum, 'ODORFILTER', INDETERMINATE) -oilfilter = express_getattr(IfcFilterTypeEnum, 'OILFILTER', INDETERMINATE) -strainer = express_getattr(IfcFilterTypeEnum, 'STRAINER', INDETERMINATE) -waterfilter = express_getattr(IfcFilterTypeEnum, 'WATERFILTER', INDETERMINATE) -userdefined = express_getattr(IfcFilterTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFilterTypeEnum, 'NOTDEFINED', INDETERMINATE) +airparticlefilter = IfcFilterTypeEnum.AIRPARTICLEFILTER +compressedairfilter = IfcFilterTypeEnum.COMPRESSEDAIRFILTER +odorfilter = IfcFilterTypeEnum.ODORFILTER +oilfilter = IfcFilterTypeEnum.OILFILTER +strainer = IfcFilterTypeEnum.STRAINER +waterfilter = IfcFilterTypeEnum.WATERFILTER +userdefined = IfcFilterTypeEnum.USERDEFINED +notdefined = IfcFilterTypeEnum.NOTDEFINED IfcFireSuppressionTerminalTypeEnum = enum_namespace() -breechinginlet = express_getattr(IfcFireSuppressionTerminalTypeEnum, 'BREECHINGINLET', INDETERMINATE) -firehydrant = express_getattr(IfcFireSuppressionTerminalTypeEnum, 'FIREHYDRANT', INDETERMINATE) -hosereel = express_getattr(IfcFireSuppressionTerminalTypeEnum, 'HOSEREEL', INDETERMINATE) -sprinkler = express_getattr(IfcFireSuppressionTerminalTypeEnum, 'SPRINKLER', INDETERMINATE) -sprinklerdeflector = express_getattr(IfcFireSuppressionTerminalTypeEnum, 'SPRINKLERDEFLECTOR', INDETERMINATE) -userdefined = express_getattr(IfcFireSuppressionTerminalTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFireSuppressionTerminalTypeEnum, 'NOTDEFINED', INDETERMINATE) +breechinginlet = IfcFireSuppressionTerminalTypeEnum.BREECHINGINLET +firehydrant = IfcFireSuppressionTerminalTypeEnum.FIREHYDRANT +hosereel = IfcFireSuppressionTerminalTypeEnum.HOSEREEL +sprinkler = IfcFireSuppressionTerminalTypeEnum.SPRINKLER +sprinklerdeflector = IfcFireSuppressionTerminalTypeEnum.SPRINKLERDEFLECTOR +userdefined = IfcFireSuppressionTerminalTypeEnum.USERDEFINED +notdefined = IfcFireSuppressionTerminalTypeEnum.NOTDEFINED IfcFlowDirectionEnum = enum_namespace() -source = express_getattr(IfcFlowDirectionEnum, 'SOURCE', INDETERMINATE) -sink = express_getattr(IfcFlowDirectionEnum, 'SINK', INDETERMINATE) -sourceandsink = express_getattr(IfcFlowDirectionEnum, 'SOURCEANDSINK', INDETERMINATE) -notdefined = express_getattr(IfcFlowDirectionEnum, 'NOTDEFINED', INDETERMINATE) +source = IfcFlowDirectionEnum.SOURCE +sink = IfcFlowDirectionEnum.SINK +sourceandsink = IfcFlowDirectionEnum.SOURCEANDSINK +notdefined = IfcFlowDirectionEnum.NOTDEFINED IfcFlowInstrumentTypeEnum = enum_namespace() -pressuregauge = express_getattr(IfcFlowInstrumentTypeEnum, 'PRESSUREGAUGE', INDETERMINATE) -thermometer = express_getattr(IfcFlowInstrumentTypeEnum, 'THERMOMETER', INDETERMINATE) -ammeter = express_getattr(IfcFlowInstrumentTypeEnum, 'AMMETER', INDETERMINATE) -frequencymeter = express_getattr(IfcFlowInstrumentTypeEnum, 'FREQUENCYMETER', INDETERMINATE) -powerfactormeter = express_getattr(IfcFlowInstrumentTypeEnum, 'POWERFACTORMETER', INDETERMINATE) -phaseanglemeter = express_getattr(IfcFlowInstrumentTypeEnum, 'PHASEANGLEMETER', INDETERMINATE) -voltmeter_peak = express_getattr(IfcFlowInstrumentTypeEnum, 'VOLTMETER_PEAK', INDETERMINATE) -voltmeter_rms = express_getattr(IfcFlowInstrumentTypeEnum, 'VOLTMETER_RMS', INDETERMINATE) -userdefined = express_getattr(IfcFlowInstrumentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFlowInstrumentTypeEnum, 'NOTDEFINED', INDETERMINATE) +pressuregauge = IfcFlowInstrumentTypeEnum.PRESSUREGAUGE +thermometer = IfcFlowInstrumentTypeEnum.THERMOMETER +ammeter = IfcFlowInstrumentTypeEnum.AMMETER +frequencymeter = IfcFlowInstrumentTypeEnum.FREQUENCYMETER +powerfactormeter = IfcFlowInstrumentTypeEnum.POWERFACTORMETER +phaseanglemeter = IfcFlowInstrumentTypeEnum.PHASEANGLEMETER +voltmeter_peak = IfcFlowInstrumentTypeEnum.VOLTMETER_PEAK +voltmeter_rms = IfcFlowInstrumentTypeEnum.VOLTMETER_RMS +userdefined = IfcFlowInstrumentTypeEnum.USERDEFINED +notdefined = IfcFlowInstrumentTypeEnum.NOTDEFINED IfcFlowMeterTypeEnum = enum_namespace() -energymeter = express_getattr(IfcFlowMeterTypeEnum, 'ENERGYMETER', INDETERMINATE) -gasmeter = express_getattr(IfcFlowMeterTypeEnum, 'GASMETER', INDETERMINATE) -oilmeter = express_getattr(IfcFlowMeterTypeEnum, 'OILMETER', INDETERMINATE) -watermeter = express_getattr(IfcFlowMeterTypeEnum, 'WATERMETER', INDETERMINATE) -userdefined = express_getattr(IfcFlowMeterTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFlowMeterTypeEnum, 'NOTDEFINED', INDETERMINATE) +energymeter = IfcFlowMeterTypeEnum.ENERGYMETER +gasmeter = IfcFlowMeterTypeEnum.GASMETER +oilmeter = IfcFlowMeterTypeEnum.OILMETER +watermeter = IfcFlowMeterTypeEnum.WATERMETER +userdefined = IfcFlowMeterTypeEnum.USERDEFINED +notdefined = IfcFlowMeterTypeEnum.NOTDEFINED IfcFootingTypeEnum = enum_namespace() -caisson_foundation = express_getattr(IfcFootingTypeEnum, 'CAISSON_FOUNDATION', INDETERMINATE) -footing_beam = express_getattr(IfcFootingTypeEnum, 'FOOTING_BEAM', INDETERMINATE) -pad_footing = express_getattr(IfcFootingTypeEnum, 'PAD_FOOTING', INDETERMINATE) -pile_cap = express_getattr(IfcFootingTypeEnum, 'PILE_CAP', INDETERMINATE) -strip_footing = express_getattr(IfcFootingTypeEnum, 'STRIP_FOOTING', INDETERMINATE) -userdefined = express_getattr(IfcFootingTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFootingTypeEnum, 'NOTDEFINED', INDETERMINATE) +caisson_foundation = IfcFootingTypeEnum.CAISSON_FOUNDATION +footing_beam = IfcFootingTypeEnum.FOOTING_BEAM +pad_footing = IfcFootingTypeEnum.PAD_FOOTING +pile_cap = IfcFootingTypeEnum.PILE_CAP +strip_footing = IfcFootingTypeEnum.STRIP_FOOTING +userdefined = IfcFootingTypeEnum.USERDEFINED +notdefined = IfcFootingTypeEnum.NOTDEFINED IfcFurnitureTypeEnum = enum_namespace() -chair = express_getattr(IfcFurnitureTypeEnum, 'CHAIR', INDETERMINATE) -table = express_getattr(IfcFurnitureTypeEnum, 'TABLE', INDETERMINATE) -desk = express_getattr(IfcFurnitureTypeEnum, 'DESK', INDETERMINATE) -bed = express_getattr(IfcFurnitureTypeEnum, 'BED', INDETERMINATE) -filecabinet = express_getattr(IfcFurnitureTypeEnum, 'FILECABINET', INDETERMINATE) -shelf = express_getattr(IfcFurnitureTypeEnum, 'SHELF', INDETERMINATE) -sofa = express_getattr(IfcFurnitureTypeEnum, 'SOFA', INDETERMINATE) -userdefined = express_getattr(IfcFurnitureTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFurnitureTypeEnum, 'NOTDEFINED', INDETERMINATE) +chair = IfcFurnitureTypeEnum.CHAIR +table = IfcFurnitureTypeEnum.TABLE +desk = IfcFurnitureTypeEnum.DESK +bed = IfcFurnitureTypeEnum.BED +filecabinet = IfcFurnitureTypeEnum.FILECABINET +shelf = IfcFurnitureTypeEnum.SHELF +sofa = IfcFurnitureTypeEnum.SOFA +userdefined = IfcFurnitureTypeEnum.USERDEFINED +notdefined = IfcFurnitureTypeEnum.NOTDEFINED IfcGeographicElementTypeEnum = enum_namespace() -terrain = express_getattr(IfcGeographicElementTypeEnum, 'TERRAIN', INDETERMINATE) -userdefined = express_getattr(IfcGeographicElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcGeographicElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +terrain = IfcGeographicElementTypeEnum.TERRAIN +userdefined = IfcGeographicElementTypeEnum.USERDEFINED +notdefined = IfcGeographicElementTypeEnum.NOTDEFINED IfcGeometricProjectionEnum = enum_namespace() -graph_view = express_getattr(IfcGeometricProjectionEnum, 'GRAPH_VIEW', INDETERMINATE) -sketch_view = express_getattr(IfcGeometricProjectionEnum, 'SKETCH_VIEW', INDETERMINATE) -model_view = express_getattr(IfcGeometricProjectionEnum, 'MODEL_VIEW', INDETERMINATE) -plan_view = express_getattr(IfcGeometricProjectionEnum, 'PLAN_VIEW', INDETERMINATE) -reflected_plan_view = express_getattr(IfcGeometricProjectionEnum, 'REFLECTED_PLAN_VIEW', INDETERMINATE) -section_view = express_getattr(IfcGeometricProjectionEnum, 'SECTION_VIEW', INDETERMINATE) -elevation_view = express_getattr(IfcGeometricProjectionEnum, 'ELEVATION_VIEW', INDETERMINATE) -userdefined = express_getattr(IfcGeometricProjectionEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcGeometricProjectionEnum, 'NOTDEFINED', INDETERMINATE) +graph_view = IfcGeometricProjectionEnum.GRAPH_VIEW +sketch_view = IfcGeometricProjectionEnum.SKETCH_VIEW +model_view = IfcGeometricProjectionEnum.MODEL_VIEW +plan_view = IfcGeometricProjectionEnum.PLAN_VIEW +reflected_plan_view = IfcGeometricProjectionEnum.REFLECTED_PLAN_VIEW +section_view = IfcGeometricProjectionEnum.SECTION_VIEW +elevation_view = IfcGeometricProjectionEnum.ELEVATION_VIEW +userdefined = IfcGeometricProjectionEnum.USERDEFINED +notdefined = IfcGeometricProjectionEnum.NOTDEFINED IfcGlobalOrLocalEnum = enum_namespace() -global_coords = express_getattr(IfcGlobalOrLocalEnum, 'GLOBAL_COORDS', INDETERMINATE) -local_coords = express_getattr(IfcGlobalOrLocalEnum, 'LOCAL_COORDS', INDETERMINATE) +global_coords = IfcGlobalOrLocalEnum.GLOBAL_COORDS +local_coords = IfcGlobalOrLocalEnum.LOCAL_COORDS IfcGridTypeEnum = enum_namespace() -rectangular = express_getattr(IfcGridTypeEnum, 'RECTANGULAR', INDETERMINATE) -radial = express_getattr(IfcGridTypeEnum, 'RADIAL', INDETERMINATE) -triangular = express_getattr(IfcGridTypeEnum, 'TRIANGULAR', INDETERMINATE) -irregular = express_getattr(IfcGridTypeEnum, 'IRREGULAR', INDETERMINATE) -userdefined = express_getattr(IfcGridTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcGridTypeEnum, 'NOTDEFINED', INDETERMINATE) +rectangular = IfcGridTypeEnum.RECTANGULAR +radial = IfcGridTypeEnum.RADIAL +triangular = IfcGridTypeEnum.TRIANGULAR +irregular = IfcGridTypeEnum.IRREGULAR +userdefined = IfcGridTypeEnum.USERDEFINED +notdefined = IfcGridTypeEnum.NOTDEFINED IfcHeatExchangerTypeEnum = enum_namespace() -plate = express_getattr(IfcHeatExchangerTypeEnum, 'PLATE', INDETERMINATE) -shellandtube = express_getattr(IfcHeatExchangerTypeEnum, 'SHELLANDTUBE', INDETERMINATE) -userdefined = express_getattr(IfcHeatExchangerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcHeatExchangerTypeEnum, 'NOTDEFINED', INDETERMINATE) +plate = IfcHeatExchangerTypeEnum.PLATE +shellandtube = IfcHeatExchangerTypeEnum.SHELLANDTUBE +userdefined = IfcHeatExchangerTypeEnum.USERDEFINED +notdefined = IfcHeatExchangerTypeEnum.NOTDEFINED IfcHumidifierTypeEnum = enum_namespace() -steaminjection = express_getattr(IfcHumidifierTypeEnum, 'STEAMINJECTION', INDETERMINATE) -adiabaticairwasher = express_getattr(IfcHumidifierTypeEnum, 'ADIABATICAIRWASHER', INDETERMINATE) -adiabaticpan = express_getattr(IfcHumidifierTypeEnum, 'ADIABATICPAN', INDETERMINATE) -adiabaticwettedelement = express_getattr(IfcHumidifierTypeEnum, 'ADIABATICWETTEDELEMENT', INDETERMINATE) -adiabaticatomizing = express_getattr(IfcHumidifierTypeEnum, 'ADIABATICATOMIZING', INDETERMINATE) -adiabaticultrasonic = express_getattr(IfcHumidifierTypeEnum, 'ADIABATICULTRASONIC', INDETERMINATE) -adiabaticrigidmedia = express_getattr(IfcHumidifierTypeEnum, 'ADIABATICRIGIDMEDIA', INDETERMINATE) -adiabaticcompressedairnozzle = express_getattr(IfcHumidifierTypeEnum, 'ADIABATICCOMPRESSEDAIRNOZZLE', INDETERMINATE) -assistedelectric = express_getattr(IfcHumidifierTypeEnum, 'ASSISTEDELECTRIC', INDETERMINATE) -assistednaturalgas = express_getattr(IfcHumidifierTypeEnum, 'ASSISTEDNATURALGAS', INDETERMINATE) -assistedpropane = express_getattr(IfcHumidifierTypeEnum, 'ASSISTEDPROPANE', INDETERMINATE) -assistedbutane = express_getattr(IfcHumidifierTypeEnum, 'ASSISTEDBUTANE', INDETERMINATE) -assistedsteam = express_getattr(IfcHumidifierTypeEnum, 'ASSISTEDSTEAM', INDETERMINATE) -userdefined = express_getattr(IfcHumidifierTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcHumidifierTypeEnum, 'NOTDEFINED', INDETERMINATE) +steaminjection = IfcHumidifierTypeEnum.STEAMINJECTION +adiabaticairwasher = IfcHumidifierTypeEnum.ADIABATICAIRWASHER +adiabaticpan = IfcHumidifierTypeEnum.ADIABATICPAN +adiabaticwettedelement = IfcHumidifierTypeEnum.ADIABATICWETTEDELEMENT +adiabaticatomizing = IfcHumidifierTypeEnum.ADIABATICATOMIZING +adiabaticultrasonic = IfcHumidifierTypeEnum.ADIABATICULTRASONIC +adiabaticrigidmedia = IfcHumidifierTypeEnum.ADIABATICRIGIDMEDIA +adiabaticcompressedairnozzle = IfcHumidifierTypeEnum.ADIABATICCOMPRESSEDAIRNOZZLE +assistedelectric = IfcHumidifierTypeEnum.ASSISTEDELECTRIC +assistednaturalgas = IfcHumidifierTypeEnum.ASSISTEDNATURALGAS +assistedpropane = IfcHumidifierTypeEnum.ASSISTEDPROPANE +assistedbutane = IfcHumidifierTypeEnum.ASSISTEDBUTANE +assistedsteam = IfcHumidifierTypeEnum.ASSISTEDSTEAM +userdefined = IfcHumidifierTypeEnum.USERDEFINED +notdefined = IfcHumidifierTypeEnum.NOTDEFINED IfcInterceptorTypeEnum = enum_namespace() -cyclonic = express_getattr(IfcInterceptorTypeEnum, 'CYCLONIC', INDETERMINATE) -grease = express_getattr(IfcInterceptorTypeEnum, 'GREASE', INDETERMINATE) -oil = express_getattr(IfcInterceptorTypeEnum, 'OIL', INDETERMINATE) -petrol = express_getattr(IfcInterceptorTypeEnum, 'PETROL', INDETERMINATE) -userdefined = express_getattr(IfcInterceptorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcInterceptorTypeEnum, 'NOTDEFINED', INDETERMINATE) +cyclonic = IfcInterceptorTypeEnum.CYCLONIC +grease = IfcInterceptorTypeEnum.GREASE +oil = IfcInterceptorTypeEnum.OIL +petrol = IfcInterceptorTypeEnum.PETROL +userdefined = IfcInterceptorTypeEnum.USERDEFINED +notdefined = IfcInterceptorTypeEnum.NOTDEFINED IfcInternalOrExternalEnum = enum_namespace() -internal = express_getattr(IfcInternalOrExternalEnum, 'INTERNAL', INDETERMINATE) -external = express_getattr(IfcInternalOrExternalEnum, 'EXTERNAL', INDETERMINATE) -external_earth = express_getattr(IfcInternalOrExternalEnum, 'EXTERNAL_EARTH', INDETERMINATE) -external_water = express_getattr(IfcInternalOrExternalEnum, 'EXTERNAL_WATER', INDETERMINATE) -external_fire = express_getattr(IfcInternalOrExternalEnum, 'EXTERNAL_FIRE', INDETERMINATE) -notdefined = express_getattr(IfcInternalOrExternalEnum, 'NOTDEFINED', INDETERMINATE) +internal = IfcInternalOrExternalEnum.INTERNAL +external = IfcInternalOrExternalEnum.EXTERNAL +external_earth = IfcInternalOrExternalEnum.EXTERNAL_EARTH +external_water = IfcInternalOrExternalEnum.EXTERNAL_WATER +external_fire = IfcInternalOrExternalEnum.EXTERNAL_FIRE +notdefined = IfcInternalOrExternalEnum.NOTDEFINED IfcInventoryTypeEnum = enum_namespace() -assetinventory = express_getattr(IfcInventoryTypeEnum, 'ASSETINVENTORY', INDETERMINATE) -spaceinventory = express_getattr(IfcInventoryTypeEnum, 'SPACEINVENTORY', INDETERMINATE) -furnitureinventory = express_getattr(IfcInventoryTypeEnum, 'FURNITUREINVENTORY', INDETERMINATE) -userdefined = express_getattr(IfcInventoryTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcInventoryTypeEnum, 'NOTDEFINED', INDETERMINATE) +assetinventory = IfcInventoryTypeEnum.ASSETINVENTORY +spaceinventory = IfcInventoryTypeEnum.SPACEINVENTORY +furnitureinventory = IfcInventoryTypeEnum.FURNITUREINVENTORY +userdefined = IfcInventoryTypeEnum.USERDEFINED +notdefined = IfcInventoryTypeEnum.NOTDEFINED IfcJunctionBoxTypeEnum = enum_namespace() -data = express_getattr(IfcJunctionBoxTypeEnum, 'DATA', INDETERMINATE) -power = express_getattr(IfcJunctionBoxTypeEnum, 'POWER', INDETERMINATE) -userdefined = express_getattr(IfcJunctionBoxTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcJunctionBoxTypeEnum, 'NOTDEFINED', INDETERMINATE) +data = IfcJunctionBoxTypeEnum.DATA +power = IfcJunctionBoxTypeEnum.POWER +userdefined = IfcJunctionBoxTypeEnum.USERDEFINED +notdefined = IfcJunctionBoxTypeEnum.NOTDEFINED IfcKnotType = enum_namespace() -uniform_knots = express_getattr(IfcKnotType, 'UNIFORM_KNOTS', INDETERMINATE) -quasi_uniform_knots = express_getattr(IfcKnotType, 'QUASI_UNIFORM_KNOTS', INDETERMINATE) -piecewise_bezier_knots = express_getattr(IfcKnotType, 'PIECEWISE_BEZIER_KNOTS', INDETERMINATE) -unspecified = express_getattr(IfcKnotType, 'UNSPECIFIED', INDETERMINATE) +uniform_knots = IfcKnotType.UNIFORM_KNOTS +quasi_uniform_knots = IfcKnotType.QUASI_UNIFORM_KNOTS +piecewise_bezier_knots = IfcKnotType.PIECEWISE_BEZIER_KNOTS +unspecified = IfcKnotType.UNSPECIFIED IfcLaborResourceTypeEnum = enum_namespace() -administration = express_getattr(IfcLaborResourceTypeEnum, 'ADMINISTRATION', INDETERMINATE) -carpentry = express_getattr(IfcLaborResourceTypeEnum, 'CARPENTRY', INDETERMINATE) -cleaning = express_getattr(IfcLaborResourceTypeEnum, 'CLEANING', INDETERMINATE) -concrete = express_getattr(IfcLaborResourceTypeEnum, 'CONCRETE', INDETERMINATE) -drywall = express_getattr(IfcLaborResourceTypeEnum, 'DRYWALL', INDETERMINATE) -electric = express_getattr(IfcLaborResourceTypeEnum, 'ELECTRIC', INDETERMINATE) -finishing = express_getattr(IfcLaborResourceTypeEnum, 'FINISHING', INDETERMINATE) -flooring = express_getattr(IfcLaborResourceTypeEnum, 'FLOORING', INDETERMINATE) -general = express_getattr(IfcLaborResourceTypeEnum, 'GENERAL', INDETERMINATE) -hvac = express_getattr(IfcLaborResourceTypeEnum, 'HVAC', INDETERMINATE) -landscaping = express_getattr(IfcLaborResourceTypeEnum, 'LANDSCAPING', INDETERMINATE) -masonry = express_getattr(IfcLaborResourceTypeEnum, 'MASONRY', INDETERMINATE) -painting = express_getattr(IfcLaborResourceTypeEnum, 'PAINTING', INDETERMINATE) -paving = express_getattr(IfcLaborResourceTypeEnum, 'PAVING', INDETERMINATE) -plumbing = express_getattr(IfcLaborResourceTypeEnum, 'PLUMBING', INDETERMINATE) -roofing = express_getattr(IfcLaborResourceTypeEnum, 'ROOFING', INDETERMINATE) -sitegrading = express_getattr(IfcLaborResourceTypeEnum, 'SITEGRADING', INDETERMINATE) -steelwork = express_getattr(IfcLaborResourceTypeEnum, 'STEELWORK', INDETERMINATE) -surveying = express_getattr(IfcLaborResourceTypeEnum, 'SURVEYING', INDETERMINATE) -userdefined = express_getattr(IfcLaborResourceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcLaborResourceTypeEnum, 'NOTDEFINED', INDETERMINATE) +administration = IfcLaborResourceTypeEnum.ADMINISTRATION +carpentry = IfcLaborResourceTypeEnum.CARPENTRY +cleaning = IfcLaborResourceTypeEnum.CLEANING +concrete = IfcLaborResourceTypeEnum.CONCRETE +drywall = IfcLaborResourceTypeEnum.DRYWALL +electric = IfcLaborResourceTypeEnum.ELECTRIC +finishing = IfcLaborResourceTypeEnum.FINISHING +flooring = IfcLaborResourceTypeEnum.FLOORING +general = IfcLaborResourceTypeEnum.GENERAL +hvac = IfcLaborResourceTypeEnum.HVAC +landscaping = IfcLaborResourceTypeEnum.LANDSCAPING +masonry = IfcLaborResourceTypeEnum.MASONRY +painting = IfcLaborResourceTypeEnum.PAINTING +paving = IfcLaborResourceTypeEnum.PAVING +plumbing = IfcLaborResourceTypeEnum.PLUMBING +roofing = IfcLaborResourceTypeEnum.ROOFING +sitegrading = IfcLaborResourceTypeEnum.SITEGRADING +steelwork = IfcLaborResourceTypeEnum.STEELWORK +surveying = IfcLaborResourceTypeEnum.SURVEYING +userdefined = IfcLaborResourceTypeEnum.USERDEFINED +notdefined = IfcLaborResourceTypeEnum.NOTDEFINED IfcLampTypeEnum = enum_namespace() -compactfluorescent = express_getattr(IfcLampTypeEnum, 'COMPACTFLUORESCENT', INDETERMINATE) -fluorescent = express_getattr(IfcLampTypeEnum, 'FLUORESCENT', INDETERMINATE) -halogen = express_getattr(IfcLampTypeEnum, 'HALOGEN', INDETERMINATE) -highpressuremercury = express_getattr(IfcLampTypeEnum, 'HIGHPRESSUREMERCURY', INDETERMINATE) -highpressuresodium = express_getattr(IfcLampTypeEnum, 'HIGHPRESSURESODIUM', INDETERMINATE) -led = express_getattr(IfcLampTypeEnum, 'LED', INDETERMINATE) -metalhalide = express_getattr(IfcLampTypeEnum, 'METALHALIDE', INDETERMINATE) -oled = express_getattr(IfcLampTypeEnum, 'OLED', INDETERMINATE) -tungstenfilament = express_getattr(IfcLampTypeEnum, 'TUNGSTENFILAMENT', INDETERMINATE) -userdefined = express_getattr(IfcLampTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcLampTypeEnum, 'NOTDEFINED', INDETERMINATE) +compactfluorescent = IfcLampTypeEnum.COMPACTFLUORESCENT +fluorescent = IfcLampTypeEnum.FLUORESCENT +halogen = IfcLampTypeEnum.HALOGEN +highpressuremercury = IfcLampTypeEnum.HIGHPRESSUREMERCURY +highpressuresodium = IfcLampTypeEnum.HIGHPRESSURESODIUM +led = IfcLampTypeEnum.LED +metalhalide = IfcLampTypeEnum.METALHALIDE +oled = IfcLampTypeEnum.OLED +tungstenfilament = IfcLampTypeEnum.TUNGSTENFILAMENT +userdefined = IfcLampTypeEnum.USERDEFINED +notdefined = IfcLampTypeEnum.NOTDEFINED IfcLayerSetDirectionEnum = enum_namespace() -axis1 = express_getattr(IfcLayerSetDirectionEnum, 'AXIS1', INDETERMINATE) -axis2 = express_getattr(IfcLayerSetDirectionEnum, 'AXIS2', INDETERMINATE) -axis3 = express_getattr(IfcLayerSetDirectionEnum, 'AXIS3', INDETERMINATE) +axis1 = IfcLayerSetDirectionEnum.AXIS1 +axis2 = IfcLayerSetDirectionEnum.AXIS2 +axis3 = IfcLayerSetDirectionEnum.AXIS3 IfcLightDistributionCurveEnum = enum_namespace() -type_a = express_getattr(IfcLightDistributionCurveEnum, 'TYPE_A', INDETERMINATE) -type_b = express_getattr(IfcLightDistributionCurveEnum, 'TYPE_B', INDETERMINATE) -type_c = express_getattr(IfcLightDistributionCurveEnum, 'TYPE_C', INDETERMINATE) -notdefined = express_getattr(IfcLightDistributionCurveEnum, 'NOTDEFINED', INDETERMINATE) +type_a = IfcLightDistributionCurveEnum.TYPE_A +type_b = IfcLightDistributionCurveEnum.TYPE_B +type_c = IfcLightDistributionCurveEnum.TYPE_C +notdefined = IfcLightDistributionCurveEnum.NOTDEFINED IfcLightEmissionSourceEnum = enum_namespace() -compactfluorescent = express_getattr(IfcLightEmissionSourceEnum, 'COMPACTFLUORESCENT', INDETERMINATE) -fluorescent = express_getattr(IfcLightEmissionSourceEnum, 'FLUORESCENT', INDETERMINATE) -highpressuremercury = express_getattr(IfcLightEmissionSourceEnum, 'HIGHPRESSUREMERCURY', INDETERMINATE) -highpressuresodium = express_getattr(IfcLightEmissionSourceEnum, 'HIGHPRESSURESODIUM', INDETERMINATE) -lightemittingdiode = express_getattr(IfcLightEmissionSourceEnum, 'LIGHTEMITTINGDIODE', INDETERMINATE) -lowpressuresodium = express_getattr(IfcLightEmissionSourceEnum, 'LOWPRESSURESODIUM', INDETERMINATE) -lowvoltagehalogen = express_getattr(IfcLightEmissionSourceEnum, 'LOWVOLTAGEHALOGEN', INDETERMINATE) -mainvoltagehalogen = express_getattr(IfcLightEmissionSourceEnum, 'MAINVOLTAGEHALOGEN', INDETERMINATE) -metalhalide = express_getattr(IfcLightEmissionSourceEnum, 'METALHALIDE', INDETERMINATE) -tungstenfilament = express_getattr(IfcLightEmissionSourceEnum, 'TUNGSTENFILAMENT', INDETERMINATE) -notdefined = express_getattr(IfcLightEmissionSourceEnum, 'NOTDEFINED', INDETERMINATE) +compactfluorescent = IfcLightEmissionSourceEnum.COMPACTFLUORESCENT +fluorescent = IfcLightEmissionSourceEnum.FLUORESCENT +highpressuremercury = IfcLightEmissionSourceEnum.HIGHPRESSUREMERCURY +highpressuresodium = IfcLightEmissionSourceEnum.HIGHPRESSURESODIUM +lightemittingdiode = IfcLightEmissionSourceEnum.LIGHTEMITTINGDIODE +lowpressuresodium = IfcLightEmissionSourceEnum.LOWPRESSURESODIUM +lowvoltagehalogen = IfcLightEmissionSourceEnum.LOWVOLTAGEHALOGEN +mainvoltagehalogen = IfcLightEmissionSourceEnum.MAINVOLTAGEHALOGEN +metalhalide = IfcLightEmissionSourceEnum.METALHALIDE +tungstenfilament = IfcLightEmissionSourceEnum.TUNGSTENFILAMENT +notdefined = IfcLightEmissionSourceEnum.NOTDEFINED IfcLightFixtureTypeEnum = enum_namespace() -pointsource = express_getattr(IfcLightFixtureTypeEnum, 'POINTSOURCE', INDETERMINATE) -directionsource = express_getattr(IfcLightFixtureTypeEnum, 'DIRECTIONSOURCE', INDETERMINATE) -securitylighting = express_getattr(IfcLightFixtureTypeEnum, 'SECURITYLIGHTING', INDETERMINATE) -userdefined = express_getattr(IfcLightFixtureTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcLightFixtureTypeEnum, 'NOTDEFINED', INDETERMINATE) +pointsource = IfcLightFixtureTypeEnum.POINTSOURCE +directionsource = IfcLightFixtureTypeEnum.DIRECTIONSOURCE +securitylighting = IfcLightFixtureTypeEnum.SECURITYLIGHTING +userdefined = IfcLightFixtureTypeEnum.USERDEFINED +notdefined = IfcLightFixtureTypeEnum.NOTDEFINED IfcLoadGroupTypeEnum = enum_namespace() -load_group = express_getattr(IfcLoadGroupTypeEnum, 'LOAD_GROUP', INDETERMINATE) -load_case = express_getattr(IfcLoadGroupTypeEnum, 'LOAD_CASE', INDETERMINATE) -load_combination = express_getattr(IfcLoadGroupTypeEnum, 'LOAD_COMBINATION', INDETERMINATE) -userdefined = express_getattr(IfcLoadGroupTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcLoadGroupTypeEnum, 'NOTDEFINED', INDETERMINATE) +load_group = IfcLoadGroupTypeEnum.LOAD_GROUP +load_case = IfcLoadGroupTypeEnum.LOAD_CASE +load_combination = IfcLoadGroupTypeEnum.LOAD_COMBINATION +userdefined = IfcLoadGroupTypeEnum.USERDEFINED +notdefined = IfcLoadGroupTypeEnum.NOTDEFINED IfcLogicalOperatorEnum = enum_namespace() -logicaland = express_getattr(IfcLogicalOperatorEnum, 'LOGICALAND', INDETERMINATE) -logicalor = express_getattr(IfcLogicalOperatorEnum, 'LOGICALOR', INDETERMINATE) -logicalxor = express_getattr(IfcLogicalOperatorEnum, 'LOGICALXOR', INDETERMINATE) -logicalnotand = express_getattr(IfcLogicalOperatorEnum, 'LOGICALNOTAND', INDETERMINATE) -logicalnotor = express_getattr(IfcLogicalOperatorEnum, 'LOGICALNOTOR', INDETERMINATE) +logicaland = IfcLogicalOperatorEnum.LOGICALAND +logicalor = IfcLogicalOperatorEnum.LOGICALOR +logicalxor = IfcLogicalOperatorEnum.LOGICALXOR +logicalnotand = IfcLogicalOperatorEnum.LOGICALNOTAND +logicalnotor = IfcLogicalOperatorEnum.LOGICALNOTOR IfcMechanicalFastenerTypeEnum = enum_namespace() -anchorbolt = express_getattr(IfcMechanicalFastenerTypeEnum, 'ANCHORBOLT', INDETERMINATE) -bolt = express_getattr(IfcMechanicalFastenerTypeEnum, 'BOLT', INDETERMINATE) -dowel = express_getattr(IfcMechanicalFastenerTypeEnum, 'DOWEL', INDETERMINATE) -nail = express_getattr(IfcMechanicalFastenerTypeEnum, 'NAIL', INDETERMINATE) -nailplate = express_getattr(IfcMechanicalFastenerTypeEnum, 'NAILPLATE', INDETERMINATE) -rivet = express_getattr(IfcMechanicalFastenerTypeEnum, 'RIVET', INDETERMINATE) -screw = express_getattr(IfcMechanicalFastenerTypeEnum, 'SCREW', INDETERMINATE) -shearconnector = express_getattr(IfcMechanicalFastenerTypeEnum, 'SHEARCONNECTOR', INDETERMINATE) -staple = express_getattr(IfcMechanicalFastenerTypeEnum, 'STAPLE', INDETERMINATE) -studshearconnector = express_getattr(IfcMechanicalFastenerTypeEnum, 'STUDSHEARCONNECTOR', INDETERMINATE) -userdefined = express_getattr(IfcMechanicalFastenerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcMechanicalFastenerTypeEnum, 'NOTDEFINED', INDETERMINATE) +anchorbolt = IfcMechanicalFastenerTypeEnum.ANCHORBOLT +bolt = IfcMechanicalFastenerTypeEnum.BOLT +dowel = IfcMechanicalFastenerTypeEnum.DOWEL +nail = IfcMechanicalFastenerTypeEnum.NAIL +nailplate = IfcMechanicalFastenerTypeEnum.NAILPLATE +rivet = IfcMechanicalFastenerTypeEnum.RIVET +screw = IfcMechanicalFastenerTypeEnum.SCREW +shearconnector = IfcMechanicalFastenerTypeEnum.SHEARCONNECTOR +staple = IfcMechanicalFastenerTypeEnum.STAPLE +studshearconnector = IfcMechanicalFastenerTypeEnum.STUDSHEARCONNECTOR +userdefined = IfcMechanicalFastenerTypeEnum.USERDEFINED +notdefined = IfcMechanicalFastenerTypeEnum.NOTDEFINED IfcMedicalDeviceTypeEnum = enum_namespace() -airstation = express_getattr(IfcMedicalDeviceTypeEnum, 'AIRSTATION', INDETERMINATE) -feedairunit = express_getattr(IfcMedicalDeviceTypeEnum, 'FEEDAIRUNIT', INDETERMINATE) -oxygengenerator = express_getattr(IfcMedicalDeviceTypeEnum, 'OXYGENGENERATOR', INDETERMINATE) -oxygenplant = express_getattr(IfcMedicalDeviceTypeEnum, 'OXYGENPLANT', INDETERMINATE) -vacuumstation = express_getattr(IfcMedicalDeviceTypeEnum, 'VACUUMSTATION', INDETERMINATE) -userdefined = express_getattr(IfcMedicalDeviceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcMedicalDeviceTypeEnum, 'NOTDEFINED', INDETERMINATE) +airstation = IfcMedicalDeviceTypeEnum.AIRSTATION +feedairunit = IfcMedicalDeviceTypeEnum.FEEDAIRUNIT +oxygengenerator = IfcMedicalDeviceTypeEnum.OXYGENGENERATOR +oxygenplant = IfcMedicalDeviceTypeEnum.OXYGENPLANT +vacuumstation = IfcMedicalDeviceTypeEnum.VACUUMSTATION +userdefined = IfcMedicalDeviceTypeEnum.USERDEFINED +notdefined = IfcMedicalDeviceTypeEnum.NOTDEFINED IfcMemberTypeEnum = enum_namespace() -brace = express_getattr(IfcMemberTypeEnum, 'BRACE', INDETERMINATE) -chord = express_getattr(IfcMemberTypeEnum, 'CHORD', INDETERMINATE) -collar = express_getattr(IfcMemberTypeEnum, 'COLLAR', INDETERMINATE) -member = express_getattr(IfcMemberTypeEnum, 'MEMBER', INDETERMINATE) -mullion = express_getattr(IfcMemberTypeEnum, 'MULLION', INDETERMINATE) -plate = express_getattr(IfcMemberTypeEnum, 'PLATE', INDETERMINATE) -post = express_getattr(IfcMemberTypeEnum, 'POST', INDETERMINATE) -purlin = express_getattr(IfcMemberTypeEnum, 'PURLIN', INDETERMINATE) -rafter = express_getattr(IfcMemberTypeEnum, 'RAFTER', INDETERMINATE) -stringer = express_getattr(IfcMemberTypeEnum, 'STRINGER', INDETERMINATE) -strut = express_getattr(IfcMemberTypeEnum, 'STRUT', INDETERMINATE) -stud = express_getattr(IfcMemberTypeEnum, 'STUD', INDETERMINATE) -userdefined = express_getattr(IfcMemberTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcMemberTypeEnum, 'NOTDEFINED', INDETERMINATE) +brace = IfcMemberTypeEnum.BRACE +chord = IfcMemberTypeEnum.CHORD +collar = IfcMemberTypeEnum.COLLAR +member = IfcMemberTypeEnum.MEMBER +mullion = IfcMemberTypeEnum.MULLION +plate = IfcMemberTypeEnum.PLATE +post = IfcMemberTypeEnum.POST +purlin = IfcMemberTypeEnum.PURLIN +rafter = IfcMemberTypeEnum.RAFTER +stringer = IfcMemberTypeEnum.STRINGER +strut = IfcMemberTypeEnum.STRUT +stud = IfcMemberTypeEnum.STUD +userdefined = IfcMemberTypeEnum.USERDEFINED +notdefined = IfcMemberTypeEnum.NOTDEFINED IfcMotorConnectionTypeEnum = enum_namespace() -beltdrive = express_getattr(IfcMotorConnectionTypeEnum, 'BELTDRIVE', INDETERMINATE) -coupling = express_getattr(IfcMotorConnectionTypeEnum, 'COUPLING', INDETERMINATE) -directdrive = express_getattr(IfcMotorConnectionTypeEnum, 'DIRECTDRIVE', INDETERMINATE) -userdefined = express_getattr(IfcMotorConnectionTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcMotorConnectionTypeEnum, 'NOTDEFINED', INDETERMINATE) +beltdrive = IfcMotorConnectionTypeEnum.BELTDRIVE +coupling = IfcMotorConnectionTypeEnum.COUPLING +directdrive = IfcMotorConnectionTypeEnum.DIRECTDRIVE +userdefined = IfcMotorConnectionTypeEnum.USERDEFINED +notdefined = IfcMotorConnectionTypeEnum.NOTDEFINED IfcNullStyle = enum_namespace() -null = express_getattr(IfcNullStyle, 'NULL', INDETERMINATE) +null = IfcNullStyle.NULL IfcObjectTypeEnum = enum_namespace() -product = express_getattr(IfcObjectTypeEnum, 'PRODUCT', INDETERMINATE) -process = express_getattr(IfcObjectTypeEnum, 'PROCESS', INDETERMINATE) -control = express_getattr(IfcObjectTypeEnum, 'CONTROL', INDETERMINATE) -resource = express_getattr(IfcObjectTypeEnum, 'RESOURCE', INDETERMINATE) -actor = express_getattr(IfcObjectTypeEnum, 'ACTOR', INDETERMINATE) -group = express_getattr(IfcObjectTypeEnum, 'GROUP', INDETERMINATE) -project = express_getattr(IfcObjectTypeEnum, 'PROJECT', INDETERMINATE) -notdefined = express_getattr(IfcObjectTypeEnum, 'NOTDEFINED', INDETERMINATE) +product = IfcObjectTypeEnum.PRODUCT +process = IfcObjectTypeEnum.PROCESS +control = IfcObjectTypeEnum.CONTROL +resource = IfcObjectTypeEnum.RESOURCE +actor = IfcObjectTypeEnum.ACTOR +group = IfcObjectTypeEnum.GROUP +project = IfcObjectTypeEnum.PROJECT +notdefined = IfcObjectTypeEnum.NOTDEFINED IfcObjectiveEnum = enum_namespace() -codecompliance = express_getattr(IfcObjectiveEnum, 'CODECOMPLIANCE', INDETERMINATE) -codewaiver = express_getattr(IfcObjectiveEnum, 'CODEWAIVER', INDETERMINATE) -designintent = express_getattr(IfcObjectiveEnum, 'DESIGNINTENT', INDETERMINATE) -external = express_getattr(IfcObjectiveEnum, 'EXTERNAL', INDETERMINATE) -healthandsafety = express_getattr(IfcObjectiveEnum, 'HEALTHANDSAFETY', INDETERMINATE) -mergeconflict = express_getattr(IfcObjectiveEnum, 'MERGECONFLICT', INDETERMINATE) -modelview = express_getattr(IfcObjectiveEnum, 'MODELVIEW', INDETERMINATE) -parameter = express_getattr(IfcObjectiveEnum, 'PARAMETER', INDETERMINATE) -requirement = express_getattr(IfcObjectiveEnum, 'REQUIREMENT', INDETERMINATE) -specification = express_getattr(IfcObjectiveEnum, 'SPECIFICATION', INDETERMINATE) -triggercondition = express_getattr(IfcObjectiveEnum, 'TRIGGERCONDITION', INDETERMINATE) -userdefined = express_getattr(IfcObjectiveEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcObjectiveEnum, 'NOTDEFINED', INDETERMINATE) +codecompliance = IfcObjectiveEnum.CODECOMPLIANCE +codewaiver = IfcObjectiveEnum.CODEWAIVER +designintent = IfcObjectiveEnum.DESIGNINTENT +external = IfcObjectiveEnum.EXTERNAL +healthandsafety = IfcObjectiveEnum.HEALTHANDSAFETY +mergeconflict = IfcObjectiveEnum.MERGECONFLICT +modelview = IfcObjectiveEnum.MODELVIEW +parameter = IfcObjectiveEnum.PARAMETER +requirement = IfcObjectiveEnum.REQUIREMENT +specification = IfcObjectiveEnum.SPECIFICATION +triggercondition = IfcObjectiveEnum.TRIGGERCONDITION +userdefined = IfcObjectiveEnum.USERDEFINED +notdefined = IfcObjectiveEnum.NOTDEFINED IfcOccupantTypeEnum = enum_namespace() -assignee = express_getattr(IfcOccupantTypeEnum, 'ASSIGNEE', INDETERMINATE) -assignor = express_getattr(IfcOccupantTypeEnum, 'ASSIGNOR', INDETERMINATE) -lessee = express_getattr(IfcOccupantTypeEnum, 'LESSEE', INDETERMINATE) -lessor = express_getattr(IfcOccupantTypeEnum, 'LESSOR', INDETERMINATE) -lettingagent = express_getattr(IfcOccupantTypeEnum, 'LETTINGAGENT', INDETERMINATE) -owner = express_getattr(IfcOccupantTypeEnum, 'OWNER', INDETERMINATE) -tenant = express_getattr(IfcOccupantTypeEnum, 'TENANT', INDETERMINATE) -userdefined = express_getattr(IfcOccupantTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcOccupantTypeEnum, 'NOTDEFINED', INDETERMINATE) +assignee = IfcOccupantTypeEnum.ASSIGNEE +assignor = IfcOccupantTypeEnum.ASSIGNOR +lessee = IfcOccupantTypeEnum.LESSEE +lessor = IfcOccupantTypeEnum.LESSOR +lettingagent = IfcOccupantTypeEnum.LETTINGAGENT +owner = IfcOccupantTypeEnum.OWNER +tenant = IfcOccupantTypeEnum.TENANT +userdefined = IfcOccupantTypeEnum.USERDEFINED +notdefined = IfcOccupantTypeEnum.NOTDEFINED IfcOpeningElementTypeEnum = enum_namespace() -opening = express_getattr(IfcOpeningElementTypeEnum, 'OPENING', INDETERMINATE) -recess = express_getattr(IfcOpeningElementTypeEnum, 'RECESS', INDETERMINATE) -userdefined = express_getattr(IfcOpeningElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcOpeningElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +opening = IfcOpeningElementTypeEnum.OPENING +recess = IfcOpeningElementTypeEnum.RECESS +userdefined = IfcOpeningElementTypeEnum.USERDEFINED +notdefined = IfcOpeningElementTypeEnum.NOTDEFINED IfcOutletTypeEnum = enum_namespace() -audiovisualoutlet = express_getattr(IfcOutletTypeEnum, 'AUDIOVISUALOUTLET', INDETERMINATE) -communicationsoutlet = express_getattr(IfcOutletTypeEnum, 'COMMUNICATIONSOUTLET', INDETERMINATE) -poweroutlet = express_getattr(IfcOutletTypeEnum, 'POWEROUTLET', INDETERMINATE) -dataoutlet = express_getattr(IfcOutletTypeEnum, 'DATAOUTLET', INDETERMINATE) -telephoneoutlet = express_getattr(IfcOutletTypeEnum, 'TELEPHONEOUTLET', INDETERMINATE) -userdefined = express_getattr(IfcOutletTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcOutletTypeEnum, 'NOTDEFINED', INDETERMINATE) +audiovisualoutlet = IfcOutletTypeEnum.AUDIOVISUALOUTLET +communicationsoutlet = IfcOutletTypeEnum.COMMUNICATIONSOUTLET +poweroutlet = IfcOutletTypeEnum.POWEROUTLET +dataoutlet = IfcOutletTypeEnum.DATAOUTLET +telephoneoutlet = IfcOutletTypeEnum.TELEPHONEOUTLET +userdefined = IfcOutletTypeEnum.USERDEFINED +notdefined = IfcOutletTypeEnum.NOTDEFINED IfcPerformanceHistoryTypeEnum = enum_namespace() -userdefined = express_getattr(IfcPerformanceHistoryTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPerformanceHistoryTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcPerformanceHistoryTypeEnum.USERDEFINED +notdefined = IfcPerformanceHistoryTypeEnum.NOTDEFINED IfcPermeableCoveringOperationEnum = enum_namespace() -grill = express_getattr(IfcPermeableCoveringOperationEnum, 'GRILL', INDETERMINATE) -louver = express_getattr(IfcPermeableCoveringOperationEnum, 'LOUVER', INDETERMINATE) -screen = express_getattr(IfcPermeableCoveringOperationEnum, 'SCREEN', INDETERMINATE) -userdefined = express_getattr(IfcPermeableCoveringOperationEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPermeableCoveringOperationEnum, 'NOTDEFINED', INDETERMINATE) +grill = IfcPermeableCoveringOperationEnum.GRILL +louver = IfcPermeableCoveringOperationEnum.LOUVER +screen = IfcPermeableCoveringOperationEnum.SCREEN +userdefined = IfcPermeableCoveringOperationEnum.USERDEFINED +notdefined = IfcPermeableCoveringOperationEnum.NOTDEFINED IfcPermitTypeEnum = enum_namespace() -access = express_getattr(IfcPermitTypeEnum, 'ACCESS', INDETERMINATE) -building = express_getattr(IfcPermitTypeEnum, 'BUILDING', INDETERMINATE) -work = express_getattr(IfcPermitTypeEnum, 'WORK', INDETERMINATE) -userdefined = express_getattr(IfcPermitTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPermitTypeEnum, 'NOTDEFINED', INDETERMINATE) +access = IfcPermitTypeEnum.ACCESS +building = IfcPermitTypeEnum.BUILDING +work = IfcPermitTypeEnum.WORK +userdefined = IfcPermitTypeEnum.USERDEFINED +notdefined = IfcPermitTypeEnum.NOTDEFINED IfcPhysicalOrVirtualEnum = enum_namespace() -physical = express_getattr(IfcPhysicalOrVirtualEnum, 'PHYSICAL', INDETERMINATE) -virtual = express_getattr(IfcPhysicalOrVirtualEnum, 'VIRTUAL', INDETERMINATE) -notdefined = express_getattr(IfcPhysicalOrVirtualEnum, 'NOTDEFINED', INDETERMINATE) +physical = IfcPhysicalOrVirtualEnum.PHYSICAL +virtual = IfcPhysicalOrVirtualEnum.VIRTUAL +notdefined = IfcPhysicalOrVirtualEnum.NOTDEFINED IfcPileConstructionEnum = enum_namespace() -cast_in_place = express_getattr(IfcPileConstructionEnum, 'CAST_IN_PLACE', INDETERMINATE) -composite = express_getattr(IfcPileConstructionEnum, 'COMPOSITE', INDETERMINATE) -precast_concrete = express_getattr(IfcPileConstructionEnum, 'PRECAST_CONCRETE', INDETERMINATE) -prefab_steel = express_getattr(IfcPileConstructionEnum, 'PREFAB_STEEL', INDETERMINATE) -userdefined = express_getattr(IfcPileConstructionEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPileConstructionEnum, 'NOTDEFINED', INDETERMINATE) +cast_in_place = IfcPileConstructionEnum.CAST_IN_PLACE +composite = IfcPileConstructionEnum.COMPOSITE +precast_concrete = IfcPileConstructionEnum.PRECAST_CONCRETE +prefab_steel = IfcPileConstructionEnum.PREFAB_STEEL +userdefined = IfcPileConstructionEnum.USERDEFINED +notdefined = IfcPileConstructionEnum.NOTDEFINED IfcPileTypeEnum = enum_namespace() -bored = express_getattr(IfcPileTypeEnum, 'BORED', INDETERMINATE) -driven = express_getattr(IfcPileTypeEnum, 'DRIVEN', INDETERMINATE) -jetgrouting = express_getattr(IfcPileTypeEnum, 'JETGROUTING', INDETERMINATE) -cohesion = express_getattr(IfcPileTypeEnum, 'COHESION', INDETERMINATE) -friction = express_getattr(IfcPileTypeEnum, 'FRICTION', INDETERMINATE) -support = express_getattr(IfcPileTypeEnum, 'SUPPORT', INDETERMINATE) -userdefined = express_getattr(IfcPileTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPileTypeEnum, 'NOTDEFINED', INDETERMINATE) +bored = IfcPileTypeEnum.BORED +driven = IfcPileTypeEnum.DRIVEN +jetgrouting = IfcPileTypeEnum.JETGROUTING +cohesion = IfcPileTypeEnum.COHESION +friction = IfcPileTypeEnum.FRICTION +support = IfcPileTypeEnum.SUPPORT +userdefined = IfcPileTypeEnum.USERDEFINED +notdefined = IfcPileTypeEnum.NOTDEFINED IfcPipeFittingTypeEnum = enum_namespace() -bend = express_getattr(IfcPipeFittingTypeEnum, 'BEND', INDETERMINATE) -connector = express_getattr(IfcPipeFittingTypeEnum, 'CONNECTOR', INDETERMINATE) -entry = express_getattr(IfcPipeFittingTypeEnum, 'ENTRY', INDETERMINATE) -exit = express_getattr(IfcPipeFittingTypeEnum, 'EXIT', INDETERMINATE) -junction = express_getattr(IfcPipeFittingTypeEnum, 'JUNCTION', INDETERMINATE) -obstruction = express_getattr(IfcPipeFittingTypeEnum, 'OBSTRUCTION', INDETERMINATE) -transition = express_getattr(IfcPipeFittingTypeEnum, 'TRANSITION', INDETERMINATE) -userdefined = express_getattr(IfcPipeFittingTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPipeFittingTypeEnum, 'NOTDEFINED', INDETERMINATE) +bend = IfcPipeFittingTypeEnum.BEND +connector = IfcPipeFittingTypeEnum.CONNECTOR +entry = IfcPipeFittingTypeEnum.ENTRY +exit = IfcPipeFittingTypeEnum.EXIT +junction = IfcPipeFittingTypeEnum.JUNCTION +obstruction = IfcPipeFittingTypeEnum.OBSTRUCTION +transition = IfcPipeFittingTypeEnum.TRANSITION +userdefined = IfcPipeFittingTypeEnum.USERDEFINED +notdefined = IfcPipeFittingTypeEnum.NOTDEFINED IfcPipeSegmentTypeEnum = enum_namespace() -culvert = express_getattr(IfcPipeSegmentTypeEnum, 'CULVERT', INDETERMINATE) -flexiblesegment = express_getattr(IfcPipeSegmentTypeEnum, 'FLEXIBLESEGMENT', INDETERMINATE) -rigidsegment = express_getattr(IfcPipeSegmentTypeEnum, 'RIGIDSEGMENT', INDETERMINATE) -gutter = express_getattr(IfcPipeSegmentTypeEnum, 'GUTTER', INDETERMINATE) -spool = express_getattr(IfcPipeSegmentTypeEnum, 'SPOOL', INDETERMINATE) -userdefined = express_getattr(IfcPipeSegmentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPipeSegmentTypeEnum, 'NOTDEFINED', INDETERMINATE) +culvert = IfcPipeSegmentTypeEnum.CULVERT +flexiblesegment = IfcPipeSegmentTypeEnum.FLEXIBLESEGMENT +rigidsegment = IfcPipeSegmentTypeEnum.RIGIDSEGMENT +gutter = IfcPipeSegmentTypeEnum.GUTTER +spool = IfcPipeSegmentTypeEnum.SPOOL +userdefined = IfcPipeSegmentTypeEnum.USERDEFINED +notdefined = IfcPipeSegmentTypeEnum.NOTDEFINED IfcPlateTypeEnum = enum_namespace() -curtain_panel = express_getattr(IfcPlateTypeEnum, 'CURTAIN_PANEL', INDETERMINATE) -sheet = express_getattr(IfcPlateTypeEnum, 'SHEET', INDETERMINATE) -userdefined = express_getattr(IfcPlateTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPlateTypeEnum, 'NOTDEFINED', INDETERMINATE) +curtain_panel = IfcPlateTypeEnum.CURTAIN_PANEL +sheet = IfcPlateTypeEnum.SHEET +userdefined = IfcPlateTypeEnum.USERDEFINED +notdefined = IfcPlateTypeEnum.NOTDEFINED IfcPreferredSurfaceCurveRepresentation = enum_namespace() -curve3d = express_getattr(IfcPreferredSurfaceCurveRepresentation, 'CURVE3D', INDETERMINATE) -pcurve_s1 = express_getattr(IfcPreferredSurfaceCurveRepresentation, 'PCURVE_S1', INDETERMINATE) -pcurve_s2 = express_getattr(IfcPreferredSurfaceCurveRepresentation, 'PCURVE_S2', INDETERMINATE) +curve3d = IfcPreferredSurfaceCurveRepresentation.CURVE3D +pcurve_s1 = IfcPreferredSurfaceCurveRepresentation.PCURVE_S1 +pcurve_s2 = IfcPreferredSurfaceCurveRepresentation.PCURVE_S2 IfcProcedureTypeEnum = enum_namespace() -advice_caution = express_getattr(IfcProcedureTypeEnum, 'ADVICE_CAUTION', INDETERMINATE) -advice_note = express_getattr(IfcProcedureTypeEnum, 'ADVICE_NOTE', INDETERMINATE) -advice_warning = express_getattr(IfcProcedureTypeEnum, 'ADVICE_WARNING', INDETERMINATE) -calibration = express_getattr(IfcProcedureTypeEnum, 'CALIBRATION', INDETERMINATE) -diagnostic = express_getattr(IfcProcedureTypeEnum, 'DIAGNOSTIC', INDETERMINATE) -shutdown = express_getattr(IfcProcedureTypeEnum, 'SHUTDOWN', INDETERMINATE) -startup = express_getattr(IfcProcedureTypeEnum, 'STARTUP', INDETERMINATE) -userdefined = express_getattr(IfcProcedureTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcProcedureTypeEnum, 'NOTDEFINED', INDETERMINATE) +advice_caution = IfcProcedureTypeEnum.ADVICE_CAUTION +advice_note = IfcProcedureTypeEnum.ADVICE_NOTE +advice_warning = IfcProcedureTypeEnum.ADVICE_WARNING +calibration = IfcProcedureTypeEnum.CALIBRATION +diagnostic = IfcProcedureTypeEnum.DIAGNOSTIC +shutdown = IfcProcedureTypeEnum.SHUTDOWN +startup = IfcProcedureTypeEnum.STARTUP +userdefined = IfcProcedureTypeEnum.USERDEFINED +notdefined = IfcProcedureTypeEnum.NOTDEFINED IfcProfileTypeEnum = enum_namespace() -curve = express_getattr(IfcProfileTypeEnum, 'CURVE', INDETERMINATE) -area = express_getattr(IfcProfileTypeEnum, 'AREA', INDETERMINATE) +curve = IfcProfileTypeEnum.CURVE +area = IfcProfileTypeEnum.AREA IfcProjectOrderTypeEnum = enum_namespace() -changeorder = express_getattr(IfcProjectOrderTypeEnum, 'CHANGEORDER', INDETERMINATE) -maintenanceworkorder = express_getattr(IfcProjectOrderTypeEnum, 'MAINTENANCEWORKORDER', INDETERMINATE) -moveorder = express_getattr(IfcProjectOrderTypeEnum, 'MOVEORDER', INDETERMINATE) -purchaseorder = express_getattr(IfcProjectOrderTypeEnum, 'PURCHASEORDER', INDETERMINATE) -workorder = express_getattr(IfcProjectOrderTypeEnum, 'WORKORDER', INDETERMINATE) -userdefined = express_getattr(IfcProjectOrderTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcProjectOrderTypeEnum, 'NOTDEFINED', INDETERMINATE) +changeorder = IfcProjectOrderTypeEnum.CHANGEORDER +maintenanceworkorder = IfcProjectOrderTypeEnum.MAINTENANCEWORKORDER +moveorder = IfcProjectOrderTypeEnum.MOVEORDER +purchaseorder = IfcProjectOrderTypeEnum.PURCHASEORDER +workorder = IfcProjectOrderTypeEnum.WORKORDER +userdefined = IfcProjectOrderTypeEnum.USERDEFINED +notdefined = IfcProjectOrderTypeEnum.NOTDEFINED IfcProjectedOrTrueLengthEnum = enum_namespace() -projected_length = express_getattr(IfcProjectedOrTrueLengthEnum, 'PROJECTED_LENGTH', INDETERMINATE) -true_length = express_getattr(IfcProjectedOrTrueLengthEnum, 'TRUE_LENGTH', INDETERMINATE) +projected_length = IfcProjectedOrTrueLengthEnum.PROJECTED_LENGTH +true_length = IfcProjectedOrTrueLengthEnum.TRUE_LENGTH IfcProjectionElementTypeEnum = enum_namespace() -userdefined = express_getattr(IfcProjectionElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcProjectionElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcProjectionElementTypeEnum.USERDEFINED +notdefined = IfcProjectionElementTypeEnum.NOTDEFINED IfcPropertySetTemplateTypeEnum = enum_namespace() -pset_typedrivenonly = express_getattr(IfcPropertySetTemplateTypeEnum, 'PSET_TYPEDRIVENONLY', INDETERMINATE) -pset_typedrivenoverride = express_getattr(IfcPropertySetTemplateTypeEnum, 'PSET_TYPEDRIVENOVERRIDE', INDETERMINATE) -pset_occurrencedriven = express_getattr(IfcPropertySetTemplateTypeEnum, 'PSET_OCCURRENCEDRIVEN', INDETERMINATE) -pset_performancedriven = express_getattr(IfcPropertySetTemplateTypeEnum, 'PSET_PERFORMANCEDRIVEN', INDETERMINATE) -qto_typedrivenonly = express_getattr(IfcPropertySetTemplateTypeEnum, 'QTO_TYPEDRIVENONLY', INDETERMINATE) -qto_typedrivenoverride = express_getattr(IfcPropertySetTemplateTypeEnum, 'QTO_TYPEDRIVENOVERRIDE', INDETERMINATE) -qto_occurrencedriven = express_getattr(IfcPropertySetTemplateTypeEnum, 'QTO_OCCURRENCEDRIVEN', INDETERMINATE) -notdefined = express_getattr(IfcPropertySetTemplateTypeEnum, 'NOTDEFINED', INDETERMINATE) +pset_typedrivenonly = IfcPropertySetTemplateTypeEnum.PSET_TYPEDRIVENONLY +pset_typedrivenoverride = IfcPropertySetTemplateTypeEnum.PSET_TYPEDRIVENOVERRIDE +pset_occurrencedriven = IfcPropertySetTemplateTypeEnum.PSET_OCCURRENCEDRIVEN +pset_performancedriven = IfcPropertySetTemplateTypeEnum.PSET_PERFORMANCEDRIVEN +qto_typedrivenonly = IfcPropertySetTemplateTypeEnum.QTO_TYPEDRIVENONLY +qto_typedrivenoverride = IfcPropertySetTemplateTypeEnum.QTO_TYPEDRIVENOVERRIDE +qto_occurrencedriven = IfcPropertySetTemplateTypeEnum.QTO_OCCURRENCEDRIVEN +notdefined = IfcPropertySetTemplateTypeEnum.NOTDEFINED IfcProtectiveDeviceTrippingUnitTypeEnum = enum_namespace() -electronic = express_getattr(IfcProtectiveDeviceTrippingUnitTypeEnum, 'ELECTRONIC', INDETERMINATE) -electromagnetic = express_getattr(IfcProtectiveDeviceTrippingUnitTypeEnum, 'ELECTROMAGNETIC', INDETERMINATE) -residualcurrent = express_getattr(IfcProtectiveDeviceTrippingUnitTypeEnum, 'RESIDUALCURRENT', INDETERMINATE) -thermal = express_getattr(IfcProtectiveDeviceTrippingUnitTypeEnum, 'THERMAL', INDETERMINATE) -userdefined = express_getattr(IfcProtectiveDeviceTrippingUnitTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcProtectiveDeviceTrippingUnitTypeEnum, 'NOTDEFINED', INDETERMINATE) +electronic = IfcProtectiveDeviceTrippingUnitTypeEnum.ELECTRONIC +electromagnetic = IfcProtectiveDeviceTrippingUnitTypeEnum.ELECTROMAGNETIC +residualcurrent = IfcProtectiveDeviceTrippingUnitTypeEnum.RESIDUALCURRENT +thermal = IfcProtectiveDeviceTrippingUnitTypeEnum.THERMAL +userdefined = IfcProtectiveDeviceTrippingUnitTypeEnum.USERDEFINED +notdefined = IfcProtectiveDeviceTrippingUnitTypeEnum.NOTDEFINED IfcProtectiveDeviceTypeEnum = enum_namespace() -circuitbreaker = express_getattr(IfcProtectiveDeviceTypeEnum, 'CIRCUITBREAKER', INDETERMINATE) -earthleakagecircuitbreaker = express_getattr(IfcProtectiveDeviceTypeEnum, 'EARTHLEAKAGECIRCUITBREAKER', INDETERMINATE) -earthingswitch = express_getattr(IfcProtectiveDeviceTypeEnum, 'EARTHINGSWITCH', INDETERMINATE) -fusedisconnector = express_getattr(IfcProtectiveDeviceTypeEnum, 'FUSEDISCONNECTOR', INDETERMINATE) -residualcurrentcircuitbreaker = express_getattr(IfcProtectiveDeviceTypeEnum, 'RESIDUALCURRENTCIRCUITBREAKER', INDETERMINATE) -residualcurrentswitch = express_getattr(IfcProtectiveDeviceTypeEnum, 'RESIDUALCURRENTSWITCH', INDETERMINATE) -varistor = express_getattr(IfcProtectiveDeviceTypeEnum, 'VARISTOR', INDETERMINATE) -userdefined = express_getattr(IfcProtectiveDeviceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcProtectiveDeviceTypeEnum, 'NOTDEFINED', INDETERMINATE) +circuitbreaker = IfcProtectiveDeviceTypeEnum.CIRCUITBREAKER +earthleakagecircuitbreaker = IfcProtectiveDeviceTypeEnum.EARTHLEAKAGECIRCUITBREAKER +earthingswitch = IfcProtectiveDeviceTypeEnum.EARTHINGSWITCH +fusedisconnector = IfcProtectiveDeviceTypeEnum.FUSEDISCONNECTOR +residualcurrentcircuitbreaker = IfcProtectiveDeviceTypeEnum.RESIDUALCURRENTCIRCUITBREAKER +residualcurrentswitch = IfcProtectiveDeviceTypeEnum.RESIDUALCURRENTSWITCH +varistor = IfcProtectiveDeviceTypeEnum.VARISTOR +userdefined = IfcProtectiveDeviceTypeEnum.USERDEFINED +notdefined = IfcProtectiveDeviceTypeEnum.NOTDEFINED IfcPumpTypeEnum = enum_namespace() -circulator = express_getattr(IfcPumpTypeEnum, 'CIRCULATOR', INDETERMINATE) -endsuction = express_getattr(IfcPumpTypeEnum, 'ENDSUCTION', INDETERMINATE) -splitcase = express_getattr(IfcPumpTypeEnum, 'SPLITCASE', INDETERMINATE) -submersiblepump = express_getattr(IfcPumpTypeEnum, 'SUBMERSIBLEPUMP', INDETERMINATE) -sumppump = express_getattr(IfcPumpTypeEnum, 'SUMPPUMP', INDETERMINATE) -verticalinline = express_getattr(IfcPumpTypeEnum, 'VERTICALINLINE', INDETERMINATE) -verticalturbine = express_getattr(IfcPumpTypeEnum, 'VERTICALTURBINE', INDETERMINATE) -userdefined = express_getattr(IfcPumpTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPumpTypeEnum, 'NOTDEFINED', INDETERMINATE) +circulator = IfcPumpTypeEnum.CIRCULATOR +endsuction = IfcPumpTypeEnum.ENDSUCTION +splitcase = IfcPumpTypeEnum.SPLITCASE +submersiblepump = IfcPumpTypeEnum.SUBMERSIBLEPUMP +sumppump = IfcPumpTypeEnum.SUMPPUMP +verticalinline = IfcPumpTypeEnum.VERTICALINLINE +verticalturbine = IfcPumpTypeEnum.VERTICALTURBINE +userdefined = IfcPumpTypeEnum.USERDEFINED +notdefined = IfcPumpTypeEnum.NOTDEFINED IfcRailingTypeEnum = enum_namespace() -handrail = express_getattr(IfcRailingTypeEnum, 'HANDRAIL', INDETERMINATE) -guardrail = express_getattr(IfcRailingTypeEnum, 'GUARDRAIL', INDETERMINATE) -balustrade = express_getattr(IfcRailingTypeEnum, 'BALUSTRADE', INDETERMINATE) -userdefined = express_getattr(IfcRailingTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcRailingTypeEnum, 'NOTDEFINED', INDETERMINATE) +handrail = IfcRailingTypeEnum.HANDRAIL +guardrail = IfcRailingTypeEnum.GUARDRAIL +balustrade = IfcRailingTypeEnum.BALUSTRADE +userdefined = IfcRailingTypeEnum.USERDEFINED +notdefined = IfcRailingTypeEnum.NOTDEFINED IfcRampFlightTypeEnum = enum_namespace() -straight = express_getattr(IfcRampFlightTypeEnum, 'STRAIGHT', INDETERMINATE) -spiral = express_getattr(IfcRampFlightTypeEnum, 'SPIRAL', INDETERMINATE) -userdefined = express_getattr(IfcRampFlightTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcRampFlightTypeEnum, 'NOTDEFINED', INDETERMINATE) +straight = IfcRampFlightTypeEnum.STRAIGHT +spiral = IfcRampFlightTypeEnum.SPIRAL +userdefined = IfcRampFlightTypeEnum.USERDEFINED +notdefined = IfcRampFlightTypeEnum.NOTDEFINED IfcRampTypeEnum = enum_namespace() -straight_run_ramp = express_getattr(IfcRampTypeEnum, 'STRAIGHT_RUN_RAMP', INDETERMINATE) -two_straight_run_ramp = express_getattr(IfcRampTypeEnum, 'TWO_STRAIGHT_RUN_RAMP', INDETERMINATE) -quarter_turn_ramp = express_getattr(IfcRampTypeEnum, 'QUARTER_TURN_RAMP', INDETERMINATE) -two_quarter_turn_ramp = express_getattr(IfcRampTypeEnum, 'TWO_QUARTER_TURN_RAMP', INDETERMINATE) -half_turn_ramp = express_getattr(IfcRampTypeEnum, 'HALF_TURN_RAMP', INDETERMINATE) -spiral_ramp = express_getattr(IfcRampTypeEnum, 'SPIRAL_RAMP', INDETERMINATE) -userdefined = express_getattr(IfcRampTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcRampTypeEnum, 'NOTDEFINED', INDETERMINATE) +straight_run_ramp = IfcRampTypeEnum.STRAIGHT_RUN_RAMP +two_straight_run_ramp = IfcRampTypeEnum.TWO_STRAIGHT_RUN_RAMP +quarter_turn_ramp = IfcRampTypeEnum.QUARTER_TURN_RAMP +two_quarter_turn_ramp = IfcRampTypeEnum.TWO_QUARTER_TURN_RAMP +half_turn_ramp = IfcRampTypeEnum.HALF_TURN_RAMP +spiral_ramp = IfcRampTypeEnum.SPIRAL_RAMP +userdefined = IfcRampTypeEnum.USERDEFINED +notdefined = IfcRampTypeEnum.NOTDEFINED IfcRecurrenceTypeEnum = enum_namespace() -daily = express_getattr(IfcRecurrenceTypeEnum, 'DAILY', INDETERMINATE) -weekly = express_getattr(IfcRecurrenceTypeEnum, 'WEEKLY', INDETERMINATE) -monthly_by_day_of_month = express_getattr(IfcRecurrenceTypeEnum, 'MONTHLY_BY_DAY_OF_MONTH', INDETERMINATE) -monthly_by_position = express_getattr(IfcRecurrenceTypeEnum, 'MONTHLY_BY_POSITION', INDETERMINATE) -by_day_count = express_getattr(IfcRecurrenceTypeEnum, 'BY_DAY_COUNT', INDETERMINATE) -by_weekday_count = express_getattr(IfcRecurrenceTypeEnum, 'BY_WEEKDAY_COUNT', INDETERMINATE) -yearly_by_day_of_month = express_getattr(IfcRecurrenceTypeEnum, 'YEARLY_BY_DAY_OF_MONTH', INDETERMINATE) -yearly_by_position = express_getattr(IfcRecurrenceTypeEnum, 'YEARLY_BY_POSITION', INDETERMINATE) +daily = IfcRecurrenceTypeEnum.DAILY +weekly = IfcRecurrenceTypeEnum.WEEKLY +monthly_by_day_of_month = IfcRecurrenceTypeEnum.MONTHLY_BY_DAY_OF_MONTH +monthly_by_position = IfcRecurrenceTypeEnum.MONTHLY_BY_POSITION +by_day_count = IfcRecurrenceTypeEnum.BY_DAY_COUNT +by_weekday_count = IfcRecurrenceTypeEnum.BY_WEEKDAY_COUNT +yearly_by_day_of_month = IfcRecurrenceTypeEnum.YEARLY_BY_DAY_OF_MONTH +yearly_by_position = IfcRecurrenceTypeEnum.YEARLY_BY_POSITION IfcReflectanceMethodEnum = enum_namespace() -blinn = express_getattr(IfcReflectanceMethodEnum, 'BLINN', INDETERMINATE) -flat = express_getattr(IfcReflectanceMethodEnum, 'FLAT', INDETERMINATE) -glass = express_getattr(IfcReflectanceMethodEnum, 'GLASS', INDETERMINATE) -matt = express_getattr(IfcReflectanceMethodEnum, 'MATT', INDETERMINATE) -metal = express_getattr(IfcReflectanceMethodEnum, 'METAL', INDETERMINATE) -mirror = express_getattr(IfcReflectanceMethodEnum, 'MIRROR', INDETERMINATE) -phong = express_getattr(IfcReflectanceMethodEnum, 'PHONG', INDETERMINATE) -plastic = express_getattr(IfcReflectanceMethodEnum, 'PLASTIC', INDETERMINATE) -strauss = express_getattr(IfcReflectanceMethodEnum, 'STRAUSS', INDETERMINATE) -notdefined = express_getattr(IfcReflectanceMethodEnum, 'NOTDEFINED', INDETERMINATE) +blinn = IfcReflectanceMethodEnum.BLINN +flat = IfcReflectanceMethodEnum.FLAT +glass = IfcReflectanceMethodEnum.GLASS +matt = IfcReflectanceMethodEnum.MATT +metal = IfcReflectanceMethodEnum.METAL +mirror = IfcReflectanceMethodEnum.MIRROR +phong = IfcReflectanceMethodEnum.PHONG +plastic = IfcReflectanceMethodEnum.PLASTIC +strauss = IfcReflectanceMethodEnum.STRAUSS +notdefined = IfcReflectanceMethodEnum.NOTDEFINED IfcReinforcingBarRoleEnum = enum_namespace() -main = express_getattr(IfcReinforcingBarRoleEnum, 'MAIN', INDETERMINATE) -shear = express_getattr(IfcReinforcingBarRoleEnum, 'SHEAR', INDETERMINATE) -ligature = express_getattr(IfcReinforcingBarRoleEnum, 'LIGATURE', INDETERMINATE) -stud = express_getattr(IfcReinforcingBarRoleEnum, 'STUD', INDETERMINATE) -punching = express_getattr(IfcReinforcingBarRoleEnum, 'PUNCHING', INDETERMINATE) -edge = express_getattr(IfcReinforcingBarRoleEnum, 'EDGE', INDETERMINATE) -ring = express_getattr(IfcReinforcingBarRoleEnum, 'RING', INDETERMINATE) -anchoring = express_getattr(IfcReinforcingBarRoleEnum, 'ANCHORING', INDETERMINATE) -userdefined = express_getattr(IfcReinforcingBarRoleEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcReinforcingBarRoleEnum, 'NOTDEFINED', INDETERMINATE) +main = IfcReinforcingBarRoleEnum.MAIN +shear = IfcReinforcingBarRoleEnum.SHEAR +ligature = IfcReinforcingBarRoleEnum.LIGATURE +stud = IfcReinforcingBarRoleEnum.STUD +punching = IfcReinforcingBarRoleEnum.PUNCHING +edge = IfcReinforcingBarRoleEnum.EDGE +ring = IfcReinforcingBarRoleEnum.RING +anchoring = IfcReinforcingBarRoleEnum.ANCHORING +userdefined = IfcReinforcingBarRoleEnum.USERDEFINED +notdefined = IfcReinforcingBarRoleEnum.NOTDEFINED IfcReinforcingBarSurfaceEnum = enum_namespace() -plain = express_getattr(IfcReinforcingBarSurfaceEnum, 'PLAIN', INDETERMINATE) -textured = express_getattr(IfcReinforcingBarSurfaceEnum, 'TEXTURED', INDETERMINATE) +plain = IfcReinforcingBarSurfaceEnum.PLAIN +textured = IfcReinforcingBarSurfaceEnum.TEXTURED IfcReinforcingBarTypeEnum = enum_namespace() -anchoring = express_getattr(IfcReinforcingBarTypeEnum, 'ANCHORING', INDETERMINATE) -edge = express_getattr(IfcReinforcingBarTypeEnum, 'EDGE', INDETERMINATE) -ligature = express_getattr(IfcReinforcingBarTypeEnum, 'LIGATURE', INDETERMINATE) -main = express_getattr(IfcReinforcingBarTypeEnum, 'MAIN', INDETERMINATE) -punching = express_getattr(IfcReinforcingBarTypeEnum, 'PUNCHING', INDETERMINATE) -ring = express_getattr(IfcReinforcingBarTypeEnum, 'RING', INDETERMINATE) -shear = express_getattr(IfcReinforcingBarTypeEnum, 'SHEAR', INDETERMINATE) -stud = express_getattr(IfcReinforcingBarTypeEnum, 'STUD', INDETERMINATE) -userdefined = express_getattr(IfcReinforcingBarTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcReinforcingBarTypeEnum, 'NOTDEFINED', INDETERMINATE) +anchoring = IfcReinforcingBarTypeEnum.ANCHORING +edge = IfcReinforcingBarTypeEnum.EDGE +ligature = IfcReinforcingBarTypeEnum.LIGATURE +main = IfcReinforcingBarTypeEnum.MAIN +punching = IfcReinforcingBarTypeEnum.PUNCHING +ring = IfcReinforcingBarTypeEnum.RING +shear = IfcReinforcingBarTypeEnum.SHEAR +stud = IfcReinforcingBarTypeEnum.STUD +userdefined = IfcReinforcingBarTypeEnum.USERDEFINED +notdefined = IfcReinforcingBarTypeEnum.NOTDEFINED IfcReinforcingMeshTypeEnum = enum_namespace() -userdefined = express_getattr(IfcReinforcingMeshTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcReinforcingMeshTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcReinforcingMeshTypeEnum.USERDEFINED +notdefined = IfcReinforcingMeshTypeEnum.NOTDEFINED IfcRoleEnum = enum_namespace() -supplier = express_getattr(IfcRoleEnum, 'SUPPLIER', INDETERMINATE) -manufacturer = express_getattr(IfcRoleEnum, 'MANUFACTURER', INDETERMINATE) -contractor = express_getattr(IfcRoleEnum, 'CONTRACTOR', INDETERMINATE) -subcontractor = express_getattr(IfcRoleEnum, 'SUBCONTRACTOR', INDETERMINATE) -architect = express_getattr(IfcRoleEnum, 'ARCHITECT', INDETERMINATE) -structuralengineer = express_getattr(IfcRoleEnum, 'STRUCTURALENGINEER', INDETERMINATE) -costengineer = express_getattr(IfcRoleEnum, 'COSTENGINEER', INDETERMINATE) -client = express_getattr(IfcRoleEnum, 'CLIENT', INDETERMINATE) -buildingowner = express_getattr(IfcRoleEnum, 'BUILDINGOWNER', INDETERMINATE) -buildingoperator = express_getattr(IfcRoleEnum, 'BUILDINGOPERATOR', INDETERMINATE) -mechanicalengineer = express_getattr(IfcRoleEnum, 'MECHANICALENGINEER', INDETERMINATE) -electricalengineer = express_getattr(IfcRoleEnum, 'ELECTRICALENGINEER', INDETERMINATE) -projectmanager = express_getattr(IfcRoleEnum, 'PROJECTMANAGER', INDETERMINATE) -facilitiesmanager = express_getattr(IfcRoleEnum, 'FACILITIESMANAGER', INDETERMINATE) -civilengineer = express_getattr(IfcRoleEnum, 'CIVILENGINEER', INDETERMINATE) -commissioningengineer = express_getattr(IfcRoleEnum, 'COMMISSIONINGENGINEER', INDETERMINATE) -engineer = express_getattr(IfcRoleEnum, 'ENGINEER', INDETERMINATE) -owner = express_getattr(IfcRoleEnum, 'OWNER', INDETERMINATE) -consultant = express_getattr(IfcRoleEnum, 'CONSULTANT', INDETERMINATE) -constructionmanager = express_getattr(IfcRoleEnum, 'CONSTRUCTIONMANAGER', INDETERMINATE) -fieldconstructionmanager = express_getattr(IfcRoleEnum, 'FIELDCONSTRUCTIONMANAGER', INDETERMINATE) -reseller = express_getattr(IfcRoleEnum, 'RESELLER', INDETERMINATE) -userdefined = express_getattr(IfcRoleEnum, 'USERDEFINED', INDETERMINATE) +supplier = IfcRoleEnum.SUPPLIER +manufacturer = IfcRoleEnum.MANUFACTURER +contractor = IfcRoleEnum.CONTRACTOR +subcontractor = IfcRoleEnum.SUBCONTRACTOR +architect = IfcRoleEnum.ARCHITECT +structuralengineer = IfcRoleEnum.STRUCTURALENGINEER +costengineer = IfcRoleEnum.COSTENGINEER +client = IfcRoleEnum.CLIENT +buildingowner = IfcRoleEnum.BUILDINGOWNER +buildingoperator = IfcRoleEnum.BUILDINGOPERATOR +mechanicalengineer = IfcRoleEnum.MECHANICALENGINEER +electricalengineer = IfcRoleEnum.ELECTRICALENGINEER +projectmanager = IfcRoleEnum.PROJECTMANAGER +facilitiesmanager = IfcRoleEnum.FACILITIESMANAGER +civilengineer = IfcRoleEnum.CIVILENGINEER +commissioningengineer = IfcRoleEnum.COMMISSIONINGENGINEER +engineer = IfcRoleEnum.ENGINEER +owner = IfcRoleEnum.OWNER +consultant = IfcRoleEnum.CONSULTANT +constructionmanager = IfcRoleEnum.CONSTRUCTIONMANAGER +fieldconstructionmanager = IfcRoleEnum.FIELDCONSTRUCTIONMANAGER +reseller = IfcRoleEnum.RESELLER +userdefined = IfcRoleEnum.USERDEFINED IfcRoofTypeEnum = enum_namespace() -flat_roof = express_getattr(IfcRoofTypeEnum, 'FLAT_ROOF', INDETERMINATE) -shed_roof = express_getattr(IfcRoofTypeEnum, 'SHED_ROOF', INDETERMINATE) -gable_roof = express_getattr(IfcRoofTypeEnum, 'GABLE_ROOF', INDETERMINATE) -hip_roof = express_getattr(IfcRoofTypeEnum, 'HIP_ROOF', INDETERMINATE) -hipped_gable_roof = express_getattr(IfcRoofTypeEnum, 'HIPPED_GABLE_ROOF', INDETERMINATE) -gambrel_roof = express_getattr(IfcRoofTypeEnum, 'GAMBREL_ROOF', INDETERMINATE) -mansard_roof = express_getattr(IfcRoofTypeEnum, 'MANSARD_ROOF', INDETERMINATE) -barrel_roof = express_getattr(IfcRoofTypeEnum, 'BARREL_ROOF', INDETERMINATE) -rainbow_roof = express_getattr(IfcRoofTypeEnum, 'RAINBOW_ROOF', INDETERMINATE) -butterfly_roof = express_getattr(IfcRoofTypeEnum, 'BUTTERFLY_ROOF', INDETERMINATE) -pavilion_roof = express_getattr(IfcRoofTypeEnum, 'PAVILION_ROOF', INDETERMINATE) -dome_roof = express_getattr(IfcRoofTypeEnum, 'DOME_ROOF', INDETERMINATE) -freeform = express_getattr(IfcRoofTypeEnum, 'FREEFORM', INDETERMINATE) -userdefined = express_getattr(IfcRoofTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcRoofTypeEnum, 'NOTDEFINED', INDETERMINATE) +flat_roof = IfcRoofTypeEnum.FLAT_ROOF +shed_roof = IfcRoofTypeEnum.SHED_ROOF +gable_roof = IfcRoofTypeEnum.GABLE_ROOF +hip_roof = IfcRoofTypeEnum.HIP_ROOF +hipped_gable_roof = IfcRoofTypeEnum.HIPPED_GABLE_ROOF +gambrel_roof = IfcRoofTypeEnum.GAMBREL_ROOF +mansard_roof = IfcRoofTypeEnum.MANSARD_ROOF +barrel_roof = IfcRoofTypeEnum.BARREL_ROOF +rainbow_roof = IfcRoofTypeEnum.RAINBOW_ROOF +butterfly_roof = IfcRoofTypeEnum.BUTTERFLY_ROOF +pavilion_roof = IfcRoofTypeEnum.PAVILION_ROOF +dome_roof = IfcRoofTypeEnum.DOME_ROOF +freeform = IfcRoofTypeEnum.FREEFORM +userdefined = IfcRoofTypeEnum.USERDEFINED +notdefined = IfcRoofTypeEnum.NOTDEFINED IfcSIPrefix = enum_namespace() -exa = express_getattr(IfcSIPrefix, 'EXA', INDETERMINATE) -peta = express_getattr(IfcSIPrefix, 'PETA', INDETERMINATE) -tera = express_getattr(IfcSIPrefix, 'TERA', INDETERMINATE) -giga = express_getattr(IfcSIPrefix, 'GIGA', INDETERMINATE) -mega = express_getattr(IfcSIPrefix, 'MEGA', INDETERMINATE) -kilo = express_getattr(IfcSIPrefix, 'KILO', INDETERMINATE) -hecto = express_getattr(IfcSIPrefix, 'HECTO', INDETERMINATE) -deca = express_getattr(IfcSIPrefix, 'DECA', INDETERMINATE) -deci = express_getattr(IfcSIPrefix, 'DECI', INDETERMINATE) -centi = express_getattr(IfcSIPrefix, 'CENTI', INDETERMINATE) -milli = express_getattr(IfcSIPrefix, 'MILLI', INDETERMINATE) -micro = express_getattr(IfcSIPrefix, 'MICRO', INDETERMINATE) -nano = express_getattr(IfcSIPrefix, 'NANO', INDETERMINATE) -pico = express_getattr(IfcSIPrefix, 'PICO', INDETERMINATE) -femto = express_getattr(IfcSIPrefix, 'FEMTO', INDETERMINATE) -atto = express_getattr(IfcSIPrefix, 'ATTO', INDETERMINATE) +exa = IfcSIPrefix.EXA +peta = IfcSIPrefix.PETA +tera = IfcSIPrefix.TERA +giga = IfcSIPrefix.GIGA +mega = IfcSIPrefix.MEGA +kilo = IfcSIPrefix.KILO +hecto = IfcSIPrefix.HECTO +deca = IfcSIPrefix.DECA +deci = IfcSIPrefix.DECI +centi = IfcSIPrefix.CENTI +milli = IfcSIPrefix.MILLI +micro = IfcSIPrefix.MICRO +nano = IfcSIPrefix.NANO +pico = IfcSIPrefix.PICO +femto = IfcSIPrefix.FEMTO +atto = IfcSIPrefix.ATTO IfcSIUnitName = enum_namespace() -ampere = express_getattr(IfcSIUnitName, 'AMPERE', INDETERMINATE) -becquerel = express_getattr(IfcSIUnitName, 'BECQUEREL', INDETERMINATE) -candela = express_getattr(IfcSIUnitName, 'CANDELA', INDETERMINATE) -coulomb = express_getattr(IfcSIUnitName, 'COULOMB', INDETERMINATE) -cubic_metre = express_getattr(IfcSIUnitName, 'CUBIC_METRE', INDETERMINATE) -degree_celsius = express_getattr(IfcSIUnitName, 'DEGREE_CELSIUS', INDETERMINATE) -farad = express_getattr(IfcSIUnitName, 'FARAD', INDETERMINATE) -gram = express_getattr(IfcSIUnitName, 'GRAM', INDETERMINATE) -gray = express_getattr(IfcSIUnitName, 'GRAY', INDETERMINATE) -henry = express_getattr(IfcSIUnitName, 'HENRY', INDETERMINATE) -hertz = express_getattr(IfcSIUnitName, 'HERTZ', INDETERMINATE) -joule = express_getattr(IfcSIUnitName, 'JOULE', INDETERMINATE) -kelvin = express_getattr(IfcSIUnitName, 'KELVIN', INDETERMINATE) -lumen = express_getattr(IfcSIUnitName, 'LUMEN', INDETERMINATE) -lux = express_getattr(IfcSIUnitName, 'LUX', INDETERMINATE) -metre = express_getattr(IfcSIUnitName, 'METRE', INDETERMINATE) -mole = express_getattr(IfcSIUnitName, 'MOLE', INDETERMINATE) -newton = express_getattr(IfcSIUnitName, 'NEWTON', INDETERMINATE) -ohm = express_getattr(IfcSIUnitName, 'OHM', INDETERMINATE) -pascal = express_getattr(IfcSIUnitName, 'PASCAL', INDETERMINATE) -radian = express_getattr(IfcSIUnitName, 'RADIAN', INDETERMINATE) -second = express_getattr(IfcSIUnitName, 'SECOND', INDETERMINATE) -siemens = express_getattr(IfcSIUnitName, 'SIEMENS', INDETERMINATE) -sievert = express_getattr(IfcSIUnitName, 'SIEVERT', INDETERMINATE) -square_metre = express_getattr(IfcSIUnitName, 'SQUARE_METRE', INDETERMINATE) -steradian = express_getattr(IfcSIUnitName, 'STERADIAN', INDETERMINATE) -tesla = express_getattr(IfcSIUnitName, 'TESLA', INDETERMINATE) -volt = express_getattr(IfcSIUnitName, 'VOLT', INDETERMINATE) -watt = express_getattr(IfcSIUnitName, 'WATT', INDETERMINATE) -weber = express_getattr(IfcSIUnitName, 'WEBER', INDETERMINATE) +ampere = IfcSIUnitName.AMPERE +becquerel = IfcSIUnitName.BECQUEREL +candela = IfcSIUnitName.CANDELA +coulomb = IfcSIUnitName.COULOMB +cubic_metre = IfcSIUnitName.CUBIC_METRE +degree_celsius = IfcSIUnitName.DEGREE_CELSIUS +farad = IfcSIUnitName.FARAD +gram = IfcSIUnitName.GRAM +gray = IfcSIUnitName.GRAY +henry = IfcSIUnitName.HENRY +hertz = IfcSIUnitName.HERTZ +joule = IfcSIUnitName.JOULE +kelvin = IfcSIUnitName.KELVIN +lumen = IfcSIUnitName.LUMEN +lux = IfcSIUnitName.LUX +metre = IfcSIUnitName.METRE +mole = IfcSIUnitName.MOLE +newton = IfcSIUnitName.NEWTON +ohm = IfcSIUnitName.OHM +pascal = IfcSIUnitName.PASCAL +radian = IfcSIUnitName.RADIAN +second = IfcSIUnitName.SECOND +siemens = IfcSIUnitName.SIEMENS +sievert = IfcSIUnitName.SIEVERT +square_metre = IfcSIUnitName.SQUARE_METRE +steradian = IfcSIUnitName.STERADIAN +tesla = IfcSIUnitName.TESLA +volt = IfcSIUnitName.VOLT +watt = IfcSIUnitName.WATT +weber = IfcSIUnitName.WEBER IfcSanitaryTerminalTypeEnum = enum_namespace() -bath = express_getattr(IfcSanitaryTerminalTypeEnum, 'BATH', INDETERMINATE) -bidet = express_getattr(IfcSanitaryTerminalTypeEnum, 'BIDET', INDETERMINATE) -cistern = express_getattr(IfcSanitaryTerminalTypeEnum, 'CISTERN', INDETERMINATE) -shower = express_getattr(IfcSanitaryTerminalTypeEnum, 'SHOWER', INDETERMINATE) -sink = express_getattr(IfcSanitaryTerminalTypeEnum, 'SINK', INDETERMINATE) -sanitaryfountain = express_getattr(IfcSanitaryTerminalTypeEnum, 'SANITARYFOUNTAIN', INDETERMINATE) -toiletpan = express_getattr(IfcSanitaryTerminalTypeEnum, 'TOILETPAN', INDETERMINATE) -urinal = express_getattr(IfcSanitaryTerminalTypeEnum, 'URINAL', INDETERMINATE) -washhandbasin = express_getattr(IfcSanitaryTerminalTypeEnum, 'WASHHANDBASIN', INDETERMINATE) -wcseat = express_getattr(IfcSanitaryTerminalTypeEnum, 'WCSEAT', INDETERMINATE) -userdefined = express_getattr(IfcSanitaryTerminalTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSanitaryTerminalTypeEnum, 'NOTDEFINED', INDETERMINATE) +bath = IfcSanitaryTerminalTypeEnum.BATH +bidet = IfcSanitaryTerminalTypeEnum.BIDET +cistern = IfcSanitaryTerminalTypeEnum.CISTERN +shower = IfcSanitaryTerminalTypeEnum.SHOWER +sink = IfcSanitaryTerminalTypeEnum.SINK +sanitaryfountain = IfcSanitaryTerminalTypeEnum.SANITARYFOUNTAIN +toiletpan = IfcSanitaryTerminalTypeEnum.TOILETPAN +urinal = IfcSanitaryTerminalTypeEnum.URINAL +washhandbasin = IfcSanitaryTerminalTypeEnum.WASHHANDBASIN +wcseat = IfcSanitaryTerminalTypeEnum.WCSEAT +userdefined = IfcSanitaryTerminalTypeEnum.USERDEFINED +notdefined = IfcSanitaryTerminalTypeEnum.NOTDEFINED IfcSectionTypeEnum = enum_namespace() -uniform = express_getattr(IfcSectionTypeEnum, 'UNIFORM', INDETERMINATE) -tapered = express_getattr(IfcSectionTypeEnum, 'TAPERED', INDETERMINATE) +uniform = IfcSectionTypeEnum.UNIFORM +tapered = IfcSectionTypeEnum.TAPERED IfcSensorTypeEnum = enum_namespace() -cosensor = express_getattr(IfcSensorTypeEnum, 'COSENSOR', INDETERMINATE) -co2sensor = express_getattr(IfcSensorTypeEnum, 'CO2SENSOR', INDETERMINATE) -conductancesensor = express_getattr(IfcSensorTypeEnum, 'CONDUCTANCESENSOR', INDETERMINATE) -contactsensor = express_getattr(IfcSensorTypeEnum, 'CONTACTSENSOR', INDETERMINATE) -firesensor = express_getattr(IfcSensorTypeEnum, 'FIRESENSOR', INDETERMINATE) -flowsensor = express_getattr(IfcSensorTypeEnum, 'FLOWSENSOR', INDETERMINATE) -frostsensor = express_getattr(IfcSensorTypeEnum, 'FROSTSENSOR', INDETERMINATE) -gassensor = express_getattr(IfcSensorTypeEnum, 'GASSENSOR', INDETERMINATE) -heatsensor = express_getattr(IfcSensorTypeEnum, 'HEATSENSOR', INDETERMINATE) -humiditysensor = express_getattr(IfcSensorTypeEnum, 'HUMIDITYSENSOR', INDETERMINATE) -identifiersensor = express_getattr(IfcSensorTypeEnum, 'IDENTIFIERSENSOR', INDETERMINATE) -ionconcentrationsensor = express_getattr(IfcSensorTypeEnum, 'IONCONCENTRATIONSENSOR', INDETERMINATE) -levelsensor = express_getattr(IfcSensorTypeEnum, 'LEVELSENSOR', INDETERMINATE) -lightsensor = express_getattr(IfcSensorTypeEnum, 'LIGHTSENSOR', INDETERMINATE) -moisturesensor = express_getattr(IfcSensorTypeEnum, 'MOISTURESENSOR', INDETERMINATE) -movementsensor = express_getattr(IfcSensorTypeEnum, 'MOVEMENTSENSOR', INDETERMINATE) -phsensor = express_getattr(IfcSensorTypeEnum, 'PHSENSOR', INDETERMINATE) -pressuresensor = express_getattr(IfcSensorTypeEnum, 'PRESSURESENSOR', INDETERMINATE) -radiationsensor = express_getattr(IfcSensorTypeEnum, 'RADIATIONSENSOR', INDETERMINATE) -radioactivitysensor = express_getattr(IfcSensorTypeEnum, 'RADIOACTIVITYSENSOR', INDETERMINATE) -smokesensor = express_getattr(IfcSensorTypeEnum, 'SMOKESENSOR', INDETERMINATE) -soundsensor = express_getattr(IfcSensorTypeEnum, 'SOUNDSENSOR', INDETERMINATE) -temperaturesensor = express_getattr(IfcSensorTypeEnum, 'TEMPERATURESENSOR', INDETERMINATE) -windsensor = express_getattr(IfcSensorTypeEnum, 'WINDSENSOR', INDETERMINATE) -userdefined = express_getattr(IfcSensorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSensorTypeEnum, 'NOTDEFINED', INDETERMINATE) +cosensor = IfcSensorTypeEnum.COSENSOR +co2sensor = IfcSensorTypeEnum.CO2SENSOR +conductancesensor = IfcSensorTypeEnum.CONDUCTANCESENSOR +contactsensor = IfcSensorTypeEnum.CONTACTSENSOR +firesensor = IfcSensorTypeEnum.FIRESENSOR +flowsensor = IfcSensorTypeEnum.FLOWSENSOR +frostsensor = IfcSensorTypeEnum.FROSTSENSOR +gassensor = IfcSensorTypeEnum.GASSENSOR +heatsensor = IfcSensorTypeEnum.HEATSENSOR +humiditysensor = IfcSensorTypeEnum.HUMIDITYSENSOR +identifiersensor = IfcSensorTypeEnum.IDENTIFIERSENSOR +ionconcentrationsensor = IfcSensorTypeEnum.IONCONCENTRATIONSENSOR +levelsensor = IfcSensorTypeEnum.LEVELSENSOR +lightsensor = IfcSensorTypeEnum.LIGHTSENSOR +moisturesensor = IfcSensorTypeEnum.MOISTURESENSOR +movementsensor = IfcSensorTypeEnum.MOVEMENTSENSOR +phsensor = IfcSensorTypeEnum.PHSENSOR +pressuresensor = IfcSensorTypeEnum.PRESSURESENSOR +radiationsensor = IfcSensorTypeEnum.RADIATIONSENSOR +radioactivitysensor = IfcSensorTypeEnum.RADIOACTIVITYSENSOR +smokesensor = IfcSensorTypeEnum.SMOKESENSOR +soundsensor = IfcSensorTypeEnum.SOUNDSENSOR +temperaturesensor = IfcSensorTypeEnum.TEMPERATURESENSOR +windsensor = IfcSensorTypeEnum.WINDSENSOR +userdefined = IfcSensorTypeEnum.USERDEFINED +notdefined = IfcSensorTypeEnum.NOTDEFINED IfcSequenceEnum = enum_namespace() -start_start = express_getattr(IfcSequenceEnum, 'START_START', INDETERMINATE) -start_finish = express_getattr(IfcSequenceEnum, 'START_FINISH', INDETERMINATE) -finish_start = express_getattr(IfcSequenceEnum, 'FINISH_START', INDETERMINATE) -finish_finish = express_getattr(IfcSequenceEnum, 'FINISH_FINISH', INDETERMINATE) -userdefined = express_getattr(IfcSequenceEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSequenceEnum, 'NOTDEFINED', INDETERMINATE) +start_start = IfcSequenceEnum.START_START +start_finish = IfcSequenceEnum.START_FINISH +finish_start = IfcSequenceEnum.FINISH_START +finish_finish = IfcSequenceEnum.FINISH_FINISH +userdefined = IfcSequenceEnum.USERDEFINED +notdefined = IfcSequenceEnum.NOTDEFINED IfcShadingDeviceTypeEnum = enum_namespace() -jalousie = express_getattr(IfcShadingDeviceTypeEnum, 'JALOUSIE', INDETERMINATE) -shutter = express_getattr(IfcShadingDeviceTypeEnum, 'SHUTTER', INDETERMINATE) -awning = express_getattr(IfcShadingDeviceTypeEnum, 'AWNING', INDETERMINATE) -userdefined = express_getattr(IfcShadingDeviceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcShadingDeviceTypeEnum, 'NOTDEFINED', INDETERMINATE) +jalousie = IfcShadingDeviceTypeEnum.JALOUSIE +shutter = IfcShadingDeviceTypeEnum.SHUTTER +awning = IfcShadingDeviceTypeEnum.AWNING +userdefined = IfcShadingDeviceTypeEnum.USERDEFINED +notdefined = IfcShadingDeviceTypeEnum.NOTDEFINED IfcSimplePropertyTemplateTypeEnum = enum_namespace() -p_singlevalue = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'P_SINGLEVALUE', INDETERMINATE) -p_enumeratedvalue = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'P_ENUMERATEDVALUE', INDETERMINATE) -p_boundedvalue = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'P_BOUNDEDVALUE', INDETERMINATE) -p_listvalue = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'P_LISTVALUE', INDETERMINATE) -p_tablevalue = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'P_TABLEVALUE', INDETERMINATE) -p_referencevalue = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'P_REFERENCEVALUE', INDETERMINATE) -q_length = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'Q_LENGTH', INDETERMINATE) -q_area = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'Q_AREA', INDETERMINATE) -q_volume = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'Q_VOLUME', INDETERMINATE) -q_count = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'Q_COUNT', INDETERMINATE) -q_weight = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'Q_WEIGHT', INDETERMINATE) -q_time = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'Q_TIME', INDETERMINATE) +p_singlevalue = IfcSimplePropertyTemplateTypeEnum.P_SINGLEVALUE +p_enumeratedvalue = IfcSimplePropertyTemplateTypeEnum.P_ENUMERATEDVALUE +p_boundedvalue = IfcSimplePropertyTemplateTypeEnum.P_BOUNDEDVALUE +p_listvalue = IfcSimplePropertyTemplateTypeEnum.P_LISTVALUE +p_tablevalue = IfcSimplePropertyTemplateTypeEnum.P_TABLEVALUE +p_referencevalue = IfcSimplePropertyTemplateTypeEnum.P_REFERENCEVALUE +q_length = IfcSimplePropertyTemplateTypeEnum.Q_LENGTH +q_area = IfcSimplePropertyTemplateTypeEnum.Q_AREA +q_volume = IfcSimplePropertyTemplateTypeEnum.Q_VOLUME +q_count = IfcSimplePropertyTemplateTypeEnum.Q_COUNT +q_weight = IfcSimplePropertyTemplateTypeEnum.Q_WEIGHT +q_time = IfcSimplePropertyTemplateTypeEnum.Q_TIME IfcSlabTypeEnum = enum_namespace() -floor = express_getattr(IfcSlabTypeEnum, 'FLOOR', INDETERMINATE) -roof = express_getattr(IfcSlabTypeEnum, 'ROOF', INDETERMINATE) -landing = express_getattr(IfcSlabTypeEnum, 'LANDING', INDETERMINATE) -baseslab = express_getattr(IfcSlabTypeEnum, 'BASESLAB', INDETERMINATE) -userdefined = express_getattr(IfcSlabTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSlabTypeEnum, 'NOTDEFINED', INDETERMINATE) +floor = IfcSlabTypeEnum.FLOOR +roof = IfcSlabTypeEnum.ROOF +landing = IfcSlabTypeEnum.LANDING +baseslab = IfcSlabTypeEnum.BASESLAB +userdefined = IfcSlabTypeEnum.USERDEFINED +notdefined = IfcSlabTypeEnum.NOTDEFINED IfcSolarDeviceTypeEnum = enum_namespace() -solarcollector = express_getattr(IfcSolarDeviceTypeEnum, 'SOLARCOLLECTOR', INDETERMINATE) -solarpanel = express_getattr(IfcSolarDeviceTypeEnum, 'SOLARPANEL', INDETERMINATE) -userdefined = express_getattr(IfcSolarDeviceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSolarDeviceTypeEnum, 'NOTDEFINED', INDETERMINATE) +solarcollector = IfcSolarDeviceTypeEnum.SOLARCOLLECTOR +solarpanel = IfcSolarDeviceTypeEnum.SOLARPANEL +userdefined = IfcSolarDeviceTypeEnum.USERDEFINED +notdefined = IfcSolarDeviceTypeEnum.NOTDEFINED IfcSpaceHeaterTypeEnum = enum_namespace() -convector = express_getattr(IfcSpaceHeaterTypeEnum, 'CONVECTOR', INDETERMINATE) -radiator = express_getattr(IfcSpaceHeaterTypeEnum, 'RADIATOR', INDETERMINATE) -userdefined = express_getattr(IfcSpaceHeaterTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSpaceHeaterTypeEnum, 'NOTDEFINED', INDETERMINATE) +convector = IfcSpaceHeaterTypeEnum.CONVECTOR +radiator = IfcSpaceHeaterTypeEnum.RADIATOR +userdefined = IfcSpaceHeaterTypeEnum.USERDEFINED +notdefined = IfcSpaceHeaterTypeEnum.NOTDEFINED IfcSpaceTypeEnum = enum_namespace() -space = express_getattr(IfcSpaceTypeEnum, 'SPACE', INDETERMINATE) -parking = express_getattr(IfcSpaceTypeEnum, 'PARKING', INDETERMINATE) -gfa = express_getattr(IfcSpaceTypeEnum, 'GFA', INDETERMINATE) -internal = express_getattr(IfcSpaceTypeEnum, 'INTERNAL', INDETERMINATE) -external = express_getattr(IfcSpaceTypeEnum, 'EXTERNAL', INDETERMINATE) -userdefined = express_getattr(IfcSpaceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSpaceTypeEnum, 'NOTDEFINED', INDETERMINATE) +space = IfcSpaceTypeEnum.SPACE +parking = IfcSpaceTypeEnum.PARKING +gfa = IfcSpaceTypeEnum.GFA +internal = IfcSpaceTypeEnum.INTERNAL +external = IfcSpaceTypeEnum.EXTERNAL +userdefined = IfcSpaceTypeEnum.USERDEFINED +notdefined = IfcSpaceTypeEnum.NOTDEFINED IfcSpatialZoneTypeEnum = enum_namespace() -construction = express_getattr(IfcSpatialZoneTypeEnum, 'CONSTRUCTION', INDETERMINATE) -firesafety = express_getattr(IfcSpatialZoneTypeEnum, 'FIRESAFETY', INDETERMINATE) -lighting = express_getattr(IfcSpatialZoneTypeEnum, 'LIGHTING', INDETERMINATE) -occupancy = express_getattr(IfcSpatialZoneTypeEnum, 'OCCUPANCY', INDETERMINATE) -security = express_getattr(IfcSpatialZoneTypeEnum, 'SECURITY', INDETERMINATE) -thermal = express_getattr(IfcSpatialZoneTypeEnum, 'THERMAL', INDETERMINATE) -transport = express_getattr(IfcSpatialZoneTypeEnum, 'TRANSPORT', INDETERMINATE) -ventilation = express_getattr(IfcSpatialZoneTypeEnum, 'VENTILATION', INDETERMINATE) -userdefined = express_getattr(IfcSpatialZoneTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSpatialZoneTypeEnum, 'NOTDEFINED', INDETERMINATE) +construction = IfcSpatialZoneTypeEnum.CONSTRUCTION +firesafety = IfcSpatialZoneTypeEnum.FIRESAFETY +lighting = IfcSpatialZoneTypeEnum.LIGHTING +occupancy = IfcSpatialZoneTypeEnum.OCCUPANCY +security = IfcSpatialZoneTypeEnum.SECURITY +thermal = IfcSpatialZoneTypeEnum.THERMAL +transport = IfcSpatialZoneTypeEnum.TRANSPORT +ventilation = IfcSpatialZoneTypeEnum.VENTILATION +userdefined = IfcSpatialZoneTypeEnum.USERDEFINED +notdefined = IfcSpatialZoneTypeEnum.NOTDEFINED IfcStackTerminalTypeEnum = enum_namespace() -birdcage = express_getattr(IfcStackTerminalTypeEnum, 'BIRDCAGE', INDETERMINATE) -cowl = express_getattr(IfcStackTerminalTypeEnum, 'COWL', INDETERMINATE) -rainwaterhopper = express_getattr(IfcStackTerminalTypeEnum, 'RAINWATERHOPPER', INDETERMINATE) -userdefined = express_getattr(IfcStackTerminalTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcStackTerminalTypeEnum, 'NOTDEFINED', INDETERMINATE) +birdcage = IfcStackTerminalTypeEnum.BIRDCAGE +cowl = IfcStackTerminalTypeEnum.COWL +rainwaterhopper = IfcStackTerminalTypeEnum.RAINWATERHOPPER +userdefined = IfcStackTerminalTypeEnum.USERDEFINED +notdefined = IfcStackTerminalTypeEnum.NOTDEFINED IfcStairFlightTypeEnum = enum_namespace() -straight = express_getattr(IfcStairFlightTypeEnum, 'STRAIGHT', INDETERMINATE) -winder = express_getattr(IfcStairFlightTypeEnum, 'WINDER', INDETERMINATE) -spiral = express_getattr(IfcStairFlightTypeEnum, 'SPIRAL', INDETERMINATE) -curved = express_getattr(IfcStairFlightTypeEnum, 'CURVED', INDETERMINATE) -freeform = express_getattr(IfcStairFlightTypeEnum, 'FREEFORM', INDETERMINATE) -userdefined = express_getattr(IfcStairFlightTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcStairFlightTypeEnum, 'NOTDEFINED', INDETERMINATE) +straight = IfcStairFlightTypeEnum.STRAIGHT +winder = IfcStairFlightTypeEnum.WINDER +spiral = IfcStairFlightTypeEnum.SPIRAL +curved = IfcStairFlightTypeEnum.CURVED +freeform = IfcStairFlightTypeEnum.FREEFORM +userdefined = IfcStairFlightTypeEnum.USERDEFINED +notdefined = IfcStairFlightTypeEnum.NOTDEFINED IfcStairTypeEnum = enum_namespace() -straight_run_stair = express_getattr(IfcStairTypeEnum, 'STRAIGHT_RUN_STAIR', INDETERMINATE) -two_straight_run_stair = express_getattr(IfcStairTypeEnum, 'TWO_STRAIGHT_RUN_STAIR', INDETERMINATE) -quarter_winding_stair = express_getattr(IfcStairTypeEnum, 'QUARTER_WINDING_STAIR', INDETERMINATE) -quarter_turn_stair = express_getattr(IfcStairTypeEnum, 'QUARTER_TURN_STAIR', INDETERMINATE) -half_winding_stair = express_getattr(IfcStairTypeEnum, 'HALF_WINDING_STAIR', INDETERMINATE) -half_turn_stair = express_getattr(IfcStairTypeEnum, 'HALF_TURN_STAIR', INDETERMINATE) -two_quarter_winding_stair = express_getattr(IfcStairTypeEnum, 'TWO_QUARTER_WINDING_STAIR', INDETERMINATE) -two_quarter_turn_stair = express_getattr(IfcStairTypeEnum, 'TWO_QUARTER_TURN_STAIR', INDETERMINATE) -three_quarter_winding_stair = express_getattr(IfcStairTypeEnum, 'THREE_QUARTER_WINDING_STAIR', INDETERMINATE) -three_quarter_turn_stair = express_getattr(IfcStairTypeEnum, 'THREE_QUARTER_TURN_STAIR', INDETERMINATE) -spiral_stair = express_getattr(IfcStairTypeEnum, 'SPIRAL_STAIR', INDETERMINATE) -double_return_stair = express_getattr(IfcStairTypeEnum, 'DOUBLE_RETURN_STAIR', INDETERMINATE) -curved_run_stair = express_getattr(IfcStairTypeEnum, 'CURVED_RUN_STAIR', INDETERMINATE) -two_curved_run_stair = express_getattr(IfcStairTypeEnum, 'TWO_CURVED_RUN_STAIR', INDETERMINATE) -userdefined = express_getattr(IfcStairTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcStairTypeEnum, 'NOTDEFINED', INDETERMINATE) +straight_run_stair = IfcStairTypeEnum.STRAIGHT_RUN_STAIR +two_straight_run_stair = IfcStairTypeEnum.TWO_STRAIGHT_RUN_STAIR +quarter_winding_stair = IfcStairTypeEnum.QUARTER_WINDING_STAIR +quarter_turn_stair = IfcStairTypeEnum.QUARTER_TURN_STAIR +half_winding_stair = IfcStairTypeEnum.HALF_WINDING_STAIR +half_turn_stair = IfcStairTypeEnum.HALF_TURN_STAIR +two_quarter_winding_stair = IfcStairTypeEnum.TWO_QUARTER_WINDING_STAIR +two_quarter_turn_stair = IfcStairTypeEnum.TWO_QUARTER_TURN_STAIR +three_quarter_winding_stair = IfcStairTypeEnum.THREE_QUARTER_WINDING_STAIR +three_quarter_turn_stair = IfcStairTypeEnum.THREE_QUARTER_TURN_STAIR +spiral_stair = IfcStairTypeEnum.SPIRAL_STAIR +double_return_stair = IfcStairTypeEnum.DOUBLE_RETURN_STAIR +curved_run_stair = IfcStairTypeEnum.CURVED_RUN_STAIR +two_curved_run_stair = IfcStairTypeEnum.TWO_CURVED_RUN_STAIR +userdefined = IfcStairTypeEnum.USERDEFINED +notdefined = IfcStairTypeEnum.NOTDEFINED IfcStateEnum = enum_namespace() -readwrite = express_getattr(IfcStateEnum, 'READWRITE', INDETERMINATE) -readonly = express_getattr(IfcStateEnum, 'READONLY', INDETERMINATE) -locked = express_getattr(IfcStateEnum, 'LOCKED', INDETERMINATE) -readwritelocked = express_getattr(IfcStateEnum, 'READWRITELOCKED', INDETERMINATE) -readonlylocked = express_getattr(IfcStateEnum, 'READONLYLOCKED', INDETERMINATE) +readwrite = IfcStateEnum.READWRITE +readonly = IfcStateEnum.READONLY +locked = IfcStateEnum.LOCKED +readwritelocked = IfcStateEnum.READWRITELOCKED +readonlylocked = IfcStateEnum.READONLYLOCKED IfcStructuralCurveActivityTypeEnum = enum_namespace() -const = express_getattr(IfcStructuralCurveActivityTypeEnum, 'CONST', INDETERMINATE) -linear = express_getattr(IfcStructuralCurveActivityTypeEnum, 'LINEAR', INDETERMINATE) -polygonal = express_getattr(IfcStructuralCurveActivityTypeEnum, 'POLYGONAL', INDETERMINATE) -equidistant = express_getattr(IfcStructuralCurveActivityTypeEnum, 'EQUIDISTANT', INDETERMINATE) -sinus = express_getattr(IfcStructuralCurveActivityTypeEnum, 'SINUS', INDETERMINATE) -parabola = express_getattr(IfcStructuralCurveActivityTypeEnum, 'PARABOLA', INDETERMINATE) -discrete = express_getattr(IfcStructuralCurveActivityTypeEnum, 'DISCRETE', INDETERMINATE) -userdefined = express_getattr(IfcStructuralCurveActivityTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcStructuralCurveActivityTypeEnum, 'NOTDEFINED', INDETERMINATE) +const = IfcStructuralCurveActivityTypeEnum.CONST +linear = IfcStructuralCurveActivityTypeEnum.LINEAR +polygonal = IfcStructuralCurveActivityTypeEnum.POLYGONAL +equidistant = IfcStructuralCurveActivityTypeEnum.EQUIDISTANT +sinus = IfcStructuralCurveActivityTypeEnum.SINUS +parabola = IfcStructuralCurveActivityTypeEnum.PARABOLA +discrete = IfcStructuralCurveActivityTypeEnum.DISCRETE +userdefined = IfcStructuralCurveActivityTypeEnum.USERDEFINED +notdefined = IfcStructuralCurveActivityTypeEnum.NOTDEFINED IfcStructuralCurveMemberTypeEnum = enum_namespace() -rigid_joined_member = express_getattr(IfcStructuralCurveMemberTypeEnum, 'RIGID_JOINED_MEMBER', INDETERMINATE) -pin_joined_member = express_getattr(IfcStructuralCurveMemberTypeEnum, 'PIN_JOINED_MEMBER', INDETERMINATE) -cable = express_getattr(IfcStructuralCurveMemberTypeEnum, 'CABLE', INDETERMINATE) -tension_member = express_getattr(IfcStructuralCurveMemberTypeEnum, 'TENSION_MEMBER', INDETERMINATE) -compression_member = express_getattr(IfcStructuralCurveMemberTypeEnum, 'COMPRESSION_MEMBER', INDETERMINATE) -userdefined = express_getattr(IfcStructuralCurveMemberTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcStructuralCurveMemberTypeEnum, 'NOTDEFINED', INDETERMINATE) +rigid_joined_member = IfcStructuralCurveMemberTypeEnum.RIGID_JOINED_MEMBER +pin_joined_member = IfcStructuralCurveMemberTypeEnum.PIN_JOINED_MEMBER +cable = IfcStructuralCurveMemberTypeEnum.CABLE +tension_member = IfcStructuralCurveMemberTypeEnum.TENSION_MEMBER +compression_member = IfcStructuralCurveMemberTypeEnum.COMPRESSION_MEMBER +userdefined = IfcStructuralCurveMemberTypeEnum.USERDEFINED +notdefined = IfcStructuralCurveMemberTypeEnum.NOTDEFINED IfcStructuralSurfaceActivityTypeEnum = enum_namespace() -const = express_getattr(IfcStructuralSurfaceActivityTypeEnum, 'CONST', INDETERMINATE) -bilinear = express_getattr(IfcStructuralSurfaceActivityTypeEnum, 'BILINEAR', INDETERMINATE) -discrete = express_getattr(IfcStructuralSurfaceActivityTypeEnum, 'DISCRETE', INDETERMINATE) -isocontour = express_getattr(IfcStructuralSurfaceActivityTypeEnum, 'ISOCONTOUR', INDETERMINATE) -userdefined = express_getattr(IfcStructuralSurfaceActivityTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcStructuralSurfaceActivityTypeEnum, 'NOTDEFINED', INDETERMINATE) +const = IfcStructuralSurfaceActivityTypeEnum.CONST +bilinear = IfcStructuralSurfaceActivityTypeEnum.BILINEAR +discrete = IfcStructuralSurfaceActivityTypeEnum.DISCRETE +isocontour = IfcStructuralSurfaceActivityTypeEnum.ISOCONTOUR +userdefined = IfcStructuralSurfaceActivityTypeEnum.USERDEFINED +notdefined = IfcStructuralSurfaceActivityTypeEnum.NOTDEFINED IfcStructuralSurfaceMemberTypeEnum = enum_namespace() -bending_element = express_getattr(IfcStructuralSurfaceMemberTypeEnum, 'BENDING_ELEMENT', INDETERMINATE) -membrane_element = express_getattr(IfcStructuralSurfaceMemberTypeEnum, 'MEMBRANE_ELEMENT', INDETERMINATE) -shell = express_getattr(IfcStructuralSurfaceMemberTypeEnum, 'SHELL', INDETERMINATE) -userdefined = express_getattr(IfcStructuralSurfaceMemberTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcStructuralSurfaceMemberTypeEnum, 'NOTDEFINED', INDETERMINATE) +bending_element = IfcStructuralSurfaceMemberTypeEnum.BENDING_ELEMENT +membrane_element = IfcStructuralSurfaceMemberTypeEnum.MEMBRANE_ELEMENT +shell = IfcStructuralSurfaceMemberTypeEnum.SHELL +userdefined = IfcStructuralSurfaceMemberTypeEnum.USERDEFINED +notdefined = IfcStructuralSurfaceMemberTypeEnum.NOTDEFINED IfcSubContractResourceTypeEnum = enum_namespace() -purchase = express_getattr(IfcSubContractResourceTypeEnum, 'PURCHASE', INDETERMINATE) -work = express_getattr(IfcSubContractResourceTypeEnum, 'WORK', INDETERMINATE) -userdefined = express_getattr(IfcSubContractResourceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSubContractResourceTypeEnum, 'NOTDEFINED', INDETERMINATE) +purchase = IfcSubContractResourceTypeEnum.PURCHASE +work = IfcSubContractResourceTypeEnum.WORK +userdefined = IfcSubContractResourceTypeEnum.USERDEFINED +notdefined = IfcSubContractResourceTypeEnum.NOTDEFINED IfcSurfaceFeatureTypeEnum = enum_namespace() -mark = express_getattr(IfcSurfaceFeatureTypeEnum, 'MARK', INDETERMINATE) -tag = express_getattr(IfcSurfaceFeatureTypeEnum, 'TAG', INDETERMINATE) -treatment = express_getattr(IfcSurfaceFeatureTypeEnum, 'TREATMENT', INDETERMINATE) -userdefined = express_getattr(IfcSurfaceFeatureTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSurfaceFeatureTypeEnum, 'NOTDEFINED', INDETERMINATE) +mark = IfcSurfaceFeatureTypeEnum.MARK +tag = IfcSurfaceFeatureTypeEnum.TAG +treatment = IfcSurfaceFeatureTypeEnum.TREATMENT +userdefined = IfcSurfaceFeatureTypeEnum.USERDEFINED +notdefined = IfcSurfaceFeatureTypeEnum.NOTDEFINED IfcSurfaceSide = enum_namespace() -positive = express_getattr(IfcSurfaceSide, 'POSITIVE', INDETERMINATE) -negative = express_getattr(IfcSurfaceSide, 'NEGATIVE', INDETERMINATE) -both = express_getattr(IfcSurfaceSide, 'BOTH', INDETERMINATE) +positive = IfcSurfaceSide.POSITIVE +negative = IfcSurfaceSide.NEGATIVE +both = IfcSurfaceSide.BOTH IfcSwitchingDeviceTypeEnum = enum_namespace() -contactor = express_getattr(IfcSwitchingDeviceTypeEnum, 'CONTACTOR', INDETERMINATE) -dimmerswitch = express_getattr(IfcSwitchingDeviceTypeEnum, 'DIMMERSWITCH', INDETERMINATE) -emergencystop = express_getattr(IfcSwitchingDeviceTypeEnum, 'EMERGENCYSTOP', INDETERMINATE) -keypad = express_getattr(IfcSwitchingDeviceTypeEnum, 'KEYPAD', INDETERMINATE) -momentaryswitch = express_getattr(IfcSwitchingDeviceTypeEnum, 'MOMENTARYSWITCH', INDETERMINATE) -selectorswitch = express_getattr(IfcSwitchingDeviceTypeEnum, 'SELECTORSWITCH', INDETERMINATE) -starter = express_getattr(IfcSwitchingDeviceTypeEnum, 'STARTER', INDETERMINATE) -switchdisconnector = express_getattr(IfcSwitchingDeviceTypeEnum, 'SWITCHDISCONNECTOR', INDETERMINATE) -toggleswitch = express_getattr(IfcSwitchingDeviceTypeEnum, 'TOGGLESWITCH', INDETERMINATE) -userdefined = express_getattr(IfcSwitchingDeviceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSwitchingDeviceTypeEnum, 'NOTDEFINED', INDETERMINATE) +contactor = IfcSwitchingDeviceTypeEnum.CONTACTOR +dimmerswitch = IfcSwitchingDeviceTypeEnum.DIMMERSWITCH +emergencystop = IfcSwitchingDeviceTypeEnum.EMERGENCYSTOP +keypad = IfcSwitchingDeviceTypeEnum.KEYPAD +momentaryswitch = IfcSwitchingDeviceTypeEnum.MOMENTARYSWITCH +selectorswitch = IfcSwitchingDeviceTypeEnum.SELECTORSWITCH +starter = IfcSwitchingDeviceTypeEnum.STARTER +switchdisconnector = IfcSwitchingDeviceTypeEnum.SWITCHDISCONNECTOR +toggleswitch = IfcSwitchingDeviceTypeEnum.TOGGLESWITCH +userdefined = IfcSwitchingDeviceTypeEnum.USERDEFINED +notdefined = IfcSwitchingDeviceTypeEnum.NOTDEFINED IfcSystemFurnitureElementTypeEnum = enum_namespace() -panel = express_getattr(IfcSystemFurnitureElementTypeEnum, 'PANEL', INDETERMINATE) -worksurface = express_getattr(IfcSystemFurnitureElementTypeEnum, 'WORKSURFACE', INDETERMINATE) -userdefined = express_getattr(IfcSystemFurnitureElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSystemFurnitureElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +panel = IfcSystemFurnitureElementTypeEnum.PANEL +worksurface = IfcSystemFurnitureElementTypeEnum.WORKSURFACE +userdefined = IfcSystemFurnitureElementTypeEnum.USERDEFINED +notdefined = IfcSystemFurnitureElementTypeEnum.NOTDEFINED IfcTankTypeEnum = enum_namespace() -basin = express_getattr(IfcTankTypeEnum, 'BASIN', INDETERMINATE) -breakpressure = express_getattr(IfcTankTypeEnum, 'BREAKPRESSURE', INDETERMINATE) -expansion = express_getattr(IfcTankTypeEnum, 'EXPANSION', INDETERMINATE) -feedandexpansion = express_getattr(IfcTankTypeEnum, 'FEEDANDEXPANSION', INDETERMINATE) -pressurevessel = express_getattr(IfcTankTypeEnum, 'PRESSUREVESSEL', INDETERMINATE) -storage = express_getattr(IfcTankTypeEnum, 'STORAGE', INDETERMINATE) -vessel = express_getattr(IfcTankTypeEnum, 'VESSEL', INDETERMINATE) -userdefined = express_getattr(IfcTankTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTankTypeEnum, 'NOTDEFINED', INDETERMINATE) +basin = IfcTankTypeEnum.BASIN +breakpressure = IfcTankTypeEnum.BREAKPRESSURE +expansion = IfcTankTypeEnum.EXPANSION +feedandexpansion = IfcTankTypeEnum.FEEDANDEXPANSION +pressurevessel = IfcTankTypeEnum.PRESSUREVESSEL +storage = IfcTankTypeEnum.STORAGE +vessel = IfcTankTypeEnum.VESSEL +userdefined = IfcTankTypeEnum.USERDEFINED +notdefined = IfcTankTypeEnum.NOTDEFINED IfcTaskDurationEnum = enum_namespace() -elapsedtime = express_getattr(IfcTaskDurationEnum, 'ELAPSEDTIME', INDETERMINATE) -worktime = express_getattr(IfcTaskDurationEnum, 'WORKTIME', INDETERMINATE) -notdefined = express_getattr(IfcTaskDurationEnum, 'NOTDEFINED', INDETERMINATE) +elapsedtime = IfcTaskDurationEnum.ELAPSEDTIME +worktime = IfcTaskDurationEnum.WORKTIME +notdefined = IfcTaskDurationEnum.NOTDEFINED IfcTaskTypeEnum = enum_namespace() -attendance = express_getattr(IfcTaskTypeEnum, 'ATTENDANCE', INDETERMINATE) -construction = express_getattr(IfcTaskTypeEnum, 'CONSTRUCTION', INDETERMINATE) -demolition = express_getattr(IfcTaskTypeEnum, 'DEMOLITION', INDETERMINATE) -dismantle = express_getattr(IfcTaskTypeEnum, 'DISMANTLE', INDETERMINATE) -disposal = express_getattr(IfcTaskTypeEnum, 'DISPOSAL', INDETERMINATE) -installation = express_getattr(IfcTaskTypeEnum, 'INSTALLATION', INDETERMINATE) -logistic = express_getattr(IfcTaskTypeEnum, 'LOGISTIC', INDETERMINATE) -maintenance = express_getattr(IfcTaskTypeEnum, 'MAINTENANCE', INDETERMINATE) -move = express_getattr(IfcTaskTypeEnum, 'MOVE', INDETERMINATE) -operation = express_getattr(IfcTaskTypeEnum, 'OPERATION', INDETERMINATE) -removal = express_getattr(IfcTaskTypeEnum, 'REMOVAL', INDETERMINATE) -renovation = express_getattr(IfcTaskTypeEnum, 'RENOVATION', INDETERMINATE) -userdefined = express_getattr(IfcTaskTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTaskTypeEnum, 'NOTDEFINED', INDETERMINATE) +attendance = IfcTaskTypeEnum.ATTENDANCE +construction = IfcTaskTypeEnum.CONSTRUCTION +demolition = IfcTaskTypeEnum.DEMOLITION +dismantle = IfcTaskTypeEnum.DISMANTLE +disposal = IfcTaskTypeEnum.DISPOSAL +installation = IfcTaskTypeEnum.INSTALLATION +logistic = IfcTaskTypeEnum.LOGISTIC +maintenance = IfcTaskTypeEnum.MAINTENANCE +move = IfcTaskTypeEnum.MOVE +operation = IfcTaskTypeEnum.OPERATION +removal = IfcTaskTypeEnum.REMOVAL +renovation = IfcTaskTypeEnum.RENOVATION +userdefined = IfcTaskTypeEnum.USERDEFINED +notdefined = IfcTaskTypeEnum.NOTDEFINED IfcTendonAnchorTypeEnum = enum_namespace() -coupler = express_getattr(IfcTendonAnchorTypeEnum, 'COUPLER', INDETERMINATE) -fixed_end = express_getattr(IfcTendonAnchorTypeEnum, 'FIXED_END', INDETERMINATE) -tensioning_end = express_getattr(IfcTendonAnchorTypeEnum, 'TENSIONING_END', INDETERMINATE) -userdefined = express_getattr(IfcTendonAnchorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTendonAnchorTypeEnum, 'NOTDEFINED', INDETERMINATE) +coupler = IfcTendonAnchorTypeEnum.COUPLER +fixed_end = IfcTendonAnchorTypeEnum.FIXED_END +tensioning_end = IfcTendonAnchorTypeEnum.TENSIONING_END +userdefined = IfcTendonAnchorTypeEnum.USERDEFINED +notdefined = IfcTendonAnchorTypeEnum.NOTDEFINED IfcTendonTypeEnum = enum_namespace() -bar = express_getattr(IfcTendonTypeEnum, 'BAR', INDETERMINATE) -coated = express_getattr(IfcTendonTypeEnum, 'COATED', INDETERMINATE) -strand = express_getattr(IfcTendonTypeEnum, 'STRAND', INDETERMINATE) -wire = express_getattr(IfcTendonTypeEnum, 'WIRE', INDETERMINATE) -userdefined = express_getattr(IfcTendonTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTendonTypeEnum, 'NOTDEFINED', INDETERMINATE) +bar = IfcTendonTypeEnum.BAR +coated = IfcTendonTypeEnum.COATED +strand = IfcTendonTypeEnum.STRAND +wire = IfcTendonTypeEnum.WIRE +userdefined = IfcTendonTypeEnum.USERDEFINED +notdefined = IfcTendonTypeEnum.NOTDEFINED IfcTextPath = enum_namespace() -left = express_getattr(IfcTextPath, 'LEFT', INDETERMINATE) -right = express_getattr(IfcTextPath, 'RIGHT', INDETERMINATE) -up = express_getattr(IfcTextPath, 'UP', INDETERMINATE) -down = express_getattr(IfcTextPath, 'DOWN', INDETERMINATE) +left = IfcTextPath.LEFT +right = IfcTextPath.RIGHT +up = IfcTextPath.UP +down = IfcTextPath.DOWN IfcTimeSeriesDataTypeEnum = enum_namespace() -continuous = express_getattr(IfcTimeSeriesDataTypeEnum, 'CONTINUOUS', INDETERMINATE) -discrete = express_getattr(IfcTimeSeriesDataTypeEnum, 'DISCRETE', INDETERMINATE) -discretebinary = express_getattr(IfcTimeSeriesDataTypeEnum, 'DISCRETEBINARY', INDETERMINATE) -piecewisebinary = express_getattr(IfcTimeSeriesDataTypeEnum, 'PIECEWISEBINARY', INDETERMINATE) -piecewiseconstant = express_getattr(IfcTimeSeriesDataTypeEnum, 'PIECEWISECONSTANT', INDETERMINATE) -piecewisecontinuous = express_getattr(IfcTimeSeriesDataTypeEnum, 'PIECEWISECONTINUOUS', INDETERMINATE) -notdefined = express_getattr(IfcTimeSeriesDataTypeEnum, 'NOTDEFINED', INDETERMINATE) +continuous = IfcTimeSeriesDataTypeEnum.CONTINUOUS +discrete = IfcTimeSeriesDataTypeEnum.DISCRETE +discretebinary = IfcTimeSeriesDataTypeEnum.DISCRETEBINARY +piecewisebinary = IfcTimeSeriesDataTypeEnum.PIECEWISEBINARY +piecewiseconstant = IfcTimeSeriesDataTypeEnum.PIECEWISECONSTANT +piecewisecontinuous = IfcTimeSeriesDataTypeEnum.PIECEWISECONTINUOUS +notdefined = IfcTimeSeriesDataTypeEnum.NOTDEFINED IfcTransformerTypeEnum = enum_namespace() -current = express_getattr(IfcTransformerTypeEnum, 'CURRENT', INDETERMINATE) -frequency = express_getattr(IfcTransformerTypeEnum, 'FREQUENCY', INDETERMINATE) -inverter = express_getattr(IfcTransformerTypeEnum, 'INVERTER', INDETERMINATE) -rectifier = express_getattr(IfcTransformerTypeEnum, 'RECTIFIER', INDETERMINATE) -voltage = express_getattr(IfcTransformerTypeEnum, 'VOLTAGE', INDETERMINATE) -userdefined = express_getattr(IfcTransformerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTransformerTypeEnum, 'NOTDEFINED', INDETERMINATE) +current = IfcTransformerTypeEnum.CURRENT +frequency = IfcTransformerTypeEnum.FREQUENCY +inverter = IfcTransformerTypeEnum.INVERTER +rectifier = IfcTransformerTypeEnum.RECTIFIER +voltage = IfcTransformerTypeEnum.VOLTAGE +userdefined = IfcTransformerTypeEnum.USERDEFINED +notdefined = IfcTransformerTypeEnum.NOTDEFINED IfcTransitionCode = enum_namespace() -discontinuous = express_getattr(IfcTransitionCode, 'DISCONTINUOUS', INDETERMINATE) -continuous = express_getattr(IfcTransitionCode, 'CONTINUOUS', INDETERMINATE) -contsamegradient = express_getattr(IfcTransitionCode, 'CONTSAMEGRADIENT', INDETERMINATE) -contsamegradientsamecurvature = express_getattr(IfcTransitionCode, 'CONTSAMEGRADIENTSAMECURVATURE', INDETERMINATE) +discontinuous = IfcTransitionCode.DISCONTINUOUS +continuous = IfcTransitionCode.CONTINUOUS +contsamegradient = IfcTransitionCode.CONTSAMEGRADIENT +contsamegradientsamecurvature = IfcTransitionCode.CONTSAMEGRADIENTSAMECURVATURE IfcTransportElementTypeEnum = enum_namespace() -elevator = express_getattr(IfcTransportElementTypeEnum, 'ELEVATOR', INDETERMINATE) -escalator = express_getattr(IfcTransportElementTypeEnum, 'ESCALATOR', INDETERMINATE) -movingwalkway = express_getattr(IfcTransportElementTypeEnum, 'MOVINGWALKWAY', INDETERMINATE) -craneway = express_getattr(IfcTransportElementTypeEnum, 'CRANEWAY', INDETERMINATE) -liftinggear = express_getattr(IfcTransportElementTypeEnum, 'LIFTINGGEAR', INDETERMINATE) -userdefined = express_getattr(IfcTransportElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTransportElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +elevator = IfcTransportElementTypeEnum.ELEVATOR +escalator = IfcTransportElementTypeEnum.ESCALATOR +movingwalkway = IfcTransportElementTypeEnum.MOVINGWALKWAY +craneway = IfcTransportElementTypeEnum.CRANEWAY +liftinggear = IfcTransportElementTypeEnum.LIFTINGGEAR +userdefined = IfcTransportElementTypeEnum.USERDEFINED +notdefined = IfcTransportElementTypeEnum.NOTDEFINED IfcTrimmingPreference = enum_namespace() -cartesian = express_getattr(IfcTrimmingPreference, 'CARTESIAN', INDETERMINATE) -parameter = express_getattr(IfcTrimmingPreference, 'PARAMETER', INDETERMINATE) -unspecified = express_getattr(IfcTrimmingPreference, 'UNSPECIFIED', INDETERMINATE) +cartesian = IfcTrimmingPreference.CARTESIAN +parameter = IfcTrimmingPreference.PARAMETER +unspecified = IfcTrimmingPreference.UNSPECIFIED IfcTubeBundleTypeEnum = enum_namespace() -finned = express_getattr(IfcTubeBundleTypeEnum, 'FINNED', INDETERMINATE) -userdefined = express_getattr(IfcTubeBundleTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTubeBundleTypeEnum, 'NOTDEFINED', INDETERMINATE) +finned = IfcTubeBundleTypeEnum.FINNED +userdefined = IfcTubeBundleTypeEnum.USERDEFINED +notdefined = IfcTubeBundleTypeEnum.NOTDEFINED IfcUnitEnum = enum_namespace() -absorbeddoseunit = express_getattr(IfcUnitEnum, 'ABSORBEDDOSEUNIT', INDETERMINATE) -amountofsubstanceunit = express_getattr(IfcUnitEnum, 'AMOUNTOFSUBSTANCEUNIT', INDETERMINATE) -areaunit = express_getattr(IfcUnitEnum, 'AREAUNIT', INDETERMINATE) -doseequivalentunit = express_getattr(IfcUnitEnum, 'DOSEEQUIVALENTUNIT', INDETERMINATE) -electriccapacitanceunit = express_getattr(IfcUnitEnum, 'ELECTRICCAPACITANCEUNIT', INDETERMINATE) -electricchargeunit = express_getattr(IfcUnitEnum, 'ELECTRICCHARGEUNIT', INDETERMINATE) -electricconductanceunit = express_getattr(IfcUnitEnum, 'ELECTRICCONDUCTANCEUNIT', INDETERMINATE) -electriccurrentunit = express_getattr(IfcUnitEnum, 'ELECTRICCURRENTUNIT', INDETERMINATE) -electricresistanceunit = express_getattr(IfcUnitEnum, 'ELECTRICRESISTANCEUNIT', INDETERMINATE) -electricvoltageunit = express_getattr(IfcUnitEnum, 'ELECTRICVOLTAGEUNIT', INDETERMINATE) -energyunit = express_getattr(IfcUnitEnum, 'ENERGYUNIT', INDETERMINATE) -forceunit = express_getattr(IfcUnitEnum, 'FORCEUNIT', INDETERMINATE) -frequencyunit = express_getattr(IfcUnitEnum, 'FREQUENCYUNIT', INDETERMINATE) -illuminanceunit = express_getattr(IfcUnitEnum, 'ILLUMINANCEUNIT', INDETERMINATE) -inductanceunit = express_getattr(IfcUnitEnum, 'INDUCTANCEUNIT', INDETERMINATE) -lengthunit = express_getattr(IfcUnitEnum, 'LENGTHUNIT', INDETERMINATE) -luminousfluxunit = express_getattr(IfcUnitEnum, 'LUMINOUSFLUXUNIT', INDETERMINATE) -luminousintensityunit = express_getattr(IfcUnitEnum, 'LUMINOUSINTENSITYUNIT', INDETERMINATE) -magneticfluxdensityunit = express_getattr(IfcUnitEnum, 'MAGNETICFLUXDENSITYUNIT', INDETERMINATE) -magneticfluxunit = express_getattr(IfcUnitEnum, 'MAGNETICFLUXUNIT', INDETERMINATE) -massunit = express_getattr(IfcUnitEnum, 'MASSUNIT', INDETERMINATE) -planeangleunit = express_getattr(IfcUnitEnum, 'PLANEANGLEUNIT', INDETERMINATE) -powerunit = express_getattr(IfcUnitEnum, 'POWERUNIT', INDETERMINATE) -pressureunit = express_getattr(IfcUnitEnum, 'PRESSUREUNIT', INDETERMINATE) -radioactivityunit = express_getattr(IfcUnitEnum, 'RADIOACTIVITYUNIT', INDETERMINATE) -solidangleunit = express_getattr(IfcUnitEnum, 'SOLIDANGLEUNIT', INDETERMINATE) -thermodynamictemperatureunit = express_getattr(IfcUnitEnum, 'THERMODYNAMICTEMPERATUREUNIT', INDETERMINATE) -timeunit = express_getattr(IfcUnitEnum, 'TIMEUNIT', INDETERMINATE) -volumeunit = express_getattr(IfcUnitEnum, 'VOLUMEUNIT', INDETERMINATE) -userdefined = express_getattr(IfcUnitEnum, 'USERDEFINED', INDETERMINATE) +absorbeddoseunit = IfcUnitEnum.ABSORBEDDOSEUNIT +amountofsubstanceunit = IfcUnitEnum.AMOUNTOFSUBSTANCEUNIT +areaunit = IfcUnitEnum.AREAUNIT +doseequivalentunit = IfcUnitEnum.DOSEEQUIVALENTUNIT +electriccapacitanceunit = IfcUnitEnum.ELECTRICCAPACITANCEUNIT +electricchargeunit = IfcUnitEnum.ELECTRICCHARGEUNIT +electricconductanceunit = IfcUnitEnum.ELECTRICCONDUCTANCEUNIT +electriccurrentunit = IfcUnitEnum.ELECTRICCURRENTUNIT +electricresistanceunit = IfcUnitEnum.ELECTRICRESISTANCEUNIT +electricvoltageunit = IfcUnitEnum.ELECTRICVOLTAGEUNIT +energyunit = IfcUnitEnum.ENERGYUNIT +forceunit = IfcUnitEnum.FORCEUNIT +frequencyunit = IfcUnitEnum.FREQUENCYUNIT +illuminanceunit = IfcUnitEnum.ILLUMINANCEUNIT +inductanceunit = IfcUnitEnum.INDUCTANCEUNIT +lengthunit = IfcUnitEnum.LENGTHUNIT +luminousfluxunit = IfcUnitEnum.LUMINOUSFLUXUNIT +luminousintensityunit = IfcUnitEnum.LUMINOUSINTENSITYUNIT +magneticfluxdensityunit = IfcUnitEnum.MAGNETICFLUXDENSITYUNIT +magneticfluxunit = IfcUnitEnum.MAGNETICFLUXUNIT +massunit = IfcUnitEnum.MASSUNIT +planeangleunit = IfcUnitEnum.PLANEANGLEUNIT +powerunit = IfcUnitEnum.POWERUNIT +pressureunit = IfcUnitEnum.PRESSUREUNIT +radioactivityunit = IfcUnitEnum.RADIOACTIVITYUNIT +solidangleunit = IfcUnitEnum.SOLIDANGLEUNIT +thermodynamictemperatureunit = IfcUnitEnum.THERMODYNAMICTEMPERATUREUNIT +timeunit = IfcUnitEnum.TIMEUNIT +volumeunit = IfcUnitEnum.VOLUMEUNIT +userdefined = IfcUnitEnum.USERDEFINED IfcUnitaryControlElementTypeEnum = enum_namespace() -alarmpanel = express_getattr(IfcUnitaryControlElementTypeEnum, 'ALARMPANEL', INDETERMINATE) -controlpanel = express_getattr(IfcUnitaryControlElementTypeEnum, 'CONTROLPANEL', INDETERMINATE) -gasdetectionpanel = express_getattr(IfcUnitaryControlElementTypeEnum, 'GASDETECTIONPANEL', INDETERMINATE) -indicatorpanel = express_getattr(IfcUnitaryControlElementTypeEnum, 'INDICATORPANEL', INDETERMINATE) -mimicpanel = express_getattr(IfcUnitaryControlElementTypeEnum, 'MIMICPANEL', INDETERMINATE) -humidistat = express_getattr(IfcUnitaryControlElementTypeEnum, 'HUMIDISTAT', INDETERMINATE) -thermostat = express_getattr(IfcUnitaryControlElementTypeEnum, 'THERMOSTAT', INDETERMINATE) -weatherstation = express_getattr(IfcUnitaryControlElementTypeEnum, 'WEATHERSTATION', INDETERMINATE) -userdefined = express_getattr(IfcUnitaryControlElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcUnitaryControlElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +alarmpanel = IfcUnitaryControlElementTypeEnum.ALARMPANEL +controlpanel = IfcUnitaryControlElementTypeEnum.CONTROLPANEL +gasdetectionpanel = IfcUnitaryControlElementTypeEnum.GASDETECTIONPANEL +indicatorpanel = IfcUnitaryControlElementTypeEnum.INDICATORPANEL +mimicpanel = IfcUnitaryControlElementTypeEnum.MIMICPANEL +humidistat = IfcUnitaryControlElementTypeEnum.HUMIDISTAT +thermostat = IfcUnitaryControlElementTypeEnum.THERMOSTAT +weatherstation = IfcUnitaryControlElementTypeEnum.WEATHERSTATION +userdefined = IfcUnitaryControlElementTypeEnum.USERDEFINED +notdefined = IfcUnitaryControlElementTypeEnum.NOTDEFINED IfcUnitaryEquipmentTypeEnum = enum_namespace() -airhandler = express_getattr(IfcUnitaryEquipmentTypeEnum, 'AIRHANDLER', INDETERMINATE) -airconditioningunit = express_getattr(IfcUnitaryEquipmentTypeEnum, 'AIRCONDITIONINGUNIT', INDETERMINATE) -dehumidifier = express_getattr(IfcUnitaryEquipmentTypeEnum, 'DEHUMIDIFIER', INDETERMINATE) -splitsystem = express_getattr(IfcUnitaryEquipmentTypeEnum, 'SPLITSYSTEM', INDETERMINATE) -rooftopunit = express_getattr(IfcUnitaryEquipmentTypeEnum, 'ROOFTOPUNIT', INDETERMINATE) -userdefined = express_getattr(IfcUnitaryEquipmentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcUnitaryEquipmentTypeEnum, 'NOTDEFINED', INDETERMINATE) +airhandler = IfcUnitaryEquipmentTypeEnum.AIRHANDLER +airconditioningunit = IfcUnitaryEquipmentTypeEnum.AIRCONDITIONINGUNIT +dehumidifier = IfcUnitaryEquipmentTypeEnum.DEHUMIDIFIER +splitsystem = IfcUnitaryEquipmentTypeEnum.SPLITSYSTEM +rooftopunit = IfcUnitaryEquipmentTypeEnum.ROOFTOPUNIT +userdefined = IfcUnitaryEquipmentTypeEnum.USERDEFINED +notdefined = IfcUnitaryEquipmentTypeEnum.NOTDEFINED IfcValveTypeEnum = enum_namespace() -airrelease = express_getattr(IfcValveTypeEnum, 'AIRRELEASE', INDETERMINATE) -antivacuum = express_getattr(IfcValveTypeEnum, 'ANTIVACUUM', INDETERMINATE) -changeover = express_getattr(IfcValveTypeEnum, 'CHANGEOVER', INDETERMINATE) -check = express_getattr(IfcValveTypeEnum, 'CHECK', INDETERMINATE) -commissioning = express_getattr(IfcValveTypeEnum, 'COMMISSIONING', INDETERMINATE) -diverting = express_getattr(IfcValveTypeEnum, 'DIVERTING', INDETERMINATE) -drawoffcock = express_getattr(IfcValveTypeEnum, 'DRAWOFFCOCK', INDETERMINATE) -doublecheck = express_getattr(IfcValveTypeEnum, 'DOUBLECHECK', INDETERMINATE) -doubleregulating = express_getattr(IfcValveTypeEnum, 'DOUBLEREGULATING', INDETERMINATE) -faucet = express_getattr(IfcValveTypeEnum, 'FAUCET', INDETERMINATE) -flushing = express_getattr(IfcValveTypeEnum, 'FLUSHING', INDETERMINATE) -gascock = express_getattr(IfcValveTypeEnum, 'GASCOCK', INDETERMINATE) -gastap = express_getattr(IfcValveTypeEnum, 'GASTAP', INDETERMINATE) -isolating = express_getattr(IfcValveTypeEnum, 'ISOLATING', INDETERMINATE) -mixing = express_getattr(IfcValveTypeEnum, 'MIXING', INDETERMINATE) -pressurereducing = express_getattr(IfcValveTypeEnum, 'PRESSUREREDUCING', INDETERMINATE) -pressurerelief = express_getattr(IfcValveTypeEnum, 'PRESSURERELIEF', INDETERMINATE) -regulating = express_getattr(IfcValveTypeEnum, 'REGULATING', INDETERMINATE) -safetycutoff = express_getattr(IfcValveTypeEnum, 'SAFETYCUTOFF', INDETERMINATE) -steamtrap = express_getattr(IfcValveTypeEnum, 'STEAMTRAP', INDETERMINATE) -stopcock = express_getattr(IfcValveTypeEnum, 'STOPCOCK', INDETERMINATE) -userdefined = express_getattr(IfcValveTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcValveTypeEnum, 'NOTDEFINED', INDETERMINATE) +airrelease = IfcValveTypeEnum.AIRRELEASE +antivacuum = IfcValveTypeEnum.ANTIVACUUM +changeover = IfcValveTypeEnum.CHANGEOVER +check = IfcValveTypeEnum.CHECK +commissioning = IfcValveTypeEnum.COMMISSIONING +diverting = IfcValveTypeEnum.DIVERTING +drawoffcock = IfcValveTypeEnum.DRAWOFFCOCK +doublecheck = IfcValveTypeEnum.DOUBLECHECK +doubleregulating = IfcValveTypeEnum.DOUBLEREGULATING +faucet = IfcValveTypeEnum.FAUCET +flushing = IfcValveTypeEnum.FLUSHING +gascock = IfcValveTypeEnum.GASCOCK +gastap = IfcValveTypeEnum.GASTAP +isolating = IfcValveTypeEnum.ISOLATING +mixing = IfcValveTypeEnum.MIXING +pressurereducing = IfcValveTypeEnum.PRESSUREREDUCING +pressurerelief = IfcValveTypeEnum.PRESSURERELIEF +regulating = IfcValveTypeEnum.REGULATING +safetycutoff = IfcValveTypeEnum.SAFETYCUTOFF +steamtrap = IfcValveTypeEnum.STEAMTRAP +stopcock = IfcValveTypeEnum.STOPCOCK +userdefined = IfcValveTypeEnum.USERDEFINED +notdefined = IfcValveTypeEnum.NOTDEFINED IfcVibrationIsolatorTypeEnum = enum_namespace() -compression = express_getattr(IfcVibrationIsolatorTypeEnum, 'COMPRESSION', INDETERMINATE) -spring = express_getattr(IfcVibrationIsolatorTypeEnum, 'SPRING', INDETERMINATE) -userdefined = express_getattr(IfcVibrationIsolatorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcVibrationIsolatorTypeEnum, 'NOTDEFINED', INDETERMINATE) +compression = IfcVibrationIsolatorTypeEnum.COMPRESSION +spring = IfcVibrationIsolatorTypeEnum.SPRING +userdefined = IfcVibrationIsolatorTypeEnum.USERDEFINED +notdefined = IfcVibrationIsolatorTypeEnum.NOTDEFINED IfcVoidingFeatureTypeEnum = enum_namespace() -cutout = express_getattr(IfcVoidingFeatureTypeEnum, 'CUTOUT', INDETERMINATE) -notch = express_getattr(IfcVoidingFeatureTypeEnum, 'NOTCH', INDETERMINATE) -hole = express_getattr(IfcVoidingFeatureTypeEnum, 'HOLE', INDETERMINATE) -miter = express_getattr(IfcVoidingFeatureTypeEnum, 'MITER', INDETERMINATE) -chamfer = express_getattr(IfcVoidingFeatureTypeEnum, 'CHAMFER', INDETERMINATE) -edge = express_getattr(IfcVoidingFeatureTypeEnum, 'EDGE', INDETERMINATE) -userdefined = express_getattr(IfcVoidingFeatureTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcVoidingFeatureTypeEnum, 'NOTDEFINED', INDETERMINATE) +cutout = IfcVoidingFeatureTypeEnum.CUTOUT +notch = IfcVoidingFeatureTypeEnum.NOTCH +hole = IfcVoidingFeatureTypeEnum.HOLE +miter = IfcVoidingFeatureTypeEnum.MITER +chamfer = IfcVoidingFeatureTypeEnum.CHAMFER +edge = IfcVoidingFeatureTypeEnum.EDGE +userdefined = IfcVoidingFeatureTypeEnum.USERDEFINED +notdefined = IfcVoidingFeatureTypeEnum.NOTDEFINED IfcWallTypeEnum = enum_namespace() -movable = express_getattr(IfcWallTypeEnum, 'MOVABLE', INDETERMINATE) -parapet = express_getattr(IfcWallTypeEnum, 'PARAPET', INDETERMINATE) -partitioning = express_getattr(IfcWallTypeEnum, 'PARTITIONING', INDETERMINATE) -plumbingwall = express_getattr(IfcWallTypeEnum, 'PLUMBINGWALL', INDETERMINATE) -shear = express_getattr(IfcWallTypeEnum, 'SHEAR', INDETERMINATE) -solidwall = express_getattr(IfcWallTypeEnum, 'SOLIDWALL', INDETERMINATE) -standard = express_getattr(IfcWallTypeEnum, 'STANDARD', INDETERMINATE) -polygonal = express_getattr(IfcWallTypeEnum, 'POLYGONAL', INDETERMINATE) -elementedwall = express_getattr(IfcWallTypeEnum, 'ELEMENTEDWALL', INDETERMINATE) -userdefined = express_getattr(IfcWallTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcWallTypeEnum, 'NOTDEFINED', INDETERMINATE) +movable = IfcWallTypeEnum.MOVABLE +parapet = IfcWallTypeEnum.PARAPET +partitioning = IfcWallTypeEnum.PARTITIONING +plumbingwall = IfcWallTypeEnum.PLUMBINGWALL +shear = IfcWallTypeEnum.SHEAR +solidwall = IfcWallTypeEnum.SOLIDWALL +standard = IfcWallTypeEnum.STANDARD +polygonal = IfcWallTypeEnum.POLYGONAL +elementedwall = IfcWallTypeEnum.ELEMENTEDWALL +userdefined = IfcWallTypeEnum.USERDEFINED +notdefined = IfcWallTypeEnum.NOTDEFINED IfcWasteTerminalTypeEnum = enum_namespace() -floortrap = express_getattr(IfcWasteTerminalTypeEnum, 'FLOORTRAP', INDETERMINATE) -floorwaste = express_getattr(IfcWasteTerminalTypeEnum, 'FLOORWASTE', INDETERMINATE) -gullysump = express_getattr(IfcWasteTerminalTypeEnum, 'GULLYSUMP', INDETERMINATE) -gullytrap = express_getattr(IfcWasteTerminalTypeEnum, 'GULLYTRAP', INDETERMINATE) -roofdrain = express_getattr(IfcWasteTerminalTypeEnum, 'ROOFDRAIN', INDETERMINATE) -wastedisposalunit = express_getattr(IfcWasteTerminalTypeEnum, 'WASTEDISPOSALUNIT', INDETERMINATE) -wastetrap = express_getattr(IfcWasteTerminalTypeEnum, 'WASTETRAP', INDETERMINATE) -userdefined = express_getattr(IfcWasteTerminalTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcWasteTerminalTypeEnum, 'NOTDEFINED', INDETERMINATE) +floortrap = IfcWasteTerminalTypeEnum.FLOORTRAP +floorwaste = IfcWasteTerminalTypeEnum.FLOORWASTE +gullysump = IfcWasteTerminalTypeEnum.GULLYSUMP +gullytrap = IfcWasteTerminalTypeEnum.GULLYTRAP +roofdrain = IfcWasteTerminalTypeEnum.ROOFDRAIN +wastedisposalunit = IfcWasteTerminalTypeEnum.WASTEDISPOSALUNIT +wastetrap = IfcWasteTerminalTypeEnum.WASTETRAP +userdefined = IfcWasteTerminalTypeEnum.USERDEFINED +notdefined = IfcWasteTerminalTypeEnum.NOTDEFINED IfcWindowPanelOperationEnum = enum_namespace() -sidehungrighthand = express_getattr(IfcWindowPanelOperationEnum, 'SIDEHUNGRIGHTHAND', INDETERMINATE) -sidehunglefthand = express_getattr(IfcWindowPanelOperationEnum, 'SIDEHUNGLEFTHAND', INDETERMINATE) -tiltandturnrighthand = express_getattr(IfcWindowPanelOperationEnum, 'TILTANDTURNRIGHTHAND', INDETERMINATE) -tiltandturnlefthand = express_getattr(IfcWindowPanelOperationEnum, 'TILTANDTURNLEFTHAND', INDETERMINATE) -tophung = express_getattr(IfcWindowPanelOperationEnum, 'TOPHUNG', INDETERMINATE) -bottomhung = express_getattr(IfcWindowPanelOperationEnum, 'BOTTOMHUNG', INDETERMINATE) -pivothorizontal = express_getattr(IfcWindowPanelOperationEnum, 'PIVOTHORIZONTAL', INDETERMINATE) -pivotvertical = express_getattr(IfcWindowPanelOperationEnum, 'PIVOTVERTICAL', INDETERMINATE) -slidinghorizontal = express_getattr(IfcWindowPanelOperationEnum, 'SLIDINGHORIZONTAL', INDETERMINATE) -slidingvertical = express_getattr(IfcWindowPanelOperationEnum, 'SLIDINGVERTICAL', INDETERMINATE) -removablecasement = express_getattr(IfcWindowPanelOperationEnum, 'REMOVABLECASEMENT', INDETERMINATE) -fixedcasement = express_getattr(IfcWindowPanelOperationEnum, 'FIXEDCASEMENT', INDETERMINATE) -otheroperation = express_getattr(IfcWindowPanelOperationEnum, 'OTHEROPERATION', INDETERMINATE) -notdefined = express_getattr(IfcWindowPanelOperationEnum, 'NOTDEFINED', INDETERMINATE) +sidehungrighthand = IfcWindowPanelOperationEnum.SIDEHUNGRIGHTHAND +sidehunglefthand = IfcWindowPanelOperationEnum.SIDEHUNGLEFTHAND +tiltandturnrighthand = IfcWindowPanelOperationEnum.TILTANDTURNRIGHTHAND +tiltandturnlefthand = IfcWindowPanelOperationEnum.TILTANDTURNLEFTHAND +tophung = IfcWindowPanelOperationEnum.TOPHUNG +bottomhung = IfcWindowPanelOperationEnum.BOTTOMHUNG +pivothorizontal = IfcWindowPanelOperationEnum.PIVOTHORIZONTAL +pivotvertical = IfcWindowPanelOperationEnum.PIVOTVERTICAL +slidinghorizontal = IfcWindowPanelOperationEnum.SLIDINGHORIZONTAL +slidingvertical = IfcWindowPanelOperationEnum.SLIDINGVERTICAL +removablecasement = IfcWindowPanelOperationEnum.REMOVABLECASEMENT +fixedcasement = IfcWindowPanelOperationEnum.FIXEDCASEMENT +otheroperation = IfcWindowPanelOperationEnum.OTHEROPERATION +notdefined = IfcWindowPanelOperationEnum.NOTDEFINED IfcWindowPanelPositionEnum = enum_namespace() -left = express_getattr(IfcWindowPanelPositionEnum, 'LEFT', INDETERMINATE) -middle = express_getattr(IfcWindowPanelPositionEnum, 'MIDDLE', INDETERMINATE) -right = express_getattr(IfcWindowPanelPositionEnum, 'RIGHT', INDETERMINATE) -bottom = express_getattr(IfcWindowPanelPositionEnum, 'BOTTOM', INDETERMINATE) -top = express_getattr(IfcWindowPanelPositionEnum, 'TOP', INDETERMINATE) -notdefined = express_getattr(IfcWindowPanelPositionEnum, 'NOTDEFINED', INDETERMINATE) +left = IfcWindowPanelPositionEnum.LEFT +middle = IfcWindowPanelPositionEnum.MIDDLE +right = IfcWindowPanelPositionEnum.RIGHT +bottom = IfcWindowPanelPositionEnum.BOTTOM +top = IfcWindowPanelPositionEnum.TOP +notdefined = IfcWindowPanelPositionEnum.NOTDEFINED IfcWindowStyleConstructionEnum = enum_namespace() -aluminium = express_getattr(IfcWindowStyleConstructionEnum, 'ALUMINIUM', INDETERMINATE) -high_grade_steel = express_getattr(IfcWindowStyleConstructionEnum, 'HIGH_GRADE_STEEL', INDETERMINATE) -steel = express_getattr(IfcWindowStyleConstructionEnum, 'STEEL', INDETERMINATE) -wood = express_getattr(IfcWindowStyleConstructionEnum, 'WOOD', INDETERMINATE) -aluminium_wood = express_getattr(IfcWindowStyleConstructionEnum, 'ALUMINIUM_WOOD', INDETERMINATE) -plastic = express_getattr(IfcWindowStyleConstructionEnum, 'PLASTIC', INDETERMINATE) -other_construction = express_getattr(IfcWindowStyleConstructionEnum, 'OTHER_CONSTRUCTION', INDETERMINATE) -notdefined = express_getattr(IfcWindowStyleConstructionEnum, 'NOTDEFINED', INDETERMINATE) +aluminium = IfcWindowStyleConstructionEnum.ALUMINIUM +high_grade_steel = IfcWindowStyleConstructionEnum.HIGH_GRADE_STEEL +steel = IfcWindowStyleConstructionEnum.STEEL +wood = IfcWindowStyleConstructionEnum.WOOD +aluminium_wood = IfcWindowStyleConstructionEnum.ALUMINIUM_WOOD +plastic = IfcWindowStyleConstructionEnum.PLASTIC +other_construction = IfcWindowStyleConstructionEnum.OTHER_CONSTRUCTION +notdefined = IfcWindowStyleConstructionEnum.NOTDEFINED IfcWindowStyleOperationEnum = enum_namespace() -single_panel = express_getattr(IfcWindowStyleOperationEnum, 'SINGLE_PANEL', INDETERMINATE) -double_panel_vertical = express_getattr(IfcWindowStyleOperationEnum, 'DOUBLE_PANEL_VERTICAL', INDETERMINATE) -double_panel_horizontal = express_getattr(IfcWindowStyleOperationEnum, 'DOUBLE_PANEL_HORIZONTAL', INDETERMINATE) -triple_panel_vertical = express_getattr(IfcWindowStyleOperationEnum, 'TRIPLE_PANEL_VERTICAL', INDETERMINATE) -triple_panel_bottom = express_getattr(IfcWindowStyleOperationEnum, 'TRIPLE_PANEL_BOTTOM', INDETERMINATE) -triple_panel_top = express_getattr(IfcWindowStyleOperationEnum, 'TRIPLE_PANEL_TOP', INDETERMINATE) -triple_panel_left = express_getattr(IfcWindowStyleOperationEnum, 'TRIPLE_PANEL_LEFT', INDETERMINATE) -triple_panel_right = express_getattr(IfcWindowStyleOperationEnum, 'TRIPLE_PANEL_RIGHT', INDETERMINATE) -triple_panel_horizontal = express_getattr(IfcWindowStyleOperationEnum, 'TRIPLE_PANEL_HORIZONTAL', INDETERMINATE) -userdefined = express_getattr(IfcWindowStyleOperationEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcWindowStyleOperationEnum, 'NOTDEFINED', INDETERMINATE) +single_panel = IfcWindowStyleOperationEnum.SINGLE_PANEL +double_panel_vertical = IfcWindowStyleOperationEnum.DOUBLE_PANEL_VERTICAL +double_panel_horizontal = IfcWindowStyleOperationEnum.DOUBLE_PANEL_HORIZONTAL +triple_panel_vertical = IfcWindowStyleOperationEnum.TRIPLE_PANEL_VERTICAL +triple_panel_bottom = IfcWindowStyleOperationEnum.TRIPLE_PANEL_BOTTOM +triple_panel_top = IfcWindowStyleOperationEnum.TRIPLE_PANEL_TOP +triple_panel_left = IfcWindowStyleOperationEnum.TRIPLE_PANEL_LEFT +triple_panel_right = IfcWindowStyleOperationEnum.TRIPLE_PANEL_RIGHT +triple_panel_horizontal = IfcWindowStyleOperationEnum.TRIPLE_PANEL_HORIZONTAL +userdefined = IfcWindowStyleOperationEnum.USERDEFINED +notdefined = IfcWindowStyleOperationEnum.NOTDEFINED IfcWindowTypeEnum = enum_namespace() -window = express_getattr(IfcWindowTypeEnum, 'WINDOW', INDETERMINATE) -skylight = express_getattr(IfcWindowTypeEnum, 'SKYLIGHT', INDETERMINATE) -lightdome = express_getattr(IfcWindowTypeEnum, 'LIGHTDOME', INDETERMINATE) -userdefined = express_getattr(IfcWindowTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcWindowTypeEnum, 'NOTDEFINED', INDETERMINATE) +window = IfcWindowTypeEnum.WINDOW +skylight = IfcWindowTypeEnum.SKYLIGHT +lightdome = IfcWindowTypeEnum.LIGHTDOME +userdefined = IfcWindowTypeEnum.USERDEFINED +notdefined = IfcWindowTypeEnum.NOTDEFINED IfcWindowTypePartitioningEnum = enum_namespace() -single_panel = express_getattr(IfcWindowTypePartitioningEnum, 'SINGLE_PANEL', INDETERMINATE) -double_panel_vertical = express_getattr(IfcWindowTypePartitioningEnum, 'DOUBLE_PANEL_VERTICAL', INDETERMINATE) -double_panel_horizontal = express_getattr(IfcWindowTypePartitioningEnum, 'DOUBLE_PANEL_HORIZONTAL', INDETERMINATE) -triple_panel_vertical = express_getattr(IfcWindowTypePartitioningEnum, 'TRIPLE_PANEL_VERTICAL', INDETERMINATE) -triple_panel_bottom = express_getattr(IfcWindowTypePartitioningEnum, 'TRIPLE_PANEL_BOTTOM', INDETERMINATE) -triple_panel_top = express_getattr(IfcWindowTypePartitioningEnum, 'TRIPLE_PANEL_TOP', INDETERMINATE) -triple_panel_left = express_getattr(IfcWindowTypePartitioningEnum, 'TRIPLE_PANEL_LEFT', INDETERMINATE) -triple_panel_right = express_getattr(IfcWindowTypePartitioningEnum, 'TRIPLE_PANEL_RIGHT', INDETERMINATE) -triple_panel_horizontal = express_getattr(IfcWindowTypePartitioningEnum, 'TRIPLE_PANEL_HORIZONTAL', INDETERMINATE) -userdefined = express_getattr(IfcWindowTypePartitioningEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcWindowTypePartitioningEnum, 'NOTDEFINED', INDETERMINATE) +single_panel = IfcWindowTypePartitioningEnum.SINGLE_PANEL +double_panel_vertical = IfcWindowTypePartitioningEnum.DOUBLE_PANEL_VERTICAL +double_panel_horizontal = IfcWindowTypePartitioningEnum.DOUBLE_PANEL_HORIZONTAL +triple_panel_vertical = IfcWindowTypePartitioningEnum.TRIPLE_PANEL_VERTICAL +triple_panel_bottom = IfcWindowTypePartitioningEnum.TRIPLE_PANEL_BOTTOM +triple_panel_top = IfcWindowTypePartitioningEnum.TRIPLE_PANEL_TOP +triple_panel_left = IfcWindowTypePartitioningEnum.TRIPLE_PANEL_LEFT +triple_panel_right = IfcWindowTypePartitioningEnum.TRIPLE_PANEL_RIGHT +triple_panel_horizontal = IfcWindowTypePartitioningEnum.TRIPLE_PANEL_HORIZONTAL +userdefined = IfcWindowTypePartitioningEnum.USERDEFINED +notdefined = IfcWindowTypePartitioningEnum.NOTDEFINED IfcWorkCalendarTypeEnum = enum_namespace() -firstshift = express_getattr(IfcWorkCalendarTypeEnum, 'FIRSTSHIFT', INDETERMINATE) -secondshift = express_getattr(IfcWorkCalendarTypeEnum, 'SECONDSHIFT', INDETERMINATE) -thirdshift = express_getattr(IfcWorkCalendarTypeEnum, 'THIRDSHIFT', INDETERMINATE) -userdefined = express_getattr(IfcWorkCalendarTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcWorkCalendarTypeEnum, 'NOTDEFINED', INDETERMINATE) +firstshift = IfcWorkCalendarTypeEnum.FIRSTSHIFT +secondshift = IfcWorkCalendarTypeEnum.SECONDSHIFT +thirdshift = IfcWorkCalendarTypeEnum.THIRDSHIFT +userdefined = IfcWorkCalendarTypeEnum.USERDEFINED +notdefined = IfcWorkCalendarTypeEnum.NOTDEFINED IfcWorkPlanTypeEnum = enum_namespace() -actual = express_getattr(IfcWorkPlanTypeEnum, 'ACTUAL', INDETERMINATE) -baseline = express_getattr(IfcWorkPlanTypeEnum, 'BASELINE', INDETERMINATE) -planned = express_getattr(IfcWorkPlanTypeEnum, 'PLANNED', INDETERMINATE) -userdefined = express_getattr(IfcWorkPlanTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcWorkPlanTypeEnum, 'NOTDEFINED', INDETERMINATE) +actual = IfcWorkPlanTypeEnum.ACTUAL +baseline = IfcWorkPlanTypeEnum.BASELINE +planned = IfcWorkPlanTypeEnum.PLANNED +userdefined = IfcWorkPlanTypeEnum.USERDEFINED +notdefined = IfcWorkPlanTypeEnum.NOTDEFINED IfcWorkScheduleTypeEnum = enum_namespace() -actual = express_getattr(IfcWorkScheduleTypeEnum, 'ACTUAL', INDETERMINATE) -baseline = express_getattr(IfcWorkScheduleTypeEnum, 'BASELINE', INDETERMINATE) -planned = express_getattr(IfcWorkScheduleTypeEnum, 'PLANNED', INDETERMINATE) -userdefined = express_getattr(IfcWorkScheduleTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcWorkScheduleTypeEnum, 'NOTDEFINED', INDETERMINATE) +actual = IfcWorkScheduleTypeEnum.ACTUAL +baseline = IfcWorkScheduleTypeEnum.BASELINE +planned = IfcWorkScheduleTypeEnum.PLANNED +userdefined = IfcWorkScheduleTypeEnum.USERDEFINED +notdefined = IfcWorkScheduleTypeEnum.NOTDEFINED def IfcActionRequest(*args, **kwargs): return ifcopenshell.create_entity('IfcActionRequest', 'IFC4', *args, **kwargs) diff --git a/src/ifcopenshell-python/ifcopenshell/express/rules/IFC4X1.py b/src/ifcopenshell-python/ifcopenshell/express/rules/IFC4X1.py index afb4197c87f..f07f0ee2481 100644 --- a/src/ifcopenshell-python/ifcopenshell/express/rules/IFC4X1.py +++ b/src/ifcopenshell-python/ifcopenshell/express/rules/IFC4X1.py @@ -1,5 +1,8 @@ import ifcopenshell +def is_indeterminate(v): + return v is None or type(v).__name__ == 'indeterminate_type' + def exists(v): if callable(v): try: @@ -7,10 +10,10 @@ def exists(v): except IndexError as e: return False else: - return v is not None + return not is_indeterminate(v) def nvl(v, default): - return v if v is not None else default + return v if not is_indeterminate(v) else default def is_entity(inst): if isinstance(inst, ifcopenshell.entity_instance): @@ -22,13 +25,13 @@ def is_entity(inst): def express_len(v): if isinstance(v, ifcopenshell.entity_instance) and (not is_entity(v)): v = v[0] - elif v is None or v is INDETERMINATE: + elif is_indeterminate(v): return INDETERMINATE return len(v) old_range = range def range(*args): - if INDETERMINATE in args: + if any(map(is_indeterminate, args)): return yield from old_range(*args) sizeof = express_len @@ -149,1860 +152,1860 @@ class enum_namespace: def __getattr__(self, k): return express_getattr(k, 'upper', INDETERMINATE)() IfcActionRequestTypeEnum = enum_namespace() -email = express_getattr(IfcActionRequestTypeEnum, 'EMAIL', INDETERMINATE) -fax = express_getattr(IfcActionRequestTypeEnum, 'FAX', INDETERMINATE) -phone = express_getattr(IfcActionRequestTypeEnum, 'PHONE', INDETERMINATE) -post = express_getattr(IfcActionRequestTypeEnum, 'POST', INDETERMINATE) -verbal = express_getattr(IfcActionRequestTypeEnum, 'VERBAL', INDETERMINATE) -userdefined = express_getattr(IfcActionRequestTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcActionRequestTypeEnum, 'NOTDEFINED', INDETERMINATE) +email = IfcActionRequestTypeEnum.EMAIL +fax = IfcActionRequestTypeEnum.FAX +phone = IfcActionRequestTypeEnum.PHONE +post = IfcActionRequestTypeEnum.POST +verbal = IfcActionRequestTypeEnum.VERBAL +userdefined = IfcActionRequestTypeEnum.USERDEFINED +notdefined = IfcActionRequestTypeEnum.NOTDEFINED IfcActionSourceTypeEnum = enum_namespace() -dead_load_g = express_getattr(IfcActionSourceTypeEnum, 'DEAD_LOAD_G', INDETERMINATE) -completion_g1 = express_getattr(IfcActionSourceTypeEnum, 'COMPLETION_G1', INDETERMINATE) -live_load_q = express_getattr(IfcActionSourceTypeEnum, 'LIVE_LOAD_Q', INDETERMINATE) -snow_s = express_getattr(IfcActionSourceTypeEnum, 'SNOW_S', INDETERMINATE) -wind_w = express_getattr(IfcActionSourceTypeEnum, 'WIND_W', INDETERMINATE) -prestressing_p = express_getattr(IfcActionSourceTypeEnum, 'PRESTRESSING_P', INDETERMINATE) -settlement_u = express_getattr(IfcActionSourceTypeEnum, 'SETTLEMENT_U', INDETERMINATE) -temperature_t = express_getattr(IfcActionSourceTypeEnum, 'TEMPERATURE_T', INDETERMINATE) -earthquake_e = express_getattr(IfcActionSourceTypeEnum, 'EARTHQUAKE_E', INDETERMINATE) -fire = express_getattr(IfcActionSourceTypeEnum, 'FIRE', INDETERMINATE) -impulse = express_getattr(IfcActionSourceTypeEnum, 'IMPULSE', INDETERMINATE) -impact = express_getattr(IfcActionSourceTypeEnum, 'IMPACT', INDETERMINATE) -transport = express_getattr(IfcActionSourceTypeEnum, 'TRANSPORT', INDETERMINATE) -erection = express_getattr(IfcActionSourceTypeEnum, 'ERECTION', INDETERMINATE) -propping = express_getattr(IfcActionSourceTypeEnum, 'PROPPING', INDETERMINATE) -system_imperfection = express_getattr(IfcActionSourceTypeEnum, 'SYSTEM_IMPERFECTION', INDETERMINATE) -shrinkage = express_getattr(IfcActionSourceTypeEnum, 'SHRINKAGE', INDETERMINATE) -creep = express_getattr(IfcActionSourceTypeEnum, 'CREEP', INDETERMINATE) -lack_of_fit = express_getattr(IfcActionSourceTypeEnum, 'LACK_OF_FIT', INDETERMINATE) -buoyancy = express_getattr(IfcActionSourceTypeEnum, 'BUOYANCY', INDETERMINATE) -ice = express_getattr(IfcActionSourceTypeEnum, 'ICE', INDETERMINATE) -current = express_getattr(IfcActionSourceTypeEnum, 'CURRENT', INDETERMINATE) -wave = express_getattr(IfcActionSourceTypeEnum, 'WAVE', INDETERMINATE) -rain = express_getattr(IfcActionSourceTypeEnum, 'RAIN', INDETERMINATE) -brakes = express_getattr(IfcActionSourceTypeEnum, 'BRAKES', INDETERMINATE) -userdefined = express_getattr(IfcActionSourceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcActionSourceTypeEnum, 'NOTDEFINED', INDETERMINATE) +dead_load_g = IfcActionSourceTypeEnum.DEAD_LOAD_G +completion_g1 = IfcActionSourceTypeEnum.COMPLETION_G1 +live_load_q = IfcActionSourceTypeEnum.LIVE_LOAD_Q +snow_s = IfcActionSourceTypeEnum.SNOW_S +wind_w = IfcActionSourceTypeEnum.WIND_W +prestressing_p = IfcActionSourceTypeEnum.PRESTRESSING_P +settlement_u = IfcActionSourceTypeEnum.SETTLEMENT_U +temperature_t = IfcActionSourceTypeEnum.TEMPERATURE_T +earthquake_e = IfcActionSourceTypeEnum.EARTHQUAKE_E +fire = IfcActionSourceTypeEnum.FIRE +impulse = IfcActionSourceTypeEnum.IMPULSE +impact = IfcActionSourceTypeEnum.IMPACT +transport = IfcActionSourceTypeEnum.TRANSPORT +erection = IfcActionSourceTypeEnum.ERECTION +propping = IfcActionSourceTypeEnum.PROPPING +system_imperfection = IfcActionSourceTypeEnum.SYSTEM_IMPERFECTION +shrinkage = IfcActionSourceTypeEnum.SHRINKAGE +creep = IfcActionSourceTypeEnum.CREEP +lack_of_fit = IfcActionSourceTypeEnum.LACK_OF_FIT +buoyancy = IfcActionSourceTypeEnum.BUOYANCY +ice = IfcActionSourceTypeEnum.ICE +current = IfcActionSourceTypeEnum.CURRENT +wave = IfcActionSourceTypeEnum.WAVE +rain = IfcActionSourceTypeEnum.RAIN +brakes = IfcActionSourceTypeEnum.BRAKES +userdefined = IfcActionSourceTypeEnum.USERDEFINED +notdefined = IfcActionSourceTypeEnum.NOTDEFINED IfcActionTypeEnum = enum_namespace() -permanent_g = express_getattr(IfcActionTypeEnum, 'PERMANENT_G', INDETERMINATE) -variable_q = express_getattr(IfcActionTypeEnum, 'VARIABLE_Q', INDETERMINATE) -extraordinary_a = express_getattr(IfcActionTypeEnum, 'EXTRAORDINARY_A', INDETERMINATE) -userdefined = express_getattr(IfcActionTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcActionTypeEnum, 'NOTDEFINED', INDETERMINATE) +permanent_g = IfcActionTypeEnum.PERMANENT_G +variable_q = IfcActionTypeEnum.VARIABLE_Q +extraordinary_a = IfcActionTypeEnum.EXTRAORDINARY_A +userdefined = IfcActionTypeEnum.USERDEFINED +notdefined = IfcActionTypeEnum.NOTDEFINED IfcActuatorTypeEnum = enum_namespace() -electricactuator = express_getattr(IfcActuatorTypeEnum, 'ELECTRICACTUATOR', INDETERMINATE) -handoperatedactuator = express_getattr(IfcActuatorTypeEnum, 'HANDOPERATEDACTUATOR', INDETERMINATE) -hydraulicactuator = express_getattr(IfcActuatorTypeEnum, 'HYDRAULICACTUATOR', INDETERMINATE) -pneumaticactuator = express_getattr(IfcActuatorTypeEnum, 'PNEUMATICACTUATOR', INDETERMINATE) -thermostaticactuator = express_getattr(IfcActuatorTypeEnum, 'THERMOSTATICACTUATOR', INDETERMINATE) -userdefined = express_getattr(IfcActuatorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcActuatorTypeEnum, 'NOTDEFINED', INDETERMINATE) +electricactuator = IfcActuatorTypeEnum.ELECTRICACTUATOR +handoperatedactuator = IfcActuatorTypeEnum.HANDOPERATEDACTUATOR +hydraulicactuator = IfcActuatorTypeEnum.HYDRAULICACTUATOR +pneumaticactuator = IfcActuatorTypeEnum.PNEUMATICACTUATOR +thermostaticactuator = IfcActuatorTypeEnum.THERMOSTATICACTUATOR +userdefined = IfcActuatorTypeEnum.USERDEFINED +notdefined = IfcActuatorTypeEnum.NOTDEFINED IfcAddressTypeEnum = enum_namespace() -office = express_getattr(IfcAddressTypeEnum, 'OFFICE', INDETERMINATE) -site = express_getattr(IfcAddressTypeEnum, 'SITE', INDETERMINATE) -home = express_getattr(IfcAddressTypeEnum, 'HOME', INDETERMINATE) -distributionpoint = express_getattr(IfcAddressTypeEnum, 'DISTRIBUTIONPOINT', INDETERMINATE) -userdefined = express_getattr(IfcAddressTypeEnum, 'USERDEFINED', INDETERMINATE) +office = IfcAddressTypeEnum.OFFICE +site = IfcAddressTypeEnum.SITE +home = IfcAddressTypeEnum.HOME +distributionpoint = IfcAddressTypeEnum.DISTRIBUTIONPOINT +userdefined = IfcAddressTypeEnum.USERDEFINED IfcAirTerminalBoxTypeEnum = enum_namespace() -constantflow = express_getattr(IfcAirTerminalBoxTypeEnum, 'CONSTANTFLOW', INDETERMINATE) -variableflowpressuredependant = express_getattr(IfcAirTerminalBoxTypeEnum, 'VARIABLEFLOWPRESSUREDEPENDANT', INDETERMINATE) -variableflowpressureindependant = express_getattr(IfcAirTerminalBoxTypeEnum, 'VARIABLEFLOWPRESSUREINDEPENDANT', INDETERMINATE) -userdefined = express_getattr(IfcAirTerminalBoxTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAirTerminalBoxTypeEnum, 'NOTDEFINED', INDETERMINATE) +constantflow = IfcAirTerminalBoxTypeEnum.CONSTANTFLOW +variableflowpressuredependant = IfcAirTerminalBoxTypeEnum.VARIABLEFLOWPRESSUREDEPENDANT +variableflowpressureindependant = IfcAirTerminalBoxTypeEnum.VARIABLEFLOWPRESSUREINDEPENDANT +userdefined = IfcAirTerminalBoxTypeEnum.USERDEFINED +notdefined = IfcAirTerminalBoxTypeEnum.NOTDEFINED IfcAirTerminalTypeEnum = enum_namespace() -diffuser = express_getattr(IfcAirTerminalTypeEnum, 'DIFFUSER', INDETERMINATE) -grille = express_getattr(IfcAirTerminalTypeEnum, 'GRILLE', INDETERMINATE) -louvre = express_getattr(IfcAirTerminalTypeEnum, 'LOUVRE', INDETERMINATE) -register = express_getattr(IfcAirTerminalTypeEnum, 'REGISTER', INDETERMINATE) -userdefined = express_getattr(IfcAirTerminalTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAirTerminalTypeEnum, 'NOTDEFINED', INDETERMINATE) +diffuser = IfcAirTerminalTypeEnum.DIFFUSER +grille = IfcAirTerminalTypeEnum.GRILLE +louvre = IfcAirTerminalTypeEnum.LOUVRE +register = IfcAirTerminalTypeEnum.REGISTER +userdefined = IfcAirTerminalTypeEnum.USERDEFINED +notdefined = IfcAirTerminalTypeEnum.NOTDEFINED IfcAirToAirHeatRecoveryTypeEnum = enum_namespace() -fixedplatecounterflowexchanger = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'FIXEDPLATECOUNTERFLOWEXCHANGER', INDETERMINATE) -fixedplatecrossflowexchanger = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'FIXEDPLATECROSSFLOWEXCHANGER', INDETERMINATE) -fixedplateparallelflowexchanger = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'FIXEDPLATEPARALLELFLOWEXCHANGER', INDETERMINATE) -rotarywheel = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'ROTARYWHEEL', INDETERMINATE) -runaroundcoilloop = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'RUNAROUNDCOILLOOP', INDETERMINATE) -heatpipe = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'HEATPIPE', INDETERMINATE) -twintowerenthalpyrecoveryloops = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'TWINTOWERENTHALPYRECOVERYLOOPS', INDETERMINATE) -thermosiphonsealedtubeheatexchangers = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'THERMOSIPHONSEALEDTUBEHEATEXCHANGERS', INDETERMINATE) -thermosiphoncoiltypeheatexchangers = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'THERMOSIPHONCOILTYPEHEATEXCHANGERS', INDETERMINATE) -userdefined = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'NOTDEFINED', INDETERMINATE) +fixedplatecounterflowexchanger = IfcAirToAirHeatRecoveryTypeEnum.FIXEDPLATECOUNTERFLOWEXCHANGER +fixedplatecrossflowexchanger = IfcAirToAirHeatRecoveryTypeEnum.FIXEDPLATECROSSFLOWEXCHANGER +fixedplateparallelflowexchanger = IfcAirToAirHeatRecoveryTypeEnum.FIXEDPLATEPARALLELFLOWEXCHANGER +rotarywheel = IfcAirToAirHeatRecoveryTypeEnum.ROTARYWHEEL +runaroundcoilloop = IfcAirToAirHeatRecoveryTypeEnum.RUNAROUNDCOILLOOP +heatpipe = IfcAirToAirHeatRecoveryTypeEnum.HEATPIPE +twintowerenthalpyrecoveryloops = IfcAirToAirHeatRecoveryTypeEnum.TWINTOWERENTHALPYRECOVERYLOOPS +thermosiphonsealedtubeheatexchangers = IfcAirToAirHeatRecoveryTypeEnum.THERMOSIPHONSEALEDTUBEHEATEXCHANGERS +thermosiphoncoiltypeheatexchangers = IfcAirToAirHeatRecoveryTypeEnum.THERMOSIPHONCOILTYPEHEATEXCHANGERS +userdefined = IfcAirToAirHeatRecoveryTypeEnum.USERDEFINED +notdefined = IfcAirToAirHeatRecoveryTypeEnum.NOTDEFINED IfcAlarmTypeEnum = enum_namespace() -bell = express_getattr(IfcAlarmTypeEnum, 'BELL', INDETERMINATE) -breakglassbutton = express_getattr(IfcAlarmTypeEnum, 'BREAKGLASSBUTTON', INDETERMINATE) -light = express_getattr(IfcAlarmTypeEnum, 'LIGHT', INDETERMINATE) -manualpullbox = express_getattr(IfcAlarmTypeEnum, 'MANUALPULLBOX', INDETERMINATE) -siren = express_getattr(IfcAlarmTypeEnum, 'SIREN', INDETERMINATE) -whistle = express_getattr(IfcAlarmTypeEnum, 'WHISTLE', INDETERMINATE) -userdefined = express_getattr(IfcAlarmTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAlarmTypeEnum, 'NOTDEFINED', INDETERMINATE) +bell = IfcAlarmTypeEnum.BELL +breakglassbutton = IfcAlarmTypeEnum.BREAKGLASSBUTTON +light = IfcAlarmTypeEnum.LIGHT +manualpullbox = IfcAlarmTypeEnum.MANUALPULLBOX +siren = IfcAlarmTypeEnum.SIREN +whistle = IfcAlarmTypeEnum.WHISTLE +userdefined = IfcAlarmTypeEnum.USERDEFINED +notdefined = IfcAlarmTypeEnum.NOTDEFINED IfcAlignmentTypeEnum = enum_namespace() -userdefined = express_getattr(IfcAlignmentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAlignmentTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcAlignmentTypeEnum.USERDEFINED +notdefined = IfcAlignmentTypeEnum.NOTDEFINED IfcAnalysisModelTypeEnum = enum_namespace() -in_plane_loading_2d = express_getattr(IfcAnalysisModelTypeEnum, 'IN_PLANE_LOADING_2D', INDETERMINATE) -out_plane_loading_2d = express_getattr(IfcAnalysisModelTypeEnum, 'OUT_PLANE_LOADING_2D', INDETERMINATE) -loading_3d = express_getattr(IfcAnalysisModelTypeEnum, 'LOADING_3D', INDETERMINATE) -userdefined = express_getattr(IfcAnalysisModelTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAnalysisModelTypeEnum, 'NOTDEFINED', INDETERMINATE) +in_plane_loading_2d = IfcAnalysisModelTypeEnum.IN_PLANE_LOADING_2D +out_plane_loading_2d = IfcAnalysisModelTypeEnum.OUT_PLANE_LOADING_2D +loading_3d = IfcAnalysisModelTypeEnum.LOADING_3D +userdefined = IfcAnalysisModelTypeEnum.USERDEFINED +notdefined = IfcAnalysisModelTypeEnum.NOTDEFINED IfcAnalysisTheoryTypeEnum = enum_namespace() -first_order_theory = express_getattr(IfcAnalysisTheoryTypeEnum, 'FIRST_ORDER_THEORY', INDETERMINATE) -second_order_theory = express_getattr(IfcAnalysisTheoryTypeEnum, 'SECOND_ORDER_THEORY', INDETERMINATE) -third_order_theory = express_getattr(IfcAnalysisTheoryTypeEnum, 'THIRD_ORDER_THEORY', INDETERMINATE) -full_nonlinear_theory = express_getattr(IfcAnalysisTheoryTypeEnum, 'FULL_NONLINEAR_THEORY', INDETERMINATE) -userdefined = express_getattr(IfcAnalysisTheoryTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAnalysisTheoryTypeEnum, 'NOTDEFINED', INDETERMINATE) +first_order_theory = IfcAnalysisTheoryTypeEnum.FIRST_ORDER_THEORY +second_order_theory = IfcAnalysisTheoryTypeEnum.SECOND_ORDER_THEORY +third_order_theory = IfcAnalysisTheoryTypeEnum.THIRD_ORDER_THEORY +full_nonlinear_theory = IfcAnalysisTheoryTypeEnum.FULL_NONLINEAR_THEORY +userdefined = IfcAnalysisTheoryTypeEnum.USERDEFINED +notdefined = IfcAnalysisTheoryTypeEnum.NOTDEFINED IfcArithmeticOperatorEnum = enum_namespace() -add = express_getattr(IfcArithmeticOperatorEnum, 'ADD', INDETERMINATE) -divide = express_getattr(IfcArithmeticOperatorEnum, 'DIVIDE', INDETERMINATE) -multiply = express_getattr(IfcArithmeticOperatorEnum, 'MULTIPLY', INDETERMINATE) -subtract = express_getattr(IfcArithmeticOperatorEnum, 'SUBTRACT', INDETERMINATE) +add = IfcArithmeticOperatorEnum.ADD +divide = IfcArithmeticOperatorEnum.DIVIDE +multiply = IfcArithmeticOperatorEnum.MULTIPLY +subtract = IfcArithmeticOperatorEnum.SUBTRACT IfcAssemblyPlaceEnum = enum_namespace() -site = express_getattr(IfcAssemblyPlaceEnum, 'SITE', INDETERMINATE) -factory = express_getattr(IfcAssemblyPlaceEnum, 'FACTORY', INDETERMINATE) -notdefined = express_getattr(IfcAssemblyPlaceEnum, 'NOTDEFINED', INDETERMINATE) +site = IfcAssemblyPlaceEnum.SITE +factory = IfcAssemblyPlaceEnum.FACTORY +notdefined = IfcAssemblyPlaceEnum.NOTDEFINED IfcAudioVisualApplianceTypeEnum = enum_namespace() -amplifier = express_getattr(IfcAudioVisualApplianceTypeEnum, 'AMPLIFIER', INDETERMINATE) -camera = express_getattr(IfcAudioVisualApplianceTypeEnum, 'CAMERA', INDETERMINATE) -display = express_getattr(IfcAudioVisualApplianceTypeEnum, 'DISPLAY', INDETERMINATE) -microphone = express_getattr(IfcAudioVisualApplianceTypeEnum, 'MICROPHONE', INDETERMINATE) -player = express_getattr(IfcAudioVisualApplianceTypeEnum, 'PLAYER', INDETERMINATE) -projector = express_getattr(IfcAudioVisualApplianceTypeEnum, 'PROJECTOR', INDETERMINATE) -receiver = express_getattr(IfcAudioVisualApplianceTypeEnum, 'RECEIVER', INDETERMINATE) -speaker = express_getattr(IfcAudioVisualApplianceTypeEnum, 'SPEAKER', INDETERMINATE) -switcher = express_getattr(IfcAudioVisualApplianceTypeEnum, 'SWITCHER', INDETERMINATE) -telephone = express_getattr(IfcAudioVisualApplianceTypeEnum, 'TELEPHONE', INDETERMINATE) -tuner = express_getattr(IfcAudioVisualApplianceTypeEnum, 'TUNER', INDETERMINATE) -userdefined = express_getattr(IfcAudioVisualApplianceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAudioVisualApplianceTypeEnum, 'NOTDEFINED', INDETERMINATE) +amplifier = IfcAudioVisualApplianceTypeEnum.AMPLIFIER +camera = IfcAudioVisualApplianceTypeEnum.CAMERA +display = IfcAudioVisualApplianceTypeEnum.DISPLAY +microphone = IfcAudioVisualApplianceTypeEnum.MICROPHONE +player = IfcAudioVisualApplianceTypeEnum.PLAYER +projector = IfcAudioVisualApplianceTypeEnum.PROJECTOR +receiver = IfcAudioVisualApplianceTypeEnum.RECEIVER +speaker = IfcAudioVisualApplianceTypeEnum.SPEAKER +switcher = IfcAudioVisualApplianceTypeEnum.SWITCHER +telephone = IfcAudioVisualApplianceTypeEnum.TELEPHONE +tuner = IfcAudioVisualApplianceTypeEnum.TUNER +userdefined = IfcAudioVisualApplianceTypeEnum.USERDEFINED +notdefined = IfcAudioVisualApplianceTypeEnum.NOTDEFINED IfcBSplineCurveForm = enum_namespace() -polyline_form = express_getattr(IfcBSplineCurveForm, 'POLYLINE_FORM', INDETERMINATE) -circular_arc = express_getattr(IfcBSplineCurveForm, 'CIRCULAR_ARC', INDETERMINATE) -elliptic_arc = express_getattr(IfcBSplineCurveForm, 'ELLIPTIC_ARC', INDETERMINATE) -parabolic_arc = express_getattr(IfcBSplineCurveForm, 'PARABOLIC_ARC', INDETERMINATE) -hyperbolic_arc = express_getattr(IfcBSplineCurveForm, 'HYPERBOLIC_ARC', INDETERMINATE) -unspecified = express_getattr(IfcBSplineCurveForm, 'UNSPECIFIED', INDETERMINATE) +polyline_form = IfcBSplineCurveForm.POLYLINE_FORM +circular_arc = IfcBSplineCurveForm.CIRCULAR_ARC +elliptic_arc = IfcBSplineCurveForm.ELLIPTIC_ARC +parabolic_arc = IfcBSplineCurveForm.PARABOLIC_ARC +hyperbolic_arc = IfcBSplineCurveForm.HYPERBOLIC_ARC +unspecified = IfcBSplineCurveForm.UNSPECIFIED IfcBSplineSurfaceForm = enum_namespace() -plane_surf = express_getattr(IfcBSplineSurfaceForm, 'PLANE_SURF', INDETERMINATE) -cylindrical_surf = express_getattr(IfcBSplineSurfaceForm, 'CYLINDRICAL_SURF', INDETERMINATE) -conical_surf = express_getattr(IfcBSplineSurfaceForm, 'CONICAL_SURF', INDETERMINATE) -spherical_surf = express_getattr(IfcBSplineSurfaceForm, 'SPHERICAL_SURF', INDETERMINATE) -toroidal_surf = express_getattr(IfcBSplineSurfaceForm, 'TOROIDAL_SURF', INDETERMINATE) -surf_of_revolution = express_getattr(IfcBSplineSurfaceForm, 'SURF_OF_REVOLUTION', INDETERMINATE) -ruled_surf = express_getattr(IfcBSplineSurfaceForm, 'RULED_SURF', INDETERMINATE) -generalised_cone = express_getattr(IfcBSplineSurfaceForm, 'GENERALISED_CONE', INDETERMINATE) -quadric_surf = express_getattr(IfcBSplineSurfaceForm, 'QUADRIC_SURF', INDETERMINATE) -surf_of_linear_extrusion = express_getattr(IfcBSplineSurfaceForm, 'SURF_OF_LINEAR_EXTRUSION', INDETERMINATE) -unspecified = express_getattr(IfcBSplineSurfaceForm, 'UNSPECIFIED', INDETERMINATE) +plane_surf = IfcBSplineSurfaceForm.PLANE_SURF +cylindrical_surf = IfcBSplineSurfaceForm.CYLINDRICAL_SURF +conical_surf = IfcBSplineSurfaceForm.CONICAL_SURF +spherical_surf = IfcBSplineSurfaceForm.SPHERICAL_SURF +toroidal_surf = IfcBSplineSurfaceForm.TOROIDAL_SURF +surf_of_revolution = IfcBSplineSurfaceForm.SURF_OF_REVOLUTION +ruled_surf = IfcBSplineSurfaceForm.RULED_SURF +generalised_cone = IfcBSplineSurfaceForm.GENERALISED_CONE +quadric_surf = IfcBSplineSurfaceForm.QUADRIC_SURF +surf_of_linear_extrusion = IfcBSplineSurfaceForm.SURF_OF_LINEAR_EXTRUSION +unspecified = IfcBSplineSurfaceForm.UNSPECIFIED IfcBeamTypeEnum = enum_namespace() -beam = express_getattr(IfcBeamTypeEnum, 'BEAM', INDETERMINATE) -joist = express_getattr(IfcBeamTypeEnum, 'JOIST', INDETERMINATE) -hollowcore = express_getattr(IfcBeamTypeEnum, 'HOLLOWCORE', INDETERMINATE) -lintel = express_getattr(IfcBeamTypeEnum, 'LINTEL', INDETERMINATE) -spandrel = express_getattr(IfcBeamTypeEnum, 'SPANDREL', INDETERMINATE) -t_beam = express_getattr(IfcBeamTypeEnum, 'T_BEAM', INDETERMINATE) -userdefined = express_getattr(IfcBeamTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBeamTypeEnum, 'NOTDEFINED', INDETERMINATE) +beam = IfcBeamTypeEnum.BEAM +joist = IfcBeamTypeEnum.JOIST +hollowcore = IfcBeamTypeEnum.HOLLOWCORE +lintel = IfcBeamTypeEnum.LINTEL +spandrel = IfcBeamTypeEnum.SPANDREL +t_beam = IfcBeamTypeEnum.T_BEAM +userdefined = IfcBeamTypeEnum.USERDEFINED +notdefined = IfcBeamTypeEnum.NOTDEFINED IfcBenchmarkEnum = enum_namespace() -greaterthan = express_getattr(IfcBenchmarkEnum, 'GREATERTHAN', INDETERMINATE) -greaterthanorequalto = express_getattr(IfcBenchmarkEnum, 'GREATERTHANOREQUALTO', INDETERMINATE) -lessthan = express_getattr(IfcBenchmarkEnum, 'LESSTHAN', INDETERMINATE) -lessthanorequalto = express_getattr(IfcBenchmarkEnum, 'LESSTHANOREQUALTO', INDETERMINATE) -equalto = express_getattr(IfcBenchmarkEnum, 'EQUALTO', INDETERMINATE) -notequalto = express_getattr(IfcBenchmarkEnum, 'NOTEQUALTO', INDETERMINATE) -includes = express_getattr(IfcBenchmarkEnum, 'INCLUDES', INDETERMINATE) -notincludes = express_getattr(IfcBenchmarkEnum, 'NOTINCLUDES', INDETERMINATE) -includedin = express_getattr(IfcBenchmarkEnum, 'INCLUDEDIN', INDETERMINATE) -notincludedin = express_getattr(IfcBenchmarkEnum, 'NOTINCLUDEDIN', INDETERMINATE) +greaterthan = IfcBenchmarkEnum.GREATERTHAN +greaterthanorequalto = IfcBenchmarkEnum.GREATERTHANOREQUALTO +lessthan = IfcBenchmarkEnum.LESSTHAN +lessthanorequalto = IfcBenchmarkEnum.LESSTHANOREQUALTO +equalto = IfcBenchmarkEnum.EQUALTO +notequalto = IfcBenchmarkEnum.NOTEQUALTO +includes = IfcBenchmarkEnum.INCLUDES +notincludes = IfcBenchmarkEnum.NOTINCLUDES +includedin = IfcBenchmarkEnum.INCLUDEDIN +notincludedin = IfcBenchmarkEnum.NOTINCLUDEDIN IfcBoilerTypeEnum = enum_namespace() -water = express_getattr(IfcBoilerTypeEnum, 'WATER', INDETERMINATE) -steam = express_getattr(IfcBoilerTypeEnum, 'STEAM', INDETERMINATE) -userdefined = express_getattr(IfcBoilerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBoilerTypeEnum, 'NOTDEFINED', INDETERMINATE) +water = IfcBoilerTypeEnum.WATER +steam = IfcBoilerTypeEnum.STEAM +userdefined = IfcBoilerTypeEnum.USERDEFINED +notdefined = IfcBoilerTypeEnum.NOTDEFINED IfcBooleanOperator = enum_namespace() -union = express_getattr(IfcBooleanOperator, 'UNION', INDETERMINATE) -intersection = express_getattr(IfcBooleanOperator, 'INTERSECTION', INDETERMINATE) -difference = express_getattr(IfcBooleanOperator, 'DIFFERENCE', INDETERMINATE) +union = IfcBooleanOperator.UNION +intersection = IfcBooleanOperator.INTERSECTION +difference = IfcBooleanOperator.DIFFERENCE IfcBuildingElementPartTypeEnum = enum_namespace() -insulation = express_getattr(IfcBuildingElementPartTypeEnum, 'INSULATION', INDETERMINATE) -precastpanel = express_getattr(IfcBuildingElementPartTypeEnum, 'PRECASTPANEL', INDETERMINATE) -userdefined = express_getattr(IfcBuildingElementPartTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBuildingElementPartTypeEnum, 'NOTDEFINED', INDETERMINATE) +insulation = IfcBuildingElementPartTypeEnum.INSULATION +precastpanel = IfcBuildingElementPartTypeEnum.PRECASTPANEL +userdefined = IfcBuildingElementPartTypeEnum.USERDEFINED +notdefined = IfcBuildingElementPartTypeEnum.NOTDEFINED IfcBuildingElementProxyTypeEnum = enum_namespace() -complex = express_getattr(IfcBuildingElementProxyTypeEnum, 'COMPLEX', INDETERMINATE) -element = express_getattr(IfcBuildingElementProxyTypeEnum, 'ELEMENT', INDETERMINATE) -partial = express_getattr(IfcBuildingElementProxyTypeEnum, 'PARTIAL', INDETERMINATE) -provisionforvoid = express_getattr(IfcBuildingElementProxyTypeEnum, 'PROVISIONFORVOID', INDETERMINATE) -provisionforspace = express_getattr(IfcBuildingElementProxyTypeEnum, 'PROVISIONFORSPACE', INDETERMINATE) -userdefined = express_getattr(IfcBuildingElementProxyTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBuildingElementProxyTypeEnum, 'NOTDEFINED', INDETERMINATE) +complex = IfcBuildingElementProxyTypeEnum.COMPLEX +element = IfcBuildingElementProxyTypeEnum.ELEMENT +partial = IfcBuildingElementProxyTypeEnum.PARTIAL +provisionforvoid = IfcBuildingElementProxyTypeEnum.PROVISIONFORVOID +provisionforspace = IfcBuildingElementProxyTypeEnum.PROVISIONFORSPACE +userdefined = IfcBuildingElementProxyTypeEnum.USERDEFINED +notdefined = IfcBuildingElementProxyTypeEnum.NOTDEFINED IfcBuildingSystemTypeEnum = enum_namespace() -fenestration = express_getattr(IfcBuildingSystemTypeEnum, 'FENESTRATION', INDETERMINATE) -foundation = express_getattr(IfcBuildingSystemTypeEnum, 'FOUNDATION', INDETERMINATE) -loadbearing = express_getattr(IfcBuildingSystemTypeEnum, 'LOADBEARING', INDETERMINATE) -outershell = express_getattr(IfcBuildingSystemTypeEnum, 'OUTERSHELL', INDETERMINATE) -shading = express_getattr(IfcBuildingSystemTypeEnum, 'SHADING', INDETERMINATE) -transport = express_getattr(IfcBuildingSystemTypeEnum, 'TRANSPORT', INDETERMINATE) -userdefined = express_getattr(IfcBuildingSystemTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBuildingSystemTypeEnum, 'NOTDEFINED', INDETERMINATE) +fenestration = IfcBuildingSystemTypeEnum.FENESTRATION +foundation = IfcBuildingSystemTypeEnum.FOUNDATION +loadbearing = IfcBuildingSystemTypeEnum.LOADBEARING +outershell = IfcBuildingSystemTypeEnum.OUTERSHELL +shading = IfcBuildingSystemTypeEnum.SHADING +transport = IfcBuildingSystemTypeEnum.TRANSPORT +userdefined = IfcBuildingSystemTypeEnum.USERDEFINED +notdefined = IfcBuildingSystemTypeEnum.NOTDEFINED IfcBurnerTypeEnum = enum_namespace() -userdefined = express_getattr(IfcBurnerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBurnerTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcBurnerTypeEnum.USERDEFINED +notdefined = IfcBurnerTypeEnum.NOTDEFINED IfcCableCarrierFittingTypeEnum = enum_namespace() -bend = express_getattr(IfcCableCarrierFittingTypeEnum, 'BEND', INDETERMINATE) -cross = express_getattr(IfcCableCarrierFittingTypeEnum, 'CROSS', INDETERMINATE) -reducer = express_getattr(IfcCableCarrierFittingTypeEnum, 'REDUCER', INDETERMINATE) -tee = express_getattr(IfcCableCarrierFittingTypeEnum, 'TEE', INDETERMINATE) -userdefined = express_getattr(IfcCableCarrierFittingTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCableCarrierFittingTypeEnum, 'NOTDEFINED', INDETERMINATE) +bend = IfcCableCarrierFittingTypeEnum.BEND +cross = IfcCableCarrierFittingTypeEnum.CROSS +reducer = IfcCableCarrierFittingTypeEnum.REDUCER +tee = IfcCableCarrierFittingTypeEnum.TEE +userdefined = IfcCableCarrierFittingTypeEnum.USERDEFINED +notdefined = IfcCableCarrierFittingTypeEnum.NOTDEFINED IfcCableCarrierSegmentTypeEnum = enum_namespace() -cableladdersegment = express_getattr(IfcCableCarrierSegmentTypeEnum, 'CABLELADDERSEGMENT', INDETERMINATE) -cabletraysegment = express_getattr(IfcCableCarrierSegmentTypeEnum, 'CABLETRAYSEGMENT', INDETERMINATE) -cabletrunkingsegment = express_getattr(IfcCableCarrierSegmentTypeEnum, 'CABLETRUNKINGSEGMENT', INDETERMINATE) -conduitsegment = express_getattr(IfcCableCarrierSegmentTypeEnum, 'CONDUITSEGMENT', INDETERMINATE) -userdefined = express_getattr(IfcCableCarrierSegmentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCableCarrierSegmentTypeEnum, 'NOTDEFINED', INDETERMINATE) +cableladdersegment = IfcCableCarrierSegmentTypeEnum.CABLELADDERSEGMENT +cabletraysegment = IfcCableCarrierSegmentTypeEnum.CABLETRAYSEGMENT +cabletrunkingsegment = IfcCableCarrierSegmentTypeEnum.CABLETRUNKINGSEGMENT +conduitsegment = IfcCableCarrierSegmentTypeEnum.CONDUITSEGMENT +userdefined = IfcCableCarrierSegmentTypeEnum.USERDEFINED +notdefined = IfcCableCarrierSegmentTypeEnum.NOTDEFINED IfcCableFittingTypeEnum = enum_namespace() -connector = express_getattr(IfcCableFittingTypeEnum, 'CONNECTOR', INDETERMINATE) -entry = express_getattr(IfcCableFittingTypeEnum, 'ENTRY', INDETERMINATE) -exit = express_getattr(IfcCableFittingTypeEnum, 'EXIT', INDETERMINATE) -junction = express_getattr(IfcCableFittingTypeEnum, 'JUNCTION', INDETERMINATE) -transition = express_getattr(IfcCableFittingTypeEnum, 'TRANSITION', INDETERMINATE) -userdefined = express_getattr(IfcCableFittingTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCableFittingTypeEnum, 'NOTDEFINED', INDETERMINATE) +connector = IfcCableFittingTypeEnum.CONNECTOR +entry = IfcCableFittingTypeEnum.ENTRY +exit = IfcCableFittingTypeEnum.EXIT +junction = IfcCableFittingTypeEnum.JUNCTION +transition = IfcCableFittingTypeEnum.TRANSITION +userdefined = IfcCableFittingTypeEnum.USERDEFINED +notdefined = IfcCableFittingTypeEnum.NOTDEFINED IfcCableSegmentTypeEnum = enum_namespace() -busbarsegment = express_getattr(IfcCableSegmentTypeEnum, 'BUSBARSEGMENT', INDETERMINATE) -cablesegment = express_getattr(IfcCableSegmentTypeEnum, 'CABLESEGMENT', INDETERMINATE) -conductorsegment = express_getattr(IfcCableSegmentTypeEnum, 'CONDUCTORSEGMENT', INDETERMINATE) -coresegment = express_getattr(IfcCableSegmentTypeEnum, 'CORESEGMENT', INDETERMINATE) -userdefined = express_getattr(IfcCableSegmentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCableSegmentTypeEnum, 'NOTDEFINED', INDETERMINATE) +busbarsegment = IfcCableSegmentTypeEnum.BUSBARSEGMENT +cablesegment = IfcCableSegmentTypeEnum.CABLESEGMENT +conductorsegment = IfcCableSegmentTypeEnum.CONDUCTORSEGMENT +coresegment = IfcCableSegmentTypeEnum.CORESEGMENT +userdefined = IfcCableSegmentTypeEnum.USERDEFINED +notdefined = IfcCableSegmentTypeEnum.NOTDEFINED IfcChangeActionEnum = enum_namespace() -nochange = express_getattr(IfcChangeActionEnum, 'NOCHANGE', INDETERMINATE) -modified = express_getattr(IfcChangeActionEnum, 'MODIFIED', INDETERMINATE) -added = express_getattr(IfcChangeActionEnum, 'ADDED', INDETERMINATE) -deleted = express_getattr(IfcChangeActionEnum, 'DELETED', INDETERMINATE) -notdefined = express_getattr(IfcChangeActionEnum, 'NOTDEFINED', INDETERMINATE) +nochange = IfcChangeActionEnum.NOCHANGE +modified = IfcChangeActionEnum.MODIFIED +added = IfcChangeActionEnum.ADDED +deleted = IfcChangeActionEnum.DELETED +notdefined = IfcChangeActionEnum.NOTDEFINED IfcChillerTypeEnum = enum_namespace() -aircooled = express_getattr(IfcChillerTypeEnum, 'AIRCOOLED', INDETERMINATE) -watercooled = express_getattr(IfcChillerTypeEnum, 'WATERCOOLED', INDETERMINATE) -heatrecovery = express_getattr(IfcChillerTypeEnum, 'HEATRECOVERY', INDETERMINATE) -userdefined = express_getattr(IfcChillerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcChillerTypeEnum, 'NOTDEFINED', INDETERMINATE) +aircooled = IfcChillerTypeEnum.AIRCOOLED +watercooled = IfcChillerTypeEnum.WATERCOOLED +heatrecovery = IfcChillerTypeEnum.HEATRECOVERY +userdefined = IfcChillerTypeEnum.USERDEFINED +notdefined = IfcChillerTypeEnum.NOTDEFINED IfcChimneyTypeEnum = enum_namespace() -userdefined = express_getattr(IfcChimneyTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcChimneyTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcChimneyTypeEnum.USERDEFINED +notdefined = IfcChimneyTypeEnum.NOTDEFINED IfcCoilTypeEnum = enum_namespace() -dxcoolingcoil = express_getattr(IfcCoilTypeEnum, 'DXCOOLINGCOIL', INDETERMINATE) -electricheatingcoil = express_getattr(IfcCoilTypeEnum, 'ELECTRICHEATINGCOIL', INDETERMINATE) -gasheatingcoil = express_getattr(IfcCoilTypeEnum, 'GASHEATINGCOIL', INDETERMINATE) -hydroniccoil = express_getattr(IfcCoilTypeEnum, 'HYDRONICCOIL', INDETERMINATE) -steamheatingcoil = express_getattr(IfcCoilTypeEnum, 'STEAMHEATINGCOIL', INDETERMINATE) -watercoolingcoil = express_getattr(IfcCoilTypeEnum, 'WATERCOOLINGCOIL', INDETERMINATE) -waterheatingcoil = express_getattr(IfcCoilTypeEnum, 'WATERHEATINGCOIL', INDETERMINATE) -userdefined = express_getattr(IfcCoilTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCoilTypeEnum, 'NOTDEFINED', INDETERMINATE) +dxcoolingcoil = IfcCoilTypeEnum.DXCOOLINGCOIL +electricheatingcoil = IfcCoilTypeEnum.ELECTRICHEATINGCOIL +gasheatingcoil = IfcCoilTypeEnum.GASHEATINGCOIL +hydroniccoil = IfcCoilTypeEnum.HYDRONICCOIL +steamheatingcoil = IfcCoilTypeEnum.STEAMHEATINGCOIL +watercoolingcoil = IfcCoilTypeEnum.WATERCOOLINGCOIL +waterheatingcoil = IfcCoilTypeEnum.WATERHEATINGCOIL +userdefined = IfcCoilTypeEnum.USERDEFINED +notdefined = IfcCoilTypeEnum.NOTDEFINED IfcColumnTypeEnum = enum_namespace() -column = express_getattr(IfcColumnTypeEnum, 'COLUMN', INDETERMINATE) -pilaster = express_getattr(IfcColumnTypeEnum, 'PILASTER', INDETERMINATE) -userdefined = express_getattr(IfcColumnTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcColumnTypeEnum, 'NOTDEFINED', INDETERMINATE) +column = IfcColumnTypeEnum.COLUMN +pilaster = IfcColumnTypeEnum.PILASTER +userdefined = IfcColumnTypeEnum.USERDEFINED +notdefined = IfcColumnTypeEnum.NOTDEFINED IfcCommunicationsApplianceTypeEnum = enum_namespace() -antenna = express_getattr(IfcCommunicationsApplianceTypeEnum, 'ANTENNA', INDETERMINATE) -computer = express_getattr(IfcCommunicationsApplianceTypeEnum, 'COMPUTER', INDETERMINATE) -fax = express_getattr(IfcCommunicationsApplianceTypeEnum, 'FAX', INDETERMINATE) -gateway = express_getattr(IfcCommunicationsApplianceTypeEnum, 'GATEWAY', INDETERMINATE) -modem = express_getattr(IfcCommunicationsApplianceTypeEnum, 'MODEM', INDETERMINATE) -networkappliance = express_getattr(IfcCommunicationsApplianceTypeEnum, 'NETWORKAPPLIANCE', INDETERMINATE) -networkbridge = express_getattr(IfcCommunicationsApplianceTypeEnum, 'NETWORKBRIDGE', INDETERMINATE) -networkhub = express_getattr(IfcCommunicationsApplianceTypeEnum, 'NETWORKHUB', INDETERMINATE) -printer = express_getattr(IfcCommunicationsApplianceTypeEnum, 'PRINTER', INDETERMINATE) -repeater = express_getattr(IfcCommunicationsApplianceTypeEnum, 'REPEATER', INDETERMINATE) -router = express_getattr(IfcCommunicationsApplianceTypeEnum, 'ROUTER', INDETERMINATE) -scanner = express_getattr(IfcCommunicationsApplianceTypeEnum, 'SCANNER', INDETERMINATE) -userdefined = express_getattr(IfcCommunicationsApplianceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCommunicationsApplianceTypeEnum, 'NOTDEFINED', INDETERMINATE) +antenna = IfcCommunicationsApplianceTypeEnum.ANTENNA +computer = IfcCommunicationsApplianceTypeEnum.COMPUTER +fax = IfcCommunicationsApplianceTypeEnum.FAX +gateway = IfcCommunicationsApplianceTypeEnum.GATEWAY +modem = IfcCommunicationsApplianceTypeEnum.MODEM +networkappliance = IfcCommunicationsApplianceTypeEnum.NETWORKAPPLIANCE +networkbridge = IfcCommunicationsApplianceTypeEnum.NETWORKBRIDGE +networkhub = IfcCommunicationsApplianceTypeEnum.NETWORKHUB +printer = IfcCommunicationsApplianceTypeEnum.PRINTER +repeater = IfcCommunicationsApplianceTypeEnum.REPEATER +router = IfcCommunicationsApplianceTypeEnum.ROUTER +scanner = IfcCommunicationsApplianceTypeEnum.SCANNER +userdefined = IfcCommunicationsApplianceTypeEnum.USERDEFINED +notdefined = IfcCommunicationsApplianceTypeEnum.NOTDEFINED IfcComplexPropertyTemplateTypeEnum = enum_namespace() -p_complex = express_getattr(IfcComplexPropertyTemplateTypeEnum, 'P_COMPLEX', INDETERMINATE) -q_complex = express_getattr(IfcComplexPropertyTemplateTypeEnum, 'Q_COMPLEX', INDETERMINATE) +p_complex = IfcComplexPropertyTemplateTypeEnum.P_COMPLEX +q_complex = IfcComplexPropertyTemplateTypeEnum.Q_COMPLEX IfcCompressorTypeEnum = enum_namespace() -dynamic = express_getattr(IfcCompressorTypeEnum, 'DYNAMIC', INDETERMINATE) -reciprocating = express_getattr(IfcCompressorTypeEnum, 'RECIPROCATING', INDETERMINATE) -rotary = express_getattr(IfcCompressorTypeEnum, 'ROTARY', INDETERMINATE) -scroll = express_getattr(IfcCompressorTypeEnum, 'SCROLL', INDETERMINATE) -trochoidal = express_getattr(IfcCompressorTypeEnum, 'TROCHOIDAL', INDETERMINATE) -singlestage = express_getattr(IfcCompressorTypeEnum, 'SINGLESTAGE', INDETERMINATE) -booster = express_getattr(IfcCompressorTypeEnum, 'BOOSTER', INDETERMINATE) -opentype = express_getattr(IfcCompressorTypeEnum, 'OPENTYPE', INDETERMINATE) -hermetic = express_getattr(IfcCompressorTypeEnum, 'HERMETIC', INDETERMINATE) -semihermetic = express_getattr(IfcCompressorTypeEnum, 'SEMIHERMETIC', INDETERMINATE) -weldedshellhermetic = express_getattr(IfcCompressorTypeEnum, 'WELDEDSHELLHERMETIC', INDETERMINATE) -rollingpiston = express_getattr(IfcCompressorTypeEnum, 'ROLLINGPISTON', INDETERMINATE) -rotaryvane = express_getattr(IfcCompressorTypeEnum, 'ROTARYVANE', INDETERMINATE) -singlescrew = express_getattr(IfcCompressorTypeEnum, 'SINGLESCREW', INDETERMINATE) -twinscrew = express_getattr(IfcCompressorTypeEnum, 'TWINSCREW', INDETERMINATE) -userdefined = express_getattr(IfcCompressorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCompressorTypeEnum, 'NOTDEFINED', INDETERMINATE) +dynamic = IfcCompressorTypeEnum.DYNAMIC +reciprocating = IfcCompressorTypeEnum.RECIPROCATING +rotary = IfcCompressorTypeEnum.ROTARY +scroll = IfcCompressorTypeEnum.SCROLL +trochoidal = IfcCompressorTypeEnum.TROCHOIDAL +singlestage = IfcCompressorTypeEnum.SINGLESTAGE +booster = IfcCompressorTypeEnum.BOOSTER +opentype = IfcCompressorTypeEnum.OPENTYPE +hermetic = IfcCompressorTypeEnum.HERMETIC +semihermetic = IfcCompressorTypeEnum.SEMIHERMETIC +weldedshellhermetic = IfcCompressorTypeEnum.WELDEDSHELLHERMETIC +rollingpiston = IfcCompressorTypeEnum.ROLLINGPISTON +rotaryvane = IfcCompressorTypeEnum.ROTARYVANE +singlescrew = IfcCompressorTypeEnum.SINGLESCREW +twinscrew = IfcCompressorTypeEnum.TWINSCREW +userdefined = IfcCompressorTypeEnum.USERDEFINED +notdefined = IfcCompressorTypeEnum.NOTDEFINED IfcCondenserTypeEnum = enum_namespace() -aircooled = express_getattr(IfcCondenserTypeEnum, 'AIRCOOLED', INDETERMINATE) -evaporativecooled = express_getattr(IfcCondenserTypeEnum, 'EVAPORATIVECOOLED', INDETERMINATE) -watercooled = express_getattr(IfcCondenserTypeEnum, 'WATERCOOLED', INDETERMINATE) -watercooledbrazedplate = express_getattr(IfcCondenserTypeEnum, 'WATERCOOLEDBRAZEDPLATE', INDETERMINATE) -watercooledshellcoil = express_getattr(IfcCondenserTypeEnum, 'WATERCOOLEDSHELLCOIL', INDETERMINATE) -watercooledshelltube = express_getattr(IfcCondenserTypeEnum, 'WATERCOOLEDSHELLTUBE', INDETERMINATE) -watercooledtubeintube = express_getattr(IfcCondenserTypeEnum, 'WATERCOOLEDTUBEINTUBE', INDETERMINATE) -userdefined = express_getattr(IfcCondenserTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCondenserTypeEnum, 'NOTDEFINED', INDETERMINATE) +aircooled = IfcCondenserTypeEnum.AIRCOOLED +evaporativecooled = IfcCondenserTypeEnum.EVAPORATIVECOOLED +watercooled = IfcCondenserTypeEnum.WATERCOOLED +watercooledbrazedplate = IfcCondenserTypeEnum.WATERCOOLEDBRAZEDPLATE +watercooledshellcoil = IfcCondenserTypeEnum.WATERCOOLEDSHELLCOIL +watercooledshelltube = IfcCondenserTypeEnum.WATERCOOLEDSHELLTUBE +watercooledtubeintube = IfcCondenserTypeEnum.WATERCOOLEDTUBEINTUBE +userdefined = IfcCondenserTypeEnum.USERDEFINED +notdefined = IfcCondenserTypeEnum.NOTDEFINED IfcConnectionTypeEnum = enum_namespace() -atpath = express_getattr(IfcConnectionTypeEnum, 'ATPATH', INDETERMINATE) -atstart = express_getattr(IfcConnectionTypeEnum, 'ATSTART', INDETERMINATE) -atend = express_getattr(IfcConnectionTypeEnum, 'ATEND', INDETERMINATE) -notdefined = express_getattr(IfcConnectionTypeEnum, 'NOTDEFINED', INDETERMINATE) +atpath = IfcConnectionTypeEnum.ATPATH +atstart = IfcConnectionTypeEnum.ATSTART +atend = IfcConnectionTypeEnum.ATEND +notdefined = IfcConnectionTypeEnum.NOTDEFINED IfcConstraintEnum = enum_namespace() -hard = express_getattr(IfcConstraintEnum, 'HARD', INDETERMINATE) -soft = express_getattr(IfcConstraintEnum, 'SOFT', INDETERMINATE) -advisory = express_getattr(IfcConstraintEnum, 'ADVISORY', INDETERMINATE) -userdefined = express_getattr(IfcConstraintEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcConstraintEnum, 'NOTDEFINED', INDETERMINATE) +hard = IfcConstraintEnum.HARD +soft = IfcConstraintEnum.SOFT +advisory = IfcConstraintEnum.ADVISORY +userdefined = IfcConstraintEnum.USERDEFINED +notdefined = IfcConstraintEnum.NOTDEFINED IfcConstructionEquipmentResourceTypeEnum = enum_namespace() -demolishing = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'DEMOLISHING', INDETERMINATE) -earthmoving = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'EARTHMOVING', INDETERMINATE) -erecting = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'ERECTING', INDETERMINATE) -heating = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'HEATING', INDETERMINATE) -lighting = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'LIGHTING', INDETERMINATE) -paving = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'PAVING', INDETERMINATE) -pumping = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'PUMPING', INDETERMINATE) -transporting = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'TRANSPORTING', INDETERMINATE) -userdefined = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'NOTDEFINED', INDETERMINATE) +demolishing = IfcConstructionEquipmentResourceTypeEnum.DEMOLISHING +earthmoving = IfcConstructionEquipmentResourceTypeEnum.EARTHMOVING +erecting = IfcConstructionEquipmentResourceTypeEnum.ERECTING +heating = IfcConstructionEquipmentResourceTypeEnum.HEATING +lighting = IfcConstructionEquipmentResourceTypeEnum.LIGHTING +paving = IfcConstructionEquipmentResourceTypeEnum.PAVING +pumping = IfcConstructionEquipmentResourceTypeEnum.PUMPING +transporting = IfcConstructionEquipmentResourceTypeEnum.TRANSPORTING +userdefined = IfcConstructionEquipmentResourceTypeEnum.USERDEFINED +notdefined = IfcConstructionEquipmentResourceTypeEnum.NOTDEFINED IfcConstructionMaterialResourceTypeEnum = enum_namespace() -aggregates = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'AGGREGATES', INDETERMINATE) -concrete = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'CONCRETE', INDETERMINATE) -drywall = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'DRYWALL', INDETERMINATE) -fuel = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'FUEL', INDETERMINATE) -gypsum = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'GYPSUM', INDETERMINATE) -masonry = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'MASONRY', INDETERMINATE) -metal = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'METAL', INDETERMINATE) -plastic = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'PLASTIC', INDETERMINATE) -wood = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'WOOD', INDETERMINATE) -notdefined = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'NOTDEFINED', INDETERMINATE) -userdefined = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'USERDEFINED', INDETERMINATE) +aggregates = IfcConstructionMaterialResourceTypeEnum.AGGREGATES +concrete = IfcConstructionMaterialResourceTypeEnum.CONCRETE +drywall = IfcConstructionMaterialResourceTypeEnum.DRYWALL +fuel = IfcConstructionMaterialResourceTypeEnum.FUEL +gypsum = IfcConstructionMaterialResourceTypeEnum.GYPSUM +masonry = IfcConstructionMaterialResourceTypeEnum.MASONRY +metal = IfcConstructionMaterialResourceTypeEnum.METAL +plastic = IfcConstructionMaterialResourceTypeEnum.PLASTIC +wood = IfcConstructionMaterialResourceTypeEnum.WOOD +notdefined = IfcConstructionMaterialResourceTypeEnum.NOTDEFINED +userdefined = IfcConstructionMaterialResourceTypeEnum.USERDEFINED IfcConstructionProductResourceTypeEnum = enum_namespace() -assembly = express_getattr(IfcConstructionProductResourceTypeEnum, 'ASSEMBLY', INDETERMINATE) -formwork = express_getattr(IfcConstructionProductResourceTypeEnum, 'FORMWORK', INDETERMINATE) -userdefined = express_getattr(IfcConstructionProductResourceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcConstructionProductResourceTypeEnum, 'NOTDEFINED', INDETERMINATE) +assembly = IfcConstructionProductResourceTypeEnum.ASSEMBLY +formwork = IfcConstructionProductResourceTypeEnum.FORMWORK +userdefined = IfcConstructionProductResourceTypeEnum.USERDEFINED +notdefined = IfcConstructionProductResourceTypeEnum.NOTDEFINED IfcControllerTypeEnum = enum_namespace() -floating = express_getattr(IfcControllerTypeEnum, 'FLOATING', INDETERMINATE) -programmable = express_getattr(IfcControllerTypeEnum, 'PROGRAMMABLE', INDETERMINATE) -proportional = express_getattr(IfcControllerTypeEnum, 'PROPORTIONAL', INDETERMINATE) -multiposition = express_getattr(IfcControllerTypeEnum, 'MULTIPOSITION', INDETERMINATE) -twoposition = express_getattr(IfcControllerTypeEnum, 'TWOPOSITION', INDETERMINATE) -userdefined = express_getattr(IfcControllerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcControllerTypeEnum, 'NOTDEFINED', INDETERMINATE) +floating = IfcControllerTypeEnum.FLOATING +programmable = IfcControllerTypeEnum.PROGRAMMABLE +proportional = IfcControllerTypeEnum.PROPORTIONAL +multiposition = IfcControllerTypeEnum.MULTIPOSITION +twoposition = IfcControllerTypeEnum.TWOPOSITION +userdefined = IfcControllerTypeEnum.USERDEFINED +notdefined = IfcControllerTypeEnum.NOTDEFINED IfcCooledBeamTypeEnum = enum_namespace() -active = express_getattr(IfcCooledBeamTypeEnum, 'ACTIVE', INDETERMINATE) -passive = express_getattr(IfcCooledBeamTypeEnum, 'PASSIVE', INDETERMINATE) -userdefined = express_getattr(IfcCooledBeamTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCooledBeamTypeEnum, 'NOTDEFINED', INDETERMINATE) +active = IfcCooledBeamTypeEnum.ACTIVE +passive = IfcCooledBeamTypeEnum.PASSIVE +userdefined = IfcCooledBeamTypeEnum.USERDEFINED +notdefined = IfcCooledBeamTypeEnum.NOTDEFINED IfcCoolingTowerTypeEnum = enum_namespace() -naturaldraft = express_getattr(IfcCoolingTowerTypeEnum, 'NATURALDRAFT', INDETERMINATE) -mechanicalinduceddraft = express_getattr(IfcCoolingTowerTypeEnum, 'MECHANICALINDUCEDDRAFT', INDETERMINATE) -mechanicalforceddraft = express_getattr(IfcCoolingTowerTypeEnum, 'MECHANICALFORCEDDRAFT', INDETERMINATE) -userdefined = express_getattr(IfcCoolingTowerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCoolingTowerTypeEnum, 'NOTDEFINED', INDETERMINATE) +naturaldraft = IfcCoolingTowerTypeEnum.NATURALDRAFT +mechanicalinduceddraft = IfcCoolingTowerTypeEnum.MECHANICALINDUCEDDRAFT +mechanicalforceddraft = IfcCoolingTowerTypeEnum.MECHANICALFORCEDDRAFT +userdefined = IfcCoolingTowerTypeEnum.USERDEFINED +notdefined = IfcCoolingTowerTypeEnum.NOTDEFINED IfcCostItemTypeEnum = enum_namespace() -userdefined = express_getattr(IfcCostItemTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCostItemTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcCostItemTypeEnum.USERDEFINED +notdefined = IfcCostItemTypeEnum.NOTDEFINED IfcCostScheduleTypeEnum = enum_namespace() -budget = express_getattr(IfcCostScheduleTypeEnum, 'BUDGET', INDETERMINATE) -costplan = express_getattr(IfcCostScheduleTypeEnum, 'COSTPLAN', INDETERMINATE) -estimate = express_getattr(IfcCostScheduleTypeEnum, 'ESTIMATE', INDETERMINATE) -tender = express_getattr(IfcCostScheduleTypeEnum, 'TENDER', INDETERMINATE) -pricedbillofquantities = express_getattr(IfcCostScheduleTypeEnum, 'PRICEDBILLOFQUANTITIES', INDETERMINATE) -unpricedbillofquantities = express_getattr(IfcCostScheduleTypeEnum, 'UNPRICEDBILLOFQUANTITIES', INDETERMINATE) -scheduleofrates = express_getattr(IfcCostScheduleTypeEnum, 'SCHEDULEOFRATES', INDETERMINATE) -userdefined = express_getattr(IfcCostScheduleTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCostScheduleTypeEnum, 'NOTDEFINED', INDETERMINATE) +budget = IfcCostScheduleTypeEnum.BUDGET +costplan = IfcCostScheduleTypeEnum.COSTPLAN +estimate = IfcCostScheduleTypeEnum.ESTIMATE +tender = IfcCostScheduleTypeEnum.TENDER +pricedbillofquantities = IfcCostScheduleTypeEnum.PRICEDBILLOFQUANTITIES +unpricedbillofquantities = IfcCostScheduleTypeEnum.UNPRICEDBILLOFQUANTITIES +scheduleofrates = IfcCostScheduleTypeEnum.SCHEDULEOFRATES +userdefined = IfcCostScheduleTypeEnum.USERDEFINED +notdefined = IfcCostScheduleTypeEnum.NOTDEFINED IfcCoveringTypeEnum = enum_namespace() -ceiling = express_getattr(IfcCoveringTypeEnum, 'CEILING', INDETERMINATE) -flooring = express_getattr(IfcCoveringTypeEnum, 'FLOORING', INDETERMINATE) -cladding = express_getattr(IfcCoveringTypeEnum, 'CLADDING', INDETERMINATE) -roofing = express_getattr(IfcCoveringTypeEnum, 'ROOFING', INDETERMINATE) -molding = express_getattr(IfcCoveringTypeEnum, 'MOLDING', INDETERMINATE) -skirtingboard = express_getattr(IfcCoveringTypeEnum, 'SKIRTINGBOARD', INDETERMINATE) -insulation = express_getattr(IfcCoveringTypeEnum, 'INSULATION', INDETERMINATE) -membrane = express_getattr(IfcCoveringTypeEnum, 'MEMBRANE', INDETERMINATE) -sleeving = express_getattr(IfcCoveringTypeEnum, 'SLEEVING', INDETERMINATE) -wrapping = express_getattr(IfcCoveringTypeEnum, 'WRAPPING', INDETERMINATE) -userdefined = express_getattr(IfcCoveringTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCoveringTypeEnum, 'NOTDEFINED', INDETERMINATE) +ceiling = IfcCoveringTypeEnum.CEILING +flooring = IfcCoveringTypeEnum.FLOORING +cladding = IfcCoveringTypeEnum.CLADDING +roofing = IfcCoveringTypeEnum.ROOFING +molding = IfcCoveringTypeEnum.MOLDING +skirtingboard = IfcCoveringTypeEnum.SKIRTINGBOARD +insulation = IfcCoveringTypeEnum.INSULATION +membrane = IfcCoveringTypeEnum.MEMBRANE +sleeving = IfcCoveringTypeEnum.SLEEVING +wrapping = IfcCoveringTypeEnum.WRAPPING +userdefined = IfcCoveringTypeEnum.USERDEFINED +notdefined = IfcCoveringTypeEnum.NOTDEFINED IfcCrewResourceTypeEnum = enum_namespace() -office = express_getattr(IfcCrewResourceTypeEnum, 'OFFICE', INDETERMINATE) -site = express_getattr(IfcCrewResourceTypeEnum, 'SITE', INDETERMINATE) -userdefined = express_getattr(IfcCrewResourceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCrewResourceTypeEnum, 'NOTDEFINED', INDETERMINATE) +office = IfcCrewResourceTypeEnum.OFFICE +site = IfcCrewResourceTypeEnum.SITE +userdefined = IfcCrewResourceTypeEnum.USERDEFINED +notdefined = IfcCrewResourceTypeEnum.NOTDEFINED IfcCurtainWallTypeEnum = enum_namespace() -userdefined = express_getattr(IfcCurtainWallTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCurtainWallTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcCurtainWallTypeEnum.USERDEFINED +notdefined = IfcCurtainWallTypeEnum.NOTDEFINED IfcCurveInterpolationEnum = enum_namespace() -linear = express_getattr(IfcCurveInterpolationEnum, 'LINEAR', INDETERMINATE) -log_linear = express_getattr(IfcCurveInterpolationEnum, 'LOG_LINEAR', INDETERMINATE) -log_log = express_getattr(IfcCurveInterpolationEnum, 'LOG_LOG', INDETERMINATE) -notdefined = express_getattr(IfcCurveInterpolationEnum, 'NOTDEFINED', INDETERMINATE) +linear = IfcCurveInterpolationEnum.LINEAR +log_linear = IfcCurveInterpolationEnum.LOG_LINEAR +log_log = IfcCurveInterpolationEnum.LOG_LOG +notdefined = IfcCurveInterpolationEnum.NOTDEFINED IfcDamperTypeEnum = enum_namespace() -backdraftdamper = express_getattr(IfcDamperTypeEnum, 'BACKDRAFTDAMPER', INDETERMINATE) -balancingdamper = express_getattr(IfcDamperTypeEnum, 'BALANCINGDAMPER', INDETERMINATE) -blastdamper = express_getattr(IfcDamperTypeEnum, 'BLASTDAMPER', INDETERMINATE) -controldamper = express_getattr(IfcDamperTypeEnum, 'CONTROLDAMPER', INDETERMINATE) -firedamper = express_getattr(IfcDamperTypeEnum, 'FIREDAMPER', INDETERMINATE) -firesmokedamper = express_getattr(IfcDamperTypeEnum, 'FIRESMOKEDAMPER', INDETERMINATE) -fumehoodexhaust = express_getattr(IfcDamperTypeEnum, 'FUMEHOODEXHAUST', INDETERMINATE) -gravitydamper = express_getattr(IfcDamperTypeEnum, 'GRAVITYDAMPER', INDETERMINATE) -gravityreliefdamper = express_getattr(IfcDamperTypeEnum, 'GRAVITYRELIEFDAMPER', INDETERMINATE) -reliefdamper = express_getattr(IfcDamperTypeEnum, 'RELIEFDAMPER', INDETERMINATE) -smokedamper = express_getattr(IfcDamperTypeEnum, 'SMOKEDAMPER', INDETERMINATE) -userdefined = express_getattr(IfcDamperTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDamperTypeEnum, 'NOTDEFINED', INDETERMINATE) +backdraftdamper = IfcDamperTypeEnum.BACKDRAFTDAMPER +balancingdamper = IfcDamperTypeEnum.BALANCINGDAMPER +blastdamper = IfcDamperTypeEnum.BLASTDAMPER +controldamper = IfcDamperTypeEnum.CONTROLDAMPER +firedamper = IfcDamperTypeEnum.FIREDAMPER +firesmokedamper = IfcDamperTypeEnum.FIRESMOKEDAMPER +fumehoodexhaust = IfcDamperTypeEnum.FUMEHOODEXHAUST +gravitydamper = IfcDamperTypeEnum.GRAVITYDAMPER +gravityreliefdamper = IfcDamperTypeEnum.GRAVITYRELIEFDAMPER +reliefdamper = IfcDamperTypeEnum.RELIEFDAMPER +smokedamper = IfcDamperTypeEnum.SMOKEDAMPER +userdefined = IfcDamperTypeEnum.USERDEFINED +notdefined = IfcDamperTypeEnum.NOTDEFINED IfcDataOriginEnum = enum_namespace() -measured = express_getattr(IfcDataOriginEnum, 'MEASURED', INDETERMINATE) -predicted = express_getattr(IfcDataOriginEnum, 'PREDICTED', INDETERMINATE) -simulated = express_getattr(IfcDataOriginEnum, 'SIMULATED', INDETERMINATE) -userdefined = express_getattr(IfcDataOriginEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDataOriginEnum, 'NOTDEFINED', INDETERMINATE) +measured = IfcDataOriginEnum.MEASURED +predicted = IfcDataOriginEnum.PREDICTED +simulated = IfcDataOriginEnum.SIMULATED +userdefined = IfcDataOriginEnum.USERDEFINED +notdefined = IfcDataOriginEnum.NOTDEFINED IfcDerivedUnitEnum = enum_namespace() -angularvelocityunit = express_getattr(IfcDerivedUnitEnum, 'ANGULARVELOCITYUNIT', INDETERMINATE) -areadensityunit = express_getattr(IfcDerivedUnitEnum, 'AREADENSITYUNIT', INDETERMINATE) -compoundplaneangleunit = express_getattr(IfcDerivedUnitEnum, 'COMPOUNDPLANEANGLEUNIT', INDETERMINATE) -dynamicviscosityunit = express_getattr(IfcDerivedUnitEnum, 'DYNAMICVISCOSITYUNIT', INDETERMINATE) -heatfluxdensityunit = express_getattr(IfcDerivedUnitEnum, 'HEATFLUXDENSITYUNIT', INDETERMINATE) -integercountrateunit = express_getattr(IfcDerivedUnitEnum, 'INTEGERCOUNTRATEUNIT', INDETERMINATE) -isothermalmoisturecapacityunit = express_getattr(IfcDerivedUnitEnum, 'ISOTHERMALMOISTURECAPACITYUNIT', INDETERMINATE) -kinematicviscosityunit = express_getattr(IfcDerivedUnitEnum, 'KINEMATICVISCOSITYUNIT', INDETERMINATE) -linearvelocityunit = express_getattr(IfcDerivedUnitEnum, 'LINEARVELOCITYUNIT', INDETERMINATE) -massdensityunit = express_getattr(IfcDerivedUnitEnum, 'MASSDENSITYUNIT', INDETERMINATE) -massflowrateunit = express_getattr(IfcDerivedUnitEnum, 'MASSFLOWRATEUNIT', INDETERMINATE) -moisturediffusivityunit = express_getattr(IfcDerivedUnitEnum, 'MOISTUREDIFFUSIVITYUNIT', INDETERMINATE) -molecularweightunit = express_getattr(IfcDerivedUnitEnum, 'MOLECULARWEIGHTUNIT', INDETERMINATE) -specificheatcapacityunit = express_getattr(IfcDerivedUnitEnum, 'SPECIFICHEATCAPACITYUNIT', INDETERMINATE) -thermaladmittanceunit = express_getattr(IfcDerivedUnitEnum, 'THERMALADMITTANCEUNIT', INDETERMINATE) -thermalconductanceunit = express_getattr(IfcDerivedUnitEnum, 'THERMALCONDUCTANCEUNIT', INDETERMINATE) -thermalresistanceunit = express_getattr(IfcDerivedUnitEnum, 'THERMALRESISTANCEUNIT', INDETERMINATE) -thermaltransmittanceunit = express_getattr(IfcDerivedUnitEnum, 'THERMALTRANSMITTANCEUNIT', INDETERMINATE) -vaporpermeabilityunit = express_getattr(IfcDerivedUnitEnum, 'VAPORPERMEABILITYUNIT', INDETERMINATE) -volumetricflowrateunit = express_getattr(IfcDerivedUnitEnum, 'VOLUMETRICFLOWRATEUNIT', INDETERMINATE) -rotationalfrequencyunit = express_getattr(IfcDerivedUnitEnum, 'ROTATIONALFREQUENCYUNIT', INDETERMINATE) -torqueunit = express_getattr(IfcDerivedUnitEnum, 'TORQUEUNIT', INDETERMINATE) -momentofinertiaunit = express_getattr(IfcDerivedUnitEnum, 'MOMENTOFINERTIAUNIT', INDETERMINATE) -linearmomentunit = express_getattr(IfcDerivedUnitEnum, 'LINEARMOMENTUNIT', INDETERMINATE) -linearforceunit = express_getattr(IfcDerivedUnitEnum, 'LINEARFORCEUNIT', INDETERMINATE) -planarforceunit = express_getattr(IfcDerivedUnitEnum, 'PLANARFORCEUNIT', INDETERMINATE) -modulusofelasticityunit = express_getattr(IfcDerivedUnitEnum, 'MODULUSOFELASTICITYUNIT', INDETERMINATE) -shearmodulusunit = express_getattr(IfcDerivedUnitEnum, 'SHEARMODULUSUNIT', INDETERMINATE) -linearstiffnessunit = express_getattr(IfcDerivedUnitEnum, 'LINEARSTIFFNESSUNIT', INDETERMINATE) -rotationalstiffnessunit = express_getattr(IfcDerivedUnitEnum, 'ROTATIONALSTIFFNESSUNIT', INDETERMINATE) -modulusofsubgradereactionunit = express_getattr(IfcDerivedUnitEnum, 'MODULUSOFSUBGRADEREACTIONUNIT', INDETERMINATE) -accelerationunit = express_getattr(IfcDerivedUnitEnum, 'ACCELERATIONUNIT', INDETERMINATE) -curvatureunit = express_getattr(IfcDerivedUnitEnum, 'CURVATUREUNIT', INDETERMINATE) -heatingvalueunit = express_getattr(IfcDerivedUnitEnum, 'HEATINGVALUEUNIT', INDETERMINATE) -ionconcentrationunit = express_getattr(IfcDerivedUnitEnum, 'IONCONCENTRATIONUNIT', INDETERMINATE) -luminousintensitydistributionunit = express_getattr(IfcDerivedUnitEnum, 'LUMINOUSINTENSITYDISTRIBUTIONUNIT', INDETERMINATE) -massperlengthunit = express_getattr(IfcDerivedUnitEnum, 'MASSPERLENGTHUNIT', INDETERMINATE) -modulusoflinearsubgradereactionunit = express_getattr(IfcDerivedUnitEnum, 'MODULUSOFLINEARSUBGRADEREACTIONUNIT', INDETERMINATE) -modulusofrotationalsubgradereactionunit = express_getattr(IfcDerivedUnitEnum, 'MODULUSOFROTATIONALSUBGRADEREACTIONUNIT', INDETERMINATE) -phunit = express_getattr(IfcDerivedUnitEnum, 'PHUNIT', INDETERMINATE) -rotationalmassunit = express_getattr(IfcDerivedUnitEnum, 'ROTATIONALMASSUNIT', INDETERMINATE) -sectionareaintegralunit = express_getattr(IfcDerivedUnitEnum, 'SECTIONAREAINTEGRALUNIT', INDETERMINATE) -sectionmodulusunit = express_getattr(IfcDerivedUnitEnum, 'SECTIONMODULUSUNIT', INDETERMINATE) -soundpowerlevelunit = express_getattr(IfcDerivedUnitEnum, 'SOUNDPOWERLEVELUNIT', INDETERMINATE) -soundpowerunit = express_getattr(IfcDerivedUnitEnum, 'SOUNDPOWERUNIT', INDETERMINATE) -soundpressurelevelunit = express_getattr(IfcDerivedUnitEnum, 'SOUNDPRESSURELEVELUNIT', INDETERMINATE) -soundpressureunit = express_getattr(IfcDerivedUnitEnum, 'SOUNDPRESSUREUNIT', INDETERMINATE) -temperaturegradientunit = express_getattr(IfcDerivedUnitEnum, 'TEMPERATUREGRADIENTUNIT', INDETERMINATE) -temperaturerateofchangeunit = express_getattr(IfcDerivedUnitEnum, 'TEMPERATURERATEOFCHANGEUNIT', INDETERMINATE) -thermalexpansioncoefficientunit = express_getattr(IfcDerivedUnitEnum, 'THERMALEXPANSIONCOEFFICIENTUNIT', INDETERMINATE) -warpingconstantunit = express_getattr(IfcDerivedUnitEnum, 'WARPINGCONSTANTUNIT', INDETERMINATE) -warpingmomentunit = express_getattr(IfcDerivedUnitEnum, 'WARPINGMOMENTUNIT', INDETERMINATE) -userdefined = express_getattr(IfcDerivedUnitEnum, 'USERDEFINED', INDETERMINATE) +angularvelocityunit = IfcDerivedUnitEnum.ANGULARVELOCITYUNIT +areadensityunit = IfcDerivedUnitEnum.AREADENSITYUNIT +compoundplaneangleunit = IfcDerivedUnitEnum.COMPOUNDPLANEANGLEUNIT +dynamicviscosityunit = IfcDerivedUnitEnum.DYNAMICVISCOSITYUNIT +heatfluxdensityunit = IfcDerivedUnitEnum.HEATFLUXDENSITYUNIT +integercountrateunit = IfcDerivedUnitEnum.INTEGERCOUNTRATEUNIT +isothermalmoisturecapacityunit = IfcDerivedUnitEnum.ISOTHERMALMOISTURECAPACITYUNIT +kinematicviscosityunit = IfcDerivedUnitEnum.KINEMATICVISCOSITYUNIT +linearvelocityunit = IfcDerivedUnitEnum.LINEARVELOCITYUNIT +massdensityunit = IfcDerivedUnitEnum.MASSDENSITYUNIT +massflowrateunit = IfcDerivedUnitEnum.MASSFLOWRATEUNIT +moisturediffusivityunit = IfcDerivedUnitEnum.MOISTUREDIFFUSIVITYUNIT +molecularweightunit = IfcDerivedUnitEnum.MOLECULARWEIGHTUNIT +specificheatcapacityunit = IfcDerivedUnitEnum.SPECIFICHEATCAPACITYUNIT +thermaladmittanceunit = IfcDerivedUnitEnum.THERMALADMITTANCEUNIT +thermalconductanceunit = IfcDerivedUnitEnum.THERMALCONDUCTANCEUNIT +thermalresistanceunit = IfcDerivedUnitEnum.THERMALRESISTANCEUNIT +thermaltransmittanceunit = IfcDerivedUnitEnum.THERMALTRANSMITTANCEUNIT +vaporpermeabilityunit = IfcDerivedUnitEnum.VAPORPERMEABILITYUNIT +volumetricflowrateunit = IfcDerivedUnitEnum.VOLUMETRICFLOWRATEUNIT +rotationalfrequencyunit = IfcDerivedUnitEnum.ROTATIONALFREQUENCYUNIT +torqueunit = IfcDerivedUnitEnum.TORQUEUNIT +momentofinertiaunit = IfcDerivedUnitEnum.MOMENTOFINERTIAUNIT +linearmomentunit = IfcDerivedUnitEnum.LINEARMOMENTUNIT +linearforceunit = IfcDerivedUnitEnum.LINEARFORCEUNIT +planarforceunit = IfcDerivedUnitEnum.PLANARFORCEUNIT +modulusofelasticityunit = IfcDerivedUnitEnum.MODULUSOFELASTICITYUNIT +shearmodulusunit = IfcDerivedUnitEnum.SHEARMODULUSUNIT +linearstiffnessunit = IfcDerivedUnitEnum.LINEARSTIFFNESSUNIT +rotationalstiffnessunit = IfcDerivedUnitEnum.ROTATIONALSTIFFNESSUNIT +modulusofsubgradereactionunit = IfcDerivedUnitEnum.MODULUSOFSUBGRADEREACTIONUNIT +accelerationunit = IfcDerivedUnitEnum.ACCELERATIONUNIT +curvatureunit = IfcDerivedUnitEnum.CURVATUREUNIT +heatingvalueunit = IfcDerivedUnitEnum.HEATINGVALUEUNIT +ionconcentrationunit = IfcDerivedUnitEnum.IONCONCENTRATIONUNIT +luminousintensitydistributionunit = IfcDerivedUnitEnum.LUMINOUSINTENSITYDISTRIBUTIONUNIT +massperlengthunit = IfcDerivedUnitEnum.MASSPERLENGTHUNIT +modulusoflinearsubgradereactionunit = IfcDerivedUnitEnum.MODULUSOFLINEARSUBGRADEREACTIONUNIT +modulusofrotationalsubgradereactionunit = IfcDerivedUnitEnum.MODULUSOFROTATIONALSUBGRADEREACTIONUNIT +phunit = IfcDerivedUnitEnum.PHUNIT +rotationalmassunit = IfcDerivedUnitEnum.ROTATIONALMASSUNIT +sectionareaintegralunit = IfcDerivedUnitEnum.SECTIONAREAINTEGRALUNIT +sectionmodulusunit = IfcDerivedUnitEnum.SECTIONMODULUSUNIT +soundpowerlevelunit = IfcDerivedUnitEnum.SOUNDPOWERLEVELUNIT +soundpowerunit = IfcDerivedUnitEnum.SOUNDPOWERUNIT +soundpressurelevelunit = IfcDerivedUnitEnum.SOUNDPRESSURELEVELUNIT +soundpressureunit = IfcDerivedUnitEnum.SOUNDPRESSUREUNIT +temperaturegradientunit = IfcDerivedUnitEnum.TEMPERATUREGRADIENTUNIT +temperaturerateofchangeunit = IfcDerivedUnitEnum.TEMPERATURERATEOFCHANGEUNIT +thermalexpansioncoefficientunit = IfcDerivedUnitEnum.THERMALEXPANSIONCOEFFICIENTUNIT +warpingconstantunit = IfcDerivedUnitEnum.WARPINGCONSTANTUNIT +warpingmomentunit = IfcDerivedUnitEnum.WARPINGMOMENTUNIT +userdefined = IfcDerivedUnitEnum.USERDEFINED IfcDirectionSenseEnum = enum_namespace() -positive = express_getattr(IfcDirectionSenseEnum, 'POSITIVE', INDETERMINATE) -negative = express_getattr(IfcDirectionSenseEnum, 'NEGATIVE', INDETERMINATE) +positive = IfcDirectionSenseEnum.POSITIVE +negative = IfcDirectionSenseEnum.NEGATIVE IfcDiscreteAccessoryTypeEnum = enum_namespace() -anchorplate = express_getattr(IfcDiscreteAccessoryTypeEnum, 'ANCHORPLATE', INDETERMINATE) -bracket = express_getattr(IfcDiscreteAccessoryTypeEnum, 'BRACKET', INDETERMINATE) -shoe = express_getattr(IfcDiscreteAccessoryTypeEnum, 'SHOE', INDETERMINATE) -userdefined = express_getattr(IfcDiscreteAccessoryTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDiscreteAccessoryTypeEnum, 'NOTDEFINED', INDETERMINATE) +anchorplate = IfcDiscreteAccessoryTypeEnum.ANCHORPLATE +bracket = IfcDiscreteAccessoryTypeEnum.BRACKET +shoe = IfcDiscreteAccessoryTypeEnum.SHOE +userdefined = IfcDiscreteAccessoryTypeEnum.USERDEFINED +notdefined = IfcDiscreteAccessoryTypeEnum.NOTDEFINED IfcDistributionChamberElementTypeEnum = enum_namespace() -formedduct = express_getattr(IfcDistributionChamberElementTypeEnum, 'FORMEDDUCT', INDETERMINATE) -inspectionchamber = express_getattr(IfcDistributionChamberElementTypeEnum, 'INSPECTIONCHAMBER', INDETERMINATE) -inspectionpit = express_getattr(IfcDistributionChamberElementTypeEnum, 'INSPECTIONPIT', INDETERMINATE) -manhole = express_getattr(IfcDistributionChamberElementTypeEnum, 'MANHOLE', INDETERMINATE) -meterchamber = express_getattr(IfcDistributionChamberElementTypeEnum, 'METERCHAMBER', INDETERMINATE) -sump = express_getattr(IfcDistributionChamberElementTypeEnum, 'SUMP', INDETERMINATE) -trench = express_getattr(IfcDistributionChamberElementTypeEnum, 'TRENCH', INDETERMINATE) -valvechamber = express_getattr(IfcDistributionChamberElementTypeEnum, 'VALVECHAMBER', INDETERMINATE) -userdefined = express_getattr(IfcDistributionChamberElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDistributionChamberElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +formedduct = IfcDistributionChamberElementTypeEnum.FORMEDDUCT +inspectionchamber = IfcDistributionChamberElementTypeEnum.INSPECTIONCHAMBER +inspectionpit = IfcDistributionChamberElementTypeEnum.INSPECTIONPIT +manhole = IfcDistributionChamberElementTypeEnum.MANHOLE +meterchamber = IfcDistributionChamberElementTypeEnum.METERCHAMBER +sump = IfcDistributionChamberElementTypeEnum.SUMP +trench = IfcDistributionChamberElementTypeEnum.TRENCH +valvechamber = IfcDistributionChamberElementTypeEnum.VALVECHAMBER +userdefined = IfcDistributionChamberElementTypeEnum.USERDEFINED +notdefined = IfcDistributionChamberElementTypeEnum.NOTDEFINED IfcDistributionPortTypeEnum = enum_namespace() -cable = express_getattr(IfcDistributionPortTypeEnum, 'CABLE', INDETERMINATE) -cablecarrier = express_getattr(IfcDistributionPortTypeEnum, 'CABLECARRIER', INDETERMINATE) -duct = express_getattr(IfcDistributionPortTypeEnum, 'DUCT', INDETERMINATE) -pipe = express_getattr(IfcDistributionPortTypeEnum, 'PIPE', INDETERMINATE) -userdefined = express_getattr(IfcDistributionPortTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDistributionPortTypeEnum, 'NOTDEFINED', INDETERMINATE) +cable = IfcDistributionPortTypeEnum.CABLE +cablecarrier = IfcDistributionPortTypeEnum.CABLECARRIER +duct = IfcDistributionPortTypeEnum.DUCT +pipe = IfcDistributionPortTypeEnum.PIPE +userdefined = IfcDistributionPortTypeEnum.USERDEFINED +notdefined = IfcDistributionPortTypeEnum.NOTDEFINED IfcDistributionSystemEnum = enum_namespace() -airconditioning = express_getattr(IfcDistributionSystemEnum, 'AIRCONDITIONING', INDETERMINATE) -audiovisual = express_getattr(IfcDistributionSystemEnum, 'AUDIOVISUAL', INDETERMINATE) -chemical = express_getattr(IfcDistributionSystemEnum, 'CHEMICAL', INDETERMINATE) -chilledwater = express_getattr(IfcDistributionSystemEnum, 'CHILLEDWATER', INDETERMINATE) -communication = express_getattr(IfcDistributionSystemEnum, 'COMMUNICATION', INDETERMINATE) -compressedair = express_getattr(IfcDistributionSystemEnum, 'COMPRESSEDAIR', INDETERMINATE) -condenserwater = express_getattr(IfcDistributionSystemEnum, 'CONDENSERWATER', INDETERMINATE) -control = express_getattr(IfcDistributionSystemEnum, 'CONTROL', INDETERMINATE) -conveying = express_getattr(IfcDistributionSystemEnum, 'CONVEYING', INDETERMINATE) -data = express_getattr(IfcDistributionSystemEnum, 'DATA', INDETERMINATE) -disposal = express_getattr(IfcDistributionSystemEnum, 'DISPOSAL', INDETERMINATE) -domesticcoldwater = express_getattr(IfcDistributionSystemEnum, 'DOMESTICCOLDWATER', INDETERMINATE) -domestichotwater = express_getattr(IfcDistributionSystemEnum, 'DOMESTICHOTWATER', INDETERMINATE) -drainage = express_getattr(IfcDistributionSystemEnum, 'DRAINAGE', INDETERMINATE) -earthing = express_getattr(IfcDistributionSystemEnum, 'EARTHING', INDETERMINATE) -electrical = express_getattr(IfcDistributionSystemEnum, 'ELECTRICAL', INDETERMINATE) -electroacoustic = express_getattr(IfcDistributionSystemEnum, 'ELECTROACOUSTIC', INDETERMINATE) -exhaust = express_getattr(IfcDistributionSystemEnum, 'EXHAUST', INDETERMINATE) -fireprotection = express_getattr(IfcDistributionSystemEnum, 'FIREPROTECTION', INDETERMINATE) -fuel = express_getattr(IfcDistributionSystemEnum, 'FUEL', INDETERMINATE) -gas = express_getattr(IfcDistributionSystemEnum, 'GAS', INDETERMINATE) -hazardous = express_getattr(IfcDistributionSystemEnum, 'HAZARDOUS', INDETERMINATE) -heating = express_getattr(IfcDistributionSystemEnum, 'HEATING', INDETERMINATE) -lighting = express_getattr(IfcDistributionSystemEnum, 'LIGHTING', INDETERMINATE) -lightningprotection = express_getattr(IfcDistributionSystemEnum, 'LIGHTNINGPROTECTION', INDETERMINATE) -municipalsolidwaste = express_getattr(IfcDistributionSystemEnum, 'MUNICIPALSOLIDWASTE', INDETERMINATE) -oil = express_getattr(IfcDistributionSystemEnum, 'OIL', INDETERMINATE) -operational = express_getattr(IfcDistributionSystemEnum, 'OPERATIONAL', INDETERMINATE) -powergeneration = express_getattr(IfcDistributionSystemEnum, 'POWERGENERATION', INDETERMINATE) -rainwater = express_getattr(IfcDistributionSystemEnum, 'RAINWATER', INDETERMINATE) -refrigeration = express_getattr(IfcDistributionSystemEnum, 'REFRIGERATION', INDETERMINATE) -security = express_getattr(IfcDistributionSystemEnum, 'SECURITY', INDETERMINATE) -sewage = express_getattr(IfcDistributionSystemEnum, 'SEWAGE', INDETERMINATE) -signal = express_getattr(IfcDistributionSystemEnum, 'SIGNAL', INDETERMINATE) -stormwater = express_getattr(IfcDistributionSystemEnum, 'STORMWATER', INDETERMINATE) -telephone = express_getattr(IfcDistributionSystemEnum, 'TELEPHONE', INDETERMINATE) -tv = express_getattr(IfcDistributionSystemEnum, 'TV', INDETERMINATE) -vacuum = express_getattr(IfcDistributionSystemEnum, 'VACUUM', INDETERMINATE) -vent = express_getattr(IfcDistributionSystemEnum, 'VENT', INDETERMINATE) -ventilation = express_getattr(IfcDistributionSystemEnum, 'VENTILATION', INDETERMINATE) -wastewater = express_getattr(IfcDistributionSystemEnum, 'WASTEWATER', INDETERMINATE) -watersupply = express_getattr(IfcDistributionSystemEnum, 'WATERSUPPLY', INDETERMINATE) -userdefined = express_getattr(IfcDistributionSystemEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDistributionSystemEnum, 'NOTDEFINED', INDETERMINATE) +airconditioning = IfcDistributionSystemEnum.AIRCONDITIONING +audiovisual = IfcDistributionSystemEnum.AUDIOVISUAL +chemical = IfcDistributionSystemEnum.CHEMICAL +chilledwater = IfcDistributionSystemEnum.CHILLEDWATER +communication = IfcDistributionSystemEnum.COMMUNICATION +compressedair = IfcDistributionSystemEnum.COMPRESSEDAIR +condenserwater = IfcDistributionSystemEnum.CONDENSERWATER +control = IfcDistributionSystemEnum.CONTROL +conveying = IfcDistributionSystemEnum.CONVEYING +data = IfcDistributionSystemEnum.DATA +disposal = IfcDistributionSystemEnum.DISPOSAL +domesticcoldwater = IfcDistributionSystemEnum.DOMESTICCOLDWATER +domestichotwater = IfcDistributionSystemEnum.DOMESTICHOTWATER +drainage = IfcDistributionSystemEnum.DRAINAGE +earthing = IfcDistributionSystemEnum.EARTHING +electrical = IfcDistributionSystemEnum.ELECTRICAL +electroacoustic = IfcDistributionSystemEnum.ELECTROACOUSTIC +exhaust = IfcDistributionSystemEnum.EXHAUST +fireprotection = IfcDistributionSystemEnum.FIREPROTECTION +fuel = IfcDistributionSystemEnum.FUEL +gas = IfcDistributionSystemEnum.GAS +hazardous = IfcDistributionSystemEnum.HAZARDOUS +heating = IfcDistributionSystemEnum.HEATING +lighting = IfcDistributionSystemEnum.LIGHTING +lightningprotection = IfcDistributionSystemEnum.LIGHTNINGPROTECTION +municipalsolidwaste = IfcDistributionSystemEnum.MUNICIPALSOLIDWASTE +oil = IfcDistributionSystemEnum.OIL +operational = IfcDistributionSystemEnum.OPERATIONAL +powergeneration = IfcDistributionSystemEnum.POWERGENERATION +rainwater = IfcDistributionSystemEnum.RAINWATER +refrigeration = IfcDistributionSystemEnum.REFRIGERATION +security = IfcDistributionSystemEnum.SECURITY +sewage = IfcDistributionSystemEnum.SEWAGE +signal = IfcDistributionSystemEnum.SIGNAL +stormwater = IfcDistributionSystemEnum.STORMWATER +telephone = IfcDistributionSystemEnum.TELEPHONE +tv = IfcDistributionSystemEnum.TV +vacuum = IfcDistributionSystemEnum.VACUUM +vent = IfcDistributionSystemEnum.VENT +ventilation = IfcDistributionSystemEnum.VENTILATION +wastewater = IfcDistributionSystemEnum.WASTEWATER +watersupply = IfcDistributionSystemEnum.WATERSUPPLY +userdefined = IfcDistributionSystemEnum.USERDEFINED +notdefined = IfcDistributionSystemEnum.NOTDEFINED IfcDocumentConfidentialityEnum = enum_namespace() -public = express_getattr(IfcDocumentConfidentialityEnum, 'PUBLIC', INDETERMINATE) -restricted = express_getattr(IfcDocumentConfidentialityEnum, 'RESTRICTED', INDETERMINATE) -confidential = express_getattr(IfcDocumentConfidentialityEnum, 'CONFIDENTIAL', INDETERMINATE) -personal = express_getattr(IfcDocumentConfidentialityEnum, 'PERSONAL', INDETERMINATE) -userdefined = express_getattr(IfcDocumentConfidentialityEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDocumentConfidentialityEnum, 'NOTDEFINED', INDETERMINATE) +public = IfcDocumentConfidentialityEnum.PUBLIC +restricted = IfcDocumentConfidentialityEnum.RESTRICTED +confidential = IfcDocumentConfidentialityEnum.CONFIDENTIAL +personal = IfcDocumentConfidentialityEnum.PERSONAL +userdefined = IfcDocumentConfidentialityEnum.USERDEFINED +notdefined = IfcDocumentConfidentialityEnum.NOTDEFINED IfcDocumentStatusEnum = enum_namespace() -draft = express_getattr(IfcDocumentStatusEnum, 'DRAFT', INDETERMINATE) -finaldraft = express_getattr(IfcDocumentStatusEnum, 'FINALDRAFT', INDETERMINATE) -final = express_getattr(IfcDocumentStatusEnum, 'FINAL', INDETERMINATE) -revision = express_getattr(IfcDocumentStatusEnum, 'REVISION', INDETERMINATE) -notdefined = express_getattr(IfcDocumentStatusEnum, 'NOTDEFINED', INDETERMINATE) +draft = IfcDocumentStatusEnum.DRAFT +finaldraft = IfcDocumentStatusEnum.FINALDRAFT +final = IfcDocumentStatusEnum.FINAL +revision = IfcDocumentStatusEnum.REVISION +notdefined = IfcDocumentStatusEnum.NOTDEFINED IfcDoorPanelOperationEnum = enum_namespace() -swinging = express_getattr(IfcDoorPanelOperationEnum, 'SWINGING', INDETERMINATE) -double_acting = express_getattr(IfcDoorPanelOperationEnum, 'DOUBLE_ACTING', INDETERMINATE) -sliding = express_getattr(IfcDoorPanelOperationEnum, 'SLIDING', INDETERMINATE) -folding = express_getattr(IfcDoorPanelOperationEnum, 'FOLDING', INDETERMINATE) -revolving = express_getattr(IfcDoorPanelOperationEnum, 'REVOLVING', INDETERMINATE) -rollingup = express_getattr(IfcDoorPanelOperationEnum, 'ROLLINGUP', INDETERMINATE) -fixedpanel = express_getattr(IfcDoorPanelOperationEnum, 'FIXEDPANEL', INDETERMINATE) -userdefined = express_getattr(IfcDoorPanelOperationEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDoorPanelOperationEnum, 'NOTDEFINED', INDETERMINATE) +swinging = IfcDoorPanelOperationEnum.SWINGING +double_acting = IfcDoorPanelOperationEnum.DOUBLE_ACTING +sliding = IfcDoorPanelOperationEnum.SLIDING +folding = IfcDoorPanelOperationEnum.FOLDING +revolving = IfcDoorPanelOperationEnum.REVOLVING +rollingup = IfcDoorPanelOperationEnum.ROLLINGUP +fixedpanel = IfcDoorPanelOperationEnum.FIXEDPANEL +userdefined = IfcDoorPanelOperationEnum.USERDEFINED +notdefined = IfcDoorPanelOperationEnum.NOTDEFINED IfcDoorPanelPositionEnum = enum_namespace() -left = express_getattr(IfcDoorPanelPositionEnum, 'LEFT', INDETERMINATE) -middle = express_getattr(IfcDoorPanelPositionEnum, 'MIDDLE', INDETERMINATE) -right = express_getattr(IfcDoorPanelPositionEnum, 'RIGHT', INDETERMINATE) -notdefined = express_getattr(IfcDoorPanelPositionEnum, 'NOTDEFINED', INDETERMINATE) +left = IfcDoorPanelPositionEnum.LEFT +middle = IfcDoorPanelPositionEnum.MIDDLE +right = IfcDoorPanelPositionEnum.RIGHT +notdefined = IfcDoorPanelPositionEnum.NOTDEFINED IfcDoorStyleConstructionEnum = enum_namespace() -aluminium = express_getattr(IfcDoorStyleConstructionEnum, 'ALUMINIUM', INDETERMINATE) -high_grade_steel = express_getattr(IfcDoorStyleConstructionEnum, 'HIGH_GRADE_STEEL', INDETERMINATE) -steel = express_getattr(IfcDoorStyleConstructionEnum, 'STEEL', INDETERMINATE) -wood = express_getattr(IfcDoorStyleConstructionEnum, 'WOOD', INDETERMINATE) -aluminium_wood = express_getattr(IfcDoorStyleConstructionEnum, 'ALUMINIUM_WOOD', INDETERMINATE) -aluminium_plastic = express_getattr(IfcDoorStyleConstructionEnum, 'ALUMINIUM_PLASTIC', INDETERMINATE) -plastic = express_getattr(IfcDoorStyleConstructionEnum, 'PLASTIC', INDETERMINATE) -userdefined = express_getattr(IfcDoorStyleConstructionEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDoorStyleConstructionEnum, 'NOTDEFINED', INDETERMINATE) +aluminium = IfcDoorStyleConstructionEnum.ALUMINIUM +high_grade_steel = IfcDoorStyleConstructionEnum.HIGH_GRADE_STEEL +steel = IfcDoorStyleConstructionEnum.STEEL +wood = IfcDoorStyleConstructionEnum.WOOD +aluminium_wood = IfcDoorStyleConstructionEnum.ALUMINIUM_WOOD +aluminium_plastic = IfcDoorStyleConstructionEnum.ALUMINIUM_PLASTIC +plastic = IfcDoorStyleConstructionEnum.PLASTIC +userdefined = IfcDoorStyleConstructionEnum.USERDEFINED +notdefined = IfcDoorStyleConstructionEnum.NOTDEFINED IfcDoorStyleOperationEnum = enum_namespace() -single_swing_left = express_getattr(IfcDoorStyleOperationEnum, 'SINGLE_SWING_LEFT', INDETERMINATE) -single_swing_right = express_getattr(IfcDoorStyleOperationEnum, 'SINGLE_SWING_RIGHT', INDETERMINATE) -double_door_single_swing = express_getattr(IfcDoorStyleOperationEnum, 'DOUBLE_DOOR_SINGLE_SWING', INDETERMINATE) -double_door_single_swing_opposite_left = express_getattr(IfcDoorStyleOperationEnum, 'DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_LEFT', INDETERMINATE) -double_door_single_swing_opposite_right = express_getattr(IfcDoorStyleOperationEnum, 'DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_RIGHT', INDETERMINATE) -double_swing_left = express_getattr(IfcDoorStyleOperationEnum, 'DOUBLE_SWING_LEFT', INDETERMINATE) -double_swing_right = express_getattr(IfcDoorStyleOperationEnum, 'DOUBLE_SWING_RIGHT', INDETERMINATE) -double_door_double_swing = express_getattr(IfcDoorStyleOperationEnum, 'DOUBLE_DOOR_DOUBLE_SWING', INDETERMINATE) -sliding_to_left = express_getattr(IfcDoorStyleOperationEnum, 'SLIDING_TO_LEFT', INDETERMINATE) -sliding_to_right = express_getattr(IfcDoorStyleOperationEnum, 'SLIDING_TO_RIGHT', INDETERMINATE) -double_door_sliding = express_getattr(IfcDoorStyleOperationEnum, 'DOUBLE_DOOR_SLIDING', INDETERMINATE) -folding_to_left = express_getattr(IfcDoorStyleOperationEnum, 'FOLDING_TO_LEFT', INDETERMINATE) -folding_to_right = express_getattr(IfcDoorStyleOperationEnum, 'FOLDING_TO_RIGHT', INDETERMINATE) -double_door_folding = express_getattr(IfcDoorStyleOperationEnum, 'DOUBLE_DOOR_FOLDING', INDETERMINATE) -revolving = express_getattr(IfcDoorStyleOperationEnum, 'REVOLVING', INDETERMINATE) -rollingup = express_getattr(IfcDoorStyleOperationEnum, 'ROLLINGUP', INDETERMINATE) -userdefined = express_getattr(IfcDoorStyleOperationEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDoorStyleOperationEnum, 'NOTDEFINED', INDETERMINATE) +single_swing_left = IfcDoorStyleOperationEnum.SINGLE_SWING_LEFT +single_swing_right = IfcDoorStyleOperationEnum.SINGLE_SWING_RIGHT +double_door_single_swing = IfcDoorStyleOperationEnum.DOUBLE_DOOR_SINGLE_SWING +double_door_single_swing_opposite_left = IfcDoorStyleOperationEnum.DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_LEFT +double_door_single_swing_opposite_right = IfcDoorStyleOperationEnum.DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_RIGHT +double_swing_left = IfcDoorStyleOperationEnum.DOUBLE_SWING_LEFT +double_swing_right = IfcDoorStyleOperationEnum.DOUBLE_SWING_RIGHT +double_door_double_swing = IfcDoorStyleOperationEnum.DOUBLE_DOOR_DOUBLE_SWING +sliding_to_left = IfcDoorStyleOperationEnum.SLIDING_TO_LEFT +sliding_to_right = IfcDoorStyleOperationEnum.SLIDING_TO_RIGHT +double_door_sliding = IfcDoorStyleOperationEnum.DOUBLE_DOOR_SLIDING +folding_to_left = IfcDoorStyleOperationEnum.FOLDING_TO_LEFT +folding_to_right = IfcDoorStyleOperationEnum.FOLDING_TO_RIGHT +double_door_folding = IfcDoorStyleOperationEnum.DOUBLE_DOOR_FOLDING +revolving = IfcDoorStyleOperationEnum.REVOLVING +rollingup = IfcDoorStyleOperationEnum.ROLLINGUP +userdefined = IfcDoorStyleOperationEnum.USERDEFINED +notdefined = IfcDoorStyleOperationEnum.NOTDEFINED IfcDoorTypeEnum = enum_namespace() -door = express_getattr(IfcDoorTypeEnum, 'DOOR', INDETERMINATE) -gate = express_getattr(IfcDoorTypeEnum, 'GATE', INDETERMINATE) -trapdoor = express_getattr(IfcDoorTypeEnum, 'TRAPDOOR', INDETERMINATE) -userdefined = express_getattr(IfcDoorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDoorTypeEnum, 'NOTDEFINED', INDETERMINATE) +door = IfcDoorTypeEnum.DOOR +gate = IfcDoorTypeEnum.GATE +trapdoor = IfcDoorTypeEnum.TRAPDOOR +userdefined = IfcDoorTypeEnum.USERDEFINED +notdefined = IfcDoorTypeEnum.NOTDEFINED IfcDoorTypeOperationEnum = enum_namespace() -single_swing_left = express_getattr(IfcDoorTypeOperationEnum, 'SINGLE_SWING_LEFT', INDETERMINATE) -single_swing_right = express_getattr(IfcDoorTypeOperationEnum, 'SINGLE_SWING_RIGHT', INDETERMINATE) -double_door_single_swing = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_DOOR_SINGLE_SWING', INDETERMINATE) -double_door_single_swing_opposite_left = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_LEFT', INDETERMINATE) -double_door_single_swing_opposite_right = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_RIGHT', INDETERMINATE) -double_swing_left = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_SWING_LEFT', INDETERMINATE) -double_swing_right = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_SWING_RIGHT', INDETERMINATE) -double_door_double_swing = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_DOOR_DOUBLE_SWING', INDETERMINATE) -sliding_to_left = express_getattr(IfcDoorTypeOperationEnum, 'SLIDING_TO_LEFT', INDETERMINATE) -sliding_to_right = express_getattr(IfcDoorTypeOperationEnum, 'SLIDING_TO_RIGHT', INDETERMINATE) -double_door_sliding = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_DOOR_SLIDING', INDETERMINATE) -folding_to_left = express_getattr(IfcDoorTypeOperationEnum, 'FOLDING_TO_LEFT', INDETERMINATE) -folding_to_right = express_getattr(IfcDoorTypeOperationEnum, 'FOLDING_TO_RIGHT', INDETERMINATE) -double_door_folding = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_DOOR_FOLDING', INDETERMINATE) -revolving = express_getattr(IfcDoorTypeOperationEnum, 'REVOLVING', INDETERMINATE) -rollingup = express_getattr(IfcDoorTypeOperationEnum, 'ROLLINGUP', INDETERMINATE) -swing_fixed_left = express_getattr(IfcDoorTypeOperationEnum, 'SWING_FIXED_LEFT', INDETERMINATE) -swing_fixed_right = express_getattr(IfcDoorTypeOperationEnum, 'SWING_FIXED_RIGHT', INDETERMINATE) -userdefined = express_getattr(IfcDoorTypeOperationEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDoorTypeOperationEnum, 'NOTDEFINED', INDETERMINATE) +single_swing_left = IfcDoorTypeOperationEnum.SINGLE_SWING_LEFT +single_swing_right = IfcDoorTypeOperationEnum.SINGLE_SWING_RIGHT +double_door_single_swing = IfcDoorTypeOperationEnum.DOUBLE_DOOR_SINGLE_SWING +double_door_single_swing_opposite_left = IfcDoorTypeOperationEnum.DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_LEFT +double_door_single_swing_opposite_right = IfcDoorTypeOperationEnum.DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_RIGHT +double_swing_left = IfcDoorTypeOperationEnum.DOUBLE_SWING_LEFT +double_swing_right = IfcDoorTypeOperationEnum.DOUBLE_SWING_RIGHT +double_door_double_swing = IfcDoorTypeOperationEnum.DOUBLE_DOOR_DOUBLE_SWING +sliding_to_left = IfcDoorTypeOperationEnum.SLIDING_TO_LEFT +sliding_to_right = IfcDoorTypeOperationEnum.SLIDING_TO_RIGHT +double_door_sliding = IfcDoorTypeOperationEnum.DOUBLE_DOOR_SLIDING +folding_to_left = IfcDoorTypeOperationEnum.FOLDING_TO_LEFT +folding_to_right = IfcDoorTypeOperationEnum.FOLDING_TO_RIGHT +double_door_folding = IfcDoorTypeOperationEnum.DOUBLE_DOOR_FOLDING +revolving = IfcDoorTypeOperationEnum.REVOLVING +rollingup = IfcDoorTypeOperationEnum.ROLLINGUP +swing_fixed_left = IfcDoorTypeOperationEnum.SWING_FIXED_LEFT +swing_fixed_right = IfcDoorTypeOperationEnum.SWING_FIXED_RIGHT +userdefined = IfcDoorTypeOperationEnum.USERDEFINED +notdefined = IfcDoorTypeOperationEnum.NOTDEFINED IfcDuctFittingTypeEnum = enum_namespace() -bend = express_getattr(IfcDuctFittingTypeEnum, 'BEND', INDETERMINATE) -connector = express_getattr(IfcDuctFittingTypeEnum, 'CONNECTOR', INDETERMINATE) -entry = express_getattr(IfcDuctFittingTypeEnum, 'ENTRY', INDETERMINATE) -exit = express_getattr(IfcDuctFittingTypeEnum, 'EXIT', INDETERMINATE) -junction = express_getattr(IfcDuctFittingTypeEnum, 'JUNCTION', INDETERMINATE) -obstruction = express_getattr(IfcDuctFittingTypeEnum, 'OBSTRUCTION', INDETERMINATE) -transition = express_getattr(IfcDuctFittingTypeEnum, 'TRANSITION', INDETERMINATE) -userdefined = express_getattr(IfcDuctFittingTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDuctFittingTypeEnum, 'NOTDEFINED', INDETERMINATE) +bend = IfcDuctFittingTypeEnum.BEND +connector = IfcDuctFittingTypeEnum.CONNECTOR +entry = IfcDuctFittingTypeEnum.ENTRY +exit = IfcDuctFittingTypeEnum.EXIT +junction = IfcDuctFittingTypeEnum.JUNCTION +obstruction = IfcDuctFittingTypeEnum.OBSTRUCTION +transition = IfcDuctFittingTypeEnum.TRANSITION +userdefined = IfcDuctFittingTypeEnum.USERDEFINED +notdefined = IfcDuctFittingTypeEnum.NOTDEFINED IfcDuctSegmentTypeEnum = enum_namespace() -rigidsegment = express_getattr(IfcDuctSegmentTypeEnum, 'RIGIDSEGMENT', INDETERMINATE) -flexiblesegment = express_getattr(IfcDuctSegmentTypeEnum, 'FLEXIBLESEGMENT', INDETERMINATE) -userdefined = express_getattr(IfcDuctSegmentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDuctSegmentTypeEnum, 'NOTDEFINED', INDETERMINATE) +rigidsegment = IfcDuctSegmentTypeEnum.RIGIDSEGMENT +flexiblesegment = IfcDuctSegmentTypeEnum.FLEXIBLESEGMENT +userdefined = IfcDuctSegmentTypeEnum.USERDEFINED +notdefined = IfcDuctSegmentTypeEnum.NOTDEFINED IfcDuctSilencerTypeEnum = enum_namespace() -flatoval = express_getattr(IfcDuctSilencerTypeEnum, 'FLATOVAL', INDETERMINATE) -rectangular = express_getattr(IfcDuctSilencerTypeEnum, 'RECTANGULAR', INDETERMINATE) -round = express_getattr(IfcDuctSilencerTypeEnum, 'ROUND', INDETERMINATE) -userdefined = express_getattr(IfcDuctSilencerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDuctSilencerTypeEnum, 'NOTDEFINED', INDETERMINATE) +flatoval = IfcDuctSilencerTypeEnum.FLATOVAL +rectangular = IfcDuctSilencerTypeEnum.RECTANGULAR +round = IfcDuctSilencerTypeEnum.ROUND +userdefined = IfcDuctSilencerTypeEnum.USERDEFINED +notdefined = IfcDuctSilencerTypeEnum.NOTDEFINED IfcElectricApplianceTypeEnum = enum_namespace() -dishwasher = express_getattr(IfcElectricApplianceTypeEnum, 'DISHWASHER', INDETERMINATE) -electriccooker = express_getattr(IfcElectricApplianceTypeEnum, 'ELECTRICCOOKER', INDETERMINATE) -freestandingelectricheater = express_getattr(IfcElectricApplianceTypeEnum, 'FREESTANDINGELECTRICHEATER', INDETERMINATE) -freestandingfan = express_getattr(IfcElectricApplianceTypeEnum, 'FREESTANDINGFAN', INDETERMINATE) -freestandingwaterheater = express_getattr(IfcElectricApplianceTypeEnum, 'FREESTANDINGWATERHEATER', INDETERMINATE) -freestandingwatercooler = express_getattr(IfcElectricApplianceTypeEnum, 'FREESTANDINGWATERCOOLER', INDETERMINATE) -freezer = express_getattr(IfcElectricApplianceTypeEnum, 'FREEZER', INDETERMINATE) -fridge_freezer = express_getattr(IfcElectricApplianceTypeEnum, 'FRIDGE_FREEZER', INDETERMINATE) -handdryer = express_getattr(IfcElectricApplianceTypeEnum, 'HANDDRYER', INDETERMINATE) -kitchenmachine = express_getattr(IfcElectricApplianceTypeEnum, 'KITCHENMACHINE', INDETERMINATE) -microwave = express_getattr(IfcElectricApplianceTypeEnum, 'MICROWAVE', INDETERMINATE) -photocopier = express_getattr(IfcElectricApplianceTypeEnum, 'PHOTOCOPIER', INDETERMINATE) -refrigerator = express_getattr(IfcElectricApplianceTypeEnum, 'REFRIGERATOR', INDETERMINATE) -tumbledryer = express_getattr(IfcElectricApplianceTypeEnum, 'TUMBLEDRYER', INDETERMINATE) -vendingmachine = express_getattr(IfcElectricApplianceTypeEnum, 'VENDINGMACHINE', INDETERMINATE) -washingmachine = express_getattr(IfcElectricApplianceTypeEnum, 'WASHINGMACHINE', INDETERMINATE) -userdefined = express_getattr(IfcElectricApplianceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcElectricApplianceTypeEnum, 'NOTDEFINED', INDETERMINATE) +dishwasher = IfcElectricApplianceTypeEnum.DISHWASHER +electriccooker = IfcElectricApplianceTypeEnum.ELECTRICCOOKER +freestandingelectricheater = IfcElectricApplianceTypeEnum.FREESTANDINGELECTRICHEATER +freestandingfan = IfcElectricApplianceTypeEnum.FREESTANDINGFAN +freestandingwaterheater = IfcElectricApplianceTypeEnum.FREESTANDINGWATERHEATER +freestandingwatercooler = IfcElectricApplianceTypeEnum.FREESTANDINGWATERCOOLER +freezer = IfcElectricApplianceTypeEnum.FREEZER +fridge_freezer = IfcElectricApplianceTypeEnum.FRIDGE_FREEZER +handdryer = IfcElectricApplianceTypeEnum.HANDDRYER +kitchenmachine = IfcElectricApplianceTypeEnum.KITCHENMACHINE +microwave = IfcElectricApplianceTypeEnum.MICROWAVE +photocopier = IfcElectricApplianceTypeEnum.PHOTOCOPIER +refrigerator = IfcElectricApplianceTypeEnum.REFRIGERATOR +tumbledryer = IfcElectricApplianceTypeEnum.TUMBLEDRYER +vendingmachine = IfcElectricApplianceTypeEnum.VENDINGMACHINE +washingmachine = IfcElectricApplianceTypeEnum.WASHINGMACHINE +userdefined = IfcElectricApplianceTypeEnum.USERDEFINED +notdefined = IfcElectricApplianceTypeEnum.NOTDEFINED IfcElectricDistributionBoardTypeEnum = enum_namespace() -consumerunit = express_getattr(IfcElectricDistributionBoardTypeEnum, 'CONSUMERUNIT', INDETERMINATE) -distributionboard = express_getattr(IfcElectricDistributionBoardTypeEnum, 'DISTRIBUTIONBOARD', INDETERMINATE) -motorcontrolcentre = express_getattr(IfcElectricDistributionBoardTypeEnum, 'MOTORCONTROLCENTRE', INDETERMINATE) -switchboard = express_getattr(IfcElectricDistributionBoardTypeEnum, 'SWITCHBOARD', INDETERMINATE) -userdefined = express_getattr(IfcElectricDistributionBoardTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcElectricDistributionBoardTypeEnum, 'NOTDEFINED', INDETERMINATE) +consumerunit = IfcElectricDistributionBoardTypeEnum.CONSUMERUNIT +distributionboard = IfcElectricDistributionBoardTypeEnum.DISTRIBUTIONBOARD +motorcontrolcentre = IfcElectricDistributionBoardTypeEnum.MOTORCONTROLCENTRE +switchboard = IfcElectricDistributionBoardTypeEnum.SWITCHBOARD +userdefined = IfcElectricDistributionBoardTypeEnum.USERDEFINED +notdefined = IfcElectricDistributionBoardTypeEnum.NOTDEFINED IfcElectricFlowStorageDeviceTypeEnum = enum_namespace() -battery = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'BATTERY', INDETERMINATE) -capacitorbank = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'CAPACITORBANK', INDETERMINATE) -harmonicfilter = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'HARMONICFILTER', INDETERMINATE) -inductorbank = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'INDUCTORBANK', INDETERMINATE) -ups = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'UPS', INDETERMINATE) -userdefined = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'NOTDEFINED', INDETERMINATE) +battery = IfcElectricFlowStorageDeviceTypeEnum.BATTERY +capacitorbank = IfcElectricFlowStorageDeviceTypeEnum.CAPACITORBANK +harmonicfilter = IfcElectricFlowStorageDeviceTypeEnum.HARMONICFILTER +inductorbank = IfcElectricFlowStorageDeviceTypeEnum.INDUCTORBANK +ups = IfcElectricFlowStorageDeviceTypeEnum.UPS +userdefined = IfcElectricFlowStorageDeviceTypeEnum.USERDEFINED +notdefined = IfcElectricFlowStorageDeviceTypeEnum.NOTDEFINED IfcElectricGeneratorTypeEnum = enum_namespace() -chp = express_getattr(IfcElectricGeneratorTypeEnum, 'CHP', INDETERMINATE) -enginegenerator = express_getattr(IfcElectricGeneratorTypeEnum, 'ENGINEGENERATOR', INDETERMINATE) -standalone = express_getattr(IfcElectricGeneratorTypeEnum, 'STANDALONE', INDETERMINATE) -userdefined = express_getattr(IfcElectricGeneratorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcElectricGeneratorTypeEnum, 'NOTDEFINED', INDETERMINATE) +chp = IfcElectricGeneratorTypeEnum.CHP +enginegenerator = IfcElectricGeneratorTypeEnum.ENGINEGENERATOR +standalone = IfcElectricGeneratorTypeEnum.STANDALONE +userdefined = IfcElectricGeneratorTypeEnum.USERDEFINED +notdefined = IfcElectricGeneratorTypeEnum.NOTDEFINED IfcElectricMotorTypeEnum = enum_namespace() -dc = express_getattr(IfcElectricMotorTypeEnum, 'DC', INDETERMINATE) -induction = express_getattr(IfcElectricMotorTypeEnum, 'INDUCTION', INDETERMINATE) -polyphase = express_getattr(IfcElectricMotorTypeEnum, 'POLYPHASE', INDETERMINATE) -reluctancesynchronous = express_getattr(IfcElectricMotorTypeEnum, 'RELUCTANCESYNCHRONOUS', INDETERMINATE) -synchronous = express_getattr(IfcElectricMotorTypeEnum, 'SYNCHRONOUS', INDETERMINATE) -userdefined = express_getattr(IfcElectricMotorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcElectricMotorTypeEnum, 'NOTDEFINED', INDETERMINATE) +dc = IfcElectricMotorTypeEnum.DC +induction = IfcElectricMotorTypeEnum.INDUCTION +polyphase = IfcElectricMotorTypeEnum.POLYPHASE +reluctancesynchronous = IfcElectricMotorTypeEnum.RELUCTANCESYNCHRONOUS +synchronous = IfcElectricMotorTypeEnum.SYNCHRONOUS +userdefined = IfcElectricMotorTypeEnum.USERDEFINED +notdefined = IfcElectricMotorTypeEnum.NOTDEFINED IfcElectricTimeControlTypeEnum = enum_namespace() -timeclock = express_getattr(IfcElectricTimeControlTypeEnum, 'TIMECLOCK', INDETERMINATE) -timedelay = express_getattr(IfcElectricTimeControlTypeEnum, 'TIMEDELAY', INDETERMINATE) -relay = express_getattr(IfcElectricTimeControlTypeEnum, 'RELAY', INDETERMINATE) -userdefined = express_getattr(IfcElectricTimeControlTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcElectricTimeControlTypeEnum, 'NOTDEFINED', INDETERMINATE) +timeclock = IfcElectricTimeControlTypeEnum.TIMECLOCK +timedelay = IfcElectricTimeControlTypeEnum.TIMEDELAY +relay = IfcElectricTimeControlTypeEnum.RELAY +userdefined = IfcElectricTimeControlTypeEnum.USERDEFINED +notdefined = IfcElectricTimeControlTypeEnum.NOTDEFINED IfcElementAssemblyTypeEnum = enum_namespace() -accessory_assembly = express_getattr(IfcElementAssemblyTypeEnum, 'ACCESSORY_ASSEMBLY', INDETERMINATE) -arch = express_getattr(IfcElementAssemblyTypeEnum, 'ARCH', INDETERMINATE) -beam_grid = express_getattr(IfcElementAssemblyTypeEnum, 'BEAM_GRID', INDETERMINATE) -braced_frame = express_getattr(IfcElementAssemblyTypeEnum, 'BRACED_FRAME', INDETERMINATE) -girder = express_getattr(IfcElementAssemblyTypeEnum, 'GIRDER', INDETERMINATE) -reinforcement_unit = express_getattr(IfcElementAssemblyTypeEnum, 'REINFORCEMENT_UNIT', INDETERMINATE) -rigid_frame = express_getattr(IfcElementAssemblyTypeEnum, 'RIGID_FRAME', INDETERMINATE) -slab_field = express_getattr(IfcElementAssemblyTypeEnum, 'SLAB_FIELD', INDETERMINATE) -truss = express_getattr(IfcElementAssemblyTypeEnum, 'TRUSS', INDETERMINATE) -userdefined = express_getattr(IfcElementAssemblyTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcElementAssemblyTypeEnum, 'NOTDEFINED', INDETERMINATE) +accessory_assembly = IfcElementAssemblyTypeEnum.ACCESSORY_ASSEMBLY +arch = IfcElementAssemblyTypeEnum.ARCH +beam_grid = IfcElementAssemblyTypeEnum.BEAM_GRID +braced_frame = IfcElementAssemblyTypeEnum.BRACED_FRAME +girder = IfcElementAssemblyTypeEnum.GIRDER +reinforcement_unit = IfcElementAssemblyTypeEnum.REINFORCEMENT_UNIT +rigid_frame = IfcElementAssemblyTypeEnum.RIGID_FRAME +slab_field = IfcElementAssemblyTypeEnum.SLAB_FIELD +truss = IfcElementAssemblyTypeEnum.TRUSS +userdefined = IfcElementAssemblyTypeEnum.USERDEFINED +notdefined = IfcElementAssemblyTypeEnum.NOTDEFINED IfcElementCompositionEnum = enum_namespace() -complex = express_getattr(IfcElementCompositionEnum, 'COMPLEX', INDETERMINATE) -element = express_getattr(IfcElementCompositionEnum, 'ELEMENT', INDETERMINATE) -partial = express_getattr(IfcElementCompositionEnum, 'PARTIAL', INDETERMINATE) +complex = IfcElementCompositionEnum.COMPLEX +element = IfcElementCompositionEnum.ELEMENT +partial = IfcElementCompositionEnum.PARTIAL IfcEngineTypeEnum = enum_namespace() -externalcombustion = express_getattr(IfcEngineTypeEnum, 'EXTERNALCOMBUSTION', INDETERMINATE) -internalcombustion = express_getattr(IfcEngineTypeEnum, 'INTERNALCOMBUSTION', INDETERMINATE) -userdefined = express_getattr(IfcEngineTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcEngineTypeEnum, 'NOTDEFINED', INDETERMINATE) +externalcombustion = IfcEngineTypeEnum.EXTERNALCOMBUSTION +internalcombustion = IfcEngineTypeEnum.INTERNALCOMBUSTION +userdefined = IfcEngineTypeEnum.USERDEFINED +notdefined = IfcEngineTypeEnum.NOTDEFINED IfcEvaporativeCoolerTypeEnum = enum_namespace() -directevaporativerandommediaaircooler = express_getattr(IfcEvaporativeCoolerTypeEnum, 'DIRECTEVAPORATIVERANDOMMEDIAAIRCOOLER', INDETERMINATE) -directevaporativerigidmediaaircooler = express_getattr(IfcEvaporativeCoolerTypeEnum, 'DIRECTEVAPORATIVERIGIDMEDIAAIRCOOLER', INDETERMINATE) -directevaporativeslingerspackagedaircooler = express_getattr(IfcEvaporativeCoolerTypeEnum, 'DIRECTEVAPORATIVESLINGERSPACKAGEDAIRCOOLER', INDETERMINATE) -directevaporativepackagedrotaryaircooler = express_getattr(IfcEvaporativeCoolerTypeEnum, 'DIRECTEVAPORATIVEPACKAGEDROTARYAIRCOOLER', INDETERMINATE) -directevaporativeairwasher = express_getattr(IfcEvaporativeCoolerTypeEnum, 'DIRECTEVAPORATIVEAIRWASHER', INDETERMINATE) -indirectevaporativepackageaircooler = express_getattr(IfcEvaporativeCoolerTypeEnum, 'INDIRECTEVAPORATIVEPACKAGEAIRCOOLER', INDETERMINATE) -indirectevaporativewetcoil = express_getattr(IfcEvaporativeCoolerTypeEnum, 'INDIRECTEVAPORATIVEWETCOIL', INDETERMINATE) -indirectevaporativecoolingtowerorcoilcooler = express_getattr(IfcEvaporativeCoolerTypeEnum, 'INDIRECTEVAPORATIVECOOLINGTOWERORCOILCOOLER', INDETERMINATE) -indirectdirectcombination = express_getattr(IfcEvaporativeCoolerTypeEnum, 'INDIRECTDIRECTCOMBINATION', INDETERMINATE) -userdefined = express_getattr(IfcEvaporativeCoolerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcEvaporativeCoolerTypeEnum, 'NOTDEFINED', INDETERMINATE) +directevaporativerandommediaaircooler = IfcEvaporativeCoolerTypeEnum.DIRECTEVAPORATIVERANDOMMEDIAAIRCOOLER +directevaporativerigidmediaaircooler = IfcEvaporativeCoolerTypeEnum.DIRECTEVAPORATIVERIGIDMEDIAAIRCOOLER +directevaporativeslingerspackagedaircooler = IfcEvaporativeCoolerTypeEnum.DIRECTEVAPORATIVESLINGERSPACKAGEDAIRCOOLER +directevaporativepackagedrotaryaircooler = IfcEvaporativeCoolerTypeEnum.DIRECTEVAPORATIVEPACKAGEDROTARYAIRCOOLER +directevaporativeairwasher = IfcEvaporativeCoolerTypeEnum.DIRECTEVAPORATIVEAIRWASHER +indirectevaporativepackageaircooler = IfcEvaporativeCoolerTypeEnum.INDIRECTEVAPORATIVEPACKAGEAIRCOOLER +indirectevaporativewetcoil = IfcEvaporativeCoolerTypeEnum.INDIRECTEVAPORATIVEWETCOIL +indirectevaporativecoolingtowerorcoilcooler = IfcEvaporativeCoolerTypeEnum.INDIRECTEVAPORATIVECOOLINGTOWERORCOILCOOLER +indirectdirectcombination = IfcEvaporativeCoolerTypeEnum.INDIRECTDIRECTCOMBINATION +userdefined = IfcEvaporativeCoolerTypeEnum.USERDEFINED +notdefined = IfcEvaporativeCoolerTypeEnum.NOTDEFINED IfcEvaporatorTypeEnum = enum_namespace() -directexpansion = express_getattr(IfcEvaporatorTypeEnum, 'DIRECTEXPANSION', INDETERMINATE) -directexpansionshellandtube = express_getattr(IfcEvaporatorTypeEnum, 'DIRECTEXPANSIONSHELLANDTUBE', INDETERMINATE) -directexpansiontubeintube = express_getattr(IfcEvaporatorTypeEnum, 'DIRECTEXPANSIONTUBEINTUBE', INDETERMINATE) -directexpansionbrazedplate = express_getattr(IfcEvaporatorTypeEnum, 'DIRECTEXPANSIONBRAZEDPLATE', INDETERMINATE) -floodedshellandtube = express_getattr(IfcEvaporatorTypeEnum, 'FLOODEDSHELLANDTUBE', INDETERMINATE) -shellandcoil = express_getattr(IfcEvaporatorTypeEnum, 'SHELLANDCOIL', INDETERMINATE) -userdefined = express_getattr(IfcEvaporatorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcEvaporatorTypeEnum, 'NOTDEFINED', INDETERMINATE) +directexpansion = IfcEvaporatorTypeEnum.DIRECTEXPANSION +directexpansionshellandtube = IfcEvaporatorTypeEnum.DIRECTEXPANSIONSHELLANDTUBE +directexpansiontubeintube = IfcEvaporatorTypeEnum.DIRECTEXPANSIONTUBEINTUBE +directexpansionbrazedplate = IfcEvaporatorTypeEnum.DIRECTEXPANSIONBRAZEDPLATE +floodedshellandtube = IfcEvaporatorTypeEnum.FLOODEDSHELLANDTUBE +shellandcoil = IfcEvaporatorTypeEnum.SHELLANDCOIL +userdefined = IfcEvaporatorTypeEnum.USERDEFINED +notdefined = IfcEvaporatorTypeEnum.NOTDEFINED IfcEventTriggerTypeEnum = enum_namespace() -eventrule = express_getattr(IfcEventTriggerTypeEnum, 'EVENTRULE', INDETERMINATE) -eventmessage = express_getattr(IfcEventTriggerTypeEnum, 'EVENTMESSAGE', INDETERMINATE) -eventtime = express_getattr(IfcEventTriggerTypeEnum, 'EVENTTIME', INDETERMINATE) -eventcomplex = express_getattr(IfcEventTriggerTypeEnum, 'EVENTCOMPLEX', INDETERMINATE) -userdefined = express_getattr(IfcEventTriggerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcEventTriggerTypeEnum, 'NOTDEFINED', INDETERMINATE) +eventrule = IfcEventTriggerTypeEnum.EVENTRULE +eventmessage = IfcEventTriggerTypeEnum.EVENTMESSAGE +eventtime = IfcEventTriggerTypeEnum.EVENTTIME +eventcomplex = IfcEventTriggerTypeEnum.EVENTCOMPLEX +userdefined = IfcEventTriggerTypeEnum.USERDEFINED +notdefined = IfcEventTriggerTypeEnum.NOTDEFINED IfcEventTypeEnum = enum_namespace() -startevent = express_getattr(IfcEventTypeEnum, 'STARTEVENT', INDETERMINATE) -endevent = express_getattr(IfcEventTypeEnum, 'ENDEVENT', INDETERMINATE) -intermediateevent = express_getattr(IfcEventTypeEnum, 'INTERMEDIATEEVENT', INDETERMINATE) -userdefined = express_getattr(IfcEventTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcEventTypeEnum, 'NOTDEFINED', INDETERMINATE) +startevent = IfcEventTypeEnum.STARTEVENT +endevent = IfcEventTypeEnum.ENDEVENT +intermediateevent = IfcEventTypeEnum.INTERMEDIATEEVENT +userdefined = IfcEventTypeEnum.USERDEFINED +notdefined = IfcEventTypeEnum.NOTDEFINED IfcExternalSpatialElementTypeEnum = enum_namespace() -external = express_getattr(IfcExternalSpatialElementTypeEnum, 'EXTERNAL', INDETERMINATE) -external_earth = express_getattr(IfcExternalSpatialElementTypeEnum, 'EXTERNAL_EARTH', INDETERMINATE) -external_water = express_getattr(IfcExternalSpatialElementTypeEnum, 'EXTERNAL_WATER', INDETERMINATE) -external_fire = express_getattr(IfcExternalSpatialElementTypeEnum, 'EXTERNAL_FIRE', INDETERMINATE) -userdefined = express_getattr(IfcExternalSpatialElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcExternalSpatialElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +external = IfcExternalSpatialElementTypeEnum.EXTERNAL +external_earth = IfcExternalSpatialElementTypeEnum.EXTERNAL_EARTH +external_water = IfcExternalSpatialElementTypeEnum.EXTERNAL_WATER +external_fire = IfcExternalSpatialElementTypeEnum.EXTERNAL_FIRE +userdefined = IfcExternalSpatialElementTypeEnum.USERDEFINED +notdefined = IfcExternalSpatialElementTypeEnum.NOTDEFINED IfcFanTypeEnum = enum_namespace() -centrifugalforwardcurved = express_getattr(IfcFanTypeEnum, 'CENTRIFUGALFORWARDCURVED', INDETERMINATE) -centrifugalradial = express_getattr(IfcFanTypeEnum, 'CENTRIFUGALRADIAL', INDETERMINATE) -centrifugalbackwardinclinedcurved = express_getattr(IfcFanTypeEnum, 'CENTRIFUGALBACKWARDINCLINEDCURVED', INDETERMINATE) -centrifugalairfoil = express_getattr(IfcFanTypeEnum, 'CENTRIFUGALAIRFOIL', INDETERMINATE) -tubeaxial = express_getattr(IfcFanTypeEnum, 'TUBEAXIAL', INDETERMINATE) -vaneaxial = express_getattr(IfcFanTypeEnum, 'VANEAXIAL', INDETERMINATE) -propelloraxial = express_getattr(IfcFanTypeEnum, 'PROPELLORAXIAL', INDETERMINATE) -userdefined = express_getattr(IfcFanTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFanTypeEnum, 'NOTDEFINED', INDETERMINATE) +centrifugalforwardcurved = IfcFanTypeEnum.CENTRIFUGALFORWARDCURVED +centrifugalradial = IfcFanTypeEnum.CENTRIFUGALRADIAL +centrifugalbackwardinclinedcurved = IfcFanTypeEnum.CENTRIFUGALBACKWARDINCLINEDCURVED +centrifugalairfoil = IfcFanTypeEnum.CENTRIFUGALAIRFOIL +tubeaxial = IfcFanTypeEnum.TUBEAXIAL +vaneaxial = IfcFanTypeEnum.VANEAXIAL +propelloraxial = IfcFanTypeEnum.PROPELLORAXIAL +userdefined = IfcFanTypeEnum.USERDEFINED +notdefined = IfcFanTypeEnum.NOTDEFINED IfcFastenerTypeEnum = enum_namespace() -glue = express_getattr(IfcFastenerTypeEnum, 'GLUE', INDETERMINATE) -mortar = express_getattr(IfcFastenerTypeEnum, 'MORTAR', INDETERMINATE) -weld = express_getattr(IfcFastenerTypeEnum, 'WELD', INDETERMINATE) -userdefined = express_getattr(IfcFastenerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFastenerTypeEnum, 'NOTDEFINED', INDETERMINATE) +glue = IfcFastenerTypeEnum.GLUE +mortar = IfcFastenerTypeEnum.MORTAR +weld = IfcFastenerTypeEnum.WELD +userdefined = IfcFastenerTypeEnum.USERDEFINED +notdefined = IfcFastenerTypeEnum.NOTDEFINED IfcFilterTypeEnum = enum_namespace() -airparticlefilter = express_getattr(IfcFilterTypeEnum, 'AIRPARTICLEFILTER', INDETERMINATE) -compressedairfilter = express_getattr(IfcFilterTypeEnum, 'COMPRESSEDAIRFILTER', INDETERMINATE) -odorfilter = express_getattr(IfcFilterTypeEnum, 'ODORFILTER', INDETERMINATE) -oilfilter = express_getattr(IfcFilterTypeEnum, 'OILFILTER', INDETERMINATE) -strainer = express_getattr(IfcFilterTypeEnum, 'STRAINER', INDETERMINATE) -waterfilter = express_getattr(IfcFilterTypeEnum, 'WATERFILTER', INDETERMINATE) -userdefined = express_getattr(IfcFilterTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFilterTypeEnum, 'NOTDEFINED', INDETERMINATE) +airparticlefilter = IfcFilterTypeEnum.AIRPARTICLEFILTER +compressedairfilter = IfcFilterTypeEnum.COMPRESSEDAIRFILTER +odorfilter = IfcFilterTypeEnum.ODORFILTER +oilfilter = IfcFilterTypeEnum.OILFILTER +strainer = IfcFilterTypeEnum.STRAINER +waterfilter = IfcFilterTypeEnum.WATERFILTER +userdefined = IfcFilterTypeEnum.USERDEFINED +notdefined = IfcFilterTypeEnum.NOTDEFINED IfcFireSuppressionTerminalTypeEnum = enum_namespace() -breechinginlet = express_getattr(IfcFireSuppressionTerminalTypeEnum, 'BREECHINGINLET', INDETERMINATE) -firehydrant = express_getattr(IfcFireSuppressionTerminalTypeEnum, 'FIREHYDRANT', INDETERMINATE) -hosereel = express_getattr(IfcFireSuppressionTerminalTypeEnum, 'HOSEREEL', INDETERMINATE) -sprinkler = express_getattr(IfcFireSuppressionTerminalTypeEnum, 'SPRINKLER', INDETERMINATE) -sprinklerdeflector = express_getattr(IfcFireSuppressionTerminalTypeEnum, 'SPRINKLERDEFLECTOR', INDETERMINATE) -userdefined = express_getattr(IfcFireSuppressionTerminalTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFireSuppressionTerminalTypeEnum, 'NOTDEFINED', INDETERMINATE) +breechinginlet = IfcFireSuppressionTerminalTypeEnum.BREECHINGINLET +firehydrant = IfcFireSuppressionTerminalTypeEnum.FIREHYDRANT +hosereel = IfcFireSuppressionTerminalTypeEnum.HOSEREEL +sprinkler = IfcFireSuppressionTerminalTypeEnum.SPRINKLER +sprinklerdeflector = IfcFireSuppressionTerminalTypeEnum.SPRINKLERDEFLECTOR +userdefined = IfcFireSuppressionTerminalTypeEnum.USERDEFINED +notdefined = IfcFireSuppressionTerminalTypeEnum.NOTDEFINED IfcFlowDirectionEnum = enum_namespace() -source = express_getattr(IfcFlowDirectionEnum, 'SOURCE', INDETERMINATE) -sink = express_getattr(IfcFlowDirectionEnum, 'SINK', INDETERMINATE) -sourceandsink = express_getattr(IfcFlowDirectionEnum, 'SOURCEANDSINK', INDETERMINATE) -notdefined = express_getattr(IfcFlowDirectionEnum, 'NOTDEFINED', INDETERMINATE) +source = IfcFlowDirectionEnum.SOURCE +sink = IfcFlowDirectionEnum.SINK +sourceandsink = IfcFlowDirectionEnum.SOURCEANDSINK +notdefined = IfcFlowDirectionEnum.NOTDEFINED IfcFlowInstrumentTypeEnum = enum_namespace() -pressuregauge = express_getattr(IfcFlowInstrumentTypeEnum, 'PRESSUREGAUGE', INDETERMINATE) -thermometer = express_getattr(IfcFlowInstrumentTypeEnum, 'THERMOMETER', INDETERMINATE) -ammeter = express_getattr(IfcFlowInstrumentTypeEnum, 'AMMETER', INDETERMINATE) -frequencymeter = express_getattr(IfcFlowInstrumentTypeEnum, 'FREQUENCYMETER', INDETERMINATE) -powerfactormeter = express_getattr(IfcFlowInstrumentTypeEnum, 'POWERFACTORMETER', INDETERMINATE) -phaseanglemeter = express_getattr(IfcFlowInstrumentTypeEnum, 'PHASEANGLEMETER', INDETERMINATE) -voltmeter_peak = express_getattr(IfcFlowInstrumentTypeEnum, 'VOLTMETER_PEAK', INDETERMINATE) -voltmeter_rms = express_getattr(IfcFlowInstrumentTypeEnum, 'VOLTMETER_RMS', INDETERMINATE) -userdefined = express_getattr(IfcFlowInstrumentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFlowInstrumentTypeEnum, 'NOTDEFINED', INDETERMINATE) +pressuregauge = IfcFlowInstrumentTypeEnum.PRESSUREGAUGE +thermometer = IfcFlowInstrumentTypeEnum.THERMOMETER +ammeter = IfcFlowInstrumentTypeEnum.AMMETER +frequencymeter = IfcFlowInstrumentTypeEnum.FREQUENCYMETER +powerfactormeter = IfcFlowInstrumentTypeEnum.POWERFACTORMETER +phaseanglemeter = IfcFlowInstrumentTypeEnum.PHASEANGLEMETER +voltmeter_peak = IfcFlowInstrumentTypeEnum.VOLTMETER_PEAK +voltmeter_rms = IfcFlowInstrumentTypeEnum.VOLTMETER_RMS +userdefined = IfcFlowInstrumentTypeEnum.USERDEFINED +notdefined = IfcFlowInstrumentTypeEnum.NOTDEFINED IfcFlowMeterTypeEnum = enum_namespace() -energymeter = express_getattr(IfcFlowMeterTypeEnum, 'ENERGYMETER', INDETERMINATE) -gasmeter = express_getattr(IfcFlowMeterTypeEnum, 'GASMETER', INDETERMINATE) -oilmeter = express_getattr(IfcFlowMeterTypeEnum, 'OILMETER', INDETERMINATE) -watermeter = express_getattr(IfcFlowMeterTypeEnum, 'WATERMETER', INDETERMINATE) -userdefined = express_getattr(IfcFlowMeterTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFlowMeterTypeEnum, 'NOTDEFINED', INDETERMINATE) +energymeter = IfcFlowMeterTypeEnum.ENERGYMETER +gasmeter = IfcFlowMeterTypeEnum.GASMETER +oilmeter = IfcFlowMeterTypeEnum.OILMETER +watermeter = IfcFlowMeterTypeEnum.WATERMETER +userdefined = IfcFlowMeterTypeEnum.USERDEFINED +notdefined = IfcFlowMeterTypeEnum.NOTDEFINED IfcFootingTypeEnum = enum_namespace() -caisson_foundation = express_getattr(IfcFootingTypeEnum, 'CAISSON_FOUNDATION', INDETERMINATE) -footing_beam = express_getattr(IfcFootingTypeEnum, 'FOOTING_BEAM', INDETERMINATE) -pad_footing = express_getattr(IfcFootingTypeEnum, 'PAD_FOOTING', INDETERMINATE) -pile_cap = express_getattr(IfcFootingTypeEnum, 'PILE_CAP', INDETERMINATE) -strip_footing = express_getattr(IfcFootingTypeEnum, 'STRIP_FOOTING', INDETERMINATE) -userdefined = express_getattr(IfcFootingTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFootingTypeEnum, 'NOTDEFINED', INDETERMINATE) +caisson_foundation = IfcFootingTypeEnum.CAISSON_FOUNDATION +footing_beam = IfcFootingTypeEnum.FOOTING_BEAM +pad_footing = IfcFootingTypeEnum.PAD_FOOTING +pile_cap = IfcFootingTypeEnum.PILE_CAP +strip_footing = IfcFootingTypeEnum.STRIP_FOOTING +userdefined = IfcFootingTypeEnum.USERDEFINED +notdefined = IfcFootingTypeEnum.NOTDEFINED IfcFurnitureTypeEnum = enum_namespace() -chair = express_getattr(IfcFurnitureTypeEnum, 'CHAIR', INDETERMINATE) -table = express_getattr(IfcFurnitureTypeEnum, 'TABLE', INDETERMINATE) -desk = express_getattr(IfcFurnitureTypeEnum, 'DESK', INDETERMINATE) -bed = express_getattr(IfcFurnitureTypeEnum, 'BED', INDETERMINATE) -filecabinet = express_getattr(IfcFurnitureTypeEnum, 'FILECABINET', INDETERMINATE) -shelf = express_getattr(IfcFurnitureTypeEnum, 'SHELF', INDETERMINATE) -sofa = express_getattr(IfcFurnitureTypeEnum, 'SOFA', INDETERMINATE) -userdefined = express_getattr(IfcFurnitureTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFurnitureTypeEnum, 'NOTDEFINED', INDETERMINATE) +chair = IfcFurnitureTypeEnum.CHAIR +table = IfcFurnitureTypeEnum.TABLE +desk = IfcFurnitureTypeEnum.DESK +bed = IfcFurnitureTypeEnum.BED +filecabinet = IfcFurnitureTypeEnum.FILECABINET +shelf = IfcFurnitureTypeEnum.SHELF +sofa = IfcFurnitureTypeEnum.SOFA +userdefined = IfcFurnitureTypeEnum.USERDEFINED +notdefined = IfcFurnitureTypeEnum.NOTDEFINED IfcGeographicElementTypeEnum = enum_namespace() -terrain = express_getattr(IfcGeographicElementTypeEnum, 'TERRAIN', INDETERMINATE) -userdefined = express_getattr(IfcGeographicElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcGeographicElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +terrain = IfcGeographicElementTypeEnum.TERRAIN +userdefined = IfcGeographicElementTypeEnum.USERDEFINED +notdefined = IfcGeographicElementTypeEnum.NOTDEFINED IfcGeometricProjectionEnum = enum_namespace() -graph_view = express_getattr(IfcGeometricProjectionEnum, 'GRAPH_VIEW', INDETERMINATE) -sketch_view = express_getattr(IfcGeometricProjectionEnum, 'SKETCH_VIEW', INDETERMINATE) -model_view = express_getattr(IfcGeometricProjectionEnum, 'MODEL_VIEW', INDETERMINATE) -plan_view = express_getattr(IfcGeometricProjectionEnum, 'PLAN_VIEW', INDETERMINATE) -reflected_plan_view = express_getattr(IfcGeometricProjectionEnum, 'REFLECTED_PLAN_VIEW', INDETERMINATE) -section_view = express_getattr(IfcGeometricProjectionEnum, 'SECTION_VIEW', INDETERMINATE) -elevation_view = express_getattr(IfcGeometricProjectionEnum, 'ELEVATION_VIEW', INDETERMINATE) -userdefined = express_getattr(IfcGeometricProjectionEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcGeometricProjectionEnum, 'NOTDEFINED', INDETERMINATE) +graph_view = IfcGeometricProjectionEnum.GRAPH_VIEW +sketch_view = IfcGeometricProjectionEnum.SKETCH_VIEW +model_view = IfcGeometricProjectionEnum.MODEL_VIEW +plan_view = IfcGeometricProjectionEnum.PLAN_VIEW +reflected_plan_view = IfcGeometricProjectionEnum.REFLECTED_PLAN_VIEW +section_view = IfcGeometricProjectionEnum.SECTION_VIEW +elevation_view = IfcGeometricProjectionEnum.ELEVATION_VIEW +userdefined = IfcGeometricProjectionEnum.USERDEFINED +notdefined = IfcGeometricProjectionEnum.NOTDEFINED IfcGlobalOrLocalEnum = enum_namespace() -global_coords = express_getattr(IfcGlobalOrLocalEnum, 'GLOBAL_COORDS', INDETERMINATE) -local_coords = express_getattr(IfcGlobalOrLocalEnum, 'LOCAL_COORDS', INDETERMINATE) +global_coords = IfcGlobalOrLocalEnum.GLOBAL_COORDS +local_coords = IfcGlobalOrLocalEnum.LOCAL_COORDS IfcGridTypeEnum = enum_namespace() -rectangular = express_getattr(IfcGridTypeEnum, 'RECTANGULAR', INDETERMINATE) -radial = express_getattr(IfcGridTypeEnum, 'RADIAL', INDETERMINATE) -triangular = express_getattr(IfcGridTypeEnum, 'TRIANGULAR', INDETERMINATE) -irregular = express_getattr(IfcGridTypeEnum, 'IRREGULAR', INDETERMINATE) -userdefined = express_getattr(IfcGridTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcGridTypeEnum, 'NOTDEFINED', INDETERMINATE) +rectangular = IfcGridTypeEnum.RECTANGULAR +radial = IfcGridTypeEnum.RADIAL +triangular = IfcGridTypeEnum.TRIANGULAR +irregular = IfcGridTypeEnum.IRREGULAR +userdefined = IfcGridTypeEnum.USERDEFINED +notdefined = IfcGridTypeEnum.NOTDEFINED IfcHeatExchangerTypeEnum = enum_namespace() -plate = express_getattr(IfcHeatExchangerTypeEnum, 'PLATE', INDETERMINATE) -shellandtube = express_getattr(IfcHeatExchangerTypeEnum, 'SHELLANDTUBE', INDETERMINATE) -userdefined = express_getattr(IfcHeatExchangerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcHeatExchangerTypeEnum, 'NOTDEFINED', INDETERMINATE) +plate = IfcHeatExchangerTypeEnum.PLATE +shellandtube = IfcHeatExchangerTypeEnum.SHELLANDTUBE +userdefined = IfcHeatExchangerTypeEnum.USERDEFINED +notdefined = IfcHeatExchangerTypeEnum.NOTDEFINED IfcHumidifierTypeEnum = enum_namespace() -steaminjection = express_getattr(IfcHumidifierTypeEnum, 'STEAMINJECTION', INDETERMINATE) -adiabaticairwasher = express_getattr(IfcHumidifierTypeEnum, 'ADIABATICAIRWASHER', INDETERMINATE) -adiabaticpan = express_getattr(IfcHumidifierTypeEnum, 'ADIABATICPAN', INDETERMINATE) -adiabaticwettedelement = express_getattr(IfcHumidifierTypeEnum, 'ADIABATICWETTEDELEMENT', INDETERMINATE) -adiabaticatomizing = express_getattr(IfcHumidifierTypeEnum, 'ADIABATICATOMIZING', INDETERMINATE) -adiabaticultrasonic = express_getattr(IfcHumidifierTypeEnum, 'ADIABATICULTRASONIC', INDETERMINATE) -adiabaticrigidmedia = express_getattr(IfcHumidifierTypeEnum, 'ADIABATICRIGIDMEDIA', INDETERMINATE) -adiabaticcompressedairnozzle = express_getattr(IfcHumidifierTypeEnum, 'ADIABATICCOMPRESSEDAIRNOZZLE', INDETERMINATE) -assistedelectric = express_getattr(IfcHumidifierTypeEnum, 'ASSISTEDELECTRIC', INDETERMINATE) -assistednaturalgas = express_getattr(IfcHumidifierTypeEnum, 'ASSISTEDNATURALGAS', INDETERMINATE) -assistedpropane = express_getattr(IfcHumidifierTypeEnum, 'ASSISTEDPROPANE', INDETERMINATE) -assistedbutane = express_getattr(IfcHumidifierTypeEnum, 'ASSISTEDBUTANE', INDETERMINATE) -assistedsteam = express_getattr(IfcHumidifierTypeEnum, 'ASSISTEDSTEAM', INDETERMINATE) -userdefined = express_getattr(IfcHumidifierTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcHumidifierTypeEnum, 'NOTDEFINED', INDETERMINATE) +steaminjection = IfcHumidifierTypeEnum.STEAMINJECTION +adiabaticairwasher = IfcHumidifierTypeEnum.ADIABATICAIRWASHER +adiabaticpan = IfcHumidifierTypeEnum.ADIABATICPAN +adiabaticwettedelement = IfcHumidifierTypeEnum.ADIABATICWETTEDELEMENT +adiabaticatomizing = IfcHumidifierTypeEnum.ADIABATICATOMIZING +adiabaticultrasonic = IfcHumidifierTypeEnum.ADIABATICULTRASONIC +adiabaticrigidmedia = IfcHumidifierTypeEnum.ADIABATICRIGIDMEDIA +adiabaticcompressedairnozzle = IfcHumidifierTypeEnum.ADIABATICCOMPRESSEDAIRNOZZLE +assistedelectric = IfcHumidifierTypeEnum.ASSISTEDELECTRIC +assistednaturalgas = IfcHumidifierTypeEnum.ASSISTEDNATURALGAS +assistedpropane = IfcHumidifierTypeEnum.ASSISTEDPROPANE +assistedbutane = IfcHumidifierTypeEnum.ASSISTEDBUTANE +assistedsteam = IfcHumidifierTypeEnum.ASSISTEDSTEAM +userdefined = IfcHumidifierTypeEnum.USERDEFINED +notdefined = IfcHumidifierTypeEnum.NOTDEFINED IfcInterceptorTypeEnum = enum_namespace() -cyclonic = express_getattr(IfcInterceptorTypeEnum, 'CYCLONIC', INDETERMINATE) -grease = express_getattr(IfcInterceptorTypeEnum, 'GREASE', INDETERMINATE) -oil = express_getattr(IfcInterceptorTypeEnum, 'OIL', INDETERMINATE) -petrol = express_getattr(IfcInterceptorTypeEnum, 'PETROL', INDETERMINATE) -userdefined = express_getattr(IfcInterceptorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcInterceptorTypeEnum, 'NOTDEFINED', INDETERMINATE) +cyclonic = IfcInterceptorTypeEnum.CYCLONIC +grease = IfcInterceptorTypeEnum.GREASE +oil = IfcInterceptorTypeEnum.OIL +petrol = IfcInterceptorTypeEnum.PETROL +userdefined = IfcInterceptorTypeEnum.USERDEFINED +notdefined = IfcInterceptorTypeEnum.NOTDEFINED IfcInternalOrExternalEnum = enum_namespace() -internal = express_getattr(IfcInternalOrExternalEnum, 'INTERNAL', INDETERMINATE) -external = express_getattr(IfcInternalOrExternalEnum, 'EXTERNAL', INDETERMINATE) -external_earth = express_getattr(IfcInternalOrExternalEnum, 'EXTERNAL_EARTH', INDETERMINATE) -external_water = express_getattr(IfcInternalOrExternalEnum, 'EXTERNAL_WATER', INDETERMINATE) -external_fire = express_getattr(IfcInternalOrExternalEnum, 'EXTERNAL_FIRE', INDETERMINATE) -notdefined = express_getattr(IfcInternalOrExternalEnum, 'NOTDEFINED', INDETERMINATE) +internal = IfcInternalOrExternalEnum.INTERNAL +external = IfcInternalOrExternalEnum.EXTERNAL +external_earth = IfcInternalOrExternalEnum.EXTERNAL_EARTH +external_water = IfcInternalOrExternalEnum.EXTERNAL_WATER +external_fire = IfcInternalOrExternalEnum.EXTERNAL_FIRE +notdefined = IfcInternalOrExternalEnum.NOTDEFINED IfcInventoryTypeEnum = enum_namespace() -assetinventory = express_getattr(IfcInventoryTypeEnum, 'ASSETINVENTORY', INDETERMINATE) -spaceinventory = express_getattr(IfcInventoryTypeEnum, 'SPACEINVENTORY', INDETERMINATE) -furnitureinventory = express_getattr(IfcInventoryTypeEnum, 'FURNITUREINVENTORY', INDETERMINATE) -userdefined = express_getattr(IfcInventoryTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcInventoryTypeEnum, 'NOTDEFINED', INDETERMINATE) +assetinventory = IfcInventoryTypeEnum.ASSETINVENTORY +spaceinventory = IfcInventoryTypeEnum.SPACEINVENTORY +furnitureinventory = IfcInventoryTypeEnum.FURNITUREINVENTORY +userdefined = IfcInventoryTypeEnum.USERDEFINED +notdefined = IfcInventoryTypeEnum.NOTDEFINED IfcJunctionBoxTypeEnum = enum_namespace() -data = express_getattr(IfcJunctionBoxTypeEnum, 'DATA', INDETERMINATE) -power = express_getattr(IfcJunctionBoxTypeEnum, 'POWER', INDETERMINATE) -userdefined = express_getattr(IfcJunctionBoxTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcJunctionBoxTypeEnum, 'NOTDEFINED', INDETERMINATE) +data = IfcJunctionBoxTypeEnum.DATA +power = IfcJunctionBoxTypeEnum.POWER +userdefined = IfcJunctionBoxTypeEnum.USERDEFINED +notdefined = IfcJunctionBoxTypeEnum.NOTDEFINED IfcKnotType = enum_namespace() -uniform_knots = express_getattr(IfcKnotType, 'UNIFORM_KNOTS', INDETERMINATE) -quasi_uniform_knots = express_getattr(IfcKnotType, 'QUASI_UNIFORM_KNOTS', INDETERMINATE) -piecewise_bezier_knots = express_getattr(IfcKnotType, 'PIECEWISE_BEZIER_KNOTS', INDETERMINATE) -unspecified = express_getattr(IfcKnotType, 'UNSPECIFIED', INDETERMINATE) +uniform_knots = IfcKnotType.UNIFORM_KNOTS +quasi_uniform_knots = IfcKnotType.QUASI_UNIFORM_KNOTS +piecewise_bezier_knots = IfcKnotType.PIECEWISE_BEZIER_KNOTS +unspecified = IfcKnotType.UNSPECIFIED IfcLaborResourceTypeEnum = enum_namespace() -administration = express_getattr(IfcLaborResourceTypeEnum, 'ADMINISTRATION', INDETERMINATE) -carpentry = express_getattr(IfcLaborResourceTypeEnum, 'CARPENTRY', INDETERMINATE) -cleaning = express_getattr(IfcLaborResourceTypeEnum, 'CLEANING', INDETERMINATE) -concrete = express_getattr(IfcLaborResourceTypeEnum, 'CONCRETE', INDETERMINATE) -drywall = express_getattr(IfcLaborResourceTypeEnum, 'DRYWALL', INDETERMINATE) -electric = express_getattr(IfcLaborResourceTypeEnum, 'ELECTRIC', INDETERMINATE) -finishing = express_getattr(IfcLaborResourceTypeEnum, 'FINISHING', INDETERMINATE) -flooring = express_getattr(IfcLaborResourceTypeEnum, 'FLOORING', INDETERMINATE) -general = express_getattr(IfcLaborResourceTypeEnum, 'GENERAL', INDETERMINATE) -hvac = express_getattr(IfcLaborResourceTypeEnum, 'HVAC', INDETERMINATE) -landscaping = express_getattr(IfcLaborResourceTypeEnum, 'LANDSCAPING', INDETERMINATE) -masonry = express_getattr(IfcLaborResourceTypeEnum, 'MASONRY', INDETERMINATE) -painting = express_getattr(IfcLaborResourceTypeEnum, 'PAINTING', INDETERMINATE) -paving = express_getattr(IfcLaborResourceTypeEnum, 'PAVING', INDETERMINATE) -plumbing = express_getattr(IfcLaborResourceTypeEnum, 'PLUMBING', INDETERMINATE) -roofing = express_getattr(IfcLaborResourceTypeEnum, 'ROOFING', INDETERMINATE) -sitegrading = express_getattr(IfcLaborResourceTypeEnum, 'SITEGRADING', INDETERMINATE) -steelwork = express_getattr(IfcLaborResourceTypeEnum, 'STEELWORK', INDETERMINATE) -surveying = express_getattr(IfcLaborResourceTypeEnum, 'SURVEYING', INDETERMINATE) -userdefined = express_getattr(IfcLaborResourceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcLaborResourceTypeEnum, 'NOTDEFINED', INDETERMINATE) +administration = IfcLaborResourceTypeEnum.ADMINISTRATION +carpentry = IfcLaborResourceTypeEnum.CARPENTRY +cleaning = IfcLaborResourceTypeEnum.CLEANING +concrete = IfcLaborResourceTypeEnum.CONCRETE +drywall = IfcLaborResourceTypeEnum.DRYWALL +electric = IfcLaborResourceTypeEnum.ELECTRIC +finishing = IfcLaborResourceTypeEnum.FINISHING +flooring = IfcLaborResourceTypeEnum.FLOORING +general = IfcLaborResourceTypeEnum.GENERAL +hvac = IfcLaborResourceTypeEnum.HVAC +landscaping = IfcLaborResourceTypeEnum.LANDSCAPING +masonry = IfcLaborResourceTypeEnum.MASONRY +painting = IfcLaborResourceTypeEnum.PAINTING +paving = IfcLaborResourceTypeEnum.PAVING +plumbing = IfcLaborResourceTypeEnum.PLUMBING +roofing = IfcLaborResourceTypeEnum.ROOFING +sitegrading = IfcLaborResourceTypeEnum.SITEGRADING +steelwork = IfcLaborResourceTypeEnum.STEELWORK +surveying = IfcLaborResourceTypeEnum.SURVEYING +userdefined = IfcLaborResourceTypeEnum.USERDEFINED +notdefined = IfcLaborResourceTypeEnum.NOTDEFINED IfcLampTypeEnum = enum_namespace() -compactfluorescent = express_getattr(IfcLampTypeEnum, 'COMPACTFLUORESCENT', INDETERMINATE) -fluorescent = express_getattr(IfcLampTypeEnum, 'FLUORESCENT', INDETERMINATE) -halogen = express_getattr(IfcLampTypeEnum, 'HALOGEN', INDETERMINATE) -highpressuremercury = express_getattr(IfcLampTypeEnum, 'HIGHPRESSUREMERCURY', INDETERMINATE) -highpressuresodium = express_getattr(IfcLampTypeEnum, 'HIGHPRESSURESODIUM', INDETERMINATE) -led = express_getattr(IfcLampTypeEnum, 'LED', INDETERMINATE) -metalhalide = express_getattr(IfcLampTypeEnum, 'METALHALIDE', INDETERMINATE) -oled = express_getattr(IfcLampTypeEnum, 'OLED', INDETERMINATE) -tungstenfilament = express_getattr(IfcLampTypeEnum, 'TUNGSTENFILAMENT', INDETERMINATE) -userdefined = express_getattr(IfcLampTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcLampTypeEnum, 'NOTDEFINED', INDETERMINATE) +compactfluorescent = IfcLampTypeEnum.COMPACTFLUORESCENT +fluorescent = IfcLampTypeEnum.FLUORESCENT +halogen = IfcLampTypeEnum.HALOGEN +highpressuremercury = IfcLampTypeEnum.HIGHPRESSUREMERCURY +highpressuresodium = IfcLampTypeEnum.HIGHPRESSURESODIUM +led = IfcLampTypeEnum.LED +metalhalide = IfcLampTypeEnum.METALHALIDE +oled = IfcLampTypeEnum.OLED +tungstenfilament = IfcLampTypeEnum.TUNGSTENFILAMENT +userdefined = IfcLampTypeEnum.USERDEFINED +notdefined = IfcLampTypeEnum.NOTDEFINED IfcLayerSetDirectionEnum = enum_namespace() -axis1 = express_getattr(IfcLayerSetDirectionEnum, 'AXIS1', INDETERMINATE) -axis2 = express_getattr(IfcLayerSetDirectionEnum, 'AXIS2', INDETERMINATE) -axis3 = express_getattr(IfcLayerSetDirectionEnum, 'AXIS3', INDETERMINATE) +axis1 = IfcLayerSetDirectionEnum.AXIS1 +axis2 = IfcLayerSetDirectionEnum.AXIS2 +axis3 = IfcLayerSetDirectionEnum.AXIS3 IfcLightDistributionCurveEnum = enum_namespace() -type_a = express_getattr(IfcLightDistributionCurveEnum, 'TYPE_A', INDETERMINATE) -type_b = express_getattr(IfcLightDistributionCurveEnum, 'TYPE_B', INDETERMINATE) -type_c = express_getattr(IfcLightDistributionCurveEnum, 'TYPE_C', INDETERMINATE) -notdefined = express_getattr(IfcLightDistributionCurveEnum, 'NOTDEFINED', INDETERMINATE) +type_a = IfcLightDistributionCurveEnum.TYPE_A +type_b = IfcLightDistributionCurveEnum.TYPE_B +type_c = IfcLightDistributionCurveEnum.TYPE_C +notdefined = IfcLightDistributionCurveEnum.NOTDEFINED IfcLightEmissionSourceEnum = enum_namespace() -compactfluorescent = express_getattr(IfcLightEmissionSourceEnum, 'COMPACTFLUORESCENT', INDETERMINATE) -fluorescent = express_getattr(IfcLightEmissionSourceEnum, 'FLUORESCENT', INDETERMINATE) -highpressuremercury = express_getattr(IfcLightEmissionSourceEnum, 'HIGHPRESSUREMERCURY', INDETERMINATE) -highpressuresodium = express_getattr(IfcLightEmissionSourceEnum, 'HIGHPRESSURESODIUM', INDETERMINATE) -lightemittingdiode = express_getattr(IfcLightEmissionSourceEnum, 'LIGHTEMITTINGDIODE', INDETERMINATE) -lowpressuresodium = express_getattr(IfcLightEmissionSourceEnum, 'LOWPRESSURESODIUM', INDETERMINATE) -lowvoltagehalogen = express_getattr(IfcLightEmissionSourceEnum, 'LOWVOLTAGEHALOGEN', INDETERMINATE) -mainvoltagehalogen = express_getattr(IfcLightEmissionSourceEnum, 'MAINVOLTAGEHALOGEN', INDETERMINATE) -metalhalide = express_getattr(IfcLightEmissionSourceEnum, 'METALHALIDE', INDETERMINATE) -tungstenfilament = express_getattr(IfcLightEmissionSourceEnum, 'TUNGSTENFILAMENT', INDETERMINATE) -notdefined = express_getattr(IfcLightEmissionSourceEnum, 'NOTDEFINED', INDETERMINATE) +compactfluorescent = IfcLightEmissionSourceEnum.COMPACTFLUORESCENT +fluorescent = IfcLightEmissionSourceEnum.FLUORESCENT +highpressuremercury = IfcLightEmissionSourceEnum.HIGHPRESSUREMERCURY +highpressuresodium = IfcLightEmissionSourceEnum.HIGHPRESSURESODIUM +lightemittingdiode = IfcLightEmissionSourceEnum.LIGHTEMITTINGDIODE +lowpressuresodium = IfcLightEmissionSourceEnum.LOWPRESSURESODIUM +lowvoltagehalogen = IfcLightEmissionSourceEnum.LOWVOLTAGEHALOGEN +mainvoltagehalogen = IfcLightEmissionSourceEnum.MAINVOLTAGEHALOGEN +metalhalide = IfcLightEmissionSourceEnum.METALHALIDE +tungstenfilament = IfcLightEmissionSourceEnum.TUNGSTENFILAMENT +notdefined = IfcLightEmissionSourceEnum.NOTDEFINED IfcLightFixtureTypeEnum = enum_namespace() -pointsource = express_getattr(IfcLightFixtureTypeEnum, 'POINTSOURCE', INDETERMINATE) -directionsource = express_getattr(IfcLightFixtureTypeEnum, 'DIRECTIONSOURCE', INDETERMINATE) -securitylighting = express_getattr(IfcLightFixtureTypeEnum, 'SECURITYLIGHTING', INDETERMINATE) -userdefined = express_getattr(IfcLightFixtureTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcLightFixtureTypeEnum, 'NOTDEFINED', INDETERMINATE) +pointsource = IfcLightFixtureTypeEnum.POINTSOURCE +directionsource = IfcLightFixtureTypeEnum.DIRECTIONSOURCE +securitylighting = IfcLightFixtureTypeEnum.SECURITYLIGHTING +userdefined = IfcLightFixtureTypeEnum.USERDEFINED +notdefined = IfcLightFixtureTypeEnum.NOTDEFINED IfcLoadGroupTypeEnum = enum_namespace() -load_group = express_getattr(IfcLoadGroupTypeEnum, 'LOAD_GROUP', INDETERMINATE) -load_case = express_getattr(IfcLoadGroupTypeEnum, 'LOAD_CASE', INDETERMINATE) -load_combination = express_getattr(IfcLoadGroupTypeEnum, 'LOAD_COMBINATION', INDETERMINATE) -userdefined = express_getattr(IfcLoadGroupTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcLoadGroupTypeEnum, 'NOTDEFINED', INDETERMINATE) +load_group = IfcLoadGroupTypeEnum.LOAD_GROUP +load_case = IfcLoadGroupTypeEnum.LOAD_CASE +load_combination = IfcLoadGroupTypeEnum.LOAD_COMBINATION +userdefined = IfcLoadGroupTypeEnum.USERDEFINED +notdefined = IfcLoadGroupTypeEnum.NOTDEFINED IfcLogicalOperatorEnum = enum_namespace() -logicaland = express_getattr(IfcLogicalOperatorEnum, 'LOGICALAND', INDETERMINATE) -logicalor = express_getattr(IfcLogicalOperatorEnum, 'LOGICALOR', INDETERMINATE) -logicalxor = express_getattr(IfcLogicalOperatorEnum, 'LOGICALXOR', INDETERMINATE) -logicalnotand = express_getattr(IfcLogicalOperatorEnum, 'LOGICALNOTAND', INDETERMINATE) -logicalnotor = express_getattr(IfcLogicalOperatorEnum, 'LOGICALNOTOR', INDETERMINATE) +logicaland = IfcLogicalOperatorEnum.LOGICALAND +logicalor = IfcLogicalOperatorEnum.LOGICALOR +logicalxor = IfcLogicalOperatorEnum.LOGICALXOR +logicalnotand = IfcLogicalOperatorEnum.LOGICALNOTAND +logicalnotor = IfcLogicalOperatorEnum.LOGICALNOTOR IfcMechanicalFastenerTypeEnum = enum_namespace() -anchorbolt = express_getattr(IfcMechanicalFastenerTypeEnum, 'ANCHORBOLT', INDETERMINATE) -bolt = express_getattr(IfcMechanicalFastenerTypeEnum, 'BOLT', INDETERMINATE) -dowel = express_getattr(IfcMechanicalFastenerTypeEnum, 'DOWEL', INDETERMINATE) -nail = express_getattr(IfcMechanicalFastenerTypeEnum, 'NAIL', INDETERMINATE) -nailplate = express_getattr(IfcMechanicalFastenerTypeEnum, 'NAILPLATE', INDETERMINATE) -rivet = express_getattr(IfcMechanicalFastenerTypeEnum, 'RIVET', INDETERMINATE) -screw = express_getattr(IfcMechanicalFastenerTypeEnum, 'SCREW', INDETERMINATE) -shearconnector = express_getattr(IfcMechanicalFastenerTypeEnum, 'SHEARCONNECTOR', INDETERMINATE) -staple = express_getattr(IfcMechanicalFastenerTypeEnum, 'STAPLE', INDETERMINATE) -studshearconnector = express_getattr(IfcMechanicalFastenerTypeEnum, 'STUDSHEARCONNECTOR', INDETERMINATE) -userdefined = express_getattr(IfcMechanicalFastenerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcMechanicalFastenerTypeEnum, 'NOTDEFINED', INDETERMINATE) +anchorbolt = IfcMechanicalFastenerTypeEnum.ANCHORBOLT +bolt = IfcMechanicalFastenerTypeEnum.BOLT +dowel = IfcMechanicalFastenerTypeEnum.DOWEL +nail = IfcMechanicalFastenerTypeEnum.NAIL +nailplate = IfcMechanicalFastenerTypeEnum.NAILPLATE +rivet = IfcMechanicalFastenerTypeEnum.RIVET +screw = IfcMechanicalFastenerTypeEnum.SCREW +shearconnector = IfcMechanicalFastenerTypeEnum.SHEARCONNECTOR +staple = IfcMechanicalFastenerTypeEnum.STAPLE +studshearconnector = IfcMechanicalFastenerTypeEnum.STUDSHEARCONNECTOR +userdefined = IfcMechanicalFastenerTypeEnum.USERDEFINED +notdefined = IfcMechanicalFastenerTypeEnum.NOTDEFINED IfcMedicalDeviceTypeEnum = enum_namespace() -airstation = express_getattr(IfcMedicalDeviceTypeEnum, 'AIRSTATION', INDETERMINATE) -feedairunit = express_getattr(IfcMedicalDeviceTypeEnum, 'FEEDAIRUNIT', INDETERMINATE) -oxygengenerator = express_getattr(IfcMedicalDeviceTypeEnum, 'OXYGENGENERATOR', INDETERMINATE) -oxygenplant = express_getattr(IfcMedicalDeviceTypeEnum, 'OXYGENPLANT', INDETERMINATE) -vacuumstation = express_getattr(IfcMedicalDeviceTypeEnum, 'VACUUMSTATION', INDETERMINATE) -userdefined = express_getattr(IfcMedicalDeviceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcMedicalDeviceTypeEnum, 'NOTDEFINED', INDETERMINATE) +airstation = IfcMedicalDeviceTypeEnum.AIRSTATION +feedairunit = IfcMedicalDeviceTypeEnum.FEEDAIRUNIT +oxygengenerator = IfcMedicalDeviceTypeEnum.OXYGENGENERATOR +oxygenplant = IfcMedicalDeviceTypeEnum.OXYGENPLANT +vacuumstation = IfcMedicalDeviceTypeEnum.VACUUMSTATION +userdefined = IfcMedicalDeviceTypeEnum.USERDEFINED +notdefined = IfcMedicalDeviceTypeEnum.NOTDEFINED IfcMemberTypeEnum = enum_namespace() -brace = express_getattr(IfcMemberTypeEnum, 'BRACE', INDETERMINATE) -chord = express_getattr(IfcMemberTypeEnum, 'CHORD', INDETERMINATE) -collar = express_getattr(IfcMemberTypeEnum, 'COLLAR', INDETERMINATE) -member = express_getattr(IfcMemberTypeEnum, 'MEMBER', INDETERMINATE) -mullion = express_getattr(IfcMemberTypeEnum, 'MULLION', INDETERMINATE) -plate = express_getattr(IfcMemberTypeEnum, 'PLATE', INDETERMINATE) -post = express_getattr(IfcMemberTypeEnum, 'POST', INDETERMINATE) -purlin = express_getattr(IfcMemberTypeEnum, 'PURLIN', INDETERMINATE) -rafter = express_getattr(IfcMemberTypeEnum, 'RAFTER', INDETERMINATE) -stringer = express_getattr(IfcMemberTypeEnum, 'STRINGER', INDETERMINATE) -strut = express_getattr(IfcMemberTypeEnum, 'STRUT', INDETERMINATE) -stud = express_getattr(IfcMemberTypeEnum, 'STUD', INDETERMINATE) -userdefined = express_getattr(IfcMemberTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcMemberTypeEnum, 'NOTDEFINED', INDETERMINATE) +brace = IfcMemberTypeEnum.BRACE +chord = IfcMemberTypeEnum.CHORD +collar = IfcMemberTypeEnum.COLLAR +member = IfcMemberTypeEnum.MEMBER +mullion = IfcMemberTypeEnum.MULLION +plate = IfcMemberTypeEnum.PLATE +post = IfcMemberTypeEnum.POST +purlin = IfcMemberTypeEnum.PURLIN +rafter = IfcMemberTypeEnum.RAFTER +stringer = IfcMemberTypeEnum.STRINGER +strut = IfcMemberTypeEnum.STRUT +stud = IfcMemberTypeEnum.STUD +userdefined = IfcMemberTypeEnum.USERDEFINED +notdefined = IfcMemberTypeEnum.NOTDEFINED IfcMotorConnectionTypeEnum = enum_namespace() -beltdrive = express_getattr(IfcMotorConnectionTypeEnum, 'BELTDRIVE', INDETERMINATE) -coupling = express_getattr(IfcMotorConnectionTypeEnum, 'COUPLING', INDETERMINATE) -directdrive = express_getattr(IfcMotorConnectionTypeEnum, 'DIRECTDRIVE', INDETERMINATE) -userdefined = express_getattr(IfcMotorConnectionTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcMotorConnectionTypeEnum, 'NOTDEFINED', INDETERMINATE) +beltdrive = IfcMotorConnectionTypeEnum.BELTDRIVE +coupling = IfcMotorConnectionTypeEnum.COUPLING +directdrive = IfcMotorConnectionTypeEnum.DIRECTDRIVE +userdefined = IfcMotorConnectionTypeEnum.USERDEFINED +notdefined = IfcMotorConnectionTypeEnum.NOTDEFINED IfcNullStyle = enum_namespace() -null = express_getattr(IfcNullStyle, 'NULL', INDETERMINATE) +null = IfcNullStyle.NULL IfcObjectTypeEnum = enum_namespace() -product = express_getattr(IfcObjectTypeEnum, 'PRODUCT', INDETERMINATE) -process = express_getattr(IfcObjectTypeEnum, 'PROCESS', INDETERMINATE) -control = express_getattr(IfcObjectTypeEnum, 'CONTROL', INDETERMINATE) -resource = express_getattr(IfcObjectTypeEnum, 'RESOURCE', INDETERMINATE) -actor = express_getattr(IfcObjectTypeEnum, 'ACTOR', INDETERMINATE) -group = express_getattr(IfcObjectTypeEnum, 'GROUP', INDETERMINATE) -project = express_getattr(IfcObjectTypeEnum, 'PROJECT', INDETERMINATE) -notdefined = express_getattr(IfcObjectTypeEnum, 'NOTDEFINED', INDETERMINATE) +product = IfcObjectTypeEnum.PRODUCT +process = IfcObjectTypeEnum.PROCESS +control = IfcObjectTypeEnum.CONTROL +resource = IfcObjectTypeEnum.RESOURCE +actor = IfcObjectTypeEnum.ACTOR +group = IfcObjectTypeEnum.GROUP +project = IfcObjectTypeEnum.PROJECT +notdefined = IfcObjectTypeEnum.NOTDEFINED IfcObjectiveEnum = enum_namespace() -codecompliance = express_getattr(IfcObjectiveEnum, 'CODECOMPLIANCE', INDETERMINATE) -codewaiver = express_getattr(IfcObjectiveEnum, 'CODEWAIVER', INDETERMINATE) -designintent = express_getattr(IfcObjectiveEnum, 'DESIGNINTENT', INDETERMINATE) -external = express_getattr(IfcObjectiveEnum, 'EXTERNAL', INDETERMINATE) -healthandsafety = express_getattr(IfcObjectiveEnum, 'HEALTHANDSAFETY', INDETERMINATE) -mergeconflict = express_getattr(IfcObjectiveEnum, 'MERGECONFLICT', INDETERMINATE) -modelview = express_getattr(IfcObjectiveEnum, 'MODELVIEW', INDETERMINATE) -parameter = express_getattr(IfcObjectiveEnum, 'PARAMETER', INDETERMINATE) -requirement = express_getattr(IfcObjectiveEnum, 'REQUIREMENT', INDETERMINATE) -specification = express_getattr(IfcObjectiveEnum, 'SPECIFICATION', INDETERMINATE) -triggercondition = express_getattr(IfcObjectiveEnum, 'TRIGGERCONDITION', INDETERMINATE) -userdefined = express_getattr(IfcObjectiveEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcObjectiveEnum, 'NOTDEFINED', INDETERMINATE) +codecompliance = IfcObjectiveEnum.CODECOMPLIANCE +codewaiver = IfcObjectiveEnum.CODEWAIVER +designintent = IfcObjectiveEnum.DESIGNINTENT +external = IfcObjectiveEnum.EXTERNAL +healthandsafety = IfcObjectiveEnum.HEALTHANDSAFETY +mergeconflict = IfcObjectiveEnum.MERGECONFLICT +modelview = IfcObjectiveEnum.MODELVIEW +parameter = IfcObjectiveEnum.PARAMETER +requirement = IfcObjectiveEnum.REQUIREMENT +specification = IfcObjectiveEnum.SPECIFICATION +triggercondition = IfcObjectiveEnum.TRIGGERCONDITION +userdefined = IfcObjectiveEnum.USERDEFINED +notdefined = IfcObjectiveEnum.NOTDEFINED IfcOccupantTypeEnum = enum_namespace() -assignee = express_getattr(IfcOccupantTypeEnum, 'ASSIGNEE', INDETERMINATE) -assignor = express_getattr(IfcOccupantTypeEnum, 'ASSIGNOR', INDETERMINATE) -lessee = express_getattr(IfcOccupantTypeEnum, 'LESSEE', INDETERMINATE) -lessor = express_getattr(IfcOccupantTypeEnum, 'LESSOR', INDETERMINATE) -lettingagent = express_getattr(IfcOccupantTypeEnum, 'LETTINGAGENT', INDETERMINATE) -owner = express_getattr(IfcOccupantTypeEnum, 'OWNER', INDETERMINATE) -tenant = express_getattr(IfcOccupantTypeEnum, 'TENANT', INDETERMINATE) -userdefined = express_getattr(IfcOccupantTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcOccupantTypeEnum, 'NOTDEFINED', INDETERMINATE) +assignee = IfcOccupantTypeEnum.ASSIGNEE +assignor = IfcOccupantTypeEnum.ASSIGNOR +lessee = IfcOccupantTypeEnum.LESSEE +lessor = IfcOccupantTypeEnum.LESSOR +lettingagent = IfcOccupantTypeEnum.LETTINGAGENT +owner = IfcOccupantTypeEnum.OWNER +tenant = IfcOccupantTypeEnum.TENANT +userdefined = IfcOccupantTypeEnum.USERDEFINED +notdefined = IfcOccupantTypeEnum.NOTDEFINED IfcOpeningElementTypeEnum = enum_namespace() -opening = express_getattr(IfcOpeningElementTypeEnum, 'OPENING', INDETERMINATE) -recess = express_getattr(IfcOpeningElementTypeEnum, 'RECESS', INDETERMINATE) -userdefined = express_getattr(IfcOpeningElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcOpeningElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +opening = IfcOpeningElementTypeEnum.OPENING +recess = IfcOpeningElementTypeEnum.RECESS +userdefined = IfcOpeningElementTypeEnum.USERDEFINED +notdefined = IfcOpeningElementTypeEnum.NOTDEFINED IfcOutletTypeEnum = enum_namespace() -audiovisualoutlet = express_getattr(IfcOutletTypeEnum, 'AUDIOVISUALOUTLET', INDETERMINATE) -communicationsoutlet = express_getattr(IfcOutletTypeEnum, 'COMMUNICATIONSOUTLET', INDETERMINATE) -poweroutlet = express_getattr(IfcOutletTypeEnum, 'POWEROUTLET', INDETERMINATE) -dataoutlet = express_getattr(IfcOutletTypeEnum, 'DATAOUTLET', INDETERMINATE) -telephoneoutlet = express_getattr(IfcOutletTypeEnum, 'TELEPHONEOUTLET', INDETERMINATE) -userdefined = express_getattr(IfcOutletTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcOutletTypeEnum, 'NOTDEFINED', INDETERMINATE) +audiovisualoutlet = IfcOutletTypeEnum.AUDIOVISUALOUTLET +communicationsoutlet = IfcOutletTypeEnum.COMMUNICATIONSOUTLET +poweroutlet = IfcOutletTypeEnum.POWEROUTLET +dataoutlet = IfcOutletTypeEnum.DATAOUTLET +telephoneoutlet = IfcOutletTypeEnum.TELEPHONEOUTLET +userdefined = IfcOutletTypeEnum.USERDEFINED +notdefined = IfcOutletTypeEnum.NOTDEFINED IfcPerformanceHistoryTypeEnum = enum_namespace() -userdefined = express_getattr(IfcPerformanceHistoryTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPerformanceHistoryTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcPerformanceHistoryTypeEnum.USERDEFINED +notdefined = IfcPerformanceHistoryTypeEnum.NOTDEFINED IfcPermeableCoveringOperationEnum = enum_namespace() -grill = express_getattr(IfcPermeableCoveringOperationEnum, 'GRILL', INDETERMINATE) -louver = express_getattr(IfcPermeableCoveringOperationEnum, 'LOUVER', INDETERMINATE) -screen = express_getattr(IfcPermeableCoveringOperationEnum, 'SCREEN', INDETERMINATE) -userdefined = express_getattr(IfcPermeableCoveringOperationEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPermeableCoveringOperationEnum, 'NOTDEFINED', INDETERMINATE) +grill = IfcPermeableCoveringOperationEnum.GRILL +louver = IfcPermeableCoveringOperationEnum.LOUVER +screen = IfcPermeableCoveringOperationEnum.SCREEN +userdefined = IfcPermeableCoveringOperationEnum.USERDEFINED +notdefined = IfcPermeableCoveringOperationEnum.NOTDEFINED IfcPermitTypeEnum = enum_namespace() -access = express_getattr(IfcPermitTypeEnum, 'ACCESS', INDETERMINATE) -building = express_getattr(IfcPermitTypeEnum, 'BUILDING', INDETERMINATE) -work = express_getattr(IfcPermitTypeEnum, 'WORK', INDETERMINATE) -userdefined = express_getattr(IfcPermitTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPermitTypeEnum, 'NOTDEFINED', INDETERMINATE) +access = IfcPermitTypeEnum.ACCESS +building = IfcPermitTypeEnum.BUILDING +work = IfcPermitTypeEnum.WORK +userdefined = IfcPermitTypeEnum.USERDEFINED +notdefined = IfcPermitTypeEnum.NOTDEFINED IfcPhysicalOrVirtualEnum = enum_namespace() -physical = express_getattr(IfcPhysicalOrVirtualEnum, 'PHYSICAL', INDETERMINATE) -virtual = express_getattr(IfcPhysicalOrVirtualEnum, 'VIRTUAL', INDETERMINATE) -notdefined = express_getattr(IfcPhysicalOrVirtualEnum, 'NOTDEFINED', INDETERMINATE) +physical = IfcPhysicalOrVirtualEnum.PHYSICAL +virtual = IfcPhysicalOrVirtualEnum.VIRTUAL +notdefined = IfcPhysicalOrVirtualEnum.NOTDEFINED IfcPileConstructionEnum = enum_namespace() -cast_in_place = express_getattr(IfcPileConstructionEnum, 'CAST_IN_PLACE', INDETERMINATE) -composite = express_getattr(IfcPileConstructionEnum, 'COMPOSITE', INDETERMINATE) -precast_concrete = express_getattr(IfcPileConstructionEnum, 'PRECAST_CONCRETE', INDETERMINATE) -prefab_steel = express_getattr(IfcPileConstructionEnum, 'PREFAB_STEEL', INDETERMINATE) -userdefined = express_getattr(IfcPileConstructionEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPileConstructionEnum, 'NOTDEFINED', INDETERMINATE) +cast_in_place = IfcPileConstructionEnum.CAST_IN_PLACE +composite = IfcPileConstructionEnum.COMPOSITE +precast_concrete = IfcPileConstructionEnum.PRECAST_CONCRETE +prefab_steel = IfcPileConstructionEnum.PREFAB_STEEL +userdefined = IfcPileConstructionEnum.USERDEFINED +notdefined = IfcPileConstructionEnum.NOTDEFINED IfcPileTypeEnum = enum_namespace() -bored = express_getattr(IfcPileTypeEnum, 'BORED', INDETERMINATE) -driven = express_getattr(IfcPileTypeEnum, 'DRIVEN', INDETERMINATE) -jetgrouting = express_getattr(IfcPileTypeEnum, 'JETGROUTING', INDETERMINATE) -cohesion = express_getattr(IfcPileTypeEnum, 'COHESION', INDETERMINATE) -friction = express_getattr(IfcPileTypeEnum, 'FRICTION', INDETERMINATE) -support = express_getattr(IfcPileTypeEnum, 'SUPPORT', INDETERMINATE) -userdefined = express_getattr(IfcPileTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPileTypeEnum, 'NOTDEFINED', INDETERMINATE) +bored = IfcPileTypeEnum.BORED +driven = IfcPileTypeEnum.DRIVEN +jetgrouting = IfcPileTypeEnum.JETGROUTING +cohesion = IfcPileTypeEnum.COHESION +friction = IfcPileTypeEnum.FRICTION +support = IfcPileTypeEnum.SUPPORT +userdefined = IfcPileTypeEnum.USERDEFINED +notdefined = IfcPileTypeEnum.NOTDEFINED IfcPipeFittingTypeEnum = enum_namespace() -bend = express_getattr(IfcPipeFittingTypeEnum, 'BEND', INDETERMINATE) -connector = express_getattr(IfcPipeFittingTypeEnum, 'CONNECTOR', INDETERMINATE) -entry = express_getattr(IfcPipeFittingTypeEnum, 'ENTRY', INDETERMINATE) -exit = express_getattr(IfcPipeFittingTypeEnum, 'EXIT', INDETERMINATE) -junction = express_getattr(IfcPipeFittingTypeEnum, 'JUNCTION', INDETERMINATE) -obstruction = express_getattr(IfcPipeFittingTypeEnum, 'OBSTRUCTION', INDETERMINATE) -transition = express_getattr(IfcPipeFittingTypeEnum, 'TRANSITION', INDETERMINATE) -userdefined = express_getattr(IfcPipeFittingTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPipeFittingTypeEnum, 'NOTDEFINED', INDETERMINATE) +bend = IfcPipeFittingTypeEnum.BEND +connector = IfcPipeFittingTypeEnum.CONNECTOR +entry = IfcPipeFittingTypeEnum.ENTRY +exit = IfcPipeFittingTypeEnum.EXIT +junction = IfcPipeFittingTypeEnum.JUNCTION +obstruction = IfcPipeFittingTypeEnum.OBSTRUCTION +transition = IfcPipeFittingTypeEnum.TRANSITION +userdefined = IfcPipeFittingTypeEnum.USERDEFINED +notdefined = IfcPipeFittingTypeEnum.NOTDEFINED IfcPipeSegmentTypeEnum = enum_namespace() -culvert = express_getattr(IfcPipeSegmentTypeEnum, 'CULVERT', INDETERMINATE) -flexiblesegment = express_getattr(IfcPipeSegmentTypeEnum, 'FLEXIBLESEGMENT', INDETERMINATE) -rigidsegment = express_getattr(IfcPipeSegmentTypeEnum, 'RIGIDSEGMENT', INDETERMINATE) -gutter = express_getattr(IfcPipeSegmentTypeEnum, 'GUTTER', INDETERMINATE) -spool = express_getattr(IfcPipeSegmentTypeEnum, 'SPOOL', INDETERMINATE) -userdefined = express_getattr(IfcPipeSegmentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPipeSegmentTypeEnum, 'NOTDEFINED', INDETERMINATE) +culvert = IfcPipeSegmentTypeEnum.CULVERT +flexiblesegment = IfcPipeSegmentTypeEnum.FLEXIBLESEGMENT +rigidsegment = IfcPipeSegmentTypeEnum.RIGIDSEGMENT +gutter = IfcPipeSegmentTypeEnum.GUTTER +spool = IfcPipeSegmentTypeEnum.SPOOL +userdefined = IfcPipeSegmentTypeEnum.USERDEFINED +notdefined = IfcPipeSegmentTypeEnum.NOTDEFINED IfcPlateTypeEnum = enum_namespace() -curtain_panel = express_getattr(IfcPlateTypeEnum, 'CURTAIN_PANEL', INDETERMINATE) -sheet = express_getattr(IfcPlateTypeEnum, 'SHEET', INDETERMINATE) -userdefined = express_getattr(IfcPlateTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPlateTypeEnum, 'NOTDEFINED', INDETERMINATE) +curtain_panel = IfcPlateTypeEnum.CURTAIN_PANEL +sheet = IfcPlateTypeEnum.SHEET +userdefined = IfcPlateTypeEnum.USERDEFINED +notdefined = IfcPlateTypeEnum.NOTDEFINED IfcPreferredSurfaceCurveRepresentation = enum_namespace() -curve3d = express_getattr(IfcPreferredSurfaceCurveRepresentation, 'CURVE3D', INDETERMINATE) -pcurve_s1 = express_getattr(IfcPreferredSurfaceCurveRepresentation, 'PCURVE_S1', INDETERMINATE) -pcurve_s2 = express_getattr(IfcPreferredSurfaceCurveRepresentation, 'PCURVE_S2', INDETERMINATE) +curve3d = IfcPreferredSurfaceCurveRepresentation.CURVE3D +pcurve_s1 = IfcPreferredSurfaceCurveRepresentation.PCURVE_S1 +pcurve_s2 = IfcPreferredSurfaceCurveRepresentation.PCURVE_S2 IfcProcedureTypeEnum = enum_namespace() -advice_caution = express_getattr(IfcProcedureTypeEnum, 'ADVICE_CAUTION', INDETERMINATE) -advice_note = express_getattr(IfcProcedureTypeEnum, 'ADVICE_NOTE', INDETERMINATE) -advice_warning = express_getattr(IfcProcedureTypeEnum, 'ADVICE_WARNING', INDETERMINATE) -calibration = express_getattr(IfcProcedureTypeEnum, 'CALIBRATION', INDETERMINATE) -diagnostic = express_getattr(IfcProcedureTypeEnum, 'DIAGNOSTIC', INDETERMINATE) -shutdown = express_getattr(IfcProcedureTypeEnum, 'SHUTDOWN', INDETERMINATE) -startup = express_getattr(IfcProcedureTypeEnum, 'STARTUP', INDETERMINATE) -userdefined = express_getattr(IfcProcedureTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcProcedureTypeEnum, 'NOTDEFINED', INDETERMINATE) +advice_caution = IfcProcedureTypeEnum.ADVICE_CAUTION +advice_note = IfcProcedureTypeEnum.ADVICE_NOTE +advice_warning = IfcProcedureTypeEnum.ADVICE_WARNING +calibration = IfcProcedureTypeEnum.CALIBRATION +diagnostic = IfcProcedureTypeEnum.DIAGNOSTIC +shutdown = IfcProcedureTypeEnum.SHUTDOWN +startup = IfcProcedureTypeEnum.STARTUP +userdefined = IfcProcedureTypeEnum.USERDEFINED +notdefined = IfcProcedureTypeEnum.NOTDEFINED IfcProfileTypeEnum = enum_namespace() -curve = express_getattr(IfcProfileTypeEnum, 'CURVE', INDETERMINATE) -area = express_getattr(IfcProfileTypeEnum, 'AREA', INDETERMINATE) +curve = IfcProfileTypeEnum.CURVE +area = IfcProfileTypeEnum.AREA IfcProjectOrderTypeEnum = enum_namespace() -changeorder = express_getattr(IfcProjectOrderTypeEnum, 'CHANGEORDER', INDETERMINATE) -maintenanceworkorder = express_getattr(IfcProjectOrderTypeEnum, 'MAINTENANCEWORKORDER', INDETERMINATE) -moveorder = express_getattr(IfcProjectOrderTypeEnum, 'MOVEORDER', INDETERMINATE) -purchaseorder = express_getattr(IfcProjectOrderTypeEnum, 'PURCHASEORDER', INDETERMINATE) -workorder = express_getattr(IfcProjectOrderTypeEnum, 'WORKORDER', INDETERMINATE) -userdefined = express_getattr(IfcProjectOrderTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcProjectOrderTypeEnum, 'NOTDEFINED', INDETERMINATE) +changeorder = IfcProjectOrderTypeEnum.CHANGEORDER +maintenanceworkorder = IfcProjectOrderTypeEnum.MAINTENANCEWORKORDER +moveorder = IfcProjectOrderTypeEnum.MOVEORDER +purchaseorder = IfcProjectOrderTypeEnum.PURCHASEORDER +workorder = IfcProjectOrderTypeEnum.WORKORDER +userdefined = IfcProjectOrderTypeEnum.USERDEFINED +notdefined = IfcProjectOrderTypeEnum.NOTDEFINED IfcProjectedOrTrueLengthEnum = enum_namespace() -projected_length = express_getattr(IfcProjectedOrTrueLengthEnum, 'PROJECTED_LENGTH', INDETERMINATE) -true_length = express_getattr(IfcProjectedOrTrueLengthEnum, 'TRUE_LENGTH', INDETERMINATE) +projected_length = IfcProjectedOrTrueLengthEnum.PROJECTED_LENGTH +true_length = IfcProjectedOrTrueLengthEnum.TRUE_LENGTH IfcProjectionElementTypeEnum = enum_namespace() -userdefined = express_getattr(IfcProjectionElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcProjectionElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcProjectionElementTypeEnum.USERDEFINED +notdefined = IfcProjectionElementTypeEnum.NOTDEFINED IfcPropertySetTemplateTypeEnum = enum_namespace() -pset_typedrivenonly = express_getattr(IfcPropertySetTemplateTypeEnum, 'PSET_TYPEDRIVENONLY', INDETERMINATE) -pset_typedrivenoverride = express_getattr(IfcPropertySetTemplateTypeEnum, 'PSET_TYPEDRIVENOVERRIDE', INDETERMINATE) -pset_occurrencedriven = express_getattr(IfcPropertySetTemplateTypeEnum, 'PSET_OCCURRENCEDRIVEN', INDETERMINATE) -pset_performancedriven = express_getattr(IfcPropertySetTemplateTypeEnum, 'PSET_PERFORMANCEDRIVEN', INDETERMINATE) -qto_typedrivenonly = express_getattr(IfcPropertySetTemplateTypeEnum, 'QTO_TYPEDRIVENONLY', INDETERMINATE) -qto_typedrivenoverride = express_getattr(IfcPropertySetTemplateTypeEnum, 'QTO_TYPEDRIVENOVERRIDE', INDETERMINATE) -qto_occurrencedriven = express_getattr(IfcPropertySetTemplateTypeEnum, 'QTO_OCCURRENCEDRIVEN', INDETERMINATE) -notdefined = express_getattr(IfcPropertySetTemplateTypeEnum, 'NOTDEFINED', INDETERMINATE) +pset_typedrivenonly = IfcPropertySetTemplateTypeEnum.PSET_TYPEDRIVENONLY +pset_typedrivenoverride = IfcPropertySetTemplateTypeEnum.PSET_TYPEDRIVENOVERRIDE +pset_occurrencedriven = IfcPropertySetTemplateTypeEnum.PSET_OCCURRENCEDRIVEN +pset_performancedriven = IfcPropertySetTemplateTypeEnum.PSET_PERFORMANCEDRIVEN +qto_typedrivenonly = IfcPropertySetTemplateTypeEnum.QTO_TYPEDRIVENONLY +qto_typedrivenoverride = IfcPropertySetTemplateTypeEnum.QTO_TYPEDRIVENOVERRIDE +qto_occurrencedriven = IfcPropertySetTemplateTypeEnum.QTO_OCCURRENCEDRIVEN +notdefined = IfcPropertySetTemplateTypeEnum.NOTDEFINED IfcProtectiveDeviceTrippingUnitTypeEnum = enum_namespace() -electronic = express_getattr(IfcProtectiveDeviceTrippingUnitTypeEnum, 'ELECTRONIC', INDETERMINATE) -electromagnetic = express_getattr(IfcProtectiveDeviceTrippingUnitTypeEnum, 'ELECTROMAGNETIC', INDETERMINATE) -residualcurrent = express_getattr(IfcProtectiveDeviceTrippingUnitTypeEnum, 'RESIDUALCURRENT', INDETERMINATE) -thermal = express_getattr(IfcProtectiveDeviceTrippingUnitTypeEnum, 'THERMAL', INDETERMINATE) -userdefined = express_getattr(IfcProtectiveDeviceTrippingUnitTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcProtectiveDeviceTrippingUnitTypeEnum, 'NOTDEFINED', INDETERMINATE) +electronic = IfcProtectiveDeviceTrippingUnitTypeEnum.ELECTRONIC +electromagnetic = IfcProtectiveDeviceTrippingUnitTypeEnum.ELECTROMAGNETIC +residualcurrent = IfcProtectiveDeviceTrippingUnitTypeEnum.RESIDUALCURRENT +thermal = IfcProtectiveDeviceTrippingUnitTypeEnum.THERMAL +userdefined = IfcProtectiveDeviceTrippingUnitTypeEnum.USERDEFINED +notdefined = IfcProtectiveDeviceTrippingUnitTypeEnum.NOTDEFINED IfcProtectiveDeviceTypeEnum = enum_namespace() -circuitbreaker = express_getattr(IfcProtectiveDeviceTypeEnum, 'CIRCUITBREAKER', INDETERMINATE) -earthleakagecircuitbreaker = express_getattr(IfcProtectiveDeviceTypeEnum, 'EARTHLEAKAGECIRCUITBREAKER', INDETERMINATE) -earthingswitch = express_getattr(IfcProtectiveDeviceTypeEnum, 'EARTHINGSWITCH', INDETERMINATE) -fusedisconnector = express_getattr(IfcProtectiveDeviceTypeEnum, 'FUSEDISCONNECTOR', INDETERMINATE) -residualcurrentcircuitbreaker = express_getattr(IfcProtectiveDeviceTypeEnum, 'RESIDUALCURRENTCIRCUITBREAKER', INDETERMINATE) -residualcurrentswitch = express_getattr(IfcProtectiveDeviceTypeEnum, 'RESIDUALCURRENTSWITCH', INDETERMINATE) -varistor = express_getattr(IfcProtectiveDeviceTypeEnum, 'VARISTOR', INDETERMINATE) -userdefined = express_getattr(IfcProtectiveDeviceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcProtectiveDeviceTypeEnum, 'NOTDEFINED', INDETERMINATE) +circuitbreaker = IfcProtectiveDeviceTypeEnum.CIRCUITBREAKER +earthleakagecircuitbreaker = IfcProtectiveDeviceTypeEnum.EARTHLEAKAGECIRCUITBREAKER +earthingswitch = IfcProtectiveDeviceTypeEnum.EARTHINGSWITCH +fusedisconnector = IfcProtectiveDeviceTypeEnum.FUSEDISCONNECTOR +residualcurrentcircuitbreaker = IfcProtectiveDeviceTypeEnum.RESIDUALCURRENTCIRCUITBREAKER +residualcurrentswitch = IfcProtectiveDeviceTypeEnum.RESIDUALCURRENTSWITCH +varistor = IfcProtectiveDeviceTypeEnum.VARISTOR +userdefined = IfcProtectiveDeviceTypeEnum.USERDEFINED +notdefined = IfcProtectiveDeviceTypeEnum.NOTDEFINED IfcPumpTypeEnum = enum_namespace() -circulator = express_getattr(IfcPumpTypeEnum, 'CIRCULATOR', INDETERMINATE) -endsuction = express_getattr(IfcPumpTypeEnum, 'ENDSUCTION', INDETERMINATE) -splitcase = express_getattr(IfcPumpTypeEnum, 'SPLITCASE', INDETERMINATE) -submersiblepump = express_getattr(IfcPumpTypeEnum, 'SUBMERSIBLEPUMP', INDETERMINATE) -sumppump = express_getattr(IfcPumpTypeEnum, 'SUMPPUMP', INDETERMINATE) -verticalinline = express_getattr(IfcPumpTypeEnum, 'VERTICALINLINE', INDETERMINATE) -verticalturbine = express_getattr(IfcPumpTypeEnum, 'VERTICALTURBINE', INDETERMINATE) -userdefined = express_getattr(IfcPumpTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPumpTypeEnum, 'NOTDEFINED', INDETERMINATE) +circulator = IfcPumpTypeEnum.CIRCULATOR +endsuction = IfcPumpTypeEnum.ENDSUCTION +splitcase = IfcPumpTypeEnum.SPLITCASE +submersiblepump = IfcPumpTypeEnum.SUBMERSIBLEPUMP +sumppump = IfcPumpTypeEnum.SUMPPUMP +verticalinline = IfcPumpTypeEnum.VERTICALINLINE +verticalturbine = IfcPumpTypeEnum.VERTICALTURBINE +userdefined = IfcPumpTypeEnum.USERDEFINED +notdefined = IfcPumpTypeEnum.NOTDEFINED IfcRailingTypeEnum = enum_namespace() -handrail = express_getattr(IfcRailingTypeEnum, 'HANDRAIL', INDETERMINATE) -guardrail = express_getattr(IfcRailingTypeEnum, 'GUARDRAIL', INDETERMINATE) -balustrade = express_getattr(IfcRailingTypeEnum, 'BALUSTRADE', INDETERMINATE) -userdefined = express_getattr(IfcRailingTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcRailingTypeEnum, 'NOTDEFINED', INDETERMINATE) +handrail = IfcRailingTypeEnum.HANDRAIL +guardrail = IfcRailingTypeEnum.GUARDRAIL +balustrade = IfcRailingTypeEnum.BALUSTRADE +userdefined = IfcRailingTypeEnum.USERDEFINED +notdefined = IfcRailingTypeEnum.NOTDEFINED IfcRampFlightTypeEnum = enum_namespace() -straight = express_getattr(IfcRampFlightTypeEnum, 'STRAIGHT', INDETERMINATE) -spiral = express_getattr(IfcRampFlightTypeEnum, 'SPIRAL', INDETERMINATE) -userdefined = express_getattr(IfcRampFlightTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcRampFlightTypeEnum, 'NOTDEFINED', INDETERMINATE) +straight = IfcRampFlightTypeEnum.STRAIGHT +spiral = IfcRampFlightTypeEnum.SPIRAL +userdefined = IfcRampFlightTypeEnum.USERDEFINED +notdefined = IfcRampFlightTypeEnum.NOTDEFINED IfcRampTypeEnum = enum_namespace() -straight_run_ramp = express_getattr(IfcRampTypeEnum, 'STRAIGHT_RUN_RAMP', INDETERMINATE) -two_straight_run_ramp = express_getattr(IfcRampTypeEnum, 'TWO_STRAIGHT_RUN_RAMP', INDETERMINATE) -quarter_turn_ramp = express_getattr(IfcRampTypeEnum, 'QUARTER_TURN_RAMP', INDETERMINATE) -two_quarter_turn_ramp = express_getattr(IfcRampTypeEnum, 'TWO_QUARTER_TURN_RAMP', INDETERMINATE) -half_turn_ramp = express_getattr(IfcRampTypeEnum, 'HALF_TURN_RAMP', INDETERMINATE) -spiral_ramp = express_getattr(IfcRampTypeEnum, 'SPIRAL_RAMP', INDETERMINATE) -userdefined = express_getattr(IfcRampTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcRampTypeEnum, 'NOTDEFINED', INDETERMINATE) +straight_run_ramp = IfcRampTypeEnum.STRAIGHT_RUN_RAMP +two_straight_run_ramp = IfcRampTypeEnum.TWO_STRAIGHT_RUN_RAMP +quarter_turn_ramp = IfcRampTypeEnum.QUARTER_TURN_RAMP +two_quarter_turn_ramp = IfcRampTypeEnum.TWO_QUARTER_TURN_RAMP +half_turn_ramp = IfcRampTypeEnum.HALF_TURN_RAMP +spiral_ramp = IfcRampTypeEnum.SPIRAL_RAMP +userdefined = IfcRampTypeEnum.USERDEFINED +notdefined = IfcRampTypeEnum.NOTDEFINED IfcRecurrenceTypeEnum = enum_namespace() -daily = express_getattr(IfcRecurrenceTypeEnum, 'DAILY', INDETERMINATE) -weekly = express_getattr(IfcRecurrenceTypeEnum, 'WEEKLY', INDETERMINATE) -monthly_by_day_of_month = express_getattr(IfcRecurrenceTypeEnum, 'MONTHLY_BY_DAY_OF_MONTH', INDETERMINATE) -monthly_by_position = express_getattr(IfcRecurrenceTypeEnum, 'MONTHLY_BY_POSITION', INDETERMINATE) -by_day_count = express_getattr(IfcRecurrenceTypeEnum, 'BY_DAY_COUNT', INDETERMINATE) -by_weekday_count = express_getattr(IfcRecurrenceTypeEnum, 'BY_WEEKDAY_COUNT', INDETERMINATE) -yearly_by_day_of_month = express_getattr(IfcRecurrenceTypeEnum, 'YEARLY_BY_DAY_OF_MONTH', INDETERMINATE) -yearly_by_position = express_getattr(IfcRecurrenceTypeEnum, 'YEARLY_BY_POSITION', INDETERMINATE) +daily = IfcRecurrenceTypeEnum.DAILY +weekly = IfcRecurrenceTypeEnum.WEEKLY +monthly_by_day_of_month = IfcRecurrenceTypeEnum.MONTHLY_BY_DAY_OF_MONTH +monthly_by_position = IfcRecurrenceTypeEnum.MONTHLY_BY_POSITION +by_day_count = IfcRecurrenceTypeEnum.BY_DAY_COUNT +by_weekday_count = IfcRecurrenceTypeEnum.BY_WEEKDAY_COUNT +yearly_by_day_of_month = IfcRecurrenceTypeEnum.YEARLY_BY_DAY_OF_MONTH +yearly_by_position = IfcRecurrenceTypeEnum.YEARLY_BY_POSITION IfcReferentTypeEnum = enum_namespace() -kilopoint = express_getattr(IfcReferentTypeEnum, 'KILOPOINT', INDETERMINATE) -milepoint = express_getattr(IfcReferentTypeEnum, 'MILEPOINT', INDETERMINATE) -station = express_getattr(IfcReferentTypeEnum, 'STATION', INDETERMINATE) -userdefined = express_getattr(IfcReferentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcReferentTypeEnum, 'NOTDEFINED', INDETERMINATE) +kilopoint = IfcReferentTypeEnum.KILOPOINT +milepoint = IfcReferentTypeEnum.MILEPOINT +station = IfcReferentTypeEnum.STATION +userdefined = IfcReferentTypeEnum.USERDEFINED +notdefined = IfcReferentTypeEnum.NOTDEFINED IfcReflectanceMethodEnum = enum_namespace() -blinn = express_getattr(IfcReflectanceMethodEnum, 'BLINN', INDETERMINATE) -flat = express_getattr(IfcReflectanceMethodEnum, 'FLAT', INDETERMINATE) -glass = express_getattr(IfcReflectanceMethodEnum, 'GLASS', INDETERMINATE) -matt = express_getattr(IfcReflectanceMethodEnum, 'MATT', INDETERMINATE) -metal = express_getattr(IfcReflectanceMethodEnum, 'METAL', INDETERMINATE) -mirror = express_getattr(IfcReflectanceMethodEnum, 'MIRROR', INDETERMINATE) -phong = express_getattr(IfcReflectanceMethodEnum, 'PHONG', INDETERMINATE) -plastic = express_getattr(IfcReflectanceMethodEnum, 'PLASTIC', INDETERMINATE) -strauss = express_getattr(IfcReflectanceMethodEnum, 'STRAUSS', INDETERMINATE) -notdefined = express_getattr(IfcReflectanceMethodEnum, 'NOTDEFINED', INDETERMINATE) +blinn = IfcReflectanceMethodEnum.BLINN +flat = IfcReflectanceMethodEnum.FLAT +glass = IfcReflectanceMethodEnum.GLASS +matt = IfcReflectanceMethodEnum.MATT +metal = IfcReflectanceMethodEnum.METAL +mirror = IfcReflectanceMethodEnum.MIRROR +phong = IfcReflectanceMethodEnum.PHONG +plastic = IfcReflectanceMethodEnum.PLASTIC +strauss = IfcReflectanceMethodEnum.STRAUSS +notdefined = IfcReflectanceMethodEnum.NOTDEFINED IfcReinforcingBarRoleEnum = enum_namespace() -main = express_getattr(IfcReinforcingBarRoleEnum, 'MAIN', INDETERMINATE) -shear = express_getattr(IfcReinforcingBarRoleEnum, 'SHEAR', INDETERMINATE) -ligature = express_getattr(IfcReinforcingBarRoleEnum, 'LIGATURE', INDETERMINATE) -stud = express_getattr(IfcReinforcingBarRoleEnum, 'STUD', INDETERMINATE) -punching = express_getattr(IfcReinforcingBarRoleEnum, 'PUNCHING', INDETERMINATE) -edge = express_getattr(IfcReinforcingBarRoleEnum, 'EDGE', INDETERMINATE) -ring = express_getattr(IfcReinforcingBarRoleEnum, 'RING', INDETERMINATE) -anchoring = express_getattr(IfcReinforcingBarRoleEnum, 'ANCHORING', INDETERMINATE) -userdefined = express_getattr(IfcReinforcingBarRoleEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcReinforcingBarRoleEnum, 'NOTDEFINED', INDETERMINATE) +main = IfcReinforcingBarRoleEnum.MAIN +shear = IfcReinforcingBarRoleEnum.SHEAR +ligature = IfcReinforcingBarRoleEnum.LIGATURE +stud = IfcReinforcingBarRoleEnum.STUD +punching = IfcReinforcingBarRoleEnum.PUNCHING +edge = IfcReinforcingBarRoleEnum.EDGE +ring = IfcReinforcingBarRoleEnum.RING +anchoring = IfcReinforcingBarRoleEnum.ANCHORING +userdefined = IfcReinforcingBarRoleEnum.USERDEFINED +notdefined = IfcReinforcingBarRoleEnum.NOTDEFINED IfcReinforcingBarSurfaceEnum = enum_namespace() -plain = express_getattr(IfcReinforcingBarSurfaceEnum, 'PLAIN', INDETERMINATE) -textured = express_getattr(IfcReinforcingBarSurfaceEnum, 'TEXTURED', INDETERMINATE) +plain = IfcReinforcingBarSurfaceEnum.PLAIN +textured = IfcReinforcingBarSurfaceEnum.TEXTURED IfcReinforcingBarTypeEnum = enum_namespace() -anchoring = express_getattr(IfcReinforcingBarTypeEnum, 'ANCHORING', INDETERMINATE) -edge = express_getattr(IfcReinforcingBarTypeEnum, 'EDGE', INDETERMINATE) -ligature = express_getattr(IfcReinforcingBarTypeEnum, 'LIGATURE', INDETERMINATE) -main = express_getattr(IfcReinforcingBarTypeEnum, 'MAIN', INDETERMINATE) -punching = express_getattr(IfcReinforcingBarTypeEnum, 'PUNCHING', INDETERMINATE) -ring = express_getattr(IfcReinforcingBarTypeEnum, 'RING', INDETERMINATE) -shear = express_getattr(IfcReinforcingBarTypeEnum, 'SHEAR', INDETERMINATE) -stud = express_getattr(IfcReinforcingBarTypeEnum, 'STUD', INDETERMINATE) -userdefined = express_getattr(IfcReinforcingBarTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcReinforcingBarTypeEnum, 'NOTDEFINED', INDETERMINATE) +anchoring = IfcReinforcingBarTypeEnum.ANCHORING +edge = IfcReinforcingBarTypeEnum.EDGE +ligature = IfcReinforcingBarTypeEnum.LIGATURE +main = IfcReinforcingBarTypeEnum.MAIN +punching = IfcReinforcingBarTypeEnum.PUNCHING +ring = IfcReinforcingBarTypeEnum.RING +shear = IfcReinforcingBarTypeEnum.SHEAR +stud = IfcReinforcingBarTypeEnum.STUD +userdefined = IfcReinforcingBarTypeEnum.USERDEFINED +notdefined = IfcReinforcingBarTypeEnum.NOTDEFINED IfcReinforcingMeshTypeEnum = enum_namespace() -userdefined = express_getattr(IfcReinforcingMeshTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcReinforcingMeshTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcReinforcingMeshTypeEnum.USERDEFINED +notdefined = IfcReinforcingMeshTypeEnum.NOTDEFINED IfcRoleEnum = enum_namespace() -supplier = express_getattr(IfcRoleEnum, 'SUPPLIER', INDETERMINATE) -manufacturer = express_getattr(IfcRoleEnum, 'MANUFACTURER', INDETERMINATE) -contractor = express_getattr(IfcRoleEnum, 'CONTRACTOR', INDETERMINATE) -subcontractor = express_getattr(IfcRoleEnum, 'SUBCONTRACTOR', INDETERMINATE) -architect = express_getattr(IfcRoleEnum, 'ARCHITECT', INDETERMINATE) -structuralengineer = express_getattr(IfcRoleEnum, 'STRUCTURALENGINEER', INDETERMINATE) -costengineer = express_getattr(IfcRoleEnum, 'COSTENGINEER', INDETERMINATE) -client = express_getattr(IfcRoleEnum, 'CLIENT', INDETERMINATE) -buildingowner = express_getattr(IfcRoleEnum, 'BUILDINGOWNER', INDETERMINATE) -buildingoperator = express_getattr(IfcRoleEnum, 'BUILDINGOPERATOR', INDETERMINATE) -mechanicalengineer = express_getattr(IfcRoleEnum, 'MECHANICALENGINEER', INDETERMINATE) -electricalengineer = express_getattr(IfcRoleEnum, 'ELECTRICALENGINEER', INDETERMINATE) -projectmanager = express_getattr(IfcRoleEnum, 'PROJECTMANAGER', INDETERMINATE) -facilitiesmanager = express_getattr(IfcRoleEnum, 'FACILITIESMANAGER', INDETERMINATE) -civilengineer = express_getattr(IfcRoleEnum, 'CIVILENGINEER', INDETERMINATE) -commissioningengineer = express_getattr(IfcRoleEnum, 'COMMISSIONINGENGINEER', INDETERMINATE) -engineer = express_getattr(IfcRoleEnum, 'ENGINEER', INDETERMINATE) -owner = express_getattr(IfcRoleEnum, 'OWNER', INDETERMINATE) -consultant = express_getattr(IfcRoleEnum, 'CONSULTANT', INDETERMINATE) -constructionmanager = express_getattr(IfcRoleEnum, 'CONSTRUCTIONMANAGER', INDETERMINATE) -fieldconstructionmanager = express_getattr(IfcRoleEnum, 'FIELDCONSTRUCTIONMANAGER', INDETERMINATE) -reseller = express_getattr(IfcRoleEnum, 'RESELLER', INDETERMINATE) -userdefined = express_getattr(IfcRoleEnum, 'USERDEFINED', INDETERMINATE) +supplier = IfcRoleEnum.SUPPLIER +manufacturer = IfcRoleEnum.MANUFACTURER +contractor = IfcRoleEnum.CONTRACTOR +subcontractor = IfcRoleEnum.SUBCONTRACTOR +architect = IfcRoleEnum.ARCHITECT +structuralengineer = IfcRoleEnum.STRUCTURALENGINEER +costengineer = IfcRoleEnum.COSTENGINEER +client = IfcRoleEnum.CLIENT +buildingowner = IfcRoleEnum.BUILDINGOWNER +buildingoperator = IfcRoleEnum.BUILDINGOPERATOR +mechanicalengineer = IfcRoleEnum.MECHANICALENGINEER +electricalengineer = IfcRoleEnum.ELECTRICALENGINEER +projectmanager = IfcRoleEnum.PROJECTMANAGER +facilitiesmanager = IfcRoleEnum.FACILITIESMANAGER +civilengineer = IfcRoleEnum.CIVILENGINEER +commissioningengineer = IfcRoleEnum.COMMISSIONINGENGINEER +engineer = IfcRoleEnum.ENGINEER +owner = IfcRoleEnum.OWNER +consultant = IfcRoleEnum.CONSULTANT +constructionmanager = IfcRoleEnum.CONSTRUCTIONMANAGER +fieldconstructionmanager = IfcRoleEnum.FIELDCONSTRUCTIONMANAGER +reseller = IfcRoleEnum.RESELLER +userdefined = IfcRoleEnum.USERDEFINED IfcRoofTypeEnum = enum_namespace() -flat_roof = express_getattr(IfcRoofTypeEnum, 'FLAT_ROOF', INDETERMINATE) -shed_roof = express_getattr(IfcRoofTypeEnum, 'SHED_ROOF', INDETERMINATE) -gable_roof = express_getattr(IfcRoofTypeEnum, 'GABLE_ROOF', INDETERMINATE) -hip_roof = express_getattr(IfcRoofTypeEnum, 'HIP_ROOF', INDETERMINATE) -hipped_gable_roof = express_getattr(IfcRoofTypeEnum, 'HIPPED_GABLE_ROOF', INDETERMINATE) -gambrel_roof = express_getattr(IfcRoofTypeEnum, 'GAMBREL_ROOF', INDETERMINATE) -mansard_roof = express_getattr(IfcRoofTypeEnum, 'MANSARD_ROOF', INDETERMINATE) -barrel_roof = express_getattr(IfcRoofTypeEnum, 'BARREL_ROOF', INDETERMINATE) -rainbow_roof = express_getattr(IfcRoofTypeEnum, 'RAINBOW_ROOF', INDETERMINATE) -butterfly_roof = express_getattr(IfcRoofTypeEnum, 'BUTTERFLY_ROOF', INDETERMINATE) -pavilion_roof = express_getattr(IfcRoofTypeEnum, 'PAVILION_ROOF', INDETERMINATE) -dome_roof = express_getattr(IfcRoofTypeEnum, 'DOME_ROOF', INDETERMINATE) -freeform = express_getattr(IfcRoofTypeEnum, 'FREEFORM', INDETERMINATE) -userdefined = express_getattr(IfcRoofTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcRoofTypeEnum, 'NOTDEFINED', INDETERMINATE) +flat_roof = IfcRoofTypeEnum.FLAT_ROOF +shed_roof = IfcRoofTypeEnum.SHED_ROOF +gable_roof = IfcRoofTypeEnum.GABLE_ROOF +hip_roof = IfcRoofTypeEnum.HIP_ROOF +hipped_gable_roof = IfcRoofTypeEnum.HIPPED_GABLE_ROOF +gambrel_roof = IfcRoofTypeEnum.GAMBREL_ROOF +mansard_roof = IfcRoofTypeEnum.MANSARD_ROOF +barrel_roof = IfcRoofTypeEnum.BARREL_ROOF +rainbow_roof = IfcRoofTypeEnum.RAINBOW_ROOF +butterfly_roof = IfcRoofTypeEnum.BUTTERFLY_ROOF +pavilion_roof = IfcRoofTypeEnum.PAVILION_ROOF +dome_roof = IfcRoofTypeEnum.DOME_ROOF +freeform = IfcRoofTypeEnum.FREEFORM +userdefined = IfcRoofTypeEnum.USERDEFINED +notdefined = IfcRoofTypeEnum.NOTDEFINED IfcSIPrefix = enum_namespace() -exa = express_getattr(IfcSIPrefix, 'EXA', INDETERMINATE) -peta = express_getattr(IfcSIPrefix, 'PETA', INDETERMINATE) -tera = express_getattr(IfcSIPrefix, 'TERA', INDETERMINATE) -giga = express_getattr(IfcSIPrefix, 'GIGA', INDETERMINATE) -mega = express_getattr(IfcSIPrefix, 'MEGA', INDETERMINATE) -kilo = express_getattr(IfcSIPrefix, 'KILO', INDETERMINATE) -hecto = express_getattr(IfcSIPrefix, 'HECTO', INDETERMINATE) -deca = express_getattr(IfcSIPrefix, 'DECA', INDETERMINATE) -deci = express_getattr(IfcSIPrefix, 'DECI', INDETERMINATE) -centi = express_getattr(IfcSIPrefix, 'CENTI', INDETERMINATE) -milli = express_getattr(IfcSIPrefix, 'MILLI', INDETERMINATE) -micro = express_getattr(IfcSIPrefix, 'MICRO', INDETERMINATE) -nano = express_getattr(IfcSIPrefix, 'NANO', INDETERMINATE) -pico = express_getattr(IfcSIPrefix, 'PICO', INDETERMINATE) -femto = express_getattr(IfcSIPrefix, 'FEMTO', INDETERMINATE) -atto = express_getattr(IfcSIPrefix, 'ATTO', INDETERMINATE) +exa = IfcSIPrefix.EXA +peta = IfcSIPrefix.PETA +tera = IfcSIPrefix.TERA +giga = IfcSIPrefix.GIGA +mega = IfcSIPrefix.MEGA +kilo = IfcSIPrefix.KILO +hecto = IfcSIPrefix.HECTO +deca = IfcSIPrefix.DECA +deci = IfcSIPrefix.DECI +centi = IfcSIPrefix.CENTI +milli = IfcSIPrefix.MILLI +micro = IfcSIPrefix.MICRO +nano = IfcSIPrefix.NANO +pico = IfcSIPrefix.PICO +femto = IfcSIPrefix.FEMTO +atto = IfcSIPrefix.ATTO IfcSIUnitName = enum_namespace() -ampere = express_getattr(IfcSIUnitName, 'AMPERE', INDETERMINATE) -becquerel = express_getattr(IfcSIUnitName, 'BECQUEREL', INDETERMINATE) -candela = express_getattr(IfcSIUnitName, 'CANDELA', INDETERMINATE) -coulomb = express_getattr(IfcSIUnitName, 'COULOMB', INDETERMINATE) -cubic_metre = express_getattr(IfcSIUnitName, 'CUBIC_METRE', INDETERMINATE) -degree_celsius = express_getattr(IfcSIUnitName, 'DEGREE_CELSIUS', INDETERMINATE) -farad = express_getattr(IfcSIUnitName, 'FARAD', INDETERMINATE) -gram = express_getattr(IfcSIUnitName, 'GRAM', INDETERMINATE) -gray = express_getattr(IfcSIUnitName, 'GRAY', INDETERMINATE) -henry = express_getattr(IfcSIUnitName, 'HENRY', INDETERMINATE) -hertz = express_getattr(IfcSIUnitName, 'HERTZ', INDETERMINATE) -joule = express_getattr(IfcSIUnitName, 'JOULE', INDETERMINATE) -kelvin = express_getattr(IfcSIUnitName, 'KELVIN', INDETERMINATE) -lumen = express_getattr(IfcSIUnitName, 'LUMEN', INDETERMINATE) -lux = express_getattr(IfcSIUnitName, 'LUX', INDETERMINATE) -metre = express_getattr(IfcSIUnitName, 'METRE', INDETERMINATE) -mole = express_getattr(IfcSIUnitName, 'MOLE', INDETERMINATE) -newton = express_getattr(IfcSIUnitName, 'NEWTON', INDETERMINATE) -ohm = express_getattr(IfcSIUnitName, 'OHM', INDETERMINATE) -pascal = express_getattr(IfcSIUnitName, 'PASCAL', INDETERMINATE) -radian = express_getattr(IfcSIUnitName, 'RADIAN', INDETERMINATE) -second = express_getattr(IfcSIUnitName, 'SECOND', INDETERMINATE) -siemens = express_getattr(IfcSIUnitName, 'SIEMENS', INDETERMINATE) -sievert = express_getattr(IfcSIUnitName, 'SIEVERT', INDETERMINATE) -square_metre = express_getattr(IfcSIUnitName, 'SQUARE_METRE', INDETERMINATE) -steradian = express_getattr(IfcSIUnitName, 'STERADIAN', INDETERMINATE) -tesla = express_getattr(IfcSIUnitName, 'TESLA', INDETERMINATE) -volt = express_getattr(IfcSIUnitName, 'VOLT', INDETERMINATE) -watt = express_getattr(IfcSIUnitName, 'WATT', INDETERMINATE) -weber = express_getattr(IfcSIUnitName, 'WEBER', INDETERMINATE) +ampere = IfcSIUnitName.AMPERE +becquerel = IfcSIUnitName.BECQUEREL +candela = IfcSIUnitName.CANDELA +coulomb = IfcSIUnitName.COULOMB +cubic_metre = IfcSIUnitName.CUBIC_METRE +degree_celsius = IfcSIUnitName.DEGREE_CELSIUS +farad = IfcSIUnitName.FARAD +gram = IfcSIUnitName.GRAM +gray = IfcSIUnitName.GRAY +henry = IfcSIUnitName.HENRY +hertz = IfcSIUnitName.HERTZ +joule = IfcSIUnitName.JOULE +kelvin = IfcSIUnitName.KELVIN +lumen = IfcSIUnitName.LUMEN +lux = IfcSIUnitName.LUX +metre = IfcSIUnitName.METRE +mole = IfcSIUnitName.MOLE +newton = IfcSIUnitName.NEWTON +ohm = IfcSIUnitName.OHM +pascal = IfcSIUnitName.PASCAL +radian = IfcSIUnitName.RADIAN +second = IfcSIUnitName.SECOND +siemens = IfcSIUnitName.SIEMENS +sievert = IfcSIUnitName.SIEVERT +square_metre = IfcSIUnitName.SQUARE_METRE +steradian = IfcSIUnitName.STERADIAN +tesla = IfcSIUnitName.TESLA +volt = IfcSIUnitName.VOLT +watt = IfcSIUnitName.WATT +weber = IfcSIUnitName.WEBER IfcSanitaryTerminalTypeEnum = enum_namespace() -bath = express_getattr(IfcSanitaryTerminalTypeEnum, 'BATH', INDETERMINATE) -bidet = express_getattr(IfcSanitaryTerminalTypeEnum, 'BIDET', INDETERMINATE) -cistern = express_getattr(IfcSanitaryTerminalTypeEnum, 'CISTERN', INDETERMINATE) -shower = express_getattr(IfcSanitaryTerminalTypeEnum, 'SHOWER', INDETERMINATE) -sink = express_getattr(IfcSanitaryTerminalTypeEnum, 'SINK', INDETERMINATE) -sanitaryfountain = express_getattr(IfcSanitaryTerminalTypeEnum, 'SANITARYFOUNTAIN', INDETERMINATE) -toiletpan = express_getattr(IfcSanitaryTerminalTypeEnum, 'TOILETPAN', INDETERMINATE) -urinal = express_getattr(IfcSanitaryTerminalTypeEnum, 'URINAL', INDETERMINATE) -washhandbasin = express_getattr(IfcSanitaryTerminalTypeEnum, 'WASHHANDBASIN', INDETERMINATE) -wcseat = express_getattr(IfcSanitaryTerminalTypeEnum, 'WCSEAT', INDETERMINATE) -userdefined = express_getattr(IfcSanitaryTerminalTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSanitaryTerminalTypeEnum, 'NOTDEFINED', INDETERMINATE) +bath = IfcSanitaryTerminalTypeEnum.BATH +bidet = IfcSanitaryTerminalTypeEnum.BIDET +cistern = IfcSanitaryTerminalTypeEnum.CISTERN +shower = IfcSanitaryTerminalTypeEnum.SHOWER +sink = IfcSanitaryTerminalTypeEnum.SINK +sanitaryfountain = IfcSanitaryTerminalTypeEnum.SANITARYFOUNTAIN +toiletpan = IfcSanitaryTerminalTypeEnum.TOILETPAN +urinal = IfcSanitaryTerminalTypeEnum.URINAL +washhandbasin = IfcSanitaryTerminalTypeEnum.WASHHANDBASIN +wcseat = IfcSanitaryTerminalTypeEnum.WCSEAT +userdefined = IfcSanitaryTerminalTypeEnum.USERDEFINED +notdefined = IfcSanitaryTerminalTypeEnum.NOTDEFINED IfcSectionTypeEnum = enum_namespace() -uniform = express_getattr(IfcSectionTypeEnum, 'UNIFORM', INDETERMINATE) -tapered = express_getattr(IfcSectionTypeEnum, 'TAPERED', INDETERMINATE) +uniform = IfcSectionTypeEnum.UNIFORM +tapered = IfcSectionTypeEnum.TAPERED IfcSensorTypeEnum = enum_namespace() -cosensor = express_getattr(IfcSensorTypeEnum, 'COSENSOR', INDETERMINATE) -co2sensor = express_getattr(IfcSensorTypeEnum, 'CO2SENSOR', INDETERMINATE) -conductancesensor = express_getattr(IfcSensorTypeEnum, 'CONDUCTANCESENSOR', INDETERMINATE) -contactsensor = express_getattr(IfcSensorTypeEnum, 'CONTACTSENSOR', INDETERMINATE) -firesensor = express_getattr(IfcSensorTypeEnum, 'FIRESENSOR', INDETERMINATE) -flowsensor = express_getattr(IfcSensorTypeEnum, 'FLOWSENSOR', INDETERMINATE) -frostsensor = express_getattr(IfcSensorTypeEnum, 'FROSTSENSOR', INDETERMINATE) -gassensor = express_getattr(IfcSensorTypeEnum, 'GASSENSOR', INDETERMINATE) -heatsensor = express_getattr(IfcSensorTypeEnum, 'HEATSENSOR', INDETERMINATE) -humiditysensor = express_getattr(IfcSensorTypeEnum, 'HUMIDITYSENSOR', INDETERMINATE) -identifiersensor = express_getattr(IfcSensorTypeEnum, 'IDENTIFIERSENSOR', INDETERMINATE) -ionconcentrationsensor = express_getattr(IfcSensorTypeEnum, 'IONCONCENTRATIONSENSOR', INDETERMINATE) -levelsensor = express_getattr(IfcSensorTypeEnum, 'LEVELSENSOR', INDETERMINATE) -lightsensor = express_getattr(IfcSensorTypeEnum, 'LIGHTSENSOR', INDETERMINATE) -moisturesensor = express_getattr(IfcSensorTypeEnum, 'MOISTURESENSOR', INDETERMINATE) -movementsensor = express_getattr(IfcSensorTypeEnum, 'MOVEMENTSENSOR', INDETERMINATE) -phsensor = express_getattr(IfcSensorTypeEnum, 'PHSENSOR', INDETERMINATE) -pressuresensor = express_getattr(IfcSensorTypeEnum, 'PRESSURESENSOR', INDETERMINATE) -radiationsensor = express_getattr(IfcSensorTypeEnum, 'RADIATIONSENSOR', INDETERMINATE) -radioactivitysensor = express_getattr(IfcSensorTypeEnum, 'RADIOACTIVITYSENSOR', INDETERMINATE) -smokesensor = express_getattr(IfcSensorTypeEnum, 'SMOKESENSOR', INDETERMINATE) -soundsensor = express_getattr(IfcSensorTypeEnum, 'SOUNDSENSOR', INDETERMINATE) -temperaturesensor = express_getattr(IfcSensorTypeEnum, 'TEMPERATURESENSOR', INDETERMINATE) -windsensor = express_getattr(IfcSensorTypeEnum, 'WINDSENSOR', INDETERMINATE) -userdefined = express_getattr(IfcSensorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSensorTypeEnum, 'NOTDEFINED', INDETERMINATE) +cosensor = IfcSensorTypeEnum.COSENSOR +co2sensor = IfcSensorTypeEnum.CO2SENSOR +conductancesensor = IfcSensorTypeEnum.CONDUCTANCESENSOR +contactsensor = IfcSensorTypeEnum.CONTACTSENSOR +firesensor = IfcSensorTypeEnum.FIRESENSOR +flowsensor = IfcSensorTypeEnum.FLOWSENSOR +frostsensor = IfcSensorTypeEnum.FROSTSENSOR +gassensor = IfcSensorTypeEnum.GASSENSOR +heatsensor = IfcSensorTypeEnum.HEATSENSOR +humiditysensor = IfcSensorTypeEnum.HUMIDITYSENSOR +identifiersensor = IfcSensorTypeEnum.IDENTIFIERSENSOR +ionconcentrationsensor = IfcSensorTypeEnum.IONCONCENTRATIONSENSOR +levelsensor = IfcSensorTypeEnum.LEVELSENSOR +lightsensor = IfcSensorTypeEnum.LIGHTSENSOR +moisturesensor = IfcSensorTypeEnum.MOISTURESENSOR +movementsensor = IfcSensorTypeEnum.MOVEMENTSENSOR +phsensor = IfcSensorTypeEnum.PHSENSOR +pressuresensor = IfcSensorTypeEnum.PRESSURESENSOR +radiationsensor = IfcSensorTypeEnum.RADIATIONSENSOR +radioactivitysensor = IfcSensorTypeEnum.RADIOACTIVITYSENSOR +smokesensor = IfcSensorTypeEnum.SMOKESENSOR +soundsensor = IfcSensorTypeEnum.SOUNDSENSOR +temperaturesensor = IfcSensorTypeEnum.TEMPERATURESENSOR +windsensor = IfcSensorTypeEnum.WINDSENSOR +userdefined = IfcSensorTypeEnum.USERDEFINED +notdefined = IfcSensorTypeEnum.NOTDEFINED IfcSequenceEnum = enum_namespace() -start_start = express_getattr(IfcSequenceEnum, 'START_START', INDETERMINATE) -start_finish = express_getattr(IfcSequenceEnum, 'START_FINISH', INDETERMINATE) -finish_start = express_getattr(IfcSequenceEnum, 'FINISH_START', INDETERMINATE) -finish_finish = express_getattr(IfcSequenceEnum, 'FINISH_FINISH', INDETERMINATE) -userdefined = express_getattr(IfcSequenceEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSequenceEnum, 'NOTDEFINED', INDETERMINATE) +start_start = IfcSequenceEnum.START_START +start_finish = IfcSequenceEnum.START_FINISH +finish_start = IfcSequenceEnum.FINISH_START +finish_finish = IfcSequenceEnum.FINISH_FINISH +userdefined = IfcSequenceEnum.USERDEFINED +notdefined = IfcSequenceEnum.NOTDEFINED IfcShadingDeviceTypeEnum = enum_namespace() -jalousie = express_getattr(IfcShadingDeviceTypeEnum, 'JALOUSIE', INDETERMINATE) -shutter = express_getattr(IfcShadingDeviceTypeEnum, 'SHUTTER', INDETERMINATE) -awning = express_getattr(IfcShadingDeviceTypeEnum, 'AWNING', INDETERMINATE) -userdefined = express_getattr(IfcShadingDeviceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcShadingDeviceTypeEnum, 'NOTDEFINED', INDETERMINATE) +jalousie = IfcShadingDeviceTypeEnum.JALOUSIE +shutter = IfcShadingDeviceTypeEnum.SHUTTER +awning = IfcShadingDeviceTypeEnum.AWNING +userdefined = IfcShadingDeviceTypeEnum.USERDEFINED +notdefined = IfcShadingDeviceTypeEnum.NOTDEFINED IfcSimplePropertyTemplateTypeEnum = enum_namespace() -p_singlevalue = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'P_SINGLEVALUE', INDETERMINATE) -p_enumeratedvalue = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'P_ENUMERATEDVALUE', INDETERMINATE) -p_boundedvalue = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'P_BOUNDEDVALUE', INDETERMINATE) -p_listvalue = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'P_LISTVALUE', INDETERMINATE) -p_tablevalue = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'P_TABLEVALUE', INDETERMINATE) -p_referencevalue = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'P_REFERENCEVALUE', INDETERMINATE) -q_length = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'Q_LENGTH', INDETERMINATE) -q_area = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'Q_AREA', INDETERMINATE) -q_volume = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'Q_VOLUME', INDETERMINATE) -q_count = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'Q_COUNT', INDETERMINATE) -q_weight = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'Q_WEIGHT', INDETERMINATE) -q_time = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'Q_TIME', INDETERMINATE) +p_singlevalue = IfcSimplePropertyTemplateTypeEnum.P_SINGLEVALUE +p_enumeratedvalue = IfcSimplePropertyTemplateTypeEnum.P_ENUMERATEDVALUE +p_boundedvalue = IfcSimplePropertyTemplateTypeEnum.P_BOUNDEDVALUE +p_listvalue = IfcSimplePropertyTemplateTypeEnum.P_LISTVALUE +p_tablevalue = IfcSimplePropertyTemplateTypeEnum.P_TABLEVALUE +p_referencevalue = IfcSimplePropertyTemplateTypeEnum.P_REFERENCEVALUE +q_length = IfcSimplePropertyTemplateTypeEnum.Q_LENGTH +q_area = IfcSimplePropertyTemplateTypeEnum.Q_AREA +q_volume = IfcSimplePropertyTemplateTypeEnum.Q_VOLUME +q_count = IfcSimplePropertyTemplateTypeEnum.Q_COUNT +q_weight = IfcSimplePropertyTemplateTypeEnum.Q_WEIGHT +q_time = IfcSimplePropertyTemplateTypeEnum.Q_TIME IfcSlabTypeEnum = enum_namespace() -floor = express_getattr(IfcSlabTypeEnum, 'FLOOR', INDETERMINATE) -roof = express_getattr(IfcSlabTypeEnum, 'ROOF', INDETERMINATE) -landing = express_getattr(IfcSlabTypeEnum, 'LANDING', INDETERMINATE) -baseslab = express_getattr(IfcSlabTypeEnum, 'BASESLAB', INDETERMINATE) -userdefined = express_getattr(IfcSlabTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSlabTypeEnum, 'NOTDEFINED', INDETERMINATE) +floor = IfcSlabTypeEnum.FLOOR +roof = IfcSlabTypeEnum.ROOF +landing = IfcSlabTypeEnum.LANDING +baseslab = IfcSlabTypeEnum.BASESLAB +userdefined = IfcSlabTypeEnum.USERDEFINED +notdefined = IfcSlabTypeEnum.NOTDEFINED IfcSolarDeviceTypeEnum = enum_namespace() -solarcollector = express_getattr(IfcSolarDeviceTypeEnum, 'SOLARCOLLECTOR', INDETERMINATE) -solarpanel = express_getattr(IfcSolarDeviceTypeEnum, 'SOLARPANEL', INDETERMINATE) -userdefined = express_getattr(IfcSolarDeviceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSolarDeviceTypeEnum, 'NOTDEFINED', INDETERMINATE) +solarcollector = IfcSolarDeviceTypeEnum.SOLARCOLLECTOR +solarpanel = IfcSolarDeviceTypeEnum.SOLARPANEL +userdefined = IfcSolarDeviceTypeEnum.USERDEFINED +notdefined = IfcSolarDeviceTypeEnum.NOTDEFINED IfcSpaceHeaterTypeEnum = enum_namespace() -convector = express_getattr(IfcSpaceHeaterTypeEnum, 'CONVECTOR', INDETERMINATE) -radiator = express_getattr(IfcSpaceHeaterTypeEnum, 'RADIATOR', INDETERMINATE) -userdefined = express_getattr(IfcSpaceHeaterTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSpaceHeaterTypeEnum, 'NOTDEFINED', INDETERMINATE) +convector = IfcSpaceHeaterTypeEnum.CONVECTOR +radiator = IfcSpaceHeaterTypeEnum.RADIATOR +userdefined = IfcSpaceHeaterTypeEnum.USERDEFINED +notdefined = IfcSpaceHeaterTypeEnum.NOTDEFINED IfcSpaceTypeEnum = enum_namespace() -space = express_getattr(IfcSpaceTypeEnum, 'SPACE', INDETERMINATE) -parking = express_getattr(IfcSpaceTypeEnum, 'PARKING', INDETERMINATE) -gfa = express_getattr(IfcSpaceTypeEnum, 'GFA', INDETERMINATE) -internal = express_getattr(IfcSpaceTypeEnum, 'INTERNAL', INDETERMINATE) -external = express_getattr(IfcSpaceTypeEnum, 'EXTERNAL', INDETERMINATE) -userdefined = express_getattr(IfcSpaceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSpaceTypeEnum, 'NOTDEFINED', INDETERMINATE) +space = IfcSpaceTypeEnum.SPACE +parking = IfcSpaceTypeEnum.PARKING +gfa = IfcSpaceTypeEnum.GFA +internal = IfcSpaceTypeEnum.INTERNAL +external = IfcSpaceTypeEnum.EXTERNAL +userdefined = IfcSpaceTypeEnum.USERDEFINED +notdefined = IfcSpaceTypeEnum.NOTDEFINED IfcSpatialZoneTypeEnum = enum_namespace() -construction = express_getattr(IfcSpatialZoneTypeEnum, 'CONSTRUCTION', INDETERMINATE) -firesafety = express_getattr(IfcSpatialZoneTypeEnum, 'FIRESAFETY', INDETERMINATE) -lighting = express_getattr(IfcSpatialZoneTypeEnum, 'LIGHTING', INDETERMINATE) -occupancy = express_getattr(IfcSpatialZoneTypeEnum, 'OCCUPANCY', INDETERMINATE) -security = express_getattr(IfcSpatialZoneTypeEnum, 'SECURITY', INDETERMINATE) -thermal = express_getattr(IfcSpatialZoneTypeEnum, 'THERMAL', INDETERMINATE) -transport = express_getattr(IfcSpatialZoneTypeEnum, 'TRANSPORT', INDETERMINATE) -ventilation = express_getattr(IfcSpatialZoneTypeEnum, 'VENTILATION', INDETERMINATE) -userdefined = express_getattr(IfcSpatialZoneTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSpatialZoneTypeEnum, 'NOTDEFINED', INDETERMINATE) +construction = IfcSpatialZoneTypeEnum.CONSTRUCTION +firesafety = IfcSpatialZoneTypeEnum.FIRESAFETY +lighting = IfcSpatialZoneTypeEnum.LIGHTING +occupancy = IfcSpatialZoneTypeEnum.OCCUPANCY +security = IfcSpatialZoneTypeEnum.SECURITY +thermal = IfcSpatialZoneTypeEnum.THERMAL +transport = IfcSpatialZoneTypeEnum.TRANSPORT +ventilation = IfcSpatialZoneTypeEnum.VENTILATION +userdefined = IfcSpatialZoneTypeEnum.USERDEFINED +notdefined = IfcSpatialZoneTypeEnum.NOTDEFINED IfcStackTerminalTypeEnum = enum_namespace() -birdcage = express_getattr(IfcStackTerminalTypeEnum, 'BIRDCAGE', INDETERMINATE) -cowl = express_getattr(IfcStackTerminalTypeEnum, 'COWL', INDETERMINATE) -rainwaterhopper = express_getattr(IfcStackTerminalTypeEnum, 'RAINWATERHOPPER', INDETERMINATE) -userdefined = express_getattr(IfcStackTerminalTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcStackTerminalTypeEnum, 'NOTDEFINED', INDETERMINATE) +birdcage = IfcStackTerminalTypeEnum.BIRDCAGE +cowl = IfcStackTerminalTypeEnum.COWL +rainwaterhopper = IfcStackTerminalTypeEnum.RAINWATERHOPPER +userdefined = IfcStackTerminalTypeEnum.USERDEFINED +notdefined = IfcStackTerminalTypeEnum.NOTDEFINED IfcStairFlightTypeEnum = enum_namespace() -straight = express_getattr(IfcStairFlightTypeEnum, 'STRAIGHT', INDETERMINATE) -winder = express_getattr(IfcStairFlightTypeEnum, 'WINDER', INDETERMINATE) -spiral = express_getattr(IfcStairFlightTypeEnum, 'SPIRAL', INDETERMINATE) -curved = express_getattr(IfcStairFlightTypeEnum, 'CURVED', INDETERMINATE) -freeform = express_getattr(IfcStairFlightTypeEnum, 'FREEFORM', INDETERMINATE) -userdefined = express_getattr(IfcStairFlightTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcStairFlightTypeEnum, 'NOTDEFINED', INDETERMINATE) +straight = IfcStairFlightTypeEnum.STRAIGHT +winder = IfcStairFlightTypeEnum.WINDER +spiral = IfcStairFlightTypeEnum.SPIRAL +curved = IfcStairFlightTypeEnum.CURVED +freeform = IfcStairFlightTypeEnum.FREEFORM +userdefined = IfcStairFlightTypeEnum.USERDEFINED +notdefined = IfcStairFlightTypeEnum.NOTDEFINED IfcStairTypeEnum = enum_namespace() -straight_run_stair = express_getattr(IfcStairTypeEnum, 'STRAIGHT_RUN_STAIR', INDETERMINATE) -two_straight_run_stair = express_getattr(IfcStairTypeEnum, 'TWO_STRAIGHT_RUN_STAIR', INDETERMINATE) -quarter_winding_stair = express_getattr(IfcStairTypeEnum, 'QUARTER_WINDING_STAIR', INDETERMINATE) -quarter_turn_stair = express_getattr(IfcStairTypeEnum, 'QUARTER_TURN_STAIR', INDETERMINATE) -half_winding_stair = express_getattr(IfcStairTypeEnum, 'HALF_WINDING_STAIR', INDETERMINATE) -half_turn_stair = express_getattr(IfcStairTypeEnum, 'HALF_TURN_STAIR', INDETERMINATE) -two_quarter_winding_stair = express_getattr(IfcStairTypeEnum, 'TWO_QUARTER_WINDING_STAIR', INDETERMINATE) -two_quarter_turn_stair = express_getattr(IfcStairTypeEnum, 'TWO_QUARTER_TURN_STAIR', INDETERMINATE) -three_quarter_winding_stair = express_getattr(IfcStairTypeEnum, 'THREE_QUARTER_WINDING_STAIR', INDETERMINATE) -three_quarter_turn_stair = express_getattr(IfcStairTypeEnum, 'THREE_QUARTER_TURN_STAIR', INDETERMINATE) -spiral_stair = express_getattr(IfcStairTypeEnum, 'SPIRAL_STAIR', INDETERMINATE) -double_return_stair = express_getattr(IfcStairTypeEnum, 'DOUBLE_RETURN_STAIR', INDETERMINATE) -curved_run_stair = express_getattr(IfcStairTypeEnum, 'CURVED_RUN_STAIR', INDETERMINATE) -two_curved_run_stair = express_getattr(IfcStairTypeEnum, 'TWO_CURVED_RUN_STAIR', INDETERMINATE) -userdefined = express_getattr(IfcStairTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcStairTypeEnum, 'NOTDEFINED', INDETERMINATE) +straight_run_stair = IfcStairTypeEnum.STRAIGHT_RUN_STAIR +two_straight_run_stair = IfcStairTypeEnum.TWO_STRAIGHT_RUN_STAIR +quarter_winding_stair = IfcStairTypeEnum.QUARTER_WINDING_STAIR +quarter_turn_stair = IfcStairTypeEnum.QUARTER_TURN_STAIR +half_winding_stair = IfcStairTypeEnum.HALF_WINDING_STAIR +half_turn_stair = IfcStairTypeEnum.HALF_TURN_STAIR +two_quarter_winding_stair = IfcStairTypeEnum.TWO_QUARTER_WINDING_STAIR +two_quarter_turn_stair = IfcStairTypeEnum.TWO_QUARTER_TURN_STAIR +three_quarter_winding_stair = IfcStairTypeEnum.THREE_QUARTER_WINDING_STAIR +three_quarter_turn_stair = IfcStairTypeEnum.THREE_QUARTER_TURN_STAIR +spiral_stair = IfcStairTypeEnum.SPIRAL_STAIR +double_return_stair = IfcStairTypeEnum.DOUBLE_RETURN_STAIR +curved_run_stair = IfcStairTypeEnum.CURVED_RUN_STAIR +two_curved_run_stair = IfcStairTypeEnum.TWO_CURVED_RUN_STAIR +userdefined = IfcStairTypeEnum.USERDEFINED +notdefined = IfcStairTypeEnum.NOTDEFINED IfcStateEnum = enum_namespace() -readwrite = express_getattr(IfcStateEnum, 'READWRITE', INDETERMINATE) -readonly = express_getattr(IfcStateEnum, 'READONLY', INDETERMINATE) -locked = express_getattr(IfcStateEnum, 'LOCKED', INDETERMINATE) -readwritelocked = express_getattr(IfcStateEnum, 'READWRITELOCKED', INDETERMINATE) -readonlylocked = express_getattr(IfcStateEnum, 'READONLYLOCKED', INDETERMINATE) +readwrite = IfcStateEnum.READWRITE +readonly = IfcStateEnum.READONLY +locked = IfcStateEnum.LOCKED +readwritelocked = IfcStateEnum.READWRITELOCKED +readonlylocked = IfcStateEnum.READONLYLOCKED IfcStructuralCurveActivityTypeEnum = enum_namespace() -const = express_getattr(IfcStructuralCurveActivityTypeEnum, 'CONST', INDETERMINATE) -linear = express_getattr(IfcStructuralCurveActivityTypeEnum, 'LINEAR', INDETERMINATE) -polygonal = express_getattr(IfcStructuralCurveActivityTypeEnum, 'POLYGONAL', INDETERMINATE) -equidistant = express_getattr(IfcStructuralCurveActivityTypeEnum, 'EQUIDISTANT', INDETERMINATE) -sinus = express_getattr(IfcStructuralCurveActivityTypeEnum, 'SINUS', INDETERMINATE) -parabola = express_getattr(IfcStructuralCurveActivityTypeEnum, 'PARABOLA', INDETERMINATE) -discrete = express_getattr(IfcStructuralCurveActivityTypeEnum, 'DISCRETE', INDETERMINATE) -userdefined = express_getattr(IfcStructuralCurveActivityTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcStructuralCurveActivityTypeEnum, 'NOTDEFINED', INDETERMINATE) +const = IfcStructuralCurveActivityTypeEnum.CONST +linear = IfcStructuralCurveActivityTypeEnum.LINEAR +polygonal = IfcStructuralCurveActivityTypeEnum.POLYGONAL +equidistant = IfcStructuralCurveActivityTypeEnum.EQUIDISTANT +sinus = IfcStructuralCurveActivityTypeEnum.SINUS +parabola = IfcStructuralCurveActivityTypeEnum.PARABOLA +discrete = IfcStructuralCurveActivityTypeEnum.DISCRETE +userdefined = IfcStructuralCurveActivityTypeEnum.USERDEFINED +notdefined = IfcStructuralCurveActivityTypeEnum.NOTDEFINED IfcStructuralCurveMemberTypeEnum = enum_namespace() -rigid_joined_member = express_getattr(IfcStructuralCurveMemberTypeEnum, 'RIGID_JOINED_MEMBER', INDETERMINATE) -pin_joined_member = express_getattr(IfcStructuralCurveMemberTypeEnum, 'PIN_JOINED_MEMBER', INDETERMINATE) -cable = express_getattr(IfcStructuralCurveMemberTypeEnum, 'CABLE', INDETERMINATE) -tension_member = express_getattr(IfcStructuralCurveMemberTypeEnum, 'TENSION_MEMBER', INDETERMINATE) -compression_member = express_getattr(IfcStructuralCurveMemberTypeEnum, 'COMPRESSION_MEMBER', INDETERMINATE) -userdefined = express_getattr(IfcStructuralCurveMemberTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcStructuralCurveMemberTypeEnum, 'NOTDEFINED', INDETERMINATE) +rigid_joined_member = IfcStructuralCurveMemberTypeEnum.RIGID_JOINED_MEMBER +pin_joined_member = IfcStructuralCurveMemberTypeEnum.PIN_JOINED_MEMBER +cable = IfcStructuralCurveMemberTypeEnum.CABLE +tension_member = IfcStructuralCurveMemberTypeEnum.TENSION_MEMBER +compression_member = IfcStructuralCurveMemberTypeEnum.COMPRESSION_MEMBER +userdefined = IfcStructuralCurveMemberTypeEnum.USERDEFINED +notdefined = IfcStructuralCurveMemberTypeEnum.NOTDEFINED IfcStructuralSurfaceActivityTypeEnum = enum_namespace() -const = express_getattr(IfcStructuralSurfaceActivityTypeEnum, 'CONST', INDETERMINATE) -bilinear = express_getattr(IfcStructuralSurfaceActivityTypeEnum, 'BILINEAR', INDETERMINATE) -discrete = express_getattr(IfcStructuralSurfaceActivityTypeEnum, 'DISCRETE', INDETERMINATE) -isocontour = express_getattr(IfcStructuralSurfaceActivityTypeEnum, 'ISOCONTOUR', INDETERMINATE) -userdefined = express_getattr(IfcStructuralSurfaceActivityTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcStructuralSurfaceActivityTypeEnum, 'NOTDEFINED', INDETERMINATE) +const = IfcStructuralSurfaceActivityTypeEnum.CONST +bilinear = IfcStructuralSurfaceActivityTypeEnum.BILINEAR +discrete = IfcStructuralSurfaceActivityTypeEnum.DISCRETE +isocontour = IfcStructuralSurfaceActivityTypeEnum.ISOCONTOUR +userdefined = IfcStructuralSurfaceActivityTypeEnum.USERDEFINED +notdefined = IfcStructuralSurfaceActivityTypeEnum.NOTDEFINED IfcStructuralSurfaceMemberTypeEnum = enum_namespace() -bending_element = express_getattr(IfcStructuralSurfaceMemberTypeEnum, 'BENDING_ELEMENT', INDETERMINATE) -membrane_element = express_getattr(IfcStructuralSurfaceMemberTypeEnum, 'MEMBRANE_ELEMENT', INDETERMINATE) -shell = express_getattr(IfcStructuralSurfaceMemberTypeEnum, 'SHELL', INDETERMINATE) -userdefined = express_getattr(IfcStructuralSurfaceMemberTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcStructuralSurfaceMemberTypeEnum, 'NOTDEFINED', INDETERMINATE) +bending_element = IfcStructuralSurfaceMemberTypeEnum.BENDING_ELEMENT +membrane_element = IfcStructuralSurfaceMemberTypeEnum.MEMBRANE_ELEMENT +shell = IfcStructuralSurfaceMemberTypeEnum.SHELL +userdefined = IfcStructuralSurfaceMemberTypeEnum.USERDEFINED +notdefined = IfcStructuralSurfaceMemberTypeEnum.NOTDEFINED IfcSubContractResourceTypeEnum = enum_namespace() -purchase = express_getattr(IfcSubContractResourceTypeEnum, 'PURCHASE', INDETERMINATE) -work = express_getattr(IfcSubContractResourceTypeEnum, 'WORK', INDETERMINATE) -userdefined = express_getattr(IfcSubContractResourceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSubContractResourceTypeEnum, 'NOTDEFINED', INDETERMINATE) +purchase = IfcSubContractResourceTypeEnum.PURCHASE +work = IfcSubContractResourceTypeEnum.WORK +userdefined = IfcSubContractResourceTypeEnum.USERDEFINED +notdefined = IfcSubContractResourceTypeEnum.NOTDEFINED IfcSurfaceFeatureTypeEnum = enum_namespace() -mark = express_getattr(IfcSurfaceFeatureTypeEnum, 'MARK', INDETERMINATE) -tag = express_getattr(IfcSurfaceFeatureTypeEnum, 'TAG', INDETERMINATE) -treatment = express_getattr(IfcSurfaceFeatureTypeEnum, 'TREATMENT', INDETERMINATE) -userdefined = express_getattr(IfcSurfaceFeatureTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSurfaceFeatureTypeEnum, 'NOTDEFINED', INDETERMINATE) +mark = IfcSurfaceFeatureTypeEnum.MARK +tag = IfcSurfaceFeatureTypeEnum.TAG +treatment = IfcSurfaceFeatureTypeEnum.TREATMENT +userdefined = IfcSurfaceFeatureTypeEnum.USERDEFINED +notdefined = IfcSurfaceFeatureTypeEnum.NOTDEFINED IfcSurfaceSide = enum_namespace() -positive = express_getattr(IfcSurfaceSide, 'POSITIVE', INDETERMINATE) -negative = express_getattr(IfcSurfaceSide, 'NEGATIVE', INDETERMINATE) -both = express_getattr(IfcSurfaceSide, 'BOTH', INDETERMINATE) +positive = IfcSurfaceSide.POSITIVE +negative = IfcSurfaceSide.NEGATIVE +both = IfcSurfaceSide.BOTH IfcSwitchingDeviceTypeEnum = enum_namespace() -contactor = express_getattr(IfcSwitchingDeviceTypeEnum, 'CONTACTOR', INDETERMINATE) -dimmerswitch = express_getattr(IfcSwitchingDeviceTypeEnum, 'DIMMERSWITCH', INDETERMINATE) -emergencystop = express_getattr(IfcSwitchingDeviceTypeEnum, 'EMERGENCYSTOP', INDETERMINATE) -keypad = express_getattr(IfcSwitchingDeviceTypeEnum, 'KEYPAD', INDETERMINATE) -momentaryswitch = express_getattr(IfcSwitchingDeviceTypeEnum, 'MOMENTARYSWITCH', INDETERMINATE) -selectorswitch = express_getattr(IfcSwitchingDeviceTypeEnum, 'SELECTORSWITCH', INDETERMINATE) -starter = express_getattr(IfcSwitchingDeviceTypeEnum, 'STARTER', INDETERMINATE) -switchdisconnector = express_getattr(IfcSwitchingDeviceTypeEnum, 'SWITCHDISCONNECTOR', INDETERMINATE) -toggleswitch = express_getattr(IfcSwitchingDeviceTypeEnum, 'TOGGLESWITCH', INDETERMINATE) -userdefined = express_getattr(IfcSwitchingDeviceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSwitchingDeviceTypeEnum, 'NOTDEFINED', INDETERMINATE) +contactor = IfcSwitchingDeviceTypeEnum.CONTACTOR +dimmerswitch = IfcSwitchingDeviceTypeEnum.DIMMERSWITCH +emergencystop = IfcSwitchingDeviceTypeEnum.EMERGENCYSTOP +keypad = IfcSwitchingDeviceTypeEnum.KEYPAD +momentaryswitch = IfcSwitchingDeviceTypeEnum.MOMENTARYSWITCH +selectorswitch = IfcSwitchingDeviceTypeEnum.SELECTORSWITCH +starter = IfcSwitchingDeviceTypeEnum.STARTER +switchdisconnector = IfcSwitchingDeviceTypeEnum.SWITCHDISCONNECTOR +toggleswitch = IfcSwitchingDeviceTypeEnum.TOGGLESWITCH +userdefined = IfcSwitchingDeviceTypeEnum.USERDEFINED +notdefined = IfcSwitchingDeviceTypeEnum.NOTDEFINED IfcSystemFurnitureElementTypeEnum = enum_namespace() -panel = express_getattr(IfcSystemFurnitureElementTypeEnum, 'PANEL', INDETERMINATE) -worksurface = express_getattr(IfcSystemFurnitureElementTypeEnum, 'WORKSURFACE', INDETERMINATE) -userdefined = express_getattr(IfcSystemFurnitureElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSystemFurnitureElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +panel = IfcSystemFurnitureElementTypeEnum.PANEL +worksurface = IfcSystemFurnitureElementTypeEnum.WORKSURFACE +userdefined = IfcSystemFurnitureElementTypeEnum.USERDEFINED +notdefined = IfcSystemFurnitureElementTypeEnum.NOTDEFINED IfcTankTypeEnum = enum_namespace() -basin = express_getattr(IfcTankTypeEnum, 'BASIN', INDETERMINATE) -breakpressure = express_getattr(IfcTankTypeEnum, 'BREAKPRESSURE', INDETERMINATE) -expansion = express_getattr(IfcTankTypeEnum, 'EXPANSION', INDETERMINATE) -feedandexpansion = express_getattr(IfcTankTypeEnum, 'FEEDANDEXPANSION', INDETERMINATE) -pressurevessel = express_getattr(IfcTankTypeEnum, 'PRESSUREVESSEL', INDETERMINATE) -storage = express_getattr(IfcTankTypeEnum, 'STORAGE', INDETERMINATE) -vessel = express_getattr(IfcTankTypeEnum, 'VESSEL', INDETERMINATE) -userdefined = express_getattr(IfcTankTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTankTypeEnum, 'NOTDEFINED', INDETERMINATE) +basin = IfcTankTypeEnum.BASIN +breakpressure = IfcTankTypeEnum.BREAKPRESSURE +expansion = IfcTankTypeEnum.EXPANSION +feedandexpansion = IfcTankTypeEnum.FEEDANDEXPANSION +pressurevessel = IfcTankTypeEnum.PRESSUREVESSEL +storage = IfcTankTypeEnum.STORAGE +vessel = IfcTankTypeEnum.VESSEL +userdefined = IfcTankTypeEnum.USERDEFINED +notdefined = IfcTankTypeEnum.NOTDEFINED IfcTaskDurationEnum = enum_namespace() -elapsedtime = express_getattr(IfcTaskDurationEnum, 'ELAPSEDTIME', INDETERMINATE) -worktime = express_getattr(IfcTaskDurationEnum, 'WORKTIME', INDETERMINATE) -notdefined = express_getattr(IfcTaskDurationEnum, 'NOTDEFINED', INDETERMINATE) +elapsedtime = IfcTaskDurationEnum.ELAPSEDTIME +worktime = IfcTaskDurationEnum.WORKTIME +notdefined = IfcTaskDurationEnum.NOTDEFINED IfcTaskTypeEnum = enum_namespace() -attendance = express_getattr(IfcTaskTypeEnum, 'ATTENDANCE', INDETERMINATE) -construction = express_getattr(IfcTaskTypeEnum, 'CONSTRUCTION', INDETERMINATE) -demolition = express_getattr(IfcTaskTypeEnum, 'DEMOLITION', INDETERMINATE) -dismantle = express_getattr(IfcTaskTypeEnum, 'DISMANTLE', INDETERMINATE) -disposal = express_getattr(IfcTaskTypeEnum, 'DISPOSAL', INDETERMINATE) -installation = express_getattr(IfcTaskTypeEnum, 'INSTALLATION', INDETERMINATE) -logistic = express_getattr(IfcTaskTypeEnum, 'LOGISTIC', INDETERMINATE) -maintenance = express_getattr(IfcTaskTypeEnum, 'MAINTENANCE', INDETERMINATE) -move = express_getattr(IfcTaskTypeEnum, 'MOVE', INDETERMINATE) -operation = express_getattr(IfcTaskTypeEnum, 'OPERATION', INDETERMINATE) -removal = express_getattr(IfcTaskTypeEnum, 'REMOVAL', INDETERMINATE) -renovation = express_getattr(IfcTaskTypeEnum, 'RENOVATION', INDETERMINATE) -userdefined = express_getattr(IfcTaskTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTaskTypeEnum, 'NOTDEFINED', INDETERMINATE) +attendance = IfcTaskTypeEnum.ATTENDANCE +construction = IfcTaskTypeEnum.CONSTRUCTION +demolition = IfcTaskTypeEnum.DEMOLITION +dismantle = IfcTaskTypeEnum.DISMANTLE +disposal = IfcTaskTypeEnum.DISPOSAL +installation = IfcTaskTypeEnum.INSTALLATION +logistic = IfcTaskTypeEnum.LOGISTIC +maintenance = IfcTaskTypeEnum.MAINTENANCE +move = IfcTaskTypeEnum.MOVE +operation = IfcTaskTypeEnum.OPERATION +removal = IfcTaskTypeEnum.REMOVAL +renovation = IfcTaskTypeEnum.RENOVATION +userdefined = IfcTaskTypeEnum.USERDEFINED +notdefined = IfcTaskTypeEnum.NOTDEFINED IfcTendonAnchorTypeEnum = enum_namespace() -coupler = express_getattr(IfcTendonAnchorTypeEnum, 'COUPLER', INDETERMINATE) -fixed_end = express_getattr(IfcTendonAnchorTypeEnum, 'FIXED_END', INDETERMINATE) -tensioning_end = express_getattr(IfcTendonAnchorTypeEnum, 'TENSIONING_END', INDETERMINATE) -userdefined = express_getattr(IfcTendonAnchorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTendonAnchorTypeEnum, 'NOTDEFINED', INDETERMINATE) +coupler = IfcTendonAnchorTypeEnum.COUPLER +fixed_end = IfcTendonAnchorTypeEnum.FIXED_END +tensioning_end = IfcTendonAnchorTypeEnum.TENSIONING_END +userdefined = IfcTendonAnchorTypeEnum.USERDEFINED +notdefined = IfcTendonAnchorTypeEnum.NOTDEFINED IfcTendonTypeEnum = enum_namespace() -bar = express_getattr(IfcTendonTypeEnum, 'BAR', INDETERMINATE) -coated = express_getattr(IfcTendonTypeEnum, 'COATED', INDETERMINATE) -strand = express_getattr(IfcTendonTypeEnum, 'STRAND', INDETERMINATE) -wire = express_getattr(IfcTendonTypeEnum, 'WIRE', INDETERMINATE) -userdefined = express_getattr(IfcTendonTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTendonTypeEnum, 'NOTDEFINED', INDETERMINATE) +bar = IfcTendonTypeEnum.BAR +coated = IfcTendonTypeEnum.COATED +strand = IfcTendonTypeEnum.STRAND +wire = IfcTendonTypeEnum.WIRE +userdefined = IfcTendonTypeEnum.USERDEFINED +notdefined = IfcTendonTypeEnum.NOTDEFINED IfcTextPath = enum_namespace() -left = express_getattr(IfcTextPath, 'LEFT', INDETERMINATE) -right = express_getattr(IfcTextPath, 'RIGHT', INDETERMINATE) -up = express_getattr(IfcTextPath, 'UP', INDETERMINATE) -down = express_getattr(IfcTextPath, 'DOWN', INDETERMINATE) +left = IfcTextPath.LEFT +right = IfcTextPath.RIGHT +up = IfcTextPath.UP +down = IfcTextPath.DOWN IfcTimeSeriesDataTypeEnum = enum_namespace() -continuous = express_getattr(IfcTimeSeriesDataTypeEnum, 'CONTINUOUS', INDETERMINATE) -discrete = express_getattr(IfcTimeSeriesDataTypeEnum, 'DISCRETE', INDETERMINATE) -discretebinary = express_getattr(IfcTimeSeriesDataTypeEnum, 'DISCRETEBINARY', INDETERMINATE) -piecewisebinary = express_getattr(IfcTimeSeriesDataTypeEnum, 'PIECEWISEBINARY', INDETERMINATE) -piecewiseconstant = express_getattr(IfcTimeSeriesDataTypeEnum, 'PIECEWISECONSTANT', INDETERMINATE) -piecewisecontinuous = express_getattr(IfcTimeSeriesDataTypeEnum, 'PIECEWISECONTINUOUS', INDETERMINATE) -notdefined = express_getattr(IfcTimeSeriesDataTypeEnum, 'NOTDEFINED', INDETERMINATE) +continuous = IfcTimeSeriesDataTypeEnum.CONTINUOUS +discrete = IfcTimeSeriesDataTypeEnum.DISCRETE +discretebinary = IfcTimeSeriesDataTypeEnum.DISCRETEBINARY +piecewisebinary = IfcTimeSeriesDataTypeEnum.PIECEWISEBINARY +piecewiseconstant = IfcTimeSeriesDataTypeEnum.PIECEWISECONSTANT +piecewisecontinuous = IfcTimeSeriesDataTypeEnum.PIECEWISECONTINUOUS +notdefined = IfcTimeSeriesDataTypeEnum.NOTDEFINED IfcTransformerTypeEnum = enum_namespace() -current = express_getattr(IfcTransformerTypeEnum, 'CURRENT', INDETERMINATE) -frequency = express_getattr(IfcTransformerTypeEnum, 'FREQUENCY', INDETERMINATE) -inverter = express_getattr(IfcTransformerTypeEnum, 'INVERTER', INDETERMINATE) -rectifier = express_getattr(IfcTransformerTypeEnum, 'RECTIFIER', INDETERMINATE) -voltage = express_getattr(IfcTransformerTypeEnum, 'VOLTAGE', INDETERMINATE) -userdefined = express_getattr(IfcTransformerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTransformerTypeEnum, 'NOTDEFINED', INDETERMINATE) +current = IfcTransformerTypeEnum.CURRENT +frequency = IfcTransformerTypeEnum.FREQUENCY +inverter = IfcTransformerTypeEnum.INVERTER +rectifier = IfcTransformerTypeEnum.RECTIFIER +voltage = IfcTransformerTypeEnum.VOLTAGE +userdefined = IfcTransformerTypeEnum.USERDEFINED +notdefined = IfcTransformerTypeEnum.NOTDEFINED IfcTransitionCode = enum_namespace() -discontinuous = express_getattr(IfcTransitionCode, 'DISCONTINUOUS', INDETERMINATE) -continuous = express_getattr(IfcTransitionCode, 'CONTINUOUS', INDETERMINATE) -contsamegradient = express_getattr(IfcTransitionCode, 'CONTSAMEGRADIENT', INDETERMINATE) -contsamegradientsamecurvature = express_getattr(IfcTransitionCode, 'CONTSAMEGRADIENTSAMECURVATURE', INDETERMINATE) +discontinuous = IfcTransitionCode.DISCONTINUOUS +continuous = IfcTransitionCode.CONTINUOUS +contsamegradient = IfcTransitionCode.CONTSAMEGRADIENT +contsamegradientsamecurvature = IfcTransitionCode.CONTSAMEGRADIENTSAMECURVATURE IfcTransitionCurveType = enum_namespace() -biquadraticparabola = express_getattr(IfcTransitionCurveType, 'BIQUADRATICPARABOLA', INDETERMINATE) -blosscurve = express_getattr(IfcTransitionCurveType, 'BLOSSCURVE', INDETERMINATE) -clothoidcurve = express_getattr(IfcTransitionCurveType, 'CLOTHOIDCURVE', INDETERMINATE) -cosinecurve = express_getattr(IfcTransitionCurveType, 'COSINECURVE', INDETERMINATE) -cubicparabola = express_getattr(IfcTransitionCurveType, 'CUBICPARABOLA', INDETERMINATE) -sinecurve = express_getattr(IfcTransitionCurveType, 'SINECURVE', INDETERMINATE) +biquadraticparabola = IfcTransitionCurveType.BIQUADRATICPARABOLA +blosscurve = IfcTransitionCurveType.BLOSSCURVE +clothoidcurve = IfcTransitionCurveType.CLOTHOIDCURVE +cosinecurve = IfcTransitionCurveType.COSINECURVE +cubicparabola = IfcTransitionCurveType.CUBICPARABOLA +sinecurve = IfcTransitionCurveType.SINECURVE IfcTransportElementTypeEnum = enum_namespace() -elevator = express_getattr(IfcTransportElementTypeEnum, 'ELEVATOR', INDETERMINATE) -escalator = express_getattr(IfcTransportElementTypeEnum, 'ESCALATOR', INDETERMINATE) -movingwalkway = express_getattr(IfcTransportElementTypeEnum, 'MOVINGWALKWAY', INDETERMINATE) -craneway = express_getattr(IfcTransportElementTypeEnum, 'CRANEWAY', INDETERMINATE) -liftinggear = express_getattr(IfcTransportElementTypeEnum, 'LIFTINGGEAR', INDETERMINATE) -userdefined = express_getattr(IfcTransportElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTransportElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +elevator = IfcTransportElementTypeEnum.ELEVATOR +escalator = IfcTransportElementTypeEnum.ESCALATOR +movingwalkway = IfcTransportElementTypeEnum.MOVINGWALKWAY +craneway = IfcTransportElementTypeEnum.CRANEWAY +liftinggear = IfcTransportElementTypeEnum.LIFTINGGEAR +userdefined = IfcTransportElementTypeEnum.USERDEFINED +notdefined = IfcTransportElementTypeEnum.NOTDEFINED IfcTrimmingPreference = enum_namespace() -cartesian = express_getattr(IfcTrimmingPreference, 'CARTESIAN', INDETERMINATE) -parameter = express_getattr(IfcTrimmingPreference, 'PARAMETER', INDETERMINATE) -unspecified = express_getattr(IfcTrimmingPreference, 'UNSPECIFIED', INDETERMINATE) +cartesian = IfcTrimmingPreference.CARTESIAN +parameter = IfcTrimmingPreference.PARAMETER +unspecified = IfcTrimmingPreference.UNSPECIFIED IfcTubeBundleTypeEnum = enum_namespace() -finned = express_getattr(IfcTubeBundleTypeEnum, 'FINNED', INDETERMINATE) -userdefined = express_getattr(IfcTubeBundleTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTubeBundleTypeEnum, 'NOTDEFINED', INDETERMINATE) +finned = IfcTubeBundleTypeEnum.FINNED +userdefined = IfcTubeBundleTypeEnum.USERDEFINED +notdefined = IfcTubeBundleTypeEnum.NOTDEFINED IfcUnitEnum = enum_namespace() -absorbeddoseunit = express_getattr(IfcUnitEnum, 'ABSORBEDDOSEUNIT', INDETERMINATE) -amountofsubstanceunit = express_getattr(IfcUnitEnum, 'AMOUNTOFSUBSTANCEUNIT', INDETERMINATE) -areaunit = express_getattr(IfcUnitEnum, 'AREAUNIT', INDETERMINATE) -doseequivalentunit = express_getattr(IfcUnitEnum, 'DOSEEQUIVALENTUNIT', INDETERMINATE) -electriccapacitanceunit = express_getattr(IfcUnitEnum, 'ELECTRICCAPACITANCEUNIT', INDETERMINATE) -electricchargeunit = express_getattr(IfcUnitEnum, 'ELECTRICCHARGEUNIT', INDETERMINATE) -electricconductanceunit = express_getattr(IfcUnitEnum, 'ELECTRICCONDUCTANCEUNIT', INDETERMINATE) -electriccurrentunit = express_getattr(IfcUnitEnum, 'ELECTRICCURRENTUNIT', INDETERMINATE) -electricresistanceunit = express_getattr(IfcUnitEnum, 'ELECTRICRESISTANCEUNIT', INDETERMINATE) -electricvoltageunit = express_getattr(IfcUnitEnum, 'ELECTRICVOLTAGEUNIT', INDETERMINATE) -energyunit = express_getattr(IfcUnitEnum, 'ENERGYUNIT', INDETERMINATE) -forceunit = express_getattr(IfcUnitEnum, 'FORCEUNIT', INDETERMINATE) -frequencyunit = express_getattr(IfcUnitEnum, 'FREQUENCYUNIT', INDETERMINATE) -illuminanceunit = express_getattr(IfcUnitEnum, 'ILLUMINANCEUNIT', INDETERMINATE) -inductanceunit = express_getattr(IfcUnitEnum, 'INDUCTANCEUNIT', INDETERMINATE) -lengthunit = express_getattr(IfcUnitEnum, 'LENGTHUNIT', INDETERMINATE) -luminousfluxunit = express_getattr(IfcUnitEnum, 'LUMINOUSFLUXUNIT', INDETERMINATE) -luminousintensityunit = express_getattr(IfcUnitEnum, 'LUMINOUSINTENSITYUNIT', INDETERMINATE) -magneticfluxdensityunit = express_getattr(IfcUnitEnum, 'MAGNETICFLUXDENSITYUNIT', INDETERMINATE) -magneticfluxunit = express_getattr(IfcUnitEnum, 'MAGNETICFLUXUNIT', INDETERMINATE) -massunit = express_getattr(IfcUnitEnum, 'MASSUNIT', INDETERMINATE) -planeangleunit = express_getattr(IfcUnitEnum, 'PLANEANGLEUNIT', INDETERMINATE) -powerunit = express_getattr(IfcUnitEnum, 'POWERUNIT', INDETERMINATE) -pressureunit = express_getattr(IfcUnitEnum, 'PRESSUREUNIT', INDETERMINATE) -radioactivityunit = express_getattr(IfcUnitEnum, 'RADIOACTIVITYUNIT', INDETERMINATE) -solidangleunit = express_getattr(IfcUnitEnum, 'SOLIDANGLEUNIT', INDETERMINATE) -thermodynamictemperatureunit = express_getattr(IfcUnitEnum, 'THERMODYNAMICTEMPERATUREUNIT', INDETERMINATE) -timeunit = express_getattr(IfcUnitEnum, 'TIMEUNIT', INDETERMINATE) -volumeunit = express_getattr(IfcUnitEnum, 'VOLUMEUNIT', INDETERMINATE) -userdefined = express_getattr(IfcUnitEnum, 'USERDEFINED', INDETERMINATE) +absorbeddoseunit = IfcUnitEnum.ABSORBEDDOSEUNIT +amountofsubstanceunit = IfcUnitEnum.AMOUNTOFSUBSTANCEUNIT +areaunit = IfcUnitEnum.AREAUNIT +doseequivalentunit = IfcUnitEnum.DOSEEQUIVALENTUNIT +electriccapacitanceunit = IfcUnitEnum.ELECTRICCAPACITANCEUNIT +electricchargeunit = IfcUnitEnum.ELECTRICCHARGEUNIT +electricconductanceunit = IfcUnitEnum.ELECTRICCONDUCTANCEUNIT +electriccurrentunit = IfcUnitEnum.ELECTRICCURRENTUNIT +electricresistanceunit = IfcUnitEnum.ELECTRICRESISTANCEUNIT +electricvoltageunit = IfcUnitEnum.ELECTRICVOLTAGEUNIT +energyunit = IfcUnitEnum.ENERGYUNIT +forceunit = IfcUnitEnum.FORCEUNIT +frequencyunit = IfcUnitEnum.FREQUENCYUNIT +illuminanceunit = IfcUnitEnum.ILLUMINANCEUNIT +inductanceunit = IfcUnitEnum.INDUCTANCEUNIT +lengthunit = IfcUnitEnum.LENGTHUNIT +luminousfluxunit = IfcUnitEnum.LUMINOUSFLUXUNIT +luminousintensityunit = IfcUnitEnum.LUMINOUSINTENSITYUNIT +magneticfluxdensityunit = IfcUnitEnum.MAGNETICFLUXDENSITYUNIT +magneticfluxunit = IfcUnitEnum.MAGNETICFLUXUNIT +massunit = IfcUnitEnum.MASSUNIT +planeangleunit = IfcUnitEnum.PLANEANGLEUNIT +powerunit = IfcUnitEnum.POWERUNIT +pressureunit = IfcUnitEnum.PRESSUREUNIT +radioactivityunit = IfcUnitEnum.RADIOACTIVITYUNIT +solidangleunit = IfcUnitEnum.SOLIDANGLEUNIT +thermodynamictemperatureunit = IfcUnitEnum.THERMODYNAMICTEMPERATUREUNIT +timeunit = IfcUnitEnum.TIMEUNIT +volumeunit = IfcUnitEnum.VOLUMEUNIT +userdefined = IfcUnitEnum.USERDEFINED IfcUnitaryControlElementTypeEnum = enum_namespace() -alarmpanel = express_getattr(IfcUnitaryControlElementTypeEnum, 'ALARMPANEL', INDETERMINATE) -controlpanel = express_getattr(IfcUnitaryControlElementTypeEnum, 'CONTROLPANEL', INDETERMINATE) -gasdetectionpanel = express_getattr(IfcUnitaryControlElementTypeEnum, 'GASDETECTIONPANEL', INDETERMINATE) -indicatorpanel = express_getattr(IfcUnitaryControlElementTypeEnum, 'INDICATORPANEL', INDETERMINATE) -mimicpanel = express_getattr(IfcUnitaryControlElementTypeEnum, 'MIMICPANEL', INDETERMINATE) -humidistat = express_getattr(IfcUnitaryControlElementTypeEnum, 'HUMIDISTAT', INDETERMINATE) -thermostat = express_getattr(IfcUnitaryControlElementTypeEnum, 'THERMOSTAT', INDETERMINATE) -weatherstation = express_getattr(IfcUnitaryControlElementTypeEnum, 'WEATHERSTATION', INDETERMINATE) -userdefined = express_getattr(IfcUnitaryControlElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcUnitaryControlElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +alarmpanel = IfcUnitaryControlElementTypeEnum.ALARMPANEL +controlpanel = IfcUnitaryControlElementTypeEnum.CONTROLPANEL +gasdetectionpanel = IfcUnitaryControlElementTypeEnum.GASDETECTIONPANEL +indicatorpanel = IfcUnitaryControlElementTypeEnum.INDICATORPANEL +mimicpanel = IfcUnitaryControlElementTypeEnum.MIMICPANEL +humidistat = IfcUnitaryControlElementTypeEnum.HUMIDISTAT +thermostat = IfcUnitaryControlElementTypeEnum.THERMOSTAT +weatherstation = IfcUnitaryControlElementTypeEnum.WEATHERSTATION +userdefined = IfcUnitaryControlElementTypeEnum.USERDEFINED +notdefined = IfcUnitaryControlElementTypeEnum.NOTDEFINED IfcUnitaryEquipmentTypeEnum = enum_namespace() -airhandler = express_getattr(IfcUnitaryEquipmentTypeEnum, 'AIRHANDLER', INDETERMINATE) -airconditioningunit = express_getattr(IfcUnitaryEquipmentTypeEnum, 'AIRCONDITIONINGUNIT', INDETERMINATE) -dehumidifier = express_getattr(IfcUnitaryEquipmentTypeEnum, 'DEHUMIDIFIER', INDETERMINATE) -splitsystem = express_getattr(IfcUnitaryEquipmentTypeEnum, 'SPLITSYSTEM', INDETERMINATE) -rooftopunit = express_getattr(IfcUnitaryEquipmentTypeEnum, 'ROOFTOPUNIT', INDETERMINATE) -userdefined = express_getattr(IfcUnitaryEquipmentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcUnitaryEquipmentTypeEnum, 'NOTDEFINED', INDETERMINATE) +airhandler = IfcUnitaryEquipmentTypeEnum.AIRHANDLER +airconditioningunit = IfcUnitaryEquipmentTypeEnum.AIRCONDITIONINGUNIT +dehumidifier = IfcUnitaryEquipmentTypeEnum.DEHUMIDIFIER +splitsystem = IfcUnitaryEquipmentTypeEnum.SPLITSYSTEM +rooftopunit = IfcUnitaryEquipmentTypeEnum.ROOFTOPUNIT +userdefined = IfcUnitaryEquipmentTypeEnum.USERDEFINED +notdefined = IfcUnitaryEquipmentTypeEnum.NOTDEFINED IfcValveTypeEnum = enum_namespace() -airrelease = express_getattr(IfcValveTypeEnum, 'AIRRELEASE', INDETERMINATE) -antivacuum = express_getattr(IfcValveTypeEnum, 'ANTIVACUUM', INDETERMINATE) -changeover = express_getattr(IfcValveTypeEnum, 'CHANGEOVER', INDETERMINATE) -check = express_getattr(IfcValveTypeEnum, 'CHECK', INDETERMINATE) -commissioning = express_getattr(IfcValveTypeEnum, 'COMMISSIONING', INDETERMINATE) -diverting = express_getattr(IfcValveTypeEnum, 'DIVERTING', INDETERMINATE) -drawoffcock = express_getattr(IfcValveTypeEnum, 'DRAWOFFCOCK', INDETERMINATE) -doublecheck = express_getattr(IfcValveTypeEnum, 'DOUBLECHECK', INDETERMINATE) -doubleregulating = express_getattr(IfcValveTypeEnum, 'DOUBLEREGULATING', INDETERMINATE) -faucet = express_getattr(IfcValveTypeEnum, 'FAUCET', INDETERMINATE) -flushing = express_getattr(IfcValveTypeEnum, 'FLUSHING', INDETERMINATE) -gascock = express_getattr(IfcValveTypeEnum, 'GASCOCK', INDETERMINATE) -gastap = express_getattr(IfcValveTypeEnum, 'GASTAP', INDETERMINATE) -isolating = express_getattr(IfcValveTypeEnum, 'ISOLATING', INDETERMINATE) -mixing = express_getattr(IfcValveTypeEnum, 'MIXING', INDETERMINATE) -pressurereducing = express_getattr(IfcValveTypeEnum, 'PRESSUREREDUCING', INDETERMINATE) -pressurerelief = express_getattr(IfcValveTypeEnum, 'PRESSURERELIEF', INDETERMINATE) -regulating = express_getattr(IfcValveTypeEnum, 'REGULATING', INDETERMINATE) -safetycutoff = express_getattr(IfcValveTypeEnum, 'SAFETYCUTOFF', INDETERMINATE) -steamtrap = express_getattr(IfcValveTypeEnum, 'STEAMTRAP', INDETERMINATE) -stopcock = express_getattr(IfcValveTypeEnum, 'STOPCOCK', INDETERMINATE) -userdefined = express_getattr(IfcValveTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcValveTypeEnum, 'NOTDEFINED', INDETERMINATE) +airrelease = IfcValveTypeEnum.AIRRELEASE +antivacuum = IfcValveTypeEnum.ANTIVACUUM +changeover = IfcValveTypeEnum.CHANGEOVER +check = IfcValveTypeEnum.CHECK +commissioning = IfcValveTypeEnum.COMMISSIONING +diverting = IfcValveTypeEnum.DIVERTING +drawoffcock = IfcValveTypeEnum.DRAWOFFCOCK +doublecheck = IfcValveTypeEnum.DOUBLECHECK +doubleregulating = IfcValveTypeEnum.DOUBLEREGULATING +faucet = IfcValveTypeEnum.FAUCET +flushing = IfcValveTypeEnum.FLUSHING +gascock = IfcValveTypeEnum.GASCOCK +gastap = IfcValveTypeEnum.GASTAP +isolating = IfcValveTypeEnum.ISOLATING +mixing = IfcValveTypeEnum.MIXING +pressurereducing = IfcValveTypeEnum.PRESSUREREDUCING +pressurerelief = IfcValveTypeEnum.PRESSURERELIEF +regulating = IfcValveTypeEnum.REGULATING +safetycutoff = IfcValveTypeEnum.SAFETYCUTOFF +steamtrap = IfcValveTypeEnum.STEAMTRAP +stopcock = IfcValveTypeEnum.STOPCOCK +userdefined = IfcValveTypeEnum.USERDEFINED +notdefined = IfcValveTypeEnum.NOTDEFINED IfcVibrationIsolatorTypeEnum = enum_namespace() -compression = express_getattr(IfcVibrationIsolatorTypeEnum, 'COMPRESSION', INDETERMINATE) -spring = express_getattr(IfcVibrationIsolatorTypeEnum, 'SPRING', INDETERMINATE) -userdefined = express_getattr(IfcVibrationIsolatorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcVibrationIsolatorTypeEnum, 'NOTDEFINED', INDETERMINATE) +compression = IfcVibrationIsolatorTypeEnum.COMPRESSION +spring = IfcVibrationIsolatorTypeEnum.SPRING +userdefined = IfcVibrationIsolatorTypeEnum.USERDEFINED +notdefined = IfcVibrationIsolatorTypeEnum.NOTDEFINED IfcVoidingFeatureTypeEnum = enum_namespace() -cutout = express_getattr(IfcVoidingFeatureTypeEnum, 'CUTOUT', INDETERMINATE) -notch = express_getattr(IfcVoidingFeatureTypeEnum, 'NOTCH', INDETERMINATE) -hole = express_getattr(IfcVoidingFeatureTypeEnum, 'HOLE', INDETERMINATE) -miter = express_getattr(IfcVoidingFeatureTypeEnum, 'MITER', INDETERMINATE) -chamfer = express_getattr(IfcVoidingFeatureTypeEnum, 'CHAMFER', INDETERMINATE) -edge = express_getattr(IfcVoidingFeatureTypeEnum, 'EDGE', INDETERMINATE) -userdefined = express_getattr(IfcVoidingFeatureTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcVoidingFeatureTypeEnum, 'NOTDEFINED', INDETERMINATE) +cutout = IfcVoidingFeatureTypeEnum.CUTOUT +notch = IfcVoidingFeatureTypeEnum.NOTCH +hole = IfcVoidingFeatureTypeEnum.HOLE +miter = IfcVoidingFeatureTypeEnum.MITER +chamfer = IfcVoidingFeatureTypeEnum.CHAMFER +edge = IfcVoidingFeatureTypeEnum.EDGE +userdefined = IfcVoidingFeatureTypeEnum.USERDEFINED +notdefined = IfcVoidingFeatureTypeEnum.NOTDEFINED IfcWallTypeEnum = enum_namespace() -movable = express_getattr(IfcWallTypeEnum, 'MOVABLE', INDETERMINATE) -parapet = express_getattr(IfcWallTypeEnum, 'PARAPET', INDETERMINATE) -partitioning = express_getattr(IfcWallTypeEnum, 'PARTITIONING', INDETERMINATE) -plumbingwall = express_getattr(IfcWallTypeEnum, 'PLUMBINGWALL', INDETERMINATE) -shear = express_getattr(IfcWallTypeEnum, 'SHEAR', INDETERMINATE) -solidwall = express_getattr(IfcWallTypeEnum, 'SOLIDWALL', INDETERMINATE) -standard = express_getattr(IfcWallTypeEnum, 'STANDARD', INDETERMINATE) -polygonal = express_getattr(IfcWallTypeEnum, 'POLYGONAL', INDETERMINATE) -elementedwall = express_getattr(IfcWallTypeEnum, 'ELEMENTEDWALL', INDETERMINATE) -userdefined = express_getattr(IfcWallTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcWallTypeEnum, 'NOTDEFINED', INDETERMINATE) +movable = IfcWallTypeEnum.MOVABLE +parapet = IfcWallTypeEnum.PARAPET +partitioning = IfcWallTypeEnum.PARTITIONING +plumbingwall = IfcWallTypeEnum.PLUMBINGWALL +shear = IfcWallTypeEnum.SHEAR +solidwall = IfcWallTypeEnum.SOLIDWALL +standard = IfcWallTypeEnum.STANDARD +polygonal = IfcWallTypeEnum.POLYGONAL +elementedwall = IfcWallTypeEnum.ELEMENTEDWALL +userdefined = IfcWallTypeEnum.USERDEFINED +notdefined = IfcWallTypeEnum.NOTDEFINED IfcWasteTerminalTypeEnum = enum_namespace() -floortrap = express_getattr(IfcWasteTerminalTypeEnum, 'FLOORTRAP', INDETERMINATE) -floorwaste = express_getattr(IfcWasteTerminalTypeEnum, 'FLOORWASTE', INDETERMINATE) -gullysump = express_getattr(IfcWasteTerminalTypeEnum, 'GULLYSUMP', INDETERMINATE) -gullytrap = express_getattr(IfcWasteTerminalTypeEnum, 'GULLYTRAP', INDETERMINATE) -roofdrain = express_getattr(IfcWasteTerminalTypeEnum, 'ROOFDRAIN', INDETERMINATE) -wastedisposalunit = express_getattr(IfcWasteTerminalTypeEnum, 'WASTEDISPOSALUNIT', INDETERMINATE) -wastetrap = express_getattr(IfcWasteTerminalTypeEnum, 'WASTETRAP', INDETERMINATE) -userdefined = express_getattr(IfcWasteTerminalTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcWasteTerminalTypeEnum, 'NOTDEFINED', INDETERMINATE) +floortrap = IfcWasteTerminalTypeEnum.FLOORTRAP +floorwaste = IfcWasteTerminalTypeEnum.FLOORWASTE +gullysump = IfcWasteTerminalTypeEnum.GULLYSUMP +gullytrap = IfcWasteTerminalTypeEnum.GULLYTRAP +roofdrain = IfcWasteTerminalTypeEnum.ROOFDRAIN +wastedisposalunit = IfcWasteTerminalTypeEnum.WASTEDISPOSALUNIT +wastetrap = IfcWasteTerminalTypeEnum.WASTETRAP +userdefined = IfcWasteTerminalTypeEnum.USERDEFINED +notdefined = IfcWasteTerminalTypeEnum.NOTDEFINED IfcWindowPanelOperationEnum = enum_namespace() -sidehungrighthand = express_getattr(IfcWindowPanelOperationEnum, 'SIDEHUNGRIGHTHAND', INDETERMINATE) -sidehunglefthand = express_getattr(IfcWindowPanelOperationEnum, 'SIDEHUNGLEFTHAND', INDETERMINATE) -tiltandturnrighthand = express_getattr(IfcWindowPanelOperationEnum, 'TILTANDTURNRIGHTHAND', INDETERMINATE) -tiltandturnlefthand = express_getattr(IfcWindowPanelOperationEnum, 'TILTANDTURNLEFTHAND', INDETERMINATE) -tophung = express_getattr(IfcWindowPanelOperationEnum, 'TOPHUNG', INDETERMINATE) -bottomhung = express_getattr(IfcWindowPanelOperationEnum, 'BOTTOMHUNG', INDETERMINATE) -pivothorizontal = express_getattr(IfcWindowPanelOperationEnum, 'PIVOTHORIZONTAL', INDETERMINATE) -pivotvertical = express_getattr(IfcWindowPanelOperationEnum, 'PIVOTVERTICAL', INDETERMINATE) -slidinghorizontal = express_getattr(IfcWindowPanelOperationEnum, 'SLIDINGHORIZONTAL', INDETERMINATE) -slidingvertical = express_getattr(IfcWindowPanelOperationEnum, 'SLIDINGVERTICAL', INDETERMINATE) -removablecasement = express_getattr(IfcWindowPanelOperationEnum, 'REMOVABLECASEMENT', INDETERMINATE) -fixedcasement = express_getattr(IfcWindowPanelOperationEnum, 'FIXEDCASEMENT', INDETERMINATE) -otheroperation = express_getattr(IfcWindowPanelOperationEnum, 'OTHEROPERATION', INDETERMINATE) -notdefined = express_getattr(IfcWindowPanelOperationEnum, 'NOTDEFINED', INDETERMINATE) +sidehungrighthand = IfcWindowPanelOperationEnum.SIDEHUNGRIGHTHAND +sidehunglefthand = IfcWindowPanelOperationEnum.SIDEHUNGLEFTHAND +tiltandturnrighthand = IfcWindowPanelOperationEnum.TILTANDTURNRIGHTHAND +tiltandturnlefthand = IfcWindowPanelOperationEnum.TILTANDTURNLEFTHAND +tophung = IfcWindowPanelOperationEnum.TOPHUNG +bottomhung = IfcWindowPanelOperationEnum.BOTTOMHUNG +pivothorizontal = IfcWindowPanelOperationEnum.PIVOTHORIZONTAL +pivotvertical = IfcWindowPanelOperationEnum.PIVOTVERTICAL +slidinghorizontal = IfcWindowPanelOperationEnum.SLIDINGHORIZONTAL +slidingvertical = IfcWindowPanelOperationEnum.SLIDINGVERTICAL +removablecasement = IfcWindowPanelOperationEnum.REMOVABLECASEMENT +fixedcasement = IfcWindowPanelOperationEnum.FIXEDCASEMENT +otheroperation = IfcWindowPanelOperationEnum.OTHEROPERATION +notdefined = IfcWindowPanelOperationEnum.NOTDEFINED IfcWindowPanelPositionEnum = enum_namespace() -left = express_getattr(IfcWindowPanelPositionEnum, 'LEFT', INDETERMINATE) -middle = express_getattr(IfcWindowPanelPositionEnum, 'MIDDLE', INDETERMINATE) -right = express_getattr(IfcWindowPanelPositionEnum, 'RIGHT', INDETERMINATE) -bottom = express_getattr(IfcWindowPanelPositionEnum, 'BOTTOM', INDETERMINATE) -top = express_getattr(IfcWindowPanelPositionEnum, 'TOP', INDETERMINATE) -notdefined = express_getattr(IfcWindowPanelPositionEnum, 'NOTDEFINED', INDETERMINATE) +left = IfcWindowPanelPositionEnum.LEFT +middle = IfcWindowPanelPositionEnum.MIDDLE +right = IfcWindowPanelPositionEnum.RIGHT +bottom = IfcWindowPanelPositionEnum.BOTTOM +top = IfcWindowPanelPositionEnum.TOP +notdefined = IfcWindowPanelPositionEnum.NOTDEFINED IfcWindowStyleConstructionEnum = enum_namespace() -aluminium = express_getattr(IfcWindowStyleConstructionEnum, 'ALUMINIUM', INDETERMINATE) -high_grade_steel = express_getattr(IfcWindowStyleConstructionEnum, 'HIGH_GRADE_STEEL', INDETERMINATE) -steel = express_getattr(IfcWindowStyleConstructionEnum, 'STEEL', INDETERMINATE) -wood = express_getattr(IfcWindowStyleConstructionEnum, 'WOOD', INDETERMINATE) -aluminium_wood = express_getattr(IfcWindowStyleConstructionEnum, 'ALUMINIUM_WOOD', INDETERMINATE) -plastic = express_getattr(IfcWindowStyleConstructionEnum, 'PLASTIC', INDETERMINATE) -other_construction = express_getattr(IfcWindowStyleConstructionEnum, 'OTHER_CONSTRUCTION', INDETERMINATE) -notdefined = express_getattr(IfcWindowStyleConstructionEnum, 'NOTDEFINED', INDETERMINATE) +aluminium = IfcWindowStyleConstructionEnum.ALUMINIUM +high_grade_steel = IfcWindowStyleConstructionEnum.HIGH_GRADE_STEEL +steel = IfcWindowStyleConstructionEnum.STEEL +wood = IfcWindowStyleConstructionEnum.WOOD +aluminium_wood = IfcWindowStyleConstructionEnum.ALUMINIUM_WOOD +plastic = IfcWindowStyleConstructionEnum.PLASTIC +other_construction = IfcWindowStyleConstructionEnum.OTHER_CONSTRUCTION +notdefined = IfcWindowStyleConstructionEnum.NOTDEFINED IfcWindowStyleOperationEnum = enum_namespace() -single_panel = express_getattr(IfcWindowStyleOperationEnum, 'SINGLE_PANEL', INDETERMINATE) -double_panel_vertical = express_getattr(IfcWindowStyleOperationEnum, 'DOUBLE_PANEL_VERTICAL', INDETERMINATE) -double_panel_horizontal = express_getattr(IfcWindowStyleOperationEnum, 'DOUBLE_PANEL_HORIZONTAL', INDETERMINATE) -triple_panel_vertical = express_getattr(IfcWindowStyleOperationEnum, 'TRIPLE_PANEL_VERTICAL', INDETERMINATE) -triple_panel_bottom = express_getattr(IfcWindowStyleOperationEnum, 'TRIPLE_PANEL_BOTTOM', INDETERMINATE) -triple_panel_top = express_getattr(IfcWindowStyleOperationEnum, 'TRIPLE_PANEL_TOP', INDETERMINATE) -triple_panel_left = express_getattr(IfcWindowStyleOperationEnum, 'TRIPLE_PANEL_LEFT', INDETERMINATE) -triple_panel_right = express_getattr(IfcWindowStyleOperationEnum, 'TRIPLE_PANEL_RIGHT', INDETERMINATE) -triple_panel_horizontal = express_getattr(IfcWindowStyleOperationEnum, 'TRIPLE_PANEL_HORIZONTAL', INDETERMINATE) -userdefined = express_getattr(IfcWindowStyleOperationEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcWindowStyleOperationEnum, 'NOTDEFINED', INDETERMINATE) +single_panel = IfcWindowStyleOperationEnum.SINGLE_PANEL +double_panel_vertical = IfcWindowStyleOperationEnum.DOUBLE_PANEL_VERTICAL +double_panel_horizontal = IfcWindowStyleOperationEnum.DOUBLE_PANEL_HORIZONTAL +triple_panel_vertical = IfcWindowStyleOperationEnum.TRIPLE_PANEL_VERTICAL +triple_panel_bottom = IfcWindowStyleOperationEnum.TRIPLE_PANEL_BOTTOM +triple_panel_top = IfcWindowStyleOperationEnum.TRIPLE_PANEL_TOP +triple_panel_left = IfcWindowStyleOperationEnum.TRIPLE_PANEL_LEFT +triple_panel_right = IfcWindowStyleOperationEnum.TRIPLE_PANEL_RIGHT +triple_panel_horizontal = IfcWindowStyleOperationEnum.TRIPLE_PANEL_HORIZONTAL +userdefined = IfcWindowStyleOperationEnum.USERDEFINED +notdefined = IfcWindowStyleOperationEnum.NOTDEFINED IfcWindowTypeEnum = enum_namespace() -window = express_getattr(IfcWindowTypeEnum, 'WINDOW', INDETERMINATE) -skylight = express_getattr(IfcWindowTypeEnum, 'SKYLIGHT', INDETERMINATE) -lightdome = express_getattr(IfcWindowTypeEnum, 'LIGHTDOME', INDETERMINATE) -userdefined = express_getattr(IfcWindowTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcWindowTypeEnum, 'NOTDEFINED', INDETERMINATE) +window = IfcWindowTypeEnum.WINDOW +skylight = IfcWindowTypeEnum.SKYLIGHT +lightdome = IfcWindowTypeEnum.LIGHTDOME +userdefined = IfcWindowTypeEnum.USERDEFINED +notdefined = IfcWindowTypeEnum.NOTDEFINED IfcWindowTypePartitioningEnum = enum_namespace() -single_panel = express_getattr(IfcWindowTypePartitioningEnum, 'SINGLE_PANEL', INDETERMINATE) -double_panel_vertical = express_getattr(IfcWindowTypePartitioningEnum, 'DOUBLE_PANEL_VERTICAL', INDETERMINATE) -double_panel_horizontal = express_getattr(IfcWindowTypePartitioningEnum, 'DOUBLE_PANEL_HORIZONTAL', INDETERMINATE) -triple_panel_vertical = express_getattr(IfcWindowTypePartitioningEnum, 'TRIPLE_PANEL_VERTICAL', INDETERMINATE) -triple_panel_bottom = express_getattr(IfcWindowTypePartitioningEnum, 'TRIPLE_PANEL_BOTTOM', INDETERMINATE) -triple_panel_top = express_getattr(IfcWindowTypePartitioningEnum, 'TRIPLE_PANEL_TOP', INDETERMINATE) -triple_panel_left = express_getattr(IfcWindowTypePartitioningEnum, 'TRIPLE_PANEL_LEFT', INDETERMINATE) -triple_panel_right = express_getattr(IfcWindowTypePartitioningEnum, 'TRIPLE_PANEL_RIGHT', INDETERMINATE) -triple_panel_horizontal = express_getattr(IfcWindowTypePartitioningEnum, 'TRIPLE_PANEL_HORIZONTAL', INDETERMINATE) -userdefined = express_getattr(IfcWindowTypePartitioningEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcWindowTypePartitioningEnum, 'NOTDEFINED', INDETERMINATE) +single_panel = IfcWindowTypePartitioningEnum.SINGLE_PANEL +double_panel_vertical = IfcWindowTypePartitioningEnum.DOUBLE_PANEL_VERTICAL +double_panel_horizontal = IfcWindowTypePartitioningEnum.DOUBLE_PANEL_HORIZONTAL +triple_panel_vertical = IfcWindowTypePartitioningEnum.TRIPLE_PANEL_VERTICAL +triple_panel_bottom = IfcWindowTypePartitioningEnum.TRIPLE_PANEL_BOTTOM +triple_panel_top = IfcWindowTypePartitioningEnum.TRIPLE_PANEL_TOP +triple_panel_left = IfcWindowTypePartitioningEnum.TRIPLE_PANEL_LEFT +triple_panel_right = IfcWindowTypePartitioningEnum.TRIPLE_PANEL_RIGHT +triple_panel_horizontal = IfcWindowTypePartitioningEnum.TRIPLE_PANEL_HORIZONTAL +userdefined = IfcWindowTypePartitioningEnum.USERDEFINED +notdefined = IfcWindowTypePartitioningEnum.NOTDEFINED IfcWorkCalendarTypeEnum = enum_namespace() -firstshift = express_getattr(IfcWorkCalendarTypeEnum, 'FIRSTSHIFT', INDETERMINATE) -secondshift = express_getattr(IfcWorkCalendarTypeEnum, 'SECONDSHIFT', INDETERMINATE) -thirdshift = express_getattr(IfcWorkCalendarTypeEnum, 'THIRDSHIFT', INDETERMINATE) -userdefined = express_getattr(IfcWorkCalendarTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcWorkCalendarTypeEnum, 'NOTDEFINED', INDETERMINATE) +firstshift = IfcWorkCalendarTypeEnum.FIRSTSHIFT +secondshift = IfcWorkCalendarTypeEnum.SECONDSHIFT +thirdshift = IfcWorkCalendarTypeEnum.THIRDSHIFT +userdefined = IfcWorkCalendarTypeEnum.USERDEFINED +notdefined = IfcWorkCalendarTypeEnum.NOTDEFINED IfcWorkPlanTypeEnum = enum_namespace() -actual = express_getattr(IfcWorkPlanTypeEnum, 'ACTUAL', INDETERMINATE) -baseline = express_getattr(IfcWorkPlanTypeEnum, 'BASELINE', INDETERMINATE) -planned = express_getattr(IfcWorkPlanTypeEnum, 'PLANNED', INDETERMINATE) -userdefined = express_getattr(IfcWorkPlanTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcWorkPlanTypeEnum, 'NOTDEFINED', INDETERMINATE) +actual = IfcWorkPlanTypeEnum.ACTUAL +baseline = IfcWorkPlanTypeEnum.BASELINE +planned = IfcWorkPlanTypeEnum.PLANNED +userdefined = IfcWorkPlanTypeEnum.USERDEFINED +notdefined = IfcWorkPlanTypeEnum.NOTDEFINED IfcWorkScheduleTypeEnum = enum_namespace() -actual = express_getattr(IfcWorkScheduleTypeEnum, 'ACTUAL', INDETERMINATE) -baseline = express_getattr(IfcWorkScheduleTypeEnum, 'BASELINE', INDETERMINATE) -planned = express_getattr(IfcWorkScheduleTypeEnum, 'PLANNED', INDETERMINATE) -userdefined = express_getattr(IfcWorkScheduleTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcWorkScheduleTypeEnum, 'NOTDEFINED', INDETERMINATE) +actual = IfcWorkScheduleTypeEnum.ACTUAL +baseline = IfcWorkScheduleTypeEnum.BASELINE +planned = IfcWorkScheduleTypeEnum.PLANNED +userdefined = IfcWorkScheduleTypeEnum.USERDEFINED +notdefined = IfcWorkScheduleTypeEnum.NOTDEFINED def IfcActionRequest(*args, **kwargs): return ifcopenshell.create_entity('IfcActionRequest', 'IFC4X1', *args, **kwargs) diff --git a/src/ifcopenshell-python/ifcopenshell/express/rules/IFC4X2.py b/src/ifcopenshell-python/ifcopenshell/express/rules/IFC4X2.py index 9ea3753fafa..80376eff4c4 100644 --- a/src/ifcopenshell-python/ifcopenshell/express/rules/IFC4X2.py +++ b/src/ifcopenshell-python/ifcopenshell/express/rules/IFC4X2.py @@ -1,5 +1,8 @@ import ifcopenshell +def is_indeterminate(v): + return v is None or type(v).__name__ == 'indeterminate_type' + def exists(v): if callable(v): try: @@ -7,10 +10,10 @@ def exists(v): except IndexError as e: return False else: - return v is not None + return not is_indeterminate(v) def nvl(v, default): - return v if v is not None else default + return v if not is_indeterminate(v) else default def is_entity(inst): if isinstance(inst, ifcopenshell.entity_instance): @@ -22,13 +25,13 @@ def is_entity(inst): def express_len(v): if isinstance(v, ifcopenshell.entity_instance) and (not is_entity(v)): v = v[0] - elif v is None or v is INDETERMINATE: + elif is_indeterminate(v): return INDETERMINATE return len(v) old_range = range def range(*args): - if INDETERMINATE in args: + if any(map(is_indeterminate, args)): return yield from old_range(*args) sizeof = express_len @@ -149,1966 +152,1966 @@ class enum_namespace: def __getattr__(self, k): return express_getattr(k, 'upper', INDETERMINATE)() IfcActionRequestTypeEnum = enum_namespace() -email = express_getattr(IfcActionRequestTypeEnum, 'EMAIL', INDETERMINATE) -fax = express_getattr(IfcActionRequestTypeEnum, 'FAX', INDETERMINATE) -phone = express_getattr(IfcActionRequestTypeEnum, 'PHONE', INDETERMINATE) -post = express_getattr(IfcActionRequestTypeEnum, 'POST', INDETERMINATE) -verbal = express_getattr(IfcActionRequestTypeEnum, 'VERBAL', INDETERMINATE) -userdefined = express_getattr(IfcActionRequestTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcActionRequestTypeEnum, 'NOTDEFINED', INDETERMINATE) +email = IfcActionRequestTypeEnum.EMAIL +fax = IfcActionRequestTypeEnum.FAX +phone = IfcActionRequestTypeEnum.PHONE +post = IfcActionRequestTypeEnum.POST +verbal = IfcActionRequestTypeEnum.VERBAL +userdefined = IfcActionRequestTypeEnum.USERDEFINED +notdefined = IfcActionRequestTypeEnum.NOTDEFINED IfcActionSourceTypeEnum = enum_namespace() -dead_load_g = express_getattr(IfcActionSourceTypeEnum, 'DEAD_LOAD_G', INDETERMINATE) -completion_g1 = express_getattr(IfcActionSourceTypeEnum, 'COMPLETION_G1', INDETERMINATE) -live_load_q = express_getattr(IfcActionSourceTypeEnum, 'LIVE_LOAD_Q', INDETERMINATE) -snow_s = express_getattr(IfcActionSourceTypeEnum, 'SNOW_S', INDETERMINATE) -wind_w = express_getattr(IfcActionSourceTypeEnum, 'WIND_W', INDETERMINATE) -prestressing_p = express_getattr(IfcActionSourceTypeEnum, 'PRESTRESSING_P', INDETERMINATE) -settlement_u = express_getattr(IfcActionSourceTypeEnum, 'SETTLEMENT_U', INDETERMINATE) -temperature_t = express_getattr(IfcActionSourceTypeEnum, 'TEMPERATURE_T', INDETERMINATE) -earthquake_e = express_getattr(IfcActionSourceTypeEnum, 'EARTHQUAKE_E', INDETERMINATE) -fire = express_getattr(IfcActionSourceTypeEnum, 'FIRE', INDETERMINATE) -impulse = express_getattr(IfcActionSourceTypeEnum, 'IMPULSE', INDETERMINATE) -impact = express_getattr(IfcActionSourceTypeEnum, 'IMPACT', INDETERMINATE) -transport = express_getattr(IfcActionSourceTypeEnum, 'TRANSPORT', INDETERMINATE) -erection = express_getattr(IfcActionSourceTypeEnum, 'ERECTION', INDETERMINATE) -propping = express_getattr(IfcActionSourceTypeEnum, 'PROPPING', INDETERMINATE) -system_imperfection = express_getattr(IfcActionSourceTypeEnum, 'SYSTEM_IMPERFECTION', INDETERMINATE) -shrinkage = express_getattr(IfcActionSourceTypeEnum, 'SHRINKAGE', INDETERMINATE) -creep = express_getattr(IfcActionSourceTypeEnum, 'CREEP', INDETERMINATE) -lack_of_fit = express_getattr(IfcActionSourceTypeEnum, 'LACK_OF_FIT', INDETERMINATE) -buoyancy = express_getattr(IfcActionSourceTypeEnum, 'BUOYANCY', INDETERMINATE) -ice = express_getattr(IfcActionSourceTypeEnum, 'ICE', INDETERMINATE) -current = express_getattr(IfcActionSourceTypeEnum, 'CURRENT', INDETERMINATE) -wave = express_getattr(IfcActionSourceTypeEnum, 'WAVE', INDETERMINATE) -rain = express_getattr(IfcActionSourceTypeEnum, 'RAIN', INDETERMINATE) -brakes = express_getattr(IfcActionSourceTypeEnum, 'BRAKES', INDETERMINATE) -userdefined = express_getattr(IfcActionSourceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcActionSourceTypeEnum, 'NOTDEFINED', INDETERMINATE) +dead_load_g = IfcActionSourceTypeEnum.DEAD_LOAD_G +completion_g1 = IfcActionSourceTypeEnum.COMPLETION_G1 +live_load_q = IfcActionSourceTypeEnum.LIVE_LOAD_Q +snow_s = IfcActionSourceTypeEnum.SNOW_S +wind_w = IfcActionSourceTypeEnum.WIND_W +prestressing_p = IfcActionSourceTypeEnum.PRESTRESSING_P +settlement_u = IfcActionSourceTypeEnum.SETTLEMENT_U +temperature_t = IfcActionSourceTypeEnum.TEMPERATURE_T +earthquake_e = IfcActionSourceTypeEnum.EARTHQUAKE_E +fire = IfcActionSourceTypeEnum.FIRE +impulse = IfcActionSourceTypeEnum.IMPULSE +impact = IfcActionSourceTypeEnum.IMPACT +transport = IfcActionSourceTypeEnum.TRANSPORT +erection = IfcActionSourceTypeEnum.ERECTION +propping = IfcActionSourceTypeEnum.PROPPING +system_imperfection = IfcActionSourceTypeEnum.SYSTEM_IMPERFECTION +shrinkage = IfcActionSourceTypeEnum.SHRINKAGE +creep = IfcActionSourceTypeEnum.CREEP +lack_of_fit = IfcActionSourceTypeEnum.LACK_OF_FIT +buoyancy = IfcActionSourceTypeEnum.BUOYANCY +ice = IfcActionSourceTypeEnum.ICE +current = IfcActionSourceTypeEnum.CURRENT +wave = IfcActionSourceTypeEnum.WAVE +rain = IfcActionSourceTypeEnum.RAIN +brakes = IfcActionSourceTypeEnum.BRAKES +userdefined = IfcActionSourceTypeEnum.USERDEFINED +notdefined = IfcActionSourceTypeEnum.NOTDEFINED IfcActionTypeEnum = enum_namespace() -permanent_g = express_getattr(IfcActionTypeEnum, 'PERMANENT_G', INDETERMINATE) -variable_q = express_getattr(IfcActionTypeEnum, 'VARIABLE_Q', INDETERMINATE) -extraordinary_a = express_getattr(IfcActionTypeEnum, 'EXTRAORDINARY_A', INDETERMINATE) -userdefined = express_getattr(IfcActionTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcActionTypeEnum, 'NOTDEFINED', INDETERMINATE) +permanent_g = IfcActionTypeEnum.PERMANENT_G +variable_q = IfcActionTypeEnum.VARIABLE_Q +extraordinary_a = IfcActionTypeEnum.EXTRAORDINARY_A +userdefined = IfcActionTypeEnum.USERDEFINED +notdefined = IfcActionTypeEnum.NOTDEFINED IfcActuatorTypeEnum = enum_namespace() -electricactuator = express_getattr(IfcActuatorTypeEnum, 'ELECTRICACTUATOR', INDETERMINATE) -handoperatedactuator = express_getattr(IfcActuatorTypeEnum, 'HANDOPERATEDACTUATOR', INDETERMINATE) -hydraulicactuator = express_getattr(IfcActuatorTypeEnum, 'HYDRAULICACTUATOR', INDETERMINATE) -pneumaticactuator = express_getattr(IfcActuatorTypeEnum, 'PNEUMATICACTUATOR', INDETERMINATE) -thermostaticactuator = express_getattr(IfcActuatorTypeEnum, 'THERMOSTATICACTUATOR', INDETERMINATE) -userdefined = express_getattr(IfcActuatorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcActuatorTypeEnum, 'NOTDEFINED', INDETERMINATE) +electricactuator = IfcActuatorTypeEnum.ELECTRICACTUATOR +handoperatedactuator = IfcActuatorTypeEnum.HANDOPERATEDACTUATOR +hydraulicactuator = IfcActuatorTypeEnum.HYDRAULICACTUATOR +pneumaticactuator = IfcActuatorTypeEnum.PNEUMATICACTUATOR +thermostaticactuator = IfcActuatorTypeEnum.THERMOSTATICACTUATOR +userdefined = IfcActuatorTypeEnum.USERDEFINED +notdefined = IfcActuatorTypeEnum.NOTDEFINED IfcAddressTypeEnum = enum_namespace() -office = express_getattr(IfcAddressTypeEnum, 'OFFICE', INDETERMINATE) -site = express_getattr(IfcAddressTypeEnum, 'SITE', INDETERMINATE) -home = express_getattr(IfcAddressTypeEnum, 'HOME', INDETERMINATE) -distributionpoint = express_getattr(IfcAddressTypeEnum, 'DISTRIBUTIONPOINT', INDETERMINATE) -userdefined = express_getattr(IfcAddressTypeEnum, 'USERDEFINED', INDETERMINATE) +office = IfcAddressTypeEnum.OFFICE +site = IfcAddressTypeEnum.SITE +home = IfcAddressTypeEnum.HOME +distributionpoint = IfcAddressTypeEnum.DISTRIBUTIONPOINT +userdefined = IfcAddressTypeEnum.USERDEFINED IfcAirTerminalBoxTypeEnum = enum_namespace() -constantflow = express_getattr(IfcAirTerminalBoxTypeEnum, 'CONSTANTFLOW', INDETERMINATE) -variableflowpressuredependant = express_getattr(IfcAirTerminalBoxTypeEnum, 'VARIABLEFLOWPRESSUREDEPENDANT', INDETERMINATE) -variableflowpressureindependant = express_getattr(IfcAirTerminalBoxTypeEnum, 'VARIABLEFLOWPRESSUREINDEPENDANT', INDETERMINATE) -userdefined = express_getattr(IfcAirTerminalBoxTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAirTerminalBoxTypeEnum, 'NOTDEFINED', INDETERMINATE) +constantflow = IfcAirTerminalBoxTypeEnum.CONSTANTFLOW +variableflowpressuredependant = IfcAirTerminalBoxTypeEnum.VARIABLEFLOWPRESSUREDEPENDANT +variableflowpressureindependant = IfcAirTerminalBoxTypeEnum.VARIABLEFLOWPRESSUREINDEPENDANT +userdefined = IfcAirTerminalBoxTypeEnum.USERDEFINED +notdefined = IfcAirTerminalBoxTypeEnum.NOTDEFINED IfcAirTerminalTypeEnum = enum_namespace() -diffuser = express_getattr(IfcAirTerminalTypeEnum, 'DIFFUSER', INDETERMINATE) -grille = express_getattr(IfcAirTerminalTypeEnum, 'GRILLE', INDETERMINATE) -louvre = express_getattr(IfcAirTerminalTypeEnum, 'LOUVRE', INDETERMINATE) -register = express_getattr(IfcAirTerminalTypeEnum, 'REGISTER', INDETERMINATE) -userdefined = express_getattr(IfcAirTerminalTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAirTerminalTypeEnum, 'NOTDEFINED', INDETERMINATE) +diffuser = IfcAirTerminalTypeEnum.DIFFUSER +grille = IfcAirTerminalTypeEnum.GRILLE +louvre = IfcAirTerminalTypeEnum.LOUVRE +register = IfcAirTerminalTypeEnum.REGISTER +userdefined = IfcAirTerminalTypeEnum.USERDEFINED +notdefined = IfcAirTerminalTypeEnum.NOTDEFINED IfcAirToAirHeatRecoveryTypeEnum = enum_namespace() -fixedplatecounterflowexchanger = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'FIXEDPLATECOUNTERFLOWEXCHANGER', INDETERMINATE) -fixedplatecrossflowexchanger = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'FIXEDPLATECROSSFLOWEXCHANGER', INDETERMINATE) -fixedplateparallelflowexchanger = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'FIXEDPLATEPARALLELFLOWEXCHANGER', INDETERMINATE) -rotarywheel = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'ROTARYWHEEL', INDETERMINATE) -runaroundcoilloop = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'RUNAROUNDCOILLOOP', INDETERMINATE) -heatpipe = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'HEATPIPE', INDETERMINATE) -twintowerenthalpyrecoveryloops = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'TWINTOWERENTHALPYRECOVERYLOOPS', INDETERMINATE) -thermosiphonsealedtubeheatexchangers = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'THERMOSIPHONSEALEDTUBEHEATEXCHANGERS', INDETERMINATE) -thermosiphoncoiltypeheatexchangers = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'THERMOSIPHONCOILTYPEHEATEXCHANGERS', INDETERMINATE) -userdefined = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'NOTDEFINED', INDETERMINATE) +fixedplatecounterflowexchanger = IfcAirToAirHeatRecoveryTypeEnum.FIXEDPLATECOUNTERFLOWEXCHANGER +fixedplatecrossflowexchanger = IfcAirToAirHeatRecoveryTypeEnum.FIXEDPLATECROSSFLOWEXCHANGER +fixedplateparallelflowexchanger = IfcAirToAirHeatRecoveryTypeEnum.FIXEDPLATEPARALLELFLOWEXCHANGER +rotarywheel = IfcAirToAirHeatRecoveryTypeEnum.ROTARYWHEEL +runaroundcoilloop = IfcAirToAirHeatRecoveryTypeEnum.RUNAROUNDCOILLOOP +heatpipe = IfcAirToAirHeatRecoveryTypeEnum.HEATPIPE +twintowerenthalpyrecoveryloops = IfcAirToAirHeatRecoveryTypeEnum.TWINTOWERENTHALPYRECOVERYLOOPS +thermosiphonsealedtubeheatexchangers = IfcAirToAirHeatRecoveryTypeEnum.THERMOSIPHONSEALEDTUBEHEATEXCHANGERS +thermosiphoncoiltypeheatexchangers = IfcAirToAirHeatRecoveryTypeEnum.THERMOSIPHONCOILTYPEHEATEXCHANGERS +userdefined = IfcAirToAirHeatRecoveryTypeEnum.USERDEFINED +notdefined = IfcAirToAirHeatRecoveryTypeEnum.NOTDEFINED IfcAlarmTypeEnum = enum_namespace() -bell = express_getattr(IfcAlarmTypeEnum, 'BELL', INDETERMINATE) -breakglassbutton = express_getattr(IfcAlarmTypeEnum, 'BREAKGLASSBUTTON', INDETERMINATE) -light = express_getattr(IfcAlarmTypeEnum, 'LIGHT', INDETERMINATE) -manualpullbox = express_getattr(IfcAlarmTypeEnum, 'MANUALPULLBOX', INDETERMINATE) -siren = express_getattr(IfcAlarmTypeEnum, 'SIREN', INDETERMINATE) -whistle = express_getattr(IfcAlarmTypeEnum, 'WHISTLE', INDETERMINATE) -userdefined = express_getattr(IfcAlarmTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAlarmTypeEnum, 'NOTDEFINED', INDETERMINATE) +bell = IfcAlarmTypeEnum.BELL +breakglassbutton = IfcAlarmTypeEnum.BREAKGLASSBUTTON +light = IfcAlarmTypeEnum.LIGHT +manualpullbox = IfcAlarmTypeEnum.MANUALPULLBOX +siren = IfcAlarmTypeEnum.SIREN +whistle = IfcAlarmTypeEnum.WHISTLE +userdefined = IfcAlarmTypeEnum.USERDEFINED +notdefined = IfcAlarmTypeEnum.NOTDEFINED IfcAlignmentTypeEnum = enum_namespace() -userdefined = express_getattr(IfcAlignmentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAlignmentTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcAlignmentTypeEnum.USERDEFINED +notdefined = IfcAlignmentTypeEnum.NOTDEFINED IfcAnalysisModelTypeEnum = enum_namespace() -in_plane_loading_2d = express_getattr(IfcAnalysisModelTypeEnum, 'IN_PLANE_LOADING_2D', INDETERMINATE) -out_plane_loading_2d = express_getattr(IfcAnalysisModelTypeEnum, 'OUT_PLANE_LOADING_2D', INDETERMINATE) -loading_3d = express_getattr(IfcAnalysisModelTypeEnum, 'LOADING_3D', INDETERMINATE) -userdefined = express_getattr(IfcAnalysisModelTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAnalysisModelTypeEnum, 'NOTDEFINED', INDETERMINATE) +in_plane_loading_2d = IfcAnalysisModelTypeEnum.IN_PLANE_LOADING_2D +out_plane_loading_2d = IfcAnalysisModelTypeEnum.OUT_PLANE_LOADING_2D +loading_3d = IfcAnalysisModelTypeEnum.LOADING_3D +userdefined = IfcAnalysisModelTypeEnum.USERDEFINED +notdefined = IfcAnalysisModelTypeEnum.NOTDEFINED IfcAnalysisTheoryTypeEnum = enum_namespace() -first_order_theory = express_getattr(IfcAnalysisTheoryTypeEnum, 'FIRST_ORDER_THEORY', INDETERMINATE) -second_order_theory = express_getattr(IfcAnalysisTheoryTypeEnum, 'SECOND_ORDER_THEORY', INDETERMINATE) -third_order_theory = express_getattr(IfcAnalysisTheoryTypeEnum, 'THIRD_ORDER_THEORY', INDETERMINATE) -full_nonlinear_theory = express_getattr(IfcAnalysisTheoryTypeEnum, 'FULL_NONLINEAR_THEORY', INDETERMINATE) -userdefined = express_getattr(IfcAnalysisTheoryTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAnalysisTheoryTypeEnum, 'NOTDEFINED', INDETERMINATE) +first_order_theory = IfcAnalysisTheoryTypeEnum.FIRST_ORDER_THEORY +second_order_theory = IfcAnalysisTheoryTypeEnum.SECOND_ORDER_THEORY +third_order_theory = IfcAnalysisTheoryTypeEnum.THIRD_ORDER_THEORY +full_nonlinear_theory = IfcAnalysisTheoryTypeEnum.FULL_NONLINEAR_THEORY +userdefined = IfcAnalysisTheoryTypeEnum.USERDEFINED +notdefined = IfcAnalysisTheoryTypeEnum.NOTDEFINED IfcArithmeticOperatorEnum = enum_namespace() -add = express_getattr(IfcArithmeticOperatorEnum, 'ADD', INDETERMINATE) -divide = express_getattr(IfcArithmeticOperatorEnum, 'DIVIDE', INDETERMINATE) -multiply = express_getattr(IfcArithmeticOperatorEnum, 'MULTIPLY', INDETERMINATE) -subtract = express_getattr(IfcArithmeticOperatorEnum, 'SUBTRACT', INDETERMINATE) +add = IfcArithmeticOperatorEnum.ADD +divide = IfcArithmeticOperatorEnum.DIVIDE +multiply = IfcArithmeticOperatorEnum.MULTIPLY +subtract = IfcArithmeticOperatorEnum.SUBTRACT IfcAssemblyPlaceEnum = enum_namespace() -site = express_getattr(IfcAssemblyPlaceEnum, 'SITE', INDETERMINATE) -factory = express_getattr(IfcAssemblyPlaceEnum, 'FACTORY', INDETERMINATE) -notdefined = express_getattr(IfcAssemblyPlaceEnum, 'NOTDEFINED', INDETERMINATE) +site = IfcAssemblyPlaceEnum.SITE +factory = IfcAssemblyPlaceEnum.FACTORY +notdefined = IfcAssemblyPlaceEnum.NOTDEFINED IfcAudioVisualApplianceTypeEnum = enum_namespace() -amplifier = express_getattr(IfcAudioVisualApplianceTypeEnum, 'AMPLIFIER', INDETERMINATE) -camera = express_getattr(IfcAudioVisualApplianceTypeEnum, 'CAMERA', INDETERMINATE) -display = express_getattr(IfcAudioVisualApplianceTypeEnum, 'DISPLAY', INDETERMINATE) -microphone = express_getattr(IfcAudioVisualApplianceTypeEnum, 'MICROPHONE', INDETERMINATE) -player = express_getattr(IfcAudioVisualApplianceTypeEnum, 'PLAYER', INDETERMINATE) -projector = express_getattr(IfcAudioVisualApplianceTypeEnum, 'PROJECTOR', INDETERMINATE) -receiver = express_getattr(IfcAudioVisualApplianceTypeEnum, 'RECEIVER', INDETERMINATE) -speaker = express_getattr(IfcAudioVisualApplianceTypeEnum, 'SPEAKER', INDETERMINATE) -switcher = express_getattr(IfcAudioVisualApplianceTypeEnum, 'SWITCHER', INDETERMINATE) -telephone = express_getattr(IfcAudioVisualApplianceTypeEnum, 'TELEPHONE', INDETERMINATE) -tuner = express_getattr(IfcAudioVisualApplianceTypeEnum, 'TUNER', INDETERMINATE) -userdefined = express_getattr(IfcAudioVisualApplianceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAudioVisualApplianceTypeEnum, 'NOTDEFINED', INDETERMINATE) +amplifier = IfcAudioVisualApplianceTypeEnum.AMPLIFIER +camera = IfcAudioVisualApplianceTypeEnum.CAMERA +display = IfcAudioVisualApplianceTypeEnum.DISPLAY +microphone = IfcAudioVisualApplianceTypeEnum.MICROPHONE +player = IfcAudioVisualApplianceTypeEnum.PLAYER +projector = IfcAudioVisualApplianceTypeEnum.PROJECTOR +receiver = IfcAudioVisualApplianceTypeEnum.RECEIVER +speaker = IfcAudioVisualApplianceTypeEnum.SPEAKER +switcher = IfcAudioVisualApplianceTypeEnum.SWITCHER +telephone = IfcAudioVisualApplianceTypeEnum.TELEPHONE +tuner = IfcAudioVisualApplianceTypeEnum.TUNER +userdefined = IfcAudioVisualApplianceTypeEnum.USERDEFINED +notdefined = IfcAudioVisualApplianceTypeEnum.NOTDEFINED IfcBSplineCurveForm = enum_namespace() -polyline_form = express_getattr(IfcBSplineCurveForm, 'POLYLINE_FORM', INDETERMINATE) -circular_arc = express_getattr(IfcBSplineCurveForm, 'CIRCULAR_ARC', INDETERMINATE) -elliptic_arc = express_getattr(IfcBSplineCurveForm, 'ELLIPTIC_ARC', INDETERMINATE) -parabolic_arc = express_getattr(IfcBSplineCurveForm, 'PARABOLIC_ARC', INDETERMINATE) -hyperbolic_arc = express_getattr(IfcBSplineCurveForm, 'HYPERBOLIC_ARC', INDETERMINATE) -unspecified = express_getattr(IfcBSplineCurveForm, 'UNSPECIFIED', INDETERMINATE) +polyline_form = IfcBSplineCurveForm.POLYLINE_FORM +circular_arc = IfcBSplineCurveForm.CIRCULAR_ARC +elliptic_arc = IfcBSplineCurveForm.ELLIPTIC_ARC +parabolic_arc = IfcBSplineCurveForm.PARABOLIC_ARC +hyperbolic_arc = IfcBSplineCurveForm.HYPERBOLIC_ARC +unspecified = IfcBSplineCurveForm.UNSPECIFIED IfcBSplineSurfaceForm = enum_namespace() -plane_surf = express_getattr(IfcBSplineSurfaceForm, 'PLANE_SURF', INDETERMINATE) -cylindrical_surf = express_getattr(IfcBSplineSurfaceForm, 'CYLINDRICAL_SURF', INDETERMINATE) -conical_surf = express_getattr(IfcBSplineSurfaceForm, 'CONICAL_SURF', INDETERMINATE) -spherical_surf = express_getattr(IfcBSplineSurfaceForm, 'SPHERICAL_SURF', INDETERMINATE) -toroidal_surf = express_getattr(IfcBSplineSurfaceForm, 'TOROIDAL_SURF', INDETERMINATE) -surf_of_revolution = express_getattr(IfcBSplineSurfaceForm, 'SURF_OF_REVOLUTION', INDETERMINATE) -ruled_surf = express_getattr(IfcBSplineSurfaceForm, 'RULED_SURF', INDETERMINATE) -generalised_cone = express_getattr(IfcBSplineSurfaceForm, 'GENERALISED_CONE', INDETERMINATE) -quadric_surf = express_getattr(IfcBSplineSurfaceForm, 'QUADRIC_SURF', INDETERMINATE) -surf_of_linear_extrusion = express_getattr(IfcBSplineSurfaceForm, 'SURF_OF_LINEAR_EXTRUSION', INDETERMINATE) -unspecified = express_getattr(IfcBSplineSurfaceForm, 'UNSPECIFIED', INDETERMINATE) +plane_surf = IfcBSplineSurfaceForm.PLANE_SURF +cylindrical_surf = IfcBSplineSurfaceForm.CYLINDRICAL_SURF +conical_surf = IfcBSplineSurfaceForm.CONICAL_SURF +spherical_surf = IfcBSplineSurfaceForm.SPHERICAL_SURF +toroidal_surf = IfcBSplineSurfaceForm.TOROIDAL_SURF +surf_of_revolution = IfcBSplineSurfaceForm.SURF_OF_REVOLUTION +ruled_surf = IfcBSplineSurfaceForm.RULED_SURF +generalised_cone = IfcBSplineSurfaceForm.GENERALISED_CONE +quadric_surf = IfcBSplineSurfaceForm.QUADRIC_SURF +surf_of_linear_extrusion = IfcBSplineSurfaceForm.SURF_OF_LINEAR_EXTRUSION +unspecified = IfcBSplineSurfaceForm.UNSPECIFIED IfcBeamTypeEnum = enum_namespace() -beam = express_getattr(IfcBeamTypeEnum, 'BEAM', INDETERMINATE) -joist = express_getattr(IfcBeamTypeEnum, 'JOIST', INDETERMINATE) -hollowcore = express_getattr(IfcBeamTypeEnum, 'HOLLOWCORE', INDETERMINATE) -lintel = express_getattr(IfcBeamTypeEnum, 'LINTEL', INDETERMINATE) -spandrel = express_getattr(IfcBeamTypeEnum, 'SPANDREL', INDETERMINATE) -t_beam = express_getattr(IfcBeamTypeEnum, 'T_BEAM', INDETERMINATE) -girder_segment = express_getattr(IfcBeamTypeEnum, 'GIRDER_SEGMENT', INDETERMINATE) -diaphragm = express_getattr(IfcBeamTypeEnum, 'DIAPHRAGM', INDETERMINATE) -piercap = express_getattr(IfcBeamTypeEnum, 'PIERCAP', INDETERMINATE) -hatstone = express_getattr(IfcBeamTypeEnum, 'HATSTONE', INDETERMINATE) -cornice = express_getattr(IfcBeamTypeEnum, 'CORNICE', INDETERMINATE) -edgebeam = express_getattr(IfcBeamTypeEnum, 'EDGEBEAM', INDETERMINATE) -userdefined = express_getattr(IfcBeamTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBeamTypeEnum, 'NOTDEFINED', INDETERMINATE) +beam = IfcBeamTypeEnum.BEAM +joist = IfcBeamTypeEnum.JOIST +hollowcore = IfcBeamTypeEnum.HOLLOWCORE +lintel = IfcBeamTypeEnum.LINTEL +spandrel = IfcBeamTypeEnum.SPANDREL +t_beam = IfcBeamTypeEnum.T_BEAM +girder_segment = IfcBeamTypeEnum.GIRDER_SEGMENT +diaphragm = IfcBeamTypeEnum.DIAPHRAGM +piercap = IfcBeamTypeEnum.PIERCAP +hatstone = IfcBeamTypeEnum.HATSTONE +cornice = IfcBeamTypeEnum.CORNICE +edgebeam = IfcBeamTypeEnum.EDGEBEAM +userdefined = IfcBeamTypeEnum.USERDEFINED +notdefined = IfcBeamTypeEnum.NOTDEFINED IfcBearingTypeDisplacementEnum = enum_namespace() -fixed_movement = express_getattr(IfcBearingTypeDisplacementEnum, 'FIXED_MOVEMENT', INDETERMINATE) -guided_longitudinal = express_getattr(IfcBearingTypeDisplacementEnum, 'GUIDED_LONGITUDINAL', INDETERMINATE) -guided_transversal = express_getattr(IfcBearingTypeDisplacementEnum, 'GUIDED_TRANSVERSAL', INDETERMINATE) -free_movement = express_getattr(IfcBearingTypeDisplacementEnum, 'FREE_MOVEMENT', INDETERMINATE) -notdefined = express_getattr(IfcBearingTypeDisplacementEnum, 'NOTDEFINED', INDETERMINATE) +fixed_movement = IfcBearingTypeDisplacementEnum.FIXED_MOVEMENT +guided_longitudinal = IfcBearingTypeDisplacementEnum.GUIDED_LONGITUDINAL +guided_transversal = IfcBearingTypeDisplacementEnum.GUIDED_TRANSVERSAL +free_movement = IfcBearingTypeDisplacementEnum.FREE_MOVEMENT +notdefined = IfcBearingTypeDisplacementEnum.NOTDEFINED IfcBearingTypeEnum = enum_namespace() -cylindrical = express_getattr(IfcBearingTypeEnum, 'CYLINDRICAL', INDETERMINATE) -spherical = express_getattr(IfcBearingTypeEnum, 'SPHERICAL', INDETERMINATE) -elastomeric = express_getattr(IfcBearingTypeEnum, 'ELASTOMERIC', INDETERMINATE) -pot = express_getattr(IfcBearingTypeEnum, 'POT', INDETERMINATE) -guide = express_getattr(IfcBearingTypeEnum, 'GUIDE', INDETERMINATE) -rocker = express_getattr(IfcBearingTypeEnum, 'ROCKER', INDETERMINATE) -roller = express_getattr(IfcBearingTypeEnum, 'ROLLER', INDETERMINATE) -disk = express_getattr(IfcBearingTypeEnum, 'DISK', INDETERMINATE) -userdefined = express_getattr(IfcBearingTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBearingTypeEnum, 'NOTDEFINED', INDETERMINATE) +cylindrical = IfcBearingTypeEnum.CYLINDRICAL +spherical = IfcBearingTypeEnum.SPHERICAL +elastomeric = IfcBearingTypeEnum.ELASTOMERIC +pot = IfcBearingTypeEnum.POT +guide = IfcBearingTypeEnum.GUIDE +rocker = IfcBearingTypeEnum.ROCKER +roller = IfcBearingTypeEnum.ROLLER +disk = IfcBearingTypeEnum.DISK +userdefined = IfcBearingTypeEnum.USERDEFINED +notdefined = IfcBearingTypeEnum.NOTDEFINED IfcBenchmarkEnum = enum_namespace() -greaterthan = express_getattr(IfcBenchmarkEnum, 'GREATERTHAN', INDETERMINATE) -greaterthanorequalto = express_getattr(IfcBenchmarkEnum, 'GREATERTHANOREQUALTO', INDETERMINATE) -lessthan = express_getattr(IfcBenchmarkEnum, 'LESSTHAN', INDETERMINATE) -lessthanorequalto = express_getattr(IfcBenchmarkEnum, 'LESSTHANOREQUALTO', INDETERMINATE) -equalto = express_getattr(IfcBenchmarkEnum, 'EQUALTO', INDETERMINATE) -notequalto = express_getattr(IfcBenchmarkEnum, 'NOTEQUALTO', INDETERMINATE) -includes = express_getattr(IfcBenchmarkEnum, 'INCLUDES', INDETERMINATE) -notincludes = express_getattr(IfcBenchmarkEnum, 'NOTINCLUDES', INDETERMINATE) -includedin = express_getattr(IfcBenchmarkEnum, 'INCLUDEDIN', INDETERMINATE) -notincludedin = express_getattr(IfcBenchmarkEnum, 'NOTINCLUDEDIN', INDETERMINATE) +greaterthan = IfcBenchmarkEnum.GREATERTHAN +greaterthanorequalto = IfcBenchmarkEnum.GREATERTHANOREQUALTO +lessthan = IfcBenchmarkEnum.LESSTHAN +lessthanorequalto = IfcBenchmarkEnum.LESSTHANOREQUALTO +equalto = IfcBenchmarkEnum.EQUALTO +notequalto = IfcBenchmarkEnum.NOTEQUALTO +includes = IfcBenchmarkEnum.INCLUDES +notincludes = IfcBenchmarkEnum.NOTINCLUDES +includedin = IfcBenchmarkEnum.INCLUDEDIN +notincludedin = IfcBenchmarkEnum.NOTINCLUDEDIN IfcBoilerTypeEnum = enum_namespace() -water = express_getattr(IfcBoilerTypeEnum, 'WATER', INDETERMINATE) -steam = express_getattr(IfcBoilerTypeEnum, 'STEAM', INDETERMINATE) -userdefined = express_getattr(IfcBoilerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBoilerTypeEnum, 'NOTDEFINED', INDETERMINATE) +water = IfcBoilerTypeEnum.WATER +steam = IfcBoilerTypeEnum.STEAM +userdefined = IfcBoilerTypeEnum.USERDEFINED +notdefined = IfcBoilerTypeEnum.NOTDEFINED IfcBooleanOperator = enum_namespace() -union = express_getattr(IfcBooleanOperator, 'UNION', INDETERMINATE) -intersection = express_getattr(IfcBooleanOperator, 'INTERSECTION', INDETERMINATE) -difference = express_getattr(IfcBooleanOperator, 'DIFFERENCE', INDETERMINATE) +union = IfcBooleanOperator.UNION +intersection = IfcBooleanOperator.INTERSECTION +difference = IfcBooleanOperator.DIFFERENCE IfcBridgePartTypeEnum = enum_namespace() -abutment = express_getattr(IfcBridgePartTypeEnum, 'ABUTMENT', INDETERMINATE) -deck = express_getattr(IfcBridgePartTypeEnum, 'DECK', INDETERMINATE) -deck_segment = express_getattr(IfcBridgePartTypeEnum, 'DECK_SEGMENT', INDETERMINATE) -foundation = express_getattr(IfcBridgePartTypeEnum, 'FOUNDATION', INDETERMINATE) -pier = express_getattr(IfcBridgePartTypeEnum, 'PIER', INDETERMINATE) -pier_segment = express_getattr(IfcBridgePartTypeEnum, 'PIER_SEGMENT', INDETERMINATE) -pylon = express_getattr(IfcBridgePartTypeEnum, 'PYLON', INDETERMINATE) -substructure = express_getattr(IfcBridgePartTypeEnum, 'SUBSTRUCTURE', INDETERMINATE) -superstructure = express_getattr(IfcBridgePartTypeEnum, 'SUPERSTRUCTURE', INDETERMINATE) -surfacestructure = express_getattr(IfcBridgePartTypeEnum, 'SURFACESTRUCTURE', INDETERMINATE) -userdefined = express_getattr(IfcBridgePartTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBridgePartTypeEnum, 'NOTDEFINED', INDETERMINATE) +abutment = IfcBridgePartTypeEnum.ABUTMENT +deck = IfcBridgePartTypeEnum.DECK +deck_segment = IfcBridgePartTypeEnum.DECK_SEGMENT +foundation = IfcBridgePartTypeEnum.FOUNDATION +pier = IfcBridgePartTypeEnum.PIER +pier_segment = IfcBridgePartTypeEnum.PIER_SEGMENT +pylon = IfcBridgePartTypeEnum.PYLON +substructure = IfcBridgePartTypeEnum.SUBSTRUCTURE +superstructure = IfcBridgePartTypeEnum.SUPERSTRUCTURE +surfacestructure = IfcBridgePartTypeEnum.SURFACESTRUCTURE +userdefined = IfcBridgePartTypeEnum.USERDEFINED +notdefined = IfcBridgePartTypeEnum.NOTDEFINED IfcBridgeTypeEnum = enum_namespace() -arched = express_getattr(IfcBridgeTypeEnum, 'ARCHED', INDETERMINATE) -cable_stayed = express_getattr(IfcBridgeTypeEnum, 'CABLE_STAYED', INDETERMINATE) -cantilever = express_getattr(IfcBridgeTypeEnum, 'CANTILEVER', INDETERMINATE) -culvert = express_getattr(IfcBridgeTypeEnum, 'CULVERT', INDETERMINATE) -framework = express_getattr(IfcBridgeTypeEnum, 'FRAMEWORK', INDETERMINATE) -girder = express_getattr(IfcBridgeTypeEnum, 'GIRDER', INDETERMINATE) -suspension = express_getattr(IfcBridgeTypeEnum, 'SUSPENSION', INDETERMINATE) -truss = express_getattr(IfcBridgeTypeEnum, 'TRUSS', INDETERMINATE) -userdefined = express_getattr(IfcBridgeTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBridgeTypeEnum, 'NOTDEFINED', INDETERMINATE) +arched = IfcBridgeTypeEnum.ARCHED +cable_stayed = IfcBridgeTypeEnum.CABLE_STAYED +cantilever = IfcBridgeTypeEnum.CANTILEVER +culvert = IfcBridgeTypeEnum.CULVERT +framework = IfcBridgeTypeEnum.FRAMEWORK +girder = IfcBridgeTypeEnum.GIRDER +suspension = IfcBridgeTypeEnum.SUSPENSION +truss = IfcBridgeTypeEnum.TRUSS +userdefined = IfcBridgeTypeEnum.USERDEFINED +notdefined = IfcBridgeTypeEnum.NOTDEFINED IfcBuildingElementPartTypeEnum = enum_namespace() -insulation = express_getattr(IfcBuildingElementPartTypeEnum, 'INSULATION', INDETERMINATE) -precastpanel = express_getattr(IfcBuildingElementPartTypeEnum, 'PRECASTPANEL', INDETERMINATE) -apron = express_getattr(IfcBuildingElementPartTypeEnum, 'APRON', INDETERMINATE) -userdefined = express_getattr(IfcBuildingElementPartTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBuildingElementPartTypeEnum, 'NOTDEFINED', INDETERMINATE) +insulation = IfcBuildingElementPartTypeEnum.INSULATION +precastpanel = IfcBuildingElementPartTypeEnum.PRECASTPANEL +apron = IfcBuildingElementPartTypeEnum.APRON +userdefined = IfcBuildingElementPartTypeEnum.USERDEFINED +notdefined = IfcBuildingElementPartTypeEnum.NOTDEFINED IfcBuildingElementProxyTypeEnum = enum_namespace() -complex = express_getattr(IfcBuildingElementProxyTypeEnum, 'COMPLEX', INDETERMINATE) -element = express_getattr(IfcBuildingElementProxyTypeEnum, 'ELEMENT', INDETERMINATE) -partial = express_getattr(IfcBuildingElementProxyTypeEnum, 'PARTIAL', INDETERMINATE) -provisionforvoid = express_getattr(IfcBuildingElementProxyTypeEnum, 'PROVISIONFORVOID', INDETERMINATE) -provisionforspace = express_getattr(IfcBuildingElementProxyTypeEnum, 'PROVISIONFORSPACE', INDETERMINATE) -userdefined = express_getattr(IfcBuildingElementProxyTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBuildingElementProxyTypeEnum, 'NOTDEFINED', INDETERMINATE) +complex = IfcBuildingElementProxyTypeEnum.COMPLEX +element = IfcBuildingElementProxyTypeEnum.ELEMENT +partial = IfcBuildingElementProxyTypeEnum.PARTIAL +provisionforvoid = IfcBuildingElementProxyTypeEnum.PROVISIONFORVOID +provisionforspace = IfcBuildingElementProxyTypeEnum.PROVISIONFORSPACE +userdefined = IfcBuildingElementProxyTypeEnum.USERDEFINED +notdefined = IfcBuildingElementProxyTypeEnum.NOTDEFINED IfcBuildingSystemTypeEnum = enum_namespace() -fenestration = express_getattr(IfcBuildingSystemTypeEnum, 'FENESTRATION', INDETERMINATE) -foundation = express_getattr(IfcBuildingSystemTypeEnum, 'FOUNDATION', INDETERMINATE) -loadbearing = express_getattr(IfcBuildingSystemTypeEnum, 'LOADBEARING', INDETERMINATE) -outershell = express_getattr(IfcBuildingSystemTypeEnum, 'OUTERSHELL', INDETERMINATE) -shading = express_getattr(IfcBuildingSystemTypeEnum, 'SHADING', INDETERMINATE) -transport = express_getattr(IfcBuildingSystemTypeEnum, 'TRANSPORT', INDETERMINATE) -reinforcing = express_getattr(IfcBuildingSystemTypeEnum, 'REINFORCING', INDETERMINATE) -prestressing = express_getattr(IfcBuildingSystemTypeEnum, 'PRESTRESSING', INDETERMINATE) -userdefined = express_getattr(IfcBuildingSystemTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBuildingSystemTypeEnum, 'NOTDEFINED', INDETERMINATE) +fenestration = IfcBuildingSystemTypeEnum.FENESTRATION +foundation = IfcBuildingSystemTypeEnum.FOUNDATION +loadbearing = IfcBuildingSystemTypeEnum.LOADBEARING +outershell = IfcBuildingSystemTypeEnum.OUTERSHELL +shading = IfcBuildingSystemTypeEnum.SHADING +transport = IfcBuildingSystemTypeEnum.TRANSPORT +reinforcing = IfcBuildingSystemTypeEnum.REINFORCING +prestressing = IfcBuildingSystemTypeEnum.PRESTRESSING +userdefined = IfcBuildingSystemTypeEnum.USERDEFINED +notdefined = IfcBuildingSystemTypeEnum.NOTDEFINED IfcBurnerTypeEnum = enum_namespace() -userdefined = express_getattr(IfcBurnerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBurnerTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcBurnerTypeEnum.USERDEFINED +notdefined = IfcBurnerTypeEnum.NOTDEFINED IfcCableCarrierFittingTypeEnum = enum_namespace() -bend = express_getattr(IfcCableCarrierFittingTypeEnum, 'BEND', INDETERMINATE) -cross = express_getattr(IfcCableCarrierFittingTypeEnum, 'CROSS', INDETERMINATE) -reducer = express_getattr(IfcCableCarrierFittingTypeEnum, 'REDUCER', INDETERMINATE) -tee = express_getattr(IfcCableCarrierFittingTypeEnum, 'TEE', INDETERMINATE) -userdefined = express_getattr(IfcCableCarrierFittingTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCableCarrierFittingTypeEnum, 'NOTDEFINED', INDETERMINATE) +bend = IfcCableCarrierFittingTypeEnum.BEND +cross = IfcCableCarrierFittingTypeEnum.CROSS +reducer = IfcCableCarrierFittingTypeEnum.REDUCER +tee = IfcCableCarrierFittingTypeEnum.TEE +userdefined = IfcCableCarrierFittingTypeEnum.USERDEFINED +notdefined = IfcCableCarrierFittingTypeEnum.NOTDEFINED IfcCableCarrierSegmentTypeEnum = enum_namespace() -cableladdersegment = express_getattr(IfcCableCarrierSegmentTypeEnum, 'CABLELADDERSEGMENT', INDETERMINATE) -cabletraysegment = express_getattr(IfcCableCarrierSegmentTypeEnum, 'CABLETRAYSEGMENT', INDETERMINATE) -cabletrunkingsegment = express_getattr(IfcCableCarrierSegmentTypeEnum, 'CABLETRUNKINGSEGMENT', INDETERMINATE) -conduitsegment = express_getattr(IfcCableCarrierSegmentTypeEnum, 'CONDUITSEGMENT', INDETERMINATE) -userdefined = express_getattr(IfcCableCarrierSegmentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCableCarrierSegmentTypeEnum, 'NOTDEFINED', INDETERMINATE) +cableladdersegment = IfcCableCarrierSegmentTypeEnum.CABLELADDERSEGMENT +cabletraysegment = IfcCableCarrierSegmentTypeEnum.CABLETRAYSEGMENT +cabletrunkingsegment = IfcCableCarrierSegmentTypeEnum.CABLETRUNKINGSEGMENT +conduitsegment = IfcCableCarrierSegmentTypeEnum.CONDUITSEGMENT +userdefined = IfcCableCarrierSegmentTypeEnum.USERDEFINED +notdefined = IfcCableCarrierSegmentTypeEnum.NOTDEFINED IfcCableFittingTypeEnum = enum_namespace() -connector = express_getattr(IfcCableFittingTypeEnum, 'CONNECTOR', INDETERMINATE) -entry = express_getattr(IfcCableFittingTypeEnum, 'ENTRY', INDETERMINATE) -exit = express_getattr(IfcCableFittingTypeEnum, 'EXIT', INDETERMINATE) -junction = express_getattr(IfcCableFittingTypeEnum, 'JUNCTION', INDETERMINATE) -transition = express_getattr(IfcCableFittingTypeEnum, 'TRANSITION', INDETERMINATE) -userdefined = express_getattr(IfcCableFittingTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCableFittingTypeEnum, 'NOTDEFINED', INDETERMINATE) +connector = IfcCableFittingTypeEnum.CONNECTOR +entry = IfcCableFittingTypeEnum.ENTRY +exit = IfcCableFittingTypeEnum.EXIT +junction = IfcCableFittingTypeEnum.JUNCTION +transition = IfcCableFittingTypeEnum.TRANSITION +userdefined = IfcCableFittingTypeEnum.USERDEFINED +notdefined = IfcCableFittingTypeEnum.NOTDEFINED IfcCableSegmentTypeEnum = enum_namespace() -busbarsegment = express_getattr(IfcCableSegmentTypeEnum, 'BUSBARSEGMENT', INDETERMINATE) -cablesegment = express_getattr(IfcCableSegmentTypeEnum, 'CABLESEGMENT', INDETERMINATE) -conductorsegment = express_getattr(IfcCableSegmentTypeEnum, 'CONDUCTORSEGMENT', INDETERMINATE) -coresegment = express_getattr(IfcCableSegmentTypeEnum, 'CORESEGMENT', INDETERMINATE) -userdefined = express_getattr(IfcCableSegmentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCableSegmentTypeEnum, 'NOTDEFINED', INDETERMINATE) +busbarsegment = IfcCableSegmentTypeEnum.BUSBARSEGMENT +cablesegment = IfcCableSegmentTypeEnum.CABLESEGMENT +conductorsegment = IfcCableSegmentTypeEnum.CONDUCTORSEGMENT +coresegment = IfcCableSegmentTypeEnum.CORESEGMENT +userdefined = IfcCableSegmentTypeEnum.USERDEFINED +notdefined = IfcCableSegmentTypeEnum.NOTDEFINED IfcCaissonFoundationTypeEnum = enum_namespace() -well = express_getattr(IfcCaissonFoundationTypeEnum, 'WELL', INDETERMINATE) -caisson = express_getattr(IfcCaissonFoundationTypeEnum, 'CAISSON', INDETERMINATE) -userdefined = express_getattr(IfcCaissonFoundationTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCaissonFoundationTypeEnum, 'NOTDEFINED', INDETERMINATE) +well = IfcCaissonFoundationTypeEnum.WELL +caisson = IfcCaissonFoundationTypeEnum.CAISSON +userdefined = IfcCaissonFoundationTypeEnum.USERDEFINED +notdefined = IfcCaissonFoundationTypeEnum.NOTDEFINED IfcChangeActionEnum = enum_namespace() -nochange = express_getattr(IfcChangeActionEnum, 'NOCHANGE', INDETERMINATE) -modified = express_getattr(IfcChangeActionEnum, 'MODIFIED', INDETERMINATE) -added = express_getattr(IfcChangeActionEnum, 'ADDED', INDETERMINATE) -deleted = express_getattr(IfcChangeActionEnum, 'DELETED', INDETERMINATE) -notdefined = express_getattr(IfcChangeActionEnum, 'NOTDEFINED', INDETERMINATE) +nochange = IfcChangeActionEnum.NOCHANGE +modified = IfcChangeActionEnum.MODIFIED +added = IfcChangeActionEnum.ADDED +deleted = IfcChangeActionEnum.DELETED +notdefined = IfcChangeActionEnum.NOTDEFINED IfcChillerTypeEnum = enum_namespace() -aircooled = express_getattr(IfcChillerTypeEnum, 'AIRCOOLED', INDETERMINATE) -watercooled = express_getattr(IfcChillerTypeEnum, 'WATERCOOLED', INDETERMINATE) -heatrecovery = express_getattr(IfcChillerTypeEnum, 'HEATRECOVERY', INDETERMINATE) -userdefined = express_getattr(IfcChillerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcChillerTypeEnum, 'NOTDEFINED', INDETERMINATE) +aircooled = IfcChillerTypeEnum.AIRCOOLED +watercooled = IfcChillerTypeEnum.WATERCOOLED +heatrecovery = IfcChillerTypeEnum.HEATRECOVERY +userdefined = IfcChillerTypeEnum.USERDEFINED +notdefined = IfcChillerTypeEnum.NOTDEFINED IfcChimneyTypeEnum = enum_namespace() -userdefined = express_getattr(IfcChimneyTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcChimneyTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcChimneyTypeEnum.USERDEFINED +notdefined = IfcChimneyTypeEnum.NOTDEFINED IfcCoilTypeEnum = enum_namespace() -dxcoolingcoil = express_getattr(IfcCoilTypeEnum, 'DXCOOLINGCOIL', INDETERMINATE) -electricheatingcoil = express_getattr(IfcCoilTypeEnum, 'ELECTRICHEATINGCOIL', INDETERMINATE) -gasheatingcoil = express_getattr(IfcCoilTypeEnum, 'GASHEATINGCOIL', INDETERMINATE) -hydroniccoil = express_getattr(IfcCoilTypeEnum, 'HYDRONICCOIL', INDETERMINATE) -steamheatingcoil = express_getattr(IfcCoilTypeEnum, 'STEAMHEATINGCOIL', INDETERMINATE) -watercoolingcoil = express_getattr(IfcCoilTypeEnum, 'WATERCOOLINGCOIL', INDETERMINATE) -waterheatingcoil = express_getattr(IfcCoilTypeEnum, 'WATERHEATINGCOIL', INDETERMINATE) -userdefined = express_getattr(IfcCoilTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCoilTypeEnum, 'NOTDEFINED', INDETERMINATE) +dxcoolingcoil = IfcCoilTypeEnum.DXCOOLINGCOIL +electricheatingcoil = IfcCoilTypeEnum.ELECTRICHEATINGCOIL +gasheatingcoil = IfcCoilTypeEnum.GASHEATINGCOIL +hydroniccoil = IfcCoilTypeEnum.HYDRONICCOIL +steamheatingcoil = IfcCoilTypeEnum.STEAMHEATINGCOIL +watercoolingcoil = IfcCoilTypeEnum.WATERCOOLINGCOIL +waterheatingcoil = IfcCoilTypeEnum.WATERHEATINGCOIL +userdefined = IfcCoilTypeEnum.USERDEFINED +notdefined = IfcCoilTypeEnum.NOTDEFINED IfcColumnTypeEnum = enum_namespace() -column = express_getattr(IfcColumnTypeEnum, 'COLUMN', INDETERMINATE) -pilaster = express_getattr(IfcColumnTypeEnum, 'PILASTER', INDETERMINATE) -pierstem = express_getattr(IfcColumnTypeEnum, 'PIERSTEM', INDETERMINATE) -pierstem_segment = express_getattr(IfcColumnTypeEnum, 'PIERSTEM_SEGMENT', INDETERMINATE) -standcolumn = express_getattr(IfcColumnTypeEnum, 'STANDCOLUMN', INDETERMINATE) -userdefined = express_getattr(IfcColumnTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcColumnTypeEnum, 'NOTDEFINED', INDETERMINATE) +column = IfcColumnTypeEnum.COLUMN +pilaster = IfcColumnTypeEnum.PILASTER +pierstem = IfcColumnTypeEnum.PIERSTEM +pierstem_segment = IfcColumnTypeEnum.PIERSTEM_SEGMENT +standcolumn = IfcColumnTypeEnum.STANDCOLUMN +userdefined = IfcColumnTypeEnum.USERDEFINED +notdefined = IfcColumnTypeEnum.NOTDEFINED IfcCommunicationsApplianceTypeEnum = enum_namespace() -antenna = express_getattr(IfcCommunicationsApplianceTypeEnum, 'ANTENNA', INDETERMINATE) -computer = express_getattr(IfcCommunicationsApplianceTypeEnum, 'COMPUTER', INDETERMINATE) -fax = express_getattr(IfcCommunicationsApplianceTypeEnum, 'FAX', INDETERMINATE) -gateway = express_getattr(IfcCommunicationsApplianceTypeEnum, 'GATEWAY', INDETERMINATE) -modem = express_getattr(IfcCommunicationsApplianceTypeEnum, 'MODEM', INDETERMINATE) -networkappliance = express_getattr(IfcCommunicationsApplianceTypeEnum, 'NETWORKAPPLIANCE', INDETERMINATE) -networkbridge = express_getattr(IfcCommunicationsApplianceTypeEnum, 'NETWORKBRIDGE', INDETERMINATE) -networkhub = express_getattr(IfcCommunicationsApplianceTypeEnum, 'NETWORKHUB', INDETERMINATE) -printer = express_getattr(IfcCommunicationsApplianceTypeEnum, 'PRINTER', INDETERMINATE) -repeater = express_getattr(IfcCommunicationsApplianceTypeEnum, 'REPEATER', INDETERMINATE) -router = express_getattr(IfcCommunicationsApplianceTypeEnum, 'ROUTER', INDETERMINATE) -scanner = express_getattr(IfcCommunicationsApplianceTypeEnum, 'SCANNER', INDETERMINATE) -userdefined = express_getattr(IfcCommunicationsApplianceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCommunicationsApplianceTypeEnum, 'NOTDEFINED', INDETERMINATE) +antenna = IfcCommunicationsApplianceTypeEnum.ANTENNA +computer = IfcCommunicationsApplianceTypeEnum.COMPUTER +fax = IfcCommunicationsApplianceTypeEnum.FAX +gateway = IfcCommunicationsApplianceTypeEnum.GATEWAY +modem = IfcCommunicationsApplianceTypeEnum.MODEM +networkappliance = IfcCommunicationsApplianceTypeEnum.NETWORKAPPLIANCE +networkbridge = IfcCommunicationsApplianceTypeEnum.NETWORKBRIDGE +networkhub = IfcCommunicationsApplianceTypeEnum.NETWORKHUB +printer = IfcCommunicationsApplianceTypeEnum.PRINTER +repeater = IfcCommunicationsApplianceTypeEnum.REPEATER +router = IfcCommunicationsApplianceTypeEnum.ROUTER +scanner = IfcCommunicationsApplianceTypeEnum.SCANNER +userdefined = IfcCommunicationsApplianceTypeEnum.USERDEFINED +notdefined = IfcCommunicationsApplianceTypeEnum.NOTDEFINED IfcComplexPropertyTemplateTypeEnum = enum_namespace() -p_complex = express_getattr(IfcComplexPropertyTemplateTypeEnum, 'P_COMPLEX', INDETERMINATE) -q_complex = express_getattr(IfcComplexPropertyTemplateTypeEnum, 'Q_COMPLEX', INDETERMINATE) +p_complex = IfcComplexPropertyTemplateTypeEnum.P_COMPLEX +q_complex = IfcComplexPropertyTemplateTypeEnum.Q_COMPLEX IfcCompressorTypeEnum = enum_namespace() -dynamic = express_getattr(IfcCompressorTypeEnum, 'DYNAMIC', INDETERMINATE) -reciprocating = express_getattr(IfcCompressorTypeEnum, 'RECIPROCATING', INDETERMINATE) -rotary = express_getattr(IfcCompressorTypeEnum, 'ROTARY', INDETERMINATE) -scroll = express_getattr(IfcCompressorTypeEnum, 'SCROLL', INDETERMINATE) -trochoidal = express_getattr(IfcCompressorTypeEnum, 'TROCHOIDAL', INDETERMINATE) -singlestage = express_getattr(IfcCompressorTypeEnum, 'SINGLESTAGE', INDETERMINATE) -booster = express_getattr(IfcCompressorTypeEnum, 'BOOSTER', INDETERMINATE) -opentype = express_getattr(IfcCompressorTypeEnum, 'OPENTYPE', INDETERMINATE) -hermetic = express_getattr(IfcCompressorTypeEnum, 'HERMETIC', INDETERMINATE) -semihermetic = express_getattr(IfcCompressorTypeEnum, 'SEMIHERMETIC', INDETERMINATE) -weldedshellhermetic = express_getattr(IfcCompressorTypeEnum, 'WELDEDSHELLHERMETIC', INDETERMINATE) -rollingpiston = express_getattr(IfcCompressorTypeEnum, 'ROLLINGPISTON', INDETERMINATE) -rotaryvane = express_getattr(IfcCompressorTypeEnum, 'ROTARYVANE', INDETERMINATE) -singlescrew = express_getattr(IfcCompressorTypeEnum, 'SINGLESCREW', INDETERMINATE) -twinscrew = express_getattr(IfcCompressorTypeEnum, 'TWINSCREW', INDETERMINATE) -userdefined = express_getattr(IfcCompressorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCompressorTypeEnum, 'NOTDEFINED', INDETERMINATE) +dynamic = IfcCompressorTypeEnum.DYNAMIC +reciprocating = IfcCompressorTypeEnum.RECIPROCATING +rotary = IfcCompressorTypeEnum.ROTARY +scroll = IfcCompressorTypeEnum.SCROLL +trochoidal = IfcCompressorTypeEnum.TROCHOIDAL +singlestage = IfcCompressorTypeEnum.SINGLESTAGE +booster = IfcCompressorTypeEnum.BOOSTER +opentype = IfcCompressorTypeEnum.OPENTYPE +hermetic = IfcCompressorTypeEnum.HERMETIC +semihermetic = IfcCompressorTypeEnum.SEMIHERMETIC +weldedshellhermetic = IfcCompressorTypeEnum.WELDEDSHELLHERMETIC +rollingpiston = IfcCompressorTypeEnum.ROLLINGPISTON +rotaryvane = IfcCompressorTypeEnum.ROTARYVANE +singlescrew = IfcCompressorTypeEnum.SINGLESCREW +twinscrew = IfcCompressorTypeEnum.TWINSCREW +userdefined = IfcCompressorTypeEnum.USERDEFINED +notdefined = IfcCompressorTypeEnum.NOTDEFINED IfcCondenserTypeEnum = enum_namespace() -aircooled = express_getattr(IfcCondenserTypeEnum, 'AIRCOOLED', INDETERMINATE) -evaporativecooled = express_getattr(IfcCondenserTypeEnum, 'EVAPORATIVECOOLED', INDETERMINATE) -watercooled = express_getattr(IfcCondenserTypeEnum, 'WATERCOOLED', INDETERMINATE) -watercooledbrazedplate = express_getattr(IfcCondenserTypeEnum, 'WATERCOOLEDBRAZEDPLATE', INDETERMINATE) -watercooledshellcoil = express_getattr(IfcCondenserTypeEnum, 'WATERCOOLEDSHELLCOIL', INDETERMINATE) -watercooledshelltube = express_getattr(IfcCondenserTypeEnum, 'WATERCOOLEDSHELLTUBE', INDETERMINATE) -watercooledtubeintube = express_getattr(IfcCondenserTypeEnum, 'WATERCOOLEDTUBEINTUBE', INDETERMINATE) -userdefined = express_getattr(IfcCondenserTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCondenserTypeEnum, 'NOTDEFINED', INDETERMINATE) +aircooled = IfcCondenserTypeEnum.AIRCOOLED +evaporativecooled = IfcCondenserTypeEnum.EVAPORATIVECOOLED +watercooled = IfcCondenserTypeEnum.WATERCOOLED +watercooledbrazedplate = IfcCondenserTypeEnum.WATERCOOLEDBRAZEDPLATE +watercooledshellcoil = IfcCondenserTypeEnum.WATERCOOLEDSHELLCOIL +watercooledshelltube = IfcCondenserTypeEnum.WATERCOOLEDSHELLTUBE +watercooledtubeintube = IfcCondenserTypeEnum.WATERCOOLEDTUBEINTUBE +userdefined = IfcCondenserTypeEnum.USERDEFINED +notdefined = IfcCondenserTypeEnum.NOTDEFINED IfcConnectionTypeEnum = enum_namespace() -atpath = express_getattr(IfcConnectionTypeEnum, 'ATPATH', INDETERMINATE) -atstart = express_getattr(IfcConnectionTypeEnum, 'ATSTART', INDETERMINATE) -atend = express_getattr(IfcConnectionTypeEnum, 'ATEND', INDETERMINATE) -notdefined = express_getattr(IfcConnectionTypeEnum, 'NOTDEFINED', INDETERMINATE) +atpath = IfcConnectionTypeEnum.ATPATH +atstart = IfcConnectionTypeEnum.ATSTART +atend = IfcConnectionTypeEnum.ATEND +notdefined = IfcConnectionTypeEnum.NOTDEFINED IfcConstraintEnum = enum_namespace() -hard = express_getattr(IfcConstraintEnum, 'HARD', INDETERMINATE) -soft = express_getattr(IfcConstraintEnum, 'SOFT', INDETERMINATE) -advisory = express_getattr(IfcConstraintEnum, 'ADVISORY', INDETERMINATE) -userdefined = express_getattr(IfcConstraintEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcConstraintEnum, 'NOTDEFINED', INDETERMINATE) +hard = IfcConstraintEnum.HARD +soft = IfcConstraintEnum.SOFT +advisory = IfcConstraintEnum.ADVISORY +userdefined = IfcConstraintEnum.USERDEFINED +notdefined = IfcConstraintEnum.NOTDEFINED IfcConstructionEquipmentResourceTypeEnum = enum_namespace() -demolishing = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'DEMOLISHING', INDETERMINATE) -earthmoving = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'EARTHMOVING', INDETERMINATE) -erecting = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'ERECTING', INDETERMINATE) -heating = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'HEATING', INDETERMINATE) -lighting = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'LIGHTING', INDETERMINATE) -paving = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'PAVING', INDETERMINATE) -pumping = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'PUMPING', INDETERMINATE) -transporting = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'TRANSPORTING', INDETERMINATE) -userdefined = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'NOTDEFINED', INDETERMINATE) +demolishing = IfcConstructionEquipmentResourceTypeEnum.DEMOLISHING +earthmoving = IfcConstructionEquipmentResourceTypeEnum.EARTHMOVING +erecting = IfcConstructionEquipmentResourceTypeEnum.ERECTING +heating = IfcConstructionEquipmentResourceTypeEnum.HEATING +lighting = IfcConstructionEquipmentResourceTypeEnum.LIGHTING +paving = IfcConstructionEquipmentResourceTypeEnum.PAVING +pumping = IfcConstructionEquipmentResourceTypeEnum.PUMPING +transporting = IfcConstructionEquipmentResourceTypeEnum.TRANSPORTING +userdefined = IfcConstructionEquipmentResourceTypeEnum.USERDEFINED +notdefined = IfcConstructionEquipmentResourceTypeEnum.NOTDEFINED IfcConstructionMaterialResourceTypeEnum = enum_namespace() -aggregates = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'AGGREGATES', INDETERMINATE) -concrete = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'CONCRETE', INDETERMINATE) -drywall = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'DRYWALL', INDETERMINATE) -fuel = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'FUEL', INDETERMINATE) -gypsum = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'GYPSUM', INDETERMINATE) -masonry = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'MASONRY', INDETERMINATE) -metal = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'METAL', INDETERMINATE) -plastic = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'PLASTIC', INDETERMINATE) -wood = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'WOOD', INDETERMINATE) -notdefined = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'NOTDEFINED', INDETERMINATE) -userdefined = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'USERDEFINED', INDETERMINATE) +aggregates = IfcConstructionMaterialResourceTypeEnum.AGGREGATES +concrete = IfcConstructionMaterialResourceTypeEnum.CONCRETE +drywall = IfcConstructionMaterialResourceTypeEnum.DRYWALL +fuel = IfcConstructionMaterialResourceTypeEnum.FUEL +gypsum = IfcConstructionMaterialResourceTypeEnum.GYPSUM +masonry = IfcConstructionMaterialResourceTypeEnum.MASONRY +metal = IfcConstructionMaterialResourceTypeEnum.METAL +plastic = IfcConstructionMaterialResourceTypeEnum.PLASTIC +wood = IfcConstructionMaterialResourceTypeEnum.WOOD +notdefined = IfcConstructionMaterialResourceTypeEnum.NOTDEFINED +userdefined = IfcConstructionMaterialResourceTypeEnum.USERDEFINED IfcConstructionProductResourceTypeEnum = enum_namespace() -assembly = express_getattr(IfcConstructionProductResourceTypeEnum, 'ASSEMBLY', INDETERMINATE) -formwork = express_getattr(IfcConstructionProductResourceTypeEnum, 'FORMWORK', INDETERMINATE) -userdefined = express_getattr(IfcConstructionProductResourceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcConstructionProductResourceTypeEnum, 'NOTDEFINED', INDETERMINATE) +assembly = IfcConstructionProductResourceTypeEnum.ASSEMBLY +formwork = IfcConstructionProductResourceTypeEnum.FORMWORK +userdefined = IfcConstructionProductResourceTypeEnum.USERDEFINED +notdefined = IfcConstructionProductResourceTypeEnum.NOTDEFINED IfcControllerTypeEnum = enum_namespace() -floating = express_getattr(IfcControllerTypeEnum, 'FLOATING', INDETERMINATE) -programmable = express_getattr(IfcControllerTypeEnum, 'PROGRAMMABLE', INDETERMINATE) -proportional = express_getattr(IfcControllerTypeEnum, 'PROPORTIONAL', INDETERMINATE) -multiposition = express_getattr(IfcControllerTypeEnum, 'MULTIPOSITION', INDETERMINATE) -twoposition = express_getattr(IfcControllerTypeEnum, 'TWOPOSITION', INDETERMINATE) -userdefined = express_getattr(IfcControllerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcControllerTypeEnum, 'NOTDEFINED', INDETERMINATE) +floating = IfcControllerTypeEnum.FLOATING +programmable = IfcControllerTypeEnum.PROGRAMMABLE +proportional = IfcControllerTypeEnum.PROPORTIONAL +multiposition = IfcControllerTypeEnum.MULTIPOSITION +twoposition = IfcControllerTypeEnum.TWOPOSITION +userdefined = IfcControllerTypeEnum.USERDEFINED +notdefined = IfcControllerTypeEnum.NOTDEFINED IfcCooledBeamTypeEnum = enum_namespace() -active = express_getattr(IfcCooledBeamTypeEnum, 'ACTIVE', INDETERMINATE) -passive = express_getattr(IfcCooledBeamTypeEnum, 'PASSIVE', INDETERMINATE) -userdefined = express_getattr(IfcCooledBeamTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCooledBeamTypeEnum, 'NOTDEFINED', INDETERMINATE) +active = IfcCooledBeamTypeEnum.ACTIVE +passive = IfcCooledBeamTypeEnum.PASSIVE +userdefined = IfcCooledBeamTypeEnum.USERDEFINED +notdefined = IfcCooledBeamTypeEnum.NOTDEFINED IfcCoolingTowerTypeEnum = enum_namespace() -naturaldraft = express_getattr(IfcCoolingTowerTypeEnum, 'NATURALDRAFT', INDETERMINATE) -mechanicalinduceddraft = express_getattr(IfcCoolingTowerTypeEnum, 'MECHANICALINDUCEDDRAFT', INDETERMINATE) -mechanicalforceddraft = express_getattr(IfcCoolingTowerTypeEnum, 'MECHANICALFORCEDDRAFT', INDETERMINATE) -userdefined = express_getattr(IfcCoolingTowerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCoolingTowerTypeEnum, 'NOTDEFINED', INDETERMINATE) +naturaldraft = IfcCoolingTowerTypeEnum.NATURALDRAFT +mechanicalinduceddraft = IfcCoolingTowerTypeEnum.MECHANICALINDUCEDDRAFT +mechanicalforceddraft = IfcCoolingTowerTypeEnum.MECHANICALFORCEDDRAFT +userdefined = IfcCoolingTowerTypeEnum.USERDEFINED +notdefined = IfcCoolingTowerTypeEnum.NOTDEFINED IfcCostItemTypeEnum = enum_namespace() -userdefined = express_getattr(IfcCostItemTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCostItemTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcCostItemTypeEnum.USERDEFINED +notdefined = IfcCostItemTypeEnum.NOTDEFINED IfcCostScheduleTypeEnum = enum_namespace() -budget = express_getattr(IfcCostScheduleTypeEnum, 'BUDGET', INDETERMINATE) -costplan = express_getattr(IfcCostScheduleTypeEnum, 'COSTPLAN', INDETERMINATE) -estimate = express_getattr(IfcCostScheduleTypeEnum, 'ESTIMATE', INDETERMINATE) -tender = express_getattr(IfcCostScheduleTypeEnum, 'TENDER', INDETERMINATE) -pricedbillofquantities = express_getattr(IfcCostScheduleTypeEnum, 'PRICEDBILLOFQUANTITIES', INDETERMINATE) -unpricedbillofquantities = express_getattr(IfcCostScheduleTypeEnum, 'UNPRICEDBILLOFQUANTITIES', INDETERMINATE) -scheduleofrates = express_getattr(IfcCostScheduleTypeEnum, 'SCHEDULEOFRATES', INDETERMINATE) -userdefined = express_getattr(IfcCostScheduleTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCostScheduleTypeEnum, 'NOTDEFINED', INDETERMINATE) +budget = IfcCostScheduleTypeEnum.BUDGET +costplan = IfcCostScheduleTypeEnum.COSTPLAN +estimate = IfcCostScheduleTypeEnum.ESTIMATE +tender = IfcCostScheduleTypeEnum.TENDER +pricedbillofquantities = IfcCostScheduleTypeEnum.PRICEDBILLOFQUANTITIES +unpricedbillofquantities = IfcCostScheduleTypeEnum.UNPRICEDBILLOFQUANTITIES +scheduleofrates = IfcCostScheduleTypeEnum.SCHEDULEOFRATES +userdefined = IfcCostScheduleTypeEnum.USERDEFINED +notdefined = IfcCostScheduleTypeEnum.NOTDEFINED IfcCoveringTypeEnum = enum_namespace() -ceiling = express_getattr(IfcCoveringTypeEnum, 'CEILING', INDETERMINATE) -flooring = express_getattr(IfcCoveringTypeEnum, 'FLOORING', INDETERMINATE) -cladding = express_getattr(IfcCoveringTypeEnum, 'CLADDING', INDETERMINATE) -roofing = express_getattr(IfcCoveringTypeEnum, 'ROOFING', INDETERMINATE) -molding = express_getattr(IfcCoveringTypeEnum, 'MOLDING', INDETERMINATE) -skirtingboard = express_getattr(IfcCoveringTypeEnum, 'SKIRTINGBOARD', INDETERMINATE) -insulation = express_getattr(IfcCoveringTypeEnum, 'INSULATION', INDETERMINATE) -membrane = express_getattr(IfcCoveringTypeEnum, 'MEMBRANE', INDETERMINATE) -sleeving = express_getattr(IfcCoveringTypeEnum, 'SLEEVING', INDETERMINATE) -wrapping = express_getattr(IfcCoveringTypeEnum, 'WRAPPING', INDETERMINATE) -coping = express_getattr(IfcCoveringTypeEnum, 'COPING', INDETERMINATE) -userdefined = express_getattr(IfcCoveringTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCoveringTypeEnum, 'NOTDEFINED', INDETERMINATE) +ceiling = IfcCoveringTypeEnum.CEILING +flooring = IfcCoveringTypeEnum.FLOORING +cladding = IfcCoveringTypeEnum.CLADDING +roofing = IfcCoveringTypeEnum.ROOFING +molding = IfcCoveringTypeEnum.MOLDING +skirtingboard = IfcCoveringTypeEnum.SKIRTINGBOARD +insulation = IfcCoveringTypeEnum.INSULATION +membrane = IfcCoveringTypeEnum.MEMBRANE +sleeving = IfcCoveringTypeEnum.SLEEVING +wrapping = IfcCoveringTypeEnum.WRAPPING +coping = IfcCoveringTypeEnum.COPING +userdefined = IfcCoveringTypeEnum.USERDEFINED +notdefined = IfcCoveringTypeEnum.NOTDEFINED IfcCrewResourceTypeEnum = enum_namespace() -office = express_getattr(IfcCrewResourceTypeEnum, 'OFFICE', INDETERMINATE) -site = express_getattr(IfcCrewResourceTypeEnum, 'SITE', INDETERMINATE) -userdefined = express_getattr(IfcCrewResourceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCrewResourceTypeEnum, 'NOTDEFINED', INDETERMINATE) +office = IfcCrewResourceTypeEnum.OFFICE +site = IfcCrewResourceTypeEnum.SITE +userdefined = IfcCrewResourceTypeEnum.USERDEFINED +notdefined = IfcCrewResourceTypeEnum.NOTDEFINED IfcCurtainWallTypeEnum = enum_namespace() -userdefined = express_getattr(IfcCurtainWallTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCurtainWallTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcCurtainWallTypeEnum.USERDEFINED +notdefined = IfcCurtainWallTypeEnum.NOTDEFINED IfcCurveInterpolationEnum = enum_namespace() -linear = express_getattr(IfcCurveInterpolationEnum, 'LINEAR', INDETERMINATE) -log_linear = express_getattr(IfcCurveInterpolationEnum, 'LOG_LINEAR', INDETERMINATE) -log_log = express_getattr(IfcCurveInterpolationEnum, 'LOG_LOG', INDETERMINATE) -notdefined = express_getattr(IfcCurveInterpolationEnum, 'NOTDEFINED', INDETERMINATE) +linear = IfcCurveInterpolationEnum.LINEAR +log_linear = IfcCurveInterpolationEnum.LOG_LINEAR +log_log = IfcCurveInterpolationEnum.LOG_LOG +notdefined = IfcCurveInterpolationEnum.NOTDEFINED IfcDamperTypeEnum = enum_namespace() -backdraftdamper = express_getattr(IfcDamperTypeEnum, 'BACKDRAFTDAMPER', INDETERMINATE) -balancingdamper = express_getattr(IfcDamperTypeEnum, 'BALANCINGDAMPER', INDETERMINATE) -blastdamper = express_getattr(IfcDamperTypeEnum, 'BLASTDAMPER', INDETERMINATE) -controldamper = express_getattr(IfcDamperTypeEnum, 'CONTROLDAMPER', INDETERMINATE) -firedamper = express_getattr(IfcDamperTypeEnum, 'FIREDAMPER', INDETERMINATE) -firesmokedamper = express_getattr(IfcDamperTypeEnum, 'FIRESMOKEDAMPER', INDETERMINATE) -fumehoodexhaust = express_getattr(IfcDamperTypeEnum, 'FUMEHOODEXHAUST', INDETERMINATE) -gravitydamper = express_getattr(IfcDamperTypeEnum, 'GRAVITYDAMPER', INDETERMINATE) -gravityreliefdamper = express_getattr(IfcDamperTypeEnum, 'GRAVITYRELIEFDAMPER', INDETERMINATE) -reliefdamper = express_getattr(IfcDamperTypeEnum, 'RELIEFDAMPER', INDETERMINATE) -smokedamper = express_getattr(IfcDamperTypeEnum, 'SMOKEDAMPER', INDETERMINATE) -userdefined = express_getattr(IfcDamperTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDamperTypeEnum, 'NOTDEFINED', INDETERMINATE) +backdraftdamper = IfcDamperTypeEnum.BACKDRAFTDAMPER +balancingdamper = IfcDamperTypeEnum.BALANCINGDAMPER +blastdamper = IfcDamperTypeEnum.BLASTDAMPER +controldamper = IfcDamperTypeEnum.CONTROLDAMPER +firedamper = IfcDamperTypeEnum.FIREDAMPER +firesmokedamper = IfcDamperTypeEnum.FIRESMOKEDAMPER +fumehoodexhaust = IfcDamperTypeEnum.FUMEHOODEXHAUST +gravitydamper = IfcDamperTypeEnum.GRAVITYDAMPER +gravityreliefdamper = IfcDamperTypeEnum.GRAVITYRELIEFDAMPER +reliefdamper = IfcDamperTypeEnum.RELIEFDAMPER +smokedamper = IfcDamperTypeEnum.SMOKEDAMPER +userdefined = IfcDamperTypeEnum.USERDEFINED +notdefined = IfcDamperTypeEnum.NOTDEFINED IfcDataOriginEnum = enum_namespace() -measured = express_getattr(IfcDataOriginEnum, 'MEASURED', INDETERMINATE) -predicted = express_getattr(IfcDataOriginEnum, 'PREDICTED', INDETERMINATE) -simulated = express_getattr(IfcDataOriginEnum, 'SIMULATED', INDETERMINATE) -userdefined = express_getattr(IfcDataOriginEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDataOriginEnum, 'NOTDEFINED', INDETERMINATE) +measured = IfcDataOriginEnum.MEASURED +predicted = IfcDataOriginEnum.PREDICTED +simulated = IfcDataOriginEnum.SIMULATED +userdefined = IfcDataOriginEnum.USERDEFINED +notdefined = IfcDataOriginEnum.NOTDEFINED IfcDerivedUnitEnum = enum_namespace() -angularvelocityunit = express_getattr(IfcDerivedUnitEnum, 'ANGULARVELOCITYUNIT', INDETERMINATE) -areadensityunit = express_getattr(IfcDerivedUnitEnum, 'AREADENSITYUNIT', INDETERMINATE) -compoundplaneangleunit = express_getattr(IfcDerivedUnitEnum, 'COMPOUNDPLANEANGLEUNIT', INDETERMINATE) -dynamicviscosityunit = express_getattr(IfcDerivedUnitEnum, 'DYNAMICVISCOSITYUNIT', INDETERMINATE) -heatfluxdensityunit = express_getattr(IfcDerivedUnitEnum, 'HEATFLUXDENSITYUNIT', INDETERMINATE) -integercountrateunit = express_getattr(IfcDerivedUnitEnum, 'INTEGERCOUNTRATEUNIT', INDETERMINATE) -isothermalmoisturecapacityunit = express_getattr(IfcDerivedUnitEnum, 'ISOTHERMALMOISTURECAPACITYUNIT', INDETERMINATE) -kinematicviscosityunit = express_getattr(IfcDerivedUnitEnum, 'KINEMATICVISCOSITYUNIT', INDETERMINATE) -linearvelocityunit = express_getattr(IfcDerivedUnitEnum, 'LINEARVELOCITYUNIT', INDETERMINATE) -massdensityunit = express_getattr(IfcDerivedUnitEnum, 'MASSDENSITYUNIT', INDETERMINATE) -massflowrateunit = express_getattr(IfcDerivedUnitEnum, 'MASSFLOWRATEUNIT', INDETERMINATE) -moisturediffusivityunit = express_getattr(IfcDerivedUnitEnum, 'MOISTUREDIFFUSIVITYUNIT', INDETERMINATE) -molecularweightunit = express_getattr(IfcDerivedUnitEnum, 'MOLECULARWEIGHTUNIT', INDETERMINATE) -specificheatcapacityunit = express_getattr(IfcDerivedUnitEnum, 'SPECIFICHEATCAPACITYUNIT', INDETERMINATE) -thermaladmittanceunit = express_getattr(IfcDerivedUnitEnum, 'THERMALADMITTANCEUNIT', INDETERMINATE) -thermalconductanceunit = express_getattr(IfcDerivedUnitEnum, 'THERMALCONDUCTANCEUNIT', INDETERMINATE) -thermalresistanceunit = express_getattr(IfcDerivedUnitEnum, 'THERMALRESISTANCEUNIT', INDETERMINATE) -thermaltransmittanceunit = express_getattr(IfcDerivedUnitEnum, 'THERMALTRANSMITTANCEUNIT', INDETERMINATE) -vaporpermeabilityunit = express_getattr(IfcDerivedUnitEnum, 'VAPORPERMEABILITYUNIT', INDETERMINATE) -volumetricflowrateunit = express_getattr(IfcDerivedUnitEnum, 'VOLUMETRICFLOWRATEUNIT', INDETERMINATE) -rotationalfrequencyunit = express_getattr(IfcDerivedUnitEnum, 'ROTATIONALFREQUENCYUNIT', INDETERMINATE) -torqueunit = express_getattr(IfcDerivedUnitEnum, 'TORQUEUNIT', INDETERMINATE) -momentofinertiaunit = express_getattr(IfcDerivedUnitEnum, 'MOMENTOFINERTIAUNIT', INDETERMINATE) -linearmomentunit = express_getattr(IfcDerivedUnitEnum, 'LINEARMOMENTUNIT', INDETERMINATE) -linearforceunit = express_getattr(IfcDerivedUnitEnum, 'LINEARFORCEUNIT', INDETERMINATE) -planarforceunit = express_getattr(IfcDerivedUnitEnum, 'PLANARFORCEUNIT', INDETERMINATE) -modulusofelasticityunit = express_getattr(IfcDerivedUnitEnum, 'MODULUSOFELASTICITYUNIT', INDETERMINATE) -shearmodulusunit = express_getattr(IfcDerivedUnitEnum, 'SHEARMODULUSUNIT', INDETERMINATE) -linearstiffnessunit = express_getattr(IfcDerivedUnitEnum, 'LINEARSTIFFNESSUNIT', INDETERMINATE) -rotationalstiffnessunit = express_getattr(IfcDerivedUnitEnum, 'ROTATIONALSTIFFNESSUNIT', INDETERMINATE) -modulusofsubgradereactionunit = express_getattr(IfcDerivedUnitEnum, 'MODULUSOFSUBGRADEREACTIONUNIT', INDETERMINATE) -accelerationunit = express_getattr(IfcDerivedUnitEnum, 'ACCELERATIONUNIT', INDETERMINATE) -curvatureunit = express_getattr(IfcDerivedUnitEnum, 'CURVATUREUNIT', INDETERMINATE) -heatingvalueunit = express_getattr(IfcDerivedUnitEnum, 'HEATINGVALUEUNIT', INDETERMINATE) -ionconcentrationunit = express_getattr(IfcDerivedUnitEnum, 'IONCONCENTRATIONUNIT', INDETERMINATE) -luminousintensitydistributionunit = express_getattr(IfcDerivedUnitEnum, 'LUMINOUSINTENSITYDISTRIBUTIONUNIT', INDETERMINATE) -massperlengthunit = express_getattr(IfcDerivedUnitEnum, 'MASSPERLENGTHUNIT', INDETERMINATE) -modulusoflinearsubgradereactionunit = express_getattr(IfcDerivedUnitEnum, 'MODULUSOFLINEARSUBGRADEREACTIONUNIT', INDETERMINATE) -modulusofrotationalsubgradereactionunit = express_getattr(IfcDerivedUnitEnum, 'MODULUSOFROTATIONALSUBGRADEREACTIONUNIT', INDETERMINATE) -phunit = express_getattr(IfcDerivedUnitEnum, 'PHUNIT', INDETERMINATE) -rotationalmassunit = express_getattr(IfcDerivedUnitEnum, 'ROTATIONALMASSUNIT', INDETERMINATE) -sectionareaintegralunit = express_getattr(IfcDerivedUnitEnum, 'SECTIONAREAINTEGRALUNIT', INDETERMINATE) -sectionmodulusunit = express_getattr(IfcDerivedUnitEnum, 'SECTIONMODULUSUNIT', INDETERMINATE) -soundpowerlevelunit = express_getattr(IfcDerivedUnitEnum, 'SOUNDPOWERLEVELUNIT', INDETERMINATE) -soundpowerunit = express_getattr(IfcDerivedUnitEnum, 'SOUNDPOWERUNIT', INDETERMINATE) -soundpressurelevelunit = express_getattr(IfcDerivedUnitEnum, 'SOUNDPRESSURELEVELUNIT', INDETERMINATE) -soundpressureunit = express_getattr(IfcDerivedUnitEnum, 'SOUNDPRESSUREUNIT', INDETERMINATE) -temperaturegradientunit = express_getattr(IfcDerivedUnitEnum, 'TEMPERATUREGRADIENTUNIT', INDETERMINATE) -temperaturerateofchangeunit = express_getattr(IfcDerivedUnitEnum, 'TEMPERATURERATEOFCHANGEUNIT', INDETERMINATE) -thermalexpansioncoefficientunit = express_getattr(IfcDerivedUnitEnum, 'THERMALEXPANSIONCOEFFICIENTUNIT', INDETERMINATE) -warpingconstantunit = express_getattr(IfcDerivedUnitEnum, 'WARPINGCONSTANTUNIT', INDETERMINATE) -warpingmomentunit = express_getattr(IfcDerivedUnitEnum, 'WARPINGMOMENTUNIT', INDETERMINATE) -userdefined = express_getattr(IfcDerivedUnitEnum, 'USERDEFINED', INDETERMINATE) +angularvelocityunit = IfcDerivedUnitEnum.ANGULARVELOCITYUNIT +areadensityunit = IfcDerivedUnitEnum.AREADENSITYUNIT +compoundplaneangleunit = IfcDerivedUnitEnum.COMPOUNDPLANEANGLEUNIT +dynamicviscosityunit = IfcDerivedUnitEnum.DYNAMICVISCOSITYUNIT +heatfluxdensityunit = IfcDerivedUnitEnum.HEATFLUXDENSITYUNIT +integercountrateunit = IfcDerivedUnitEnum.INTEGERCOUNTRATEUNIT +isothermalmoisturecapacityunit = IfcDerivedUnitEnum.ISOTHERMALMOISTURECAPACITYUNIT +kinematicviscosityunit = IfcDerivedUnitEnum.KINEMATICVISCOSITYUNIT +linearvelocityunit = IfcDerivedUnitEnum.LINEARVELOCITYUNIT +massdensityunit = IfcDerivedUnitEnum.MASSDENSITYUNIT +massflowrateunit = IfcDerivedUnitEnum.MASSFLOWRATEUNIT +moisturediffusivityunit = IfcDerivedUnitEnum.MOISTUREDIFFUSIVITYUNIT +molecularweightunit = IfcDerivedUnitEnum.MOLECULARWEIGHTUNIT +specificheatcapacityunit = IfcDerivedUnitEnum.SPECIFICHEATCAPACITYUNIT +thermaladmittanceunit = IfcDerivedUnitEnum.THERMALADMITTANCEUNIT +thermalconductanceunit = IfcDerivedUnitEnum.THERMALCONDUCTANCEUNIT +thermalresistanceunit = IfcDerivedUnitEnum.THERMALRESISTANCEUNIT +thermaltransmittanceunit = IfcDerivedUnitEnum.THERMALTRANSMITTANCEUNIT +vaporpermeabilityunit = IfcDerivedUnitEnum.VAPORPERMEABILITYUNIT +volumetricflowrateunit = IfcDerivedUnitEnum.VOLUMETRICFLOWRATEUNIT +rotationalfrequencyunit = IfcDerivedUnitEnum.ROTATIONALFREQUENCYUNIT +torqueunit = IfcDerivedUnitEnum.TORQUEUNIT +momentofinertiaunit = IfcDerivedUnitEnum.MOMENTOFINERTIAUNIT +linearmomentunit = IfcDerivedUnitEnum.LINEARMOMENTUNIT +linearforceunit = IfcDerivedUnitEnum.LINEARFORCEUNIT +planarforceunit = IfcDerivedUnitEnum.PLANARFORCEUNIT +modulusofelasticityunit = IfcDerivedUnitEnum.MODULUSOFELASTICITYUNIT +shearmodulusunit = IfcDerivedUnitEnum.SHEARMODULUSUNIT +linearstiffnessunit = IfcDerivedUnitEnum.LINEARSTIFFNESSUNIT +rotationalstiffnessunit = IfcDerivedUnitEnum.ROTATIONALSTIFFNESSUNIT +modulusofsubgradereactionunit = IfcDerivedUnitEnum.MODULUSOFSUBGRADEREACTIONUNIT +accelerationunit = IfcDerivedUnitEnum.ACCELERATIONUNIT +curvatureunit = IfcDerivedUnitEnum.CURVATUREUNIT +heatingvalueunit = IfcDerivedUnitEnum.HEATINGVALUEUNIT +ionconcentrationunit = IfcDerivedUnitEnum.IONCONCENTRATIONUNIT +luminousintensitydistributionunit = IfcDerivedUnitEnum.LUMINOUSINTENSITYDISTRIBUTIONUNIT +massperlengthunit = IfcDerivedUnitEnum.MASSPERLENGTHUNIT +modulusoflinearsubgradereactionunit = IfcDerivedUnitEnum.MODULUSOFLINEARSUBGRADEREACTIONUNIT +modulusofrotationalsubgradereactionunit = IfcDerivedUnitEnum.MODULUSOFROTATIONALSUBGRADEREACTIONUNIT +phunit = IfcDerivedUnitEnum.PHUNIT +rotationalmassunit = IfcDerivedUnitEnum.ROTATIONALMASSUNIT +sectionareaintegralunit = IfcDerivedUnitEnum.SECTIONAREAINTEGRALUNIT +sectionmodulusunit = IfcDerivedUnitEnum.SECTIONMODULUSUNIT +soundpowerlevelunit = IfcDerivedUnitEnum.SOUNDPOWERLEVELUNIT +soundpowerunit = IfcDerivedUnitEnum.SOUNDPOWERUNIT +soundpressurelevelunit = IfcDerivedUnitEnum.SOUNDPRESSURELEVELUNIT +soundpressureunit = IfcDerivedUnitEnum.SOUNDPRESSUREUNIT +temperaturegradientunit = IfcDerivedUnitEnum.TEMPERATUREGRADIENTUNIT +temperaturerateofchangeunit = IfcDerivedUnitEnum.TEMPERATURERATEOFCHANGEUNIT +thermalexpansioncoefficientunit = IfcDerivedUnitEnum.THERMALEXPANSIONCOEFFICIENTUNIT +warpingconstantunit = IfcDerivedUnitEnum.WARPINGCONSTANTUNIT +warpingmomentunit = IfcDerivedUnitEnum.WARPINGMOMENTUNIT +userdefined = IfcDerivedUnitEnum.USERDEFINED IfcDirectionSenseEnum = enum_namespace() -positive = express_getattr(IfcDirectionSenseEnum, 'POSITIVE', INDETERMINATE) -negative = express_getattr(IfcDirectionSenseEnum, 'NEGATIVE', INDETERMINATE) +positive = IfcDirectionSenseEnum.POSITIVE +negative = IfcDirectionSenseEnum.NEGATIVE IfcDiscreteAccessoryTypeEnum = enum_namespace() -anchorplate = express_getattr(IfcDiscreteAccessoryTypeEnum, 'ANCHORPLATE', INDETERMINATE) -bracket = express_getattr(IfcDiscreteAccessoryTypeEnum, 'BRACKET', INDETERMINATE) -shoe = express_getattr(IfcDiscreteAccessoryTypeEnum, 'SHOE', INDETERMINATE) -expansion_joint_device = express_getattr(IfcDiscreteAccessoryTypeEnum, 'EXPANSION_JOINT_DEVICE', INDETERMINATE) -userdefined = express_getattr(IfcDiscreteAccessoryTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDiscreteAccessoryTypeEnum, 'NOTDEFINED', INDETERMINATE) +anchorplate = IfcDiscreteAccessoryTypeEnum.ANCHORPLATE +bracket = IfcDiscreteAccessoryTypeEnum.BRACKET +shoe = IfcDiscreteAccessoryTypeEnum.SHOE +expansion_joint_device = IfcDiscreteAccessoryTypeEnum.EXPANSION_JOINT_DEVICE +userdefined = IfcDiscreteAccessoryTypeEnum.USERDEFINED +notdefined = IfcDiscreteAccessoryTypeEnum.NOTDEFINED IfcDistributionChamberElementTypeEnum = enum_namespace() -formedduct = express_getattr(IfcDistributionChamberElementTypeEnum, 'FORMEDDUCT', INDETERMINATE) -inspectionchamber = express_getattr(IfcDistributionChamberElementTypeEnum, 'INSPECTIONCHAMBER', INDETERMINATE) -inspectionpit = express_getattr(IfcDistributionChamberElementTypeEnum, 'INSPECTIONPIT', INDETERMINATE) -manhole = express_getattr(IfcDistributionChamberElementTypeEnum, 'MANHOLE', INDETERMINATE) -meterchamber = express_getattr(IfcDistributionChamberElementTypeEnum, 'METERCHAMBER', INDETERMINATE) -sump = express_getattr(IfcDistributionChamberElementTypeEnum, 'SUMP', INDETERMINATE) -trench = express_getattr(IfcDistributionChamberElementTypeEnum, 'TRENCH', INDETERMINATE) -valvechamber = express_getattr(IfcDistributionChamberElementTypeEnum, 'VALVECHAMBER', INDETERMINATE) -userdefined = express_getattr(IfcDistributionChamberElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDistributionChamberElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +formedduct = IfcDistributionChamberElementTypeEnum.FORMEDDUCT +inspectionchamber = IfcDistributionChamberElementTypeEnum.INSPECTIONCHAMBER +inspectionpit = IfcDistributionChamberElementTypeEnum.INSPECTIONPIT +manhole = IfcDistributionChamberElementTypeEnum.MANHOLE +meterchamber = IfcDistributionChamberElementTypeEnum.METERCHAMBER +sump = IfcDistributionChamberElementTypeEnum.SUMP +trench = IfcDistributionChamberElementTypeEnum.TRENCH +valvechamber = IfcDistributionChamberElementTypeEnum.VALVECHAMBER +userdefined = IfcDistributionChamberElementTypeEnum.USERDEFINED +notdefined = IfcDistributionChamberElementTypeEnum.NOTDEFINED IfcDistributionPortTypeEnum = enum_namespace() -cable = express_getattr(IfcDistributionPortTypeEnum, 'CABLE', INDETERMINATE) -cablecarrier = express_getattr(IfcDistributionPortTypeEnum, 'CABLECARRIER', INDETERMINATE) -duct = express_getattr(IfcDistributionPortTypeEnum, 'DUCT', INDETERMINATE) -pipe = express_getattr(IfcDistributionPortTypeEnum, 'PIPE', INDETERMINATE) -userdefined = express_getattr(IfcDistributionPortTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDistributionPortTypeEnum, 'NOTDEFINED', INDETERMINATE) +cable = IfcDistributionPortTypeEnum.CABLE +cablecarrier = IfcDistributionPortTypeEnum.CABLECARRIER +duct = IfcDistributionPortTypeEnum.DUCT +pipe = IfcDistributionPortTypeEnum.PIPE +userdefined = IfcDistributionPortTypeEnum.USERDEFINED +notdefined = IfcDistributionPortTypeEnum.NOTDEFINED IfcDistributionSystemEnum = enum_namespace() -airconditioning = express_getattr(IfcDistributionSystemEnum, 'AIRCONDITIONING', INDETERMINATE) -audiovisual = express_getattr(IfcDistributionSystemEnum, 'AUDIOVISUAL', INDETERMINATE) -chemical = express_getattr(IfcDistributionSystemEnum, 'CHEMICAL', INDETERMINATE) -chilledwater = express_getattr(IfcDistributionSystemEnum, 'CHILLEDWATER', INDETERMINATE) -communication = express_getattr(IfcDistributionSystemEnum, 'COMMUNICATION', INDETERMINATE) -compressedair = express_getattr(IfcDistributionSystemEnum, 'COMPRESSEDAIR', INDETERMINATE) -condenserwater = express_getattr(IfcDistributionSystemEnum, 'CONDENSERWATER', INDETERMINATE) -control = express_getattr(IfcDistributionSystemEnum, 'CONTROL', INDETERMINATE) -conveying = express_getattr(IfcDistributionSystemEnum, 'CONVEYING', INDETERMINATE) -data = express_getattr(IfcDistributionSystemEnum, 'DATA', INDETERMINATE) -disposal = express_getattr(IfcDistributionSystemEnum, 'DISPOSAL', INDETERMINATE) -domesticcoldwater = express_getattr(IfcDistributionSystemEnum, 'DOMESTICCOLDWATER', INDETERMINATE) -domestichotwater = express_getattr(IfcDistributionSystemEnum, 'DOMESTICHOTWATER', INDETERMINATE) -drainage = express_getattr(IfcDistributionSystemEnum, 'DRAINAGE', INDETERMINATE) -earthing = express_getattr(IfcDistributionSystemEnum, 'EARTHING', INDETERMINATE) -electrical = express_getattr(IfcDistributionSystemEnum, 'ELECTRICAL', INDETERMINATE) -electroacoustic = express_getattr(IfcDistributionSystemEnum, 'ELECTROACOUSTIC', INDETERMINATE) -exhaust = express_getattr(IfcDistributionSystemEnum, 'EXHAUST', INDETERMINATE) -fireprotection = express_getattr(IfcDistributionSystemEnum, 'FIREPROTECTION', INDETERMINATE) -fuel = express_getattr(IfcDistributionSystemEnum, 'FUEL', INDETERMINATE) -gas = express_getattr(IfcDistributionSystemEnum, 'GAS', INDETERMINATE) -hazardous = express_getattr(IfcDistributionSystemEnum, 'HAZARDOUS', INDETERMINATE) -heating = express_getattr(IfcDistributionSystemEnum, 'HEATING', INDETERMINATE) -lighting = express_getattr(IfcDistributionSystemEnum, 'LIGHTING', INDETERMINATE) -lightningprotection = express_getattr(IfcDistributionSystemEnum, 'LIGHTNINGPROTECTION', INDETERMINATE) -municipalsolidwaste = express_getattr(IfcDistributionSystemEnum, 'MUNICIPALSOLIDWASTE', INDETERMINATE) -oil = express_getattr(IfcDistributionSystemEnum, 'OIL', INDETERMINATE) -operational = express_getattr(IfcDistributionSystemEnum, 'OPERATIONAL', INDETERMINATE) -powergeneration = express_getattr(IfcDistributionSystemEnum, 'POWERGENERATION', INDETERMINATE) -rainwater = express_getattr(IfcDistributionSystemEnum, 'RAINWATER', INDETERMINATE) -refrigeration = express_getattr(IfcDistributionSystemEnum, 'REFRIGERATION', INDETERMINATE) -security = express_getattr(IfcDistributionSystemEnum, 'SECURITY', INDETERMINATE) -sewage = express_getattr(IfcDistributionSystemEnum, 'SEWAGE', INDETERMINATE) -signal = express_getattr(IfcDistributionSystemEnum, 'SIGNAL', INDETERMINATE) -stormwater = express_getattr(IfcDistributionSystemEnum, 'STORMWATER', INDETERMINATE) -telephone = express_getattr(IfcDistributionSystemEnum, 'TELEPHONE', INDETERMINATE) -tv = express_getattr(IfcDistributionSystemEnum, 'TV', INDETERMINATE) -vacuum = express_getattr(IfcDistributionSystemEnum, 'VACUUM', INDETERMINATE) -vent = express_getattr(IfcDistributionSystemEnum, 'VENT', INDETERMINATE) -ventilation = express_getattr(IfcDistributionSystemEnum, 'VENTILATION', INDETERMINATE) -wastewater = express_getattr(IfcDistributionSystemEnum, 'WASTEWATER', INDETERMINATE) -watersupply = express_getattr(IfcDistributionSystemEnum, 'WATERSUPPLY', INDETERMINATE) -userdefined = express_getattr(IfcDistributionSystemEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDistributionSystemEnum, 'NOTDEFINED', INDETERMINATE) +airconditioning = IfcDistributionSystemEnum.AIRCONDITIONING +audiovisual = IfcDistributionSystemEnum.AUDIOVISUAL +chemical = IfcDistributionSystemEnum.CHEMICAL +chilledwater = IfcDistributionSystemEnum.CHILLEDWATER +communication = IfcDistributionSystemEnum.COMMUNICATION +compressedair = IfcDistributionSystemEnum.COMPRESSEDAIR +condenserwater = IfcDistributionSystemEnum.CONDENSERWATER +control = IfcDistributionSystemEnum.CONTROL +conveying = IfcDistributionSystemEnum.CONVEYING +data = IfcDistributionSystemEnum.DATA +disposal = IfcDistributionSystemEnum.DISPOSAL +domesticcoldwater = IfcDistributionSystemEnum.DOMESTICCOLDWATER +domestichotwater = IfcDistributionSystemEnum.DOMESTICHOTWATER +drainage = IfcDistributionSystemEnum.DRAINAGE +earthing = IfcDistributionSystemEnum.EARTHING +electrical = IfcDistributionSystemEnum.ELECTRICAL +electroacoustic = IfcDistributionSystemEnum.ELECTROACOUSTIC +exhaust = IfcDistributionSystemEnum.EXHAUST +fireprotection = IfcDistributionSystemEnum.FIREPROTECTION +fuel = IfcDistributionSystemEnum.FUEL +gas = IfcDistributionSystemEnum.GAS +hazardous = IfcDistributionSystemEnum.HAZARDOUS +heating = IfcDistributionSystemEnum.HEATING +lighting = IfcDistributionSystemEnum.LIGHTING +lightningprotection = IfcDistributionSystemEnum.LIGHTNINGPROTECTION +municipalsolidwaste = IfcDistributionSystemEnum.MUNICIPALSOLIDWASTE +oil = IfcDistributionSystemEnum.OIL +operational = IfcDistributionSystemEnum.OPERATIONAL +powergeneration = IfcDistributionSystemEnum.POWERGENERATION +rainwater = IfcDistributionSystemEnum.RAINWATER +refrigeration = IfcDistributionSystemEnum.REFRIGERATION +security = IfcDistributionSystemEnum.SECURITY +sewage = IfcDistributionSystemEnum.SEWAGE +signal = IfcDistributionSystemEnum.SIGNAL +stormwater = IfcDistributionSystemEnum.STORMWATER +telephone = IfcDistributionSystemEnum.TELEPHONE +tv = IfcDistributionSystemEnum.TV +vacuum = IfcDistributionSystemEnum.VACUUM +vent = IfcDistributionSystemEnum.VENT +ventilation = IfcDistributionSystemEnum.VENTILATION +wastewater = IfcDistributionSystemEnum.WASTEWATER +watersupply = IfcDistributionSystemEnum.WATERSUPPLY +userdefined = IfcDistributionSystemEnum.USERDEFINED +notdefined = IfcDistributionSystemEnum.NOTDEFINED IfcDocumentConfidentialityEnum = enum_namespace() -public = express_getattr(IfcDocumentConfidentialityEnum, 'PUBLIC', INDETERMINATE) -restricted = express_getattr(IfcDocumentConfidentialityEnum, 'RESTRICTED', INDETERMINATE) -confidential = express_getattr(IfcDocumentConfidentialityEnum, 'CONFIDENTIAL', INDETERMINATE) -personal = express_getattr(IfcDocumentConfidentialityEnum, 'PERSONAL', INDETERMINATE) -userdefined = express_getattr(IfcDocumentConfidentialityEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDocumentConfidentialityEnum, 'NOTDEFINED', INDETERMINATE) +public = IfcDocumentConfidentialityEnum.PUBLIC +restricted = IfcDocumentConfidentialityEnum.RESTRICTED +confidential = IfcDocumentConfidentialityEnum.CONFIDENTIAL +personal = IfcDocumentConfidentialityEnum.PERSONAL +userdefined = IfcDocumentConfidentialityEnum.USERDEFINED +notdefined = IfcDocumentConfidentialityEnum.NOTDEFINED IfcDocumentStatusEnum = enum_namespace() -draft = express_getattr(IfcDocumentStatusEnum, 'DRAFT', INDETERMINATE) -finaldraft = express_getattr(IfcDocumentStatusEnum, 'FINALDRAFT', INDETERMINATE) -final = express_getattr(IfcDocumentStatusEnum, 'FINAL', INDETERMINATE) -revision = express_getattr(IfcDocumentStatusEnum, 'REVISION', INDETERMINATE) -notdefined = express_getattr(IfcDocumentStatusEnum, 'NOTDEFINED', INDETERMINATE) +draft = IfcDocumentStatusEnum.DRAFT +finaldraft = IfcDocumentStatusEnum.FINALDRAFT +final = IfcDocumentStatusEnum.FINAL +revision = IfcDocumentStatusEnum.REVISION +notdefined = IfcDocumentStatusEnum.NOTDEFINED IfcDoorPanelOperationEnum = enum_namespace() -swinging = express_getattr(IfcDoorPanelOperationEnum, 'SWINGING', INDETERMINATE) -double_acting = express_getattr(IfcDoorPanelOperationEnum, 'DOUBLE_ACTING', INDETERMINATE) -sliding = express_getattr(IfcDoorPanelOperationEnum, 'SLIDING', INDETERMINATE) -folding = express_getattr(IfcDoorPanelOperationEnum, 'FOLDING', INDETERMINATE) -revolving = express_getattr(IfcDoorPanelOperationEnum, 'REVOLVING', INDETERMINATE) -rollingup = express_getattr(IfcDoorPanelOperationEnum, 'ROLLINGUP', INDETERMINATE) -fixedpanel = express_getattr(IfcDoorPanelOperationEnum, 'FIXEDPANEL', INDETERMINATE) -userdefined = express_getattr(IfcDoorPanelOperationEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDoorPanelOperationEnum, 'NOTDEFINED', INDETERMINATE) +swinging = IfcDoorPanelOperationEnum.SWINGING +double_acting = IfcDoorPanelOperationEnum.DOUBLE_ACTING +sliding = IfcDoorPanelOperationEnum.SLIDING +folding = IfcDoorPanelOperationEnum.FOLDING +revolving = IfcDoorPanelOperationEnum.REVOLVING +rollingup = IfcDoorPanelOperationEnum.ROLLINGUP +fixedpanel = IfcDoorPanelOperationEnum.FIXEDPANEL +userdefined = IfcDoorPanelOperationEnum.USERDEFINED +notdefined = IfcDoorPanelOperationEnum.NOTDEFINED IfcDoorPanelPositionEnum = enum_namespace() -left = express_getattr(IfcDoorPanelPositionEnum, 'LEFT', INDETERMINATE) -middle = express_getattr(IfcDoorPanelPositionEnum, 'MIDDLE', INDETERMINATE) -right = express_getattr(IfcDoorPanelPositionEnum, 'RIGHT', INDETERMINATE) -notdefined = express_getattr(IfcDoorPanelPositionEnum, 'NOTDEFINED', INDETERMINATE) +left = IfcDoorPanelPositionEnum.LEFT +middle = IfcDoorPanelPositionEnum.MIDDLE +right = IfcDoorPanelPositionEnum.RIGHT +notdefined = IfcDoorPanelPositionEnum.NOTDEFINED IfcDoorStyleConstructionEnum = enum_namespace() -aluminium = express_getattr(IfcDoorStyleConstructionEnum, 'ALUMINIUM', INDETERMINATE) -high_grade_steel = express_getattr(IfcDoorStyleConstructionEnum, 'HIGH_GRADE_STEEL', INDETERMINATE) -steel = express_getattr(IfcDoorStyleConstructionEnum, 'STEEL', INDETERMINATE) -wood = express_getattr(IfcDoorStyleConstructionEnum, 'WOOD', INDETERMINATE) -aluminium_wood = express_getattr(IfcDoorStyleConstructionEnum, 'ALUMINIUM_WOOD', INDETERMINATE) -aluminium_plastic = express_getattr(IfcDoorStyleConstructionEnum, 'ALUMINIUM_PLASTIC', INDETERMINATE) -plastic = express_getattr(IfcDoorStyleConstructionEnum, 'PLASTIC', INDETERMINATE) -userdefined = express_getattr(IfcDoorStyleConstructionEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDoorStyleConstructionEnum, 'NOTDEFINED', INDETERMINATE) +aluminium = IfcDoorStyleConstructionEnum.ALUMINIUM +high_grade_steel = IfcDoorStyleConstructionEnum.HIGH_GRADE_STEEL +steel = IfcDoorStyleConstructionEnum.STEEL +wood = IfcDoorStyleConstructionEnum.WOOD +aluminium_wood = IfcDoorStyleConstructionEnum.ALUMINIUM_WOOD +aluminium_plastic = IfcDoorStyleConstructionEnum.ALUMINIUM_PLASTIC +plastic = IfcDoorStyleConstructionEnum.PLASTIC +userdefined = IfcDoorStyleConstructionEnum.USERDEFINED +notdefined = IfcDoorStyleConstructionEnum.NOTDEFINED IfcDoorStyleOperationEnum = enum_namespace() -single_swing_left = express_getattr(IfcDoorStyleOperationEnum, 'SINGLE_SWING_LEFT', INDETERMINATE) -single_swing_right = express_getattr(IfcDoorStyleOperationEnum, 'SINGLE_SWING_RIGHT', INDETERMINATE) -double_door_single_swing = express_getattr(IfcDoorStyleOperationEnum, 'DOUBLE_DOOR_SINGLE_SWING', INDETERMINATE) -double_door_single_swing_opposite_left = express_getattr(IfcDoorStyleOperationEnum, 'DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_LEFT', INDETERMINATE) -double_door_single_swing_opposite_right = express_getattr(IfcDoorStyleOperationEnum, 'DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_RIGHT', INDETERMINATE) -double_swing_left = express_getattr(IfcDoorStyleOperationEnum, 'DOUBLE_SWING_LEFT', INDETERMINATE) -double_swing_right = express_getattr(IfcDoorStyleOperationEnum, 'DOUBLE_SWING_RIGHT', INDETERMINATE) -double_door_double_swing = express_getattr(IfcDoorStyleOperationEnum, 'DOUBLE_DOOR_DOUBLE_SWING', INDETERMINATE) -sliding_to_left = express_getattr(IfcDoorStyleOperationEnum, 'SLIDING_TO_LEFT', INDETERMINATE) -sliding_to_right = express_getattr(IfcDoorStyleOperationEnum, 'SLIDING_TO_RIGHT', INDETERMINATE) -double_door_sliding = express_getattr(IfcDoorStyleOperationEnum, 'DOUBLE_DOOR_SLIDING', INDETERMINATE) -folding_to_left = express_getattr(IfcDoorStyleOperationEnum, 'FOLDING_TO_LEFT', INDETERMINATE) -folding_to_right = express_getattr(IfcDoorStyleOperationEnum, 'FOLDING_TO_RIGHT', INDETERMINATE) -double_door_folding = express_getattr(IfcDoorStyleOperationEnum, 'DOUBLE_DOOR_FOLDING', INDETERMINATE) -revolving = express_getattr(IfcDoorStyleOperationEnum, 'REVOLVING', INDETERMINATE) -rollingup = express_getattr(IfcDoorStyleOperationEnum, 'ROLLINGUP', INDETERMINATE) -userdefined = express_getattr(IfcDoorStyleOperationEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDoorStyleOperationEnum, 'NOTDEFINED', INDETERMINATE) +single_swing_left = IfcDoorStyleOperationEnum.SINGLE_SWING_LEFT +single_swing_right = IfcDoorStyleOperationEnum.SINGLE_SWING_RIGHT +double_door_single_swing = IfcDoorStyleOperationEnum.DOUBLE_DOOR_SINGLE_SWING +double_door_single_swing_opposite_left = IfcDoorStyleOperationEnum.DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_LEFT +double_door_single_swing_opposite_right = IfcDoorStyleOperationEnum.DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_RIGHT +double_swing_left = IfcDoorStyleOperationEnum.DOUBLE_SWING_LEFT +double_swing_right = IfcDoorStyleOperationEnum.DOUBLE_SWING_RIGHT +double_door_double_swing = IfcDoorStyleOperationEnum.DOUBLE_DOOR_DOUBLE_SWING +sliding_to_left = IfcDoorStyleOperationEnum.SLIDING_TO_LEFT +sliding_to_right = IfcDoorStyleOperationEnum.SLIDING_TO_RIGHT +double_door_sliding = IfcDoorStyleOperationEnum.DOUBLE_DOOR_SLIDING +folding_to_left = IfcDoorStyleOperationEnum.FOLDING_TO_LEFT +folding_to_right = IfcDoorStyleOperationEnum.FOLDING_TO_RIGHT +double_door_folding = IfcDoorStyleOperationEnum.DOUBLE_DOOR_FOLDING +revolving = IfcDoorStyleOperationEnum.REVOLVING +rollingup = IfcDoorStyleOperationEnum.ROLLINGUP +userdefined = IfcDoorStyleOperationEnum.USERDEFINED +notdefined = IfcDoorStyleOperationEnum.NOTDEFINED IfcDoorTypeEnum = enum_namespace() -door = express_getattr(IfcDoorTypeEnum, 'DOOR', INDETERMINATE) -gate = express_getattr(IfcDoorTypeEnum, 'GATE', INDETERMINATE) -trapdoor = express_getattr(IfcDoorTypeEnum, 'TRAPDOOR', INDETERMINATE) -userdefined = express_getattr(IfcDoorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDoorTypeEnum, 'NOTDEFINED', INDETERMINATE) +door = IfcDoorTypeEnum.DOOR +gate = IfcDoorTypeEnum.GATE +trapdoor = IfcDoorTypeEnum.TRAPDOOR +userdefined = IfcDoorTypeEnum.USERDEFINED +notdefined = IfcDoorTypeEnum.NOTDEFINED IfcDoorTypeOperationEnum = enum_namespace() -single_swing_left = express_getattr(IfcDoorTypeOperationEnum, 'SINGLE_SWING_LEFT', INDETERMINATE) -single_swing_right = express_getattr(IfcDoorTypeOperationEnum, 'SINGLE_SWING_RIGHT', INDETERMINATE) -double_door_single_swing = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_DOOR_SINGLE_SWING', INDETERMINATE) -double_door_single_swing_opposite_left = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_LEFT', INDETERMINATE) -double_door_single_swing_opposite_right = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_RIGHT', INDETERMINATE) -double_swing_left = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_SWING_LEFT', INDETERMINATE) -double_swing_right = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_SWING_RIGHT', INDETERMINATE) -double_door_double_swing = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_DOOR_DOUBLE_SWING', INDETERMINATE) -sliding_to_left = express_getattr(IfcDoorTypeOperationEnum, 'SLIDING_TO_LEFT', INDETERMINATE) -sliding_to_right = express_getattr(IfcDoorTypeOperationEnum, 'SLIDING_TO_RIGHT', INDETERMINATE) -double_door_sliding = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_DOOR_SLIDING', INDETERMINATE) -folding_to_left = express_getattr(IfcDoorTypeOperationEnum, 'FOLDING_TO_LEFT', INDETERMINATE) -folding_to_right = express_getattr(IfcDoorTypeOperationEnum, 'FOLDING_TO_RIGHT', INDETERMINATE) -double_door_folding = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_DOOR_FOLDING', INDETERMINATE) -revolving = express_getattr(IfcDoorTypeOperationEnum, 'REVOLVING', INDETERMINATE) -rollingup = express_getattr(IfcDoorTypeOperationEnum, 'ROLLINGUP', INDETERMINATE) -swing_fixed_left = express_getattr(IfcDoorTypeOperationEnum, 'SWING_FIXED_LEFT', INDETERMINATE) -swing_fixed_right = express_getattr(IfcDoorTypeOperationEnum, 'SWING_FIXED_RIGHT', INDETERMINATE) -userdefined = express_getattr(IfcDoorTypeOperationEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDoorTypeOperationEnum, 'NOTDEFINED', INDETERMINATE) +single_swing_left = IfcDoorTypeOperationEnum.SINGLE_SWING_LEFT +single_swing_right = IfcDoorTypeOperationEnum.SINGLE_SWING_RIGHT +double_door_single_swing = IfcDoorTypeOperationEnum.DOUBLE_DOOR_SINGLE_SWING +double_door_single_swing_opposite_left = IfcDoorTypeOperationEnum.DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_LEFT +double_door_single_swing_opposite_right = IfcDoorTypeOperationEnum.DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_RIGHT +double_swing_left = IfcDoorTypeOperationEnum.DOUBLE_SWING_LEFT +double_swing_right = IfcDoorTypeOperationEnum.DOUBLE_SWING_RIGHT +double_door_double_swing = IfcDoorTypeOperationEnum.DOUBLE_DOOR_DOUBLE_SWING +sliding_to_left = IfcDoorTypeOperationEnum.SLIDING_TO_LEFT +sliding_to_right = IfcDoorTypeOperationEnum.SLIDING_TO_RIGHT +double_door_sliding = IfcDoorTypeOperationEnum.DOUBLE_DOOR_SLIDING +folding_to_left = IfcDoorTypeOperationEnum.FOLDING_TO_LEFT +folding_to_right = IfcDoorTypeOperationEnum.FOLDING_TO_RIGHT +double_door_folding = IfcDoorTypeOperationEnum.DOUBLE_DOOR_FOLDING +revolving = IfcDoorTypeOperationEnum.REVOLVING +rollingup = IfcDoorTypeOperationEnum.ROLLINGUP +swing_fixed_left = IfcDoorTypeOperationEnum.SWING_FIXED_LEFT +swing_fixed_right = IfcDoorTypeOperationEnum.SWING_FIXED_RIGHT +userdefined = IfcDoorTypeOperationEnum.USERDEFINED +notdefined = IfcDoorTypeOperationEnum.NOTDEFINED IfcDuctFittingTypeEnum = enum_namespace() -bend = express_getattr(IfcDuctFittingTypeEnum, 'BEND', INDETERMINATE) -connector = express_getattr(IfcDuctFittingTypeEnum, 'CONNECTOR', INDETERMINATE) -entry = express_getattr(IfcDuctFittingTypeEnum, 'ENTRY', INDETERMINATE) -exit = express_getattr(IfcDuctFittingTypeEnum, 'EXIT', INDETERMINATE) -junction = express_getattr(IfcDuctFittingTypeEnum, 'JUNCTION', INDETERMINATE) -obstruction = express_getattr(IfcDuctFittingTypeEnum, 'OBSTRUCTION', INDETERMINATE) -transition = express_getattr(IfcDuctFittingTypeEnum, 'TRANSITION', INDETERMINATE) -userdefined = express_getattr(IfcDuctFittingTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDuctFittingTypeEnum, 'NOTDEFINED', INDETERMINATE) +bend = IfcDuctFittingTypeEnum.BEND +connector = IfcDuctFittingTypeEnum.CONNECTOR +entry = IfcDuctFittingTypeEnum.ENTRY +exit = IfcDuctFittingTypeEnum.EXIT +junction = IfcDuctFittingTypeEnum.JUNCTION +obstruction = IfcDuctFittingTypeEnum.OBSTRUCTION +transition = IfcDuctFittingTypeEnum.TRANSITION +userdefined = IfcDuctFittingTypeEnum.USERDEFINED +notdefined = IfcDuctFittingTypeEnum.NOTDEFINED IfcDuctSegmentTypeEnum = enum_namespace() -rigidsegment = express_getattr(IfcDuctSegmentTypeEnum, 'RIGIDSEGMENT', INDETERMINATE) -flexiblesegment = express_getattr(IfcDuctSegmentTypeEnum, 'FLEXIBLESEGMENT', INDETERMINATE) -userdefined = express_getattr(IfcDuctSegmentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDuctSegmentTypeEnum, 'NOTDEFINED', INDETERMINATE) +rigidsegment = IfcDuctSegmentTypeEnum.RIGIDSEGMENT +flexiblesegment = IfcDuctSegmentTypeEnum.FLEXIBLESEGMENT +userdefined = IfcDuctSegmentTypeEnum.USERDEFINED +notdefined = IfcDuctSegmentTypeEnum.NOTDEFINED IfcDuctSilencerTypeEnum = enum_namespace() -flatoval = express_getattr(IfcDuctSilencerTypeEnum, 'FLATOVAL', INDETERMINATE) -rectangular = express_getattr(IfcDuctSilencerTypeEnum, 'RECTANGULAR', INDETERMINATE) -round = express_getattr(IfcDuctSilencerTypeEnum, 'ROUND', INDETERMINATE) -userdefined = express_getattr(IfcDuctSilencerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDuctSilencerTypeEnum, 'NOTDEFINED', INDETERMINATE) +flatoval = IfcDuctSilencerTypeEnum.FLATOVAL +rectangular = IfcDuctSilencerTypeEnum.RECTANGULAR +round = IfcDuctSilencerTypeEnum.ROUND +userdefined = IfcDuctSilencerTypeEnum.USERDEFINED +notdefined = IfcDuctSilencerTypeEnum.NOTDEFINED IfcElectricApplianceTypeEnum = enum_namespace() -dishwasher = express_getattr(IfcElectricApplianceTypeEnum, 'DISHWASHER', INDETERMINATE) -electriccooker = express_getattr(IfcElectricApplianceTypeEnum, 'ELECTRICCOOKER', INDETERMINATE) -freestandingelectricheater = express_getattr(IfcElectricApplianceTypeEnum, 'FREESTANDINGELECTRICHEATER', INDETERMINATE) -freestandingfan = express_getattr(IfcElectricApplianceTypeEnum, 'FREESTANDINGFAN', INDETERMINATE) -freestandingwaterheater = express_getattr(IfcElectricApplianceTypeEnum, 'FREESTANDINGWATERHEATER', INDETERMINATE) -freestandingwatercooler = express_getattr(IfcElectricApplianceTypeEnum, 'FREESTANDINGWATERCOOLER', INDETERMINATE) -freezer = express_getattr(IfcElectricApplianceTypeEnum, 'FREEZER', INDETERMINATE) -fridge_freezer = express_getattr(IfcElectricApplianceTypeEnum, 'FRIDGE_FREEZER', INDETERMINATE) -handdryer = express_getattr(IfcElectricApplianceTypeEnum, 'HANDDRYER', INDETERMINATE) -kitchenmachine = express_getattr(IfcElectricApplianceTypeEnum, 'KITCHENMACHINE', INDETERMINATE) -microwave = express_getattr(IfcElectricApplianceTypeEnum, 'MICROWAVE', INDETERMINATE) -photocopier = express_getattr(IfcElectricApplianceTypeEnum, 'PHOTOCOPIER', INDETERMINATE) -refrigerator = express_getattr(IfcElectricApplianceTypeEnum, 'REFRIGERATOR', INDETERMINATE) -tumbledryer = express_getattr(IfcElectricApplianceTypeEnum, 'TUMBLEDRYER', INDETERMINATE) -vendingmachine = express_getattr(IfcElectricApplianceTypeEnum, 'VENDINGMACHINE', INDETERMINATE) -washingmachine = express_getattr(IfcElectricApplianceTypeEnum, 'WASHINGMACHINE', INDETERMINATE) -userdefined = express_getattr(IfcElectricApplianceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcElectricApplianceTypeEnum, 'NOTDEFINED', INDETERMINATE) +dishwasher = IfcElectricApplianceTypeEnum.DISHWASHER +electriccooker = IfcElectricApplianceTypeEnum.ELECTRICCOOKER +freestandingelectricheater = IfcElectricApplianceTypeEnum.FREESTANDINGELECTRICHEATER +freestandingfan = IfcElectricApplianceTypeEnum.FREESTANDINGFAN +freestandingwaterheater = IfcElectricApplianceTypeEnum.FREESTANDINGWATERHEATER +freestandingwatercooler = IfcElectricApplianceTypeEnum.FREESTANDINGWATERCOOLER +freezer = IfcElectricApplianceTypeEnum.FREEZER +fridge_freezer = IfcElectricApplianceTypeEnum.FRIDGE_FREEZER +handdryer = IfcElectricApplianceTypeEnum.HANDDRYER +kitchenmachine = IfcElectricApplianceTypeEnum.KITCHENMACHINE +microwave = IfcElectricApplianceTypeEnum.MICROWAVE +photocopier = IfcElectricApplianceTypeEnum.PHOTOCOPIER +refrigerator = IfcElectricApplianceTypeEnum.REFRIGERATOR +tumbledryer = IfcElectricApplianceTypeEnum.TUMBLEDRYER +vendingmachine = IfcElectricApplianceTypeEnum.VENDINGMACHINE +washingmachine = IfcElectricApplianceTypeEnum.WASHINGMACHINE +userdefined = IfcElectricApplianceTypeEnum.USERDEFINED +notdefined = IfcElectricApplianceTypeEnum.NOTDEFINED IfcElectricDistributionBoardTypeEnum = enum_namespace() -consumerunit = express_getattr(IfcElectricDistributionBoardTypeEnum, 'CONSUMERUNIT', INDETERMINATE) -distributionboard = express_getattr(IfcElectricDistributionBoardTypeEnum, 'DISTRIBUTIONBOARD', INDETERMINATE) -motorcontrolcentre = express_getattr(IfcElectricDistributionBoardTypeEnum, 'MOTORCONTROLCENTRE', INDETERMINATE) -switchboard = express_getattr(IfcElectricDistributionBoardTypeEnum, 'SWITCHBOARD', INDETERMINATE) -userdefined = express_getattr(IfcElectricDistributionBoardTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcElectricDistributionBoardTypeEnum, 'NOTDEFINED', INDETERMINATE) +consumerunit = IfcElectricDistributionBoardTypeEnum.CONSUMERUNIT +distributionboard = IfcElectricDistributionBoardTypeEnum.DISTRIBUTIONBOARD +motorcontrolcentre = IfcElectricDistributionBoardTypeEnum.MOTORCONTROLCENTRE +switchboard = IfcElectricDistributionBoardTypeEnum.SWITCHBOARD +userdefined = IfcElectricDistributionBoardTypeEnum.USERDEFINED +notdefined = IfcElectricDistributionBoardTypeEnum.NOTDEFINED IfcElectricFlowStorageDeviceTypeEnum = enum_namespace() -battery = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'BATTERY', INDETERMINATE) -capacitorbank = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'CAPACITORBANK', INDETERMINATE) -harmonicfilter = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'HARMONICFILTER', INDETERMINATE) -inductorbank = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'INDUCTORBANK', INDETERMINATE) -ups = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'UPS', INDETERMINATE) -userdefined = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'NOTDEFINED', INDETERMINATE) +battery = IfcElectricFlowStorageDeviceTypeEnum.BATTERY +capacitorbank = IfcElectricFlowStorageDeviceTypeEnum.CAPACITORBANK +harmonicfilter = IfcElectricFlowStorageDeviceTypeEnum.HARMONICFILTER +inductorbank = IfcElectricFlowStorageDeviceTypeEnum.INDUCTORBANK +ups = IfcElectricFlowStorageDeviceTypeEnum.UPS +userdefined = IfcElectricFlowStorageDeviceTypeEnum.USERDEFINED +notdefined = IfcElectricFlowStorageDeviceTypeEnum.NOTDEFINED IfcElectricGeneratorTypeEnum = enum_namespace() -chp = express_getattr(IfcElectricGeneratorTypeEnum, 'CHP', INDETERMINATE) -enginegenerator = express_getattr(IfcElectricGeneratorTypeEnum, 'ENGINEGENERATOR', INDETERMINATE) -standalone = express_getattr(IfcElectricGeneratorTypeEnum, 'STANDALONE', INDETERMINATE) -userdefined = express_getattr(IfcElectricGeneratorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcElectricGeneratorTypeEnum, 'NOTDEFINED', INDETERMINATE) +chp = IfcElectricGeneratorTypeEnum.CHP +enginegenerator = IfcElectricGeneratorTypeEnum.ENGINEGENERATOR +standalone = IfcElectricGeneratorTypeEnum.STANDALONE +userdefined = IfcElectricGeneratorTypeEnum.USERDEFINED +notdefined = IfcElectricGeneratorTypeEnum.NOTDEFINED IfcElectricMotorTypeEnum = enum_namespace() -dc = express_getattr(IfcElectricMotorTypeEnum, 'DC', INDETERMINATE) -induction = express_getattr(IfcElectricMotorTypeEnum, 'INDUCTION', INDETERMINATE) -polyphase = express_getattr(IfcElectricMotorTypeEnum, 'POLYPHASE', INDETERMINATE) -reluctancesynchronous = express_getattr(IfcElectricMotorTypeEnum, 'RELUCTANCESYNCHRONOUS', INDETERMINATE) -synchronous = express_getattr(IfcElectricMotorTypeEnum, 'SYNCHRONOUS', INDETERMINATE) -userdefined = express_getattr(IfcElectricMotorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcElectricMotorTypeEnum, 'NOTDEFINED', INDETERMINATE) +dc = IfcElectricMotorTypeEnum.DC +induction = IfcElectricMotorTypeEnum.INDUCTION +polyphase = IfcElectricMotorTypeEnum.POLYPHASE +reluctancesynchronous = IfcElectricMotorTypeEnum.RELUCTANCESYNCHRONOUS +synchronous = IfcElectricMotorTypeEnum.SYNCHRONOUS +userdefined = IfcElectricMotorTypeEnum.USERDEFINED +notdefined = IfcElectricMotorTypeEnum.NOTDEFINED IfcElectricTimeControlTypeEnum = enum_namespace() -timeclock = express_getattr(IfcElectricTimeControlTypeEnum, 'TIMECLOCK', INDETERMINATE) -timedelay = express_getattr(IfcElectricTimeControlTypeEnum, 'TIMEDELAY', INDETERMINATE) -relay = express_getattr(IfcElectricTimeControlTypeEnum, 'RELAY', INDETERMINATE) -userdefined = express_getattr(IfcElectricTimeControlTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcElectricTimeControlTypeEnum, 'NOTDEFINED', INDETERMINATE) +timeclock = IfcElectricTimeControlTypeEnum.TIMECLOCK +timedelay = IfcElectricTimeControlTypeEnum.TIMEDELAY +relay = IfcElectricTimeControlTypeEnum.RELAY +userdefined = IfcElectricTimeControlTypeEnum.USERDEFINED +notdefined = IfcElectricTimeControlTypeEnum.NOTDEFINED IfcElementAssemblyTypeEnum = enum_namespace() -accessory_assembly = express_getattr(IfcElementAssemblyTypeEnum, 'ACCESSORY_ASSEMBLY', INDETERMINATE) -arch = express_getattr(IfcElementAssemblyTypeEnum, 'ARCH', INDETERMINATE) -beam_grid = express_getattr(IfcElementAssemblyTypeEnum, 'BEAM_GRID', INDETERMINATE) -braced_frame = express_getattr(IfcElementAssemblyTypeEnum, 'BRACED_FRAME', INDETERMINATE) -girder = express_getattr(IfcElementAssemblyTypeEnum, 'GIRDER', INDETERMINATE) -reinforcement_unit = express_getattr(IfcElementAssemblyTypeEnum, 'REINFORCEMENT_UNIT', INDETERMINATE) -rigid_frame = express_getattr(IfcElementAssemblyTypeEnum, 'RIGID_FRAME', INDETERMINATE) -slab_field = express_getattr(IfcElementAssemblyTypeEnum, 'SLAB_FIELD', INDETERMINATE) -truss = express_getattr(IfcElementAssemblyTypeEnum, 'TRUSS', INDETERMINATE) -abutment = express_getattr(IfcElementAssemblyTypeEnum, 'ABUTMENT', INDETERMINATE) -pier = express_getattr(IfcElementAssemblyTypeEnum, 'PIER', INDETERMINATE) -pylon = express_getattr(IfcElementAssemblyTypeEnum, 'PYLON', INDETERMINATE) -cross_bracing = express_getattr(IfcElementAssemblyTypeEnum, 'CROSS_BRACING', INDETERMINATE) -deck = express_getattr(IfcElementAssemblyTypeEnum, 'DECK', INDETERMINATE) -userdefined = express_getattr(IfcElementAssemblyTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcElementAssemblyTypeEnum, 'NOTDEFINED', INDETERMINATE) +accessory_assembly = IfcElementAssemblyTypeEnum.ACCESSORY_ASSEMBLY +arch = IfcElementAssemblyTypeEnum.ARCH +beam_grid = IfcElementAssemblyTypeEnum.BEAM_GRID +braced_frame = IfcElementAssemblyTypeEnum.BRACED_FRAME +girder = IfcElementAssemblyTypeEnum.GIRDER +reinforcement_unit = IfcElementAssemblyTypeEnum.REINFORCEMENT_UNIT +rigid_frame = IfcElementAssemblyTypeEnum.RIGID_FRAME +slab_field = IfcElementAssemblyTypeEnum.SLAB_FIELD +truss = IfcElementAssemblyTypeEnum.TRUSS +abutment = IfcElementAssemblyTypeEnum.ABUTMENT +pier = IfcElementAssemblyTypeEnum.PIER +pylon = IfcElementAssemblyTypeEnum.PYLON +cross_bracing = IfcElementAssemblyTypeEnum.CROSS_BRACING +deck = IfcElementAssemblyTypeEnum.DECK +userdefined = IfcElementAssemblyTypeEnum.USERDEFINED +notdefined = IfcElementAssemblyTypeEnum.NOTDEFINED IfcElementCompositionEnum = enum_namespace() -complex = express_getattr(IfcElementCompositionEnum, 'COMPLEX', INDETERMINATE) -element = express_getattr(IfcElementCompositionEnum, 'ELEMENT', INDETERMINATE) -partial = express_getattr(IfcElementCompositionEnum, 'PARTIAL', INDETERMINATE) +complex = IfcElementCompositionEnum.COMPLEX +element = IfcElementCompositionEnum.ELEMENT +partial = IfcElementCompositionEnum.PARTIAL IfcEngineTypeEnum = enum_namespace() -externalcombustion = express_getattr(IfcEngineTypeEnum, 'EXTERNALCOMBUSTION', INDETERMINATE) -internalcombustion = express_getattr(IfcEngineTypeEnum, 'INTERNALCOMBUSTION', INDETERMINATE) -userdefined = express_getattr(IfcEngineTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcEngineTypeEnum, 'NOTDEFINED', INDETERMINATE) +externalcombustion = IfcEngineTypeEnum.EXTERNALCOMBUSTION +internalcombustion = IfcEngineTypeEnum.INTERNALCOMBUSTION +userdefined = IfcEngineTypeEnum.USERDEFINED +notdefined = IfcEngineTypeEnum.NOTDEFINED IfcEvaporativeCoolerTypeEnum = enum_namespace() -directevaporativerandommediaaircooler = express_getattr(IfcEvaporativeCoolerTypeEnum, 'DIRECTEVAPORATIVERANDOMMEDIAAIRCOOLER', INDETERMINATE) -directevaporativerigidmediaaircooler = express_getattr(IfcEvaporativeCoolerTypeEnum, 'DIRECTEVAPORATIVERIGIDMEDIAAIRCOOLER', INDETERMINATE) -directevaporativeslingerspackagedaircooler = express_getattr(IfcEvaporativeCoolerTypeEnum, 'DIRECTEVAPORATIVESLINGERSPACKAGEDAIRCOOLER', INDETERMINATE) -directevaporativepackagedrotaryaircooler = express_getattr(IfcEvaporativeCoolerTypeEnum, 'DIRECTEVAPORATIVEPACKAGEDROTARYAIRCOOLER', INDETERMINATE) -directevaporativeairwasher = express_getattr(IfcEvaporativeCoolerTypeEnum, 'DIRECTEVAPORATIVEAIRWASHER', INDETERMINATE) -indirectevaporativepackageaircooler = express_getattr(IfcEvaporativeCoolerTypeEnum, 'INDIRECTEVAPORATIVEPACKAGEAIRCOOLER', INDETERMINATE) -indirectevaporativewetcoil = express_getattr(IfcEvaporativeCoolerTypeEnum, 'INDIRECTEVAPORATIVEWETCOIL', INDETERMINATE) -indirectevaporativecoolingtowerorcoilcooler = express_getattr(IfcEvaporativeCoolerTypeEnum, 'INDIRECTEVAPORATIVECOOLINGTOWERORCOILCOOLER', INDETERMINATE) -indirectdirectcombination = express_getattr(IfcEvaporativeCoolerTypeEnum, 'INDIRECTDIRECTCOMBINATION', INDETERMINATE) -userdefined = express_getattr(IfcEvaporativeCoolerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcEvaporativeCoolerTypeEnum, 'NOTDEFINED', INDETERMINATE) +directevaporativerandommediaaircooler = IfcEvaporativeCoolerTypeEnum.DIRECTEVAPORATIVERANDOMMEDIAAIRCOOLER +directevaporativerigidmediaaircooler = IfcEvaporativeCoolerTypeEnum.DIRECTEVAPORATIVERIGIDMEDIAAIRCOOLER +directevaporativeslingerspackagedaircooler = IfcEvaporativeCoolerTypeEnum.DIRECTEVAPORATIVESLINGERSPACKAGEDAIRCOOLER +directevaporativepackagedrotaryaircooler = IfcEvaporativeCoolerTypeEnum.DIRECTEVAPORATIVEPACKAGEDROTARYAIRCOOLER +directevaporativeairwasher = IfcEvaporativeCoolerTypeEnum.DIRECTEVAPORATIVEAIRWASHER +indirectevaporativepackageaircooler = IfcEvaporativeCoolerTypeEnum.INDIRECTEVAPORATIVEPACKAGEAIRCOOLER +indirectevaporativewetcoil = IfcEvaporativeCoolerTypeEnum.INDIRECTEVAPORATIVEWETCOIL +indirectevaporativecoolingtowerorcoilcooler = IfcEvaporativeCoolerTypeEnum.INDIRECTEVAPORATIVECOOLINGTOWERORCOILCOOLER +indirectdirectcombination = IfcEvaporativeCoolerTypeEnum.INDIRECTDIRECTCOMBINATION +userdefined = IfcEvaporativeCoolerTypeEnum.USERDEFINED +notdefined = IfcEvaporativeCoolerTypeEnum.NOTDEFINED IfcEvaporatorTypeEnum = enum_namespace() -directexpansion = express_getattr(IfcEvaporatorTypeEnum, 'DIRECTEXPANSION', INDETERMINATE) -directexpansionshellandtube = express_getattr(IfcEvaporatorTypeEnum, 'DIRECTEXPANSIONSHELLANDTUBE', INDETERMINATE) -directexpansiontubeintube = express_getattr(IfcEvaporatorTypeEnum, 'DIRECTEXPANSIONTUBEINTUBE', INDETERMINATE) -directexpansionbrazedplate = express_getattr(IfcEvaporatorTypeEnum, 'DIRECTEXPANSIONBRAZEDPLATE', INDETERMINATE) -floodedshellandtube = express_getattr(IfcEvaporatorTypeEnum, 'FLOODEDSHELLANDTUBE', INDETERMINATE) -shellandcoil = express_getattr(IfcEvaporatorTypeEnum, 'SHELLANDCOIL', INDETERMINATE) -userdefined = express_getattr(IfcEvaporatorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcEvaporatorTypeEnum, 'NOTDEFINED', INDETERMINATE) +directexpansion = IfcEvaporatorTypeEnum.DIRECTEXPANSION +directexpansionshellandtube = IfcEvaporatorTypeEnum.DIRECTEXPANSIONSHELLANDTUBE +directexpansiontubeintube = IfcEvaporatorTypeEnum.DIRECTEXPANSIONTUBEINTUBE +directexpansionbrazedplate = IfcEvaporatorTypeEnum.DIRECTEXPANSIONBRAZEDPLATE +floodedshellandtube = IfcEvaporatorTypeEnum.FLOODEDSHELLANDTUBE +shellandcoil = IfcEvaporatorTypeEnum.SHELLANDCOIL +userdefined = IfcEvaporatorTypeEnum.USERDEFINED +notdefined = IfcEvaporatorTypeEnum.NOTDEFINED IfcEventTriggerTypeEnum = enum_namespace() -eventrule = express_getattr(IfcEventTriggerTypeEnum, 'EVENTRULE', INDETERMINATE) -eventmessage = express_getattr(IfcEventTriggerTypeEnum, 'EVENTMESSAGE', INDETERMINATE) -eventtime = express_getattr(IfcEventTriggerTypeEnum, 'EVENTTIME', INDETERMINATE) -eventcomplex = express_getattr(IfcEventTriggerTypeEnum, 'EVENTCOMPLEX', INDETERMINATE) -userdefined = express_getattr(IfcEventTriggerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcEventTriggerTypeEnum, 'NOTDEFINED', INDETERMINATE) +eventrule = IfcEventTriggerTypeEnum.EVENTRULE +eventmessage = IfcEventTriggerTypeEnum.EVENTMESSAGE +eventtime = IfcEventTriggerTypeEnum.EVENTTIME +eventcomplex = IfcEventTriggerTypeEnum.EVENTCOMPLEX +userdefined = IfcEventTriggerTypeEnum.USERDEFINED +notdefined = IfcEventTriggerTypeEnum.NOTDEFINED IfcEventTypeEnum = enum_namespace() -startevent = express_getattr(IfcEventTypeEnum, 'STARTEVENT', INDETERMINATE) -endevent = express_getattr(IfcEventTypeEnum, 'ENDEVENT', INDETERMINATE) -intermediateevent = express_getattr(IfcEventTypeEnum, 'INTERMEDIATEEVENT', INDETERMINATE) -userdefined = express_getattr(IfcEventTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcEventTypeEnum, 'NOTDEFINED', INDETERMINATE) +startevent = IfcEventTypeEnum.STARTEVENT +endevent = IfcEventTypeEnum.ENDEVENT +intermediateevent = IfcEventTypeEnum.INTERMEDIATEEVENT +userdefined = IfcEventTypeEnum.USERDEFINED +notdefined = IfcEventTypeEnum.NOTDEFINED IfcExternalSpatialElementTypeEnum = enum_namespace() -external = express_getattr(IfcExternalSpatialElementTypeEnum, 'EXTERNAL', INDETERMINATE) -external_earth = express_getattr(IfcExternalSpatialElementTypeEnum, 'EXTERNAL_EARTH', INDETERMINATE) -external_water = express_getattr(IfcExternalSpatialElementTypeEnum, 'EXTERNAL_WATER', INDETERMINATE) -external_fire = express_getattr(IfcExternalSpatialElementTypeEnum, 'EXTERNAL_FIRE', INDETERMINATE) -userdefined = express_getattr(IfcExternalSpatialElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcExternalSpatialElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +external = IfcExternalSpatialElementTypeEnum.EXTERNAL +external_earth = IfcExternalSpatialElementTypeEnum.EXTERNAL_EARTH +external_water = IfcExternalSpatialElementTypeEnum.EXTERNAL_WATER +external_fire = IfcExternalSpatialElementTypeEnum.EXTERNAL_FIRE +userdefined = IfcExternalSpatialElementTypeEnum.USERDEFINED +notdefined = IfcExternalSpatialElementTypeEnum.NOTDEFINED IfcFanTypeEnum = enum_namespace() -centrifugalforwardcurved = express_getattr(IfcFanTypeEnum, 'CENTRIFUGALFORWARDCURVED', INDETERMINATE) -centrifugalradial = express_getattr(IfcFanTypeEnum, 'CENTRIFUGALRADIAL', INDETERMINATE) -centrifugalbackwardinclinedcurved = express_getattr(IfcFanTypeEnum, 'CENTRIFUGALBACKWARDINCLINEDCURVED', INDETERMINATE) -centrifugalairfoil = express_getattr(IfcFanTypeEnum, 'CENTRIFUGALAIRFOIL', INDETERMINATE) -tubeaxial = express_getattr(IfcFanTypeEnum, 'TUBEAXIAL', INDETERMINATE) -vaneaxial = express_getattr(IfcFanTypeEnum, 'VANEAXIAL', INDETERMINATE) -propelloraxial = express_getattr(IfcFanTypeEnum, 'PROPELLORAXIAL', INDETERMINATE) -userdefined = express_getattr(IfcFanTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFanTypeEnum, 'NOTDEFINED', INDETERMINATE) +centrifugalforwardcurved = IfcFanTypeEnum.CENTRIFUGALFORWARDCURVED +centrifugalradial = IfcFanTypeEnum.CENTRIFUGALRADIAL +centrifugalbackwardinclinedcurved = IfcFanTypeEnum.CENTRIFUGALBACKWARDINCLINEDCURVED +centrifugalairfoil = IfcFanTypeEnum.CENTRIFUGALAIRFOIL +tubeaxial = IfcFanTypeEnum.TUBEAXIAL +vaneaxial = IfcFanTypeEnum.VANEAXIAL +propelloraxial = IfcFanTypeEnum.PROPELLORAXIAL +userdefined = IfcFanTypeEnum.USERDEFINED +notdefined = IfcFanTypeEnum.NOTDEFINED IfcFastenerTypeEnum = enum_namespace() -glue = express_getattr(IfcFastenerTypeEnum, 'GLUE', INDETERMINATE) -mortar = express_getattr(IfcFastenerTypeEnum, 'MORTAR', INDETERMINATE) -weld = express_getattr(IfcFastenerTypeEnum, 'WELD', INDETERMINATE) -userdefined = express_getattr(IfcFastenerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFastenerTypeEnum, 'NOTDEFINED', INDETERMINATE) +glue = IfcFastenerTypeEnum.GLUE +mortar = IfcFastenerTypeEnum.MORTAR +weld = IfcFastenerTypeEnum.WELD +userdefined = IfcFastenerTypeEnum.USERDEFINED +notdefined = IfcFastenerTypeEnum.NOTDEFINED IfcFilterTypeEnum = enum_namespace() -airparticlefilter = express_getattr(IfcFilterTypeEnum, 'AIRPARTICLEFILTER', INDETERMINATE) -compressedairfilter = express_getattr(IfcFilterTypeEnum, 'COMPRESSEDAIRFILTER', INDETERMINATE) -odorfilter = express_getattr(IfcFilterTypeEnum, 'ODORFILTER', INDETERMINATE) -oilfilter = express_getattr(IfcFilterTypeEnum, 'OILFILTER', INDETERMINATE) -strainer = express_getattr(IfcFilterTypeEnum, 'STRAINER', INDETERMINATE) -waterfilter = express_getattr(IfcFilterTypeEnum, 'WATERFILTER', INDETERMINATE) -userdefined = express_getattr(IfcFilterTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFilterTypeEnum, 'NOTDEFINED', INDETERMINATE) +airparticlefilter = IfcFilterTypeEnum.AIRPARTICLEFILTER +compressedairfilter = IfcFilterTypeEnum.COMPRESSEDAIRFILTER +odorfilter = IfcFilterTypeEnum.ODORFILTER +oilfilter = IfcFilterTypeEnum.OILFILTER +strainer = IfcFilterTypeEnum.STRAINER +waterfilter = IfcFilterTypeEnum.WATERFILTER +userdefined = IfcFilterTypeEnum.USERDEFINED +notdefined = IfcFilterTypeEnum.NOTDEFINED IfcFireSuppressionTerminalTypeEnum = enum_namespace() -breechinginlet = express_getattr(IfcFireSuppressionTerminalTypeEnum, 'BREECHINGINLET', INDETERMINATE) -firehydrant = express_getattr(IfcFireSuppressionTerminalTypeEnum, 'FIREHYDRANT', INDETERMINATE) -hosereel = express_getattr(IfcFireSuppressionTerminalTypeEnum, 'HOSEREEL', INDETERMINATE) -sprinkler = express_getattr(IfcFireSuppressionTerminalTypeEnum, 'SPRINKLER', INDETERMINATE) -sprinklerdeflector = express_getattr(IfcFireSuppressionTerminalTypeEnum, 'SPRINKLERDEFLECTOR', INDETERMINATE) -userdefined = express_getattr(IfcFireSuppressionTerminalTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFireSuppressionTerminalTypeEnum, 'NOTDEFINED', INDETERMINATE) +breechinginlet = IfcFireSuppressionTerminalTypeEnum.BREECHINGINLET +firehydrant = IfcFireSuppressionTerminalTypeEnum.FIREHYDRANT +hosereel = IfcFireSuppressionTerminalTypeEnum.HOSEREEL +sprinkler = IfcFireSuppressionTerminalTypeEnum.SPRINKLER +sprinklerdeflector = IfcFireSuppressionTerminalTypeEnum.SPRINKLERDEFLECTOR +userdefined = IfcFireSuppressionTerminalTypeEnum.USERDEFINED +notdefined = IfcFireSuppressionTerminalTypeEnum.NOTDEFINED IfcFlowDirectionEnum = enum_namespace() -source = express_getattr(IfcFlowDirectionEnum, 'SOURCE', INDETERMINATE) -sink = express_getattr(IfcFlowDirectionEnum, 'SINK', INDETERMINATE) -sourceandsink = express_getattr(IfcFlowDirectionEnum, 'SOURCEANDSINK', INDETERMINATE) -notdefined = express_getattr(IfcFlowDirectionEnum, 'NOTDEFINED', INDETERMINATE) +source = IfcFlowDirectionEnum.SOURCE +sink = IfcFlowDirectionEnum.SINK +sourceandsink = IfcFlowDirectionEnum.SOURCEANDSINK +notdefined = IfcFlowDirectionEnum.NOTDEFINED IfcFlowInstrumentTypeEnum = enum_namespace() -pressuregauge = express_getattr(IfcFlowInstrumentTypeEnum, 'PRESSUREGAUGE', INDETERMINATE) -thermometer = express_getattr(IfcFlowInstrumentTypeEnum, 'THERMOMETER', INDETERMINATE) -ammeter = express_getattr(IfcFlowInstrumentTypeEnum, 'AMMETER', INDETERMINATE) -frequencymeter = express_getattr(IfcFlowInstrumentTypeEnum, 'FREQUENCYMETER', INDETERMINATE) -powerfactormeter = express_getattr(IfcFlowInstrumentTypeEnum, 'POWERFACTORMETER', INDETERMINATE) -phaseanglemeter = express_getattr(IfcFlowInstrumentTypeEnum, 'PHASEANGLEMETER', INDETERMINATE) -voltmeter_peak = express_getattr(IfcFlowInstrumentTypeEnum, 'VOLTMETER_PEAK', INDETERMINATE) -voltmeter_rms = express_getattr(IfcFlowInstrumentTypeEnum, 'VOLTMETER_RMS', INDETERMINATE) -userdefined = express_getattr(IfcFlowInstrumentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFlowInstrumentTypeEnum, 'NOTDEFINED', INDETERMINATE) +pressuregauge = IfcFlowInstrumentTypeEnum.PRESSUREGAUGE +thermometer = IfcFlowInstrumentTypeEnum.THERMOMETER +ammeter = IfcFlowInstrumentTypeEnum.AMMETER +frequencymeter = IfcFlowInstrumentTypeEnum.FREQUENCYMETER +powerfactormeter = IfcFlowInstrumentTypeEnum.POWERFACTORMETER +phaseanglemeter = IfcFlowInstrumentTypeEnum.PHASEANGLEMETER +voltmeter_peak = IfcFlowInstrumentTypeEnum.VOLTMETER_PEAK +voltmeter_rms = IfcFlowInstrumentTypeEnum.VOLTMETER_RMS +userdefined = IfcFlowInstrumentTypeEnum.USERDEFINED +notdefined = IfcFlowInstrumentTypeEnum.NOTDEFINED IfcFlowMeterTypeEnum = enum_namespace() -energymeter = express_getattr(IfcFlowMeterTypeEnum, 'ENERGYMETER', INDETERMINATE) -gasmeter = express_getattr(IfcFlowMeterTypeEnum, 'GASMETER', INDETERMINATE) -oilmeter = express_getattr(IfcFlowMeterTypeEnum, 'OILMETER', INDETERMINATE) -watermeter = express_getattr(IfcFlowMeterTypeEnum, 'WATERMETER', INDETERMINATE) -userdefined = express_getattr(IfcFlowMeterTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFlowMeterTypeEnum, 'NOTDEFINED', INDETERMINATE) +energymeter = IfcFlowMeterTypeEnum.ENERGYMETER +gasmeter = IfcFlowMeterTypeEnum.GASMETER +oilmeter = IfcFlowMeterTypeEnum.OILMETER +watermeter = IfcFlowMeterTypeEnum.WATERMETER +userdefined = IfcFlowMeterTypeEnum.USERDEFINED +notdefined = IfcFlowMeterTypeEnum.NOTDEFINED IfcFootingTypeEnum = enum_namespace() -caisson_foundation = express_getattr(IfcFootingTypeEnum, 'CAISSON_FOUNDATION', INDETERMINATE) -footing_beam = express_getattr(IfcFootingTypeEnum, 'FOOTING_BEAM', INDETERMINATE) -pad_footing = express_getattr(IfcFootingTypeEnum, 'PAD_FOOTING', INDETERMINATE) -pile_cap = express_getattr(IfcFootingTypeEnum, 'PILE_CAP', INDETERMINATE) -strip_footing = express_getattr(IfcFootingTypeEnum, 'STRIP_FOOTING', INDETERMINATE) -userdefined = express_getattr(IfcFootingTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFootingTypeEnum, 'NOTDEFINED', INDETERMINATE) +caisson_foundation = IfcFootingTypeEnum.CAISSON_FOUNDATION +footing_beam = IfcFootingTypeEnum.FOOTING_BEAM +pad_footing = IfcFootingTypeEnum.PAD_FOOTING +pile_cap = IfcFootingTypeEnum.PILE_CAP +strip_footing = IfcFootingTypeEnum.STRIP_FOOTING +userdefined = IfcFootingTypeEnum.USERDEFINED +notdefined = IfcFootingTypeEnum.NOTDEFINED IfcFurnitureTypeEnum = enum_namespace() -chair = express_getattr(IfcFurnitureTypeEnum, 'CHAIR', INDETERMINATE) -table = express_getattr(IfcFurnitureTypeEnum, 'TABLE', INDETERMINATE) -desk = express_getattr(IfcFurnitureTypeEnum, 'DESK', INDETERMINATE) -bed = express_getattr(IfcFurnitureTypeEnum, 'BED', INDETERMINATE) -filecabinet = express_getattr(IfcFurnitureTypeEnum, 'FILECABINET', INDETERMINATE) -shelf = express_getattr(IfcFurnitureTypeEnum, 'SHELF', INDETERMINATE) -sofa = express_getattr(IfcFurnitureTypeEnum, 'SOFA', INDETERMINATE) -userdefined = express_getattr(IfcFurnitureTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFurnitureTypeEnum, 'NOTDEFINED', INDETERMINATE) +chair = IfcFurnitureTypeEnum.CHAIR +table = IfcFurnitureTypeEnum.TABLE +desk = IfcFurnitureTypeEnum.DESK +bed = IfcFurnitureTypeEnum.BED +filecabinet = IfcFurnitureTypeEnum.FILECABINET +shelf = IfcFurnitureTypeEnum.SHELF +sofa = IfcFurnitureTypeEnum.SOFA +userdefined = IfcFurnitureTypeEnum.USERDEFINED +notdefined = IfcFurnitureTypeEnum.NOTDEFINED IfcGeographicElementTypeEnum = enum_namespace() -terrain = express_getattr(IfcGeographicElementTypeEnum, 'TERRAIN', INDETERMINATE) -soil_boring_point = express_getattr(IfcGeographicElementTypeEnum, 'SOIL_BORING_POINT', INDETERMINATE) -userdefined = express_getattr(IfcGeographicElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcGeographicElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +terrain = IfcGeographicElementTypeEnum.TERRAIN +soil_boring_point = IfcGeographicElementTypeEnum.SOIL_BORING_POINT +userdefined = IfcGeographicElementTypeEnum.USERDEFINED +notdefined = IfcGeographicElementTypeEnum.NOTDEFINED IfcGeometricProjectionEnum = enum_namespace() -graph_view = express_getattr(IfcGeometricProjectionEnum, 'GRAPH_VIEW', INDETERMINATE) -sketch_view = express_getattr(IfcGeometricProjectionEnum, 'SKETCH_VIEW', INDETERMINATE) -model_view = express_getattr(IfcGeometricProjectionEnum, 'MODEL_VIEW', INDETERMINATE) -plan_view = express_getattr(IfcGeometricProjectionEnum, 'PLAN_VIEW', INDETERMINATE) -reflected_plan_view = express_getattr(IfcGeometricProjectionEnum, 'REFLECTED_PLAN_VIEW', INDETERMINATE) -section_view = express_getattr(IfcGeometricProjectionEnum, 'SECTION_VIEW', INDETERMINATE) -elevation_view = express_getattr(IfcGeometricProjectionEnum, 'ELEVATION_VIEW', INDETERMINATE) -userdefined = express_getattr(IfcGeometricProjectionEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcGeometricProjectionEnum, 'NOTDEFINED', INDETERMINATE) +graph_view = IfcGeometricProjectionEnum.GRAPH_VIEW +sketch_view = IfcGeometricProjectionEnum.SKETCH_VIEW +model_view = IfcGeometricProjectionEnum.MODEL_VIEW +plan_view = IfcGeometricProjectionEnum.PLAN_VIEW +reflected_plan_view = IfcGeometricProjectionEnum.REFLECTED_PLAN_VIEW +section_view = IfcGeometricProjectionEnum.SECTION_VIEW +elevation_view = IfcGeometricProjectionEnum.ELEVATION_VIEW +userdefined = IfcGeometricProjectionEnum.USERDEFINED +notdefined = IfcGeometricProjectionEnum.NOTDEFINED IfcGlobalOrLocalEnum = enum_namespace() -global_coords = express_getattr(IfcGlobalOrLocalEnum, 'GLOBAL_COORDS', INDETERMINATE) -local_coords = express_getattr(IfcGlobalOrLocalEnum, 'LOCAL_COORDS', INDETERMINATE) +global_coords = IfcGlobalOrLocalEnum.GLOBAL_COORDS +local_coords = IfcGlobalOrLocalEnum.LOCAL_COORDS IfcGridTypeEnum = enum_namespace() -rectangular = express_getattr(IfcGridTypeEnum, 'RECTANGULAR', INDETERMINATE) -radial = express_getattr(IfcGridTypeEnum, 'RADIAL', INDETERMINATE) -triangular = express_getattr(IfcGridTypeEnum, 'TRIANGULAR', INDETERMINATE) -irregular = express_getattr(IfcGridTypeEnum, 'IRREGULAR', INDETERMINATE) -userdefined = express_getattr(IfcGridTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcGridTypeEnum, 'NOTDEFINED', INDETERMINATE) +rectangular = IfcGridTypeEnum.RECTANGULAR +radial = IfcGridTypeEnum.RADIAL +triangular = IfcGridTypeEnum.TRIANGULAR +irregular = IfcGridTypeEnum.IRREGULAR +userdefined = IfcGridTypeEnum.USERDEFINED +notdefined = IfcGridTypeEnum.NOTDEFINED IfcHeatExchangerTypeEnum = enum_namespace() -plate = express_getattr(IfcHeatExchangerTypeEnum, 'PLATE', INDETERMINATE) -shellandtube = express_getattr(IfcHeatExchangerTypeEnum, 'SHELLANDTUBE', INDETERMINATE) -userdefined = express_getattr(IfcHeatExchangerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcHeatExchangerTypeEnum, 'NOTDEFINED', INDETERMINATE) +plate = IfcHeatExchangerTypeEnum.PLATE +shellandtube = IfcHeatExchangerTypeEnum.SHELLANDTUBE +userdefined = IfcHeatExchangerTypeEnum.USERDEFINED +notdefined = IfcHeatExchangerTypeEnum.NOTDEFINED IfcHumidifierTypeEnum = enum_namespace() -steaminjection = express_getattr(IfcHumidifierTypeEnum, 'STEAMINJECTION', INDETERMINATE) -adiabaticairwasher = express_getattr(IfcHumidifierTypeEnum, 'ADIABATICAIRWASHER', INDETERMINATE) -adiabaticpan = express_getattr(IfcHumidifierTypeEnum, 'ADIABATICPAN', INDETERMINATE) -adiabaticwettedelement = express_getattr(IfcHumidifierTypeEnum, 'ADIABATICWETTEDELEMENT', INDETERMINATE) -adiabaticatomizing = express_getattr(IfcHumidifierTypeEnum, 'ADIABATICATOMIZING', INDETERMINATE) -adiabaticultrasonic = express_getattr(IfcHumidifierTypeEnum, 'ADIABATICULTRASONIC', INDETERMINATE) -adiabaticrigidmedia = express_getattr(IfcHumidifierTypeEnum, 'ADIABATICRIGIDMEDIA', INDETERMINATE) -adiabaticcompressedairnozzle = express_getattr(IfcHumidifierTypeEnum, 'ADIABATICCOMPRESSEDAIRNOZZLE', INDETERMINATE) -assistedelectric = express_getattr(IfcHumidifierTypeEnum, 'ASSISTEDELECTRIC', INDETERMINATE) -assistednaturalgas = express_getattr(IfcHumidifierTypeEnum, 'ASSISTEDNATURALGAS', INDETERMINATE) -assistedpropane = express_getattr(IfcHumidifierTypeEnum, 'ASSISTEDPROPANE', INDETERMINATE) -assistedbutane = express_getattr(IfcHumidifierTypeEnum, 'ASSISTEDBUTANE', INDETERMINATE) -assistedsteam = express_getattr(IfcHumidifierTypeEnum, 'ASSISTEDSTEAM', INDETERMINATE) -userdefined = express_getattr(IfcHumidifierTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcHumidifierTypeEnum, 'NOTDEFINED', INDETERMINATE) +steaminjection = IfcHumidifierTypeEnum.STEAMINJECTION +adiabaticairwasher = IfcHumidifierTypeEnum.ADIABATICAIRWASHER +adiabaticpan = IfcHumidifierTypeEnum.ADIABATICPAN +adiabaticwettedelement = IfcHumidifierTypeEnum.ADIABATICWETTEDELEMENT +adiabaticatomizing = IfcHumidifierTypeEnum.ADIABATICATOMIZING +adiabaticultrasonic = IfcHumidifierTypeEnum.ADIABATICULTRASONIC +adiabaticrigidmedia = IfcHumidifierTypeEnum.ADIABATICRIGIDMEDIA +adiabaticcompressedairnozzle = IfcHumidifierTypeEnum.ADIABATICCOMPRESSEDAIRNOZZLE +assistedelectric = IfcHumidifierTypeEnum.ASSISTEDELECTRIC +assistednaturalgas = IfcHumidifierTypeEnum.ASSISTEDNATURALGAS +assistedpropane = IfcHumidifierTypeEnum.ASSISTEDPROPANE +assistedbutane = IfcHumidifierTypeEnum.ASSISTEDBUTANE +assistedsteam = IfcHumidifierTypeEnum.ASSISTEDSTEAM +userdefined = IfcHumidifierTypeEnum.USERDEFINED +notdefined = IfcHumidifierTypeEnum.NOTDEFINED IfcInterceptorTypeEnum = enum_namespace() -cyclonic = express_getattr(IfcInterceptorTypeEnum, 'CYCLONIC', INDETERMINATE) -grease = express_getattr(IfcInterceptorTypeEnum, 'GREASE', INDETERMINATE) -oil = express_getattr(IfcInterceptorTypeEnum, 'OIL', INDETERMINATE) -petrol = express_getattr(IfcInterceptorTypeEnum, 'PETROL', INDETERMINATE) -userdefined = express_getattr(IfcInterceptorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcInterceptorTypeEnum, 'NOTDEFINED', INDETERMINATE) +cyclonic = IfcInterceptorTypeEnum.CYCLONIC +grease = IfcInterceptorTypeEnum.GREASE +oil = IfcInterceptorTypeEnum.OIL +petrol = IfcInterceptorTypeEnum.PETROL +userdefined = IfcInterceptorTypeEnum.USERDEFINED +notdefined = IfcInterceptorTypeEnum.NOTDEFINED IfcInternalOrExternalEnum = enum_namespace() -internal = express_getattr(IfcInternalOrExternalEnum, 'INTERNAL', INDETERMINATE) -external = express_getattr(IfcInternalOrExternalEnum, 'EXTERNAL', INDETERMINATE) -external_earth = express_getattr(IfcInternalOrExternalEnum, 'EXTERNAL_EARTH', INDETERMINATE) -external_water = express_getattr(IfcInternalOrExternalEnum, 'EXTERNAL_WATER', INDETERMINATE) -external_fire = express_getattr(IfcInternalOrExternalEnum, 'EXTERNAL_FIRE', INDETERMINATE) -notdefined = express_getattr(IfcInternalOrExternalEnum, 'NOTDEFINED', INDETERMINATE) +internal = IfcInternalOrExternalEnum.INTERNAL +external = IfcInternalOrExternalEnum.EXTERNAL +external_earth = IfcInternalOrExternalEnum.EXTERNAL_EARTH +external_water = IfcInternalOrExternalEnum.EXTERNAL_WATER +external_fire = IfcInternalOrExternalEnum.EXTERNAL_FIRE +notdefined = IfcInternalOrExternalEnum.NOTDEFINED IfcInventoryTypeEnum = enum_namespace() -assetinventory = express_getattr(IfcInventoryTypeEnum, 'ASSETINVENTORY', INDETERMINATE) -spaceinventory = express_getattr(IfcInventoryTypeEnum, 'SPACEINVENTORY', INDETERMINATE) -furnitureinventory = express_getattr(IfcInventoryTypeEnum, 'FURNITUREINVENTORY', INDETERMINATE) -userdefined = express_getattr(IfcInventoryTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcInventoryTypeEnum, 'NOTDEFINED', INDETERMINATE) +assetinventory = IfcInventoryTypeEnum.ASSETINVENTORY +spaceinventory = IfcInventoryTypeEnum.SPACEINVENTORY +furnitureinventory = IfcInventoryTypeEnum.FURNITUREINVENTORY +userdefined = IfcInventoryTypeEnum.USERDEFINED +notdefined = IfcInventoryTypeEnum.NOTDEFINED IfcJunctionBoxTypeEnum = enum_namespace() -data = express_getattr(IfcJunctionBoxTypeEnum, 'DATA', INDETERMINATE) -power = express_getattr(IfcJunctionBoxTypeEnum, 'POWER', INDETERMINATE) -userdefined = express_getattr(IfcJunctionBoxTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcJunctionBoxTypeEnum, 'NOTDEFINED', INDETERMINATE) +data = IfcJunctionBoxTypeEnum.DATA +power = IfcJunctionBoxTypeEnum.POWER +userdefined = IfcJunctionBoxTypeEnum.USERDEFINED +notdefined = IfcJunctionBoxTypeEnum.NOTDEFINED IfcKnotType = enum_namespace() -uniform_knots = express_getattr(IfcKnotType, 'UNIFORM_KNOTS', INDETERMINATE) -quasi_uniform_knots = express_getattr(IfcKnotType, 'QUASI_UNIFORM_KNOTS', INDETERMINATE) -piecewise_bezier_knots = express_getattr(IfcKnotType, 'PIECEWISE_BEZIER_KNOTS', INDETERMINATE) -unspecified = express_getattr(IfcKnotType, 'UNSPECIFIED', INDETERMINATE) +uniform_knots = IfcKnotType.UNIFORM_KNOTS +quasi_uniform_knots = IfcKnotType.QUASI_UNIFORM_KNOTS +piecewise_bezier_knots = IfcKnotType.PIECEWISE_BEZIER_KNOTS +unspecified = IfcKnotType.UNSPECIFIED IfcLaborResourceTypeEnum = enum_namespace() -administration = express_getattr(IfcLaborResourceTypeEnum, 'ADMINISTRATION', INDETERMINATE) -carpentry = express_getattr(IfcLaborResourceTypeEnum, 'CARPENTRY', INDETERMINATE) -cleaning = express_getattr(IfcLaborResourceTypeEnum, 'CLEANING', INDETERMINATE) -concrete = express_getattr(IfcLaborResourceTypeEnum, 'CONCRETE', INDETERMINATE) -drywall = express_getattr(IfcLaborResourceTypeEnum, 'DRYWALL', INDETERMINATE) -electric = express_getattr(IfcLaborResourceTypeEnum, 'ELECTRIC', INDETERMINATE) -finishing = express_getattr(IfcLaborResourceTypeEnum, 'FINISHING', INDETERMINATE) -flooring = express_getattr(IfcLaborResourceTypeEnum, 'FLOORING', INDETERMINATE) -general = express_getattr(IfcLaborResourceTypeEnum, 'GENERAL', INDETERMINATE) -hvac = express_getattr(IfcLaborResourceTypeEnum, 'HVAC', INDETERMINATE) -landscaping = express_getattr(IfcLaborResourceTypeEnum, 'LANDSCAPING', INDETERMINATE) -masonry = express_getattr(IfcLaborResourceTypeEnum, 'MASONRY', INDETERMINATE) -painting = express_getattr(IfcLaborResourceTypeEnum, 'PAINTING', INDETERMINATE) -paving = express_getattr(IfcLaborResourceTypeEnum, 'PAVING', INDETERMINATE) -plumbing = express_getattr(IfcLaborResourceTypeEnum, 'PLUMBING', INDETERMINATE) -roofing = express_getattr(IfcLaborResourceTypeEnum, 'ROOFING', INDETERMINATE) -sitegrading = express_getattr(IfcLaborResourceTypeEnum, 'SITEGRADING', INDETERMINATE) -steelwork = express_getattr(IfcLaborResourceTypeEnum, 'STEELWORK', INDETERMINATE) -surveying = express_getattr(IfcLaborResourceTypeEnum, 'SURVEYING', INDETERMINATE) -userdefined = express_getattr(IfcLaborResourceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcLaborResourceTypeEnum, 'NOTDEFINED', INDETERMINATE) +administration = IfcLaborResourceTypeEnum.ADMINISTRATION +carpentry = IfcLaborResourceTypeEnum.CARPENTRY +cleaning = IfcLaborResourceTypeEnum.CLEANING +concrete = IfcLaborResourceTypeEnum.CONCRETE +drywall = IfcLaborResourceTypeEnum.DRYWALL +electric = IfcLaborResourceTypeEnum.ELECTRIC +finishing = IfcLaborResourceTypeEnum.FINISHING +flooring = IfcLaborResourceTypeEnum.FLOORING +general = IfcLaborResourceTypeEnum.GENERAL +hvac = IfcLaborResourceTypeEnum.HVAC +landscaping = IfcLaborResourceTypeEnum.LANDSCAPING +masonry = IfcLaborResourceTypeEnum.MASONRY +painting = IfcLaborResourceTypeEnum.PAINTING +paving = IfcLaborResourceTypeEnum.PAVING +plumbing = IfcLaborResourceTypeEnum.PLUMBING +roofing = IfcLaborResourceTypeEnum.ROOFING +sitegrading = IfcLaborResourceTypeEnum.SITEGRADING +steelwork = IfcLaborResourceTypeEnum.STEELWORK +surveying = IfcLaborResourceTypeEnum.SURVEYING +userdefined = IfcLaborResourceTypeEnum.USERDEFINED +notdefined = IfcLaborResourceTypeEnum.NOTDEFINED IfcLampTypeEnum = enum_namespace() -compactfluorescent = express_getattr(IfcLampTypeEnum, 'COMPACTFLUORESCENT', INDETERMINATE) -fluorescent = express_getattr(IfcLampTypeEnum, 'FLUORESCENT', INDETERMINATE) -halogen = express_getattr(IfcLampTypeEnum, 'HALOGEN', INDETERMINATE) -highpressuremercury = express_getattr(IfcLampTypeEnum, 'HIGHPRESSUREMERCURY', INDETERMINATE) -highpressuresodium = express_getattr(IfcLampTypeEnum, 'HIGHPRESSURESODIUM', INDETERMINATE) -led = express_getattr(IfcLampTypeEnum, 'LED', INDETERMINATE) -metalhalide = express_getattr(IfcLampTypeEnum, 'METALHALIDE', INDETERMINATE) -oled = express_getattr(IfcLampTypeEnum, 'OLED', INDETERMINATE) -tungstenfilament = express_getattr(IfcLampTypeEnum, 'TUNGSTENFILAMENT', INDETERMINATE) -userdefined = express_getattr(IfcLampTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcLampTypeEnum, 'NOTDEFINED', INDETERMINATE) +compactfluorescent = IfcLampTypeEnum.COMPACTFLUORESCENT +fluorescent = IfcLampTypeEnum.FLUORESCENT +halogen = IfcLampTypeEnum.HALOGEN +highpressuremercury = IfcLampTypeEnum.HIGHPRESSUREMERCURY +highpressuresodium = IfcLampTypeEnum.HIGHPRESSURESODIUM +led = IfcLampTypeEnum.LED +metalhalide = IfcLampTypeEnum.METALHALIDE +oled = IfcLampTypeEnum.OLED +tungstenfilament = IfcLampTypeEnum.TUNGSTENFILAMENT +userdefined = IfcLampTypeEnum.USERDEFINED +notdefined = IfcLampTypeEnum.NOTDEFINED IfcLayerSetDirectionEnum = enum_namespace() -axis1 = express_getattr(IfcLayerSetDirectionEnum, 'AXIS1', INDETERMINATE) -axis2 = express_getattr(IfcLayerSetDirectionEnum, 'AXIS2', INDETERMINATE) -axis3 = express_getattr(IfcLayerSetDirectionEnum, 'AXIS3', INDETERMINATE) +axis1 = IfcLayerSetDirectionEnum.AXIS1 +axis2 = IfcLayerSetDirectionEnum.AXIS2 +axis3 = IfcLayerSetDirectionEnum.AXIS3 IfcLightDistributionCurveEnum = enum_namespace() -type_a = express_getattr(IfcLightDistributionCurveEnum, 'TYPE_A', INDETERMINATE) -type_b = express_getattr(IfcLightDistributionCurveEnum, 'TYPE_B', INDETERMINATE) -type_c = express_getattr(IfcLightDistributionCurveEnum, 'TYPE_C', INDETERMINATE) -notdefined = express_getattr(IfcLightDistributionCurveEnum, 'NOTDEFINED', INDETERMINATE) +type_a = IfcLightDistributionCurveEnum.TYPE_A +type_b = IfcLightDistributionCurveEnum.TYPE_B +type_c = IfcLightDistributionCurveEnum.TYPE_C +notdefined = IfcLightDistributionCurveEnum.NOTDEFINED IfcLightEmissionSourceEnum = enum_namespace() -compactfluorescent = express_getattr(IfcLightEmissionSourceEnum, 'COMPACTFLUORESCENT', INDETERMINATE) -fluorescent = express_getattr(IfcLightEmissionSourceEnum, 'FLUORESCENT', INDETERMINATE) -highpressuremercury = express_getattr(IfcLightEmissionSourceEnum, 'HIGHPRESSUREMERCURY', INDETERMINATE) -highpressuresodium = express_getattr(IfcLightEmissionSourceEnum, 'HIGHPRESSURESODIUM', INDETERMINATE) -lightemittingdiode = express_getattr(IfcLightEmissionSourceEnum, 'LIGHTEMITTINGDIODE', INDETERMINATE) -lowpressuresodium = express_getattr(IfcLightEmissionSourceEnum, 'LOWPRESSURESODIUM', INDETERMINATE) -lowvoltagehalogen = express_getattr(IfcLightEmissionSourceEnum, 'LOWVOLTAGEHALOGEN', INDETERMINATE) -mainvoltagehalogen = express_getattr(IfcLightEmissionSourceEnum, 'MAINVOLTAGEHALOGEN', INDETERMINATE) -metalhalide = express_getattr(IfcLightEmissionSourceEnum, 'METALHALIDE', INDETERMINATE) -tungstenfilament = express_getattr(IfcLightEmissionSourceEnum, 'TUNGSTENFILAMENT', INDETERMINATE) -notdefined = express_getattr(IfcLightEmissionSourceEnum, 'NOTDEFINED', INDETERMINATE) +compactfluorescent = IfcLightEmissionSourceEnum.COMPACTFLUORESCENT +fluorescent = IfcLightEmissionSourceEnum.FLUORESCENT +highpressuremercury = IfcLightEmissionSourceEnum.HIGHPRESSUREMERCURY +highpressuresodium = IfcLightEmissionSourceEnum.HIGHPRESSURESODIUM +lightemittingdiode = IfcLightEmissionSourceEnum.LIGHTEMITTINGDIODE +lowpressuresodium = IfcLightEmissionSourceEnum.LOWPRESSURESODIUM +lowvoltagehalogen = IfcLightEmissionSourceEnum.LOWVOLTAGEHALOGEN +mainvoltagehalogen = IfcLightEmissionSourceEnum.MAINVOLTAGEHALOGEN +metalhalide = IfcLightEmissionSourceEnum.METALHALIDE +tungstenfilament = IfcLightEmissionSourceEnum.TUNGSTENFILAMENT +notdefined = IfcLightEmissionSourceEnum.NOTDEFINED IfcLightFixtureTypeEnum = enum_namespace() -pointsource = express_getattr(IfcLightFixtureTypeEnum, 'POINTSOURCE', INDETERMINATE) -directionsource = express_getattr(IfcLightFixtureTypeEnum, 'DIRECTIONSOURCE', INDETERMINATE) -securitylighting = express_getattr(IfcLightFixtureTypeEnum, 'SECURITYLIGHTING', INDETERMINATE) -userdefined = express_getattr(IfcLightFixtureTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcLightFixtureTypeEnum, 'NOTDEFINED', INDETERMINATE) +pointsource = IfcLightFixtureTypeEnum.POINTSOURCE +directionsource = IfcLightFixtureTypeEnum.DIRECTIONSOURCE +securitylighting = IfcLightFixtureTypeEnum.SECURITYLIGHTING +userdefined = IfcLightFixtureTypeEnum.USERDEFINED +notdefined = IfcLightFixtureTypeEnum.NOTDEFINED IfcLoadGroupTypeEnum = enum_namespace() -load_group = express_getattr(IfcLoadGroupTypeEnum, 'LOAD_GROUP', INDETERMINATE) -load_case = express_getattr(IfcLoadGroupTypeEnum, 'LOAD_CASE', INDETERMINATE) -load_combination = express_getattr(IfcLoadGroupTypeEnum, 'LOAD_COMBINATION', INDETERMINATE) -userdefined = express_getattr(IfcLoadGroupTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcLoadGroupTypeEnum, 'NOTDEFINED', INDETERMINATE) +load_group = IfcLoadGroupTypeEnum.LOAD_GROUP +load_case = IfcLoadGroupTypeEnum.LOAD_CASE +load_combination = IfcLoadGroupTypeEnum.LOAD_COMBINATION +userdefined = IfcLoadGroupTypeEnum.USERDEFINED +notdefined = IfcLoadGroupTypeEnum.NOTDEFINED IfcLogicalOperatorEnum = enum_namespace() -logicaland = express_getattr(IfcLogicalOperatorEnum, 'LOGICALAND', INDETERMINATE) -logicalor = express_getattr(IfcLogicalOperatorEnum, 'LOGICALOR', INDETERMINATE) -logicalxor = express_getattr(IfcLogicalOperatorEnum, 'LOGICALXOR', INDETERMINATE) -logicalnotand = express_getattr(IfcLogicalOperatorEnum, 'LOGICALNOTAND', INDETERMINATE) -logicalnotor = express_getattr(IfcLogicalOperatorEnum, 'LOGICALNOTOR', INDETERMINATE) +logicaland = IfcLogicalOperatorEnum.LOGICALAND +logicalor = IfcLogicalOperatorEnum.LOGICALOR +logicalxor = IfcLogicalOperatorEnum.LOGICALXOR +logicalnotand = IfcLogicalOperatorEnum.LOGICALNOTAND +logicalnotor = IfcLogicalOperatorEnum.LOGICALNOTOR IfcMechanicalFastenerTypeEnum = enum_namespace() -anchorbolt = express_getattr(IfcMechanicalFastenerTypeEnum, 'ANCHORBOLT', INDETERMINATE) -bolt = express_getattr(IfcMechanicalFastenerTypeEnum, 'BOLT', INDETERMINATE) -dowel = express_getattr(IfcMechanicalFastenerTypeEnum, 'DOWEL', INDETERMINATE) -nail = express_getattr(IfcMechanicalFastenerTypeEnum, 'NAIL', INDETERMINATE) -nailplate = express_getattr(IfcMechanicalFastenerTypeEnum, 'NAILPLATE', INDETERMINATE) -rivet = express_getattr(IfcMechanicalFastenerTypeEnum, 'RIVET', INDETERMINATE) -screw = express_getattr(IfcMechanicalFastenerTypeEnum, 'SCREW', INDETERMINATE) -shearconnector = express_getattr(IfcMechanicalFastenerTypeEnum, 'SHEARCONNECTOR', INDETERMINATE) -staple = express_getattr(IfcMechanicalFastenerTypeEnum, 'STAPLE', INDETERMINATE) -studshearconnector = express_getattr(IfcMechanicalFastenerTypeEnum, 'STUDSHEARCONNECTOR', INDETERMINATE) -coupler = express_getattr(IfcMechanicalFastenerTypeEnum, 'COUPLER', INDETERMINATE) -userdefined = express_getattr(IfcMechanicalFastenerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcMechanicalFastenerTypeEnum, 'NOTDEFINED', INDETERMINATE) +anchorbolt = IfcMechanicalFastenerTypeEnum.ANCHORBOLT +bolt = IfcMechanicalFastenerTypeEnum.BOLT +dowel = IfcMechanicalFastenerTypeEnum.DOWEL +nail = IfcMechanicalFastenerTypeEnum.NAIL +nailplate = IfcMechanicalFastenerTypeEnum.NAILPLATE +rivet = IfcMechanicalFastenerTypeEnum.RIVET +screw = IfcMechanicalFastenerTypeEnum.SCREW +shearconnector = IfcMechanicalFastenerTypeEnum.SHEARCONNECTOR +staple = IfcMechanicalFastenerTypeEnum.STAPLE +studshearconnector = IfcMechanicalFastenerTypeEnum.STUDSHEARCONNECTOR +coupler = IfcMechanicalFastenerTypeEnum.COUPLER +userdefined = IfcMechanicalFastenerTypeEnum.USERDEFINED +notdefined = IfcMechanicalFastenerTypeEnum.NOTDEFINED IfcMedicalDeviceTypeEnum = enum_namespace() -airstation = express_getattr(IfcMedicalDeviceTypeEnum, 'AIRSTATION', INDETERMINATE) -feedairunit = express_getattr(IfcMedicalDeviceTypeEnum, 'FEEDAIRUNIT', INDETERMINATE) -oxygengenerator = express_getattr(IfcMedicalDeviceTypeEnum, 'OXYGENGENERATOR', INDETERMINATE) -oxygenplant = express_getattr(IfcMedicalDeviceTypeEnum, 'OXYGENPLANT', INDETERMINATE) -vacuumstation = express_getattr(IfcMedicalDeviceTypeEnum, 'VACUUMSTATION', INDETERMINATE) -userdefined = express_getattr(IfcMedicalDeviceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcMedicalDeviceTypeEnum, 'NOTDEFINED', INDETERMINATE) +airstation = IfcMedicalDeviceTypeEnum.AIRSTATION +feedairunit = IfcMedicalDeviceTypeEnum.FEEDAIRUNIT +oxygengenerator = IfcMedicalDeviceTypeEnum.OXYGENGENERATOR +oxygenplant = IfcMedicalDeviceTypeEnum.OXYGENPLANT +vacuumstation = IfcMedicalDeviceTypeEnum.VACUUMSTATION +userdefined = IfcMedicalDeviceTypeEnum.USERDEFINED +notdefined = IfcMedicalDeviceTypeEnum.NOTDEFINED IfcMemberTypeEnum = enum_namespace() -brace = express_getattr(IfcMemberTypeEnum, 'BRACE', INDETERMINATE) -chord = express_getattr(IfcMemberTypeEnum, 'CHORD', INDETERMINATE) -collar = express_getattr(IfcMemberTypeEnum, 'COLLAR', INDETERMINATE) -member = express_getattr(IfcMemberTypeEnum, 'MEMBER', INDETERMINATE) -mullion = express_getattr(IfcMemberTypeEnum, 'MULLION', INDETERMINATE) -plate = express_getattr(IfcMemberTypeEnum, 'PLATE', INDETERMINATE) -post = express_getattr(IfcMemberTypeEnum, 'POST', INDETERMINATE) -purlin = express_getattr(IfcMemberTypeEnum, 'PURLIN', INDETERMINATE) -rafter = express_getattr(IfcMemberTypeEnum, 'RAFTER', INDETERMINATE) -stringer = express_getattr(IfcMemberTypeEnum, 'STRINGER', INDETERMINATE) -strut = express_getattr(IfcMemberTypeEnum, 'STRUT', INDETERMINATE) -stud = express_getattr(IfcMemberTypeEnum, 'STUD', INDETERMINATE) -stiffening_rib = express_getattr(IfcMemberTypeEnum, 'STIFFENING_RIB', INDETERMINATE) -arch_segment = express_getattr(IfcMemberTypeEnum, 'ARCH_SEGMENT', INDETERMINATE) -suspension_cable = express_getattr(IfcMemberTypeEnum, 'SUSPENSION_CABLE', INDETERMINATE) -suspender = express_getattr(IfcMemberTypeEnum, 'SUSPENDER', INDETERMINATE) -stay_cable = express_getattr(IfcMemberTypeEnum, 'STAY_CABLE', INDETERMINATE) -userdefined = express_getattr(IfcMemberTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcMemberTypeEnum, 'NOTDEFINED', INDETERMINATE) +brace = IfcMemberTypeEnum.BRACE +chord = IfcMemberTypeEnum.CHORD +collar = IfcMemberTypeEnum.COLLAR +member = IfcMemberTypeEnum.MEMBER +mullion = IfcMemberTypeEnum.MULLION +plate = IfcMemberTypeEnum.PLATE +post = IfcMemberTypeEnum.POST +purlin = IfcMemberTypeEnum.PURLIN +rafter = IfcMemberTypeEnum.RAFTER +stringer = IfcMemberTypeEnum.STRINGER +strut = IfcMemberTypeEnum.STRUT +stud = IfcMemberTypeEnum.STUD +stiffening_rib = IfcMemberTypeEnum.STIFFENING_RIB +arch_segment = IfcMemberTypeEnum.ARCH_SEGMENT +suspension_cable = IfcMemberTypeEnum.SUSPENSION_CABLE +suspender = IfcMemberTypeEnum.SUSPENDER +stay_cable = IfcMemberTypeEnum.STAY_CABLE +userdefined = IfcMemberTypeEnum.USERDEFINED +notdefined = IfcMemberTypeEnum.NOTDEFINED IfcMotorConnectionTypeEnum = enum_namespace() -beltdrive = express_getattr(IfcMotorConnectionTypeEnum, 'BELTDRIVE', INDETERMINATE) -coupling = express_getattr(IfcMotorConnectionTypeEnum, 'COUPLING', INDETERMINATE) -directdrive = express_getattr(IfcMotorConnectionTypeEnum, 'DIRECTDRIVE', INDETERMINATE) -userdefined = express_getattr(IfcMotorConnectionTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcMotorConnectionTypeEnum, 'NOTDEFINED', INDETERMINATE) +beltdrive = IfcMotorConnectionTypeEnum.BELTDRIVE +coupling = IfcMotorConnectionTypeEnum.COUPLING +directdrive = IfcMotorConnectionTypeEnum.DIRECTDRIVE +userdefined = IfcMotorConnectionTypeEnum.USERDEFINED +notdefined = IfcMotorConnectionTypeEnum.NOTDEFINED IfcNullStyle = enum_namespace() -null = express_getattr(IfcNullStyle, 'NULL', INDETERMINATE) +null = IfcNullStyle.NULL IfcObjectTypeEnum = enum_namespace() -product = express_getattr(IfcObjectTypeEnum, 'PRODUCT', INDETERMINATE) -process = express_getattr(IfcObjectTypeEnum, 'PROCESS', INDETERMINATE) -control = express_getattr(IfcObjectTypeEnum, 'CONTROL', INDETERMINATE) -resource = express_getattr(IfcObjectTypeEnum, 'RESOURCE', INDETERMINATE) -actor = express_getattr(IfcObjectTypeEnum, 'ACTOR', INDETERMINATE) -group = express_getattr(IfcObjectTypeEnum, 'GROUP', INDETERMINATE) -project = express_getattr(IfcObjectTypeEnum, 'PROJECT', INDETERMINATE) -notdefined = express_getattr(IfcObjectTypeEnum, 'NOTDEFINED', INDETERMINATE) +product = IfcObjectTypeEnum.PRODUCT +process = IfcObjectTypeEnum.PROCESS +control = IfcObjectTypeEnum.CONTROL +resource = IfcObjectTypeEnum.RESOURCE +actor = IfcObjectTypeEnum.ACTOR +group = IfcObjectTypeEnum.GROUP +project = IfcObjectTypeEnum.PROJECT +notdefined = IfcObjectTypeEnum.NOTDEFINED IfcObjectiveEnum = enum_namespace() -codecompliance = express_getattr(IfcObjectiveEnum, 'CODECOMPLIANCE', INDETERMINATE) -codewaiver = express_getattr(IfcObjectiveEnum, 'CODEWAIVER', INDETERMINATE) -designintent = express_getattr(IfcObjectiveEnum, 'DESIGNINTENT', INDETERMINATE) -external = express_getattr(IfcObjectiveEnum, 'EXTERNAL', INDETERMINATE) -healthandsafety = express_getattr(IfcObjectiveEnum, 'HEALTHANDSAFETY', INDETERMINATE) -mergeconflict = express_getattr(IfcObjectiveEnum, 'MERGECONFLICT', INDETERMINATE) -modelview = express_getattr(IfcObjectiveEnum, 'MODELVIEW', INDETERMINATE) -parameter = express_getattr(IfcObjectiveEnum, 'PARAMETER', INDETERMINATE) -requirement = express_getattr(IfcObjectiveEnum, 'REQUIREMENT', INDETERMINATE) -specification = express_getattr(IfcObjectiveEnum, 'SPECIFICATION', INDETERMINATE) -triggercondition = express_getattr(IfcObjectiveEnum, 'TRIGGERCONDITION', INDETERMINATE) -userdefined = express_getattr(IfcObjectiveEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcObjectiveEnum, 'NOTDEFINED', INDETERMINATE) +codecompliance = IfcObjectiveEnum.CODECOMPLIANCE +codewaiver = IfcObjectiveEnum.CODEWAIVER +designintent = IfcObjectiveEnum.DESIGNINTENT +external = IfcObjectiveEnum.EXTERNAL +healthandsafety = IfcObjectiveEnum.HEALTHANDSAFETY +mergeconflict = IfcObjectiveEnum.MERGECONFLICT +modelview = IfcObjectiveEnum.MODELVIEW +parameter = IfcObjectiveEnum.PARAMETER +requirement = IfcObjectiveEnum.REQUIREMENT +specification = IfcObjectiveEnum.SPECIFICATION +triggercondition = IfcObjectiveEnum.TRIGGERCONDITION +userdefined = IfcObjectiveEnum.USERDEFINED +notdefined = IfcObjectiveEnum.NOTDEFINED IfcOccupantTypeEnum = enum_namespace() -assignee = express_getattr(IfcOccupantTypeEnum, 'ASSIGNEE', INDETERMINATE) -assignor = express_getattr(IfcOccupantTypeEnum, 'ASSIGNOR', INDETERMINATE) -lessee = express_getattr(IfcOccupantTypeEnum, 'LESSEE', INDETERMINATE) -lessor = express_getattr(IfcOccupantTypeEnum, 'LESSOR', INDETERMINATE) -lettingagent = express_getattr(IfcOccupantTypeEnum, 'LETTINGAGENT', INDETERMINATE) -owner = express_getattr(IfcOccupantTypeEnum, 'OWNER', INDETERMINATE) -tenant = express_getattr(IfcOccupantTypeEnum, 'TENANT', INDETERMINATE) -userdefined = express_getattr(IfcOccupantTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcOccupantTypeEnum, 'NOTDEFINED', INDETERMINATE) +assignee = IfcOccupantTypeEnum.ASSIGNEE +assignor = IfcOccupantTypeEnum.ASSIGNOR +lessee = IfcOccupantTypeEnum.LESSEE +lessor = IfcOccupantTypeEnum.LESSOR +lettingagent = IfcOccupantTypeEnum.LETTINGAGENT +owner = IfcOccupantTypeEnum.OWNER +tenant = IfcOccupantTypeEnum.TENANT +userdefined = IfcOccupantTypeEnum.USERDEFINED +notdefined = IfcOccupantTypeEnum.NOTDEFINED IfcOpeningElementTypeEnum = enum_namespace() -opening = express_getattr(IfcOpeningElementTypeEnum, 'OPENING', INDETERMINATE) -recess = express_getattr(IfcOpeningElementTypeEnum, 'RECESS', INDETERMINATE) -userdefined = express_getattr(IfcOpeningElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcOpeningElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +opening = IfcOpeningElementTypeEnum.OPENING +recess = IfcOpeningElementTypeEnum.RECESS +userdefined = IfcOpeningElementTypeEnum.USERDEFINED +notdefined = IfcOpeningElementTypeEnum.NOTDEFINED IfcOutletTypeEnum = enum_namespace() -audiovisualoutlet = express_getattr(IfcOutletTypeEnum, 'AUDIOVISUALOUTLET', INDETERMINATE) -communicationsoutlet = express_getattr(IfcOutletTypeEnum, 'COMMUNICATIONSOUTLET', INDETERMINATE) -poweroutlet = express_getattr(IfcOutletTypeEnum, 'POWEROUTLET', INDETERMINATE) -dataoutlet = express_getattr(IfcOutletTypeEnum, 'DATAOUTLET', INDETERMINATE) -telephoneoutlet = express_getattr(IfcOutletTypeEnum, 'TELEPHONEOUTLET', INDETERMINATE) -userdefined = express_getattr(IfcOutletTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcOutletTypeEnum, 'NOTDEFINED', INDETERMINATE) +audiovisualoutlet = IfcOutletTypeEnum.AUDIOVISUALOUTLET +communicationsoutlet = IfcOutletTypeEnum.COMMUNICATIONSOUTLET +poweroutlet = IfcOutletTypeEnum.POWEROUTLET +dataoutlet = IfcOutletTypeEnum.DATAOUTLET +telephoneoutlet = IfcOutletTypeEnum.TELEPHONEOUTLET +userdefined = IfcOutletTypeEnum.USERDEFINED +notdefined = IfcOutletTypeEnum.NOTDEFINED IfcPerformanceHistoryTypeEnum = enum_namespace() -userdefined = express_getattr(IfcPerformanceHistoryTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPerformanceHistoryTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcPerformanceHistoryTypeEnum.USERDEFINED +notdefined = IfcPerformanceHistoryTypeEnum.NOTDEFINED IfcPermeableCoveringOperationEnum = enum_namespace() -grill = express_getattr(IfcPermeableCoveringOperationEnum, 'GRILL', INDETERMINATE) -louver = express_getattr(IfcPermeableCoveringOperationEnum, 'LOUVER', INDETERMINATE) -screen = express_getattr(IfcPermeableCoveringOperationEnum, 'SCREEN', INDETERMINATE) -userdefined = express_getattr(IfcPermeableCoveringOperationEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPermeableCoveringOperationEnum, 'NOTDEFINED', INDETERMINATE) +grill = IfcPermeableCoveringOperationEnum.GRILL +louver = IfcPermeableCoveringOperationEnum.LOUVER +screen = IfcPermeableCoveringOperationEnum.SCREEN +userdefined = IfcPermeableCoveringOperationEnum.USERDEFINED +notdefined = IfcPermeableCoveringOperationEnum.NOTDEFINED IfcPermitTypeEnum = enum_namespace() -access = express_getattr(IfcPermitTypeEnum, 'ACCESS', INDETERMINATE) -building = express_getattr(IfcPermitTypeEnum, 'BUILDING', INDETERMINATE) -work = express_getattr(IfcPermitTypeEnum, 'WORK', INDETERMINATE) -userdefined = express_getattr(IfcPermitTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPermitTypeEnum, 'NOTDEFINED', INDETERMINATE) +access = IfcPermitTypeEnum.ACCESS +building = IfcPermitTypeEnum.BUILDING +work = IfcPermitTypeEnum.WORK +userdefined = IfcPermitTypeEnum.USERDEFINED +notdefined = IfcPermitTypeEnum.NOTDEFINED IfcPhysicalOrVirtualEnum = enum_namespace() -physical = express_getattr(IfcPhysicalOrVirtualEnum, 'PHYSICAL', INDETERMINATE) -virtual = express_getattr(IfcPhysicalOrVirtualEnum, 'VIRTUAL', INDETERMINATE) -notdefined = express_getattr(IfcPhysicalOrVirtualEnum, 'NOTDEFINED', INDETERMINATE) +physical = IfcPhysicalOrVirtualEnum.PHYSICAL +virtual = IfcPhysicalOrVirtualEnum.VIRTUAL +notdefined = IfcPhysicalOrVirtualEnum.NOTDEFINED IfcPileConstructionEnum = enum_namespace() -cast_in_place = express_getattr(IfcPileConstructionEnum, 'CAST_IN_PLACE', INDETERMINATE) -composite = express_getattr(IfcPileConstructionEnum, 'COMPOSITE', INDETERMINATE) -precast_concrete = express_getattr(IfcPileConstructionEnum, 'PRECAST_CONCRETE', INDETERMINATE) -prefab_steel = express_getattr(IfcPileConstructionEnum, 'PREFAB_STEEL', INDETERMINATE) -userdefined = express_getattr(IfcPileConstructionEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPileConstructionEnum, 'NOTDEFINED', INDETERMINATE) +cast_in_place = IfcPileConstructionEnum.CAST_IN_PLACE +composite = IfcPileConstructionEnum.COMPOSITE +precast_concrete = IfcPileConstructionEnum.PRECAST_CONCRETE +prefab_steel = IfcPileConstructionEnum.PREFAB_STEEL +userdefined = IfcPileConstructionEnum.USERDEFINED +notdefined = IfcPileConstructionEnum.NOTDEFINED IfcPileTypeEnum = enum_namespace() -bored = express_getattr(IfcPileTypeEnum, 'BORED', INDETERMINATE) -driven = express_getattr(IfcPileTypeEnum, 'DRIVEN', INDETERMINATE) -jetgrouting = express_getattr(IfcPileTypeEnum, 'JETGROUTING', INDETERMINATE) -cohesion = express_getattr(IfcPileTypeEnum, 'COHESION', INDETERMINATE) -friction = express_getattr(IfcPileTypeEnum, 'FRICTION', INDETERMINATE) -support = express_getattr(IfcPileTypeEnum, 'SUPPORT', INDETERMINATE) -userdefined = express_getattr(IfcPileTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPileTypeEnum, 'NOTDEFINED', INDETERMINATE) +bored = IfcPileTypeEnum.BORED +driven = IfcPileTypeEnum.DRIVEN +jetgrouting = IfcPileTypeEnum.JETGROUTING +cohesion = IfcPileTypeEnum.COHESION +friction = IfcPileTypeEnum.FRICTION +support = IfcPileTypeEnum.SUPPORT +userdefined = IfcPileTypeEnum.USERDEFINED +notdefined = IfcPileTypeEnum.NOTDEFINED IfcPipeFittingTypeEnum = enum_namespace() -bend = express_getattr(IfcPipeFittingTypeEnum, 'BEND', INDETERMINATE) -connector = express_getattr(IfcPipeFittingTypeEnum, 'CONNECTOR', INDETERMINATE) -entry = express_getattr(IfcPipeFittingTypeEnum, 'ENTRY', INDETERMINATE) -exit = express_getattr(IfcPipeFittingTypeEnum, 'EXIT', INDETERMINATE) -junction = express_getattr(IfcPipeFittingTypeEnum, 'JUNCTION', INDETERMINATE) -obstruction = express_getattr(IfcPipeFittingTypeEnum, 'OBSTRUCTION', INDETERMINATE) -transition = express_getattr(IfcPipeFittingTypeEnum, 'TRANSITION', INDETERMINATE) -userdefined = express_getattr(IfcPipeFittingTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPipeFittingTypeEnum, 'NOTDEFINED', INDETERMINATE) +bend = IfcPipeFittingTypeEnum.BEND +connector = IfcPipeFittingTypeEnum.CONNECTOR +entry = IfcPipeFittingTypeEnum.ENTRY +exit = IfcPipeFittingTypeEnum.EXIT +junction = IfcPipeFittingTypeEnum.JUNCTION +obstruction = IfcPipeFittingTypeEnum.OBSTRUCTION +transition = IfcPipeFittingTypeEnum.TRANSITION +userdefined = IfcPipeFittingTypeEnum.USERDEFINED +notdefined = IfcPipeFittingTypeEnum.NOTDEFINED IfcPipeSegmentTypeEnum = enum_namespace() -culvert = express_getattr(IfcPipeSegmentTypeEnum, 'CULVERT', INDETERMINATE) -flexiblesegment = express_getattr(IfcPipeSegmentTypeEnum, 'FLEXIBLESEGMENT', INDETERMINATE) -rigidsegment = express_getattr(IfcPipeSegmentTypeEnum, 'RIGIDSEGMENT', INDETERMINATE) -gutter = express_getattr(IfcPipeSegmentTypeEnum, 'GUTTER', INDETERMINATE) -spool = express_getattr(IfcPipeSegmentTypeEnum, 'SPOOL', INDETERMINATE) -userdefined = express_getattr(IfcPipeSegmentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPipeSegmentTypeEnum, 'NOTDEFINED', INDETERMINATE) +culvert = IfcPipeSegmentTypeEnum.CULVERT +flexiblesegment = IfcPipeSegmentTypeEnum.FLEXIBLESEGMENT +rigidsegment = IfcPipeSegmentTypeEnum.RIGIDSEGMENT +gutter = IfcPipeSegmentTypeEnum.GUTTER +spool = IfcPipeSegmentTypeEnum.SPOOL +userdefined = IfcPipeSegmentTypeEnum.USERDEFINED +notdefined = IfcPipeSegmentTypeEnum.NOTDEFINED IfcPlateTypeEnum = enum_namespace() -curtain_panel = express_getattr(IfcPlateTypeEnum, 'CURTAIN_PANEL', INDETERMINATE) -sheet = express_getattr(IfcPlateTypeEnum, 'SHEET', INDETERMINATE) -flange_plate = express_getattr(IfcPlateTypeEnum, 'FLANGE_PLATE', INDETERMINATE) -web_plate = express_getattr(IfcPlateTypeEnum, 'WEB_PLATE', INDETERMINATE) -stiffener_plate = express_getattr(IfcPlateTypeEnum, 'STIFFENER_PLATE', INDETERMINATE) -gusset_plate = express_getattr(IfcPlateTypeEnum, 'GUSSET_PLATE', INDETERMINATE) -cover_plate = express_getattr(IfcPlateTypeEnum, 'COVER_PLATE', INDETERMINATE) -splice_plate = express_getattr(IfcPlateTypeEnum, 'SPLICE_PLATE', INDETERMINATE) -base_plate = express_getattr(IfcPlateTypeEnum, 'BASE_PLATE', INDETERMINATE) -userdefined = express_getattr(IfcPlateTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPlateTypeEnum, 'NOTDEFINED', INDETERMINATE) +curtain_panel = IfcPlateTypeEnum.CURTAIN_PANEL +sheet = IfcPlateTypeEnum.SHEET +flange_plate = IfcPlateTypeEnum.FLANGE_PLATE +web_plate = IfcPlateTypeEnum.WEB_PLATE +stiffener_plate = IfcPlateTypeEnum.STIFFENER_PLATE +gusset_plate = IfcPlateTypeEnum.GUSSET_PLATE +cover_plate = IfcPlateTypeEnum.COVER_PLATE +splice_plate = IfcPlateTypeEnum.SPLICE_PLATE +base_plate = IfcPlateTypeEnum.BASE_PLATE +userdefined = IfcPlateTypeEnum.USERDEFINED +notdefined = IfcPlateTypeEnum.NOTDEFINED IfcPreferredSurfaceCurveRepresentation = enum_namespace() -curve3d = express_getattr(IfcPreferredSurfaceCurveRepresentation, 'CURVE3D', INDETERMINATE) -pcurve_s1 = express_getattr(IfcPreferredSurfaceCurveRepresentation, 'PCURVE_S1', INDETERMINATE) -pcurve_s2 = express_getattr(IfcPreferredSurfaceCurveRepresentation, 'PCURVE_S2', INDETERMINATE) +curve3d = IfcPreferredSurfaceCurveRepresentation.CURVE3D +pcurve_s1 = IfcPreferredSurfaceCurveRepresentation.PCURVE_S1 +pcurve_s2 = IfcPreferredSurfaceCurveRepresentation.PCURVE_S2 IfcProcedureTypeEnum = enum_namespace() -advice_caution = express_getattr(IfcProcedureTypeEnum, 'ADVICE_CAUTION', INDETERMINATE) -advice_note = express_getattr(IfcProcedureTypeEnum, 'ADVICE_NOTE', INDETERMINATE) -advice_warning = express_getattr(IfcProcedureTypeEnum, 'ADVICE_WARNING', INDETERMINATE) -calibration = express_getattr(IfcProcedureTypeEnum, 'CALIBRATION', INDETERMINATE) -diagnostic = express_getattr(IfcProcedureTypeEnum, 'DIAGNOSTIC', INDETERMINATE) -shutdown = express_getattr(IfcProcedureTypeEnum, 'SHUTDOWN', INDETERMINATE) -startup = express_getattr(IfcProcedureTypeEnum, 'STARTUP', INDETERMINATE) -userdefined = express_getattr(IfcProcedureTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcProcedureTypeEnum, 'NOTDEFINED', INDETERMINATE) +advice_caution = IfcProcedureTypeEnum.ADVICE_CAUTION +advice_note = IfcProcedureTypeEnum.ADVICE_NOTE +advice_warning = IfcProcedureTypeEnum.ADVICE_WARNING +calibration = IfcProcedureTypeEnum.CALIBRATION +diagnostic = IfcProcedureTypeEnum.DIAGNOSTIC +shutdown = IfcProcedureTypeEnum.SHUTDOWN +startup = IfcProcedureTypeEnum.STARTUP +userdefined = IfcProcedureTypeEnum.USERDEFINED +notdefined = IfcProcedureTypeEnum.NOTDEFINED IfcProfileTypeEnum = enum_namespace() -curve = express_getattr(IfcProfileTypeEnum, 'CURVE', INDETERMINATE) -area = express_getattr(IfcProfileTypeEnum, 'AREA', INDETERMINATE) +curve = IfcProfileTypeEnum.CURVE +area = IfcProfileTypeEnum.AREA IfcProjectOrderTypeEnum = enum_namespace() -changeorder = express_getattr(IfcProjectOrderTypeEnum, 'CHANGEORDER', INDETERMINATE) -maintenanceworkorder = express_getattr(IfcProjectOrderTypeEnum, 'MAINTENANCEWORKORDER', INDETERMINATE) -moveorder = express_getattr(IfcProjectOrderTypeEnum, 'MOVEORDER', INDETERMINATE) -purchaseorder = express_getattr(IfcProjectOrderTypeEnum, 'PURCHASEORDER', INDETERMINATE) -workorder = express_getattr(IfcProjectOrderTypeEnum, 'WORKORDER', INDETERMINATE) -userdefined = express_getattr(IfcProjectOrderTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcProjectOrderTypeEnum, 'NOTDEFINED', INDETERMINATE) +changeorder = IfcProjectOrderTypeEnum.CHANGEORDER +maintenanceworkorder = IfcProjectOrderTypeEnum.MAINTENANCEWORKORDER +moveorder = IfcProjectOrderTypeEnum.MOVEORDER +purchaseorder = IfcProjectOrderTypeEnum.PURCHASEORDER +workorder = IfcProjectOrderTypeEnum.WORKORDER +userdefined = IfcProjectOrderTypeEnum.USERDEFINED +notdefined = IfcProjectOrderTypeEnum.NOTDEFINED IfcProjectedOrTrueLengthEnum = enum_namespace() -projected_length = express_getattr(IfcProjectedOrTrueLengthEnum, 'PROJECTED_LENGTH', INDETERMINATE) -true_length = express_getattr(IfcProjectedOrTrueLengthEnum, 'TRUE_LENGTH', INDETERMINATE) +projected_length = IfcProjectedOrTrueLengthEnum.PROJECTED_LENGTH +true_length = IfcProjectedOrTrueLengthEnum.TRUE_LENGTH IfcProjectionElementTypeEnum = enum_namespace() -blister = express_getattr(IfcProjectionElementTypeEnum, 'BLISTER', INDETERMINATE) -deviator = express_getattr(IfcProjectionElementTypeEnum, 'DEVIATOR', INDETERMINATE) -userdefined = express_getattr(IfcProjectionElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcProjectionElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +blister = IfcProjectionElementTypeEnum.BLISTER +deviator = IfcProjectionElementTypeEnum.DEVIATOR +userdefined = IfcProjectionElementTypeEnum.USERDEFINED +notdefined = IfcProjectionElementTypeEnum.NOTDEFINED IfcPropertySetTemplateTypeEnum = enum_namespace() -pset_typedrivenonly = express_getattr(IfcPropertySetTemplateTypeEnum, 'PSET_TYPEDRIVENONLY', INDETERMINATE) -pset_typedrivenoverride = express_getattr(IfcPropertySetTemplateTypeEnum, 'PSET_TYPEDRIVENOVERRIDE', INDETERMINATE) -pset_occurrencedriven = express_getattr(IfcPropertySetTemplateTypeEnum, 'PSET_OCCURRENCEDRIVEN', INDETERMINATE) -pset_performancedriven = express_getattr(IfcPropertySetTemplateTypeEnum, 'PSET_PERFORMANCEDRIVEN', INDETERMINATE) -qto_typedrivenonly = express_getattr(IfcPropertySetTemplateTypeEnum, 'QTO_TYPEDRIVENONLY', INDETERMINATE) -qto_typedrivenoverride = express_getattr(IfcPropertySetTemplateTypeEnum, 'QTO_TYPEDRIVENOVERRIDE', INDETERMINATE) -qto_occurrencedriven = express_getattr(IfcPropertySetTemplateTypeEnum, 'QTO_OCCURRENCEDRIVEN', INDETERMINATE) -notdefined = express_getattr(IfcPropertySetTemplateTypeEnum, 'NOTDEFINED', INDETERMINATE) +pset_typedrivenonly = IfcPropertySetTemplateTypeEnum.PSET_TYPEDRIVENONLY +pset_typedrivenoverride = IfcPropertySetTemplateTypeEnum.PSET_TYPEDRIVENOVERRIDE +pset_occurrencedriven = IfcPropertySetTemplateTypeEnum.PSET_OCCURRENCEDRIVEN +pset_performancedriven = IfcPropertySetTemplateTypeEnum.PSET_PERFORMANCEDRIVEN +qto_typedrivenonly = IfcPropertySetTemplateTypeEnum.QTO_TYPEDRIVENONLY +qto_typedrivenoverride = IfcPropertySetTemplateTypeEnum.QTO_TYPEDRIVENOVERRIDE +qto_occurrencedriven = IfcPropertySetTemplateTypeEnum.QTO_OCCURRENCEDRIVEN +notdefined = IfcPropertySetTemplateTypeEnum.NOTDEFINED IfcProtectiveDeviceTrippingUnitTypeEnum = enum_namespace() -electronic = express_getattr(IfcProtectiveDeviceTrippingUnitTypeEnum, 'ELECTRONIC', INDETERMINATE) -electromagnetic = express_getattr(IfcProtectiveDeviceTrippingUnitTypeEnum, 'ELECTROMAGNETIC', INDETERMINATE) -residualcurrent = express_getattr(IfcProtectiveDeviceTrippingUnitTypeEnum, 'RESIDUALCURRENT', INDETERMINATE) -thermal = express_getattr(IfcProtectiveDeviceTrippingUnitTypeEnum, 'THERMAL', INDETERMINATE) -userdefined = express_getattr(IfcProtectiveDeviceTrippingUnitTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcProtectiveDeviceTrippingUnitTypeEnum, 'NOTDEFINED', INDETERMINATE) +electronic = IfcProtectiveDeviceTrippingUnitTypeEnum.ELECTRONIC +electromagnetic = IfcProtectiveDeviceTrippingUnitTypeEnum.ELECTROMAGNETIC +residualcurrent = IfcProtectiveDeviceTrippingUnitTypeEnum.RESIDUALCURRENT +thermal = IfcProtectiveDeviceTrippingUnitTypeEnum.THERMAL +userdefined = IfcProtectiveDeviceTrippingUnitTypeEnum.USERDEFINED +notdefined = IfcProtectiveDeviceTrippingUnitTypeEnum.NOTDEFINED IfcProtectiveDeviceTypeEnum = enum_namespace() -circuitbreaker = express_getattr(IfcProtectiveDeviceTypeEnum, 'CIRCUITBREAKER', INDETERMINATE) -earthleakagecircuitbreaker = express_getattr(IfcProtectiveDeviceTypeEnum, 'EARTHLEAKAGECIRCUITBREAKER', INDETERMINATE) -earthingswitch = express_getattr(IfcProtectiveDeviceTypeEnum, 'EARTHINGSWITCH', INDETERMINATE) -fusedisconnector = express_getattr(IfcProtectiveDeviceTypeEnum, 'FUSEDISCONNECTOR', INDETERMINATE) -residualcurrentcircuitbreaker = express_getattr(IfcProtectiveDeviceTypeEnum, 'RESIDUALCURRENTCIRCUITBREAKER', INDETERMINATE) -residualcurrentswitch = express_getattr(IfcProtectiveDeviceTypeEnum, 'RESIDUALCURRENTSWITCH', INDETERMINATE) -varistor = express_getattr(IfcProtectiveDeviceTypeEnum, 'VARISTOR', INDETERMINATE) -userdefined = express_getattr(IfcProtectiveDeviceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcProtectiveDeviceTypeEnum, 'NOTDEFINED', INDETERMINATE) +circuitbreaker = IfcProtectiveDeviceTypeEnum.CIRCUITBREAKER +earthleakagecircuitbreaker = IfcProtectiveDeviceTypeEnum.EARTHLEAKAGECIRCUITBREAKER +earthingswitch = IfcProtectiveDeviceTypeEnum.EARTHINGSWITCH +fusedisconnector = IfcProtectiveDeviceTypeEnum.FUSEDISCONNECTOR +residualcurrentcircuitbreaker = IfcProtectiveDeviceTypeEnum.RESIDUALCURRENTCIRCUITBREAKER +residualcurrentswitch = IfcProtectiveDeviceTypeEnum.RESIDUALCURRENTSWITCH +varistor = IfcProtectiveDeviceTypeEnum.VARISTOR +userdefined = IfcProtectiveDeviceTypeEnum.USERDEFINED +notdefined = IfcProtectiveDeviceTypeEnum.NOTDEFINED IfcPumpTypeEnum = enum_namespace() -circulator = express_getattr(IfcPumpTypeEnum, 'CIRCULATOR', INDETERMINATE) -endsuction = express_getattr(IfcPumpTypeEnum, 'ENDSUCTION', INDETERMINATE) -splitcase = express_getattr(IfcPumpTypeEnum, 'SPLITCASE', INDETERMINATE) -submersiblepump = express_getattr(IfcPumpTypeEnum, 'SUBMERSIBLEPUMP', INDETERMINATE) -sumppump = express_getattr(IfcPumpTypeEnum, 'SUMPPUMP', INDETERMINATE) -verticalinline = express_getattr(IfcPumpTypeEnum, 'VERTICALINLINE', INDETERMINATE) -verticalturbine = express_getattr(IfcPumpTypeEnum, 'VERTICALTURBINE', INDETERMINATE) -userdefined = express_getattr(IfcPumpTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPumpTypeEnum, 'NOTDEFINED', INDETERMINATE) +circulator = IfcPumpTypeEnum.CIRCULATOR +endsuction = IfcPumpTypeEnum.ENDSUCTION +splitcase = IfcPumpTypeEnum.SPLITCASE +submersiblepump = IfcPumpTypeEnum.SUBMERSIBLEPUMP +sumppump = IfcPumpTypeEnum.SUMPPUMP +verticalinline = IfcPumpTypeEnum.VERTICALINLINE +verticalturbine = IfcPumpTypeEnum.VERTICALTURBINE +userdefined = IfcPumpTypeEnum.USERDEFINED +notdefined = IfcPumpTypeEnum.NOTDEFINED IfcRailingTypeEnum = enum_namespace() -handrail = express_getattr(IfcRailingTypeEnum, 'HANDRAIL', INDETERMINATE) -guardrail = express_getattr(IfcRailingTypeEnum, 'GUARDRAIL', INDETERMINATE) -balustrade = express_getattr(IfcRailingTypeEnum, 'BALUSTRADE', INDETERMINATE) -userdefined = express_getattr(IfcRailingTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcRailingTypeEnum, 'NOTDEFINED', INDETERMINATE) +handrail = IfcRailingTypeEnum.HANDRAIL +guardrail = IfcRailingTypeEnum.GUARDRAIL +balustrade = IfcRailingTypeEnum.BALUSTRADE +userdefined = IfcRailingTypeEnum.USERDEFINED +notdefined = IfcRailingTypeEnum.NOTDEFINED IfcRampFlightTypeEnum = enum_namespace() -straight = express_getattr(IfcRampFlightTypeEnum, 'STRAIGHT', INDETERMINATE) -spiral = express_getattr(IfcRampFlightTypeEnum, 'SPIRAL', INDETERMINATE) -userdefined = express_getattr(IfcRampFlightTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcRampFlightTypeEnum, 'NOTDEFINED', INDETERMINATE) +straight = IfcRampFlightTypeEnum.STRAIGHT +spiral = IfcRampFlightTypeEnum.SPIRAL +userdefined = IfcRampFlightTypeEnum.USERDEFINED +notdefined = IfcRampFlightTypeEnum.NOTDEFINED IfcRampTypeEnum = enum_namespace() -straight_run_ramp = express_getattr(IfcRampTypeEnum, 'STRAIGHT_RUN_RAMP', INDETERMINATE) -two_straight_run_ramp = express_getattr(IfcRampTypeEnum, 'TWO_STRAIGHT_RUN_RAMP', INDETERMINATE) -quarter_turn_ramp = express_getattr(IfcRampTypeEnum, 'QUARTER_TURN_RAMP', INDETERMINATE) -two_quarter_turn_ramp = express_getattr(IfcRampTypeEnum, 'TWO_QUARTER_TURN_RAMP', INDETERMINATE) -half_turn_ramp = express_getattr(IfcRampTypeEnum, 'HALF_TURN_RAMP', INDETERMINATE) -spiral_ramp = express_getattr(IfcRampTypeEnum, 'SPIRAL_RAMP', INDETERMINATE) -userdefined = express_getattr(IfcRampTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcRampTypeEnum, 'NOTDEFINED', INDETERMINATE) +straight_run_ramp = IfcRampTypeEnum.STRAIGHT_RUN_RAMP +two_straight_run_ramp = IfcRampTypeEnum.TWO_STRAIGHT_RUN_RAMP +quarter_turn_ramp = IfcRampTypeEnum.QUARTER_TURN_RAMP +two_quarter_turn_ramp = IfcRampTypeEnum.TWO_QUARTER_TURN_RAMP +half_turn_ramp = IfcRampTypeEnum.HALF_TURN_RAMP +spiral_ramp = IfcRampTypeEnum.SPIRAL_RAMP +userdefined = IfcRampTypeEnum.USERDEFINED +notdefined = IfcRampTypeEnum.NOTDEFINED IfcRecurrenceTypeEnum = enum_namespace() -daily = express_getattr(IfcRecurrenceTypeEnum, 'DAILY', INDETERMINATE) -weekly = express_getattr(IfcRecurrenceTypeEnum, 'WEEKLY', INDETERMINATE) -monthly_by_day_of_month = express_getattr(IfcRecurrenceTypeEnum, 'MONTHLY_BY_DAY_OF_MONTH', INDETERMINATE) -monthly_by_position = express_getattr(IfcRecurrenceTypeEnum, 'MONTHLY_BY_POSITION', INDETERMINATE) -by_day_count = express_getattr(IfcRecurrenceTypeEnum, 'BY_DAY_COUNT', INDETERMINATE) -by_weekday_count = express_getattr(IfcRecurrenceTypeEnum, 'BY_WEEKDAY_COUNT', INDETERMINATE) -yearly_by_day_of_month = express_getattr(IfcRecurrenceTypeEnum, 'YEARLY_BY_DAY_OF_MONTH', INDETERMINATE) -yearly_by_position = express_getattr(IfcRecurrenceTypeEnum, 'YEARLY_BY_POSITION', INDETERMINATE) +daily = IfcRecurrenceTypeEnum.DAILY +weekly = IfcRecurrenceTypeEnum.WEEKLY +monthly_by_day_of_month = IfcRecurrenceTypeEnum.MONTHLY_BY_DAY_OF_MONTH +monthly_by_position = IfcRecurrenceTypeEnum.MONTHLY_BY_POSITION +by_day_count = IfcRecurrenceTypeEnum.BY_DAY_COUNT +by_weekday_count = IfcRecurrenceTypeEnum.BY_WEEKDAY_COUNT +yearly_by_day_of_month = IfcRecurrenceTypeEnum.YEARLY_BY_DAY_OF_MONTH +yearly_by_position = IfcRecurrenceTypeEnum.YEARLY_BY_POSITION IfcReferentTypeEnum = enum_namespace() -kilopoint = express_getattr(IfcReferentTypeEnum, 'KILOPOINT', INDETERMINATE) -milepoint = express_getattr(IfcReferentTypeEnum, 'MILEPOINT', INDETERMINATE) -station = express_getattr(IfcReferentTypeEnum, 'STATION', INDETERMINATE) -userdefined = express_getattr(IfcReferentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcReferentTypeEnum, 'NOTDEFINED', INDETERMINATE) +kilopoint = IfcReferentTypeEnum.KILOPOINT +milepoint = IfcReferentTypeEnum.MILEPOINT +station = IfcReferentTypeEnum.STATION +userdefined = IfcReferentTypeEnum.USERDEFINED +notdefined = IfcReferentTypeEnum.NOTDEFINED IfcReflectanceMethodEnum = enum_namespace() -blinn = express_getattr(IfcReflectanceMethodEnum, 'BLINN', INDETERMINATE) -flat = express_getattr(IfcReflectanceMethodEnum, 'FLAT', INDETERMINATE) -glass = express_getattr(IfcReflectanceMethodEnum, 'GLASS', INDETERMINATE) -matt = express_getattr(IfcReflectanceMethodEnum, 'MATT', INDETERMINATE) -metal = express_getattr(IfcReflectanceMethodEnum, 'METAL', INDETERMINATE) -mirror = express_getattr(IfcReflectanceMethodEnum, 'MIRROR', INDETERMINATE) -phong = express_getattr(IfcReflectanceMethodEnum, 'PHONG', INDETERMINATE) -plastic = express_getattr(IfcReflectanceMethodEnum, 'PLASTIC', INDETERMINATE) -strauss = express_getattr(IfcReflectanceMethodEnum, 'STRAUSS', INDETERMINATE) -notdefined = express_getattr(IfcReflectanceMethodEnum, 'NOTDEFINED', INDETERMINATE) +blinn = IfcReflectanceMethodEnum.BLINN +flat = IfcReflectanceMethodEnum.FLAT +glass = IfcReflectanceMethodEnum.GLASS +matt = IfcReflectanceMethodEnum.MATT +metal = IfcReflectanceMethodEnum.METAL +mirror = IfcReflectanceMethodEnum.MIRROR +phong = IfcReflectanceMethodEnum.PHONG +plastic = IfcReflectanceMethodEnum.PLASTIC +strauss = IfcReflectanceMethodEnum.STRAUSS +notdefined = IfcReflectanceMethodEnum.NOTDEFINED IfcReinforcingBarRoleEnum = enum_namespace() -main = express_getattr(IfcReinforcingBarRoleEnum, 'MAIN', INDETERMINATE) -shear = express_getattr(IfcReinforcingBarRoleEnum, 'SHEAR', INDETERMINATE) -ligature = express_getattr(IfcReinforcingBarRoleEnum, 'LIGATURE', INDETERMINATE) -stud = express_getattr(IfcReinforcingBarRoleEnum, 'STUD', INDETERMINATE) -punching = express_getattr(IfcReinforcingBarRoleEnum, 'PUNCHING', INDETERMINATE) -edge = express_getattr(IfcReinforcingBarRoleEnum, 'EDGE', INDETERMINATE) -ring = express_getattr(IfcReinforcingBarRoleEnum, 'RING', INDETERMINATE) -anchoring = express_getattr(IfcReinforcingBarRoleEnum, 'ANCHORING', INDETERMINATE) -userdefined = express_getattr(IfcReinforcingBarRoleEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcReinforcingBarRoleEnum, 'NOTDEFINED', INDETERMINATE) +main = IfcReinforcingBarRoleEnum.MAIN +shear = IfcReinforcingBarRoleEnum.SHEAR +ligature = IfcReinforcingBarRoleEnum.LIGATURE +stud = IfcReinforcingBarRoleEnum.STUD +punching = IfcReinforcingBarRoleEnum.PUNCHING +edge = IfcReinforcingBarRoleEnum.EDGE +ring = IfcReinforcingBarRoleEnum.RING +anchoring = IfcReinforcingBarRoleEnum.ANCHORING +userdefined = IfcReinforcingBarRoleEnum.USERDEFINED +notdefined = IfcReinforcingBarRoleEnum.NOTDEFINED IfcReinforcingBarSurfaceEnum = enum_namespace() -plain = express_getattr(IfcReinforcingBarSurfaceEnum, 'PLAIN', INDETERMINATE) -textured = express_getattr(IfcReinforcingBarSurfaceEnum, 'TEXTURED', INDETERMINATE) +plain = IfcReinforcingBarSurfaceEnum.PLAIN +textured = IfcReinforcingBarSurfaceEnum.TEXTURED IfcReinforcingBarTypeEnum = enum_namespace() -anchoring = express_getattr(IfcReinforcingBarTypeEnum, 'ANCHORING', INDETERMINATE) -edge = express_getattr(IfcReinforcingBarTypeEnum, 'EDGE', INDETERMINATE) -ligature = express_getattr(IfcReinforcingBarTypeEnum, 'LIGATURE', INDETERMINATE) -main = express_getattr(IfcReinforcingBarTypeEnum, 'MAIN', INDETERMINATE) -punching = express_getattr(IfcReinforcingBarTypeEnum, 'PUNCHING', INDETERMINATE) -ring = express_getattr(IfcReinforcingBarTypeEnum, 'RING', INDETERMINATE) -shear = express_getattr(IfcReinforcingBarTypeEnum, 'SHEAR', INDETERMINATE) -stud = express_getattr(IfcReinforcingBarTypeEnum, 'STUD', INDETERMINATE) -spacebar = express_getattr(IfcReinforcingBarTypeEnum, 'SPACEBAR', INDETERMINATE) -userdefined = express_getattr(IfcReinforcingBarTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcReinforcingBarTypeEnum, 'NOTDEFINED', INDETERMINATE) +anchoring = IfcReinforcingBarTypeEnum.ANCHORING +edge = IfcReinforcingBarTypeEnum.EDGE +ligature = IfcReinforcingBarTypeEnum.LIGATURE +main = IfcReinforcingBarTypeEnum.MAIN +punching = IfcReinforcingBarTypeEnum.PUNCHING +ring = IfcReinforcingBarTypeEnum.RING +shear = IfcReinforcingBarTypeEnum.SHEAR +stud = IfcReinforcingBarTypeEnum.STUD +spacebar = IfcReinforcingBarTypeEnum.SPACEBAR +userdefined = IfcReinforcingBarTypeEnum.USERDEFINED +notdefined = IfcReinforcingBarTypeEnum.NOTDEFINED IfcReinforcingMeshTypeEnum = enum_namespace() -userdefined = express_getattr(IfcReinforcingMeshTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcReinforcingMeshTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcReinforcingMeshTypeEnum.USERDEFINED +notdefined = IfcReinforcingMeshTypeEnum.NOTDEFINED IfcRoleEnum = enum_namespace() -supplier = express_getattr(IfcRoleEnum, 'SUPPLIER', INDETERMINATE) -manufacturer = express_getattr(IfcRoleEnum, 'MANUFACTURER', INDETERMINATE) -contractor = express_getattr(IfcRoleEnum, 'CONTRACTOR', INDETERMINATE) -subcontractor = express_getattr(IfcRoleEnum, 'SUBCONTRACTOR', INDETERMINATE) -architect = express_getattr(IfcRoleEnum, 'ARCHITECT', INDETERMINATE) -structuralengineer = express_getattr(IfcRoleEnum, 'STRUCTURALENGINEER', INDETERMINATE) -costengineer = express_getattr(IfcRoleEnum, 'COSTENGINEER', INDETERMINATE) -client = express_getattr(IfcRoleEnum, 'CLIENT', INDETERMINATE) -buildingowner = express_getattr(IfcRoleEnum, 'BUILDINGOWNER', INDETERMINATE) -buildingoperator = express_getattr(IfcRoleEnum, 'BUILDINGOPERATOR', INDETERMINATE) -mechanicalengineer = express_getattr(IfcRoleEnum, 'MECHANICALENGINEER', INDETERMINATE) -electricalengineer = express_getattr(IfcRoleEnum, 'ELECTRICALENGINEER', INDETERMINATE) -projectmanager = express_getattr(IfcRoleEnum, 'PROJECTMANAGER', INDETERMINATE) -facilitiesmanager = express_getattr(IfcRoleEnum, 'FACILITIESMANAGER', INDETERMINATE) -civilengineer = express_getattr(IfcRoleEnum, 'CIVILENGINEER', INDETERMINATE) -commissioningengineer = express_getattr(IfcRoleEnum, 'COMMISSIONINGENGINEER', INDETERMINATE) -engineer = express_getattr(IfcRoleEnum, 'ENGINEER', INDETERMINATE) -owner = express_getattr(IfcRoleEnum, 'OWNER', INDETERMINATE) -consultant = express_getattr(IfcRoleEnum, 'CONSULTANT', INDETERMINATE) -constructionmanager = express_getattr(IfcRoleEnum, 'CONSTRUCTIONMANAGER', INDETERMINATE) -fieldconstructionmanager = express_getattr(IfcRoleEnum, 'FIELDCONSTRUCTIONMANAGER', INDETERMINATE) -reseller = express_getattr(IfcRoleEnum, 'RESELLER', INDETERMINATE) -userdefined = express_getattr(IfcRoleEnum, 'USERDEFINED', INDETERMINATE) +supplier = IfcRoleEnum.SUPPLIER +manufacturer = IfcRoleEnum.MANUFACTURER +contractor = IfcRoleEnum.CONTRACTOR +subcontractor = IfcRoleEnum.SUBCONTRACTOR +architect = IfcRoleEnum.ARCHITECT +structuralengineer = IfcRoleEnum.STRUCTURALENGINEER +costengineer = IfcRoleEnum.COSTENGINEER +client = IfcRoleEnum.CLIENT +buildingowner = IfcRoleEnum.BUILDINGOWNER +buildingoperator = IfcRoleEnum.BUILDINGOPERATOR +mechanicalengineer = IfcRoleEnum.MECHANICALENGINEER +electricalengineer = IfcRoleEnum.ELECTRICALENGINEER +projectmanager = IfcRoleEnum.PROJECTMANAGER +facilitiesmanager = IfcRoleEnum.FACILITIESMANAGER +civilengineer = IfcRoleEnum.CIVILENGINEER +commissioningengineer = IfcRoleEnum.COMMISSIONINGENGINEER +engineer = IfcRoleEnum.ENGINEER +owner = IfcRoleEnum.OWNER +consultant = IfcRoleEnum.CONSULTANT +constructionmanager = IfcRoleEnum.CONSTRUCTIONMANAGER +fieldconstructionmanager = IfcRoleEnum.FIELDCONSTRUCTIONMANAGER +reseller = IfcRoleEnum.RESELLER +userdefined = IfcRoleEnum.USERDEFINED IfcRoofTypeEnum = enum_namespace() -flat_roof = express_getattr(IfcRoofTypeEnum, 'FLAT_ROOF', INDETERMINATE) -shed_roof = express_getattr(IfcRoofTypeEnum, 'SHED_ROOF', INDETERMINATE) -gable_roof = express_getattr(IfcRoofTypeEnum, 'GABLE_ROOF', INDETERMINATE) -hip_roof = express_getattr(IfcRoofTypeEnum, 'HIP_ROOF', INDETERMINATE) -hipped_gable_roof = express_getattr(IfcRoofTypeEnum, 'HIPPED_GABLE_ROOF', INDETERMINATE) -gambrel_roof = express_getattr(IfcRoofTypeEnum, 'GAMBREL_ROOF', INDETERMINATE) -mansard_roof = express_getattr(IfcRoofTypeEnum, 'MANSARD_ROOF', INDETERMINATE) -barrel_roof = express_getattr(IfcRoofTypeEnum, 'BARREL_ROOF', INDETERMINATE) -rainbow_roof = express_getattr(IfcRoofTypeEnum, 'RAINBOW_ROOF', INDETERMINATE) -butterfly_roof = express_getattr(IfcRoofTypeEnum, 'BUTTERFLY_ROOF', INDETERMINATE) -pavilion_roof = express_getattr(IfcRoofTypeEnum, 'PAVILION_ROOF', INDETERMINATE) -dome_roof = express_getattr(IfcRoofTypeEnum, 'DOME_ROOF', INDETERMINATE) -freeform = express_getattr(IfcRoofTypeEnum, 'FREEFORM', INDETERMINATE) -userdefined = express_getattr(IfcRoofTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcRoofTypeEnum, 'NOTDEFINED', INDETERMINATE) +flat_roof = IfcRoofTypeEnum.FLAT_ROOF +shed_roof = IfcRoofTypeEnum.SHED_ROOF +gable_roof = IfcRoofTypeEnum.GABLE_ROOF +hip_roof = IfcRoofTypeEnum.HIP_ROOF +hipped_gable_roof = IfcRoofTypeEnum.HIPPED_GABLE_ROOF +gambrel_roof = IfcRoofTypeEnum.GAMBREL_ROOF +mansard_roof = IfcRoofTypeEnum.MANSARD_ROOF +barrel_roof = IfcRoofTypeEnum.BARREL_ROOF +rainbow_roof = IfcRoofTypeEnum.RAINBOW_ROOF +butterfly_roof = IfcRoofTypeEnum.BUTTERFLY_ROOF +pavilion_roof = IfcRoofTypeEnum.PAVILION_ROOF +dome_roof = IfcRoofTypeEnum.DOME_ROOF +freeform = IfcRoofTypeEnum.FREEFORM +userdefined = IfcRoofTypeEnum.USERDEFINED +notdefined = IfcRoofTypeEnum.NOTDEFINED IfcSIPrefix = enum_namespace() -exa = express_getattr(IfcSIPrefix, 'EXA', INDETERMINATE) -peta = express_getattr(IfcSIPrefix, 'PETA', INDETERMINATE) -tera = express_getattr(IfcSIPrefix, 'TERA', INDETERMINATE) -giga = express_getattr(IfcSIPrefix, 'GIGA', INDETERMINATE) -mega = express_getattr(IfcSIPrefix, 'MEGA', INDETERMINATE) -kilo = express_getattr(IfcSIPrefix, 'KILO', INDETERMINATE) -hecto = express_getattr(IfcSIPrefix, 'HECTO', INDETERMINATE) -deca = express_getattr(IfcSIPrefix, 'DECA', INDETERMINATE) -deci = express_getattr(IfcSIPrefix, 'DECI', INDETERMINATE) -centi = express_getattr(IfcSIPrefix, 'CENTI', INDETERMINATE) -milli = express_getattr(IfcSIPrefix, 'MILLI', INDETERMINATE) -micro = express_getattr(IfcSIPrefix, 'MICRO', INDETERMINATE) -nano = express_getattr(IfcSIPrefix, 'NANO', INDETERMINATE) -pico = express_getattr(IfcSIPrefix, 'PICO', INDETERMINATE) -femto = express_getattr(IfcSIPrefix, 'FEMTO', INDETERMINATE) -atto = express_getattr(IfcSIPrefix, 'ATTO', INDETERMINATE) +exa = IfcSIPrefix.EXA +peta = IfcSIPrefix.PETA +tera = IfcSIPrefix.TERA +giga = IfcSIPrefix.GIGA +mega = IfcSIPrefix.MEGA +kilo = IfcSIPrefix.KILO +hecto = IfcSIPrefix.HECTO +deca = IfcSIPrefix.DECA +deci = IfcSIPrefix.DECI +centi = IfcSIPrefix.CENTI +milli = IfcSIPrefix.MILLI +micro = IfcSIPrefix.MICRO +nano = IfcSIPrefix.NANO +pico = IfcSIPrefix.PICO +femto = IfcSIPrefix.FEMTO +atto = IfcSIPrefix.ATTO IfcSIUnitName = enum_namespace() -ampere = express_getattr(IfcSIUnitName, 'AMPERE', INDETERMINATE) -becquerel = express_getattr(IfcSIUnitName, 'BECQUEREL', INDETERMINATE) -candela = express_getattr(IfcSIUnitName, 'CANDELA', INDETERMINATE) -coulomb = express_getattr(IfcSIUnitName, 'COULOMB', INDETERMINATE) -cubic_metre = express_getattr(IfcSIUnitName, 'CUBIC_METRE', INDETERMINATE) -degree_celsius = express_getattr(IfcSIUnitName, 'DEGREE_CELSIUS', INDETERMINATE) -farad = express_getattr(IfcSIUnitName, 'FARAD', INDETERMINATE) -gram = express_getattr(IfcSIUnitName, 'GRAM', INDETERMINATE) -gray = express_getattr(IfcSIUnitName, 'GRAY', INDETERMINATE) -henry = express_getattr(IfcSIUnitName, 'HENRY', INDETERMINATE) -hertz = express_getattr(IfcSIUnitName, 'HERTZ', INDETERMINATE) -joule = express_getattr(IfcSIUnitName, 'JOULE', INDETERMINATE) -kelvin = express_getattr(IfcSIUnitName, 'KELVIN', INDETERMINATE) -lumen = express_getattr(IfcSIUnitName, 'LUMEN', INDETERMINATE) -lux = express_getattr(IfcSIUnitName, 'LUX', INDETERMINATE) -metre = express_getattr(IfcSIUnitName, 'METRE', INDETERMINATE) -mole = express_getattr(IfcSIUnitName, 'MOLE', INDETERMINATE) -newton = express_getattr(IfcSIUnitName, 'NEWTON', INDETERMINATE) -ohm = express_getattr(IfcSIUnitName, 'OHM', INDETERMINATE) -pascal = express_getattr(IfcSIUnitName, 'PASCAL', INDETERMINATE) -radian = express_getattr(IfcSIUnitName, 'RADIAN', INDETERMINATE) -second = express_getattr(IfcSIUnitName, 'SECOND', INDETERMINATE) -siemens = express_getattr(IfcSIUnitName, 'SIEMENS', INDETERMINATE) -sievert = express_getattr(IfcSIUnitName, 'SIEVERT', INDETERMINATE) -square_metre = express_getattr(IfcSIUnitName, 'SQUARE_METRE', INDETERMINATE) -steradian = express_getattr(IfcSIUnitName, 'STERADIAN', INDETERMINATE) -tesla = express_getattr(IfcSIUnitName, 'TESLA', INDETERMINATE) -volt = express_getattr(IfcSIUnitName, 'VOLT', INDETERMINATE) -watt = express_getattr(IfcSIUnitName, 'WATT', INDETERMINATE) -weber = express_getattr(IfcSIUnitName, 'WEBER', INDETERMINATE) +ampere = IfcSIUnitName.AMPERE +becquerel = IfcSIUnitName.BECQUEREL +candela = IfcSIUnitName.CANDELA +coulomb = IfcSIUnitName.COULOMB +cubic_metre = IfcSIUnitName.CUBIC_METRE +degree_celsius = IfcSIUnitName.DEGREE_CELSIUS +farad = IfcSIUnitName.FARAD +gram = IfcSIUnitName.GRAM +gray = IfcSIUnitName.GRAY +henry = IfcSIUnitName.HENRY +hertz = IfcSIUnitName.HERTZ +joule = IfcSIUnitName.JOULE +kelvin = IfcSIUnitName.KELVIN +lumen = IfcSIUnitName.LUMEN +lux = IfcSIUnitName.LUX +metre = IfcSIUnitName.METRE +mole = IfcSIUnitName.MOLE +newton = IfcSIUnitName.NEWTON +ohm = IfcSIUnitName.OHM +pascal = IfcSIUnitName.PASCAL +radian = IfcSIUnitName.RADIAN +second = IfcSIUnitName.SECOND +siemens = IfcSIUnitName.SIEMENS +sievert = IfcSIUnitName.SIEVERT +square_metre = IfcSIUnitName.SQUARE_METRE +steradian = IfcSIUnitName.STERADIAN +tesla = IfcSIUnitName.TESLA +volt = IfcSIUnitName.VOLT +watt = IfcSIUnitName.WATT +weber = IfcSIUnitName.WEBER IfcSanitaryTerminalTypeEnum = enum_namespace() -bath = express_getattr(IfcSanitaryTerminalTypeEnum, 'BATH', INDETERMINATE) -bidet = express_getattr(IfcSanitaryTerminalTypeEnum, 'BIDET', INDETERMINATE) -cistern = express_getattr(IfcSanitaryTerminalTypeEnum, 'CISTERN', INDETERMINATE) -shower = express_getattr(IfcSanitaryTerminalTypeEnum, 'SHOWER', INDETERMINATE) -sink = express_getattr(IfcSanitaryTerminalTypeEnum, 'SINK', INDETERMINATE) -sanitaryfountain = express_getattr(IfcSanitaryTerminalTypeEnum, 'SANITARYFOUNTAIN', INDETERMINATE) -toiletpan = express_getattr(IfcSanitaryTerminalTypeEnum, 'TOILETPAN', INDETERMINATE) -urinal = express_getattr(IfcSanitaryTerminalTypeEnum, 'URINAL', INDETERMINATE) -washhandbasin = express_getattr(IfcSanitaryTerminalTypeEnum, 'WASHHANDBASIN', INDETERMINATE) -wcseat = express_getattr(IfcSanitaryTerminalTypeEnum, 'WCSEAT', INDETERMINATE) -userdefined = express_getattr(IfcSanitaryTerminalTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSanitaryTerminalTypeEnum, 'NOTDEFINED', INDETERMINATE) +bath = IfcSanitaryTerminalTypeEnum.BATH +bidet = IfcSanitaryTerminalTypeEnum.BIDET +cistern = IfcSanitaryTerminalTypeEnum.CISTERN +shower = IfcSanitaryTerminalTypeEnum.SHOWER +sink = IfcSanitaryTerminalTypeEnum.SINK +sanitaryfountain = IfcSanitaryTerminalTypeEnum.SANITARYFOUNTAIN +toiletpan = IfcSanitaryTerminalTypeEnum.TOILETPAN +urinal = IfcSanitaryTerminalTypeEnum.URINAL +washhandbasin = IfcSanitaryTerminalTypeEnum.WASHHANDBASIN +wcseat = IfcSanitaryTerminalTypeEnum.WCSEAT +userdefined = IfcSanitaryTerminalTypeEnum.USERDEFINED +notdefined = IfcSanitaryTerminalTypeEnum.NOTDEFINED IfcSectionTypeEnum = enum_namespace() -uniform = express_getattr(IfcSectionTypeEnum, 'UNIFORM', INDETERMINATE) -tapered = express_getattr(IfcSectionTypeEnum, 'TAPERED', INDETERMINATE) +uniform = IfcSectionTypeEnum.UNIFORM +tapered = IfcSectionTypeEnum.TAPERED IfcSensorTypeEnum = enum_namespace() -cosensor = express_getattr(IfcSensorTypeEnum, 'COSENSOR', INDETERMINATE) -co2sensor = express_getattr(IfcSensorTypeEnum, 'CO2SENSOR', INDETERMINATE) -conductancesensor = express_getattr(IfcSensorTypeEnum, 'CONDUCTANCESENSOR', INDETERMINATE) -contactsensor = express_getattr(IfcSensorTypeEnum, 'CONTACTSENSOR', INDETERMINATE) -firesensor = express_getattr(IfcSensorTypeEnum, 'FIRESENSOR', INDETERMINATE) -flowsensor = express_getattr(IfcSensorTypeEnum, 'FLOWSENSOR', INDETERMINATE) -frostsensor = express_getattr(IfcSensorTypeEnum, 'FROSTSENSOR', INDETERMINATE) -gassensor = express_getattr(IfcSensorTypeEnum, 'GASSENSOR', INDETERMINATE) -heatsensor = express_getattr(IfcSensorTypeEnum, 'HEATSENSOR', INDETERMINATE) -humiditysensor = express_getattr(IfcSensorTypeEnum, 'HUMIDITYSENSOR', INDETERMINATE) -identifiersensor = express_getattr(IfcSensorTypeEnum, 'IDENTIFIERSENSOR', INDETERMINATE) -ionconcentrationsensor = express_getattr(IfcSensorTypeEnum, 'IONCONCENTRATIONSENSOR', INDETERMINATE) -levelsensor = express_getattr(IfcSensorTypeEnum, 'LEVELSENSOR', INDETERMINATE) -lightsensor = express_getattr(IfcSensorTypeEnum, 'LIGHTSENSOR', INDETERMINATE) -moisturesensor = express_getattr(IfcSensorTypeEnum, 'MOISTURESENSOR', INDETERMINATE) -movementsensor = express_getattr(IfcSensorTypeEnum, 'MOVEMENTSENSOR', INDETERMINATE) -phsensor = express_getattr(IfcSensorTypeEnum, 'PHSENSOR', INDETERMINATE) -pressuresensor = express_getattr(IfcSensorTypeEnum, 'PRESSURESENSOR', INDETERMINATE) -radiationsensor = express_getattr(IfcSensorTypeEnum, 'RADIATIONSENSOR', INDETERMINATE) -radioactivitysensor = express_getattr(IfcSensorTypeEnum, 'RADIOACTIVITYSENSOR', INDETERMINATE) -smokesensor = express_getattr(IfcSensorTypeEnum, 'SMOKESENSOR', INDETERMINATE) -soundsensor = express_getattr(IfcSensorTypeEnum, 'SOUNDSENSOR', INDETERMINATE) -temperaturesensor = express_getattr(IfcSensorTypeEnum, 'TEMPERATURESENSOR', INDETERMINATE) -windsensor = express_getattr(IfcSensorTypeEnum, 'WINDSENSOR', INDETERMINATE) -userdefined = express_getattr(IfcSensorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSensorTypeEnum, 'NOTDEFINED', INDETERMINATE) +cosensor = IfcSensorTypeEnum.COSENSOR +co2sensor = IfcSensorTypeEnum.CO2SENSOR +conductancesensor = IfcSensorTypeEnum.CONDUCTANCESENSOR +contactsensor = IfcSensorTypeEnum.CONTACTSENSOR +firesensor = IfcSensorTypeEnum.FIRESENSOR +flowsensor = IfcSensorTypeEnum.FLOWSENSOR +frostsensor = IfcSensorTypeEnum.FROSTSENSOR +gassensor = IfcSensorTypeEnum.GASSENSOR +heatsensor = IfcSensorTypeEnum.HEATSENSOR +humiditysensor = IfcSensorTypeEnum.HUMIDITYSENSOR +identifiersensor = IfcSensorTypeEnum.IDENTIFIERSENSOR +ionconcentrationsensor = IfcSensorTypeEnum.IONCONCENTRATIONSENSOR +levelsensor = IfcSensorTypeEnum.LEVELSENSOR +lightsensor = IfcSensorTypeEnum.LIGHTSENSOR +moisturesensor = IfcSensorTypeEnum.MOISTURESENSOR +movementsensor = IfcSensorTypeEnum.MOVEMENTSENSOR +phsensor = IfcSensorTypeEnum.PHSENSOR +pressuresensor = IfcSensorTypeEnum.PRESSURESENSOR +radiationsensor = IfcSensorTypeEnum.RADIATIONSENSOR +radioactivitysensor = IfcSensorTypeEnum.RADIOACTIVITYSENSOR +smokesensor = IfcSensorTypeEnum.SMOKESENSOR +soundsensor = IfcSensorTypeEnum.SOUNDSENSOR +temperaturesensor = IfcSensorTypeEnum.TEMPERATURESENSOR +windsensor = IfcSensorTypeEnum.WINDSENSOR +userdefined = IfcSensorTypeEnum.USERDEFINED +notdefined = IfcSensorTypeEnum.NOTDEFINED IfcSequenceEnum = enum_namespace() -start_start = express_getattr(IfcSequenceEnum, 'START_START', INDETERMINATE) -start_finish = express_getattr(IfcSequenceEnum, 'START_FINISH', INDETERMINATE) -finish_start = express_getattr(IfcSequenceEnum, 'FINISH_START', INDETERMINATE) -finish_finish = express_getattr(IfcSequenceEnum, 'FINISH_FINISH', INDETERMINATE) -userdefined = express_getattr(IfcSequenceEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSequenceEnum, 'NOTDEFINED', INDETERMINATE) +start_start = IfcSequenceEnum.START_START +start_finish = IfcSequenceEnum.START_FINISH +finish_start = IfcSequenceEnum.FINISH_START +finish_finish = IfcSequenceEnum.FINISH_FINISH +userdefined = IfcSequenceEnum.USERDEFINED +notdefined = IfcSequenceEnum.NOTDEFINED IfcShadingDeviceTypeEnum = enum_namespace() -jalousie = express_getattr(IfcShadingDeviceTypeEnum, 'JALOUSIE', INDETERMINATE) -shutter = express_getattr(IfcShadingDeviceTypeEnum, 'SHUTTER', INDETERMINATE) -awning = express_getattr(IfcShadingDeviceTypeEnum, 'AWNING', INDETERMINATE) -userdefined = express_getattr(IfcShadingDeviceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcShadingDeviceTypeEnum, 'NOTDEFINED', INDETERMINATE) +jalousie = IfcShadingDeviceTypeEnum.JALOUSIE +shutter = IfcShadingDeviceTypeEnum.SHUTTER +awning = IfcShadingDeviceTypeEnum.AWNING +userdefined = IfcShadingDeviceTypeEnum.USERDEFINED +notdefined = IfcShadingDeviceTypeEnum.NOTDEFINED IfcSimplePropertyTemplateTypeEnum = enum_namespace() -p_singlevalue = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'P_SINGLEVALUE', INDETERMINATE) -p_enumeratedvalue = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'P_ENUMERATEDVALUE', INDETERMINATE) -p_boundedvalue = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'P_BOUNDEDVALUE', INDETERMINATE) -p_listvalue = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'P_LISTVALUE', INDETERMINATE) -p_tablevalue = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'P_TABLEVALUE', INDETERMINATE) -p_referencevalue = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'P_REFERENCEVALUE', INDETERMINATE) -q_length = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'Q_LENGTH', INDETERMINATE) -q_area = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'Q_AREA', INDETERMINATE) -q_volume = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'Q_VOLUME', INDETERMINATE) -q_count = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'Q_COUNT', INDETERMINATE) -q_weight = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'Q_WEIGHT', INDETERMINATE) -q_time = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'Q_TIME', INDETERMINATE) +p_singlevalue = IfcSimplePropertyTemplateTypeEnum.P_SINGLEVALUE +p_enumeratedvalue = IfcSimplePropertyTemplateTypeEnum.P_ENUMERATEDVALUE +p_boundedvalue = IfcSimplePropertyTemplateTypeEnum.P_BOUNDEDVALUE +p_listvalue = IfcSimplePropertyTemplateTypeEnum.P_LISTVALUE +p_tablevalue = IfcSimplePropertyTemplateTypeEnum.P_TABLEVALUE +p_referencevalue = IfcSimplePropertyTemplateTypeEnum.P_REFERENCEVALUE +q_length = IfcSimplePropertyTemplateTypeEnum.Q_LENGTH +q_area = IfcSimplePropertyTemplateTypeEnum.Q_AREA +q_volume = IfcSimplePropertyTemplateTypeEnum.Q_VOLUME +q_count = IfcSimplePropertyTemplateTypeEnum.Q_COUNT +q_weight = IfcSimplePropertyTemplateTypeEnum.Q_WEIGHT +q_time = IfcSimplePropertyTemplateTypeEnum.Q_TIME IfcSlabTypeEnum = enum_namespace() -floor = express_getattr(IfcSlabTypeEnum, 'FLOOR', INDETERMINATE) -roof = express_getattr(IfcSlabTypeEnum, 'ROOF', INDETERMINATE) -landing = express_getattr(IfcSlabTypeEnum, 'LANDING', INDETERMINATE) -baseslab = express_getattr(IfcSlabTypeEnum, 'BASESLAB', INDETERMINATE) -approach_slab = express_getattr(IfcSlabTypeEnum, 'APPROACH_SLAB', INDETERMINATE) -paving = express_getattr(IfcSlabTypeEnum, 'PAVING', INDETERMINATE) -wearing = express_getattr(IfcSlabTypeEnum, 'WEARING', INDETERMINATE) -sidewalk = express_getattr(IfcSlabTypeEnum, 'SIDEWALK', INDETERMINATE) -userdefined = express_getattr(IfcSlabTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSlabTypeEnum, 'NOTDEFINED', INDETERMINATE) +floor = IfcSlabTypeEnum.FLOOR +roof = IfcSlabTypeEnum.ROOF +landing = IfcSlabTypeEnum.LANDING +baseslab = IfcSlabTypeEnum.BASESLAB +approach_slab = IfcSlabTypeEnum.APPROACH_SLAB +paving = IfcSlabTypeEnum.PAVING +wearing = IfcSlabTypeEnum.WEARING +sidewalk = IfcSlabTypeEnum.SIDEWALK +userdefined = IfcSlabTypeEnum.USERDEFINED +notdefined = IfcSlabTypeEnum.NOTDEFINED IfcSolarDeviceTypeEnum = enum_namespace() -solarcollector = express_getattr(IfcSolarDeviceTypeEnum, 'SOLARCOLLECTOR', INDETERMINATE) -solarpanel = express_getattr(IfcSolarDeviceTypeEnum, 'SOLARPANEL', INDETERMINATE) -userdefined = express_getattr(IfcSolarDeviceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSolarDeviceTypeEnum, 'NOTDEFINED', INDETERMINATE) +solarcollector = IfcSolarDeviceTypeEnum.SOLARCOLLECTOR +solarpanel = IfcSolarDeviceTypeEnum.SOLARPANEL +userdefined = IfcSolarDeviceTypeEnum.USERDEFINED +notdefined = IfcSolarDeviceTypeEnum.NOTDEFINED IfcSpaceHeaterTypeEnum = enum_namespace() -convector = express_getattr(IfcSpaceHeaterTypeEnum, 'CONVECTOR', INDETERMINATE) -radiator = express_getattr(IfcSpaceHeaterTypeEnum, 'RADIATOR', INDETERMINATE) -userdefined = express_getattr(IfcSpaceHeaterTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSpaceHeaterTypeEnum, 'NOTDEFINED', INDETERMINATE) +convector = IfcSpaceHeaterTypeEnum.CONVECTOR +radiator = IfcSpaceHeaterTypeEnum.RADIATOR +userdefined = IfcSpaceHeaterTypeEnum.USERDEFINED +notdefined = IfcSpaceHeaterTypeEnum.NOTDEFINED IfcSpaceTypeEnum = enum_namespace() -space = express_getattr(IfcSpaceTypeEnum, 'SPACE', INDETERMINATE) -parking = express_getattr(IfcSpaceTypeEnum, 'PARKING', INDETERMINATE) -gfa = express_getattr(IfcSpaceTypeEnum, 'GFA', INDETERMINATE) -internal = express_getattr(IfcSpaceTypeEnum, 'INTERNAL', INDETERMINATE) -external = express_getattr(IfcSpaceTypeEnum, 'EXTERNAL', INDETERMINATE) -userdefined = express_getattr(IfcSpaceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSpaceTypeEnum, 'NOTDEFINED', INDETERMINATE) +space = IfcSpaceTypeEnum.SPACE +parking = IfcSpaceTypeEnum.PARKING +gfa = IfcSpaceTypeEnum.GFA +internal = IfcSpaceTypeEnum.INTERNAL +external = IfcSpaceTypeEnum.EXTERNAL +userdefined = IfcSpaceTypeEnum.USERDEFINED +notdefined = IfcSpaceTypeEnum.NOTDEFINED IfcSpatialZoneTypeEnum = enum_namespace() -construction = express_getattr(IfcSpatialZoneTypeEnum, 'CONSTRUCTION', INDETERMINATE) -firesafety = express_getattr(IfcSpatialZoneTypeEnum, 'FIRESAFETY', INDETERMINATE) -lighting = express_getattr(IfcSpatialZoneTypeEnum, 'LIGHTING', INDETERMINATE) -occupancy = express_getattr(IfcSpatialZoneTypeEnum, 'OCCUPANCY', INDETERMINATE) -security = express_getattr(IfcSpatialZoneTypeEnum, 'SECURITY', INDETERMINATE) -thermal = express_getattr(IfcSpatialZoneTypeEnum, 'THERMAL', INDETERMINATE) -transport = express_getattr(IfcSpatialZoneTypeEnum, 'TRANSPORT', INDETERMINATE) -ventilation = express_getattr(IfcSpatialZoneTypeEnum, 'VENTILATION', INDETERMINATE) -userdefined = express_getattr(IfcSpatialZoneTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSpatialZoneTypeEnum, 'NOTDEFINED', INDETERMINATE) +construction = IfcSpatialZoneTypeEnum.CONSTRUCTION +firesafety = IfcSpatialZoneTypeEnum.FIRESAFETY +lighting = IfcSpatialZoneTypeEnum.LIGHTING +occupancy = IfcSpatialZoneTypeEnum.OCCUPANCY +security = IfcSpatialZoneTypeEnum.SECURITY +thermal = IfcSpatialZoneTypeEnum.THERMAL +transport = IfcSpatialZoneTypeEnum.TRANSPORT +ventilation = IfcSpatialZoneTypeEnum.VENTILATION +userdefined = IfcSpatialZoneTypeEnum.USERDEFINED +notdefined = IfcSpatialZoneTypeEnum.NOTDEFINED IfcStackTerminalTypeEnum = enum_namespace() -birdcage = express_getattr(IfcStackTerminalTypeEnum, 'BIRDCAGE', INDETERMINATE) -cowl = express_getattr(IfcStackTerminalTypeEnum, 'COWL', INDETERMINATE) -rainwaterhopper = express_getattr(IfcStackTerminalTypeEnum, 'RAINWATERHOPPER', INDETERMINATE) -userdefined = express_getattr(IfcStackTerminalTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcStackTerminalTypeEnum, 'NOTDEFINED', INDETERMINATE) +birdcage = IfcStackTerminalTypeEnum.BIRDCAGE +cowl = IfcStackTerminalTypeEnum.COWL +rainwaterhopper = IfcStackTerminalTypeEnum.RAINWATERHOPPER +userdefined = IfcStackTerminalTypeEnum.USERDEFINED +notdefined = IfcStackTerminalTypeEnum.NOTDEFINED IfcStairFlightTypeEnum = enum_namespace() -straight = express_getattr(IfcStairFlightTypeEnum, 'STRAIGHT', INDETERMINATE) -winder = express_getattr(IfcStairFlightTypeEnum, 'WINDER', INDETERMINATE) -spiral = express_getattr(IfcStairFlightTypeEnum, 'SPIRAL', INDETERMINATE) -curved = express_getattr(IfcStairFlightTypeEnum, 'CURVED', INDETERMINATE) -freeform = express_getattr(IfcStairFlightTypeEnum, 'FREEFORM', INDETERMINATE) -userdefined = express_getattr(IfcStairFlightTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcStairFlightTypeEnum, 'NOTDEFINED', INDETERMINATE) +straight = IfcStairFlightTypeEnum.STRAIGHT +winder = IfcStairFlightTypeEnum.WINDER +spiral = IfcStairFlightTypeEnum.SPIRAL +curved = IfcStairFlightTypeEnum.CURVED +freeform = IfcStairFlightTypeEnum.FREEFORM +userdefined = IfcStairFlightTypeEnum.USERDEFINED +notdefined = IfcStairFlightTypeEnum.NOTDEFINED IfcStairTypeEnum = enum_namespace() -straight_run_stair = express_getattr(IfcStairTypeEnum, 'STRAIGHT_RUN_STAIR', INDETERMINATE) -two_straight_run_stair = express_getattr(IfcStairTypeEnum, 'TWO_STRAIGHT_RUN_STAIR', INDETERMINATE) -quarter_winding_stair = express_getattr(IfcStairTypeEnum, 'QUARTER_WINDING_STAIR', INDETERMINATE) -quarter_turn_stair = express_getattr(IfcStairTypeEnum, 'QUARTER_TURN_STAIR', INDETERMINATE) -half_winding_stair = express_getattr(IfcStairTypeEnum, 'HALF_WINDING_STAIR', INDETERMINATE) -half_turn_stair = express_getattr(IfcStairTypeEnum, 'HALF_TURN_STAIR', INDETERMINATE) -two_quarter_winding_stair = express_getattr(IfcStairTypeEnum, 'TWO_QUARTER_WINDING_STAIR', INDETERMINATE) -two_quarter_turn_stair = express_getattr(IfcStairTypeEnum, 'TWO_QUARTER_TURN_STAIR', INDETERMINATE) -three_quarter_winding_stair = express_getattr(IfcStairTypeEnum, 'THREE_QUARTER_WINDING_STAIR', INDETERMINATE) -three_quarter_turn_stair = express_getattr(IfcStairTypeEnum, 'THREE_QUARTER_TURN_STAIR', INDETERMINATE) -spiral_stair = express_getattr(IfcStairTypeEnum, 'SPIRAL_STAIR', INDETERMINATE) -double_return_stair = express_getattr(IfcStairTypeEnum, 'DOUBLE_RETURN_STAIR', INDETERMINATE) -curved_run_stair = express_getattr(IfcStairTypeEnum, 'CURVED_RUN_STAIR', INDETERMINATE) -two_curved_run_stair = express_getattr(IfcStairTypeEnum, 'TWO_CURVED_RUN_STAIR', INDETERMINATE) -userdefined = express_getattr(IfcStairTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcStairTypeEnum, 'NOTDEFINED', INDETERMINATE) +straight_run_stair = IfcStairTypeEnum.STRAIGHT_RUN_STAIR +two_straight_run_stair = IfcStairTypeEnum.TWO_STRAIGHT_RUN_STAIR +quarter_winding_stair = IfcStairTypeEnum.QUARTER_WINDING_STAIR +quarter_turn_stair = IfcStairTypeEnum.QUARTER_TURN_STAIR +half_winding_stair = IfcStairTypeEnum.HALF_WINDING_STAIR +half_turn_stair = IfcStairTypeEnum.HALF_TURN_STAIR +two_quarter_winding_stair = IfcStairTypeEnum.TWO_QUARTER_WINDING_STAIR +two_quarter_turn_stair = IfcStairTypeEnum.TWO_QUARTER_TURN_STAIR +three_quarter_winding_stair = IfcStairTypeEnum.THREE_QUARTER_WINDING_STAIR +three_quarter_turn_stair = IfcStairTypeEnum.THREE_QUARTER_TURN_STAIR +spiral_stair = IfcStairTypeEnum.SPIRAL_STAIR +double_return_stair = IfcStairTypeEnum.DOUBLE_RETURN_STAIR +curved_run_stair = IfcStairTypeEnum.CURVED_RUN_STAIR +two_curved_run_stair = IfcStairTypeEnum.TWO_CURVED_RUN_STAIR +userdefined = IfcStairTypeEnum.USERDEFINED +notdefined = IfcStairTypeEnum.NOTDEFINED IfcStateEnum = enum_namespace() -readwrite = express_getattr(IfcStateEnum, 'READWRITE', INDETERMINATE) -readonly = express_getattr(IfcStateEnum, 'READONLY', INDETERMINATE) -locked = express_getattr(IfcStateEnum, 'LOCKED', INDETERMINATE) -readwritelocked = express_getattr(IfcStateEnum, 'READWRITELOCKED', INDETERMINATE) -readonlylocked = express_getattr(IfcStateEnum, 'READONLYLOCKED', INDETERMINATE) +readwrite = IfcStateEnum.READWRITE +readonly = IfcStateEnum.READONLY +locked = IfcStateEnum.LOCKED +readwritelocked = IfcStateEnum.READWRITELOCKED +readonlylocked = IfcStateEnum.READONLYLOCKED IfcStructuralCurveActivityTypeEnum = enum_namespace() -const = express_getattr(IfcStructuralCurveActivityTypeEnum, 'CONST', INDETERMINATE) -linear = express_getattr(IfcStructuralCurveActivityTypeEnum, 'LINEAR', INDETERMINATE) -polygonal = express_getattr(IfcStructuralCurveActivityTypeEnum, 'POLYGONAL', INDETERMINATE) -equidistant = express_getattr(IfcStructuralCurveActivityTypeEnum, 'EQUIDISTANT', INDETERMINATE) -sinus = express_getattr(IfcStructuralCurveActivityTypeEnum, 'SINUS', INDETERMINATE) -parabola = express_getattr(IfcStructuralCurveActivityTypeEnum, 'PARABOLA', INDETERMINATE) -discrete = express_getattr(IfcStructuralCurveActivityTypeEnum, 'DISCRETE', INDETERMINATE) -userdefined = express_getattr(IfcStructuralCurveActivityTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcStructuralCurveActivityTypeEnum, 'NOTDEFINED', INDETERMINATE) +const = IfcStructuralCurveActivityTypeEnum.CONST +linear = IfcStructuralCurveActivityTypeEnum.LINEAR +polygonal = IfcStructuralCurveActivityTypeEnum.POLYGONAL +equidistant = IfcStructuralCurveActivityTypeEnum.EQUIDISTANT +sinus = IfcStructuralCurveActivityTypeEnum.SINUS +parabola = IfcStructuralCurveActivityTypeEnum.PARABOLA +discrete = IfcStructuralCurveActivityTypeEnum.DISCRETE +userdefined = IfcStructuralCurveActivityTypeEnum.USERDEFINED +notdefined = IfcStructuralCurveActivityTypeEnum.NOTDEFINED IfcStructuralCurveMemberTypeEnum = enum_namespace() -rigid_joined_member = express_getattr(IfcStructuralCurveMemberTypeEnum, 'RIGID_JOINED_MEMBER', INDETERMINATE) -pin_joined_member = express_getattr(IfcStructuralCurveMemberTypeEnum, 'PIN_JOINED_MEMBER', INDETERMINATE) -cable = express_getattr(IfcStructuralCurveMemberTypeEnum, 'CABLE', INDETERMINATE) -tension_member = express_getattr(IfcStructuralCurveMemberTypeEnum, 'TENSION_MEMBER', INDETERMINATE) -compression_member = express_getattr(IfcStructuralCurveMemberTypeEnum, 'COMPRESSION_MEMBER', INDETERMINATE) -userdefined = express_getattr(IfcStructuralCurveMemberTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcStructuralCurveMemberTypeEnum, 'NOTDEFINED', INDETERMINATE) +rigid_joined_member = IfcStructuralCurveMemberTypeEnum.RIGID_JOINED_MEMBER +pin_joined_member = IfcStructuralCurveMemberTypeEnum.PIN_JOINED_MEMBER +cable = IfcStructuralCurveMemberTypeEnum.CABLE +tension_member = IfcStructuralCurveMemberTypeEnum.TENSION_MEMBER +compression_member = IfcStructuralCurveMemberTypeEnum.COMPRESSION_MEMBER +userdefined = IfcStructuralCurveMemberTypeEnum.USERDEFINED +notdefined = IfcStructuralCurveMemberTypeEnum.NOTDEFINED IfcStructuralSurfaceActivityTypeEnum = enum_namespace() -const = express_getattr(IfcStructuralSurfaceActivityTypeEnum, 'CONST', INDETERMINATE) -bilinear = express_getattr(IfcStructuralSurfaceActivityTypeEnum, 'BILINEAR', INDETERMINATE) -discrete = express_getattr(IfcStructuralSurfaceActivityTypeEnum, 'DISCRETE', INDETERMINATE) -isocontour = express_getattr(IfcStructuralSurfaceActivityTypeEnum, 'ISOCONTOUR', INDETERMINATE) -userdefined = express_getattr(IfcStructuralSurfaceActivityTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcStructuralSurfaceActivityTypeEnum, 'NOTDEFINED', INDETERMINATE) +const = IfcStructuralSurfaceActivityTypeEnum.CONST +bilinear = IfcStructuralSurfaceActivityTypeEnum.BILINEAR +discrete = IfcStructuralSurfaceActivityTypeEnum.DISCRETE +isocontour = IfcStructuralSurfaceActivityTypeEnum.ISOCONTOUR +userdefined = IfcStructuralSurfaceActivityTypeEnum.USERDEFINED +notdefined = IfcStructuralSurfaceActivityTypeEnum.NOTDEFINED IfcStructuralSurfaceMemberTypeEnum = enum_namespace() -bending_element = express_getattr(IfcStructuralSurfaceMemberTypeEnum, 'BENDING_ELEMENT', INDETERMINATE) -membrane_element = express_getattr(IfcStructuralSurfaceMemberTypeEnum, 'MEMBRANE_ELEMENT', INDETERMINATE) -shell = express_getattr(IfcStructuralSurfaceMemberTypeEnum, 'SHELL', INDETERMINATE) -userdefined = express_getattr(IfcStructuralSurfaceMemberTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcStructuralSurfaceMemberTypeEnum, 'NOTDEFINED', INDETERMINATE) +bending_element = IfcStructuralSurfaceMemberTypeEnum.BENDING_ELEMENT +membrane_element = IfcStructuralSurfaceMemberTypeEnum.MEMBRANE_ELEMENT +shell = IfcStructuralSurfaceMemberTypeEnum.SHELL +userdefined = IfcStructuralSurfaceMemberTypeEnum.USERDEFINED +notdefined = IfcStructuralSurfaceMemberTypeEnum.NOTDEFINED IfcSubContractResourceTypeEnum = enum_namespace() -purchase = express_getattr(IfcSubContractResourceTypeEnum, 'PURCHASE', INDETERMINATE) -work = express_getattr(IfcSubContractResourceTypeEnum, 'WORK', INDETERMINATE) -userdefined = express_getattr(IfcSubContractResourceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSubContractResourceTypeEnum, 'NOTDEFINED', INDETERMINATE) +purchase = IfcSubContractResourceTypeEnum.PURCHASE +work = IfcSubContractResourceTypeEnum.WORK +userdefined = IfcSubContractResourceTypeEnum.USERDEFINED +notdefined = IfcSubContractResourceTypeEnum.NOTDEFINED IfcSurfaceFeatureTypeEnum = enum_namespace() -mark = express_getattr(IfcSurfaceFeatureTypeEnum, 'MARK', INDETERMINATE) -tag = express_getattr(IfcSurfaceFeatureTypeEnum, 'TAG', INDETERMINATE) -treatment = express_getattr(IfcSurfaceFeatureTypeEnum, 'TREATMENT', INDETERMINATE) -defect = express_getattr(IfcSurfaceFeatureTypeEnum, 'DEFECT', INDETERMINATE) -userdefined = express_getattr(IfcSurfaceFeatureTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSurfaceFeatureTypeEnum, 'NOTDEFINED', INDETERMINATE) +mark = IfcSurfaceFeatureTypeEnum.MARK +tag = IfcSurfaceFeatureTypeEnum.TAG +treatment = IfcSurfaceFeatureTypeEnum.TREATMENT +defect = IfcSurfaceFeatureTypeEnum.DEFECT +userdefined = IfcSurfaceFeatureTypeEnum.USERDEFINED +notdefined = IfcSurfaceFeatureTypeEnum.NOTDEFINED IfcSurfaceSide = enum_namespace() -positive = express_getattr(IfcSurfaceSide, 'POSITIVE', INDETERMINATE) -negative = express_getattr(IfcSurfaceSide, 'NEGATIVE', INDETERMINATE) -both = express_getattr(IfcSurfaceSide, 'BOTH', INDETERMINATE) +positive = IfcSurfaceSide.POSITIVE +negative = IfcSurfaceSide.NEGATIVE +both = IfcSurfaceSide.BOTH IfcSwitchingDeviceTypeEnum = enum_namespace() -contactor = express_getattr(IfcSwitchingDeviceTypeEnum, 'CONTACTOR', INDETERMINATE) -dimmerswitch = express_getattr(IfcSwitchingDeviceTypeEnum, 'DIMMERSWITCH', INDETERMINATE) -emergencystop = express_getattr(IfcSwitchingDeviceTypeEnum, 'EMERGENCYSTOP', INDETERMINATE) -keypad = express_getattr(IfcSwitchingDeviceTypeEnum, 'KEYPAD', INDETERMINATE) -momentaryswitch = express_getattr(IfcSwitchingDeviceTypeEnum, 'MOMENTARYSWITCH', INDETERMINATE) -selectorswitch = express_getattr(IfcSwitchingDeviceTypeEnum, 'SELECTORSWITCH', INDETERMINATE) -starter = express_getattr(IfcSwitchingDeviceTypeEnum, 'STARTER', INDETERMINATE) -switchdisconnector = express_getattr(IfcSwitchingDeviceTypeEnum, 'SWITCHDISCONNECTOR', INDETERMINATE) -toggleswitch = express_getattr(IfcSwitchingDeviceTypeEnum, 'TOGGLESWITCH', INDETERMINATE) -userdefined = express_getattr(IfcSwitchingDeviceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSwitchingDeviceTypeEnum, 'NOTDEFINED', INDETERMINATE) +contactor = IfcSwitchingDeviceTypeEnum.CONTACTOR +dimmerswitch = IfcSwitchingDeviceTypeEnum.DIMMERSWITCH +emergencystop = IfcSwitchingDeviceTypeEnum.EMERGENCYSTOP +keypad = IfcSwitchingDeviceTypeEnum.KEYPAD +momentaryswitch = IfcSwitchingDeviceTypeEnum.MOMENTARYSWITCH +selectorswitch = IfcSwitchingDeviceTypeEnum.SELECTORSWITCH +starter = IfcSwitchingDeviceTypeEnum.STARTER +switchdisconnector = IfcSwitchingDeviceTypeEnum.SWITCHDISCONNECTOR +toggleswitch = IfcSwitchingDeviceTypeEnum.TOGGLESWITCH +userdefined = IfcSwitchingDeviceTypeEnum.USERDEFINED +notdefined = IfcSwitchingDeviceTypeEnum.NOTDEFINED IfcSystemFurnitureElementTypeEnum = enum_namespace() -panel = express_getattr(IfcSystemFurnitureElementTypeEnum, 'PANEL', INDETERMINATE) -worksurface = express_getattr(IfcSystemFurnitureElementTypeEnum, 'WORKSURFACE', INDETERMINATE) -userdefined = express_getattr(IfcSystemFurnitureElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSystemFurnitureElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +panel = IfcSystemFurnitureElementTypeEnum.PANEL +worksurface = IfcSystemFurnitureElementTypeEnum.WORKSURFACE +userdefined = IfcSystemFurnitureElementTypeEnum.USERDEFINED +notdefined = IfcSystemFurnitureElementTypeEnum.NOTDEFINED IfcTankTypeEnum = enum_namespace() -basin = express_getattr(IfcTankTypeEnum, 'BASIN', INDETERMINATE) -breakpressure = express_getattr(IfcTankTypeEnum, 'BREAKPRESSURE', INDETERMINATE) -expansion = express_getattr(IfcTankTypeEnum, 'EXPANSION', INDETERMINATE) -feedandexpansion = express_getattr(IfcTankTypeEnum, 'FEEDANDEXPANSION', INDETERMINATE) -pressurevessel = express_getattr(IfcTankTypeEnum, 'PRESSUREVESSEL', INDETERMINATE) -storage = express_getattr(IfcTankTypeEnum, 'STORAGE', INDETERMINATE) -vessel = express_getattr(IfcTankTypeEnum, 'VESSEL', INDETERMINATE) -userdefined = express_getattr(IfcTankTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTankTypeEnum, 'NOTDEFINED', INDETERMINATE) +basin = IfcTankTypeEnum.BASIN +breakpressure = IfcTankTypeEnum.BREAKPRESSURE +expansion = IfcTankTypeEnum.EXPANSION +feedandexpansion = IfcTankTypeEnum.FEEDANDEXPANSION +pressurevessel = IfcTankTypeEnum.PRESSUREVESSEL +storage = IfcTankTypeEnum.STORAGE +vessel = IfcTankTypeEnum.VESSEL +userdefined = IfcTankTypeEnum.USERDEFINED +notdefined = IfcTankTypeEnum.NOTDEFINED IfcTaskDurationEnum = enum_namespace() -elapsedtime = express_getattr(IfcTaskDurationEnum, 'ELAPSEDTIME', INDETERMINATE) -worktime = express_getattr(IfcTaskDurationEnum, 'WORKTIME', INDETERMINATE) -notdefined = express_getattr(IfcTaskDurationEnum, 'NOTDEFINED', INDETERMINATE) +elapsedtime = IfcTaskDurationEnum.ELAPSEDTIME +worktime = IfcTaskDurationEnum.WORKTIME +notdefined = IfcTaskDurationEnum.NOTDEFINED IfcTaskTypeEnum = enum_namespace() -attendance = express_getattr(IfcTaskTypeEnum, 'ATTENDANCE', INDETERMINATE) -construction = express_getattr(IfcTaskTypeEnum, 'CONSTRUCTION', INDETERMINATE) -demolition = express_getattr(IfcTaskTypeEnum, 'DEMOLITION', INDETERMINATE) -dismantle = express_getattr(IfcTaskTypeEnum, 'DISMANTLE', INDETERMINATE) -disposal = express_getattr(IfcTaskTypeEnum, 'DISPOSAL', INDETERMINATE) -installation = express_getattr(IfcTaskTypeEnum, 'INSTALLATION', INDETERMINATE) -logistic = express_getattr(IfcTaskTypeEnum, 'LOGISTIC', INDETERMINATE) -maintenance = express_getattr(IfcTaskTypeEnum, 'MAINTENANCE', INDETERMINATE) -move = express_getattr(IfcTaskTypeEnum, 'MOVE', INDETERMINATE) -operation = express_getattr(IfcTaskTypeEnum, 'OPERATION', INDETERMINATE) -removal = express_getattr(IfcTaskTypeEnum, 'REMOVAL', INDETERMINATE) -renovation = express_getattr(IfcTaskTypeEnum, 'RENOVATION', INDETERMINATE) -userdefined = express_getattr(IfcTaskTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTaskTypeEnum, 'NOTDEFINED', INDETERMINATE) +attendance = IfcTaskTypeEnum.ATTENDANCE +construction = IfcTaskTypeEnum.CONSTRUCTION +demolition = IfcTaskTypeEnum.DEMOLITION +dismantle = IfcTaskTypeEnum.DISMANTLE +disposal = IfcTaskTypeEnum.DISPOSAL +installation = IfcTaskTypeEnum.INSTALLATION +logistic = IfcTaskTypeEnum.LOGISTIC +maintenance = IfcTaskTypeEnum.MAINTENANCE +move = IfcTaskTypeEnum.MOVE +operation = IfcTaskTypeEnum.OPERATION +removal = IfcTaskTypeEnum.REMOVAL +renovation = IfcTaskTypeEnum.RENOVATION +userdefined = IfcTaskTypeEnum.USERDEFINED +notdefined = IfcTaskTypeEnum.NOTDEFINED IfcTendonAnchorTypeEnum = enum_namespace() -coupler = express_getattr(IfcTendonAnchorTypeEnum, 'COUPLER', INDETERMINATE) -fixed_end = express_getattr(IfcTendonAnchorTypeEnum, 'FIXED_END', INDETERMINATE) -tensioning_end = express_getattr(IfcTendonAnchorTypeEnum, 'TENSIONING_END', INDETERMINATE) -userdefined = express_getattr(IfcTendonAnchorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTendonAnchorTypeEnum, 'NOTDEFINED', INDETERMINATE) +coupler = IfcTendonAnchorTypeEnum.COUPLER +fixed_end = IfcTendonAnchorTypeEnum.FIXED_END +tensioning_end = IfcTendonAnchorTypeEnum.TENSIONING_END +userdefined = IfcTendonAnchorTypeEnum.USERDEFINED +notdefined = IfcTendonAnchorTypeEnum.NOTDEFINED IfcTendonConduitTypeEnum = enum_namespace() -duct = express_getattr(IfcTendonConduitTypeEnum, 'DUCT', INDETERMINATE) -coupler = express_getattr(IfcTendonConduitTypeEnum, 'COUPLER', INDETERMINATE) -grouting_duct = express_getattr(IfcTendonConduitTypeEnum, 'GROUTING_DUCT', INDETERMINATE) -trumpet = express_getattr(IfcTendonConduitTypeEnum, 'TRUMPET', INDETERMINATE) -diabolo = express_getattr(IfcTendonConduitTypeEnum, 'DIABOLO', INDETERMINATE) -userdefined = express_getattr(IfcTendonConduitTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTendonConduitTypeEnum, 'NOTDEFINED', INDETERMINATE) +duct = IfcTendonConduitTypeEnum.DUCT +coupler = IfcTendonConduitTypeEnum.COUPLER +grouting_duct = IfcTendonConduitTypeEnum.GROUTING_DUCT +trumpet = IfcTendonConduitTypeEnum.TRUMPET +diabolo = IfcTendonConduitTypeEnum.DIABOLO +userdefined = IfcTendonConduitTypeEnum.USERDEFINED +notdefined = IfcTendonConduitTypeEnum.NOTDEFINED IfcTendonTypeEnum = enum_namespace() -bar = express_getattr(IfcTendonTypeEnum, 'BAR', INDETERMINATE) -coated = express_getattr(IfcTendonTypeEnum, 'COATED', INDETERMINATE) -strand = express_getattr(IfcTendonTypeEnum, 'STRAND', INDETERMINATE) -wire = express_getattr(IfcTendonTypeEnum, 'WIRE', INDETERMINATE) -userdefined = express_getattr(IfcTendonTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTendonTypeEnum, 'NOTDEFINED', INDETERMINATE) +bar = IfcTendonTypeEnum.BAR +coated = IfcTendonTypeEnum.COATED +strand = IfcTendonTypeEnum.STRAND +wire = IfcTendonTypeEnum.WIRE +userdefined = IfcTendonTypeEnum.USERDEFINED +notdefined = IfcTendonTypeEnum.NOTDEFINED IfcTextPath = enum_namespace() -left = express_getattr(IfcTextPath, 'LEFT', INDETERMINATE) -right = express_getattr(IfcTextPath, 'RIGHT', INDETERMINATE) -up = express_getattr(IfcTextPath, 'UP', INDETERMINATE) -down = express_getattr(IfcTextPath, 'DOWN', INDETERMINATE) +left = IfcTextPath.LEFT +right = IfcTextPath.RIGHT +up = IfcTextPath.UP +down = IfcTextPath.DOWN IfcTimeSeriesDataTypeEnum = enum_namespace() -continuous = express_getattr(IfcTimeSeriesDataTypeEnum, 'CONTINUOUS', INDETERMINATE) -discrete = express_getattr(IfcTimeSeriesDataTypeEnum, 'DISCRETE', INDETERMINATE) -discretebinary = express_getattr(IfcTimeSeriesDataTypeEnum, 'DISCRETEBINARY', INDETERMINATE) -piecewisebinary = express_getattr(IfcTimeSeriesDataTypeEnum, 'PIECEWISEBINARY', INDETERMINATE) -piecewiseconstant = express_getattr(IfcTimeSeriesDataTypeEnum, 'PIECEWISECONSTANT', INDETERMINATE) -piecewisecontinuous = express_getattr(IfcTimeSeriesDataTypeEnum, 'PIECEWISECONTINUOUS', INDETERMINATE) -notdefined = express_getattr(IfcTimeSeriesDataTypeEnum, 'NOTDEFINED', INDETERMINATE) +continuous = IfcTimeSeriesDataTypeEnum.CONTINUOUS +discrete = IfcTimeSeriesDataTypeEnum.DISCRETE +discretebinary = IfcTimeSeriesDataTypeEnum.DISCRETEBINARY +piecewisebinary = IfcTimeSeriesDataTypeEnum.PIECEWISEBINARY +piecewiseconstant = IfcTimeSeriesDataTypeEnum.PIECEWISECONSTANT +piecewisecontinuous = IfcTimeSeriesDataTypeEnum.PIECEWISECONTINUOUS +notdefined = IfcTimeSeriesDataTypeEnum.NOTDEFINED IfcTransformerTypeEnum = enum_namespace() -current = express_getattr(IfcTransformerTypeEnum, 'CURRENT', INDETERMINATE) -frequency = express_getattr(IfcTransformerTypeEnum, 'FREQUENCY', INDETERMINATE) -inverter = express_getattr(IfcTransformerTypeEnum, 'INVERTER', INDETERMINATE) -rectifier = express_getattr(IfcTransformerTypeEnum, 'RECTIFIER', INDETERMINATE) -voltage = express_getattr(IfcTransformerTypeEnum, 'VOLTAGE', INDETERMINATE) -userdefined = express_getattr(IfcTransformerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTransformerTypeEnum, 'NOTDEFINED', INDETERMINATE) +current = IfcTransformerTypeEnum.CURRENT +frequency = IfcTransformerTypeEnum.FREQUENCY +inverter = IfcTransformerTypeEnum.INVERTER +rectifier = IfcTransformerTypeEnum.RECTIFIER +voltage = IfcTransformerTypeEnum.VOLTAGE +userdefined = IfcTransformerTypeEnum.USERDEFINED +notdefined = IfcTransformerTypeEnum.NOTDEFINED IfcTransitionCode = enum_namespace() -discontinuous = express_getattr(IfcTransitionCode, 'DISCONTINUOUS', INDETERMINATE) -continuous = express_getattr(IfcTransitionCode, 'CONTINUOUS', INDETERMINATE) -contsamegradient = express_getattr(IfcTransitionCode, 'CONTSAMEGRADIENT', INDETERMINATE) -contsamegradientsamecurvature = express_getattr(IfcTransitionCode, 'CONTSAMEGRADIENTSAMECURVATURE', INDETERMINATE) +discontinuous = IfcTransitionCode.DISCONTINUOUS +continuous = IfcTransitionCode.CONTINUOUS +contsamegradient = IfcTransitionCode.CONTSAMEGRADIENT +contsamegradientsamecurvature = IfcTransitionCode.CONTSAMEGRADIENTSAMECURVATURE IfcTransitionCurveType = enum_namespace() -biquadraticparabola = express_getattr(IfcTransitionCurveType, 'BIQUADRATICPARABOLA', INDETERMINATE) -blosscurve = express_getattr(IfcTransitionCurveType, 'BLOSSCURVE', INDETERMINATE) -clothoidcurve = express_getattr(IfcTransitionCurveType, 'CLOTHOIDCURVE', INDETERMINATE) -cosinecurve = express_getattr(IfcTransitionCurveType, 'COSINECURVE', INDETERMINATE) -cubicparabola = express_getattr(IfcTransitionCurveType, 'CUBICPARABOLA', INDETERMINATE) -sinecurve = express_getattr(IfcTransitionCurveType, 'SINECURVE', INDETERMINATE) +biquadraticparabola = IfcTransitionCurveType.BIQUADRATICPARABOLA +blosscurve = IfcTransitionCurveType.BLOSSCURVE +clothoidcurve = IfcTransitionCurveType.CLOTHOIDCURVE +cosinecurve = IfcTransitionCurveType.COSINECURVE +cubicparabola = IfcTransitionCurveType.CUBICPARABOLA +sinecurve = IfcTransitionCurveType.SINECURVE IfcTransportElementTypeEnum = enum_namespace() -elevator = express_getattr(IfcTransportElementTypeEnum, 'ELEVATOR', INDETERMINATE) -escalator = express_getattr(IfcTransportElementTypeEnum, 'ESCALATOR', INDETERMINATE) -movingwalkway = express_getattr(IfcTransportElementTypeEnum, 'MOVINGWALKWAY', INDETERMINATE) -craneway = express_getattr(IfcTransportElementTypeEnum, 'CRANEWAY', INDETERMINATE) -liftinggear = express_getattr(IfcTransportElementTypeEnum, 'LIFTINGGEAR', INDETERMINATE) -userdefined = express_getattr(IfcTransportElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTransportElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +elevator = IfcTransportElementTypeEnum.ELEVATOR +escalator = IfcTransportElementTypeEnum.ESCALATOR +movingwalkway = IfcTransportElementTypeEnum.MOVINGWALKWAY +craneway = IfcTransportElementTypeEnum.CRANEWAY +liftinggear = IfcTransportElementTypeEnum.LIFTINGGEAR +userdefined = IfcTransportElementTypeEnum.USERDEFINED +notdefined = IfcTransportElementTypeEnum.NOTDEFINED IfcTrimmingPreference = enum_namespace() -cartesian = express_getattr(IfcTrimmingPreference, 'CARTESIAN', INDETERMINATE) -parameter = express_getattr(IfcTrimmingPreference, 'PARAMETER', INDETERMINATE) -unspecified = express_getattr(IfcTrimmingPreference, 'UNSPECIFIED', INDETERMINATE) +cartesian = IfcTrimmingPreference.CARTESIAN +parameter = IfcTrimmingPreference.PARAMETER +unspecified = IfcTrimmingPreference.UNSPECIFIED IfcTubeBundleTypeEnum = enum_namespace() -finned = express_getattr(IfcTubeBundleTypeEnum, 'FINNED', INDETERMINATE) -userdefined = express_getattr(IfcTubeBundleTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTubeBundleTypeEnum, 'NOTDEFINED', INDETERMINATE) +finned = IfcTubeBundleTypeEnum.FINNED +userdefined = IfcTubeBundleTypeEnum.USERDEFINED +notdefined = IfcTubeBundleTypeEnum.NOTDEFINED IfcUnitEnum = enum_namespace() -absorbeddoseunit = express_getattr(IfcUnitEnum, 'ABSORBEDDOSEUNIT', INDETERMINATE) -amountofsubstanceunit = express_getattr(IfcUnitEnum, 'AMOUNTOFSUBSTANCEUNIT', INDETERMINATE) -areaunit = express_getattr(IfcUnitEnum, 'AREAUNIT', INDETERMINATE) -doseequivalentunit = express_getattr(IfcUnitEnum, 'DOSEEQUIVALENTUNIT', INDETERMINATE) -electriccapacitanceunit = express_getattr(IfcUnitEnum, 'ELECTRICCAPACITANCEUNIT', INDETERMINATE) -electricchargeunit = express_getattr(IfcUnitEnum, 'ELECTRICCHARGEUNIT', INDETERMINATE) -electricconductanceunit = express_getattr(IfcUnitEnum, 'ELECTRICCONDUCTANCEUNIT', INDETERMINATE) -electriccurrentunit = express_getattr(IfcUnitEnum, 'ELECTRICCURRENTUNIT', INDETERMINATE) -electricresistanceunit = express_getattr(IfcUnitEnum, 'ELECTRICRESISTANCEUNIT', INDETERMINATE) -electricvoltageunit = express_getattr(IfcUnitEnum, 'ELECTRICVOLTAGEUNIT', INDETERMINATE) -energyunit = express_getattr(IfcUnitEnum, 'ENERGYUNIT', INDETERMINATE) -forceunit = express_getattr(IfcUnitEnum, 'FORCEUNIT', INDETERMINATE) -frequencyunit = express_getattr(IfcUnitEnum, 'FREQUENCYUNIT', INDETERMINATE) -illuminanceunit = express_getattr(IfcUnitEnum, 'ILLUMINANCEUNIT', INDETERMINATE) -inductanceunit = express_getattr(IfcUnitEnum, 'INDUCTANCEUNIT', INDETERMINATE) -lengthunit = express_getattr(IfcUnitEnum, 'LENGTHUNIT', INDETERMINATE) -luminousfluxunit = express_getattr(IfcUnitEnum, 'LUMINOUSFLUXUNIT', INDETERMINATE) -luminousintensityunit = express_getattr(IfcUnitEnum, 'LUMINOUSINTENSITYUNIT', INDETERMINATE) -magneticfluxdensityunit = express_getattr(IfcUnitEnum, 'MAGNETICFLUXDENSITYUNIT', INDETERMINATE) -magneticfluxunit = express_getattr(IfcUnitEnum, 'MAGNETICFLUXUNIT', INDETERMINATE) -massunit = express_getattr(IfcUnitEnum, 'MASSUNIT', INDETERMINATE) -planeangleunit = express_getattr(IfcUnitEnum, 'PLANEANGLEUNIT', INDETERMINATE) -powerunit = express_getattr(IfcUnitEnum, 'POWERUNIT', INDETERMINATE) -pressureunit = express_getattr(IfcUnitEnum, 'PRESSUREUNIT', INDETERMINATE) -radioactivityunit = express_getattr(IfcUnitEnum, 'RADIOACTIVITYUNIT', INDETERMINATE) -solidangleunit = express_getattr(IfcUnitEnum, 'SOLIDANGLEUNIT', INDETERMINATE) -thermodynamictemperatureunit = express_getattr(IfcUnitEnum, 'THERMODYNAMICTEMPERATUREUNIT', INDETERMINATE) -timeunit = express_getattr(IfcUnitEnum, 'TIMEUNIT', INDETERMINATE) -volumeunit = express_getattr(IfcUnitEnum, 'VOLUMEUNIT', INDETERMINATE) -userdefined = express_getattr(IfcUnitEnum, 'USERDEFINED', INDETERMINATE) +absorbeddoseunit = IfcUnitEnum.ABSORBEDDOSEUNIT +amountofsubstanceunit = IfcUnitEnum.AMOUNTOFSUBSTANCEUNIT +areaunit = IfcUnitEnum.AREAUNIT +doseequivalentunit = IfcUnitEnum.DOSEEQUIVALENTUNIT +electriccapacitanceunit = IfcUnitEnum.ELECTRICCAPACITANCEUNIT +electricchargeunit = IfcUnitEnum.ELECTRICCHARGEUNIT +electricconductanceunit = IfcUnitEnum.ELECTRICCONDUCTANCEUNIT +electriccurrentunit = IfcUnitEnum.ELECTRICCURRENTUNIT +electricresistanceunit = IfcUnitEnum.ELECTRICRESISTANCEUNIT +electricvoltageunit = IfcUnitEnum.ELECTRICVOLTAGEUNIT +energyunit = IfcUnitEnum.ENERGYUNIT +forceunit = IfcUnitEnum.FORCEUNIT +frequencyunit = IfcUnitEnum.FREQUENCYUNIT +illuminanceunit = IfcUnitEnum.ILLUMINANCEUNIT +inductanceunit = IfcUnitEnum.INDUCTANCEUNIT +lengthunit = IfcUnitEnum.LENGTHUNIT +luminousfluxunit = IfcUnitEnum.LUMINOUSFLUXUNIT +luminousintensityunit = IfcUnitEnum.LUMINOUSINTENSITYUNIT +magneticfluxdensityunit = IfcUnitEnum.MAGNETICFLUXDENSITYUNIT +magneticfluxunit = IfcUnitEnum.MAGNETICFLUXUNIT +massunit = IfcUnitEnum.MASSUNIT +planeangleunit = IfcUnitEnum.PLANEANGLEUNIT +powerunit = IfcUnitEnum.POWERUNIT +pressureunit = IfcUnitEnum.PRESSUREUNIT +radioactivityunit = IfcUnitEnum.RADIOACTIVITYUNIT +solidangleunit = IfcUnitEnum.SOLIDANGLEUNIT +thermodynamictemperatureunit = IfcUnitEnum.THERMODYNAMICTEMPERATUREUNIT +timeunit = IfcUnitEnum.TIMEUNIT +volumeunit = IfcUnitEnum.VOLUMEUNIT +userdefined = IfcUnitEnum.USERDEFINED IfcUnitaryControlElementTypeEnum = enum_namespace() -alarmpanel = express_getattr(IfcUnitaryControlElementTypeEnum, 'ALARMPANEL', INDETERMINATE) -controlpanel = express_getattr(IfcUnitaryControlElementTypeEnum, 'CONTROLPANEL', INDETERMINATE) -gasdetectionpanel = express_getattr(IfcUnitaryControlElementTypeEnum, 'GASDETECTIONPANEL', INDETERMINATE) -indicatorpanel = express_getattr(IfcUnitaryControlElementTypeEnum, 'INDICATORPANEL', INDETERMINATE) -mimicpanel = express_getattr(IfcUnitaryControlElementTypeEnum, 'MIMICPANEL', INDETERMINATE) -humidistat = express_getattr(IfcUnitaryControlElementTypeEnum, 'HUMIDISTAT', INDETERMINATE) -thermostat = express_getattr(IfcUnitaryControlElementTypeEnum, 'THERMOSTAT', INDETERMINATE) -weatherstation = express_getattr(IfcUnitaryControlElementTypeEnum, 'WEATHERSTATION', INDETERMINATE) -userdefined = express_getattr(IfcUnitaryControlElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcUnitaryControlElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +alarmpanel = IfcUnitaryControlElementTypeEnum.ALARMPANEL +controlpanel = IfcUnitaryControlElementTypeEnum.CONTROLPANEL +gasdetectionpanel = IfcUnitaryControlElementTypeEnum.GASDETECTIONPANEL +indicatorpanel = IfcUnitaryControlElementTypeEnum.INDICATORPANEL +mimicpanel = IfcUnitaryControlElementTypeEnum.MIMICPANEL +humidistat = IfcUnitaryControlElementTypeEnum.HUMIDISTAT +thermostat = IfcUnitaryControlElementTypeEnum.THERMOSTAT +weatherstation = IfcUnitaryControlElementTypeEnum.WEATHERSTATION +userdefined = IfcUnitaryControlElementTypeEnum.USERDEFINED +notdefined = IfcUnitaryControlElementTypeEnum.NOTDEFINED IfcUnitaryEquipmentTypeEnum = enum_namespace() -airhandler = express_getattr(IfcUnitaryEquipmentTypeEnum, 'AIRHANDLER', INDETERMINATE) -airconditioningunit = express_getattr(IfcUnitaryEquipmentTypeEnum, 'AIRCONDITIONINGUNIT', INDETERMINATE) -dehumidifier = express_getattr(IfcUnitaryEquipmentTypeEnum, 'DEHUMIDIFIER', INDETERMINATE) -splitsystem = express_getattr(IfcUnitaryEquipmentTypeEnum, 'SPLITSYSTEM', INDETERMINATE) -rooftopunit = express_getattr(IfcUnitaryEquipmentTypeEnum, 'ROOFTOPUNIT', INDETERMINATE) -userdefined = express_getattr(IfcUnitaryEquipmentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcUnitaryEquipmentTypeEnum, 'NOTDEFINED', INDETERMINATE) +airhandler = IfcUnitaryEquipmentTypeEnum.AIRHANDLER +airconditioningunit = IfcUnitaryEquipmentTypeEnum.AIRCONDITIONINGUNIT +dehumidifier = IfcUnitaryEquipmentTypeEnum.DEHUMIDIFIER +splitsystem = IfcUnitaryEquipmentTypeEnum.SPLITSYSTEM +rooftopunit = IfcUnitaryEquipmentTypeEnum.ROOFTOPUNIT +userdefined = IfcUnitaryEquipmentTypeEnum.USERDEFINED +notdefined = IfcUnitaryEquipmentTypeEnum.NOTDEFINED IfcValveTypeEnum = enum_namespace() -airrelease = express_getattr(IfcValveTypeEnum, 'AIRRELEASE', INDETERMINATE) -antivacuum = express_getattr(IfcValveTypeEnum, 'ANTIVACUUM', INDETERMINATE) -changeover = express_getattr(IfcValveTypeEnum, 'CHANGEOVER', INDETERMINATE) -check = express_getattr(IfcValveTypeEnum, 'CHECK', INDETERMINATE) -commissioning = express_getattr(IfcValveTypeEnum, 'COMMISSIONING', INDETERMINATE) -diverting = express_getattr(IfcValveTypeEnum, 'DIVERTING', INDETERMINATE) -drawoffcock = express_getattr(IfcValveTypeEnum, 'DRAWOFFCOCK', INDETERMINATE) -doublecheck = express_getattr(IfcValveTypeEnum, 'DOUBLECHECK', INDETERMINATE) -doubleregulating = express_getattr(IfcValveTypeEnum, 'DOUBLEREGULATING', INDETERMINATE) -faucet = express_getattr(IfcValveTypeEnum, 'FAUCET', INDETERMINATE) -flushing = express_getattr(IfcValveTypeEnum, 'FLUSHING', INDETERMINATE) -gascock = express_getattr(IfcValveTypeEnum, 'GASCOCK', INDETERMINATE) -gastap = express_getattr(IfcValveTypeEnum, 'GASTAP', INDETERMINATE) -isolating = express_getattr(IfcValveTypeEnum, 'ISOLATING', INDETERMINATE) -mixing = express_getattr(IfcValveTypeEnum, 'MIXING', INDETERMINATE) -pressurereducing = express_getattr(IfcValveTypeEnum, 'PRESSUREREDUCING', INDETERMINATE) -pressurerelief = express_getattr(IfcValveTypeEnum, 'PRESSURERELIEF', INDETERMINATE) -regulating = express_getattr(IfcValveTypeEnum, 'REGULATING', INDETERMINATE) -safetycutoff = express_getattr(IfcValveTypeEnum, 'SAFETYCUTOFF', INDETERMINATE) -steamtrap = express_getattr(IfcValveTypeEnum, 'STEAMTRAP', INDETERMINATE) -stopcock = express_getattr(IfcValveTypeEnum, 'STOPCOCK', INDETERMINATE) -userdefined = express_getattr(IfcValveTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcValveTypeEnum, 'NOTDEFINED', INDETERMINATE) +airrelease = IfcValveTypeEnum.AIRRELEASE +antivacuum = IfcValveTypeEnum.ANTIVACUUM +changeover = IfcValveTypeEnum.CHANGEOVER +check = IfcValveTypeEnum.CHECK +commissioning = IfcValveTypeEnum.COMMISSIONING +diverting = IfcValveTypeEnum.DIVERTING +drawoffcock = IfcValveTypeEnum.DRAWOFFCOCK +doublecheck = IfcValveTypeEnum.DOUBLECHECK +doubleregulating = IfcValveTypeEnum.DOUBLEREGULATING +faucet = IfcValveTypeEnum.FAUCET +flushing = IfcValveTypeEnum.FLUSHING +gascock = IfcValveTypeEnum.GASCOCK +gastap = IfcValveTypeEnum.GASTAP +isolating = IfcValveTypeEnum.ISOLATING +mixing = IfcValveTypeEnum.MIXING +pressurereducing = IfcValveTypeEnum.PRESSUREREDUCING +pressurerelief = IfcValveTypeEnum.PRESSURERELIEF +regulating = IfcValveTypeEnum.REGULATING +safetycutoff = IfcValveTypeEnum.SAFETYCUTOFF +steamtrap = IfcValveTypeEnum.STEAMTRAP +stopcock = IfcValveTypeEnum.STOPCOCK +userdefined = IfcValveTypeEnum.USERDEFINED +notdefined = IfcValveTypeEnum.NOTDEFINED IfcVibrationDamperTypeEnum = enum_namespace() -bending_yield = express_getattr(IfcVibrationDamperTypeEnum, 'BENDING_YIELD', INDETERMINATE) -shear_yield = express_getattr(IfcVibrationDamperTypeEnum, 'SHEAR_YIELD', INDETERMINATE) -axial_yield = express_getattr(IfcVibrationDamperTypeEnum, 'AXIAL_YIELD', INDETERMINATE) -friction = express_getattr(IfcVibrationDamperTypeEnum, 'FRICTION', INDETERMINATE) -viscous = express_getattr(IfcVibrationDamperTypeEnum, 'VISCOUS', INDETERMINATE) -rubber = express_getattr(IfcVibrationDamperTypeEnum, 'RUBBER', INDETERMINATE) -userdefined = express_getattr(IfcVibrationDamperTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcVibrationDamperTypeEnum, 'NOTDEFINED', INDETERMINATE) +bending_yield = IfcVibrationDamperTypeEnum.BENDING_YIELD +shear_yield = IfcVibrationDamperTypeEnum.SHEAR_YIELD +axial_yield = IfcVibrationDamperTypeEnum.AXIAL_YIELD +friction = IfcVibrationDamperTypeEnum.FRICTION +viscous = IfcVibrationDamperTypeEnum.VISCOUS +rubber = IfcVibrationDamperTypeEnum.RUBBER +userdefined = IfcVibrationDamperTypeEnum.USERDEFINED +notdefined = IfcVibrationDamperTypeEnum.NOTDEFINED IfcVibrationIsolatorTypeEnum = enum_namespace() -compression = express_getattr(IfcVibrationIsolatorTypeEnum, 'COMPRESSION', INDETERMINATE) -spring = express_getattr(IfcVibrationIsolatorTypeEnum, 'SPRING', INDETERMINATE) -base = express_getattr(IfcVibrationIsolatorTypeEnum, 'BASE', INDETERMINATE) -userdefined = express_getattr(IfcVibrationIsolatorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcVibrationIsolatorTypeEnum, 'NOTDEFINED', INDETERMINATE) +compression = IfcVibrationIsolatorTypeEnum.COMPRESSION +spring = IfcVibrationIsolatorTypeEnum.SPRING +base = IfcVibrationIsolatorTypeEnum.BASE +userdefined = IfcVibrationIsolatorTypeEnum.USERDEFINED +notdefined = IfcVibrationIsolatorTypeEnum.NOTDEFINED IfcVoidingFeatureTypeEnum = enum_namespace() -cutout = express_getattr(IfcVoidingFeatureTypeEnum, 'CUTOUT', INDETERMINATE) -notch = express_getattr(IfcVoidingFeatureTypeEnum, 'NOTCH', INDETERMINATE) -hole = express_getattr(IfcVoidingFeatureTypeEnum, 'HOLE', INDETERMINATE) -miter = express_getattr(IfcVoidingFeatureTypeEnum, 'MITER', INDETERMINATE) -chamfer = express_getattr(IfcVoidingFeatureTypeEnum, 'CHAMFER', INDETERMINATE) -edge = express_getattr(IfcVoidingFeatureTypeEnum, 'EDGE', INDETERMINATE) -userdefined = express_getattr(IfcVoidingFeatureTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcVoidingFeatureTypeEnum, 'NOTDEFINED', INDETERMINATE) +cutout = IfcVoidingFeatureTypeEnum.CUTOUT +notch = IfcVoidingFeatureTypeEnum.NOTCH +hole = IfcVoidingFeatureTypeEnum.HOLE +miter = IfcVoidingFeatureTypeEnum.MITER +chamfer = IfcVoidingFeatureTypeEnum.CHAMFER +edge = IfcVoidingFeatureTypeEnum.EDGE +userdefined = IfcVoidingFeatureTypeEnum.USERDEFINED +notdefined = IfcVoidingFeatureTypeEnum.NOTDEFINED IfcWallTypeEnum = enum_namespace() -movable = express_getattr(IfcWallTypeEnum, 'MOVABLE', INDETERMINATE) -parapet = express_getattr(IfcWallTypeEnum, 'PARAPET', INDETERMINATE) -partitioning = express_getattr(IfcWallTypeEnum, 'PARTITIONING', INDETERMINATE) -plumbingwall = express_getattr(IfcWallTypeEnum, 'PLUMBINGWALL', INDETERMINATE) -shear = express_getattr(IfcWallTypeEnum, 'SHEAR', INDETERMINATE) -solidwall = express_getattr(IfcWallTypeEnum, 'SOLIDWALL', INDETERMINATE) -standard = express_getattr(IfcWallTypeEnum, 'STANDARD', INDETERMINATE) -polygonal = express_getattr(IfcWallTypeEnum, 'POLYGONAL', INDETERMINATE) -elementedwall = express_getattr(IfcWallTypeEnum, 'ELEMENTEDWALL', INDETERMINATE) -retainingwall = express_getattr(IfcWallTypeEnum, 'RETAININGWALL', INDETERMINATE) -userdefined = express_getattr(IfcWallTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcWallTypeEnum, 'NOTDEFINED', INDETERMINATE) +movable = IfcWallTypeEnum.MOVABLE +parapet = IfcWallTypeEnum.PARAPET +partitioning = IfcWallTypeEnum.PARTITIONING +plumbingwall = IfcWallTypeEnum.PLUMBINGWALL +shear = IfcWallTypeEnum.SHEAR +solidwall = IfcWallTypeEnum.SOLIDWALL +standard = IfcWallTypeEnum.STANDARD +polygonal = IfcWallTypeEnum.POLYGONAL +elementedwall = IfcWallTypeEnum.ELEMENTEDWALL +retainingwall = IfcWallTypeEnum.RETAININGWALL +userdefined = IfcWallTypeEnum.USERDEFINED +notdefined = IfcWallTypeEnum.NOTDEFINED IfcWasteTerminalTypeEnum = enum_namespace() -floortrap = express_getattr(IfcWasteTerminalTypeEnum, 'FLOORTRAP', INDETERMINATE) -floorwaste = express_getattr(IfcWasteTerminalTypeEnum, 'FLOORWASTE', INDETERMINATE) -gullysump = express_getattr(IfcWasteTerminalTypeEnum, 'GULLYSUMP', INDETERMINATE) -gullytrap = express_getattr(IfcWasteTerminalTypeEnum, 'GULLYTRAP', INDETERMINATE) -roofdrain = express_getattr(IfcWasteTerminalTypeEnum, 'ROOFDRAIN', INDETERMINATE) -wastedisposalunit = express_getattr(IfcWasteTerminalTypeEnum, 'WASTEDISPOSALUNIT', INDETERMINATE) -wastetrap = express_getattr(IfcWasteTerminalTypeEnum, 'WASTETRAP', INDETERMINATE) -userdefined = express_getattr(IfcWasteTerminalTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcWasteTerminalTypeEnum, 'NOTDEFINED', INDETERMINATE) +floortrap = IfcWasteTerminalTypeEnum.FLOORTRAP +floorwaste = IfcWasteTerminalTypeEnum.FLOORWASTE +gullysump = IfcWasteTerminalTypeEnum.GULLYSUMP +gullytrap = IfcWasteTerminalTypeEnum.GULLYTRAP +roofdrain = IfcWasteTerminalTypeEnum.ROOFDRAIN +wastedisposalunit = IfcWasteTerminalTypeEnum.WASTEDISPOSALUNIT +wastetrap = IfcWasteTerminalTypeEnum.WASTETRAP +userdefined = IfcWasteTerminalTypeEnum.USERDEFINED +notdefined = IfcWasteTerminalTypeEnum.NOTDEFINED IfcWindowPanelOperationEnum = enum_namespace() -sidehungrighthand = express_getattr(IfcWindowPanelOperationEnum, 'SIDEHUNGRIGHTHAND', INDETERMINATE) -sidehunglefthand = express_getattr(IfcWindowPanelOperationEnum, 'SIDEHUNGLEFTHAND', INDETERMINATE) -tiltandturnrighthand = express_getattr(IfcWindowPanelOperationEnum, 'TILTANDTURNRIGHTHAND', INDETERMINATE) -tiltandturnlefthand = express_getattr(IfcWindowPanelOperationEnum, 'TILTANDTURNLEFTHAND', INDETERMINATE) -tophung = express_getattr(IfcWindowPanelOperationEnum, 'TOPHUNG', INDETERMINATE) -bottomhung = express_getattr(IfcWindowPanelOperationEnum, 'BOTTOMHUNG', INDETERMINATE) -pivothorizontal = express_getattr(IfcWindowPanelOperationEnum, 'PIVOTHORIZONTAL', INDETERMINATE) -pivotvertical = express_getattr(IfcWindowPanelOperationEnum, 'PIVOTVERTICAL', INDETERMINATE) -slidinghorizontal = express_getattr(IfcWindowPanelOperationEnum, 'SLIDINGHORIZONTAL', INDETERMINATE) -slidingvertical = express_getattr(IfcWindowPanelOperationEnum, 'SLIDINGVERTICAL', INDETERMINATE) -removablecasement = express_getattr(IfcWindowPanelOperationEnum, 'REMOVABLECASEMENT', INDETERMINATE) -fixedcasement = express_getattr(IfcWindowPanelOperationEnum, 'FIXEDCASEMENT', INDETERMINATE) -otheroperation = express_getattr(IfcWindowPanelOperationEnum, 'OTHEROPERATION', INDETERMINATE) -notdefined = express_getattr(IfcWindowPanelOperationEnum, 'NOTDEFINED', INDETERMINATE) +sidehungrighthand = IfcWindowPanelOperationEnum.SIDEHUNGRIGHTHAND +sidehunglefthand = IfcWindowPanelOperationEnum.SIDEHUNGLEFTHAND +tiltandturnrighthand = IfcWindowPanelOperationEnum.TILTANDTURNRIGHTHAND +tiltandturnlefthand = IfcWindowPanelOperationEnum.TILTANDTURNLEFTHAND +tophung = IfcWindowPanelOperationEnum.TOPHUNG +bottomhung = IfcWindowPanelOperationEnum.BOTTOMHUNG +pivothorizontal = IfcWindowPanelOperationEnum.PIVOTHORIZONTAL +pivotvertical = IfcWindowPanelOperationEnum.PIVOTVERTICAL +slidinghorizontal = IfcWindowPanelOperationEnum.SLIDINGHORIZONTAL +slidingvertical = IfcWindowPanelOperationEnum.SLIDINGVERTICAL +removablecasement = IfcWindowPanelOperationEnum.REMOVABLECASEMENT +fixedcasement = IfcWindowPanelOperationEnum.FIXEDCASEMENT +otheroperation = IfcWindowPanelOperationEnum.OTHEROPERATION +notdefined = IfcWindowPanelOperationEnum.NOTDEFINED IfcWindowPanelPositionEnum = enum_namespace() -left = express_getattr(IfcWindowPanelPositionEnum, 'LEFT', INDETERMINATE) -middle = express_getattr(IfcWindowPanelPositionEnum, 'MIDDLE', INDETERMINATE) -right = express_getattr(IfcWindowPanelPositionEnum, 'RIGHT', INDETERMINATE) -bottom = express_getattr(IfcWindowPanelPositionEnum, 'BOTTOM', INDETERMINATE) -top = express_getattr(IfcWindowPanelPositionEnum, 'TOP', INDETERMINATE) -notdefined = express_getattr(IfcWindowPanelPositionEnum, 'NOTDEFINED', INDETERMINATE) +left = IfcWindowPanelPositionEnum.LEFT +middle = IfcWindowPanelPositionEnum.MIDDLE +right = IfcWindowPanelPositionEnum.RIGHT +bottom = IfcWindowPanelPositionEnum.BOTTOM +top = IfcWindowPanelPositionEnum.TOP +notdefined = IfcWindowPanelPositionEnum.NOTDEFINED IfcWindowStyleConstructionEnum = enum_namespace() -aluminium = express_getattr(IfcWindowStyleConstructionEnum, 'ALUMINIUM', INDETERMINATE) -high_grade_steel = express_getattr(IfcWindowStyleConstructionEnum, 'HIGH_GRADE_STEEL', INDETERMINATE) -steel = express_getattr(IfcWindowStyleConstructionEnum, 'STEEL', INDETERMINATE) -wood = express_getattr(IfcWindowStyleConstructionEnum, 'WOOD', INDETERMINATE) -aluminium_wood = express_getattr(IfcWindowStyleConstructionEnum, 'ALUMINIUM_WOOD', INDETERMINATE) -plastic = express_getattr(IfcWindowStyleConstructionEnum, 'PLASTIC', INDETERMINATE) -other_construction = express_getattr(IfcWindowStyleConstructionEnum, 'OTHER_CONSTRUCTION', INDETERMINATE) -notdefined = express_getattr(IfcWindowStyleConstructionEnum, 'NOTDEFINED', INDETERMINATE) +aluminium = IfcWindowStyleConstructionEnum.ALUMINIUM +high_grade_steel = IfcWindowStyleConstructionEnum.HIGH_GRADE_STEEL +steel = IfcWindowStyleConstructionEnum.STEEL +wood = IfcWindowStyleConstructionEnum.WOOD +aluminium_wood = IfcWindowStyleConstructionEnum.ALUMINIUM_WOOD +plastic = IfcWindowStyleConstructionEnum.PLASTIC +other_construction = IfcWindowStyleConstructionEnum.OTHER_CONSTRUCTION +notdefined = IfcWindowStyleConstructionEnum.NOTDEFINED IfcWindowStyleOperationEnum = enum_namespace() -single_panel = express_getattr(IfcWindowStyleOperationEnum, 'SINGLE_PANEL', INDETERMINATE) -double_panel_vertical = express_getattr(IfcWindowStyleOperationEnum, 'DOUBLE_PANEL_VERTICAL', INDETERMINATE) -double_panel_horizontal = express_getattr(IfcWindowStyleOperationEnum, 'DOUBLE_PANEL_HORIZONTAL', INDETERMINATE) -triple_panel_vertical = express_getattr(IfcWindowStyleOperationEnum, 'TRIPLE_PANEL_VERTICAL', INDETERMINATE) -triple_panel_bottom = express_getattr(IfcWindowStyleOperationEnum, 'TRIPLE_PANEL_BOTTOM', INDETERMINATE) -triple_panel_top = express_getattr(IfcWindowStyleOperationEnum, 'TRIPLE_PANEL_TOP', INDETERMINATE) -triple_panel_left = express_getattr(IfcWindowStyleOperationEnum, 'TRIPLE_PANEL_LEFT', INDETERMINATE) -triple_panel_right = express_getattr(IfcWindowStyleOperationEnum, 'TRIPLE_PANEL_RIGHT', INDETERMINATE) -triple_panel_horizontal = express_getattr(IfcWindowStyleOperationEnum, 'TRIPLE_PANEL_HORIZONTAL', INDETERMINATE) -userdefined = express_getattr(IfcWindowStyleOperationEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcWindowStyleOperationEnum, 'NOTDEFINED', INDETERMINATE) +single_panel = IfcWindowStyleOperationEnum.SINGLE_PANEL +double_panel_vertical = IfcWindowStyleOperationEnum.DOUBLE_PANEL_VERTICAL +double_panel_horizontal = IfcWindowStyleOperationEnum.DOUBLE_PANEL_HORIZONTAL +triple_panel_vertical = IfcWindowStyleOperationEnum.TRIPLE_PANEL_VERTICAL +triple_panel_bottom = IfcWindowStyleOperationEnum.TRIPLE_PANEL_BOTTOM +triple_panel_top = IfcWindowStyleOperationEnum.TRIPLE_PANEL_TOP +triple_panel_left = IfcWindowStyleOperationEnum.TRIPLE_PANEL_LEFT +triple_panel_right = IfcWindowStyleOperationEnum.TRIPLE_PANEL_RIGHT +triple_panel_horizontal = IfcWindowStyleOperationEnum.TRIPLE_PANEL_HORIZONTAL +userdefined = IfcWindowStyleOperationEnum.USERDEFINED +notdefined = IfcWindowStyleOperationEnum.NOTDEFINED IfcWindowTypeEnum = enum_namespace() -window = express_getattr(IfcWindowTypeEnum, 'WINDOW', INDETERMINATE) -skylight = express_getattr(IfcWindowTypeEnum, 'SKYLIGHT', INDETERMINATE) -lightdome = express_getattr(IfcWindowTypeEnum, 'LIGHTDOME', INDETERMINATE) -userdefined = express_getattr(IfcWindowTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcWindowTypeEnum, 'NOTDEFINED', INDETERMINATE) +window = IfcWindowTypeEnum.WINDOW +skylight = IfcWindowTypeEnum.SKYLIGHT +lightdome = IfcWindowTypeEnum.LIGHTDOME +userdefined = IfcWindowTypeEnum.USERDEFINED +notdefined = IfcWindowTypeEnum.NOTDEFINED IfcWindowTypePartitioningEnum = enum_namespace() -single_panel = express_getattr(IfcWindowTypePartitioningEnum, 'SINGLE_PANEL', INDETERMINATE) -double_panel_vertical = express_getattr(IfcWindowTypePartitioningEnum, 'DOUBLE_PANEL_VERTICAL', INDETERMINATE) -double_panel_horizontal = express_getattr(IfcWindowTypePartitioningEnum, 'DOUBLE_PANEL_HORIZONTAL', INDETERMINATE) -triple_panel_vertical = express_getattr(IfcWindowTypePartitioningEnum, 'TRIPLE_PANEL_VERTICAL', INDETERMINATE) -triple_panel_bottom = express_getattr(IfcWindowTypePartitioningEnum, 'TRIPLE_PANEL_BOTTOM', INDETERMINATE) -triple_panel_top = express_getattr(IfcWindowTypePartitioningEnum, 'TRIPLE_PANEL_TOP', INDETERMINATE) -triple_panel_left = express_getattr(IfcWindowTypePartitioningEnum, 'TRIPLE_PANEL_LEFT', INDETERMINATE) -triple_panel_right = express_getattr(IfcWindowTypePartitioningEnum, 'TRIPLE_PANEL_RIGHT', INDETERMINATE) -triple_panel_horizontal = express_getattr(IfcWindowTypePartitioningEnum, 'TRIPLE_PANEL_HORIZONTAL', INDETERMINATE) -userdefined = express_getattr(IfcWindowTypePartitioningEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcWindowTypePartitioningEnum, 'NOTDEFINED', INDETERMINATE) +single_panel = IfcWindowTypePartitioningEnum.SINGLE_PANEL +double_panel_vertical = IfcWindowTypePartitioningEnum.DOUBLE_PANEL_VERTICAL +double_panel_horizontal = IfcWindowTypePartitioningEnum.DOUBLE_PANEL_HORIZONTAL +triple_panel_vertical = IfcWindowTypePartitioningEnum.TRIPLE_PANEL_VERTICAL +triple_panel_bottom = IfcWindowTypePartitioningEnum.TRIPLE_PANEL_BOTTOM +triple_panel_top = IfcWindowTypePartitioningEnum.TRIPLE_PANEL_TOP +triple_panel_left = IfcWindowTypePartitioningEnum.TRIPLE_PANEL_LEFT +triple_panel_right = IfcWindowTypePartitioningEnum.TRIPLE_PANEL_RIGHT +triple_panel_horizontal = IfcWindowTypePartitioningEnum.TRIPLE_PANEL_HORIZONTAL +userdefined = IfcWindowTypePartitioningEnum.USERDEFINED +notdefined = IfcWindowTypePartitioningEnum.NOTDEFINED IfcWorkCalendarTypeEnum = enum_namespace() -firstshift = express_getattr(IfcWorkCalendarTypeEnum, 'FIRSTSHIFT', INDETERMINATE) -secondshift = express_getattr(IfcWorkCalendarTypeEnum, 'SECONDSHIFT', INDETERMINATE) -thirdshift = express_getattr(IfcWorkCalendarTypeEnum, 'THIRDSHIFT', INDETERMINATE) -userdefined = express_getattr(IfcWorkCalendarTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcWorkCalendarTypeEnum, 'NOTDEFINED', INDETERMINATE) +firstshift = IfcWorkCalendarTypeEnum.FIRSTSHIFT +secondshift = IfcWorkCalendarTypeEnum.SECONDSHIFT +thirdshift = IfcWorkCalendarTypeEnum.THIRDSHIFT +userdefined = IfcWorkCalendarTypeEnum.USERDEFINED +notdefined = IfcWorkCalendarTypeEnum.NOTDEFINED IfcWorkPlanTypeEnum = enum_namespace() -actual = express_getattr(IfcWorkPlanTypeEnum, 'ACTUAL', INDETERMINATE) -baseline = express_getattr(IfcWorkPlanTypeEnum, 'BASELINE', INDETERMINATE) -planned = express_getattr(IfcWorkPlanTypeEnum, 'PLANNED', INDETERMINATE) -userdefined = express_getattr(IfcWorkPlanTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcWorkPlanTypeEnum, 'NOTDEFINED', INDETERMINATE) +actual = IfcWorkPlanTypeEnum.ACTUAL +baseline = IfcWorkPlanTypeEnum.BASELINE +planned = IfcWorkPlanTypeEnum.PLANNED +userdefined = IfcWorkPlanTypeEnum.USERDEFINED +notdefined = IfcWorkPlanTypeEnum.NOTDEFINED IfcWorkScheduleTypeEnum = enum_namespace() -actual = express_getattr(IfcWorkScheduleTypeEnum, 'ACTUAL', INDETERMINATE) -baseline = express_getattr(IfcWorkScheduleTypeEnum, 'BASELINE', INDETERMINATE) -planned = express_getattr(IfcWorkScheduleTypeEnum, 'PLANNED', INDETERMINATE) -userdefined = express_getattr(IfcWorkScheduleTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcWorkScheduleTypeEnum, 'NOTDEFINED', INDETERMINATE) +actual = IfcWorkScheduleTypeEnum.ACTUAL +baseline = IfcWorkScheduleTypeEnum.BASELINE +planned = IfcWorkScheduleTypeEnum.PLANNED +userdefined = IfcWorkScheduleTypeEnum.USERDEFINED +notdefined = IfcWorkScheduleTypeEnum.NOTDEFINED def IfcActionRequest(*args, **kwargs): return ifcopenshell.create_entity('IfcActionRequest', 'IFC4X2', *args, **kwargs) diff --git a/src/ifcopenshell-python/ifcopenshell/express/rules/IFC4X3.py b/src/ifcopenshell-python/ifcopenshell/express/rules/IFC4X3.py index 9d2f638222e..3e99f58511b 100644 --- a/src/ifcopenshell-python/ifcopenshell/express/rules/IFC4X3.py +++ b/src/ifcopenshell-python/ifcopenshell/express/rules/IFC4X3.py @@ -1,5 +1,8 @@ import ifcopenshell +def is_indeterminate(v): + return v is None or type(v).__name__ == 'indeterminate_type' + def exists(v): if callable(v): try: @@ -7,10 +10,10 @@ def exists(v): except IndexError as e: return False else: - return v is not None + return not is_indeterminate(v) def nvl(v, default): - return v if v is not None else default + return v if not is_indeterminate(v) else default def is_entity(inst): if isinstance(inst, ifcopenshell.entity_instance): @@ -22,13 +25,13 @@ def is_entity(inst): def express_len(v): if isinstance(v, ifcopenshell.entity_instance) and (not is_entity(v)): v = v[0] - elif v is None or v is INDETERMINATE: + elif is_indeterminate(v): return INDETERMINATE return len(v) old_range = range def range(*args): - if INDETERMINATE in args: + if any(map(is_indeterminate, args)): return yield from old_range(*args) sizeof = express_len @@ -149,2423 +152,2423 @@ class enum_namespace: def __getattr__(self, k): return express_getattr(k, 'upper', INDETERMINATE)() IfcActionRequestTypeEnum = enum_namespace() -email = express_getattr(IfcActionRequestTypeEnum, 'EMAIL', INDETERMINATE) -fax = express_getattr(IfcActionRequestTypeEnum, 'FAX', INDETERMINATE) -phone = express_getattr(IfcActionRequestTypeEnum, 'PHONE', INDETERMINATE) -post = express_getattr(IfcActionRequestTypeEnum, 'POST', INDETERMINATE) -verbal = express_getattr(IfcActionRequestTypeEnum, 'VERBAL', INDETERMINATE) -userdefined = express_getattr(IfcActionRequestTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcActionRequestTypeEnum, 'NOTDEFINED', INDETERMINATE) +email = IfcActionRequestTypeEnum.EMAIL +fax = IfcActionRequestTypeEnum.FAX +phone = IfcActionRequestTypeEnum.PHONE +post = IfcActionRequestTypeEnum.POST +verbal = IfcActionRequestTypeEnum.VERBAL +userdefined = IfcActionRequestTypeEnum.USERDEFINED +notdefined = IfcActionRequestTypeEnum.NOTDEFINED IfcActionSourceTypeEnum = enum_namespace() -brakes = express_getattr(IfcActionSourceTypeEnum, 'BRAKES', INDETERMINATE) -buoyancy = express_getattr(IfcActionSourceTypeEnum, 'BUOYANCY', INDETERMINATE) -completion_g1 = express_getattr(IfcActionSourceTypeEnum, 'COMPLETION_G1', INDETERMINATE) -creep = express_getattr(IfcActionSourceTypeEnum, 'CREEP', INDETERMINATE) -current = express_getattr(IfcActionSourceTypeEnum, 'CURRENT', INDETERMINATE) -dead_load_g = express_getattr(IfcActionSourceTypeEnum, 'DEAD_LOAD_G', INDETERMINATE) -earthquake_e = express_getattr(IfcActionSourceTypeEnum, 'EARTHQUAKE_E', INDETERMINATE) -erection = express_getattr(IfcActionSourceTypeEnum, 'ERECTION', INDETERMINATE) -fire = express_getattr(IfcActionSourceTypeEnum, 'FIRE', INDETERMINATE) -ice = express_getattr(IfcActionSourceTypeEnum, 'ICE', INDETERMINATE) -impact = express_getattr(IfcActionSourceTypeEnum, 'IMPACT', INDETERMINATE) -impulse = express_getattr(IfcActionSourceTypeEnum, 'IMPULSE', INDETERMINATE) -lack_of_fit = express_getattr(IfcActionSourceTypeEnum, 'LACK_OF_FIT', INDETERMINATE) -live_load_q = express_getattr(IfcActionSourceTypeEnum, 'LIVE_LOAD_Q', INDETERMINATE) -prestressing_p = express_getattr(IfcActionSourceTypeEnum, 'PRESTRESSING_P', INDETERMINATE) -propping = express_getattr(IfcActionSourceTypeEnum, 'PROPPING', INDETERMINATE) -rain = express_getattr(IfcActionSourceTypeEnum, 'RAIN', INDETERMINATE) -settlement_u = express_getattr(IfcActionSourceTypeEnum, 'SETTLEMENT_U', INDETERMINATE) -shrinkage = express_getattr(IfcActionSourceTypeEnum, 'SHRINKAGE', INDETERMINATE) -snow_s = express_getattr(IfcActionSourceTypeEnum, 'SNOW_S', INDETERMINATE) -system_imperfection = express_getattr(IfcActionSourceTypeEnum, 'SYSTEM_IMPERFECTION', INDETERMINATE) -temperature_t = express_getattr(IfcActionSourceTypeEnum, 'TEMPERATURE_T', INDETERMINATE) -transport = express_getattr(IfcActionSourceTypeEnum, 'TRANSPORT', INDETERMINATE) -wave = express_getattr(IfcActionSourceTypeEnum, 'WAVE', INDETERMINATE) -wind_w = express_getattr(IfcActionSourceTypeEnum, 'WIND_W', INDETERMINATE) -userdefined = express_getattr(IfcActionSourceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcActionSourceTypeEnum, 'NOTDEFINED', INDETERMINATE) +brakes = IfcActionSourceTypeEnum.BRAKES +buoyancy = IfcActionSourceTypeEnum.BUOYANCY +completion_g1 = IfcActionSourceTypeEnum.COMPLETION_G1 +creep = IfcActionSourceTypeEnum.CREEP +current = IfcActionSourceTypeEnum.CURRENT +dead_load_g = IfcActionSourceTypeEnum.DEAD_LOAD_G +earthquake_e = IfcActionSourceTypeEnum.EARTHQUAKE_E +erection = IfcActionSourceTypeEnum.ERECTION +fire = IfcActionSourceTypeEnum.FIRE +ice = IfcActionSourceTypeEnum.ICE +impact = IfcActionSourceTypeEnum.IMPACT +impulse = IfcActionSourceTypeEnum.IMPULSE +lack_of_fit = IfcActionSourceTypeEnum.LACK_OF_FIT +live_load_q = IfcActionSourceTypeEnum.LIVE_LOAD_Q +prestressing_p = IfcActionSourceTypeEnum.PRESTRESSING_P +propping = IfcActionSourceTypeEnum.PROPPING +rain = IfcActionSourceTypeEnum.RAIN +settlement_u = IfcActionSourceTypeEnum.SETTLEMENT_U +shrinkage = IfcActionSourceTypeEnum.SHRINKAGE +snow_s = IfcActionSourceTypeEnum.SNOW_S +system_imperfection = IfcActionSourceTypeEnum.SYSTEM_IMPERFECTION +temperature_t = IfcActionSourceTypeEnum.TEMPERATURE_T +transport = IfcActionSourceTypeEnum.TRANSPORT +wave = IfcActionSourceTypeEnum.WAVE +wind_w = IfcActionSourceTypeEnum.WIND_W +userdefined = IfcActionSourceTypeEnum.USERDEFINED +notdefined = IfcActionSourceTypeEnum.NOTDEFINED IfcActionTypeEnum = enum_namespace() -extraordinary_a = express_getattr(IfcActionTypeEnum, 'EXTRAORDINARY_A', INDETERMINATE) -permanent_g = express_getattr(IfcActionTypeEnum, 'PERMANENT_G', INDETERMINATE) -variable_q = express_getattr(IfcActionTypeEnum, 'VARIABLE_Q', INDETERMINATE) -userdefined = express_getattr(IfcActionTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcActionTypeEnum, 'NOTDEFINED', INDETERMINATE) +extraordinary_a = IfcActionTypeEnum.EXTRAORDINARY_A +permanent_g = IfcActionTypeEnum.PERMANENT_G +variable_q = IfcActionTypeEnum.VARIABLE_Q +userdefined = IfcActionTypeEnum.USERDEFINED +notdefined = IfcActionTypeEnum.NOTDEFINED IfcActuatorTypeEnum = enum_namespace() -electricactuator = express_getattr(IfcActuatorTypeEnum, 'ELECTRICACTUATOR', INDETERMINATE) -handoperatedactuator = express_getattr(IfcActuatorTypeEnum, 'HANDOPERATEDACTUATOR', INDETERMINATE) -hydraulicactuator = express_getattr(IfcActuatorTypeEnum, 'HYDRAULICACTUATOR', INDETERMINATE) -pneumaticactuator = express_getattr(IfcActuatorTypeEnum, 'PNEUMATICACTUATOR', INDETERMINATE) -thermostaticactuator = express_getattr(IfcActuatorTypeEnum, 'THERMOSTATICACTUATOR', INDETERMINATE) -userdefined = express_getattr(IfcActuatorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcActuatorTypeEnum, 'NOTDEFINED', INDETERMINATE) +electricactuator = IfcActuatorTypeEnum.ELECTRICACTUATOR +handoperatedactuator = IfcActuatorTypeEnum.HANDOPERATEDACTUATOR +hydraulicactuator = IfcActuatorTypeEnum.HYDRAULICACTUATOR +pneumaticactuator = IfcActuatorTypeEnum.PNEUMATICACTUATOR +thermostaticactuator = IfcActuatorTypeEnum.THERMOSTATICACTUATOR +userdefined = IfcActuatorTypeEnum.USERDEFINED +notdefined = IfcActuatorTypeEnum.NOTDEFINED IfcAddressTypeEnum = enum_namespace() -distributionpoint = express_getattr(IfcAddressTypeEnum, 'DISTRIBUTIONPOINT', INDETERMINATE) -home = express_getattr(IfcAddressTypeEnum, 'HOME', INDETERMINATE) -office = express_getattr(IfcAddressTypeEnum, 'OFFICE', INDETERMINATE) -site = express_getattr(IfcAddressTypeEnum, 'SITE', INDETERMINATE) -userdefined = express_getattr(IfcAddressTypeEnum, 'USERDEFINED', INDETERMINATE) +distributionpoint = IfcAddressTypeEnum.DISTRIBUTIONPOINT +home = IfcAddressTypeEnum.HOME +office = IfcAddressTypeEnum.OFFICE +site = IfcAddressTypeEnum.SITE +userdefined = IfcAddressTypeEnum.USERDEFINED IfcAirTerminalBoxTypeEnum = enum_namespace() -constantflow = express_getattr(IfcAirTerminalBoxTypeEnum, 'CONSTANTFLOW', INDETERMINATE) -variableflowpressuredependant = express_getattr(IfcAirTerminalBoxTypeEnum, 'VARIABLEFLOWPRESSUREDEPENDANT', INDETERMINATE) -variableflowpressureindependant = express_getattr(IfcAirTerminalBoxTypeEnum, 'VARIABLEFLOWPRESSUREINDEPENDANT', INDETERMINATE) -userdefined = express_getattr(IfcAirTerminalBoxTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAirTerminalBoxTypeEnum, 'NOTDEFINED', INDETERMINATE) +constantflow = IfcAirTerminalBoxTypeEnum.CONSTANTFLOW +variableflowpressuredependant = IfcAirTerminalBoxTypeEnum.VARIABLEFLOWPRESSUREDEPENDANT +variableflowpressureindependant = IfcAirTerminalBoxTypeEnum.VARIABLEFLOWPRESSUREINDEPENDANT +userdefined = IfcAirTerminalBoxTypeEnum.USERDEFINED +notdefined = IfcAirTerminalBoxTypeEnum.NOTDEFINED IfcAirTerminalTypeEnum = enum_namespace() -diffuser = express_getattr(IfcAirTerminalTypeEnum, 'DIFFUSER', INDETERMINATE) -grille = express_getattr(IfcAirTerminalTypeEnum, 'GRILLE', INDETERMINATE) -louvre = express_getattr(IfcAirTerminalTypeEnum, 'LOUVRE', INDETERMINATE) -register = express_getattr(IfcAirTerminalTypeEnum, 'REGISTER', INDETERMINATE) -userdefined = express_getattr(IfcAirTerminalTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAirTerminalTypeEnum, 'NOTDEFINED', INDETERMINATE) +diffuser = IfcAirTerminalTypeEnum.DIFFUSER +grille = IfcAirTerminalTypeEnum.GRILLE +louvre = IfcAirTerminalTypeEnum.LOUVRE +register = IfcAirTerminalTypeEnum.REGISTER +userdefined = IfcAirTerminalTypeEnum.USERDEFINED +notdefined = IfcAirTerminalTypeEnum.NOTDEFINED IfcAirToAirHeatRecoveryTypeEnum = enum_namespace() -fixedplatecounterflowexchanger = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'FIXEDPLATECOUNTERFLOWEXCHANGER', INDETERMINATE) -fixedplatecrossflowexchanger = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'FIXEDPLATECROSSFLOWEXCHANGER', INDETERMINATE) -fixedplateparallelflowexchanger = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'FIXEDPLATEPARALLELFLOWEXCHANGER', INDETERMINATE) -heatpipe = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'HEATPIPE', INDETERMINATE) -rotarywheel = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'ROTARYWHEEL', INDETERMINATE) -runaroundcoilloop = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'RUNAROUNDCOILLOOP', INDETERMINATE) -thermosiphoncoiltypeheatexchangers = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'THERMOSIPHONCOILTYPEHEATEXCHANGERS', INDETERMINATE) -thermosiphonsealedtubeheatexchangers = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'THERMOSIPHONSEALEDTUBEHEATEXCHANGERS', INDETERMINATE) -twintowerenthalpyrecoveryloops = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'TWINTOWERENTHALPYRECOVERYLOOPS', INDETERMINATE) -userdefined = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'NOTDEFINED', INDETERMINATE) +fixedplatecounterflowexchanger = IfcAirToAirHeatRecoveryTypeEnum.FIXEDPLATECOUNTERFLOWEXCHANGER +fixedplatecrossflowexchanger = IfcAirToAirHeatRecoveryTypeEnum.FIXEDPLATECROSSFLOWEXCHANGER +fixedplateparallelflowexchanger = IfcAirToAirHeatRecoveryTypeEnum.FIXEDPLATEPARALLELFLOWEXCHANGER +heatpipe = IfcAirToAirHeatRecoveryTypeEnum.HEATPIPE +rotarywheel = IfcAirToAirHeatRecoveryTypeEnum.ROTARYWHEEL +runaroundcoilloop = IfcAirToAirHeatRecoveryTypeEnum.RUNAROUNDCOILLOOP +thermosiphoncoiltypeheatexchangers = IfcAirToAirHeatRecoveryTypeEnum.THERMOSIPHONCOILTYPEHEATEXCHANGERS +thermosiphonsealedtubeheatexchangers = IfcAirToAirHeatRecoveryTypeEnum.THERMOSIPHONSEALEDTUBEHEATEXCHANGERS +twintowerenthalpyrecoveryloops = IfcAirToAirHeatRecoveryTypeEnum.TWINTOWERENTHALPYRECOVERYLOOPS +userdefined = IfcAirToAirHeatRecoveryTypeEnum.USERDEFINED +notdefined = IfcAirToAirHeatRecoveryTypeEnum.NOTDEFINED IfcAlarmTypeEnum = enum_namespace() -bell = express_getattr(IfcAlarmTypeEnum, 'BELL', INDETERMINATE) -breakglassbutton = express_getattr(IfcAlarmTypeEnum, 'BREAKGLASSBUTTON', INDETERMINATE) -light = express_getattr(IfcAlarmTypeEnum, 'LIGHT', INDETERMINATE) -manualpullbox = express_getattr(IfcAlarmTypeEnum, 'MANUALPULLBOX', INDETERMINATE) -railwaycrocodile = express_getattr(IfcAlarmTypeEnum, 'RAILWAYCROCODILE', INDETERMINATE) -railwaydetonator = express_getattr(IfcAlarmTypeEnum, 'RAILWAYDETONATOR', INDETERMINATE) -siren = express_getattr(IfcAlarmTypeEnum, 'SIREN', INDETERMINATE) -whistle = express_getattr(IfcAlarmTypeEnum, 'WHISTLE', INDETERMINATE) -userdefined = express_getattr(IfcAlarmTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAlarmTypeEnum, 'NOTDEFINED', INDETERMINATE) +bell = IfcAlarmTypeEnum.BELL +breakglassbutton = IfcAlarmTypeEnum.BREAKGLASSBUTTON +light = IfcAlarmTypeEnum.LIGHT +manualpullbox = IfcAlarmTypeEnum.MANUALPULLBOX +railwaycrocodile = IfcAlarmTypeEnum.RAILWAYCROCODILE +railwaydetonator = IfcAlarmTypeEnum.RAILWAYDETONATOR +siren = IfcAlarmTypeEnum.SIREN +whistle = IfcAlarmTypeEnum.WHISTLE +userdefined = IfcAlarmTypeEnum.USERDEFINED +notdefined = IfcAlarmTypeEnum.NOTDEFINED IfcAlignmentCantSegmentTypeEnum = enum_namespace() -blosscurve = express_getattr(IfcAlignmentCantSegmentTypeEnum, 'BLOSSCURVE', INDETERMINATE) -constantcant = express_getattr(IfcAlignmentCantSegmentTypeEnum, 'CONSTANTCANT', INDETERMINATE) -cosinecurve = express_getattr(IfcAlignmentCantSegmentTypeEnum, 'COSINECURVE', INDETERMINATE) -helmertcurve = express_getattr(IfcAlignmentCantSegmentTypeEnum, 'HELMERTCURVE', INDETERMINATE) -lineartransition = express_getattr(IfcAlignmentCantSegmentTypeEnum, 'LINEARTRANSITION', INDETERMINATE) -sinecurve = express_getattr(IfcAlignmentCantSegmentTypeEnum, 'SINECURVE', INDETERMINATE) -viennesebend = express_getattr(IfcAlignmentCantSegmentTypeEnum, 'VIENNESEBEND', INDETERMINATE) +blosscurve = IfcAlignmentCantSegmentTypeEnum.BLOSSCURVE +constantcant = IfcAlignmentCantSegmentTypeEnum.CONSTANTCANT +cosinecurve = IfcAlignmentCantSegmentTypeEnum.COSINECURVE +helmertcurve = IfcAlignmentCantSegmentTypeEnum.HELMERTCURVE +lineartransition = IfcAlignmentCantSegmentTypeEnum.LINEARTRANSITION +sinecurve = IfcAlignmentCantSegmentTypeEnum.SINECURVE +viennesebend = IfcAlignmentCantSegmentTypeEnum.VIENNESEBEND IfcAlignmentHorizontalSegmentTypeEnum = enum_namespace() -blosscurve = express_getattr(IfcAlignmentHorizontalSegmentTypeEnum, 'BLOSSCURVE', INDETERMINATE) -circulararc = express_getattr(IfcAlignmentHorizontalSegmentTypeEnum, 'CIRCULARARC', INDETERMINATE) -clothoid = express_getattr(IfcAlignmentHorizontalSegmentTypeEnum, 'CLOTHOID', INDETERMINATE) -cosinecurve = express_getattr(IfcAlignmentHorizontalSegmentTypeEnum, 'COSINECURVE', INDETERMINATE) -cubic = express_getattr(IfcAlignmentHorizontalSegmentTypeEnum, 'CUBIC', INDETERMINATE) -helmertcurve = express_getattr(IfcAlignmentHorizontalSegmentTypeEnum, 'HELMERTCURVE', INDETERMINATE) -line = express_getattr(IfcAlignmentHorizontalSegmentTypeEnum, 'LINE', INDETERMINATE) -sinecurve = express_getattr(IfcAlignmentHorizontalSegmentTypeEnum, 'SINECURVE', INDETERMINATE) -viennesebend = express_getattr(IfcAlignmentHorizontalSegmentTypeEnum, 'VIENNESEBEND', INDETERMINATE) +blosscurve = IfcAlignmentHorizontalSegmentTypeEnum.BLOSSCURVE +circulararc = IfcAlignmentHorizontalSegmentTypeEnum.CIRCULARARC +clothoid = IfcAlignmentHorizontalSegmentTypeEnum.CLOTHOID +cosinecurve = IfcAlignmentHorizontalSegmentTypeEnum.COSINECURVE +cubic = IfcAlignmentHorizontalSegmentTypeEnum.CUBIC +helmertcurve = IfcAlignmentHorizontalSegmentTypeEnum.HELMERTCURVE +line = IfcAlignmentHorizontalSegmentTypeEnum.LINE +sinecurve = IfcAlignmentHorizontalSegmentTypeEnum.SINECURVE +viennesebend = IfcAlignmentHorizontalSegmentTypeEnum.VIENNESEBEND IfcAlignmentTypeEnum = enum_namespace() -userdefined = express_getattr(IfcAlignmentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAlignmentTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcAlignmentTypeEnum.USERDEFINED +notdefined = IfcAlignmentTypeEnum.NOTDEFINED IfcAlignmentVerticalSegmentTypeEnum = enum_namespace() -circulararc = express_getattr(IfcAlignmentVerticalSegmentTypeEnum, 'CIRCULARARC', INDETERMINATE) -clothoid = express_getattr(IfcAlignmentVerticalSegmentTypeEnum, 'CLOTHOID', INDETERMINATE) -constantgradient = express_getattr(IfcAlignmentVerticalSegmentTypeEnum, 'CONSTANTGRADIENT', INDETERMINATE) -parabolicarc = express_getattr(IfcAlignmentVerticalSegmentTypeEnum, 'PARABOLICARC', INDETERMINATE) +circulararc = IfcAlignmentVerticalSegmentTypeEnum.CIRCULARARC +clothoid = IfcAlignmentVerticalSegmentTypeEnum.CLOTHOID +constantgradient = IfcAlignmentVerticalSegmentTypeEnum.CONSTANTGRADIENT +parabolicarc = IfcAlignmentVerticalSegmentTypeEnum.PARABOLICARC IfcAnalysisModelTypeEnum = enum_namespace() -in_plane_loading_2d = express_getattr(IfcAnalysisModelTypeEnum, 'IN_PLANE_LOADING_2D', INDETERMINATE) -loading_3d = express_getattr(IfcAnalysisModelTypeEnum, 'LOADING_3D', INDETERMINATE) -out_plane_loading_2d = express_getattr(IfcAnalysisModelTypeEnum, 'OUT_PLANE_LOADING_2D', INDETERMINATE) -userdefined = express_getattr(IfcAnalysisModelTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAnalysisModelTypeEnum, 'NOTDEFINED', INDETERMINATE) +in_plane_loading_2d = IfcAnalysisModelTypeEnum.IN_PLANE_LOADING_2D +loading_3d = IfcAnalysisModelTypeEnum.LOADING_3D +out_plane_loading_2d = IfcAnalysisModelTypeEnum.OUT_PLANE_LOADING_2D +userdefined = IfcAnalysisModelTypeEnum.USERDEFINED +notdefined = IfcAnalysisModelTypeEnum.NOTDEFINED IfcAnalysisTheoryTypeEnum = enum_namespace() -first_order_theory = express_getattr(IfcAnalysisTheoryTypeEnum, 'FIRST_ORDER_THEORY', INDETERMINATE) -full_nonlinear_theory = express_getattr(IfcAnalysisTheoryTypeEnum, 'FULL_NONLINEAR_THEORY', INDETERMINATE) -second_order_theory = express_getattr(IfcAnalysisTheoryTypeEnum, 'SECOND_ORDER_THEORY', INDETERMINATE) -third_order_theory = express_getattr(IfcAnalysisTheoryTypeEnum, 'THIRD_ORDER_THEORY', INDETERMINATE) -userdefined = express_getattr(IfcAnalysisTheoryTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAnalysisTheoryTypeEnum, 'NOTDEFINED', INDETERMINATE) +first_order_theory = IfcAnalysisTheoryTypeEnum.FIRST_ORDER_THEORY +full_nonlinear_theory = IfcAnalysisTheoryTypeEnum.FULL_NONLINEAR_THEORY +second_order_theory = IfcAnalysisTheoryTypeEnum.SECOND_ORDER_THEORY +third_order_theory = IfcAnalysisTheoryTypeEnum.THIRD_ORDER_THEORY +userdefined = IfcAnalysisTheoryTypeEnum.USERDEFINED +notdefined = IfcAnalysisTheoryTypeEnum.NOTDEFINED IfcAnnotationTypeEnum = enum_namespace() -asbuiltarea = express_getattr(IfcAnnotationTypeEnum, 'ASBUILTAREA', INDETERMINATE) -asbuiltline = express_getattr(IfcAnnotationTypeEnum, 'ASBUILTLINE', INDETERMINATE) -asbuiltpoint = express_getattr(IfcAnnotationTypeEnum, 'ASBUILTPOINT', INDETERMINATE) -assumedarea = express_getattr(IfcAnnotationTypeEnum, 'ASSUMEDAREA', INDETERMINATE) -assumedline = express_getattr(IfcAnnotationTypeEnum, 'ASSUMEDLINE', INDETERMINATE) -assumedpoint = express_getattr(IfcAnnotationTypeEnum, 'ASSUMEDPOINT', INDETERMINATE) -non_physical_signal = express_getattr(IfcAnnotationTypeEnum, 'NON_PHYSICAL_SIGNAL', INDETERMINATE) -superelevationevent = express_getattr(IfcAnnotationTypeEnum, 'SUPERELEVATIONEVENT', INDETERMINATE) -widthevent = express_getattr(IfcAnnotationTypeEnum, 'WIDTHEVENT', INDETERMINATE) -userdefined = express_getattr(IfcAnnotationTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAnnotationTypeEnum, 'NOTDEFINED', INDETERMINATE) +asbuiltarea = IfcAnnotationTypeEnum.ASBUILTAREA +asbuiltline = IfcAnnotationTypeEnum.ASBUILTLINE +asbuiltpoint = IfcAnnotationTypeEnum.ASBUILTPOINT +assumedarea = IfcAnnotationTypeEnum.ASSUMEDAREA +assumedline = IfcAnnotationTypeEnum.ASSUMEDLINE +assumedpoint = IfcAnnotationTypeEnum.ASSUMEDPOINT +non_physical_signal = IfcAnnotationTypeEnum.NON_PHYSICAL_SIGNAL +superelevationevent = IfcAnnotationTypeEnum.SUPERELEVATIONEVENT +widthevent = IfcAnnotationTypeEnum.WIDTHEVENT +userdefined = IfcAnnotationTypeEnum.USERDEFINED +notdefined = IfcAnnotationTypeEnum.NOTDEFINED IfcArithmeticOperatorEnum = enum_namespace() -add = express_getattr(IfcArithmeticOperatorEnum, 'ADD', INDETERMINATE) -divide = express_getattr(IfcArithmeticOperatorEnum, 'DIVIDE', INDETERMINATE) -multiply = express_getattr(IfcArithmeticOperatorEnum, 'MULTIPLY', INDETERMINATE) -subtract = express_getattr(IfcArithmeticOperatorEnum, 'SUBTRACT', INDETERMINATE) +add = IfcArithmeticOperatorEnum.ADD +divide = IfcArithmeticOperatorEnum.DIVIDE +multiply = IfcArithmeticOperatorEnum.MULTIPLY +subtract = IfcArithmeticOperatorEnum.SUBTRACT IfcAssemblyPlaceEnum = enum_namespace() -factory = express_getattr(IfcAssemblyPlaceEnum, 'FACTORY', INDETERMINATE) -site = express_getattr(IfcAssemblyPlaceEnum, 'SITE', INDETERMINATE) -notdefined = express_getattr(IfcAssemblyPlaceEnum, 'NOTDEFINED', INDETERMINATE) +factory = IfcAssemblyPlaceEnum.FACTORY +site = IfcAssemblyPlaceEnum.SITE +notdefined = IfcAssemblyPlaceEnum.NOTDEFINED IfcAudioVisualApplianceTypeEnum = enum_namespace() -amplifier = express_getattr(IfcAudioVisualApplianceTypeEnum, 'AMPLIFIER', INDETERMINATE) -camera = express_getattr(IfcAudioVisualApplianceTypeEnum, 'CAMERA', INDETERMINATE) -communicationterminal = express_getattr(IfcAudioVisualApplianceTypeEnum, 'COMMUNICATIONTERMINAL', INDETERMINATE) -display = express_getattr(IfcAudioVisualApplianceTypeEnum, 'DISPLAY', INDETERMINATE) -microphone = express_getattr(IfcAudioVisualApplianceTypeEnum, 'MICROPHONE', INDETERMINATE) -player = express_getattr(IfcAudioVisualApplianceTypeEnum, 'PLAYER', INDETERMINATE) -projector = express_getattr(IfcAudioVisualApplianceTypeEnum, 'PROJECTOR', INDETERMINATE) -receiver = express_getattr(IfcAudioVisualApplianceTypeEnum, 'RECEIVER', INDETERMINATE) -recordingequipment = express_getattr(IfcAudioVisualApplianceTypeEnum, 'RECORDINGEQUIPMENT', INDETERMINATE) -speaker = express_getattr(IfcAudioVisualApplianceTypeEnum, 'SPEAKER', INDETERMINATE) -switcher = express_getattr(IfcAudioVisualApplianceTypeEnum, 'SWITCHER', INDETERMINATE) -telephone = express_getattr(IfcAudioVisualApplianceTypeEnum, 'TELEPHONE', INDETERMINATE) -tuner = express_getattr(IfcAudioVisualApplianceTypeEnum, 'TUNER', INDETERMINATE) -userdefined = express_getattr(IfcAudioVisualApplianceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAudioVisualApplianceTypeEnum, 'NOTDEFINED', INDETERMINATE) +amplifier = IfcAudioVisualApplianceTypeEnum.AMPLIFIER +camera = IfcAudioVisualApplianceTypeEnum.CAMERA +communicationterminal = IfcAudioVisualApplianceTypeEnum.COMMUNICATIONTERMINAL +display = IfcAudioVisualApplianceTypeEnum.DISPLAY +microphone = IfcAudioVisualApplianceTypeEnum.MICROPHONE +player = IfcAudioVisualApplianceTypeEnum.PLAYER +projector = IfcAudioVisualApplianceTypeEnum.PROJECTOR +receiver = IfcAudioVisualApplianceTypeEnum.RECEIVER +recordingequipment = IfcAudioVisualApplianceTypeEnum.RECORDINGEQUIPMENT +speaker = IfcAudioVisualApplianceTypeEnum.SPEAKER +switcher = IfcAudioVisualApplianceTypeEnum.SWITCHER +telephone = IfcAudioVisualApplianceTypeEnum.TELEPHONE +tuner = IfcAudioVisualApplianceTypeEnum.TUNER +userdefined = IfcAudioVisualApplianceTypeEnum.USERDEFINED +notdefined = IfcAudioVisualApplianceTypeEnum.NOTDEFINED IfcBSplineCurveForm = enum_namespace() -circular_arc = express_getattr(IfcBSplineCurveForm, 'CIRCULAR_ARC', INDETERMINATE) -elliptic_arc = express_getattr(IfcBSplineCurveForm, 'ELLIPTIC_ARC', INDETERMINATE) -hyperbolic_arc = express_getattr(IfcBSplineCurveForm, 'HYPERBOLIC_ARC', INDETERMINATE) -parabolic_arc = express_getattr(IfcBSplineCurveForm, 'PARABOLIC_ARC', INDETERMINATE) -polyline_form = express_getattr(IfcBSplineCurveForm, 'POLYLINE_FORM', INDETERMINATE) -unspecified = express_getattr(IfcBSplineCurveForm, 'UNSPECIFIED', INDETERMINATE) +circular_arc = IfcBSplineCurveForm.CIRCULAR_ARC +elliptic_arc = IfcBSplineCurveForm.ELLIPTIC_ARC +hyperbolic_arc = IfcBSplineCurveForm.HYPERBOLIC_ARC +parabolic_arc = IfcBSplineCurveForm.PARABOLIC_ARC +polyline_form = IfcBSplineCurveForm.POLYLINE_FORM +unspecified = IfcBSplineCurveForm.UNSPECIFIED IfcBSplineSurfaceForm = enum_namespace() -conical_surf = express_getattr(IfcBSplineSurfaceForm, 'CONICAL_SURF', INDETERMINATE) -cylindrical_surf = express_getattr(IfcBSplineSurfaceForm, 'CYLINDRICAL_SURF', INDETERMINATE) -generalised_cone = express_getattr(IfcBSplineSurfaceForm, 'GENERALISED_CONE', INDETERMINATE) -plane_surf = express_getattr(IfcBSplineSurfaceForm, 'PLANE_SURF', INDETERMINATE) -quadric_surf = express_getattr(IfcBSplineSurfaceForm, 'QUADRIC_SURF', INDETERMINATE) -ruled_surf = express_getattr(IfcBSplineSurfaceForm, 'RULED_SURF', INDETERMINATE) -spherical_surf = express_getattr(IfcBSplineSurfaceForm, 'SPHERICAL_SURF', INDETERMINATE) -surf_of_linear_extrusion = express_getattr(IfcBSplineSurfaceForm, 'SURF_OF_LINEAR_EXTRUSION', INDETERMINATE) -surf_of_revolution = express_getattr(IfcBSplineSurfaceForm, 'SURF_OF_REVOLUTION', INDETERMINATE) -toroidal_surf = express_getattr(IfcBSplineSurfaceForm, 'TOROIDAL_SURF', INDETERMINATE) -unspecified = express_getattr(IfcBSplineSurfaceForm, 'UNSPECIFIED', INDETERMINATE) +conical_surf = IfcBSplineSurfaceForm.CONICAL_SURF +cylindrical_surf = IfcBSplineSurfaceForm.CYLINDRICAL_SURF +generalised_cone = IfcBSplineSurfaceForm.GENERALISED_CONE +plane_surf = IfcBSplineSurfaceForm.PLANE_SURF +quadric_surf = IfcBSplineSurfaceForm.QUADRIC_SURF +ruled_surf = IfcBSplineSurfaceForm.RULED_SURF +spherical_surf = IfcBSplineSurfaceForm.SPHERICAL_SURF +surf_of_linear_extrusion = IfcBSplineSurfaceForm.SURF_OF_LINEAR_EXTRUSION +surf_of_revolution = IfcBSplineSurfaceForm.SURF_OF_REVOLUTION +toroidal_surf = IfcBSplineSurfaceForm.TOROIDAL_SURF +unspecified = IfcBSplineSurfaceForm.UNSPECIFIED IfcBeamTypeEnum = enum_namespace() -beam = express_getattr(IfcBeamTypeEnum, 'BEAM', INDETERMINATE) -cornice = express_getattr(IfcBeamTypeEnum, 'CORNICE', INDETERMINATE) -diaphragm = express_getattr(IfcBeamTypeEnum, 'DIAPHRAGM', INDETERMINATE) -edgebeam = express_getattr(IfcBeamTypeEnum, 'EDGEBEAM', INDETERMINATE) -girder_segment = express_getattr(IfcBeamTypeEnum, 'GIRDER_SEGMENT', INDETERMINATE) -hatstone = express_getattr(IfcBeamTypeEnum, 'HATSTONE', INDETERMINATE) -hollowcore = express_getattr(IfcBeamTypeEnum, 'HOLLOWCORE', INDETERMINATE) -joist = express_getattr(IfcBeamTypeEnum, 'JOIST', INDETERMINATE) -lintel = express_getattr(IfcBeamTypeEnum, 'LINTEL', INDETERMINATE) -piercap = express_getattr(IfcBeamTypeEnum, 'PIERCAP', INDETERMINATE) -spandrel = express_getattr(IfcBeamTypeEnum, 'SPANDREL', INDETERMINATE) -t_beam = express_getattr(IfcBeamTypeEnum, 'T_BEAM', INDETERMINATE) -userdefined = express_getattr(IfcBeamTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBeamTypeEnum, 'NOTDEFINED', INDETERMINATE) +beam = IfcBeamTypeEnum.BEAM +cornice = IfcBeamTypeEnum.CORNICE +diaphragm = IfcBeamTypeEnum.DIAPHRAGM +edgebeam = IfcBeamTypeEnum.EDGEBEAM +girder_segment = IfcBeamTypeEnum.GIRDER_SEGMENT +hatstone = IfcBeamTypeEnum.HATSTONE +hollowcore = IfcBeamTypeEnum.HOLLOWCORE +joist = IfcBeamTypeEnum.JOIST +lintel = IfcBeamTypeEnum.LINTEL +piercap = IfcBeamTypeEnum.PIERCAP +spandrel = IfcBeamTypeEnum.SPANDREL +t_beam = IfcBeamTypeEnum.T_BEAM +userdefined = IfcBeamTypeEnum.USERDEFINED +notdefined = IfcBeamTypeEnum.NOTDEFINED IfcBearingTypeDisplacementEnum = enum_namespace() -fixed_movement = express_getattr(IfcBearingTypeDisplacementEnum, 'FIXED_MOVEMENT', INDETERMINATE) -free_movement = express_getattr(IfcBearingTypeDisplacementEnum, 'FREE_MOVEMENT', INDETERMINATE) -guided_longitudinal = express_getattr(IfcBearingTypeDisplacementEnum, 'GUIDED_LONGITUDINAL', INDETERMINATE) -guided_transversal = express_getattr(IfcBearingTypeDisplacementEnum, 'GUIDED_TRANSVERSAL', INDETERMINATE) -notdefined = express_getattr(IfcBearingTypeDisplacementEnum, 'NOTDEFINED', INDETERMINATE) +fixed_movement = IfcBearingTypeDisplacementEnum.FIXED_MOVEMENT +free_movement = IfcBearingTypeDisplacementEnum.FREE_MOVEMENT +guided_longitudinal = IfcBearingTypeDisplacementEnum.GUIDED_LONGITUDINAL +guided_transversal = IfcBearingTypeDisplacementEnum.GUIDED_TRANSVERSAL +notdefined = IfcBearingTypeDisplacementEnum.NOTDEFINED IfcBearingTypeEnum = enum_namespace() -cylindrical = express_getattr(IfcBearingTypeEnum, 'CYLINDRICAL', INDETERMINATE) -disk = express_getattr(IfcBearingTypeEnum, 'DISK', INDETERMINATE) -elastomeric = express_getattr(IfcBearingTypeEnum, 'ELASTOMERIC', INDETERMINATE) -guide = express_getattr(IfcBearingTypeEnum, 'GUIDE', INDETERMINATE) -pot = express_getattr(IfcBearingTypeEnum, 'POT', INDETERMINATE) -rocker = express_getattr(IfcBearingTypeEnum, 'ROCKER', INDETERMINATE) -roller = express_getattr(IfcBearingTypeEnum, 'ROLLER', INDETERMINATE) -spherical = express_getattr(IfcBearingTypeEnum, 'SPHERICAL', INDETERMINATE) -userdefined = express_getattr(IfcBearingTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBearingTypeEnum, 'NOTDEFINED', INDETERMINATE) +cylindrical = IfcBearingTypeEnum.CYLINDRICAL +disk = IfcBearingTypeEnum.DISK +elastomeric = IfcBearingTypeEnum.ELASTOMERIC +guide = IfcBearingTypeEnum.GUIDE +pot = IfcBearingTypeEnum.POT +rocker = IfcBearingTypeEnum.ROCKER +roller = IfcBearingTypeEnum.ROLLER +spherical = IfcBearingTypeEnum.SPHERICAL +userdefined = IfcBearingTypeEnum.USERDEFINED +notdefined = IfcBearingTypeEnum.NOTDEFINED IfcBenchmarkEnum = enum_namespace() -equalto = express_getattr(IfcBenchmarkEnum, 'EQUALTO', INDETERMINATE) -greaterthan = express_getattr(IfcBenchmarkEnum, 'GREATERTHAN', INDETERMINATE) -greaterthanorequalto = express_getattr(IfcBenchmarkEnum, 'GREATERTHANOREQUALTO', INDETERMINATE) -includedin = express_getattr(IfcBenchmarkEnum, 'INCLUDEDIN', INDETERMINATE) -includes = express_getattr(IfcBenchmarkEnum, 'INCLUDES', INDETERMINATE) -lessthan = express_getattr(IfcBenchmarkEnum, 'LESSTHAN', INDETERMINATE) -lessthanorequalto = express_getattr(IfcBenchmarkEnum, 'LESSTHANOREQUALTO', INDETERMINATE) -notequalto = express_getattr(IfcBenchmarkEnum, 'NOTEQUALTO', INDETERMINATE) -notincludedin = express_getattr(IfcBenchmarkEnum, 'NOTINCLUDEDIN', INDETERMINATE) -notincludes = express_getattr(IfcBenchmarkEnum, 'NOTINCLUDES', INDETERMINATE) +equalto = IfcBenchmarkEnum.EQUALTO +greaterthan = IfcBenchmarkEnum.GREATERTHAN +greaterthanorequalto = IfcBenchmarkEnum.GREATERTHANOREQUALTO +includedin = IfcBenchmarkEnum.INCLUDEDIN +includes = IfcBenchmarkEnum.INCLUDES +lessthan = IfcBenchmarkEnum.LESSTHAN +lessthanorequalto = IfcBenchmarkEnum.LESSTHANOREQUALTO +notequalto = IfcBenchmarkEnum.NOTEQUALTO +notincludedin = IfcBenchmarkEnum.NOTINCLUDEDIN +notincludes = IfcBenchmarkEnum.NOTINCLUDES IfcBoilerTypeEnum = enum_namespace() -steam = express_getattr(IfcBoilerTypeEnum, 'STEAM', INDETERMINATE) -water = express_getattr(IfcBoilerTypeEnum, 'WATER', INDETERMINATE) -userdefined = express_getattr(IfcBoilerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBoilerTypeEnum, 'NOTDEFINED', INDETERMINATE) +steam = IfcBoilerTypeEnum.STEAM +water = IfcBoilerTypeEnum.WATER +userdefined = IfcBoilerTypeEnum.USERDEFINED +notdefined = IfcBoilerTypeEnum.NOTDEFINED IfcBooleanOperator = enum_namespace() -difference = express_getattr(IfcBooleanOperator, 'DIFFERENCE', INDETERMINATE) -intersection = express_getattr(IfcBooleanOperator, 'INTERSECTION', INDETERMINATE) -union = express_getattr(IfcBooleanOperator, 'UNION', INDETERMINATE) +difference = IfcBooleanOperator.DIFFERENCE +intersection = IfcBooleanOperator.INTERSECTION +union = IfcBooleanOperator.UNION IfcBridgePartTypeEnum = enum_namespace() -abutment = express_getattr(IfcBridgePartTypeEnum, 'ABUTMENT', INDETERMINATE) -deck = express_getattr(IfcBridgePartTypeEnum, 'DECK', INDETERMINATE) -deck_segment = express_getattr(IfcBridgePartTypeEnum, 'DECK_SEGMENT', INDETERMINATE) -foundation = express_getattr(IfcBridgePartTypeEnum, 'FOUNDATION', INDETERMINATE) -pier = express_getattr(IfcBridgePartTypeEnum, 'PIER', INDETERMINATE) -pier_segment = express_getattr(IfcBridgePartTypeEnum, 'PIER_SEGMENT', INDETERMINATE) -pylon = express_getattr(IfcBridgePartTypeEnum, 'PYLON', INDETERMINATE) -substructure = express_getattr(IfcBridgePartTypeEnum, 'SUBSTRUCTURE', INDETERMINATE) -superstructure = express_getattr(IfcBridgePartTypeEnum, 'SUPERSTRUCTURE', INDETERMINATE) -surfacestructure = express_getattr(IfcBridgePartTypeEnum, 'SURFACESTRUCTURE', INDETERMINATE) -userdefined = express_getattr(IfcBridgePartTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBridgePartTypeEnum, 'NOTDEFINED', INDETERMINATE) +abutment = IfcBridgePartTypeEnum.ABUTMENT +deck = IfcBridgePartTypeEnum.DECK +deck_segment = IfcBridgePartTypeEnum.DECK_SEGMENT +foundation = IfcBridgePartTypeEnum.FOUNDATION +pier = IfcBridgePartTypeEnum.PIER +pier_segment = IfcBridgePartTypeEnum.PIER_SEGMENT +pylon = IfcBridgePartTypeEnum.PYLON +substructure = IfcBridgePartTypeEnum.SUBSTRUCTURE +superstructure = IfcBridgePartTypeEnum.SUPERSTRUCTURE +surfacestructure = IfcBridgePartTypeEnum.SURFACESTRUCTURE +userdefined = IfcBridgePartTypeEnum.USERDEFINED +notdefined = IfcBridgePartTypeEnum.NOTDEFINED IfcBridgeTypeEnum = enum_namespace() -arched = express_getattr(IfcBridgeTypeEnum, 'ARCHED', INDETERMINATE) -cable_stayed = express_getattr(IfcBridgeTypeEnum, 'CABLE_STAYED', INDETERMINATE) -cantilever = express_getattr(IfcBridgeTypeEnum, 'CANTILEVER', INDETERMINATE) -culvert = express_getattr(IfcBridgeTypeEnum, 'CULVERT', INDETERMINATE) -framework = express_getattr(IfcBridgeTypeEnum, 'FRAMEWORK', INDETERMINATE) -girder = express_getattr(IfcBridgeTypeEnum, 'GIRDER', INDETERMINATE) -suspension = express_getattr(IfcBridgeTypeEnum, 'SUSPENSION', INDETERMINATE) -truss = express_getattr(IfcBridgeTypeEnum, 'TRUSS', INDETERMINATE) -userdefined = express_getattr(IfcBridgeTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBridgeTypeEnum, 'NOTDEFINED', INDETERMINATE) +arched = IfcBridgeTypeEnum.ARCHED +cable_stayed = IfcBridgeTypeEnum.CABLE_STAYED +cantilever = IfcBridgeTypeEnum.CANTILEVER +culvert = IfcBridgeTypeEnum.CULVERT +framework = IfcBridgeTypeEnum.FRAMEWORK +girder = IfcBridgeTypeEnum.GIRDER +suspension = IfcBridgeTypeEnum.SUSPENSION +truss = IfcBridgeTypeEnum.TRUSS +userdefined = IfcBridgeTypeEnum.USERDEFINED +notdefined = IfcBridgeTypeEnum.NOTDEFINED IfcBuildingElementPartTypeEnum = enum_namespace() -apron = express_getattr(IfcBuildingElementPartTypeEnum, 'APRON', INDETERMINATE) -armourunit = express_getattr(IfcBuildingElementPartTypeEnum, 'ARMOURUNIT', INDETERMINATE) -insulation = express_getattr(IfcBuildingElementPartTypeEnum, 'INSULATION', INDETERMINATE) -precastpanel = express_getattr(IfcBuildingElementPartTypeEnum, 'PRECASTPANEL', INDETERMINATE) -safetycage = express_getattr(IfcBuildingElementPartTypeEnum, 'SAFETYCAGE', INDETERMINATE) -userdefined = express_getattr(IfcBuildingElementPartTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBuildingElementPartTypeEnum, 'NOTDEFINED', INDETERMINATE) +apron = IfcBuildingElementPartTypeEnum.APRON +armourunit = IfcBuildingElementPartTypeEnum.ARMOURUNIT +insulation = IfcBuildingElementPartTypeEnum.INSULATION +precastpanel = IfcBuildingElementPartTypeEnum.PRECASTPANEL +safetycage = IfcBuildingElementPartTypeEnum.SAFETYCAGE +userdefined = IfcBuildingElementPartTypeEnum.USERDEFINED +notdefined = IfcBuildingElementPartTypeEnum.NOTDEFINED IfcBuildingElementProxyTypeEnum = enum_namespace() -complex = express_getattr(IfcBuildingElementProxyTypeEnum, 'COMPLEX', INDETERMINATE) -element = express_getattr(IfcBuildingElementProxyTypeEnum, 'ELEMENT', INDETERMINATE) -partial = express_getattr(IfcBuildingElementProxyTypeEnum, 'PARTIAL', INDETERMINATE) -userdefined = express_getattr(IfcBuildingElementProxyTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBuildingElementProxyTypeEnum, 'NOTDEFINED', INDETERMINATE) +complex = IfcBuildingElementProxyTypeEnum.COMPLEX +element = IfcBuildingElementProxyTypeEnum.ELEMENT +partial = IfcBuildingElementProxyTypeEnum.PARTIAL +userdefined = IfcBuildingElementProxyTypeEnum.USERDEFINED +notdefined = IfcBuildingElementProxyTypeEnum.NOTDEFINED IfcBuildingSystemTypeEnum = enum_namespace() -erosionprevention = express_getattr(IfcBuildingSystemTypeEnum, 'EROSIONPREVENTION', INDETERMINATE) -fenestration = express_getattr(IfcBuildingSystemTypeEnum, 'FENESTRATION', INDETERMINATE) -foundation = express_getattr(IfcBuildingSystemTypeEnum, 'FOUNDATION', INDETERMINATE) -loadbearing = express_getattr(IfcBuildingSystemTypeEnum, 'LOADBEARING', INDETERMINATE) -outershell = express_getattr(IfcBuildingSystemTypeEnum, 'OUTERSHELL', INDETERMINATE) -prestressing = express_getattr(IfcBuildingSystemTypeEnum, 'PRESTRESSING', INDETERMINATE) -reinforcing = express_getattr(IfcBuildingSystemTypeEnum, 'REINFORCING', INDETERMINATE) -shading = express_getattr(IfcBuildingSystemTypeEnum, 'SHADING', INDETERMINATE) -transport = express_getattr(IfcBuildingSystemTypeEnum, 'TRANSPORT', INDETERMINATE) -userdefined = express_getattr(IfcBuildingSystemTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBuildingSystemTypeEnum, 'NOTDEFINED', INDETERMINATE) +erosionprevention = IfcBuildingSystemTypeEnum.EROSIONPREVENTION +fenestration = IfcBuildingSystemTypeEnum.FENESTRATION +foundation = IfcBuildingSystemTypeEnum.FOUNDATION +loadbearing = IfcBuildingSystemTypeEnum.LOADBEARING +outershell = IfcBuildingSystemTypeEnum.OUTERSHELL +prestressing = IfcBuildingSystemTypeEnum.PRESTRESSING +reinforcing = IfcBuildingSystemTypeEnum.REINFORCING +shading = IfcBuildingSystemTypeEnum.SHADING +transport = IfcBuildingSystemTypeEnum.TRANSPORT +userdefined = IfcBuildingSystemTypeEnum.USERDEFINED +notdefined = IfcBuildingSystemTypeEnum.NOTDEFINED IfcBuiltSystemTypeEnum = enum_namespace() -erosionprevention = express_getattr(IfcBuiltSystemTypeEnum, 'EROSIONPREVENTION', INDETERMINATE) -fenestration = express_getattr(IfcBuiltSystemTypeEnum, 'FENESTRATION', INDETERMINATE) -foundation = express_getattr(IfcBuiltSystemTypeEnum, 'FOUNDATION', INDETERMINATE) -loadbearing = express_getattr(IfcBuiltSystemTypeEnum, 'LOADBEARING', INDETERMINATE) -mooring = express_getattr(IfcBuiltSystemTypeEnum, 'MOORING', INDETERMINATE) -outershell = express_getattr(IfcBuiltSystemTypeEnum, 'OUTERSHELL', INDETERMINATE) -prestressing = express_getattr(IfcBuiltSystemTypeEnum, 'PRESTRESSING', INDETERMINATE) -railwayline = express_getattr(IfcBuiltSystemTypeEnum, 'RAILWAYLINE', INDETERMINATE) -railwaytrack = express_getattr(IfcBuiltSystemTypeEnum, 'RAILWAYTRACK', INDETERMINATE) -reinforcing = express_getattr(IfcBuiltSystemTypeEnum, 'REINFORCING', INDETERMINATE) -shading = express_getattr(IfcBuiltSystemTypeEnum, 'SHADING', INDETERMINATE) -trackcircuit = express_getattr(IfcBuiltSystemTypeEnum, 'TRACKCIRCUIT', INDETERMINATE) -transport = express_getattr(IfcBuiltSystemTypeEnum, 'TRANSPORT', INDETERMINATE) -userdefined = express_getattr(IfcBuiltSystemTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBuiltSystemTypeEnum, 'NOTDEFINED', INDETERMINATE) +erosionprevention = IfcBuiltSystemTypeEnum.EROSIONPREVENTION +fenestration = IfcBuiltSystemTypeEnum.FENESTRATION +foundation = IfcBuiltSystemTypeEnum.FOUNDATION +loadbearing = IfcBuiltSystemTypeEnum.LOADBEARING +mooring = IfcBuiltSystemTypeEnum.MOORING +outershell = IfcBuiltSystemTypeEnum.OUTERSHELL +prestressing = IfcBuiltSystemTypeEnum.PRESTRESSING +railwayline = IfcBuiltSystemTypeEnum.RAILWAYLINE +railwaytrack = IfcBuiltSystemTypeEnum.RAILWAYTRACK +reinforcing = IfcBuiltSystemTypeEnum.REINFORCING +shading = IfcBuiltSystemTypeEnum.SHADING +trackcircuit = IfcBuiltSystemTypeEnum.TRACKCIRCUIT +transport = IfcBuiltSystemTypeEnum.TRANSPORT +userdefined = IfcBuiltSystemTypeEnum.USERDEFINED +notdefined = IfcBuiltSystemTypeEnum.NOTDEFINED IfcBurnerTypeEnum = enum_namespace() -userdefined = express_getattr(IfcBurnerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBurnerTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcBurnerTypeEnum.USERDEFINED +notdefined = IfcBurnerTypeEnum.NOTDEFINED IfcCableCarrierFittingTypeEnum = enum_namespace() -bend = express_getattr(IfcCableCarrierFittingTypeEnum, 'BEND', INDETERMINATE) -connector = express_getattr(IfcCableCarrierFittingTypeEnum, 'CONNECTOR', INDETERMINATE) -cross = express_getattr(IfcCableCarrierFittingTypeEnum, 'CROSS', INDETERMINATE) -junction = express_getattr(IfcCableCarrierFittingTypeEnum, 'JUNCTION', INDETERMINATE) -tee = express_getattr(IfcCableCarrierFittingTypeEnum, 'TEE', INDETERMINATE) -transition = express_getattr(IfcCableCarrierFittingTypeEnum, 'TRANSITION', INDETERMINATE) -userdefined = express_getattr(IfcCableCarrierFittingTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCableCarrierFittingTypeEnum, 'NOTDEFINED', INDETERMINATE) +bend = IfcCableCarrierFittingTypeEnum.BEND +connector = IfcCableCarrierFittingTypeEnum.CONNECTOR +cross = IfcCableCarrierFittingTypeEnum.CROSS +junction = IfcCableCarrierFittingTypeEnum.JUNCTION +tee = IfcCableCarrierFittingTypeEnum.TEE +transition = IfcCableCarrierFittingTypeEnum.TRANSITION +userdefined = IfcCableCarrierFittingTypeEnum.USERDEFINED +notdefined = IfcCableCarrierFittingTypeEnum.NOTDEFINED IfcCableCarrierSegmentTypeEnum = enum_namespace() -cablebracket = express_getattr(IfcCableCarrierSegmentTypeEnum, 'CABLEBRACKET', INDETERMINATE) -cableladdersegment = express_getattr(IfcCableCarrierSegmentTypeEnum, 'CABLELADDERSEGMENT', INDETERMINATE) -cabletraysegment = express_getattr(IfcCableCarrierSegmentTypeEnum, 'CABLETRAYSEGMENT', INDETERMINATE) -cabletrunkingsegment = express_getattr(IfcCableCarrierSegmentTypeEnum, 'CABLETRUNKINGSEGMENT', INDETERMINATE) -catenarywire = express_getattr(IfcCableCarrierSegmentTypeEnum, 'CATENARYWIRE', INDETERMINATE) -conduitsegment = express_getattr(IfcCableCarrierSegmentTypeEnum, 'CONDUITSEGMENT', INDETERMINATE) -dropper = express_getattr(IfcCableCarrierSegmentTypeEnum, 'DROPPER', INDETERMINATE) -userdefined = express_getattr(IfcCableCarrierSegmentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCableCarrierSegmentTypeEnum, 'NOTDEFINED', INDETERMINATE) +cablebracket = IfcCableCarrierSegmentTypeEnum.CABLEBRACKET +cableladdersegment = IfcCableCarrierSegmentTypeEnum.CABLELADDERSEGMENT +cabletraysegment = IfcCableCarrierSegmentTypeEnum.CABLETRAYSEGMENT +cabletrunkingsegment = IfcCableCarrierSegmentTypeEnum.CABLETRUNKINGSEGMENT +catenarywire = IfcCableCarrierSegmentTypeEnum.CATENARYWIRE +conduitsegment = IfcCableCarrierSegmentTypeEnum.CONDUITSEGMENT +dropper = IfcCableCarrierSegmentTypeEnum.DROPPER +userdefined = IfcCableCarrierSegmentTypeEnum.USERDEFINED +notdefined = IfcCableCarrierSegmentTypeEnum.NOTDEFINED IfcCableFittingTypeEnum = enum_namespace() -connector = express_getattr(IfcCableFittingTypeEnum, 'CONNECTOR', INDETERMINATE) -entry = express_getattr(IfcCableFittingTypeEnum, 'ENTRY', INDETERMINATE) -exit = express_getattr(IfcCableFittingTypeEnum, 'EXIT', INDETERMINATE) -fanout = express_getattr(IfcCableFittingTypeEnum, 'FANOUT', INDETERMINATE) -junction = express_getattr(IfcCableFittingTypeEnum, 'JUNCTION', INDETERMINATE) -transition = express_getattr(IfcCableFittingTypeEnum, 'TRANSITION', INDETERMINATE) -userdefined = express_getattr(IfcCableFittingTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCableFittingTypeEnum, 'NOTDEFINED', INDETERMINATE) +connector = IfcCableFittingTypeEnum.CONNECTOR +entry = IfcCableFittingTypeEnum.ENTRY +exit = IfcCableFittingTypeEnum.EXIT +fanout = IfcCableFittingTypeEnum.FANOUT +junction = IfcCableFittingTypeEnum.JUNCTION +transition = IfcCableFittingTypeEnum.TRANSITION +userdefined = IfcCableFittingTypeEnum.USERDEFINED +notdefined = IfcCableFittingTypeEnum.NOTDEFINED IfcCableSegmentTypeEnum = enum_namespace() -busbarsegment = express_getattr(IfcCableSegmentTypeEnum, 'BUSBARSEGMENT', INDETERMINATE) -cablesegment = express_getattr(IfcCableSegmentTypeEnum, 'CABLESEGMENT', INDETERMINATE) -conductorsegment = express_getattr(IfcCableSegmentTypeEnum, 'CONDUCTORSEGMENT', INDETERMINATE) -contactwiresegment = express_getattr(IfcCableSegmentTypeEnum, 'CONTACTWIRESEGMENT', INDETERMINATE) -coresegment = express_getattr(IfcCableSegmentTypeEnum, 'CORESEGMENT', INDETERMINATE) -fibersegment = express_getattr(IfcCableSegmentTypeEnum, 'FIBERSEGMENT', INDETERMINATE) -fibertube = express_getattr(IfcCableSegmentTypeEnum, 'FIBERTUBE', INDETERMINATE) -opticalcablesegment = express_getattr(IfcCableSegmentTypeEnum, 'OPTICALCABLESEGMENT', INDETERMINATE) -stitchwire = express_getattr(IfcCableSegmentTypeEnum, 'STITCHWIRE', INDETERMINATE) -wirepairsegment = express_getattr(IfcCableSegmentTypeEnum, 'WIREPAIRSEGMENT', INDETERMINATE) -userdefined = express_getattr(IfcCableSegmentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCableSegmentTypeEnum, 'NOTDEFINED', INDETERMINATE) +busbarsegment = IfcCableSegmentTypeEnum.BUSBARSEGMENT +cablesegment = IfcCableSegmentTypeEnum.CABLESEGMENT +conductorsegment = IfcCableSegmentTypeEnum.CONDUCTORSEGMENT +contactwiresegment = IfcCableSegmentTypeEnum.CONTACTWIRESEGMENT +coresegment = IfcCableSegmentTypeEnum.CORESEGMENT +fibersegment = IfcCableSegmentTypeEnum.FIBERSEGMENT +fibertube = IfcCableSegmentTypeEnum.FIBERTUBE +opticalcablesegment = IfcCableSegmentTypeEnum.OPTICALCABLESEGMENT +stitchwire = IfcCableSegmentTypeEnum.STITCHWIRE +wirepairsegment = IfcCableSegmentTypeEnum.WIREPAIRSEGMENT +userdefined = IfcCableSegmentTypeEnum.USERDEFINED +notdefined = IfcCableSegmentTypeEnum.NOTDEFINED IfcCaissonFoundationTypeEnum = enum_namespace() -caisson = express_getattr(IfcCaissonFoundationTypeEnum, 'CAISSON', INDETERMINATE) -well = express_getattr(IfcCaissonFoundationTypeEnum, 'WELL', INDETERMINATE) -userdefined = express_getattr(IfcCaissonFoundationTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCaissonFoundationTypeEnum, 'NOTDEFINED', INDETERMINATE) +caisson = IfcCaissonFoundationTypeEnum.CAISSON +well = IfcCaissonFoundationTypeEnum.WELL +userdefined = IfcCaissonFoundationTypeEnum.USERDEFINED +notdefined = IfcCaissonFoundationTypeEnum.NOTDEFINED IfcChangeActionEnum = enum_namespace() -added = express_getattr(IfcChangeActionEnum, 'ADDED', INDETERMINATE) -deleted = express_getattr(IfcChangeActionEnum, 'DELETED', INDETERMINATE) -modified = express_getattr(IfcChangeActionEnum, 'MODIFIED', INDETERMINATE) -nochange = express_getattr(IfcChangeActionEnum, 'NOCHANGE', INDETERMINATE) -notdefined = express_getattr(IfcChangeActionEnum, 'NOTDEFINED', INDETERMINATE) +added = IfcChangeActionEnum.ADDED +deleted = IfcChangeActionEnum.DELETED +modified = IfcChangeActionEnum.MODIFIED +nochange = IfcChangeActionEnum.NOCHANGE +notdefined = IfcChangeActionEnum.NOTDEFINED IfcChillerTypeEnum = enum_namespace() -aircooled = express_getattr(IfcChillerTypeEnum, 'AIRCOOLED', INDETERMINATE) -heatrecovery = express_getattr(IfcChillerTypeEnum, 'HEATRECOVERY', INDETERMINATE) -watercooled = express_getattr(IfcChillerTypeEnum, 'WATERCOOLED', INDETERMINATE) -userdefined = express_getattr(IfcChillerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcChillerTypeEnum, 'NOTDEFINED', INDETERMINATE) +aircooled = IfcChillerTypeEnum.AIRCOOLED +heatrecovery = IfcChillerTypeEnum.HEATRECOVERY +watercooled = IfcChillerTypeEnum.WATERCOOLED +userdefined = IfcChillerTypeEnum.USERDEFINED +notdefined = IfcChillerTypeEnum.NOTDEFINED IfcChimneyTypeEnum = enum_namespace() -userdefined = express_getattr(IfcChimneyTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcChimneyTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcChimneyTypeEnum.USERDEFINED +notdefined = IfcChimneyTypeEnum.NOTDEFINED IfcCoilTypeEnum = enum_namespace() -dxcoolingcoil = express_getattr(IfcCoilTypeEnum, 'DXCOOLINGCOIL', INDETERMINATE) -electricheatingcoil = express_getattr(IfcCoilTypeEnum, 'ELECTRICHEATINGCOIL', INDETERMINATE) -gasheatingcoil = express_getattr(IfcCoilTypeEnum, 'GASHEATINGCOIL', INDETERMINATE) -hydroniccoil = express_getattr(IfcCoilTypeEnum, 'HYDRONICCOIL', INDETERMINATE) -steamheatingcoil = express_getattr(IfcCoilTypeEnum, 'STEAMHEATINGCOIL', INDETERMINATE) -watercoolingcoil = express_getattr(IfcCoilTypeEnum, 'WATERCOOLINGCOIL', INDETERMINATE) -waterheatingcoil = express_getattr(IfcCoilTypeEnum, 'WATERHEATINGCOIL', INDETERMINATE) -userdefined = express_getattr(IfcCoilTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCoilTypeEnum, 'NOTDEFINED', INDETERMINATE) +dxcoolingcoil = IfcCoilTypeEnum.DXCOOLINGCOIL +electricheatingcoil = IfcCoilTypeEnum.ELECTRICHEATINGCOIL +gasheatingcoil = IfcCoilTypeEnum.GASHEATINGCOIL +hydroniccoil = IfcCoilTypeEnum.HYDRONICCOIL +steamheatingcoil = IfcCoilTypeEnum.STEAMHEATINGCOIL +watercoolingcoil = IfcCoilTypeEnum.WATERCOOLINGCOIL +waterheatingcoil = IfcCoilTypeEnum.WATERHEATINGCOIL +userdefined = IfcCoilTypeEnum.USERDEFINED +notdefined = IfcCoilTypeEnum.NOTDEFINED IfcColumnTypeEnum = enum_namespace() -column = express_getattr(IfcColumnTypeEnum, 'COLUMN', INDETERMINATE) -pierstem = express_getattr(IfcColumnTypeEnum, 'PIERSTEM', INDETERMINATE) -pierstem_segment = express_getattr(IfcColumnTypeEnum, 'PIERSTEM_SEGMENT', INDETERMINATE) -pilaster = express_getattr(IfcColumnTypeEnum, 'PILASTER', INDETERMINATE) -standcolumn = express_getattr(IfcColumnTypeEnum, 'STANDCOLUMN', INDETERMINATE) -userdefined = express_getattr(IfcColumnTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcColumnTypeEnum, 'NOTDEFINED', INDETERMINATE) +column = IfcColumnTypeEnum.COLUMN +pierstem = IfcColumnTypeEnum.PIERSTEM +pierstem_segment = IfcColumnTypeEnum.PIERSTEM_SEGMENT +pilaster = IfcColumnTypeEnum.PILASTER +standcolumn = IfcColumnTypeEnum.STANDCOLUMN +userdefined = IfcColumnTypeEnum.USERDEFINED +notdefined = IfcColumnTypeEnum.NOTDEFINED IfcCommunicationsApplianceTypeEnum = enum_namespace() -antenna = express_getattr(IfcCommunicationsApplianceTypeEnum, 'ANTENNA', INDETERMINATE) -automaton = express_getattr(IfcCommunicationsApplianceTypeEnum, 'AUTOMATON', INDETERMINATE) -computer = express_getattr(IfcCommunicationsApplianceTypeEnum, 'COMPUTER', INDETERMINATE) -fax = express_getattr(IfcCommunicationsApplianceTypeEnum, 'FAX', INDETERMINATE) -gateway = express_getattr(IfcCommunicationsApplianceTypeEnum, 'GATEWAY', INDETERMINATE) -intelligentperipheral = express_getattr(IfcCommunicationsApplianceTypeEnum, 'INTELLIGENTPERIPHERAL', INDETERMINATE) -ipnetworkequipment = express_getattr(IfcCommunicationsApplianceTypeEnum, 'IPNETWORKEQUIPMENT', INDETERMINATE) -linesideelectronicunit = express_getattr(IfcCommunicationsApplianceTypeEnum, 'LINESIDEELECTRONICUNIT', INDETERMINATE) -modem = express_getattr(IfcCommunicationsApplianceTypeEnum, 'MODEM', INDETERMINATE) -networkappliance = express_getattr(IfcCommunicationsApplianceTypeEnum, 'NETWORKAPPLIANCE', INDETERMINATE) -networkbridge = express_getattr(IfcCommunicationsApplianceTypeEnum, 'NETWORKBRIDGE', INDETERMINATE) -networkhub = express_getattr(IfcCommunicationsApplianceTypeEnum, 'NETWORKHUB', INDETERMINATE) -opticallineterminal = express_getattr(IfcCommunicationsApplianceTypeEnum, 'OPTICALLINETERMINAL', INDETERMINATE) -opticalnetworkunit = express_getattr(IfcCommunicationsApplianceTypeEnum, 'OPTICALNETWORKUNIT', INDETERMINATE) -printer = express_getattr(IfcCommunicationsApplianceTypeEnum, 'PRINTER', INDETERMINATE) -radioblockcenter = express_getattr(IfcCommunicationsApplianceTypeEnum, 'RADIOBLOCKCENTER', INDETERMINATE) -repeater = express_getattr(IfcCommunicationsApplianceTypeEnum, 'REPEATER', INDETERMINATE) -router = express_getattr(IfcCommunicationsApplianceTypeEnum, 'ROUTER', INDETERMINATE) -scanner = express_getattr(IfcCommunicationsApplianceTypeEnum, 'SCANNER', INDETERMINATE) -telecommand = express_getattr(IfcCommunicationsApplianceTypeEnum, 'TELECOMMAND', INDETERMINATE) -telephonyexchange = express_getattr(IfcCommunicationsApplianceTypeEnum, 'TELEPHONYEXCHANGE', INDETERMINATE) -transitioncomponent = express_getattr(IfcCommunicationsApplianceTypeEnum, 'TRANSITIONCOMPONENT', INDETERMINATE) -transponder = express_getattr(IfcCommunicationsApplianceTypeEnum, 'TRANSPONDER', INDETERMINATE) -transportequipment = express_getattr(IfcCommunicationsApplianceTypeEnum, 'TRANSPORTEQUIPMENT', INDETERMINATE) -userdefined = express_getattr(IfcCommunicationsApplianceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCommunicationsApplianceTypeEnum, 'NOTDEFINED', INDETERMINATE) +antenna = IfcCommunicationsApplianceTypeEnum.ANTENNA +automaton = IfcCommunicationsApplianceTypeEnum.AUTOMATON +computer = IfcCommunicationsApplianceTypeEnum.COMPUTER +fax = IfcCommunicationsApplianceTypeEnum.FAX +gateway = IfcCommunicationsApplianceTypeEnum.GATEWAY +intelligentperipheral = IfcCommunicationsApplianceTypeEnum.INTELLIGENTPERIPHERAL +ipnetworkequipment = IfcCommunicationsApplianceTypeEnum.IPNETWORKEQUIPMENT +linesideelectronicunit = IfcCommunicationsApplianceTypeEnum.LINESIDEELECTRONICUNIT +modem = IfcCommunicationsApplianceTypeEnum.MODEM +networkappliance = IfcCommunicationsApplianceTypeEnum.NETWORKAPPLIANCE +networkbridge = IfcCommunicationsApplianceTypeEnum.NETWORKBRIDGE +networkhub = IfcCommunicationsApplianceTypeEnum.NETWORKHUB +opticallineterminal = IfcCommunicationsApplianceTypeEnum.OPTICALLINETERMINAL +opticalnetworkunit = IfcCommunicationsApplianceTypeEnum.OPTICALNETWORKUNIT +printer = IfcCommunicationsApplianceTypeEnum.PRINTER +radioblockcenter = IfcCommunicationsApplianceTypeEnum.RADIOBLOCKCENTER +repeater = IfcCommunicationsApplianceTypeEnum.REPEATER +router = IfcCommunicationsApplianceTypeEnum.ROUTER +scanner = IfcCommunicationsApplianceTypeEnum.SCANNER +telecommand = IfcCommunicationsApplianceTypeEnum.TELECOMMAND +telephonyexchange = IfcCommunicationsApplianceTypeEnum.TELEPHONYEXCHANGE +transitioncomponent = IfcCommunicationsApplianceTypeEnum.TRANSITIONCOMPONENT +transponder = IfcCommunicationsApplianceTypeEnum.TRANSPONDER +transportequipment = IfcCommunicationsApplianceTypeEnum.TRANSPORTEQUIPMENT +userdefined = IfcCommunicationsApplianceTypeEnum.USERDEFINED +notdefined = IfcCommunicationsApplianceTypeEnum.NOTDEFINED IfcComplexPropertyTemplateTypeEnum = enum_namespace() -p_complex = express_getattr(IfcComplexPropertyTemplateTypeEnum, 'P_COMPLEX', INDETERMINATE) -q_complex = express_getattr(IfcComplexPropertyTemplateTypeEnum, 'Q_COMPLEX', INDETERMINATE) +p_complex = IfcComplexPropertyTemplateTypeEnum.P_COMPLEX +q_complex = IfcComplexPropertyTemplateTypeEnum.Q_COMPLEX IfcCompressorTypeEnum = enum_namespace() -booster = express_getattr(IfcCompressorTypeEnum, 'BOOSTER', INDETERMINATE) -dynamic = express_getattr(IfcCompressorTypeEnum, 'DYNAMIC', INDETERMINATE) -hermetic = express_getattr(IfcCompressorTypeEnum, 'HERMETIC', INDETERMINATE) -opentype = express_getattr(IfcCompressorTypeEnum, 'OPENTYPE', INDETERMINATE) -reciprocating = express_getattr(IfcCompressorTypeEnum, 'RECIPROCATING', INDETERMINATE) -rollingpiston = express_getattr(IfcCompressorTypeEnum, 'ROLLINGPISTON', INDETERMINATE) -rotary = express_getattr(IfcCompressorTypeEnum, 'ROTARY', INDETERMINATE) -rotaryvane = express_getattr(IfcCompressorTypeEnum, 'ROTARYVANE', INDETERMINATE) -scroll = express_getattr(IfcCompressorTypeEnum, 'SCROLL', INDETERMINATE) -semihermetic = express_getattr(IfcCompressorTypeEnum, 'SEMIHERMETIC', INDETERMINATE) -singlescrew = express_getattr(IfcCompressorTypeEnum, 'SINGLESCREW', INDETERMINATE) -singlestage = express_getattr(IfcCompressorTypeEnum, 'SINGLESTAGE', INDETERMINATE) -trochoidal = express_getattr(IfcCompressorTypeEnum, 'TROCHOIDAL', INDETERMINATE) -twinscrew = express_getattr(IfcCompressorTypeEnum, 'TWINSCREW', INDETERMINATE) -weldedshellhermetic = express_getattr(IfcCompressorTypeEnum, 'WELDEDSHELLHERMETIC', INDETERMINATE) -userdefined = express_getattr(IfcCompressorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCompressorTypeEnum, 'NOTDEFINED', INDETERMINATE) +booster = IfcCompressorTypeEnum.BOOSTER +dynamic = IfcCompressorTypeEnum.DYNAMIC +hermetic = IfcCompressorTypeEnum.HERMETIC +opentype = IfcCompressorTypeEnum.OPENTYPE +reciprocating = IfcCompressorTypeEnum.RECIPROCATING +rollingpiston = IfcCompressorTypeEnum.ROLLINGPISTON +rotary = IfcCompressorTypeEnum.ROTARY +rotaryvane = IfcCompressorTypeEnum.ROTARYVANE +scroll = IfcCompressorTypeEnum.SCROLL +semihermetic = IfcCompressorTypeEnum.SEMIHERMETIC +singlescrew = IfcCompressorTypeEnum.SINGLESCREW +singlestage = IfcCompressorTypeEnum.SINGLESTAGE +trochoidal = IfcCompressorTypeEnum.TROCHOIDAL +twinscrew = IfcCompressorTypeEnum.TWINSCREW +weldedshellhermetic = IfcCompressorTypeEnum.WELDEDSHELLHERMETIC +userdefined = IfcCompressorTypeEnum.USERDEFINED +notdefined = IfcCompressorTypeEnum.NOTDEFINED IfcCondenserTypeEnum = enum_namespace() -aircooled = express_getattr(IfcCondenserTypeEnum, 'AIRCOOLED', INDETERMINATE) -evaporativecooled = express_getattr(IfcCondenserTypeEnum, 'EVAPORATIVECOOLED', INDETERMINATE) -watercooled = express_getattr(IfcCondenserTypeEnum, 'WATERCOOLED', INDETERMINATE) -watercooledbrazedplate = express_getattr(IfcCondenserTypeEnum, 'WATERCOOLEDBRAZEDPLATE', INDETERMINATE) -watercooledshellcoil = express_getattr(IfcCondenserTypeEnum, 'WATERCOOLEDSHELLCOIL', INDETERMINATE) -watercooledshelltube = express_getattr(IfcCondenserTypeEnum, 'WATERCOOLEDSHELLTUBE', INDETERMINATE) -watercooledtubeintube = express_getattr(IfcCondenserTypeEnum, 'WATERCOOLEDTUBEINTUBE', INDETERMINATE) -userdefined = express_getattr(IfcCondenserTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCondenserTypeEnum, 'NOTDEFINED', INDETERMINATE) +aircooled = IfcCondenserTypeEnum.AIRCOOLED +evaporativecooled = IfcCondenserTypeEnum.EVAPORATIVECOOLED +watercooled = IfcCondenserTypeEnum.WATERCOOLED +watercooledbrazedplate = IfcCondenserTypeEnum.WATERCOOLEDBRAZEDPLATE +watercooledshellcoil = IfcCondenserTypeEnum.WATERCOOLEDSHELLCOIL +watercooledshelltube = IfcCondenserTypeEnum.WATERCOOLEDSHELLTUBE +watercooledtubeintube = IfcCondenserTypeEnum.WATERCOOLEDTUBEINTUBE +userdefined = IfcCondenserTypeEnum.USERDEFINED +notdefined = IfcCondenserTypeEnum.NOTDEFINED IfcConnectionTypeEnum = enum_namespace() -atend = express_getattr(IfcConnectionTypeEnum, 'ATEND', INDETERMINATE) -atpath = express_getattr(IfcConnectionTypeEnum, 'ATPATH', INDETERMINATE) -atstart = express_getattr(IfcConnectionTypeEnum, 'ATSTART', INDETERMINATE) -notdefined = express_getattr(IfcConnectionTypeEnum, 'NOTDEFINED', INDETERMINATE) +atend = IfcConnectionTypeEnum.ATEND +atpath = IfcConnectionTypeEnum.ATPATH +atstart = IfcConnectionTypeEnum.ATSTART +notdefined = IfcConnectionTypeEnum.NOTDEFINED IfcConstraintEnum = enum_namespace() -advisory = express_getattr(IfcConstraintEnum, 'ADVISORY', INDETERMINATE) -hard = express_getattr(IfcConstraintEnum, 'HARD', INDETERMINATE) -soft = express_getattr(IfcConstraintEnum, 'SOFT', INDETERMINATE) -userdefined = express_getattr(IfcConstraintEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcConstraintEnum, 'NOTDEFINED', INDETERMINATE) +advisory = IfcConstraintEnum.ADVISORY +hard = IfcConstraintEnum.HARD +soft = IfcConstraintEnum.SOFT +userdefined = IfcConstraintEnum.USERDEFINED +notdefined = IfcConstraintEnum.NOTDEFINED IfcConstructionEquipmentResourceTypeEnum = enum_namespace() -demolishing = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'DEMOLISHING', INDETERMINATE) -earthmoving = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'EARTHMOVING', INDETERMINATE) -erecting = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'ERECTING', INDETERMINATE) -heating = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'HEATING', INDETERMINATE) -lighting = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'LIGHTING', INDETERMINATE) -paving = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'PAVING', INDETERMINATE) -pumping = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'PUMPING', INDETERMINATE) -transporting = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'TRANSPORTING', INDETERMINATE) -userdefined = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'NOTDEFINED', INDETERMINATE) +demolishing = IfcConstructionEquipmentResourceTypeEnum.DEMOLISHING +earthmoving = IfcConstructionEquipmentResourceTypeEnum.EARTHMOVING +erecting = IfcConstructionEquipmentResourceTypeEnum.ERECTING +heating = IfcConstructionEquipmentResourceTypeEnum.HEATING +lighting = IfcConstructionEquipmentResourceTypeEnum.LIGHTING +paving = IfcConstructionEquipmentResourceTypeEnum.PAVING +pumping = IfcConstructionEquipmentResourceTypeEnum.PUMPING +transporting = IfcConstructionEquipmentResourceTypeEnum.TRANSPORTING +userdefined = IfcConstructionEquipmentResourceTypeEnum.USERDEFINED +notdefined = IfcConstructionEquipmentResourceTypeEnum.NOTDEFINED IfcConstructionMaterialResourceTypeEnum = enum_namespace() -aggregates = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'AGGREGATES', INDETERMINATE) -concrete = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'CONCRETE', INDETERMINATE) -drywall = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'DRYWALL', INDETERMINATE) -fuel = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'FUEL', INDETERMINATE) -gypsum = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'GYPSUM', INDETERMINATE) -masonry = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'MASONRY', INDETERMINATE) -metal = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'METAL', INDETERMINATE) -plastic = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'PLASTIC', INDETERMINATE) -wood = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'WOOD', INDETERMINATE) -userdefined = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'NOTDEFINED', INDETERMINATE) +aggregates = IfcConstructionMaterialResourceTypeEnum.AGGREGATES +concrete = IfcConstructionMaterialResourceTypeEnum.CONCRETE +drywall = IfcConstructionMaterialResourceTypeEnum.DRYWALL +fuel = IfcConstructionMaterialResourceTypeEnum.FUEL +gypsum = IfcConstructionMaterialResourceTypeEnum.GYPSUM +masonry = IfcConstructionMaterialResourceTypeEnum.MASONRY +metal = IfcConstructionMaterialResourceTypeEnum.METAL +plastic = IfcConstructionMaterialResourceTypeEnum.PLASTIC +wood = IfcConstructionMaterialResourceTypeEnum.WOOD +userdefined = IfcConstructionMaterialResourceTypeEnum.USERDEFINED +notdefined = IfcConstructionMaterialResourceTypeEnum.NOTDEFINED IfcConstructionProductResourceTypeEnum = enum_namespace() -assembly = express_getattr(IfcConstructionProductResourceTypeEnum, 'ASSEMBLY', INDETERMINATE) -formwork = express_getattr(IfcConstructionProductResourceTypeEnum, 'FORMWORK', INDETERMINATE) -userdefined = express_getattr(IfcConstructionProductResourceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcConstructionProductResourceTypeEnum, 'NOTDEFINED', INDETERMINATE) +assembly = IfcConstructionProductResourceTypeEnum.ASSEMBLY +formwork = IfcConstructionProductResourceTypeEnum.FORMWORK +userdefined = IfcConstructionProductResourceTypeEnum.USERDEFINED +notdefined = IfcConstructionProductResourceTypeEnum.NOTDEFINED IfcControllerTypeEnum = enum_namespace() -floating = express_getattr(IfcControllerTypeEnum, 'FLOATING', INDETERMINATE) -multiposition = express_getattr(IfcControllerTypeEnum, 'MULTIPOSITION', INDETERMINATE) -programmable = express_getattr(IfcControllerTypeEnum, 'PROGRAMMABLE', INDETERMINATE) -proportional = express_getattr(IfcControllerTypeEnum, 'PROPORTIONAL', INDETERMINATE) -twoposition = express_getattr(IfcControllerTypeEnum, 'TWOPOSITION', INDETERMINATE) -userdefined = express_getattr(IfcControllerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcControllerTypeEnum, 'NOTDEFINED', INDETERMINATE) +floating = IfcControllerTypeEnum.FLOATING +multiposition = IfcControllerTypeEnum.MULTIPOSITION +programmable = IfcControllerTypeEnum.PROGRAMMABLE +proportional = IfcControllerTypeEnum.PROPORTIONAL +twoposition = IfcControllerTypeEnum.TWOPOSITION +userdefined = IfcControllerTypeEnum.USERDEFINED +notdefined = IfcControllerTypeEnum.NOTDEFINED IfcConveyorSegmentTypeEnum = enum_namespace() -beltconveyor = express_getattr(IfcConveyorSegmentTypeEnum, 'BELTCONVEYOR', INDETERMINATE) -bucketconveyor = express_getattr(IfcConveyorSegmentTypeEnum, 'BUCKETCONVEYOR', INDETERMINATE) -chuteconveyor = express_getattr(IfcConveyorSegmentTypeEnum, 'CHUTECONVEYOR', INDETERMINATE) -screwconveyor = express_getattr(IfcConveyorSegmentTypeEnum, 'SCREWCONVEYOR', INDETERMINATE) -userdefined = express_getattr(IfcConveyorSegmentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcConveyorSegmentTypeEnum, 'NOTDEFINED', INDETERMINATE) +beltconveyor = IfcConveyorSegmentTypeEnum.BELTCONVEYOR +bucketconveyor = IfcConveyorSegmentTypeEnum.BUCKETCONVEYOR +chuteconveyor = IfcConveyorSegmentTypeEnum.CHUTECONVEYOR +screwconveyor = IfcConveyorSegmentTypeEnum.SCREWCONVEYOR +userdefined = IfcConveyorSegmentTypeEnum.USERDEFINED +notdefined = IfcConveyorSegmentTypeEnum.NOTDEFINED IfcCooledBeamTypeEnum = enum_namespace() -active = express_getattr(IfcCooledBeamTypeEnum, 'ACTIVE', INDETERMINATE) -passive = express_getattr(IfcCooledBeamTypeEnum, 'PASSIVE', INDETERMINATE) -userdefined = express_getattr(IfcCooledBeamTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCooledBeamTypeEnum, 'NOTDEFINED', INDETERMINATE) +active = IfcCooledBeamTypeEnum.ACTIVE +passive = IfcCooledBeamTypeEnum.PASSIVE +userdefined = IfcCooledBeamTypeEnum.USERDEFINED +notdefined = IfcCooledBeamTypeEnum.NOTDEFINED IfcCoolingTowerTypeEnum = enum_namespace() -mechanicalforceddraft = express_getattr(IfcCoolingTowerTypeEnum, 'MECHANICALFORCEDDRAFT', INDETERMINATE) -mechanicalinduceddraft = express_getattr(IfcCoolingTowerTypeEnum, 'MECHANICALINDUCEDDRAFT', INDETERMINATE) -naturaldraft = express_getattr(IfcCoolingTowerTypeEnum, 'NATURALDRAFT', INDETERMINATE) -userdefined = express_getattr(IfcCoolingTowerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCoolingTowerTypeEnum, 'NOTDEFINED', INDETERMINATE) +mechanicalforceddraft = IfcCoolingTowerTypeEnum.MECHANICALFORCEDDRAFT +mechanicalinduceddraft = IfcCoolingTowerTypeEnum.MECHANICALINDUCEDDRAFT +naturaldraft = IfcCoolingTowerTypeEnum.NATURALDRAFT +userdefined = IfcCoolingTowerTypeEnum.USERDEFINED +notdefined = IfcCoolingTowerTypeEnum.NOTDEFINED IfcCostItemTypeEnum = enum_namespace() -userdefined = express_getattr(IfcCostItemTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCostItemTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcCostItemTypeEnum.USERDEFINED +notdefined = IfcCostItemTypeEnum.NOTDEFINED IfcCostScheduleTypeEnum = enum_namespace() -budget = express_getattr(IfcCostScheduleTypeEnum, 'BUDGET', INDETERMINATE) -costplan = express_getattr(IfcCostScheduleTypeEnum, 'COSTPLAN', INDETERMINATE) -estimate = express_getattr(IfcCostScheduleTypeEnum, 'ESTIMATE', INDETERMINATE) -pricedbillofquantities = express_getattr(IfcCostScheduleTypeEnum, 'PRICEDBILLOFQUANTITIES', INDETERMINATE) -scheduleofrates = express_getattr(IfcCostScheduleTypeEnum, 'SCHEDULEOFRATES', INDETERMINATE) -tender = express_getattr(IfcCostScheduleTypeEnum, 'TENDER', INDETERMINATE) -unpricedbillofquantities = express_getattr(IfcCostScheduleTypeEnum, 'UNPRICEDBILLOFQUANTITIES', INDETERMINATE) -userdefined = express_getattr(IfcCostScheduleTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCostScheduleTypeEnum, 'NOTDEFINED', INDETERMINATE) +budget = IfcCostScheduleTypeEnum.BUDGET +costplan = IfcCostScheduleTypeEnum.COSTPLAN +estimate = IfcCostScheduleTypeEnum.ESTIMATE +pricedbillofquantities = IfcCostScheduleTypeEnum.PRICEDBILLOFQUANTITIES +scheduleofrates = IfcCostScheduleTypeEnum.SCHEDULEOFRATES +tender = IfcCostScheduleTypeEnum.TENDER +unpricedbillofquantities = IfcCostScheduleTypeEnum.UNPRICEDBILLOFQUANTITIES +userdefined = IfcCostScheduleTypeEnum.USERDEFINED +notdefined = IfcCostScheduleTypeEnum.NOTDEFINED IfcCourseTypeEnum = enum_namespace() -armour = express_getattr(IfcCourseTypeEnum, 'ARMOUR', INDETERMINATE) -ballastbed = express_getattr(IfcCourseTypeEnum, 'BALLASTBED', INDETERMINATE) -core = express_getattr(IfcCourseTypeEnum, 'CORE', INDETERMINATE) -filter = express_getattr(IfcCourseTypeEnum, 'FILTER', INDETERMINATE) -pavement = express_getattr(IfcCourseTypeEnum, 'PAVEMENT', INDETERMINATE) -protection = express_getattr(IfcCourseTypeEnum, 'PROTECTION', INDETERMINATE) -userdefined = express_getattr(IfcCourseTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCourseTypeEnum, 'NOTDEFINED', INDETERMINATE) +armour = IfcCourseTypeEnum.ARMOUR +ballastbed = IfcCourseTypeEnum.BALLASTBED +core = IfcCourseTypeEnum.CORE +filter = IfcCourseTypeEnum.FILTER +pavement = IfcCourseTypeEnum.PAVEMENT +protection = IfcCourseTypeEnum.PROTECTION +userdefined = IfcCourseTypeEnum.USERDEFINED +notdefined = IfcCourseTypeEnum.NOTDEFINED IfcCoveringTypeEnum = enum_namespace() -ceiling = express_getattr(IfcCoveringTypeEnum, 'CEILING', INDETERMINATE) -cladding = express_getattr(IfcCoveringTypeEnum, 'CLADDING', INDETERMINATE) -coping = express_getattr(IfcCoveringTypeEnum, 'COPING', INDETERMINATE) -flooring = express_getattr(IfcCoveringTypeEnum, 'FLOORING', INDETERMINATE) -insulation = express_getattr(IfcCoveringTypeEnum, 'INSULATION', INDETERMINATE) -membrane = express_getattr(IfcCoveringTypeEnum, 'MEMBRANE', INDETERMINATE) -molding = express_getattr(IfcCoveringTypeEnum, 'MOLDING', INDETERMINATE) -roofing = express_getattr(IfcCoveringTypeEnum, 'ROOFING', INDETERMINATE) -skirtingboard = express_getattr(IfcCoveringTypeEnum, 'SKIRTINGBOARD', INDETERMINATE) -sleeving = express_getattr(IfcCoveringTypeEnum, 'SLEEVING', INDETERMINATE) -topping = express_getattr(IfcCoveringTypeEnum, 'TOPPING', INDETERMINATE) -wrapping = express_getattr(IfcCoveringTypeEnum, 'WRAPPING', INDETERMINATE) -userdefined = express_getattr(IfcCoveringTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCoveringTypeEnum, 'NOTDEFINED', INDETERMINATE) +ceiling = IfcCoveringTypeEnum.CEILING +cladding = IfcCoveringTypeEnum.CLADDING +coping = IfcCoveringTypeEnum.COPING +flooring = IfcCoveringTypeEnum.FLOORING +insulation = IfcCoveringTypeEnum.INSULATION +membrane = IfcCoveringTypeEnum.MEMBRANE +molding = IfcCoveringTypeEnum.MOLDING +roofing = IfcCoveringTypeEnum.ROOFING +skirtingboard = IfcCoveringTypeEnum.SKIRTINGBOARD +sleeving = IfcCoveringTypeEnum.SLEEVING +topping = IfcCoveringTypeEnum.TOPPING +wrapping = IfcCoveringTypeEnum.WRAPPING +userdefined = IfcCoveringTypeEnum.USERDEFINED +notdefined = IfcCoveringTypeEnum.NOTDEFINED IfcCrewResourceTypeEnum = enum_namespace() -office = express_getattr(IfcCrewResourceTypeEnum, 'OFFICE', INDETERMINATE) -site = express_getattr(IfcCrewResourceTypeEnum, 'SITE', INDETERMINATE) -userdefined = express_getattr(IfcCrewResourceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCrewResourceTypeEnum, 'NOTDEFINED', INDETERMINATE) +office = IfcCrewResourceTypeEnum.OFFICE +site = IfcCrewResourceTypeEnum.SITE +userdefined = IfcCrewResourceTypeEnum.USERDEFINED +notdefined = IfcCrewResourceTypeEnum.NOTDEFINED IfcCurtainWallTypeEnum = enum_namespace() -userdefined = express_getattr(IfcCurtainWallTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCurtainWallTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcCurtainWallTypeEnum.USERDEFINED +notdefined = IfcCurtainWallTypeEnum.NOTDEFINED IfcCurveInterpolationEnum = enum_namespace() -linear = express_getattr(IfcCurveInterpolationEnum, 'LINEAR', INDETERMINATE) -log_linear = express_getattr(IfcCurveInterpolationEnum, 'LOG_LINEAR', INDETERMINATE) -log_log = express_getattr(IfcCurveInterpolationEnum, 'LOG_LOG', INDETERMINATE) -notdefined = express_getattr(IfcCurveInterpolationEnum, 'NOTDEFINED', INDETERMINATE) +linear = IfcCurveInterpolationEnum.LINEAR +log_linear = IfcCurveInterpolationEnum.LOG_LINEAR +log_log = IfcCurveInterpolationEnum.LOG_LOG +notdefined = IfcCurveInterpolationEnum.NOTDEFINED IfcDamperTypeEnum = enum_namespace() -backdraftdamper = express_getattr(IfcDamperTypeEnum, 'BACKDRAFTDAMPER', INDETERMINATE) -balancingdamper = express_getattr(IfcDamperTypeEnum, 'BALANCINGDAMPER', INDETERMINATE) -blastdamper = express_getattr(IfcDamperTypeEnum, 'BLASTDAMPER', INDETERMINATE) -controldamper = express_getattr(IfcDamperTypeEnum, 'CONTROLDAMPER', INDETERMINATE) -firedamper = express_getattr(IfcDamperTypeEnum, 'FIREDAMPER', INDETERMINATE) -firesmokedamper = express_getattr(IfcDamperTypeEnum, 'FIRESMOKEDAMPER', INDETERMINATE) -fumehoodexhaust = express_getattr(IfcDamperTypeEnum, 'FUMEHOODEXHAUST', INDETERMINATE) -gravitydamper = express_getattr(IfcDamperTypeEnum, 'GRAVITYDAMPER', INDETERMINATE) -gravityreliefdamper = express_getattr(IfcDamperTypeEnum, 'GRAVITYRELIEFDAMPER', INDETERMINATE) -reliefdamper = express_getattr(IfcDamperTypeEnum, 'RELIEFDAMPER', INDETERMINATE) -smokedamper = express_getattr(IfcDamperTypeEnum, 'SMOKEDAMPER', INDETERMINATE) -userdefined = express_getattr(IfcDamperTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDamperTypeEnum, 'NOTDEFINED', INDETERMINATE) +backdraftdamper = IfcDamperTypeEnum.BACKDRAFTDAMPER +balancingdamper = IfcDamperTypeEnum.BALANCINGDAMPER +blastdamper = IfcDamperTypeEnum.BLASTDAMPER +controldamper = IfcDamperTypeEnum.CONTROLDAMPER +firedamper = IfcDamperTypeEnum.FIREDAMPER +firesmokedamper = IfcDamperTypeEnum.FIRESMOKEDAMPER +fumehoodexhaust = IfcDamperTypeEnum.FUMEHOODEXHAUST +gravitydamper = IfcDamperTypeEnum.GRAVITYDAMPER +gravityreliefdamper = IfcDamperTypeEnum.GRAVITYRELIEFDAMPER +reliefdamper = IfcDamperTypeEnum.RELIEFDAMPER +smokedamper = IfcDamperTypeEnum.SMOKEDAMPER +userdefined = IfcDamperTypeEnum.USERDEFINED +notdefined = IfcDamperTypeEnum.NOTDEFINED IfcDataOriginEnum = enum_namespace() -measured = express_getattr(IfcDataOriginEnum, 'MEASURED', INDETERMINATE) -predicted = express_getattr(IfcDataOriginEnum, 'PREDICTED', INDETERMINATE) -simulated = express_getattr(IfcDataOriginEnum, 'SIMULATED', INDETERMINATE) -userdefined = express_getattr(IfcDataOriginEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDataOriginEnum, 'NOTDEFINED', INDETERMINATE) +measured = IfcDataOriginEnum.MEASURED +predicted = IfcDataOriginEnum.PREDICTED +simulated = IfcDataOriginEnum.SIMULATED +userdefined = IfcDataOriginEnum.USERDEFINED +notdefined = IfcDataOriginEnum.NOTDEFINED IfcDerivedUnitEnum = enum_namespace() -accelerationunit = express_getattr(IfcDerivedUnitEnum, 'ACCELERATIONUNIT', INDETERMINATE) -angularvelocityunit = express_getattr(IfcDerivedUnitEnum, 'ANGULARVELOCITYUNIT', INDETERMINATE) -areadensityunit = express_getattr(IfcDerivedUnitEnum, 'AREADENSITYUNIT', INDETERMINATE) -compoundplaneangleunit = express_getattr(IfcDerivedUnitEnum, 'COMPOUNDPLANEANGLEUNIT', INDETERMINATE) -curvatureunit = express_getattr(IfcDerivedUnitEnum, 'CURVATUREUNIT', INDETERMINATE) -dynamicviscosityunit = express_getattr(IfcDerivedUnitEnum, 'DYNAMICVISCOSITYUNIT', INDETERMINATE) -heatfluxdensityunit = express_getattr(IfcDerivedUnitEnum, 'HEATFLUXDENSITYUNIT', INDETERMINATE) -heatingvalueunit = express_getattr(IfcDerivedUnitEnum, 'HEATINGVALUEUNIT', INDETERMINATE) -integercountrateunit = express_getattr(IfcDerivedUnitEnum, 'INTEGERCOUNTRATEUNIT', INDETERMINATE) -ionconcentrationunit = express_getattr(IfcDerivedUnitEnum, 'IONCONCENTRATIONUNIT', INDETERMINATE) -isothermalmoisturecapacityunit = express_getattr(IfcDerivedUnitEnum, 'ISOTHERMALMOISTURECAPACITYUNIT', INDETERMINATE) -kinematicviscosityunit = express_getattr(IfcDerivedUnitEnum, 'KINEMATICVISCOSITYUNIT', INDETERMINATE) -linearforceunit = express_getattr(IfcDerivedUnitEnum, 'LINEARFORCEUNIT', INDETERMINATE) -linearmomentunit = express_getattr(IfcDerivedUnitEnum, 'LINEARMOMENTUNIT', INDETERMINATE) -linearstiffnessunit = express_getattr(IfcDerivedUnitEnum, 'LINEARSTIFFNESSUNIT', INDETERMINATE) -linearvelocityunit = express_getattr(IfcDerivedUnitEnum, 'LINEARVELOCITYUNIT', INDETERMINATE) -luminousintensitydistributionunit = express_getattr(IfcDerivedUnitEnum, 'LUMINOUSINTENSITYDISTRIBUTIONUNIT', INDETERMINATE) -massdensityunit = express_getattr(IfcDerivedUnitEnum, 'MASSDENSITYUNIT', INDETERMINATE) -massflowrateunit = express_getattr(IfcDerivedUnitEnum, 'MASSFLOWRATEUNIT', INDETERMINATE) -massperlengthunit = express_getattr(IfcDerivedUnitEnum, 'MASSPERLENGTHUNIT', INDETERMINATE) -modulusofelasticityunit = express_getattr(IfcDerivedUnitEnum, 'MODULUSOFELASTICITYUNIT', INDETERMINATE) -modulusoflinearsubgradereactionunit = express_getattr(IfcDerivedUnitEnum, 'MODULUSOFLINEARSUBGRADEREACTIONUNIT', INDETERMINATE) -modulusofrotationalsubgradereactionunit = express_getattr(IfcDerivedUnitEnum, 'MODULUSOFROTATIONALSUBGRADEREACTIONUNIT', INDETERMINATE) -modulusofsubgradereactionunit = express_getattr(IfcDerivedUnitEnum, 'MODULUSOFSUBGRADEREACTIONUNIT', INDETERMINATE) -moisturediffusivityunit = express_getattr(IfcDerivedUnitEnum, 'MOISTUREDIFFUSIVITYUNIT', INDETERMINATE) -molecularweightunit = express_getattr(IfcDerivedUnitEnum, 'MOLECULARWEIGHTUNIT', INDETERMINATE) -momentofinertiaunit = express_getattr(IfcDerivedUnitEnum, 'MOMENTOFINERTIAUNIT', INDETERMINATE) -phunit = express_getattr(IfcDerivedUnitEnum, 'PHUNIT', INDETERMINATE) -planarforceunit = express_getattr(IfcDerivedUnitEnum, 'PLANARFORCEUNIT', INDETERMINATE) -rotationalfrequencyunit = express_getattr(IfcDerivedUnitEnum, 'ROTATIONALFREQUENCYUNIT', INDETERMINATE) -rotationalmassunit = express_getattr(IfcDerivedUnitEnum, 'ROTATIONALMASSUNIT', INDETERMINATE) -rotationalstiffnessunit = express_getattr(IfcDerivedUnitEnum, 'ROTATIONALSTIFFNESSUNIT', INDETERMINATE) -sectionareaintegralunit = express_getattr(IfcDerivedUnitEnum, 'SECTIONAREAINTEGRALUNIT', INDETERMINATE) -sectionmodulusunit = express_getattr(IfcDerivedUnitEnum, 'SECTIONMODULUSUNIT', INDETERMINATE) -shearmodulusunit = express_getattr(IfcDerivedUnitEnum, 'SHEARMODULUSUNIT', INDETERMINATE) -soundpowerlevelunit = express_getattr(IfcDerivedUnitEnum, 'SOUNDPOWERLEVELUNIT', INDETERMINATE) -soundpowerunit = express_getattr(IfcDerivedUnitEnum, 'SOUNDPOWERUNIT', INDETERMINATE) -soundpressurelevelunit = express_getattr(IfcDerivedUnitEnum, 'SOUNDPRESSURELEVELUNIT', INDETERMINATE) -soundpressureunit = express_getattr(IfcDerivedUnitEnum, 'SOUNDPRESSUREUNIT', INDETERMINATE) -specificheatcapacityunit = express_getattr(IfcDerivedUnitEnum, 'SPECIFICHEATCAPACITYUNIT', INDETERMINATE) -temperaturegradientunit = express_getattr(IfcDerivedUnitEnum, 'TEMPERATUREGRADIENTUNIT', INDETERMINATE) -temperaturerateofchangeunit = express_getattr(IfcDerivedUnitEnum, 'TEMPERATURERATEOFCHANGEUNIT', INDETERMINATE) -thermaladmittanceunit = express_getattr(IfcDerivedUnitEnum, 'THERMALADMITTANCEUNIT', INDETERMINATE) -thermalconductanceunit = express_getattr(IfcDerivedUnitEnum, 'THERMALCONDUCTANCEUNIT', INDETERMINATE) -thermalexpansioncoefficientunit = express_getattr(IfcDerivedUnitEnum, 'THERMALEXPANSIONCOEFFICIENTUNIT', INDETERMINATE) -thermalresistanceunit = express_getattr(IfcDerivedUnitEnum, 'THERMALRESISTANCEUNIT', INDETERMINATE) -thermaltransmittanceunit = express_getattr(IfcDerivedUnitEnum, 'THERMALTRANSMITTANCEUNIT', INDETERMINATE) -torqueunit = express_getattr(IfcDerivedUnitEnum, 'TORQUEUNIT', INDETERMINATE) -vaporpermeabilityunit = express_getattr(IfcDerivedUnitEnum, 'VAPORPERMEABILITYUNIT', INDETERMINATE) -volumetricflowrateunit = express_getattr(IfcDerivedUnitEnum, 'VOLUMETRICFLOWRATEUNIT', INDETERMINATE) -warpingconstantunit = express_getattr(IfcDerivedUnitEnum, 'WARPINGCONSTANTUNIT', INDETERMINATE) -warpingmomentunit = express_getattr(IfcDerivedUnitEnum, 'WARPINGMOMENTUNIT', INDETERMINATE) -userdefined = express_getattr(IfcDerivedUnitEnum, 'USERDEFINED', INDETERMINATE) +accelerationunit = IfcDerivedUnitEnum.ACCELERATIONUNIT +angularvelocityunit = IfcDerivedUnitEnum.ANGULARVELOCITYUNIT +areadensityunit = IfcDerivedUnitEnum.AREADENSITYUNIT +compoundplaneangleunit = IfcDerivedUnitEnum.COMPOUNDPLANEANGLEUNIT +curvatureunit = IfcDerivedUnitEnum.CURVATUREUNIT +dynamicviscosityunit = IfcDerivedUnitEnum.DYNAMICVISCOSITYUNIT +heatfluxdensityunit = IfcDerivedUnitEnum.HEATFLUXDENSITYUNIT +heatingvalueunit = IfcDerivedUnitEnum.HEATINGVALUEUNIT +integercountrateunit = IfcDerivedUnitEnum.INTEGERCOUNTRATEUNIT +ionconcentrationunit = IfcDerivedUnitEnum.IONCONCENTRATIONUNIT +isothermalmoisturecapacityunit = IfcDerivedUnitEnum.ISOTHERMALMOISTURECAPACITYUNIT +kinematicviscosityunit = IfcDerivedUnitEnum.KINEMATICVISCOSITYUNIT +linearforceunit = IfcDerivedUnitEnum.LINEARFORCEUNIT +linearmomentunit = IfcDerivedUnitEnum.LINEARMOMENTUNIT +linearstiffnessunit = IfcDerivedUnitEnum.LINEARSTIFFNESSUNIT +linearvelocityunit = IfcDerivedUnitEnum.LINEARVELOCITYUNIT +luminousintensitydistributionunit = IfcDerivedUnitEnum.LUMINOUSINTENSITYDISTRIBUTIONUNIT +massdensityunit = IfcDerivedUnitEnum.MASSDENSITYUNIT +massflowrateunit = IfcDerivedUnitEnum.MASSFLOWRATEUNIT +massperlengthunit = IfcDerivedUnitEnum.MASSPERLENGTHUNIT +modulusofelasticityunit = IfcDerivedUnitEnum.MODULUSOFELASTICITYUNIT +modulusoflinearsubgradereactionunit = IfcDerivedUnitEnum.MODULUSOFLINEARSUBGRADEREACTIONUNIT +modulusofrotationalsubgradereactionunit = IfcDerivedUnitEnum.MODULUSOFROTATIONALSUBGRADEREACTIONUNIT +modulusofsubgradereactionunit = IfcDerivedUnitEnum.MODULUSOFSUBGRADEREACTIONUNIT +moisturediffusivityunit = IfcDerivedUnitEnum.MOISTUREDIFFUSIVITYUNIT +molecularweightunit = IfcDerivedUnitEnum.MOLECULARWEIGHTUNIT +momentofinertiaunit = IfcDerivedUnitEnum.MOMENTOFINERTIAUNIT +phunit = IfcDerivedUnitEnum.PHUNIT +planarforceunit = IfcDerivedUnitEnum.PLANARFORCEUNIT +rotationalfrequencyunit = IfcDerivedUnitEnum.ROTATIONALFREQUENCYUNIT +rotationalmassunit = IfcDerivedUnitEnum.ROTATIONALMASSUNIT +rotationalstiffnessunit = IfcDerivedUnitEnum.ROTATIONALSTIFFNESSUNIT +sectionareaintegralunit = IfcDerivedUnitEnum.SECTIONAREAINTEGRALUNIT +sectionmodulusunit = IfcDerivedUnitEnum.SECTIONMODULUSUNIT +shearmodulusunit = IfcDerivedUnitEnum.SHEARMODULUSUNIT +soundpowerlevelunit = IfcDerivedUnitEnum.SOUNDPOWERLEVELUNIT +soundpowerunit = IfcDerivedUnitEnum.SOUNDPOWERUNIT +soundpressurelevelunit = IfcDerivedUnitEnum.SOUNDPRESSURELEVELUNIT +soundpressureunit = IfcDerivedUnitEnum.SOUNDPRESSUREUNIT +specificheatcapacityunit = IfcDerivedUnitEnum.SPECIFICHEATCAPACITYUNIT +temperaturegradientunit = IfcDerivedUnitEnum.TEMPERATUREGRADIENTUNIT +temperaturerateofchangeunit = IfcDerivedUnitEnum.TEMPERATURERATEOFCHANGEUNIT +thermaladmittanceunit = IfcDerivedUnitEnum.THERMALADMITTANCEUNIT +thermalconductanceunit = IfcDerivedUnitEnum.THERMALCONDUCTANCEUNIT +thermalexpansioncoefficientunit = IfcDerivedUnitEnum.THERMALEXPANSIONCOEFFICIENTUNIT +thermalresistanceunit = IfcDerivedUnitEnum.THERMALRESISTANCEUNIT +thermaltransmittanceunit = IfcDerivedUnitEnum.THERMALTRANSMITTANCEUNIT +torqueunit = IfcDerivedUnitEnum.TORQUEUNIT +vaporpermeabilityunit = IfcDerivedUnitEnum.VAPORPERMEABILITYUNIT +volumetricflowrateunit = IfcDerivedUnitEnum.VOLUMETRICFLOWRATEUNIT +warpingconstantunit = IfcDerivedUnitEnum.WARPINGCONSTANTUNIT +warpingmomentunit = IfcDerivedUnitEnum.WARPINGMOMENTUNIT +userdefined = IfcDerivedUnitEnum.USERDEFINED IfcDirectionSenseEnum = enum_namespace() -negative = express_getattr(IfcDirectionSenseEnum, 'NEGATIVE', INDETERMINATE) -positive = express_getattr(IfcDirectionSenseEnum, 'POSITIVE', INDETERMINATE) +negative = IfcDirectionSenseEnum.NEGATIVE +positive = IfcDirectionSenseEnum.POSITIVE IfcDiscreteAccessoryTypeEnum = enum_namespace() -anchorplate = express_getattr(IfcDiscreteAccessoryTypeEnum, 'ANCHORPLATE', INDETERMINATE) -birdprotection = express_getattr(IfcDiscreteAccessoryTypeEnum, 'BIRDPROTECTION', INDETERMINATE) -bracket = express_getattr(IfcDiscreteAccessoryTypeEnum, 'BRACKET', INDETERMINATE) -cablearranger = express_getattr(IfcDiscreteAccessoryTypeEnum, 'CABLEARRANGER', INDETERMINATE) -elastic_cushion = express_getattr(IfcDiscreteAccessoryTypeEnum, 'ELASTIC_CUSHION', INDETERMINATE) -expansion_joint_device = express_getattr(IfcDiscreteAccessoryTypeEnum, 'EXPANSION_JOINT_DEVICE', INDETERMINATE) -filler = express_getattr(IfcDiscreteAccessoryTypeEnum, 'FILLER', INDETERMINATE) -flashing = express_getattr(IfcDiscreteAccessoryTypeEnum, 'FLASHING', INDETERMINATE) -insulator = express_getattr(IfcDiscreteAccessoryTypeEnum, 'INSULATOR', INDETERMINATE) -lock = express_getattr(IfcDiscreteAccessoryTypeEnum, 'LOCK', INDETERMINATE) -panel_strengthening = express_getattr(IfcDiscreteAccessoryTypeEnum, 'PANEL_STRENGTHENING', INDETERMINATE) -pointmachinemountingdevice = express_getattr(IfcDiscreteAccessoryTypeEnum, 'POINTMACHINEMOUNTINGDEVICE', INDETERMINATE) -point_machine_locking_device = express_getattr(IfcDiscreteAccessoryTypeEnum, 'POINT_MACHINE_LOCKING_DEVICE', INDETERMINATE) -railbrace = express_getattr(IfcDiscreteAccessoryTypeEnum, 'RAILBRACE', INDETERMINATE) -railpad = express_getattr(IfcDiscreteAccessoryTypeEnum, 'RAILPAD', INDETERMINATE) -rail_lubrication = express_getattr(IfcDiscreteAccessoryTypeEnum, 'RAIL_LUBRICATION', INDETERMINATE) -rail_mechanical_equipment = express_getattr(IfcDiscreteAccessoryTypeEnum, 'RAIL_MECHANICAL_EQUIPMENT', INDETERMINATE) -shoe = express_getattr(IfcDiscreteAccessoryTypeEnum, 'SHOE', INDETERMINATE) -slidingchair = express_getattr(IfcDiscreteAccessoryTypeEnum, 'SLIDINGCHAIR', INDETERMINATE) -soundabsorption = express_getattr(IfcDiscreteAccessoryTypeEnum, 'SOUNDABSORPTION', INDETERMINATE) -tensioningequipment = express_getattr(IfcDiscreteAccessoryTypeEnum, 'TENSIONINGEQUIPMENT', INDETERMINATE) -userdefined = express_getattr(IfcDiscreteAccessoryTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDiscreteAccessoryTypeEnum, 'NOTDEFINED', INDETERMINATE) +anchorplate = IfcDiscreteAccessoryTypeEnum.ANCHORPLATE +birdprotection = IfcDiscreteAccessoryTypeEnum.BIRDPROTECTION +bracket = IfcDiscreteAccessoryTypeEnum.BRACKET +cablearranger = IfcDiscreteAccessoryTypeEnum.CABLEARRANGER +elastic_cushion = IfcDiscreteAccessoryTypeEnum.ELASTIC_CUSHION +expansion_joint_device = IfcDiscreteAccessoryTypeEnum.EXPANSION_JOINT_DEVICE +filler = IfcDiscreteAccessoryTypeEnum.FILLER +flashing = IfcDiscreteAccessoryTypeEnum.FLASHING +insulator = IfcDiscreteAccessoryTypeEnum.INSULATOR +lock = IfcDiscreteAccessoryTypeEnum.LOCK +panel_strengthening = IfcDiscreteAccessoryTypeEnum.PANEL_STRENGTHENING +pointmachinemountingdevice = IfcDiscreteAccessoryTypeEnum.POINTMACHINEMOUNTINGDEVICE +point_machine_locking_device = IfcDiscreteAccessoryTypeEnum.POINT_MACHINE_LOCKING_DEVICE +railbrace = IfcDiscreteAccessoryTypeEnum.RAILBRACE +railpad = IfcDiscreteAccessoryTypeEnum.RAILPAD +rail_lubrication = IfcDiscreteAccessoryTypeEnum.RAIL_LUBRICATION +rail_mechanical_equipment = IfcDiscreteAccessoryTypeEnum.RAIL_MECHANICAL_EQUIPMENT +shoe = IfcDiscreteAccessoryTypeEnum.SHOE +slidingchair = IfcDiscreteAccessoryTypeEnum.SLIDINGCHAIR +soundabsorption = IfcDiscreteAccessoryTypeEnum.SOUNDABSORPTION +tensioningequipment = IfcDiscreteAccessoryTypeEnum.TENSIONINGEQUIPMENT +userdefined = IfcDiscreteAccessoryTypeEnum.USERDEFINED +notdefined = IfcDiscreteAccessoryTypeEnum.NOTDEFINED IfcDistributionBoardTypeEnum = enum_namespace() -consumerunit = express_getattr(IfcDistributionBoardTypeEnum, 'CONSUMERUNIT', INDETERMINATE) -dispatchingboard = express_getattr(IfcDistributionBoardTypeEnum, 'DISPATCHINGBOARD', INDETERMINATE) -distributionboard = express_getattr(IfcDistributionBoardTypeEnum, 'DISTRIBUTIONBOARD', INDETERMINATE) -distributionframe = express_getattr(IfcDistributionBoardTypeEnum, 'DISTRIBUTIONFRAME', INDETERMINATE) -motorcontrolcentre = express_getattr(IfcDistributionBoardTypeEnum, 'MOTORCONTROLCENTRE', INDETERMINATE) -switchboard = express_getattr(IfcDistributionBoardTypeEnum, 'SWITCHBOARD', INDETERMINATE) -userdefined = express_getattr(IfcDistributionBoardTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDistributionBoardTypeEnum, 'NOTDEFINED', INDETERMINATE) +consumerunit = IfcDistributionBoardTypeEnum.CONSUMERUNIT +dispatchingboard = IfcDistributionBoardTypeEnum.DISPATCHINGBOARD +distributionboard = IfcDistributionBoardTypeEnum.DISTRIBUTIONBOARD +distributionframe = IfcDistributionBoardTypeEnum.DISTRIBUTIONFRAME +motorcontrolcentre = IfcDistributionBoardTypeEnum.MOTORCONTROLCENTRE +switchboard = IfcDistributionBoardTypeEnum.SWITCHBOARD +userdefined = IfcDistributionBoardTypeEnum.USERDEFINED +notdefined = IfcDistributionBoardTypeEnum.NOTDEFINED IfcDistributionChamberElementTypeEnum = enum_namespace() -formedduct = express_getattr(IfcDistributionChamberElementTypeEnum, 'FORMEDDUCT', INDETERMINATE) -inspectionchamber = express_getattr(IfcDistributionChamberElementTypeEnum, 'INSPECTIONCHAMBER', INDETERMINATE) -inspectionpit = express_getattr(IfcDistributionChamberElementTypeEnum, 'INSPECTIONPIT', INDETERMINATE) -manhole = express_getattr(IfcDistributionChamberElementTypeEnum, 'MANHOLE', INDETERMINATE) -meterchamber = express_getattr(IfcDistributionChamberElementTypeEnum, 'METERCHAMBER', INDETERMINATE) -sump = express_getattr(IfcDistributionChamberElementTypeEnum, 'SUMP', INDETERMINATE) -trench = express_getattr(IfcDistributionChamberElementTypeEnum, 'TRENCH', INDETERMINATE) -valvechamber = express_getattr(IfcDistributionChamberElementTypeEnum, 'VALVECHAMBER', INDETERMINATE) -userdefined = express_getattr(IfcDistributionChamberElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDistributionChamberElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +formedduct = IfcDistributionChamberElementTypeEnum.FORMEDDUCT +inspectionchamber = IfcDistributionChamberElementTypeEnum.INSPECTIONCHAMBER +inspectionpit = IfcDistributionChamberElementTypeEnum.INSPECTIONPIT +manhole = IfcDistributionChamberElementTypeEnum.MANHOLE +meterchamber = IfcDistributionChamberElementTypeEnum.METERCHAMBER +sump = IfcDistributionChamberElementTypeEnum.SUMP +trench = IfcDistributionChamberElementTypeEnum.TRENCH +valvechamber = IfcDistributionChamberElementTypeEnum.VALVECHAMBER +userdefined = IfcDistributionChamberElementTypeEnum.USERDEFINED +notdefined = IfcDistributionChamberElementTypeEnum.NOTDEFINED IfcDistributionPortTypeEnum = enum_namespace() -cable = express_getattr(IfcDistributionPortTypeEnum, 'CABLE', INDETERMINATE) -cablecarrier = express_getattr(IfcDistributionPortTypeEnum, 'CABLECARRIER', INDETERMINATE) -duct = express_getattr(IfcDistributionPortTypeEnum, 'DUCT', INDETERMINATE) -pipe = express_getattr(IfcDistributionPortTypeEnum, 'PIPE', INDETERMINATE) -wireless = express_getattr(IfcDistributionPortTypeEnum, 'WIRELESS', INDETERMINATE) -userdefined = express_getattr(IfcDistributionPortTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDistributionPortTypeEnum, 'NOTDEFINED', INDETERMINATE) +cable = IfcDistributionPortTypeEnum.CABLE +cablecarrier = IfcDistributionPortTypeEnum.CABLECARRIER +duct = IfcDistributionPortTypeEnum.DUCT +pipe = IfcDistributionPortTypeEnum.PIPE +wireless = IfcDistributionPortTypeEnum.WIRELESS +userdefined = IfcDistributionPortTypeEnum.USERDEFINED +notdefined = IfcDistributionPortTypeEnum.NOTDEFINED IfcDistributionSystemEnum = enum_namespace() -airconditioning = express_getattr(IfcDistributionSystemEnum, 'AIRCONDITIONING', INDETERMINATE) -audiovisual = express_getattr(IfcDistributionSystemEnum, 'AUDIOVISUAL', INDETERMINATE) -catenary_system = express_getattr(IfcDistributionSystemEnum, 'CATENARY_SYSTEM', INDETERMINATE) -chemical = express_getattr(IfcDistributionSystemEnum, 'CHEMICAL', INDETERMINATE) -chilledwater = express_getattr(IfcDistributionSystemEnum, 'CHILLEDWATER', INDETERMINATE) -communication = express_getattr(IfcDistributionSystemEnum, 'COMMUNICATION', INDETERMINATE) -compressedair = express_getattr(IfcDistributionSystemEnum, 'COMPRESSEDAIR', INDETERMINATE) -condenserwater = express_getattr(IfcDistributionSystemEnum, 'CONDENSERWATER', INDETERMINATE) -control = express_getattr(IfcDistributionSystemEnum, 'CONTROL', INDETERMINATE) -conveying = express_getattr(IfcDistributionSystemEnum, 'CONVEYING', INDETERMINATE) -data = express_getattr(IfcDistributionSystemEnum, 'DATA', INDETERMINATE) -disposal = express_getattr(IfcDistributionSystemEnum, 'DISPOSAL', INDETERMINATE) -domesticcoldwater = express_getattr(IfcDistributionSystemEnum, 'DOMESTICCOLDWATER', INDETERMINATE) -domestichotwater = express_getattr(IfcDistributionSystemEnum, 'DOMESTICHOTWATER', INDETERMINATE) -drainage = express_getattr(IfcDistributionSystemEnum, 'DRAINAGE', INDETERMINATE) -earthing = express_getattr(IfcDistributionSystemEnum, 'EARTHING', INDETERMINATE) -electrical = express_getattr(IfcDistributionSystemEnum, 'ELECTRICAL', INDETERMINATE) -electroacoustic = express_getattr(IfcDistributionSystemEnum, 'ELECTROACOUSTIC', INDETERMINATE) -exhaust = express_getattr(IfcDistributionSystemEnum, 'EXHAUST', INDETERMINATE) -fireprotection = express_getattr(IfcDistributionSystemEnum, 'FIREPROTECTION', INDETERMINATE) -fixedtransmissionnetwork = express_getattr(IfcDistributionSystemEnum, 'FIXEDTRANSMISSIONNETWORK', INDETERMINATE) -fuel = express_getattr(IfcDistributionSystemEnum, 'FUEL', INDETERMINATE) -gas = express_getattr(IfcDistributionSystemEnum, 'GAS', INDETERMINATE) -hazardous = express_getattr(IfcDistributionSystemEnum, 'HAZARDOUS', INDETERMINATE) -heating = express_getattr(IfcDistributionSystemEnum, 'HEATING', INDETERMINATE) -lighting = express_getattr(IfcDistributionSystemEnum, 'LIGHTING', INDETERMINATE) -lightningprotection = express_getattr(IfcDistributionSystemEnum, 'LIGHTNINGPROTECTION', INDETERMINATE) -mobilenetwork = express_getattr(IfcDistributionSystemEnum, 'MOBILENETWORK', INDETERMINATE) -monitoringsystem = express_getattr(IfcDistributionSystemEnum, 'MONITORINGSYSTEM', INDETERMINATE) -municipalsolidwaste = express_getattr(IfcDistributionSystemEnum, 'MUNICIPALSOLIDWASTE', INDETERMINATE) -oil = express_getattr(IfcDistributionSystemEnum, 'OIL', INDETERMINATE) -operational = express_getattr(IfcDistributionSystemEnum, 'OPERATIONAL', INDETERMINATE) -operationaltelephonysystem = express_getattr(IfcDistributionSystemEnum, 'OPERATIONALTELEPHONYSYSTEM', INDETERMINATE) -overhead_contactline_system = express_getattr(IfcDistributionSystemEnum, 'OVERHEAD_CONTACTLINE_SYSTEM', INDETERMINATE) -powergeneration = express_getattr(IfcDistributionSystemEnum, 'POWERGENERATION', INDETERMINATE) -rainwater = express_getattr(IfcDistributionSystemEnum, 'RAINWATER', INDETERMINATE) -refrigeration = express_getattr(IfcDistributionSystemEnum, 'REFRIGERATION', INDETERMINATE) -return_circuit = express_getattr(IfcDistributionSystemEnum, 'RETURN_CIRCUIT', INDETERMINATE) -security = express_getattr(IfcDistributionSystemEnum, 'SECURITY', INDETERMINATE) -sewage = express_getattr(IfcDistributionSystemEnum, 'SEWAGE', INDETERMINATE) -signal = express_getattr(IfcDistributionSystemEnum, 'SIGNAL', INDETERMINATE) -stormwater = express_getattr(IfcDistributionSystemEnum, 'STORMWATER', INDETERMINATE) -telephone = express_getattr(IfcDistributionSystemEnum, 'TELEPHONE', INDETERMINATE) -tv = express_getattr(IfcDistributionSystemEnum, 'TV', INDETERMINATE) -vacuum = express_getattr(IfcDistributionSystemEnum, 'VACUUM', INDETERMINATE) -vent = express_getattr(IfcDistributionSystemEnum, 'VENT', INDETERMINATE) -ventilation = express_getattr(IfcDistributionSystemEnum, 'VENTILATION', INDETERMINATE) -wastewater = express_getattr(IfcDistributionSystemEnum, 'WASTEWATER', INDETERMINATE) -watersupply = express_getattr(IfcDistributionSystemEnum, 'WATERSUPPLY', INDETERMINATE) -userdefined = express_getattr(IfcDistributionSystemEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDistributionSystemEnum, 'NOTDEFINED', INDETERMINATE) +airconditioning = IfcDistributionSystemEnum.AIRCONDITIONING +audiovisual = IfcDistributionSystemEnum.AUDIOVISUAL +catenary_system = IfcDistributionSystemEnum.CATENARY_SYSTEM +chemical = IfcDistributionSystemEnum.CHEMICAL +chilledwater = IfcDistributionSystemEnum.CHILLEDWATER +communication = IfcDistributionSystemEnum.COMMUNICATION +compressedair = IfcDistributionSystemEnum.COMPRESSEDAIR +condenserwater = IfcDistributionSystemEnum.CONDENSERWATER +control = IfcDistributionSystemEnum.CONTROL +conveying = IfcDistributionSystemEnum.CONVEYING +data = IfcDistributionSystemEnum.DATA +disposal = IfcDistributionSystemEnum.DISPOSAL +domesticcoldwater = IfcDistributionSystemEnum.DOMESTICCOLDWATER +domestichotwater = IfcDistributionSystemEnum.DOMESTICHOTWATER +drainage = IfcDistributionSystemEnum.DRAINAGE +earthing = IfcDistributionSystemEnum.EARTHING +electrical = IfcDistributionSystemEnum.ELECTRICAL +electroacoustic = IfcDistributionSystemEnum.ELECTROACOUSTIC +exhaust = IfcDistributionSystemEnum.EXHAUST +fireprotection = IfcDistributionSystemEnum.FIREPROTECTION +fixedtransmissionnetwork = IfcDistributionSystemEnum.FIXEDTRANSMISSIONNETWORK +fuel = IfcDistributionSystemEnum.FUEL +gas = IfcDistributionSystemEnum.GAS +hazardous = IfcDistributionSystemEnum.HAZARDOUS +heating = IfcDistributionSystemEnum.HEATING +lighting = IfcDistributionSystemEnum.LIGHTING +lightningprotection = IfcDistributionSystemEnum.LIGHTNINGPROTECTION +mobilenetwork = IfcDistributionSystemEnum.MOBILENETWORK +monitoringsystem = IfcDistributionSystemEnum.MONITORINGSYSTEM +municipalsolidwaste = IfcDistributionSystemEnum.MUNICIPALSOLIDWASTE +oil = IfcDistributionSystemEnum.OIL +operational = IfcDistributionSystemEnum.OPERATIONAL +operationaltelephonysystem = IfcDistributionSystemEnum.OPERATIONALTELEPHONYSYSTEM +overhead_contactline_system = IfcDistributionSystemEnum.OVERHEAD_CONTACTLINE_SYSTEM +powergeneration = IfcDistributionSystemEnum.POWERGENERATION +rainwater = IfcDistributionSystemEnum.RAINWATER +refrigeration = IfcDistributionSystemEnum.REFRIGERATION +return_circuit = IfcDistributionSystemEnum.RETURN_CIRCUIT +security = IfcDistributionSystemEnum.SECURITY +sewage = IfcDistributionSystemEnum.SEWAGE +signal = IfcDistributionSystemEnum.SIGNAL +stormwater = IfcDistributionSystemEnum.STORMWATER +telephone = IfcDistributionSystemEnum.TELEPHONE +tv = IfcDistributionSystemEnum.TV +vacuum = IfcDistributionSystemEnum.VACUUM +vent = IfcDistributionSystemEnum.VENT +ventilation = IfcDistributionSystemEnum.VENTILATION +wastewater = IfcDistributionSystemEnum.WASTEWATER +watersupply = IfcDistributionSystemEnum.WATERSUPPLY +userdefined = IfcDistributionSystemEnum.USERDEFINED +notdefined = IfcDistributionSystemEnum.NOTDEFINED IfcDocumentConfidentialityEnum = enum_namespace() -confidential = express_getattr(IfcDocumentConfidentialityEnum, 'CONFIDENTIAL', INDETERMINATE) -personal = express_getattr(IfcDocumentConfidentialityEnum, 'PERSONAL', INDETERMINATE) -public = express_getattr(IfcDocumentConfidentialityEnum, 'PUBLIC', INDETERMINATE) -restricted = express_getattr(IfcDocumentConfidentialityEnum, 'RESTRICTED', INDETERMINATE) -userdefined = express_getattr(IfcDocumentConfidentialityEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDocumentConfidentialityEnum, 'NOTDEFINED', INDETERMINATE) +confidential = IfcDocumentConfidentialityEnum.CONFIDENTIAL +personal = IfcDocumentConfidentialityEnum.PERSONAL +public = IfcDocumentConfidentialityEnum.PUBLIC +restricted = IfcDocumentConfidentialityEnum.RESTRICTED +userdefined = IfcDocumentConfidentialityEnum.USERDEFINED +notdefined = IfcDocumentConfidentialityEnum.NOTDEFINED IfcDocumentStatusEnum = enum_namespace() -draft = express_getattr(IfcDocumentStatusEnum, 'DRAFT', INDETERMINATE) -final = express_getattr(IfcDocumentStatusEnum, 'FINAL', INDETERMINATE) -finaldraft = express_getattr(IfcDocumentStatusEnum, 'FINALDRAFT', INDETERMINATE) -revision = express_getattr(IfcDocumentStatusEnum, 'REVISION', INDETERMINATE) -notdefined = express_getattr(IfcDocumentStatusEnum, 'NOTDEFINED', INDETERMINATE) +draft = IfcDocumentStatusEnum.DRAFT +final = IfcDocumentStatusEnum.FINAL +finaldraft = IfcDocumentStatusEnum.FINALDRAFT +revision = IfcDocumentStatusEnum.REVISION +notdefined = IfcDocumentStatusEnum.NOTDEFINED IfcDoorPanelOperationEnum = enum_namespace() -double_acting = express_getattr(IfcDoorPanelOperationEnum, 'DOUBLE_ACTING', INDETERMINATE) -fixedpanel = express_getattr(IfcDoorPanelOperationEnum, 'FIXEDPANEL', INDETERMINATE) -folding = express_getattr(IfcDoorPanelOperationEnum, 'FOLDING', INDETERMINATE) -revolving = express_getattr(IfcDoorPanelOperationEnum, 'REVOLVING', INDETERMINATE) -rollingup = express_getattr(IfcDoorPanelOperationEnum, 'ROLLINGUP', INDETERMINATE) -sliding = express_getattr(IfcDoorPanelOperationEnum, 'SLIDING', INDETERMINATE) -swinging = express_getattr(IfcDoorPanelOperationEnum, 'SWINGING', INDETERMINATE) -userdefined = express_getattr(IfcDoorPanelOperationEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDoorPanelOperationEnum, 'NOTDEFINED', INDETERMINATE) +double_acting = IfcDoorPanelOperationEnum.DOUBLE_ACTING +fixedpanel = IfcDoorPanelOperationEnum.FIXEDPANEL +folding = IfcDoorPanelOperationEnum.FOLDING +revolving = IfcDoorPanelOperationEnum.REVOLVING +rollingup = IfcDoorPanelOperationEnum.ROLLINGUP +sliding = IfcDoorPanelOperationEnum.SLIDING +swinging = IfcDoorPanelOperationEnum.SWINGING +userdefined = IfcDoorPanelOperationEnum.USERDEFINED +notdefined = IfcDoorPanelOperationEnum.NOTDEFINED IfcDoorPanelPositionEnum = enum_namespace() -left = express_getattr(IfcDoorPanelPositionEnum, 'LEFT', INDETERMINATE) -middle = express_getattr(IfcDoorPanelPositionEnum, 'MIDDLE', INDETERMINATE) -right = express_getattr(IfcDoorPanelPositionEnum, 'RIGHT', INDETERMINATE) -notdefined = express_getattr(IfcDoorPanelPositionEnum, 'NOTDEFINED', INDETERMINATE) +left = IfcDoorPanelPositionEnum.LEFT +middle = IfcDoorPanelPositionEnum.MIDDLE +right = IfcDoorPanelPositionEnum.RIGHT +notdefined = IfcDoorPanelPositionEnum.NOTDEFINED IfcDoorStyleConstructionEnum = enum_namespace() -aluminium = express_getattr(IfcDoorStyleConstructionEnum, 'ALUMINIUM', INDETERMINATE) -aluminium_plastic = express_getattr(IfcDoorStyleConstructionEnum, 'ALUMINIUM_PLASTIC', INDETERMINATE) -aluminium_wood = express_getattr(IfcDoorStyleConstructionEnum, 'ALUMINIUM_WOOD', INDETERMINATE) -high_grade_steel = express_getattr(IfcDoorStyleConstructionEnum, 'HIGH_GRADE_STEEL', INDETERMINATE) -plastic = express_getattr(IfcDoorStyleConstructionEnum, 'PLASTIC', INDETERMINATE) -steel = express_getattr(IfcDoorStyleConstructionEnum, 'STEEL', INDETERMINATE) -wood = express_getattr(IfcDoorStyleConstructionEnum, 'WOOD', INDETERMINATE) -userdefined = express_getattr(IfcDoorStyleConstructionEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDoorStyleConstructionEnum, 'NOTDEFINED', INDETERMINATE) +aluminium = IfcDoorStyleConstructionEnum.ALUMINIUM +aluminium_plastic = IfcDoorStyleConstructionEnum.ALUMINIUM_PLASTIC +aluminium_wood = IfcDoorStyleConstructionEnum.ALUMINIUM_WOOD +high_grade_steel = IfcDoorStyleConstructionEnum.HIGH_GRADE_STEEL +plastic = IfcDoorStyleConstructionEnum.PLASTIC +steel = IfcDoorStyleConstructionEnum.STEEL +wood = IfcDoorStyleConstructionEnum.WOOD +userdefined = IfcDoorStyleConstructionEnum.USERDEFINED +notdefined = IfcDoorStyleConstructionEnum.NOTDEFINED IfcDoorStyleOperationEnum = enum_namespace() -double_door_double_swing = express_getattr(IfcDoorStyleOperationEnum, 'DOUBLE_DOOR_DOUBLE_SWING', INDETERMINATE) -double_door_folding = express_getattr(IfcDoorStyleOperationEnum, 'DOUBLE_DOOR_FOLDING', INDETERMINATE) -double_door_single_swing = express_getattr(IfcDoorStyleOperationEnum, 'DOUBLE_DOOR_SINGLE_SWING', INDETERMINATE) -double_door_single_swing_opposite_left = express_getattr(IfcDoorStyleOperationEnum, 'DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_LEFT', INDETERMINATE) -double_door_single_swing_opposite_right = express_getattr(IfcDoorStyleOperationEnum, 'DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_RIGHT', INDETERMINATE) -double_door_sliding = express_getattr(IfcDoorStyleOperationEnum, 'DOUBLE_DOOR_SLIDING', INDETERMINATE) -double_swing_left = express_getattr(IfcDoorStyleOperationEnum, 'DOUBLE_SWING_LEFT', INDETERMINATE) -double_swing_right = express_getattr(IfcDoorStyleOperationEnum, 'DOUBLE_SWING_RIGHT', INDETERMINATE) -folding_to_left = express_getattr(IfcDoorStyleOperationEnum, 'FOLDING_TO_LEFT', INDETERMINATE) -folding_to_right = express_getattr(IfcDoorStyleOperationEnum, 'FOLDING_TO_RIGHT', INDETERMINATE) -revolving = express_getattr(IfcDoorStyleOperationEnum, 'REVOLVING', INDETERMINATE) -rollingup = express_getattr(IfcDoorStyleOperationEnum, 'ROLLINGUP', INDETERMINATE) -single_swing_left = express_getattr(IfcDoorStyleOperationEnum, 'SINGLE_SWING_LEFT', INDETERMINATE) -single_swing_right = express_getattr(IfcDoorStyleOperationEnum, 'SINGLE_SWING_RIGHT', INDETERMINATE) -sliding_to_left = express_getattr(IfcDoorStyleOperationEnum, 'SLIDING_TO_LEFT', INDETERMINATE) -sliding_to_right = express_getattr(IfcDoorStyleOperationEnum, 'SLIDING_TO_RIGHT', INDETERMINATE) -userdefined = express_getattr(IfcDoorStyleOperationEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDoorStyleOperationEnum, 'NOTDEFINED', INDETERMINATE) +double_door_double_swing = IfcDoorStyleOperationEnum.DOUBLE_DOOR_DOUBLE_SWING +double_door_folding = IfcDoorStyleOperationEnum.DOUBLE_DOOR_FOLDING +double_door_single_swing = IfcDoorStyleOperationEnum.DOUBLE_DOOR_SINGLE_SWING +double_door_single_swing_opposite_left = IfcDoorStyleOperationEnum.DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_LEFT +double_door_single_swing_opposite_right = IfcDoorStyleOperationEnum.DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_RIGHT +double_door_sliding = IfcDoorStyleOperationEnum.DOUBLE_DOOR_SLIDING +double_swing_left = IfcDoorStyleOperationEnum.DOUBLE_SWING_LEFT +double_swing_right = IfcDoorStyleOperationEnum.DOUBLE_SWING_RIGHT +folding_to_left = IfcDoorStyleOperationEnum.FOLDING_TO_LEFT +folding_to_right = IfcDoorStyleOperationEnum.FOLDING_TO_RIGHT +revolving = IfcDoorStyleOperationEnum.REVOLVING +rollingup = IfcDoorStyleOperationEnum.ROLLINGUP +single_swing_left = IfcDoorStyleOperationEnum.SINGLE_SWING_LEFT +single_swing_right = IfcDoorStyleOperationEnum.SINGLE_SWING_RIGHT +sliding_to_left = IfcDoorStyleOperationEnum.SLIDING_TO_LEFT +sliding_to_right = IfcDoorStyleOperationEnum.SLIDING_TO_RIGHT +userdefined = IfcDoorStyleOperationEnum.USERDEFINED +notdefined = IfcDoorStyleOperationEnum.NOTDEFINED IfcDoorTypeEnum = enum_namespace() -boom_barrier = express_getattr(IfcDoorTypeEnum, 'BOOM_BARRIER', INDETERMINATE) -door = express_getattr(IfcDoorTypeEnum, 'DOOR', INDETERMINATE) -gate = express_getattr(IfcDoorTypeEnum, 'GATE', INDETERMINATE) -trapdoor = express_getattr(IfcDoorTypeEnum, 'TRAPDOOR', INDETERMINATE) -turnstile = express_getattr(IfcDoorTypeEnum, 'TURNSTILE', INDETERMINATE) -userdefined = express_getattr(IfcDoorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDoorTypeEnum, 'NOTDEFINED', INDETERMINATE) +boom_barrier = IfcDoorTypeEnum.BOOM_BARRIER +door = IfcDoorTypeEnum.DOOR +gate = IfcDoorTypeEnum.GATE +trapdoor = IfcDoorTypeEnum.TRAPDOOR +turnstile = IfcDoorTypeEnum.TURNSTILE +userdefined = IfcDoorTypeEnum.USERDEFINED +notdefined = IfcDoorTypeEnum.NOTDEFINED IfcDoorTypeOperationEnum = enum_namespace() -double_panel_double_swing = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_PANEL_DOUBLE_SWING', INDETERMINATE) -double_panel_folding = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_PANEL_FOLDING', INDETERMINATE) -double_panel_lifting_vertical = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_PANEL_LIFTING_VERTICAL', INDETERMINATE) -double_panel_single_swing = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_PANEL_SINGLE_SWING', INDETERMINATE) -double_panel_single_swing_opposite_left = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_PANEL_SINGLE_SWING_OPPOSITE_LEFT', INDETERMINATE) -double_panel_single_swing_opposite_right = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_PANEL_SINGLE_SWING_OPPOSITE_RIGHT', INDETERMINATE) -double_panel_sliding = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_PANEL_SLIDING', INDETERMINATE) -double_swing_left = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_SWING_LEFT', INDETERMINATE) -double_swing_right = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_SWING_RIGHT', INDETERMINATE) -folding_to_left = express_getattr(IfcDoorTypeOperationEnum, 'FOLDING_TO_LEFT', INDETERMINATE) -folding_to_right = express_getattr(IfcDoorTypeOperationEnum, 'FOLDING_TO_RIGHT', INDETERMINATE) -lifting_horizontal = express_getattr(IfcDoorTypeOperationEnum, 'LIFTING_HORIZONTAL', INDETERMINATE) -lifting_vertical_left = express_getattr(IfcDoorTypeOperationEnum, 'LIFTING_VERTICAL_LEFT', INDETERMINATE) -lifting_vertical_right = express_getattr(IfcDoorTypeOperationEnum, 'LIFTING_VERTICAL_RIGHT', INDETERMINATE) -revolving_horizontal = express_getattr(IfcDoorTypeOperationEnum, 'REVOLVING_HORIZONTAL', INDETERMINATE) -revolving_vertical = express_getattr(IfcDoorTypeOperationEnum, 'REVOLVING_VERTICAL', INDETERMINATE) -rollingup = express_getattr(IfcDoorTypeOperationEnum, 'ROLLINGUP', INDETERMINATE) -single_swing_left = express_getattr(IfcDoorTypeOperationEnum, 'SINGLE_SWING_LEFT', INDETERMINATE) -single_swing_right = express_getattr(IfcDoorTypeOperationEnum, 'SINGLE_SWING_RIGHT', INDETERMINATE) -sliding_to_left = express_getattr(IfcDoorTypeOperationEnum, 'SLIDING_TO_LEFT', INDETERMINATE) -sliding_to_right = express_getattr(IfcDoorTypeOperationEnum, 'SLIDING_TO_RIGHT', INDETERMINATE) -swing_fixed_left = express_getattr(IfcDoorTypeOperationEnum, 'SWING_FIXED_LEFT', INDETERMINATE) -swing_fixed_right = express_getattr(IfcDoorTypeOperationEnum, 'SWING_FIXED_RIGHT', INDETERMINATE) -userdefined = express_getattr(IfcDoorTypeOperationEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDoorTypeOperationEnum, 'NOTDEFINED', INDETERMINATE) +double_panel_double_swing = IfcDoorTypeOperationEnum.DOUBLE_PANEL_DOUBLE_SWING +double_panel_folding = IfcDoorTypeOperationEnum.DOUBLE_PANEL_FOLDING +double_panel_lifting_vertical = IfcDoorTypeOperationEnum.DOUBLE_PANEL_LIFTING_VERTICAL +double_panel_single_swing = IfcDoorTypeOperationEnum.DOUBLE_PANEL_SINGLE_SWING +double_panel_single_swing_opposite_left = IfcDoorTypeOperationEnum.DOUBLE_PANEL_SINGLE_SWING_OPPOSITE_LEFT +double_panel_single_swing_opposite_right = IfcDoorTypeOperationEnum.DOUBLE_PANEL_SINGLE_SWING_OPPOSITE_RIGHT +double_panel_sliding = IfcDoorTypeOperationEnum.DOUBLE_PANEL_SLIDING +double_swing_left = IfcDoorTypeOperationEnum.DOUBLE_SWING_LEFT +double_swing_right = IfcDoorTypeOperationEnum.DOUBLE_SWING_RIGHT +folding_to_left = IfcDoorTypeOperationEnum.FOLDING_TO_LEFT +folding_to_right = IfcDoorTypeOperationEnum.FOLDING_TO_RIGHT +lifting_horizontal = IfcDoorTypeOperationEnum.LIFTING_HORIZONTAL +lifting_vertical_left = IfcDoorTypeOperationEnum.LIFTING_VERTICAL_LEFT +lifting_vertical_right = IfcDoorTypeOperationEnum.LIFTING_VERTICAL_RIGHT +revolving_horizontal = IfcDoorTypeOperationEnum.REVOLVING_HORIZONTAL +revolving_vertical = IfcDoorTypeOperationEnum.REVOLVING_VERTICAL +rollingup = IfcDoorTypeOperationEnum.ROLLINGUP +single_swing_left = IfcDoorTypeOperationEnum.SINGLE_SWING_LEFT +single_swing_right = IfcDoorTypeOperationEnum.SINGLE_SWING_RIGHT +sliding_to_left = IfcDoorTypeOperationEnum.SLIDING_TO_LEFT +sliding_to_right = IfcDoorTypeOperationEnum.SLIDING_TO_RIGHT +swing_fixed_left = IfcDoorTypeOperationEnum.SWING_FIXED_LEFT +swing_fixed_right = IfcDoorTypeOperationEnum.SWING_FIXED_RIGHT +userdefined = IfcDoorTypeOperationEnum.USERDEFINED +notdefined = IfcDoorTypeOperationEnum.NOTDEFINED IfcDuctFittingTypeEnum = enum_namespace() -bend = express_getattr(IfcDuctFittingTypeEnum, 'BEND', INDETERMINATE) -connector = express_getattr(IfcDuctFittingTypeEnum, 'CONNECTOR', INDETERMINATE) -entry = express_getattr(IfcDuctFittingTypeEnum, 'ENTRY', INDETERMINATE) -exit = express_getattr(IfcDuctFittingTypeEnum, 'EXIT', INDETERMINATE) -junction = express_getattr(IfcDuctFittingTypeEnum, 'JUNCTION', INDETERMINATE) -obstruction = express_getattr(IfcDuctFittingTypeEnum, 'OBSTRUCTION', INDETERMINATE) -transition = express_getattr(IfcDuctFittingTypeEnum, 'TRANSITION', INDETERMINATE) -userdefined = express_getattr(IfcDuctFittingTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDuctFittingTypeEnum, 'NOTDEFINED', INDETERMINATE) +bend = IfcDuctFittingTypeEnum.BEND +connector = IfcDuctFittingTypeEnum.CONNECTOR +entry = IfcDuctFittingTypeEnum.ENTRY +exit = IfcDuctFittingTypeEnum.EXIT +junction = IfcDuctFittingTypeEnum.JUNCTION +obstruction = IfcDuctFittingTypeEnum.OBSTRUCTION +transition = IfcDuctFittingTypeEnum.TRANSITION +userdefined = IfcDuctFittingTypeEnum.USERDEFINED +notdefined = IfcDuctFittingTypeEnum.NOTDEFINED IfcDuctSegmentTypeEnum = enum_namespace() -flexiblesegment = express_getattr(IfcDuctSegmentTypeEnum, 'FLEXIBLESEGMENT', INDETERMINATE) -rigidsegment = express_getattr(IfcDuctSegmentTypeEnum, 'RIGIDSEGMENT', INDETERMINATE) -userdefined = express_getattr(IfcDuctSegmentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDuctSegmentTypeEnum, 'NOTDEFINED', INDETERMINATE) +flexiblesegment = IfcDuctSegmentTypeEnum.FLEXIBLESEGMENT +rigidsegment = IfcDuctSegmentTypeEnum.RIGIDSEGMENT +userdefined = IfcDuctSegmentTypeEnum.USERDEFINED +notdefined = IfcDuctSegmentTypeEnum.NOTDEFINED IfcDuctSilencerTypeEnum = enum_namespace() -flatoval = express_getattr(IfcDuctSilencerTypeEnum, 'FLATOVAL', INDETERMINATE) -rectangular = express_getattr(IfcDuctSilencerTypeEnum, 'RECTANGULAR', INDETERMINATE) -round = express_getattr(IfcDuctSilencerTypeEnum, 'ROUND', INDETERMINATE) -userdefined = express_getattr(IfcDuctSilencerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDuctSilencerTypeEnum, 'NOTDEFINED', INDETERMINATE) +flatoval = IfcDuctSilencerTypeEnum.FLATOVAL +rectangular = IfcDuctSilencerTypeEnum.RECTANGULAR +round = IfcDuctSilencerTypeEnum.ROUND +userdefined = IfcDuctSilencerTypeEnum.USERDEFINED +notdefined = IfcDuctSilencerTypeEnum.NOTDEFINED IfcEarthworksCutTypeEnum = enum_namespace() -base_excavation = express_getattr(IfcEarthworksCutTypeEnum, 'BASE_EXCAVATION', INDETERMINATE) -cut = express_getattr(IfcEarthworksCutTypeEnum, 'CUT', INDETERMINATE) -dredging = express_getattr(IfcEarthworksCutTypeEnum, 'DREDGING', INDETERMINATE) -excavation = express_getattr(IfcEarthworksCutTypeEnum, 'EXCAVATION', INDETERMINATE) -overexcavation = express_getattr(IfcEarthworksCutTypeEnum, 'OVEREXCAVATION', INDETERMINATE) -pavementmilling = express_getattr(IfcEarthworksCutTypeEnum, 'PAVEMENTMILLING', INDETERMINATE) -stepexcavation = express_getattr(IfcEarthworksCutTypeEnum, 'STEPEXCAVATION', INDETERMINATE) -topsoilremoval = express_getattr(IfcEarthworksCutTypeEnum, 'TOPSOILREMOVAL', INDETERMINATE) -trench = express_getattr(IfcEarthworksCutTypeEnum, 'TRENCH', INDETERMINATE) -userdefined = express_getattr(IfcEarthworksCutTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcEarthworksCutTypeEnum, 'NOTDEFINED', INDETERMINATE) +base_excavation = IfcEarthworksCutTypeEnum.BASE_EXCAVATION +cut = IfcEarthworksCutTypeEnum.CUT +dredging = IfcEarthworksCutTypeEnum.DREDGING +excavation = IfcEarthworksCutTypeEnum.EXCAVATION +overexcavation = IfcEarthworksCutTypeEnum.OVEREXCAVATION +pavementmilling = IfcEarthworksCutTypeEnum.PAVEMENTMILLING +stepexcavation = IfcEarthworksCutTypeEnum.STEPEXCAVATION +topsoilremoval = IfcEarthworksCutTypeEnum.TOPSOILREMOVAL +trench = IfcEarthworksCutTypeEnum.TRENCH +userdefined = IfcEarthworksCutTypeEnum.USERDEFINED +notdefined = IfcEarthworksCutTypeEnum.NOTDEFINED IfcEarthworksFillTypeEnum = enum_namespace() -backfill = express_getattr(IfcEarthworksFillTypeEnum, 'BACKFILL', INDETERMINATE) -counterweight = express_getattr(IfcEarthworksFillTypeEnum, 'COUNTERWEIGHT', INDETERMINATE) -embankment = express_getattr(IfcEarthworksFillTypeEnum, 'EMBANKMENT', INDETERMINATE) -slopefill = express_getattr(IfcEarthworksFillTypeEnum, 'SLOPEFILL', INDETERMINATE) -subgrade = express_getattr(IfcEarthworksFillTypeEnum, 'SUBGRADE', INDETERMINATE) -subgradebed = express_getattr(IfcEarthworksFillTypeEnum, 'SUBGRADEBED', INDETERMINATE) -transitionsection = express_getattr(IfcEarthworksFillTypeEnum, 'TRANSITIONSECTION', INDETERMINATE) -userdefined = express_getattr(IfcEarthworksFillTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcEarthworksFillTypeEnum, 'NOTDEFINED', INDETERMINATE) +backfill = IfcEarthworksFillTypeEnum.BACKFILL +counterweight = IfcEarthworksFillTypeEnum.COUNTERWEIGHT +embankment = IfcEarthworksFillTypeEnum.EMBANKMENT +slopefill = IfcEarthworksFillTypeEnum.SLOPEFILL +subgrade = IfcEarthworksFillTypeEnum.SUBGRADE +subgradebed = IfcEarthworksFillTypeEnum.SUBGRADEBED +transitionsection = IfcEarthworksFillTypeEnum.TRANSITIONSECTION +userdefined = IfcEarthworksFillTypeEnum.USERDEFINED +notdefined = IfcEarthworksFillTypeEnum.NOTDEFINED IfcElectricApplianceTypeEnum = enum_namespace() -dishwasher = express_getattr(IfcElectricApplianceTypeEnum, 'DISHWASHER', INDETERMINATE) -electriccooker = express_getattr(IfcElectricApplianceTypeEnum, 'ELECTRICCOOKER', INDETERMINATE) -freestandingelectricheater = express_getattr(IfcElectricApplianceTypeEnum, 'FREESTANDINGELECTRICHEATER', INDETERMINATE) -freestandingfan = express_getattr(IfcElectricApplianceTypeEnum, 'FREESTANDINGFAN', INDETERMINATE) -freestandingwatercooler = express_getattr(IfcElectricApplianceTypeEnum, 'FREESTANDINGWATERCOOLER', INDETERMINATE) -freestandingwaterheater = express_getattr(IfcElectricApplianceTypeEnum, 'FREESTANDINGWATERHEATER', INDETERMINATE) -freezer = express_getattr(IfcElectricApplianceTypeEnum, 'FREEZER', INDETERMINATE) -fridge_freezer = express_getattr(IfcElectricApplianceTypeEnum, 'FRIDGE_FREEZER', INDETERMINATE) -handdryer = express_getattr(IfcElectricApplianceTypeEnum, 'HANDDRYER', INDETERMINATE) -kitchenmachine = express_getattr(IfcElectricApplianceTypeEnum, 'KITCHENMACHINE', INDETERMINATE) -microwave = express_getattr(IfcElectricApplianceTypeEnum, 'MICROWAVE', INDETERMINATE) -photocopier = express_getattr(IfcElectricApplianceTypeEnum, 'PHOTOCOPIER', INDETERMINATE) -refrigerator = express_getattr(IfcElectricApplianceTypeEnum, 'REFRIGERATOR', INDETERMINATE) -tumbledryer = express_getattr(IfcElectricApplianceTypeEnum, 'TUMBLEDRYER', INDETERMINATE) -vendingmachine = express_getattr(IfcElectricApplianceTypeEnum, 'VENDINGMACHINE', INDETERMINATE) -washingmachine = express_getattr(IfcElectricApplianceTypeEnum, 'WASHINGMACHINE', INDETERMINATE) -userdefined = express_getattr(IfcElectricApplianceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcElectricApplianceTypeEnum, 'NOTDEFINED', INDETERMINATE) +dishwasher = IfcElectricApplianceTypeEnum.DISHWASHER +electriccooker = IfcElectricApplianceTypeEnum.ELECTRICCOOKER +freestandingelectricheater = IfcElectricApplianceTypeEnum.FREESTANDINGELECTRICHEATER +freestandingfan = IfcElectricApplianceTypeEnum.FREESTANDINGFAN +freestandingwatercooler = IfcElectricApplianceTypeEnum.FREESTANDINGWATERCOOLER +freestandingwaterheater = IfcElectricApplianceTypeEnum.FREESTANDINGWATERHEATER +freezer = IfcElectricApplianceTypeEnum.FREEZER +fridge_freezer = IfcElectricApplianceTypeEnum.FRIDGE_FREEZER +handdryer = IfcElectricApplianceTypeEnum.HANDDRYER +kitchenmachine = IfcElectricApplianceTypeEnum.KITCHENMACHINE +microwave = IfcElectricApplianceTypeEnum.MICROWAVE +photocopier = IfcElectricApplianceTypeEnum.PHOTOCOPIER +refrigerator = IfcElectricApplianceTypeEnum.REFRIGERATOR +tumbledryer = IfcElectricApplianceTypeEnum.TUMBLEDRYER +vendingmachine = IfcElectricApplianceTypeEnum.VENDINGMACHINE +washingmachine = IfcElectricApplianceTypeEnum.WASHINGMACHINE +userdefined = IfcElectricApplianceTypeEnum.USERDEFINED +notdefined = IfcElectricApplianceTypeEnum.NOTDEFINED IfcElectricDistributionBoardTypeEnum = enum_namespace() -consumerunit = express_getattr(IfcElectricDistributionBoardTypeEnum, 'CONSUMERUNIT', INDETERMINATE) -distributionboard = express_getattr(IfcElectricDistributionBoardTypeEnum, 'DISTRIBUTIONBOARD', INDETERMINATE) -motorcontrolcentre = express_getattr(IfcElectricDistributionBoardTypeEnum, 'MOTORCONTROLCENTRE', INDETERMINATE) -switchboard = express_getattr(IfcElectricDistributionBoardTypeEnum, 'SWITCHBOARD', INDETERMINATE) -userdefined = express_getattr(IfcElectricDistributionBoardTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcElectricDistributionBoardTypeEnum, 'NOTDEFINED', INDETERMINATE) +consumerunit = IfcElectricDistributionBoardTypeEnum.CONSUMERUNIT +distributionboard = IfcElectricDistributionBoardTypeEnum.DISTRIBUTIONBOARD +motorcontrolcentre = IfcElectricDistributionBoardTypeEnum.MOTORCONTROLCENTRE +switchboard = IfcElectricDistributionBoardTypeEnum.SWITCHBOARD +userdefined = IfcElectricDistributionBoardTypeEnum.USERDEFINED +notdefined = IfcElectricDistributionBoardTypeEnum.NOTDEFINED IfcElectricFlowStorageDeviceTypeEnum = enum_namespace() -battery = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'BATTERY', INDETERMINATE) -capacitor = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'CAPACITOR', INDETERMINATE) -capacitorbank = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'CAPACITORBANK', INDETERMINATE) -compensator = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'COMPENSATOR', INDETERMINATE) -harmonicfilter = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'HARMONICFILTER', INDETERMINATE) -inductor = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'INDUCTOR', INDETERMINATE) -inductorbank = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'INDUCTORBANK', INDETERMINATE) -recharger = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'RECHARGER', INDETERMINATE) -ups = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'UPS', INDETERMINATE) -userdefined = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'NOTDEFINED', INDETERMINATE) +battery = IfcElectricFlowStorageDeviceTypeEnum.BATTERY +capacitor = IfcElectricFlowStorageDeviceTypeEnum.CAPACITOR +capacitorbank = IfcElectricFlowStorageDeviceTypeEnum.CAPACITORBANK +compensator = IfcElectricFlowStorageDeviceTypeEnum.COMPENSATOR +harmonicfilter = IfcElectricFlowStorageDeviceTypeEnum.HARMONICFILTER +inductor = IfcElectricFlowStorageDeviceTypeEnum.INDUCTOR +inductorbank = IfcElectricFlowStorageDeviceTypeEnum.INDUCTORBANK +recharger = IfcElectricFlowStorageDeviceTypeEnum.RECHARGER +ups = IfcElectricFlowStorageDeviceTypeEnum.UPS +userdefined = IfcElectricFlowStorageDeviceTypeEnum.USERDEFINED +notdefined = IfcElectricFlowStorageDeviceTypeEnum.NOTDEFINED IfcElectricFlowTreatmentDeviceTypeEnum = enum_namespace() -electronicfilter = express_getattr(IfcElectricFlowTreatmentDeviceTypeEnum, 'ELECTRONICFILTER', INDETERMINATE) -userdefined = express_getattr(IfcElectricFlowTreatmentDeviceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcElectricFlowTreatmentDeviceTypeEnum, 'NOTDEFINED', INDETERMINATE) +electronicfilter = IfcElectricFlowTreatmentDeviceTypeEnum.ELECTRONICFILTER +userdefined = IfcElectricFlowTreatmentDeviceTypeEnum.USERDEFINED +notdefined = IfcElectricFlowTreatmentDeviceTypeEnum.NOTDEFINED IfcElectricGeneratorTypeEnum = enum_namespace() -chp = express_getattr(IfcElectricGeneratorTypeEnum, 'CHP', INDETERMINATE) -enginegenerator = express_getattr(IfcElectricGeneratorTypeEnum, 'ENGINEGENERATOR', INDETERMINATE) -standalone = express_getattr(IfcElectricGeneratorTypeEnum, 'STANDALONE', INDETERMINATE) -userdefined = express_getattr(IfcElectricGeneratorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcElectricGeneratorTypeEnum, 'NOTDEFINED', INDETERMINATE) +chp = IfcElectricGeneratorTypeEnum.CHP +enginegenerator = IfcElectricGeneratorTypeEnum.ENGINEGENERATOR +standalone = IfcElectricGeneratorTypeEnum.STANDALONE +userdefined = IfcElectricGeneratorTypeEnum.USERDEFINED +notdefined = IfcElectricGeneratorTypeEnum.NOTDEFINED IfcElectricMotorTypeEnum = enum_namespace() -dc = express_getattr(IfcElectricMotorTypeEnum, 'DC', INDETERMINATE) -induction = express_getattr(IfcElectricMotorTypeEnum, 'INDUCTION', INDETERMINATE) -polyphase = express_getattr(IfcElectricMotorTypeEnum, 'POLYPHASE', INDETERMINATE) -reluctancesynchronous = express_getattr(IfcElectricMotorTypeEnum, 'RELUCTANCESYNCHRONOUS', INDETERMINATE) -synchronous = express_getattr(IfcElectricMotorTypeEnum, 'SYNCHRONOUS', INDETERMINATE) -userdefined = express_getattr(IfcElectricMotorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcElectricMotorTypeEnum, 'NOTDEFINED', INDETERMINATE) +dc = IfcElectricMotorTypeEnum.DC +induction = IfcElectricMotorTypeEnum.INDUCTION +polyphase = IfcElectricMotorTypeEnum.POLYPHASE +reluctancesynchronous = IfcElectricMotorTypeEnum.RELUCTANCESYNCHRONOUS +synchronous = IfcElectricMotorTypeEnum.SYNCHRONOUS +userdefined = IfcElectricMotorTypeEnum.USERDEFINED +notdefined = IfcElectricMotorTypeEnum.NOTDEFINED IfcElectricTimeControlTypeEnum = enum_namespace() -relay = express_getattr(IfcElectricTimeControlTypeEnum, 'RELAY', INDETERMINATE) -timeclock = express_getattr(IfcElectricTimeControlTypeEnum, 'TIMECLOCK', INDETERMINATE) -timedelay = express_getattr(IfcElectricTimeControlTypeEnum, 'TIMEDELAY', INDETERMINATE) -userdefined = express_getattr(IfcElectricTimeControlTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcElectricTimeControlTypeEnum, 'NOTDEFINED', INDETERMINATE) +relay = IfcElectricTimeControlTypeEnum.RELAY +timeclock = IfcElectricTimeControlTypeEnum.TIMECLOCK +timedelay = IfcElectricTimeControlTypeEnum.TIMEDELAY +userdefined = IfcElectricTimeControlTypeEnum.USERDEFINED +notdefined = IfcElectricTimeControlTypeEnum.NOTDEFINED IfcElementAssemblyTypeEnum = enum_namespace() -abutment = express_getattr(IfcElementAssemblyTypeEnum, 'ABUTMENT', INDETERMINATE) -accessory_assembly = express_getattr(IfcElementAssemblyTypeEnum, 'ACCESSORY_ASSEMBLY', INDETERMINATE) -arch = express_getattr(IfcElementAssemblyTypeEnum, 'ARCH', INDETERMINATE) -beam_grid = express_getattr(IfcElementAssemblyTypeEnum, 'BEAM_GRID', INDETERMINATE) -braced_frame = express_getattr(IfcElementAssemblyTypeEnum, 'BRACED_FRAME', INDETERMINATE) -cross_bracing = express_getattr(IfcElementAssemblyTypeEnum, 'CROSS_BRACING', INDETERMINATE) -deck = express_getattr(IfcElementAssemblyTypeEnum, 'DECK', INDETERMINATE) -dilatationpanel = express_getattr(IfcElementAssemblyTypeEnum, 'DILATATIONPANEL', INDETERMINATE) -entranceworks = express_getattr(IfcElementAssemblyTypeEnum, 'ENTRANCEWORKS', INDETERMINATE) -girder = express_getattr(IfcElementAssemblyTypeEnum, 'GIRDER', INDETERMINATE) -grid = express_getattr(IfcElementAssemblyTypeEnum, 'GRID', INDETERMINATE) -mast = express_getattr(IfcElementAssemblyTypeEnum, 'MAST', INDETERMINATE) -pier = express_getattr(IfcElementAssemblyTypeEnum, 'PIER', INDETERMINATE) -pylon = express_getattr(IfcElementAssemblyTypeEnum, 'PYLON', INDETERMINATE) -rail_mechanical_equipment_assembly = express_getattr(IfcElementAssemblyTypeEnum, 'RAIL_MECHANICAL_EQUIPMENT_ASSEMBLY', INDETERMINATE) -reinforcement_unit = express_getattr(IfcElementAssemblyTypeEnum, 'REINFORCEMENT_UNIT', INDETERMINATE) -rigid_frame = express_getattr(IfcElementAssemblyTypeEnum, 'RIGID_FRAME', INDETERMINATE) -shelter = express_getattr(IfcElementAssemblyTypeEnum, 'SHELTER', INDETERMINATE) -signalassembly = express_getattr(IfcElementAssemblyTypeEnum, 'SIGNALASSEMBLY', INDETERMINATE) -slab_field = express_getattr(IfcElementAssemblyTypeEnum, 'SLAB_FIELD', INDETERMINATE) -sumpbuster = express_getattr(IfcElementAssemblyTypeEnum, 'SUMPBUSTER', INDETERMINATE) -supportingassembly = express_getattr(IfcElementAssemblyTypeEnum, 'SUPPORTINGASSEMBLY', INDETERMINATE) -suspensionassembly = express_getattr(IfcElementAssemblyTypeEnum, 'SUSPENSIONASSEMBLY', INDETERMINATE) -trackpanel = express_getattr(IfcElementAssemblyTypeEnum, 'TRACKPANEL', INDETERMINATE) -traction_switching_assembly = express_getattr(IfcElementAssemblyTypeEnum, 'TRACTION_SWITCHING_ASSEMBLY', INDETERMINATE) -traffic_calming_device = express_getattr(IfcElementAssemblyTypeEnum, 'TRAFFIC_CALMING_DEVICE', INDETERMINATE) -truss = express_getattr(IfcElementAssemblyTypeEnum, 'TRUSS', INDETERMINATE) -turnoutpanel = express_getattr(IfcElementAssemblyTypeEnum, 'TURNOUTPANEL', INDETERMINATE) -userdefined = express_getattr(IfcElementAssemblyTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcElementAssemblyTypeEnum, 'NOTDEFINED', INDETERMINATE) +abutment = IfcElementAssemblyTypeEnum.ABUTMENT +accessory_assembly = IfcElementAssemblyTypeEnum.ACCESSORY_ASSEMBLY +arch = IfcElementAssemblyTypeEnum.ARCH +beam_grid = IfcElementAssemblyTypeEnum.BEAM_GRID +braced_frame = IfcElementAssemblyTypeEnum.BRACED_FRAME +cross_bracing = IfcElementAssemblyTypeEnum.CROSS_BRACING +deck = IfcElementAssemblyTypeEnum.DECK +dilatationpanel = IfcElementAssemblyTypeEnum.DILATATIONPANEL +entranceworks = IfcElementAssemblyTypeEnum.ENTRANCEWORKS +girder = IfcElementAssemblyTypeEnum.GIRDER +grid = IfcElementAssemblyTypeEnum.GRID +mast = IfcElementAssemblyTypeEnum.MAST +pier = IfcElementAssemblyTypeEnum.PIER +pylon = IfcElementAssemblyTypeEnum.PYLON +rail_mechanical_equipment_assembly = IfcElementAssemblyTypeEnum.RAIL_MECHANICAL_EQUIPMENT_ASSEMBLY +reinforcement_unit = IfcElementAssemblyTypeEnum.REINFORCEMENT_UNIT +rigid_frame = IfcElementAssemblyTypeEnum.RIGID_FRAME +shelter = IfcElementAssemblyTypeEnum.SHELTER +signalassembly = IfcElementAssemblyTypeEnum.SIGNALASSEMBLY +slab_field = IfcElementAssemblyTypeEnum.SLAB_FIELD +sumpbuster = IfcElementAssemblyTypeEnum.SUMPBUSTER +supportingassembly = IfcElementAssemblyTypeEnum.SUPPORTINGASSEMBLY +suspensionassembly = IfcElementAssemblyTypeEnum.SUSPENSIONASSEMBLY +trackpanel = IfcElementAssemblyTypeEnum.TRACKPANEL +traction_switching_assembly = IfcElementAssemblyTypeEnum.TRACTION_SWITCHING_ASSEMBLY +traffic_calming_device = IfcElementAssemblyTypeEnum.TRAFFIC_CALMING_DEVICE +truss = IfcElementAssemblyTypeEnum.TRUSS +turnoutpanel = IfcElementAssemblyTypeEnum.TURNOUTPANEL +userdefined = IfcElementAssemblyTypeEnum.USERDEFINED +notdefined = IfcElementAssemblyTypeEnum.NOTDEFINED IfcElementCompositionEnum = enum_namespace() -complex = express_getattr(IfcElementCompositionEnum, 'COMPLEX', INDETERMINATE) -element = express_getattr(IfcElementCompositionEnum, 'ELEMENT', INDETERMINATE) -partial = express_getattr(IfcElementCompositionEnum, 'PARTIAL', INDETERMINATE) +complex = IfcElementCompositionEnum.COMPLEX +element = IfcElementCompositionEnum.ELEMENT +partial = IfcElementCompositionEnum.PARTIAL IfcEngineTypeEnum = enum_namespace() -externalcombustion = express_getattr(IfcEngineTypeEnum, 'EXTERNALCOMBUSTION', INDETERMINATE) -internalcombustion = express_getattr(IfcEngineTypeEnum, 'INTERNALCOMBUSTION', INDETERMINATE) -userdefined = express_getattr(IfcEngineTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcEngineTypeEnum, 'NOTDEFINED', INDETERMINATE) +externalcombustion = IfcEngineTypeEnum.EXTERNALCOMBUSTION +internalcombustion = IfcEngineTypeEnum.INTERNALCOMBUSTION +userdefined = IfcEngineTypeEnum.USERDEFINED +notdefined = IfcEngineTypeEnum.NOTDEFINED IfcEvaporativeCoolerTypeEnum = enum_namespace() -directevaporativeairwasher = express_getattr(IfcEvaporativeCoolerTypeEnum, 'DIRECTEVAPORATIVEAIRWASHER', INDETERMINATE) -directevaporativepackagedrotaryaircooler = express_getattr(IfcEvaporativeCoolerTypeEnum, 'DIRECTEVAPORATIVEPACKAGEDROTARYAIRCOOLER', INDETERMINATE) -directevaporativerandommediaaircooler = express_getattr(IfcEvaporativeCoolerTypeEnum, 'DIRECTEVAPORATIVERANDOMMEDIAAIRCOOLER', INDETERMINATE) -directevaporativerigidmediaaircooler = express_getattr(IfcEvaporativeCoolerTypeEnum, 'DIRECTEVAPORATIVERIGIDMEDIAAIRCOOLER', INDETERMINATE) -directevaporativeslingerspackagedaircooler = express_getattr(IfcEvaporativeCoolerTypeEnum, 'DIRECTEVAPORATIVESLINGERSPACKAGEDAIRCOOLER', INDETERMINATE) -indirectdirectcombination = express_getattr(IfcEvaporativeCoolerTypeEnum, 'INDIRECTDIRECTCOMBINATION', INDETERMINATE) -indirectevaporativecoolingtowerorcoilcooler = express_getattr(IfcEvaporativeCoolerTypeEnum, 'INDIRECTEVAPORATIVECOOLINGTOWERORCOILCOOLER', INDETERMINATE) -indirectevaporativepackageaircooler = express_getattr(IfcEvaporativeCoolerTypeEnum, 'INDIRECTEVAPORATIVEPACKAGEAIRCOOLER', INDETERMINATE) -indirectevaporativewetcoil = express_getattr(IfcEvaporativeCoolerTypeEnum, 'INDIRECTEVAPORATIVEWETCOIL', INDETERMINATE) -userdefined = express_getattr(IfcEvaporativeCoolerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcEvaporativeCoolerTypeEnum, 'NOTDEFINED', INDETERMINATE) +directevaporativeairwasher = IfcEvaporativeCoolerTypeEnum.DIRECTEVAPORATIVEAIRWASHER +directevaporativepackagedrotaryaircooler = IfcEvaporativeCoolerTypeEnum.DIRECTEVAPORATIVEPACKAGEDROTARYAIRCOOLER +directevaporativerandommediaaircooler = IfcEvaporativeCoolerTypeEnum.DIRECTEVAPORATIVERANDOMMEDIAAIRCOOLER +directevaporativerigidmediaaircooler = IfcEvaporativeCoolerTypeEnum.DIRECTEVAPORATIVERIGIDMEDIAAIRCOOLER +directevaporativeslingerspackagedaircooler = IfcEvaporativeCoolerTypeEnum.DIRECTEVAPORATIVESLINGERSPACKAGEDAIRCOOLER +indirectdirectcombination = IfcEvaporativeCoolerTypeEnum.INDIRECTDIRECTCOMBINATION +indirectevaporativecoolingtowerorcoilcooler = IfcEvaporativeCoolerTypeEnum.INDIRECTEVAPORATIVECOOLINGTOWERORCOILCOOLER +indirectevaporativepackageaircooler = IfcEvaporativeCoolerTypeEnum.INDIRECTEVAPORATIVEPACKAGEAIRCOOLER +indirectevaporativewetcoil = IfcEvaporativeCoolerTypeEnum.INDIRECTEVAPORATIVEWETCOIL +userdefined = IfcEvaporativeCoolerTypeEnum.USERDEFINED +notdefined = IfcEvaporativeCoolerTypeEnum.NOTDEFINED IfcEvaporatorTypeEnum = enum_namespace() -directexpansion = express_getattr(IfcEvaporatorTypeEnum, 'DIRECTEXPANSION', INDETERMINATE) -directexpansionbrazedplate = express_getattr(IfcEvaporatorTypeEnum, 'DIRECTEXPANSIONBRAZEDPLATE', INDETERMINATE) -directexpansionshellandtube = express_getattr(IfcEvaporatorTypeEnum, 'DIRECTEXPANSIONSHELLANDTUBE', INDETERMINATE) -directexpansiontubeintube = express_getattr(IfcEvaporatorTypeEnum, 'DIRECTEXPANSIONTUBEINTUBE', INDETERMINATE) -floodedshellandtube = express_getattr(IfcEvaporatorTypeEnum, 'FLOODEDSHELLANDTUBE', INDETERMINATE) -shellandcoil = express_getattr(IfcEvaporatorTypeEnum, 'SHELLANDCOIL', INDETERMINATE) -userdefined = express_getattr(IfcEvaporatorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcEvaporatorTypeEnum, 'NOTDEFINED', INDETERMINATE) +directexpansion = IfcEvaporatorTypeEnum.DIRECTEXPANSION +directexpansionbrazedplate = IfcEvaporatorTypeEnum.DIRECTEXPANSIONBRAZEDPLATE +directexpansionshellandtube = IfcEvaporatorTypeEnum.DIRECTEXPANSIONSHELLANDTUBE +directexpansiontubeintube = IfcEvaporatorTypeEnum.DIRECTEXPANSIONTUBEINTUBE +floodedshellandtube = IfcEvaporatorTypeEnum.FLOODEDSHELLANDTUBE +shellandcoil = IfcEvaporatorTypeEnum.SHELLANDCOIL +userdefined = IfcEvaporatorTypeEnum.USERDEFINED +notdefined = IfcEvaporatorTypeEnum.NOTDEFINED IfcEventTriggerTypeEnum = enum_namespace() -eventcomplex = express_getattr(IfcEventTriggerTypeEnum, 'EVENTCOMPLEX', INDETERMINATE) -eventmessage = express_getattr(IfcEventTriggerTypeEnum, 'EVENTMESSAGE', INDETERMINATE) -eventrule = express_getattr(IfcEventTriggerTypeEnum, 'EVENTRULE', INDETERMINATE) -eventtime = express_getattr(IfcEventTriggerTypeEnum, 'EVENTTIME', INDETERMINATE) -userdefined = express_getattr(IfcEventTriggerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcEventTriggerTypeEnum, 'NOTDEFINED', INDETERMINATE) +eventcomplex = IfcEventTriggerTypeEnum.EVENTCOMPLEX +eventmessage = IfcEventTriggerTypeEnum.EVENTMESSAGE +eventrule = IfcEventTriggerTypeEnum.EVENTRULE +eventtime = IfcEventTriggerTypeEnum.EVENTTIME +userdefined = IfcEventTriggerTypeEnum.USERDEFINED +notdefined = IfcEventTriggerTypeEnum.NOTDEFINED IfcEventTypeEnum = enum_namespace() -endevent = express_getattr(IfcEventTypeEnum, 'ENDEVENT', INDETERMINATE) -intermediateevent = express_getattr(IfcEventTypeEnum, 'INTERMEDIATEEVENT', INDETERMINATE) -startevent = express_getattr(IfcEventTypeEnum, 'STARTEVENT', INDETERMINATE) -userdefined = express_getattr(IfcEventTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcEventTypeEnum, 'NOTDEFINED', INDETERMINATE) +endevent = IfcEventTypeEnum.ENDEVENT +intermediateevent = IfcEventTypeEnum.INTERMEDIATEEVENT +startevent = IfcEventTypeEnum.STARTEVENT +userdefined = IfcEventTypeEnum.USERDEFINED +notdefined = IfcEventTypeEnum.NOTDEFINED IfcExternalSpatialElementTypeEnum = enum_namespace() -external = express_getattr(IfcExternalSpatialElementTypeEnum, 'EXTERNAL', INDETERMINATE) -external_earth = express_getattr(IfcExternalSpatialElementTypeEnum, 'EXTERNAL_EARTH', INDETERMINATE) -external_fire = express_getattr(IfcExternalSpatialElementTypeEnum, 'EXTERNAL_FIRE', INDETERMINATE) -external_water = express_getattr(IfcExternalSpatialElementTypeEnum, 'EXTERNAL_WATER', INDETERMINATE) -userdefined = express_getattr(IfcExternalSpatialElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcExternalSpatialElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +external = IfcExternalSpatialElementTypeEnum.EXTERNAL +external_earth = IfcExternalSpatialElementTypeEnum.EXTERNAL_EARTH +external_fire = IfcExternalSpatialElementTypeEnum.EXTERNAL_FIRE +external_water = IfcExternalSpatialElementTypeEnum.EXTERNAL_WATER +userdefined = IfcExternalSpatialElementTypeEnum.USERDEFINED +notdefined = IfcExternalSpatialElementTypeEnum.NOTDEFINED IfcFacilityPartCommonTypeEnum = enum_namespace() -aboveground = express_getattr(IfcFacilityPartCommonTypeEnum, 'ABOVEGROUND', INDETERMINATE) -belowground = express_getattr(IfcFacilityPartCommonTypeEnum, 'BELOWGROUND', INDETERMINATE) -junction = express_getattr(IfcFacilityPartCommonTypeEnum, 'JUNCTION', INDETERMINATE) -levelcrossing = express_getattr(IfcFacilityPartCommonTypeEnum, 'LEVELCROSSING', INDETERMINATE) -segment = express_getattr(IfcFacilityPartCommonTypeEnum, 'SEGMENT', INDETERMINATE) -substructure = express_getattr(IfcFacilityPartCommonTypeEnum, 'SUBSTRUCTURE', INDETERMINATE) -superstructure = express_getattr(IfcFacilityPartCommonTypeEnum, 'SUPERSTRUCTURE', INDETERMINATE) -terminal = express_getattr(IfcFacilityPartCommonTypeEnum, 'TERMINAL', INDETERMINATE) -userdefined = express_getattr(IfcFacilityPartCommonTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFacilityPartCommonTypeEnum, 'NOTDEFINED', INDETERMINATE) +aboveground = IfcFacilityPartCommonTypeEnum.ABOVEGROUND +belowground = IfcFacilityPartCommonTypeEnum.BELOWGROUND +junction = IfcFacilityPartCommonTypeEnum.JUNCTION +levelcrossing = IfcFacilityPartCommonTypeEnum.LEVELCROSSING +segment = IfcFacilityPartCommonTypeEnum.SEGMENT +substructure = IfcFacilityPartCommonTypeEnum.SUBSTRUCTURE +superstructure = IfcFacilityPartCommonTypeEnum.SUPERSTRUCTURE +terminal = IfcFacilityPartCommonTypeEnum.TERMINAL +userdefined = IfcFacilityPartCommonTypeEnum.USERDEFINED +notdefined = IfcFacilityPartCommonTypeEnum.NOTDEFINED IfcFacilityUsageEnum = enum_namespace() -lateral = express_getattr(IfcFacilityUsageEnum, 'LATERAL', INDETERMINATE) -longitudinal = express_getattr(IfcFacilityUsageEnum, 'LONGITUDINAL', INDETERMINATE) -region = express_getattr(IfcFacilityUsageEnum, 'REGION', INDETERMINATE) -vertical = express_getattr(IfcFacilityUsageEnum, 'VERTICAL', INDETERMINATE) -userdefined = express_getattr(IfcFacilityUsageEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFacilityUsageEnum, 'NOTDEFINED', INDETERMINATE) +lateral = IfcFacilityUsageEnum.LATERAL +longitudinal = IfcFacilityUsageEnum.LONGITUDINAL +region = IfcFacilityUsageEnum.REGION +vertical = IfcFacilityUsageEnum.VERTICAL +userdefined = IfcFacilityUsageEnum.USERDEFINED +notdefined = IfcFacilityUsageEnum.NOTDEFINED IfcFanTypeEnum = enum_namespace() -centrifugalairfoil = express_getattr(IfcFanTypeEnum, 'CENTRIFUGALAIRFOIL', INDETERMINATE) -centrifugalbackwardinclinedcurved = express_getattr(IfcFanTypeEnum, 'CENTRIFUGALBACKWARDINCLINEDCURVED', INDETERMINATE) -centrifugalforwardcurved = express_getattr(IfcFanTypeEnum, 'CENTRIFUGALFORWARDCURVED', INDETERMINATE) -centrifugalradial = express_getattr(IfcFanTypeEnum, 'CENTRIFUGALRADIAL', INDETERMINATE) -propelloraxial = express_getattr(IfcFanTypeEnum, 'PROPELLORAXIAL', INDETERMINATE) -tubeaxial = express_getattr(IfcFanTypeEnum, 'TUBEAXIAL', INDETERMINATE) -vaneaxial = express_getattr(IfcFanTypeEnum, 'VANEAXIAL', INDETERMINATE) -userdefined = express_getattr(IfcFanTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFanTypeEnum, 'NOTDEFINED', INDETERMINATE) +centrifugalairfoil = IfcFanTypeEnum.CENTRIFUGALAIRFOIL +centrifugalbackwardinclinedcurved = IfcFanTypeEnum.CENTRIFUGALBACKWARDINCLINEDCURVED +centrifugalforwardcurved = IfcFanTypeEnum.CENTRIFUGALFORWARDCURVED +centrifugalradial = IfcFanTypeEnum.CENTRIFUGALRADIAL +propelloraxial = IfcFanTypeEnum.PROPELLORAXIAL +tubeaxial = IfcFanTypeEnum.TUBEAXIAL +vaneaxial = IfcFanTypeEnum.VANEAXIAL +userdefined = IfcFanTypeEnum.USERDEFINED +notdefined = IfcFanTypeEnum.NOTDEFINED IfcFastenerTypeEnum = enum_namespace() -glue = express_getattr(IfcFastenerTypeEnum, 'GLUE', INDETERMINATE) -mortar = express_getattr(IfcFastenerTypeEnum, 'MORTAR', INDETERMINATE) -weld = express_getattr(IfcFastenerTypeEnum, 'WELD', INDETERMINATE) -userdefined = express_getattr(IfcFastenerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFastenerTypeEnum, 'NOTDEFINED', INDETERMINATE) +glue = IfcFastenerTypeEnum.GLUE +mortar = IfcFastenerTypeEnum.MORTAR +weld = IfcFastenerTypeEnum.WELD +userdefined = IfcFastenerTypeEnum.USERDEFINED +notdefined = IfcFastenerTypeEnum.NOTDEFINED IfcFilterTypeEnum = enum_namespace() -airparticlefilter = express_getattr(IfcFilterTypeEnum, 'AIRPARTICLEFILTER', INDETERMINATE) -compressedairfilter = express_getattr(IfcFilterTypeEnum, 'COMPRESSEDAIRFILTER', INDETERMINATE) -odorfilter = express_getattr(IfcFilterTypeEnum, 'ODORFILTER', INDETERMINATE) -oilfilter = express_getattr(IfcFilterTypeEnum, 'OILFILTER', INDETERMINATE) -strainer = express_getattr(IfcFilterTypeEnum, 'STRAINER', INDETERMINATE) -waterfilter = express_getattr(IfcFilterTypeEnum, 'WATERFILTER', INDETERMINATE) -userdefined = express_getattr(IfcFilterTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFilterTypeEnum, 'NOTDEFINED', INDETERMINATE) +airparticlefilter = IfcFilterTypeEnum.AIRPARTICLEFILTER +compressedairfilter = IfcFilterTypeEnum.COMPRESSEDAIRFILTER +odorfilter = IfcFilterTypeEnum.ODORFILTER +oilfilter = IfcFilterTypeEnum.OILFILTER +strainer = IfcFilterTypeEnum.STRAINER +waterfilter = IfcFilterTypeEnum.WATERFILTER +userdefined = IfcFilterTypeEnum.USERDEFINED +notdefined = IfcFilterTypeEnum.NOTDEFINED IfcFireSuppressionTerminalTypeEnum = enum_namespace() -breechinginlet = express_getattr(IfcFireSuppressionTerminalTypeEnum, 'BREECHINGINLET', INDETERMINATE) -firehydrant = express_getattr(IfcFireSuppressionTerminalTypeEnum, 'FIREHYDRANT', INDETERMINATE) -firemonitor = express_getattr(IfcFireSuppressionTerminalTypeEnum, 'FIREMONITOR', INDETERMINATE) -hosereel = express_getattr(IfcFireSuppressionTerminalTypeEnum, 'HOSEREEL', INDETERMINATE) -sprinkler = express_getattr(IfcFireSuppressionTerminalTypeEnum, 'SPRINKLER', INDETERMINATE) -sprinklerdeflector = express_getattr(IfcFireSuppressionTerminalTypeEnum, 'SPRINKLERDEFLECTOR', INDETERMINATE) -userdefined = express_getattr(IfcFireSuppressionTerminalTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFireSuppressionTerminalTypeEnum, 'NOTDEFINED', INDETERMINATE) +breechinginlet = IfcFireSuppressionTerminalTypeEnum.BREECHINGINLET +firehydrant = IfcFireSuppressionTerminalTypeEnum.FIREHYDRANT +firemonitor = IfcFireSuppressionTerminalTypeEnum.FIREMONITOR +hosereel = IfcFireSuppressionTerminalTypeEnum.HOSEREEL +sprinkler = IfcFireSuppressionTerminalTypeEnum.SPRINKLER +sprinklerdeflector = IfcFireSuppressionTerminalTypeEnum.SPRINKLERDEFLECTOR +userdefined = IfcFireSuppressionTerminalTypeEnum.USERDEFINED +notdefined = IfcFireSuppressionTerminalTypeEnum.NOTDEFINED IfcFlowDirectionEnum = enum_namespace() -sink = express_getattr(IfcFlowDirectionEnum, 'SINK', INDETERMINATE) -source = express_getattr(IfcFlowDirectionEnum, 'SOURCE', INDETERMINATE) -sourceandsink = express_getattr(IfcFlowDirectionEnum, 'SOURCEANDSINK', INDETERMINATE) -notdefined = express_getattr(IfcFlowDirectionEnum, 'NOTDEFINED', INDETERMINATE) +sink = IfcFlowDirectionEnum.SINK +source = IfcFlowDirectionEnum.SOURCE +sourceandsink = IfcFlowDirectionEnum.SOURCEANDSINK +notdefined = IfcFlowDirectionEnum.NOTDEFINED IfcFlowInstrumentTypeEnum = enum_namespace() -ammeter = express_getattr(IfcFlowInstrumentTypeEnum, 'AMMETER', INDETERMINATE) -combined = express_getattr(IfcFlowInstrumentTypeEnum, 'COMBINED', INDETERMINATE) -frequencymeter = express_getattr(IfcFlowInstrumentTypeEnum, 'FREQUENCYMETER', INDETERMINATE) -phaseanglemeter = express_getattr(IfcFlowInstrumentTypeEnum, 'PHASEANGLEMETER', INDETERMINATE) -powerfactormeter = express_getattr(IfcFlowInstrumentTypeEnum, 'POWERFACTORMETER', INDETERMINATE) -pressuregauge = express_getattr(IfcFlowInstrumentTypeEnum, 'PRESSUREGAUGE', INDETERMINATE) -thermometer = express_getattr(IfcFlowInstrumentTypeEnum, 'THERMOMETER', INDETERMINATE) -voltmeter = express_getattr(IfcFlowInstrumentTypeEnum, 'VOLTMETER', INDETERMINATE) -voltmeter_peak = express_getattr(IfcFlowInstrumentTypeEnum, 'VOLTMETER_PEAK', INDETERMINATE) -voltmeter_rms = express_getattr(IfcFlowInstrumentTypeEnum, 'VOLTMETER_RMS', INDETERMINATE) -userdefined = express_getattr(IfcFlowInstrumentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFlowInstrumentTypeEnum, 'NOTDEFINED', INDETERMINATE) +ammeter = IfcFlowInstrumentTypeEnum.AMMETER +combined = IfcFlowInstrumentTypeEnum.COMBINED +frequencymeter = IfcFlowInstrumentTypeEnum.FREQUENCYMETER +phaseanglemeter = IfcFlowInstrumentTypeEnum.PHASEANGLEMETER +powerfactormeter = IfcFlowInstrumentTypeEnum.POWERFACTORMETER +pressuregauge = IfcFlowInstrumentTypeEnum.PRESSUREGAUGE +thermometer = IfcFlowInstrumentTypeEnum.THERMOMETER +voltmeter = IfcFlowInstrumentTypeEnum.VOLTMETER +voltmeter_peak = IfcFlowInstrumentTypeEnum.VOLTMETER_PEAK +voltmeter_rms = IfcFlowInstrumentTypeEnum.VOLTMETER_RMS +userdefined = IfcFlowInstrumentTypeEnum.USERDEFINED +notdefined = IfcFlowInstrumentTypeEnum.NOTDEFINED IfcFlowMeterTypeEnum = enum_namespace() -energymeter = express_getattr(IfcFlowMeterTypeEnum, 'ENERGYMETER', INDETERMINATE) -gasmeter = express_getattr(IfcFlowMeterTypeEnum, 'GASMETER', INDETERMINATE) -oilmeter = express_getattr(IfcFlowMeterTypeEnum, 'OILMETER', INDETERMINATE) -watermeter = express_getattr(IfcFlowMeterTypeEnum, 'WATERMETER', INDETERMINATE) -userdefined = express_getattr(IfcFlowMeterTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFlowMeterTypeEnum, 'NOTDEFINED', INDETERMINATE) +energymeter = IfcFlowMeterTypeEnum.ENERGYMETER +gasmeter = IfcFlowMeterTypeEnum.GASMETER +oilmeter = IfcFlowMeterTypeEnum.OILMETER +watermeter = IfcFlowMeterTypeEnum.WATERMETER +userdefined = IfcFlowMeterTypeEnum.USERDEFINED +notdefined = IfcFlowMeterTypeEnum.NOTDEFINED IfcFootingTypeEnum = enum_namespace() -caisson_foundation = express_getattr(IfcFootingTypeEnum, 'CAISSON_FOUNDATION', INDETERMINATE) -footing_beam = express_getattr(IfcFootingTypeEnum, 'FOOTING_BEAM', INDETERMINATE) -pad_footing = express_getattr(IfcFootingTypeEnum, 'PAD_FOOTING', INDETERMINATE) -pile_cap = express_getattr(IfcFootingTypeEnum, 'PILE_CAP', INDETERMINATE) -strip_footing = express_getattr(IfcFootingTypeEnum, 'STRIP_FOOTING', INDETERMINATE) -userdefined = express_getattr(IfcFootingTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFootingTypeEnum, 'NOTDEFINED', INDETERMINATE) +caisson_foundation = IfcFootingTypeEnum.CAISSON_FOUNDATION +footing_beam = IfcFootingTypeEnum.FOOTING_BEAM +pad_footing = IfcFootingTypeEnum.PAD_FOOTING +pile_cap = IfcFootingTypeEnum.PILE_CAP +strip_footing = IfcFootingTypeEnum.STRIP_FOOTING +userdefined = IfcFootingTypeEnum.USERDEFINED +notdefined = IfcFootingTypeEnum.NOTDEFINED IfcFurnitureTypeEnum = enum_namespace() -bed = express_getattr(IfcFurnitureTypeEnum, 'BED', INDETERMINATE) -chair = express_getattr(IfcFurnitureTypeEnum, 'CHAIR', INDETERMINATE) -desk = express_getattr(IfcFurnitureTypeEnum, 'DESK', INDETERMINATE) -filecabinet = express_getattr(IfcFurnitureTypeEnum, 'FILECABINET', INDETERMINATE) -shelf = express_getattr(IfcFurnitureTypeEnum, 'SHELF', INDETERMINATE) -sofa = express_getattr(IfcFurnitureTypeEnum, 'SOFA', INDETERMINATE) -table = express_getattr(IfcFurnitureTypeEnum, 'TABLE', INDETERMINATE) -technicalcabinet = express_getattr(IfcFurnitureTypeEnum, 'TECHNICALCABINET', INDETERMINATE) -userdefined = express_getattr(IfcFurnitureTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFurnitureTypeEnum, 'NOTDEFINED', INDETERMINATE) +bed = IfcFurnitureTypeEnum.BED +chair = IfcFurnitureTypeEnum.CHAIR +desk = IfcFurnitureTypeEnum.DESK +filecabinet = IfcFurnitureTypeEnum.FILECABINET +shelf = IfcFurnitureTypeEnum.SHELF +sofa = IfcFurnitureTypeEnum.SOFA +table = IfcFurnitureTypeEnum.TABLE +technicalcabinet = IfcFurnitureTypeEnum.TECHNICALCABINET +userdefined = IfcFurnitureTypeEnum.USERDEFINED +notdefined = IfcFurnitureTypeEnum.NOTDEFINED IfcGeographicElementTypeEnum = enum_namespace() -soil_boring_point = express_getattr(IfcGeographicElementTypeEnum, 'SOIL_BORING_POINT', INDETERMINATE) -terrain = express_getattr(IfcGeographicElementTypeEnum, 'TERRAIN', INDETERMINATE) -vegetation = express_getattr(IfcGeographicElementTypeEnum, 'VEGETATION', INDETERMINATE) -userdefined = express_getattr(IfcGeographicElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcGeographicElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +soil_boring_point = IfcGeographicElementTypeEnum.SOIL_BORING_POINT +terrain = IfcGeographicElementTypeEnum.TERRAIN +vegetation = IfcGeographicElementTypeEnum.VEGETATION +userdefined = IfcGeographicElementTypeEnum.USERDEFINED +notdefined = IfcGeographicElementTypeEnum.NOTDEFINED IfcGeometricProjectionEnum = enum_namespace() -elevation_view = express_getattr(IfcGeometricProjectionEnum, 'ELEVATION_VIEW', INDETERMINATE) -graph_view = express_getattr(IfcGeometricProjectionEnum, 'GRAPH_VIEW', INDETERMINATE) -model_view = express_getattr(IfcGeometricProjectionEnum, 'MODEL_VIEW', INDETERMINATE) -plan_view = express_getattr(IfcGeometricProjectionEnum, 'PLAN_VIEW', INDETERMINATE) -reflected_plan_view = express_getattr(IfcGeometricProjectionEnum, 'REFLECTED_PLAN_VIEW', INDETERMINATE) -section_view = express_getattr(IfcGeometricProjectionEnum, 'SECTION_VIEW', INDETERMINATE) -sketch_view = express_getattr(IfcGeometricProjectionEnum, 'SKETCH_VIEW', INDETERMINATE) -userdefined = express_getattr(IfcGeometricProjectionEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcGeometricProjectionEnum, 'NOTDEFINED', INDETERMINATE) +elevation_view = IfcGeometricProjectionEnum.ELEVATION_VIEW +graph_view = IfcGeometricProjectionEnum.GRAPH_VIEW +model_view = IfcGeometricProjectionEnum.MODEL_VIEW +plan_view = IfcGeometricProjectionEnum.PLAN_VIEW +reflected_plan_view = IfcGeometricProjectionEnum.REFLECTED_PLAN_VIEW +section_view = IfcGeometricProjectionEnum.SECTION_VIEW +sketch_view = IfcGeometricProjectionEnum.SKETCH_VIEW +userdefined = IfcGeometricProjectionEnum.USERDEFINED +notdefined = IfcGeometricProjectionEnum.NOTDEFINED IfcGeotechnicalStratumTypeEnum = enum_namespace() -solid = express_getattr(IfcGeotechnicalStratumTypeEnum, 'SOLID', INDETERMINATE) -void = express_getattr(IfcGeotechnicalStratumTypeEnum, 'VOID', INDETERMINATE) -water = express_getattr(IfcGeotechnicalStratumTypeEnum, 'WATER', INDETERMINATE) -userdefined = express_getattr(IfcGeotechnicalStratumTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcGeotechnicalStratumTypeEnum, 'NOTDEFINED', INDETERMINATE) +solid = IfcGeotechnicalStratumTypeEnum.SOLID +void = IfcGeotechnicalStratumTypeEnum.VOID +water = IfcGeotechnicalStratumTypeEnum.WATER +userdefined = IfcGeotechnicalStratumTypeEnum.USERDEFINED +notdefined = IfcGeotechnicalStratumTypeEnum.NOTDEFINED IfcGlobalOrLocalEnum = enum_namespace() -global_coords = express_getattr(IfcGlobalOrLocalEnum, 'GLOBAL_COORDS', INDETERMINATE) -local_coords = express_getattr(IfcGlobalOrLocalEnum, 'LOCAL_COORDS', INDETERMINATE) +global_coords = IfcGlobalOrLocalEnum.GLOBAL_COORDS +local_coords = IfcGlobalOrLocalEnum.LOCAL_COORDS IfcGridTypeEnum = enum_namespace() -irregular = express_getattr(IfcGridTypeEnum, 'IRREGULAR', INDETERMINATE) -radial = express_getattr(IfcGridTypeEnum, 'RADIAL', INDETERMINATE) -rectangular = express_getattr(IfcGridTypeEnum, 'RECTANGULAR', INDETERMINATE) -triangular = express_getattr(IfcGridTypeEnum, 'TRIANGULAR', INDETERMINATE) -userdefined = express_getattr(IfcGridTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcGridTypeEnum, 'NOTDEFINED', INDETERMINATE) +irregular = IfcGridTypeEnum.IRREGULAR +radial = IfcGridTypeEnum.RADIAL +rectangular = IfcGridTypeEnum.RECTANGULAR +triangular = IfcGridTypeEnum.TRIANGULAR +userdefined = IfcGridTypeEnum.USERDEFINED +notdefined = IfcGridTypeEnum.NOTDEFINED IfcHeatExchangerTypeEnum = enum_namespace() -plate = express_getattr(IfcHeatExchangerTypeEnum, 'PLATE', INDETERMINATE) -shellandtube = express_getattr(IfcHeatExchangerTypeEnum, 'SHELLANDTUBE', INDETERMINATE) -turnoutheating = express_getattr(IfcHeatExchangerTypeEnum, 'TURNOUTHEATING', INDETERMINATE) -userdefined = express_getattr(IfcHeatExchangerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcHeatExchangerTypeEnum, 'NOTDEFINED', INDETERMINATE) +plate = IfcHeatExchangerTypeEnum.PLATE +shellandtube = IfcHeatExchangerTypeEnum.SHELLANDTUBE +turnoutheating = IfcHeatExchangerTypeEnum.TURNOUTHEATING +userdefined = IfcHeatExchangerTypeEnum.USERDEFINED +notdefined = IfcHeatExchangerTypeEnum.NOTDEFINED IfcHumidifierTypeEnum = enum_namespace() -adiabaticairwasher = express_getattr(IfcHumidifierTypeEnum, 'ADIABATICAIRWASHER', INDETERMINATE) -adiabaticatomizing = express_getattr(IfcHumidifierTypeEnum, 'ADIABATICATOMIZING', INDETERMINATE) -adiabaticcompressedairnozzle = express_getattr(IfcHumidifierTypeEnum, 'ADIABATICCOMPRESSEDAIRNOZZLE', INDETERMINATE) -adiabaticpan = express_getattr(IfcHumidifierTypeEnum, 'ADIABATICPAN', INDETERMINATE) -adiabaticrigidmedia = express_getattr(IfcHumidifierTypeEnum, 'ADIABATICRIGIDMEDIA', INDETERMINATE) -adiabaticultrasonic = express_getattr(IfcHumidifierTypeEnum, 'ADIABATICULTRASONIC', INDETERMINATE) -adiabaticwettedelement = express_getattr(IfcHumidifierTypeEnum, 'ADIABATICWETTEDELEMENT', INDETERMINATE) -assistedbutane = express_getattr(IfcHumidifierTypeEnum, 'ASSISTEDBUTANE', INDETERMINATE) -assistedelectric = express_getattr(IfcHumidifierTypeEnum, 'ASSISTEDELECTRIC', INDETERMINATE) -assistednaturalgas = express_getattr(IfcHumidifierTypeEnum, 'ASSISTEDNATURALGAS', INDETERMINATE) -assistedpropane = express_getattr(IfcHumidifierTypeEnum, 'ASSISTEDPROPANE', INDETERMINATE) -assistedsteam = express_getattr(IfcHumidifierTypeEnum, 'ASSISTEDSTEAM', INDETERMINATE) -steaminjection = express_getattr(IfcHumidifierTypeEnum, 'STEAMINJECTION', INDETERMINATE) -userdefined = express_getattr(IfcHumidifierTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcHumidifierTypeEnum, 'NOTDEFINED', INDETERMINATE) +adiabaticairwasher = IfcHumidifierTypeEnum.ADIABATICAIRWASHER +adiabaticatomizing = IfcHumidifierTypeEnum.ADIABATICATOMIZING +adiabaticcompressedairnozzle = IfcHumidifierTypeEnum.ADIABATICCOMPRESSEDAIRNOZZLE +adiabaticpan = IfcHumidifierTypeEnum.ADIABATICPAN +adiabaticrigidmedia = IfcHumidifierTypeEnum.ADIABATICRIGIDMEDIA +adiabaticultrasonic = IfcHumidifierTypeEnum.ADIABATICULTRASONIC +adiabaticwettedelement = IfcHumidifierTypeEnum.ADIABATICWETTEDELEMENT +assistedbutane = IfcHumidifierTypeEnum.ASSISTEDBUTANE +assistedelectric = IfcHumidifierTypeEnum.ASSISTEDELECTRIC +assistednaturalgas = IfcHumidifierTypeEnum.ASSISTEDNATURALGAS +assistedpropane = IfcHumidifierTypeEnum.ASSISTEDPROPANE +assistedsteam = IfcHumidifierTypeEnum.ASSISTEDSTEAM +steaminjection = IfcHumidifierTypeEnum.STEAMINJECTION +userdefined = IfcHumidifierTypeEnum.USERDEFINED +notdefined = IfcHumidifierTypeEnum.NOTDEFINED IfcImpactProtectionDeviceTypeEnum = enum_namespace() -bumper = express_getattr(IfcImpactProtectionDeviceTypeEnum, 'BUMPER', INDETERMINATE) -crashcushion = express_getattr(IfcImpactProtectionDeviceTypeEnum, 'CRASHCUSHION', INDETERMINATE) -dampingsystem = express_getattr(IfcImpactProtectionDeviceTypeEnum, 'DAMPINGSYSTEM', INDETERMINATE) -fender = express_getattr(IfcImpactProtectionDeviceTypeEnum, 'FENDER', INDETERMINATE) -userdefined = express_getattr(IfcImpactProtectionDeviceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcImpactProtectionDeviceTypeEnum, 'NOTDEFINED', INDETERMINATE) +bumper = IfcImpactProtectionDeviceTypeEnum.BUMPER +crashcushion = IfcImpactProtectionDeviceTypeEnum.CRASHCUSHION +dampingsystem = IfcImpactProtectionDeviceTypeEnum.DAMPINGSYSTEM +fender = IfcImpactProtectionDeviceTypeEnum.FENDER +userdefined = IfcImpactProtectionDeviceTypeEnum.USERDEFINED +notdefined = IfcImpactProtectionDeviceTypeEnum.NOTDEFINED IfcInterceptorTypeEnum = enum_namespace() -cyclonic = express_getattr(IfcInterceptorTypeEnum, 'CYCLONIC', INDETERMINATE) -grease = express_getattr(IfcInterceptorTypeEnum, 'GREASE', INDETERMINATE) -oil = express_getattr(IfcInterceptorTypeEnum, 'OIL', INDETERMINATE) -petrol = express_getattr(IfcInterceptorTypeEnum, 'PETROL', INDETERMINATE) -userdefined = express_getattr(IfcInterceptorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcInterceptorTypeEnum, 'NOTDEFINED', INDETERMINATE) +cyclonic = IfcInterceptorTypeEnum.CYCLONIC +grease = IfcInterceptorTypeEnum.GREASE +oil = IfcInterceptorTypeEnum.OIL +petrol = IfcInterceptorTypeEnum.PETROL +userdefined = IfcInterceptorTypeEnum.USERDEFINED +notdefined = IfcInterceptorTypeEnum.NOTDEFINED IfcInternalOrExternalEnum = enum_namespace() -external = express_getattr(IfcInternalOrExternalEnum, 'EXTERNAL', INDETERMINATE) -external_earth = express_getattr(IfcInternalOrExternalEnum, 'EXTERNAL_EARTH', INDETERMINATE) -external_fire = express_getattr(IfcInternalOrExternalEnum, 'EXTERNAL_FIRE', INDETERMINATE) -external_water = express_getattr(IfcInternalOrExternalEnum, 'EXTERNAL_WATER', INDETERMINATE) -internal = express_getattr(IfcInternalOrExternalEnum, 'INTERNAL', INDETERMINATE) -notdefined = express_getattr(IfcInternalOrExternalEnum, 'NOTDEFINED', INDETERMINATE) +external = IfcInternalOrExternalEnum.EXTERNAL +external_earth = IfcInternalOrExternalEnum.EXTERNAL_EARTH +external_fire = IfcInternalOrExternalEnum.EXTERNAL_FIRE +external_water = IfcInternalOrExternalEnum.EXTERNAL_WATER +internal = IfcInternalOrExternalEnum.INTERNAL +notdefined = IfcInternalOrExternalEnum.NOTDEFINED IfcInventoryTypeEnum = enum_namespace() -assetinventory = express_getattr(IfcInventoryTypeEnum, 'ASSETINVENTORY', INDETERMINATE) -furnitureinventory = express_getattr(IfcInventoryTypeEnum, 'FURNITUREINVENTORY', INDETERMINATE) -spaceinventory = express_getattr(IfcInventoryTypeEnum, 'SPACEINVENTORY', INDETERMINATE) -userdefined = express_getattr(IfcInventoryTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcInventoryTypeEnum, 'NOTDEFINED', INDETERMINATE) +assetinventory = IfcInventoryTypeEnum.ASSETINVENTORY +furnitureinventory = IfcInventoryTypeEnum.FURNITUREINVENTORY +spaceinventory = IfcInventoryTypeEnum.SPACEINVENTORY +userdefined = IfcInventoryTypeEnum.USERDEFINED +notdefined = IfcInventoryTypeEnum.NOTDEFINED IfcJunctionBoxTypeEnum = enum_namespace() -data = express_getattr(IfcJunctionBoxTypeEnum, 'DATA', INDETERMINATE) -power = express_getattr(IfcJunctionBoxTypeEnum, 'POWER', INDETERMINATE) -userdefined = express_getattr(IfcJunctionBoxTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcJunctionBoxTypeEnum, 'NOTDEFINED', INDETERMINATE) +data = IfcJunctionBoxTypeEnum.DATA +power = IfcJunctionBoxTypeEnum.POWER +userdefined = IfcJunctionBoxTypeEnum.USERDEFINED +notdefined = IfcJunctionBoxTypeEnum.NOTDEFINED IfcKnotType = enum_namespace() -piecewise_bezier_knots = express_getattr(IfcKnotType, 'PIECEWISE_BEZIER_KNOTS', INDETERMINATE) -quasi_uniform_knots = express_getattr(IfcKnotType, 'QUASI_UNIFORM_KNOTS', INDETERMINATE) -uniform_knots = express_getattr(IfcKnotType, 'UNIFORM_KNOTS', INDETERMINATE) -unspecified = express_getattr(IfcKnotType, 'UNSPECIFIED', INDETERMINATE) +piecewise_bezier_knots = IfcKnotType.PIECEWISE_BEZIER_KNOTS +quasi_uniform_knots = IfcKnotType.QUASI_UNIFORM_KNOTS +uniform_knots = IfcKnotType.UNIFORM_KNOTS +unspecified = IfcKnotType.UNSPECIFIED IfcLaborResourceTypeEnum = enum_namespace() -administration = express_getattr(IfcLaborResourceTypeEnum, 'ADMINISTRATION', INDETERMINATE) -carpentry = express_getattr(IfcLaborResourceTypeEnum, 'CARPENTRY', INDETERMINATE) -cleaning = express_getattr(IfcLaborResourceTypeEnum, 'CLEANING', INDETERMINATE) -concrete = express_getattr(IfcLaborResourceTypeEnum, 'CONCRETE', INDETERMINATE) -drywall = express_getattr(IfcLaborResourceTypeEnum, 'DRYWALL', INDETERMINATE) -electric = express_getattr(IfcLaborResourceTypeEnum, 'ELECTRIC', INDETERMINATE) -finishing = express_getattr(IfcLaborResourceTypeEnum, 'FINISHING', INDETERMINATE) -flooring = express_getattr(IfcLaborResourceTypeEnum, 'FLOORING', INDETERMINATE) -general = express_getattr(IfcLaborResourceTypeEnum, 'GENERAL', INDETERMINATE) -hvac = express_getattr(IfcLaborResourceTypeEnum, 'HVAC', INDETERMINATE) -landscaping = express_getattr(IfcLaborResourceTypeEnum, 'LANDSCAPING', INDETERMINATE) -masonry = express_getattr(IfcLaborResourceTypeEnum, 'MASONRY', INDETERMINATE) -painting = express_getattr(IfcLaborResourceTypeEnum, 'PAINTING', INDETERMINATE) -paving = express_getattr(IfcLaborResourceTypeEnum, 'PAVING', INDETERMINATE) -plumbing = express_getattr(IfcLaborResourceTypeEnum, 'PLUMBING', INDETERMINATE) -roofing = express_getattr(IfcLaborResourceTypeEnum, 'ROOFING', INDETERMINATE) -sitegrading = express_getattr(IfcLaborResourceTypeEnum, 'SITEGRADING', INDETERMINATE) -steelwork = express_getattr(IfcLaborResourceTypeEnum, 'STEELWORK', INDETERMINATE) -surveying = express_getattr(IfcLaborResourceTypeEnum, 'SURVEYING', INDETERMINATE) -userdefined = express_getattr(IfcLaborResourceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcLaborResourceTypeEnum, 'NOTDEFINED', INDETERMINATE) +administration = IfcLaborResourceTypeEnum.ADMINISTRATION +carpentry = IfcLaborResourceTypeEnum.CARPENTRY +cleaning = IfcLaborResourceTypeEnum.CLEANING +concrete = IfcLaborResourceTypeEnum.CONCRETE +drywall = IfcLaborResourceTypeEnum.DRYWALL +electric = IfcLaborResourceTypeEnum.ELECTRIC +finishing = IfcLaborResourceTypeEnum.FINISHING +flooring = IfcLaborResourceTypeEnum.FLOORING +general = IfcLaborResourceTypeEnum.GENERAL +hvac = IfcLaborResourceTypeEnum.HVAC +landscaping = IfcLaborResourceTypeEnum.LANDSCAPING +masonry = IfcLaborResourceTypeEnum.MASONRY +painting = IfcLaborResourceTypeEnum.PAINTING +paving = IfcLaborResourceTypeEnum.PAVING +plumbing = IfcLaborResourceTypeEnum.PLUMBING +roofing = IfcLaborResourceTypeEnum.ROOFING +sitegrading = IfcLaborResourceTypeEnum.SITEGRADING +steelwork = IfcLaborResourceTypeEnum.STEELWORK +surveying = IfcLaborResourceTypeEnum.SURVEYING +userdefined = IfcLaborResourceTypeEnum.USERDEFINED +notdefined = IfcLaborResourceTypeEnum.NOTDEFINED IfcLampTypeEnum = enum_namespace() -compactfluorescent = express_getattr(IfcLampTypeEnum, 'COMPACTFLUORESCENT', INDETERMINATE) -fluorescent = express_getattr(IfcLampTypeEnum, 'FLUORESCENT', INDETERMINATE) -halogen = express_getattr(IfcLampTypeEnum, 'HALOGEN', INDETERMINATE) -highpressuremercury = express_getattr(IfcLampTypeEnum, 'HIGHPRESSUREMERCURY', INDETERMINATE) -highpressuresodium = express_getattr(IfcLampTypeEnum, 'HIGHPRESSURESODIUM', INDETERMINATE) -led = express_getattr(IfcLampTypeEnum, 'LED', INDETERMINATE) -metalhalide = express_getattr(IfcLampTypeEnum, 'METALHALIDE', INDETERMINATE) -oled = express_getattr(IfcLampTypeEnum, 'OLED', INDETERMINATE) -tungstenfilament = express_getattr(IfcLampTypeEnum, 'TUNGSTENFILAMENT', INDETERMINATE) -userdefined = express_getattr(IfcLampTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcLampTypeEnum, 'NOTDEFINED', INDETERMINATE) +compactfluorescent = IfcLampTypeEnum.COMPACTFLUORESCENT +fluorescent = IfcLampTypeEnum.FLUORESCENT +halogen = IfcLampTypeEnum.HALOGEN +highpressuremercury = IfcLampTypeEnum.HIGHPRESSUREMERCURY +highpressuresodium = IfcLampTypeEnum.HIGHPRESSURESODIUM +led = IfcLampTypeEnum.LED +metalhalide = IfcLampTypeEnum.METALHALIDE +oled = IfcLampTypeEnum.OLED +tungstenfilament = IfcLampTypeEnum.TUNGSTENFILAMENT +userdefined = IfcLampTypeEnum.USERDEFINED +notdefined = IfcLampTypeEnum.NOTDEFINED IfcLayerSetDirectionEnum = enum_namespace() -axis1 = express_getattr(IfcLayerSetDirectionEnum, 'AXIS1', INDETERMINATE) -axis2 = express_getattr(IfcLayerSetDirectionEnum, 'AXIS2', INDETERMINATE) -axis3 = express_getattr(IfcLayerSetDirectionEnum, 'AXIS3', INDETERMINATE) +axis1 = IfcLayerSetDirectionEnum.AXIS1 +axis2 = IfcLayerSetDirectionEnum.AXIS2 +axis3 = IfcLayerSetDirectionEnum.AXIS3 IfcLightDistributionCurveEnum = enum_namespace() -type_a = express_getattr(IfcLightDistributionCurveEnum, 'TYPE_A', INDETERMINATE) -type_b = express_getattr(IfcLightDistributionCurveEnum, 'TYPE_B', INDETERMINATE) -type_c = express_getattr(IfcLightDistributionCurveEnum, 'TYPE_C', INDETERMINATE) -notdefined = express_getattr(IfcLightDistributionCurveEnum, 'NOTDEFINED', INDETERMINATE) +type_a = IfcLightDistributionCurveEnum.TYPE_A +type_b = IfcLightDistributionCurveEnum.TYPE_B +type_c = IfcLightDistributionCurveEnum.TYPE_C +notdefined = IfcLightDistributionCurveEnum.NOTDEFINED IfcLightEmissionSourceEnum = enum_namespace() -compactfluorescent = express_getattr(IfcLightEmissionSourceEnum, 'COMPACTFLUORESCENT', INDETERMINATE) -fluorescent = express_getattr(IfcLightEmissionSourceEnum, 'FLUORESCENT', INDETERMINATE) -highpressuremercury = express_getattr(IfcLightEmissionSourceEnum, 'HIGHPRESSUREMERCURY', INDETERMINATE) -highpressuresodium = express_getattr(IfcLightEmissionSourceEnum, 'HIGHPRESSURESODIUM', INDETERMINATE) -lightemittingdiode = express_getattr(IfcLightEmissionSourceEnum, 'LIGHTEMITTINGDIODE', INDETERMINATE) -lowpressuresodium = express_getattr(IfcLightEmissionSourceEnum, 'LOWPRESSURESODIUM', INDETERMINATE) -lowvoltagehalogen = express_getattr(IfcLightEmissionSourceEnum, 'LOWVOLTAGEHALOGEN', INDETERMINATE) -mainvoltagehalogen = express_getattr(IfcLightEmissionSourceEnum, 'MAINVOLTAGEHALOGEN', INDETERMINATE) -metalhalide = express_getattr(IfcLightEmissionSourceEnum, 'METALHALIDE', INDETERMINATE) -tungstenfilament = express_getattr(IfcLightEmissionSourceEnum, 'TUNGSTENFILAMENT', INDETERMINATE) -notdefined = express_getattr(IfcLightEmissionSourceEnum, 'NOTDEFINED', INDETERMINATE) +compactfluorescent = IfcLightEmissionSourceEnum.COMPACTFLUORESCENT +fluorescent = IfcLightEmissionSourceEnum.FLUORESCENT +highpressuremercury = IfcLightEmissionSourceEnum.HIGHPRESSUREMERCURY +highpressuresodium = IfcLightEmissionSourceEnum.HIGHPRESSURESODIUM +lightemittingdiode = IfcLightEmissionSourceEnum.LIGHTEMITTINGDIODE +lowpressuresodium = IfcLightEmissionSourceEnum.LOWPRESSURESODIUM +lowvoltagehalogen = IfcLightEmissionSourceEnum.LOWVOLTAGEHALOGEN +mainvoltagehalogen = IfcLightEmissionSourceEnum.MAINVOLTAGEHALOGEN +metalhalide = IfcLightEmissionSourceEnum.METALHALIDE +tungstenfilament = IfcLightEmissionSourceEnum.TUNGSTENFILAMENT +notdefined = IfcLightEmissionSourceEnum.NOTDEFINED IfcLightFixtureTypeEnum = enum_namespace() -directionsource = express_getattr(IfcLightFixtureTypeEnum, 'DIRECTIONSOURCE', INDETERMINATE) -pointsource = express_getattr(IfcLightFixtureTypeEnum, 'POINTSOURCE', INDETERMINATE) -securitylighting = express_getattr(IfcLightFixtureTypeEnum, 'SECURITYLIGHTING', INDETERMINATE) -userdefined = express_getattr(IfcLightFixtureTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcLightFixtureTypeEnum, 'NOTDEFINED', INDETERMINATE) +directionsource = IfcLightFixtureTypeEnum.DIRECTIONSOURCE +pointsource = IfcLightFixtureTypeEnum.POINTSOURCE +securitylighting = IfcLightFixtureTypeEnum.SECURITYLIGHTING +userdefined = IfcLightFixtureTypeEnum.USERDEFINED +notdefined = IfcLightFixtureTypeEnum.NOTDEFINED IfcLiquidTerminalTypeEnum = enum_namespace() -hosereel = express_getattr(IfcLiquidTerminalTypeEnum, 'HOSEREEL', INDETERMINATE) -loadingarm = express_getattr(IfcLiquidTerminalTypeEnum, 'LOADINGARM', INDETERMINATE) -userdefined = express_getattr(IfcLiquidTerminalTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcLiquidTerminalTypeEnum, 'NOTDEFINED', INDETERMINATE) +hosereel = IfcLiquidTerminalTypeEnum.HOSEREEL +loadingarm = IfcLiquidTerminalTypeEnum.LOADINGARM +userdefined = IfcLiquidTerminalTypeEnum.USERDEFINED +notdefined = IfcLiquidTerminalTypeEnum.NOTDEFINED IfcLoadGroupTypeEnum = enum_namespace() -load_case = express_getattr(IfcLoadGroupTypeEnum, 'LOAD_CASE', INDETERMINATE) -load_combination = express_getattr(IfcLoadGroupTypeEnum, 'LOAD_COMBINATION', INDETERMINATE) -load_group = express_getattr(IfcLoadGroupTypeEnum, 'LOAD_GROUP', INDETERMINATE) -userdefined = express_getattr(IfcLoadGroupTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcLoadGroupTypeEnum, 'NOTDEFINED', INDETERMINATE) +load_case = IfcLoadGroupTypeEnum.LOAD_CASE +load_combination = IfcLoadGroupTypeEnum.LOAD_COMBINATION +load_group = IfcLoadGroupTypeEnum.LOAD_GROUP +userdefined = IfcLoadGroupTypeEnum.USERDEFINED +notdefined = IfcLoadGroupTypeEnum.NOTDEFINED IfcLogicalOperatorEnum = enum_namespace() -logicaland = express_getattr(IfcLogicalOperatorEnum, 'LOGICALAND', INDETERMINATE) -logicalnotand = express_getattr(IfcLogicalOperatorEnum, 'LOGICALNOTAND', INDETERMINATE) -logicalnotor = express_getattr(IfcLogicalOperatorEnum, 'LOGICALNOTOR', INDETERMINATE) -logicalor = express_getattr(IfcLogicalOperatorEnum, 'LOGICALOR', INDETERMINATE) -logicalxor = express_getattr(IfcLogicalOperatorEnum, 'LOGICALXOR', INDETERMINATE) +logicaland = IfcLogicalOperatorEnum.LOGICALAND +logicalnotand = IfcLogicalOperatorEnum.LOGICALNOTAND +logicalnotor = IfcLogicalOperatorEnum.LOGICALNOTOR +logicalor = IfcLogicalOperatorEnum.LOGICALOR +logicalxor = IfcLogicalOperatorEnum.LOGICALXOR IfcMarineFacilityTypeEnum = enum_namespace() -barrierbeach = express_getattr(IfcMarineFacilityTypeEnum, 'BARRIERBEACH', INDETERMINATE) -breakwater = express_getattr(IfcMarineFacilityTypeEnum, 'BREAKWATER', INDETERMINATE) -canal = express_getattr(IfcMarineFacilityTypeEnum, 'CANAL', INDETERMINATE) -drydock = express_getattr(IfcMarineFacilityTypeEnum, 'DRYDOCK', INDETERMINATE) -floatingdock = express_getattr(IfcMarineFacilityTypeEnum, 'FLOATINGDOCK', INDETERMINATE) -hydrolift = express_getattr(IfcMarineFacilityTypeEnum, 'HYDROLIFT', INDETERMINATE) -jetty = express_getattr(IfcMarineFacilityTypeEnum, 'JETTY', INDETERMINATE) -launchrecovery = express_getattr(IfcMarineFacilityTypeEnum, 'LAUNCHRECOVERY', INDETERMINATE) -marinedefence = express_getattr(IfcMarineFacilityTypeEnum, 'MARINEDEFENCE', INDETERMINATE) -navigationalchannel = express_getattr(IfcMarineFacilityTypeEnum, 'NAVIGATIONALCHANNEL', INDETERMINATE) -port = express_getattr(IfcMarineFacilityTypeEnum, 'PORT', INDETERMINATE) -quay = express_getattr(IfcMarineFacilityTypeEnum, 'QUAY', INDETERMINATE) -revetment = express_getattr(IfcMarineFacilityTypeEnum, 'REVETMENT', INDETERMINATE) -shiplift = express_getattr(IfcMarineFacilityTypeEnum, 'SHIPLIFT', INDETERMINATE) -shiplock = express_getattr(IfcMarineFacilityTypeEnum, 'SHIPLOCK', INDETERMINATE) -shipyard = express_getattr(IfcMarineFacilityTypeEnum, 'SHIPYARD', INDETERMINATE) -slipway = express_getattr(IfcMarineFacilityTypeEnum, 'SLIPWAY', INDETERMINATE) -waterway = express_getattr(IfcMarineFacilityTypeEnum, 'WATERWAY', INDETERMINATE) -waterwayshiplift = express_getattr(IfcMarineFacilityTypeEnum, 'WATERWAYSHIPLIFT', INDETERMINATE) -userdefined = express_getattr(IfcMarineFacilityTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcMarineFacilityTypeEnum, 'NOTDEFINED', INDETERMINATE) +barrierbeach = IfcMarineFacilityTypeEnum.BARRIERBEACH +breakwater = IfcMarineFacilityTypeEnum.BREAKWATER +canal = IfcMarineFacilityTypeEnum.CANAL +drydock = IfcMarineFacilityTypeEnum.DRYDOCK +floatingdock = IfcMarineFacilityTypeEnum.FLOATINGDOCK +hydrolift = IfcMarineFacilityTypeEnum.HYDROLIFT +jetty = IfcMarineFacilityTypeEnum.JETTY +launchrecovery = IfcMarineFacilityTypeEnum.LAUNCHRECOVERY +marinedefence = IfcMarineFacilityTypeEnum.MARINEDEFENCE +navigationalchannel = IfcMarineFacilityTypeEnum.NAVIGATIONALCHANNEL +port = IfcMarineFacilityTypeEnum.PORT +quay = IfcMarineFacilityTypeEnum.QUAY +revetment = IfcMarineFacilityTypeEnum.REVETMENT +shiplift = IfcMarineFacilityTypeEnum.SHIPLIFT +shiplock = IfcMarineFacilityTypeEnum.SHIPLOCK +shipyard = IfcMarineFacilityTypeEnum.SHIPYARD +slipway = IfcMarineFacilityTypeEnum.SLIPWAY +waterway = IfcMarineFacilityTypeEnum.WATERWAY +waterwayshiplift = IfcMarineFacilityTypeEnum.WATERWAYSHIPLIFT +userdefined = IfcMarineFacilityTypeEnum.USERDEFINED +notdefined = IfcMarineFacilityTypeEnum.NOTDEFINED IfcMarinePartTypeEnum = enum_namespace() -abovewaterline = express_getattr(IfcMarinePartTypeEnum, 'ABOVEWATERLINE', INDETERMINATE) -anchorage = express_getattr(IfcMarinePartTypeEnum, 'ANCHORAGE', INDETERMINATE) -approachchannel = express_getattr(IfcMarinePartTypeEnum, 'APPROACHCHANNEL', INDETERMINATE) -belowwaterline = express_getattr(IfcMarinePartTypeEnum, 'BELOWWATERLINE', INDETERMINATE) -berthingstructure = express_getattr(IfcMarinePartTypeEnum, 'BERTHINGSTRUCTURE', INDETERMINATE) -chamber = express_getattr(IfcMarinePartTypeEnum, 'CHAMBER', INDETERMINATE) -cill_level = express_getattr(IfcMarinePartTypeEnum, 'CILL_LEVEL', INDETERMINATE) -copelevel = express_getattr(IfcMarinePartTypeEnum, 'COPELEVEL', INDETERMINATE) -core = express_getattr(IfcMarinePartTypeEnum, 'CORE', INDETERMINATE) -crest = express_getattr(IfcMarinePartTypeEnum, 'CREST', INDETERMINATE) -gatehead = express_getattr(IfcMarinePartTypeEnum, 'GATEHEAD', INDETERMINATE) -gudingstructure = express_getattr(IfcMarinePartTypeEnum, 'GUDINGSTRUCTURE', INDETERMINATE) -highwaterline = express_getattr(IfcMarinePartTypeEnum, 'HIGHWATERLINE', INDETERMINATE) -landfield = express_getattr(IfcMarinePartTypeEnum, 'LANDFIELD', INDETERMINATE) -leewardside = express_getattr(IfcMarinePartTypeEnum, 'LEEWARDSIDE', INDETERMINATE) -lowwaterline = express_getattr(IfcMarinePartTypeEnum, 'LOWWATERLINE', INDETERMINATE) -manufacturing = express_getattr(IfcMarinePartTypeEnum, 'MANUFACTURING', INDETERMINATE) -navigationalarea = express_getattr(IfcMarinePartTypeEnum, 'NAVIGATIONALAREA', INDETERMINATE) -protection = express_getattr(IfcMarinePartTypeEnum, 'PROTECTION', INDETERMINATE) -shiptransfer = express_getattr(IfcMarinePartTypeEnum, 'SHIPTRANSFER', INDETERMINATE) -storagearea = express_getattr(IfcMarinePartTypeEnum, 'STORAGEAREA', INDETERMINATE) -vehicleservicing = express_getattr(IfcMarinePartTypeEnum, 'VEHICLESERVICING', INDETERMINATE) -waterfield = express_getattr(IfcMarinePartTypeEnum, 'WATERFIELD', INDETERMINATE) -weatherside = express_getattr(IfcMarinePartTypeEnum, 'WEATHERSIDE', INDETERMINATE) -userdefined = express_getattr(IfcMarinePartTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcMarinePartTypeEnum, 'NOTDEFINED', INDETERMINATE) +abovewaterline = IfcMarinePartTypeEnum.ABOVEWATERLINE +anchorage = IfcMarinePartTypeEnum.ANCHORAGE +approachchannel = IfcMarinePartTypeEnum.APPROACHCHANNEL +belowwaterline = IfcMarinePartTypeEnum.BELOWWATERLINE +berthingstructure = IfcMarinePartTypeEnum.BERTHINGSTRUCTURE +chamber = IfcMarinePartTypeEnum.CHAMBER +cill_level = IfcMarinePartTypeEnum.CILL_LEVEL +copelevel = IfcMarinePartTypeEnum.COPELEVEL +core = IfcMarinePartTypeEnum.CORE +crest = IfcMarinePartTypeEnum.CREST +gatehead = IfcMarinePartTypeEnum.GATEHEAD +gudingstructure = IfcMarinePartTypeEnum.GUDINGSTRUCTURE +highwaterline = IfcMarinePartTypeEnum.HIGHWATERLINE +landfield = IfcMarinePartTypeEnum.LANDFIELD +leewardside = IfcMarinePartTypeEnum.LEEWARDSIDE +lowwaterline = IfcMarinePartTypeEnum.LOWWATERLINE +manufacturing = IfcMarinePartTypeEnum.MANUFACTURING +navigationalarea = IfcMarinePartTypeEnum.NAVIGATIONALAREA +protection = IfcMarinePartTypeEnum.PROTECTION +shiptransfer = IfcMarinePartTypeEnum.SHIPTRANSFER +storagearea = IfcMarinePartTypeEnum.STORAGEAREA +vehicleservicing = IfcMarinePartTypeEnum.VEHICLESERVICING +waterfield = IfcMarinePartTypeEnum.WATERFIELD +weatherside = IfcMarinePartTypeEnum.WEATHERSIDE +userdefined = IfcMarinePartTypeEnum.USERDEFINED +notdefined = IfcMarinePartTypeEnum.NOTDEFINED IfcMechanicalFastenerTypeEnum = enum_namespace() -anchorbolt = express_getattr(IfcMechanicalFastenerTypeEnum, 'ANCHORBOLT', INDETERMINATE) -bolt = express_getattr(IfcMechanicalFastenerTypeEnum, 'BOLT', INDETERMINATE) -chain = express_getattr(IfcMechanicalFastenerTypeEnum, 'CHAIN', INDETERMINATE) -coupler = express_getattr(IfcMechanicalFastenerTypeEnum, 'COUPLER', INDETERMINATE) -dowel = express_getattr(IfcMechanicalFastenerTypeEnum, 'DOWEL', INDETERMINATE) -nail = express_getattr(IfcMechanicalFastenerTypeEnum, 'NAIL', INDETERMINATE) -nailplate = express_getattr(IfcMechanicalFastenerTypeEnum, 'NAILPLATE', INDETERMINATE) -railfastening = express_getattr(IfcMechanicalFastenerTypeEnum, 'RAILFASTENING', INDETERMINATE) -railjoint = express_getattr(IfcMechanicalFastenerTypeEnum, 'RAILJOINT', INDETERMINATE) -rivet = express_getattr(IfcMechanicalFastenerTypeEnum, 'RIVET', INDETERMINATE) -rope = express_getattr(IfcMechanicalFastenerTypeEnum, 'ROPE', INDETERMINATE) -screw = express_getattr(IfcMechanicalFastenerTypeEnum, 'SCREW', INDETERMINATE) -shearconnector = express_getattr(IfcMechanicalFastenerTypeEnum, 'SHEARCONNECTOR', INDETERMINATE) -staple = express_getattr(IfcMechanicalFastenerTypeEnum, 'STAPLE', INDETERMINATE) -studshearconnector = express_getattr(IfcMechanicalFastenerTypeEnum, 'STUDSHEARCONNECTOR', INDETERMINATE) -userdefined = express_getattr(IfcMechanicalFastenerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcMechanicalFastenerTypeEnum, 'NOTDEFINED', INDETERMINATE) +anchorbolt = IfcMechanicalFastenerTypeEnum.ANCHORBOLT +bolt = IfcMechanicalFastenerTypeEnum.BOLT +chain = IfcMechanicalFastenerTypeEnum.CHAIN +coupler = IfcMechanicalFastenerTypeEnum.COUPLER +dowel = IfcMechanicalFastenerTypeEnum.DOWEL +nail = IfcMechanicalFastenerTypeEnum.NAIL +nailplate = IfcMechanicalFastenerTypeEnum.NAILPLATE +railfastening = IfcMechanicalFastenerTypeEnum.RAILFASTENING +railjoint = IfcMechanicalFastenerTypeEnum.RAILJOINT +rivet = IfcMechanicalFastenerTypeEnum.RIVET +rope = IfcMechanicalFastenerTypeEnum.ROPE +screw = IfcMechanicalFastenerTypeEnum.SCREW +shearconnector = IfcMechanicalFastenerTypeEnum.SHEARCONNECTOR +staple = IfcMechanicalFastenerTypeEnum.STAPLE +studshearconnector = IfcMechanicalFastenerTypeEnum.STUDSHEARCONNECTOR +userdefined = IfcMechanicalFastenerTypeEnum.USERDEFINED +notdefined = IfcMechanicalFastenerTypeEnum.NOTDEFINED IfcMedicalDeviceTypeEnum = enum_namespace() -airstation = express_getattr(IfcMedicalDeviceTypeEnum, 'AIRSTATION', INDETERMINATE) -feedairunit = express_getattr(IfcMedicalDeviceTypeEnum, 'FEEDAIRUNIT', INDETERMINATE) -oxygengenerator = express_getattr(IfcMedicalDeviceTypeEnum, 'OXYGENGENERATOR', INDETERMINATE) -oxygenplant = express_getattr(IfcMedicalDeviceTypeEnum, 'OXYGENPLANT', INDETERMINATE) -vacuumstation = express_getattr(IfcMedicalDeviceTypeEnum, 'VACUUMSTATION', INDETERMINATE) -userdefined = express_getattr(IfcMedicalDeviceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcMedicalDeviceTypeEnum, 'NOTDEFINED', INDETERMINATE) +airstation = IfcMedicalDeviceTypeEnum.AIRSTATION +feedairunit = IfcMedicalDeviceTypeEnum.FEEDAIRUNIT +oxygengenerator = IfcMedicalDeviceTypeEnum.OXYGENGENERATOR +oxygenplant = IfcMedicalDeviceTypeEnum.OXYGENPLANT +vacuumstation = IfcMedicalDeviceTypeEnum.VACUUMSTATION +userdefined = IfcMedicalDeviceTypeEnum.USERDEFINED +notdefined = IfcMedicalDeviceTypeEnum.NOTDEFINED IfcMemberTypeEnum = enum_namespace() -arch_segment = express_getattr(IfcMemberTypeEnum, 'ARCH_SEGMENT', INDETERMINATE) -brace = express_getattr(IfcMemberTypeEnum, 'BRACE', INDETERMINATE) -chord = express_getattr(IfcMemberTypeEnum, 'CHORD', INDETERMINATE) -collar = express_getattr(IfcMemberTypeEnum, 'COLLAR', INDETERMINATE) -member = express_getattr(IfcMemberTypeEnum, 'MEMBER', INDETERMINATE) -mullion = express_getattr(IfcMemberTypeEnum, 'MULLION', INDETERMINATE) -plate = express_getattr(IfcMemberTypeEnum, 'PLATE', INDETERMINATE) -post = express_getattr(IfcMemberTypeEnum, 'POST', INDETERMINATE) -purlin = express_getattr(IfcMemberTypeEnum, 'PURLIN', INDETERMINATE) -rafter = express_getattr(IfcMemberTypeEnum, 'RAFTER', INDETERMINATE) -stay_cable = express_getattr(IfcMemberTypeEnum, 'STAY_CABLE', INDETERMINATE) -stiffening_rib = express_getattr(IfcMemberTypeEnum, 'STIFFENING_RIB', INDETERMINATE) -stringer = express_getattr(IfcMemberTypeEnum, 'STRINGER', INDETERMINATE) -structuralcable = express_getattr(IfcMemberTypeEnum, 'STRUCTURALCABLE', INDETERMINATE) -strut = express_getattr(IfcMemberTypeEnum, 'STRUT', INDETERMINATE) -stud = express_getattr(IfcMemberTypeEnum, 'STUD', INDETERMINATE) -suspender = express_getattr(IfcMemberTypeEnum, 'SUSPENDER', INDETERMINATE) -suspension_cable = express_getattr(IfcMemberTypeEnum, 'SUSPENSION_CABLE', INDETERMINATE) -tiebar = express_getattr(IfcMemberTypeEnum, 'TIEBAR', INDETERMINATE) -userdefined = express_getattr(IfcMemberTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcMemberTypeEnum, 'NOTDEFINED', INDETERMINATE) +arch_segment = IfcMemberTypeEnum.ARCH_SEGMENT +brace = IfcMemberTypeEnum.BRACE +chord = IfcMemberTypeEnum.CHORD +collar = IfcMemberTypeEnum.COLLAR +member = IfcMemberTypeEnum.MEMBER +mullion = IfcMemberTypeEnum.MULLION +plate = IfcMemberTypeEnum.PLATE +post = IfcMemberTypeEnum.POST +purlin = IfcMemberTypeEnum.PURLIN +rafter = IfcMemberTypeEnum.RAFTER +stay_cable = IfcMemberTypeEnum.STAY_CABLE +stiffening_rib = IfcMemberTypeEnum.STIFFENING_RIB +stringer = IfcMemberTypeEnum.STRINGER +structuralcable = IfcMemberTypeEnum.STRUCTURALCABLE +strut = IfcMemberTypeEnum.STRUT +stud = IfcMemberTypeEnum.STUD +suspender = IfcMemberTypeEnum.SUSPENDER +suspension_cable = IfcMemberTypeEnum.SUSPENSION_CABLE +tiebar = IfcMemberTypeEnum.TIEBAR +userdefined = IfcMemberTypeEnum.USERDEFINED +notdefined = IfcMemberTypeEnum.NOTDEFINED IfcMobileTelecommunicationsApplianceTypeEnum = enum_namespace() -accesspoint = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'ACCESSPOINT', INDETERMINATE) -basebandunit = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'BASEBANDUNIT', INDETERMINATE) -basetransceiverstation = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'BASETRANSCEIVERSTATION', INDETERMINATE) -e_utran_node_b = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'E_UTRAN_NODE_B', INDETERMINATE) -gateway_gprs_support_node = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'GATEWAY_GPRS_SUPPORT_NODE', INDETERMINATE) -masterunit = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'MASTERUNIT', INDETERMINATE) -mobileswitchingcenter = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'MOBILESWITCHINGCENTER', INDETERMINATE) -mscserver = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'MSCSERVER', INDETERMINATE) -packetcontrolunit = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'PACKETCONTROLUNIT', INDETERMINATE) -remoteradiounit = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'REMOTERADIOUNIT', INDETERMINATE) -remoteunit = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'REMOTEUNIT', INDETERMINATE) -service_gprs_support_node = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'SERVICE_GPRS_SUPPORT_NODE', INDETERMINATE) -subscriberserver = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'SUBSCRIBERSERVER', INDETERMINATE) -userdefined = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'NOTDEFINED', INDETERMINATE) +accesspoint = IfcMobileTelecommunicationsApplianceTypeEnum.ACCESSPOINT +basebandunit = IfcMobileTelecommunicationsApplianceTypeEnum.BASEBANDUNIT +basetransceiverstation = IfcMobileTelecommunicationsApplianceTypeEnum.BASETRANSCEIVERSTATION +e_utran_node_b = IfcMobileTelecommunicationsApplianceTypeEnum.E_UTRAN_NODE_B +gateway_gprs_support_node = IfcMobileTelecommunicationsApplianceTypeEnum.GATEWAY_GPRS_SUPPORT_NODE +masterunit = IfcMobileTelecommunicationsApplianceTypeEnum.MASTERUNIT +mobileswitchingcenter = IfcMobileTelecommunicationsApplianceTypeEnum.MOBILESWITCHINGCENTER +mscserver = IfcMobileTelecommunicationsApplianceTypeEnum.MSCSERVER +packetcontrolunit = IfcMobileTelecommunicationsApplianceTypeEnum.PACKETCONTROLUNIT +remoteradiounit = IfcMobileTelecommunicationsApplianceTypeEnum.REMOTERADIOUNIT +remoteunit = IfcMobileTelecommunicationsApplianceTypeEnum.REMOTEUNIT +service_gprs_support_node = IfcMobileTelecommunicationsApplianceTypeEnum.SERVICE_GPRS_SUPPORT_NODE +subscriberserver = IfcMobileTelecommunicationsApplianceTypeEnum.SUBSCRIBERSERVER +userdefined = IfcMobileTelecommunicationsApplianceTypeEnum.USERDEFINED +notdefined = IfcMobileTelecommunicationsApplianceTypeEnum.NOTDEFINED IfcMooringDeviceTypeEnum = enum_namespace() -bollard = express_getattr(IfcMooringDeviceTypeEnum, 'BOLLARD', INDETERMINATE) -linetensioner = express_getattr(IfcMooringDeviceTypeEnum, 'LINETENSIONER', INDETERMINATE) -magneticdevice = express_getattr(IfcMooringDeviceTypeEnum, 'MAGNETICDEVICE', INDETERMINATE) -mooringhooks = express_getattr(IfcMooringDeviceTypeEnum, 'MOORINGHOOKS', INDETERMINATE) -vacuumdevice = express_getattr(IfcMooringDeviceTypeEnum, 'VACUUMDEVICE', INDETERMINATE) -userdefined = express_getattr(IfcMooringDeviceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcMooringDeviceTypeEnum, 'NOTDEFINED', INDETERMINATE) +bollard = IfcMooringDeviceTypeEnum.BOLLARD +linetensioner = IfcMooringDeviceTypeEnum.LINETENSIONER +magneticdevice = IfcMooringDeviceTypeEnum.MAGNETICDEVICE +mooringhooks = IfcMooringDeviceTypeEnum.MOORINGHOOKS +vacuumdevice = IfcMooringDeviceTypeEnum.VACUUMDEVICE +userdefined = IfcMooringDeviceTypeEnum.USERDEFINED +notdefined = IfcMooringDeviceTypeEnum.NOTDEFINED IfcMotorConnectionTypeEnum = enum_namespace() -beltdrive = express_getattr(IfcMotorConnectionTypeEnum, 'BELTDRIVE', INDETERMINATE) -coupling = express_getattr(IfcMotorConnectionTypeEnum, 'COUPLING', INDETERMINATE) -directdrive = express_getattr(IfcMotorConnectionTypeEnum, 'DIRECTDRIVE', INDETERMINATE) -userdefined = express_getattr(IfcMotorConnectionTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcMotorConnectionTypeEnum, 'NOTDEFINED', INDETERMINATE) +beltdrive = IfcMotorConnectionTypeEnum.BELTDRIVE +coupling = IfcMotorConnectionTypeEnum.COUPLING +directdrive = IfcMotorConnectionTypeEnum.DIRECTDRIVE +userdefined = IfcMotorConnectionTypeEnum.USERDEFINED +notdefined = IfcMotorConnectionTypeEnum.NOTDEFINED IfcNavigationElementTypeEnum = enum_namespace() -beacon = express_getattr(IfcNavigationElementTypeEnum, 'BEACON', INDETERMINATE) -buoy = express_getattr(IfcNavigationElementTypeEnum, 'BUOY', INDETERMINATE) -userdefined = express_getattr(IfcNavigationElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcNavigationElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +beacon = IfcNavigationElementTypeEnum.BEACON +buoy = IfcNavigationElementTypeEnum.BUOY +userdefined = IfcNavigationElementTypeEnum.USERDEFINED +notdefined = IfcNavigationElementTypeEnum.NOTDEFINED IfcObjectTypeEnum = enum_namespace() -actor = express_getattr(IfcObjectTypeEnum, 'ACTOR', INDETERMINATE) -control = express_getattr(IfcObjectTypeEnum, 'CONTROL', INDETERMINATE) -group = express_getattr(IfcObjectTypeEnum, 'GROUP', INDETERMINATE) -process = express_getattr(IfcObjectTypeEnum, 'PROCESS', INDETERMINATE) -product = express_getattr(IfcObjectTypeEnum, 'PRODUCT', INDETERMINATE) -project = express_getattr(IfcObjectTypeEnum, 'PROJECT', INDETERMINATE) -resource = express_getattr(IfcObjectTypeEnum, 'RESOURCE', INDETERMINATE) -notdefined = express_getattr(IfcObjectTypeEnum, 'NOTDEFINED', INDETERMINATE) +actor = IfcObjectTypeEnum.ACTOR +control = IfcObjectTypeEnum.CONTROL +group = IfcObjectTypeEnum.GROUP +process = IfcObjectTypeEnum.PROCESS +product = IfcObjectTypeEnum.PRODUCT +project = IfcObjectTypeEnum.PROJECT +resource = IfcObjectTypeEnum.RESOURCE +notdefined = IfcObjectTypeEnum.NOTDEFINED IfcObjectiveEnum = enum_namespace() -codecompliance = express_getattr(IfcObjectiveEnum, 'CODECOMPLIANCE', INDETERMINATE) -codewaiver = express_getattr(IfcObjectiveEnum, 'CODEWAIVER', INDETERMINATE) -designintent = express_getattr(IfcObjectiveEnum, 'DESIGNINTENT', INDETERMINATE) -external = express_getattr(IfcObjectiveEnum, 'EXTERNAL', INDETERMINATE) -healthandsafety = express_getattr(IfcObjectiveEnum, 'HEALTHANDSAFETY', INDETERMINATE) -mergeconflict = express_getattr(IfcObjectiveEnum, 'MERGECONFLICT', INDETERMINATE) -modelview = express_getattr(IfcObjectiveEnum, 'MODELVIEW', INDETERMINATE) -parameter = express_getattr(IfcObjectiveEnum, 'PARAMETER', INDETERMINATE) -requirement = express_getattr(IfcObjectiveEnum, 'REQUIREMENT', INDETERMINATE) -specification = express_getattr(IfcObjectiveEnum, 'SPECIFICATION', INDETERMINATE) -triggercondition = express_getattr(IfcObjectiveEnum, 'TRIGGERCONDITION', INDETERMINATE) -userdefined = express_getattr(IfcObjectiveEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcObjectiveEnum, 'NOTDEFINED', INDETERMINATE) +codecompliance = IfcObjectiveEnum.CODECOMPLIANCE +codewaiver = IfcObjectiveEnum.CODEWAIVER +designintent = IfcObjectiveEnum.DESIGNINTENT +external = IfcObjectiveEnum.EXTERNAL +healthandsafety = IfcObjectiveEnum.HEALTHANDSAFETY +mergeconflict = IfcObjectiveEnum.MERGECONFLICT +modelview = IfcObjectiveEnum.MODELVIEW +parameter = IfcObjectiveEnum.PARAMETER +requirement = IfcObjectiveEnum.REQUIREMENT +specification = IfcObjectiveEnum.SPECIFICATION +triggercondition = IfcObjectiveEnum.TRIGGERCONDITION +userdefined = IfcObjectiveEnum.USERDEFINED +notdefined = IfcObjectiveEnum.NOTDEFINED IfcOccupantTypeEnum = enum_namespace() -assignee = express_getattr(IfcOccupantTypeEnum, 'ASSIGNEE', INDETERMINATE) -assignor = express_getattr(IfcOccupantTypeEnum, 'ASSIGNOR', INDETERMINATE) -lessee = express_getattr(IfcOccupantTypeEnum, 'LESSEE', INDETERMINATE) -lessor = express_getattr(IfcOccupantTypeEnum, 'LESSOR', INDETERMINATE) -lettingagent = express_getattr(IfcOccupantTypeEnum, 'LETTINGAGENT', INDETERMINATE) -owner = express_getattr(IfcOccupantTypeEnum, 'OWNER', INDETERMINATE) -tenant = express_getattr(IfcOccupantTypeEnum, 'TENANT', INDETERMINATE) -userdefined = express_getattr(IfcOccupantTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcOccupantTypeEnum, 'NOTDEFINED', INDETERMINATE) +assignee = IfcOccupantTypeEnum.ASSIGNEE +assignor = IfcOccupantTypeEnum.ASSIGNOR +lessee = IfcOccupantTypeEnum.LESSEE +lessor = IfcOccupantTypeEnum.LESSOR +lettingagent = IfcOccupantTypeEnum.LETTINGAGENT +owner = IfcOccupantTypeEnum.OWNER +tenant = IfcOccupantTypeEnum.TENANT +userdefined = IfcOccupantTypeEnum.USERDEFINED +notdefined = IfcOccupantTypeEnum.NOTDEFINED IfcOpeningElementTypeEnum = enum_namespace() -opening = express_getattr(IfcOpeningElementTypeEnum, 'OPENING', INDETERMINATE) -recess = express_getattr(IfcOpeningElementTypeEnum, 'RECESS', INDETERMINATE) -userdefined = express_getattr(IfcOpeningElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcOpeningElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +opening = IfcOpeningElementTypeEnum.OPENING +recess = IfcOpeningElementTypeEnum.RECESS +userdefined = IfcOpeningElementTypeEnum.USERDEFINED +notdefined = IfcOpeningElementTypeEnum.NOTDEFINED IfcOutletTypeEnum = enum_namespace() -audiovisualoutlet = express_getattr(IfcOutletTypeEnum, 'AUDIOVISUALOUTLET', INDETERMINATE) -communicationsoutlet = express_getattr(IfcOutletTypeEnum, 'COMMUNICATIONSOUTLET', INDETERMINATE) -dataoutlet = express_getattr(IfcOutletTypeEnum, 'DATAOUTLET', INDETERMINATE) -poweroutlet = express_getattr(IfcOutletTypeEnum, 'POWEROUTLET', INDETERMINATE) -telephoneoutlet = express_getattr(IfcOutletTypeEnum, 'TELEPHONEOUTLET', INDETERMINATE) -userdefined = express_getattr(IfcOutletTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcOutletTypeEnum, 'NOTDEFINED', INDETERMINATE) +audiovisualoutlet = IfcOutletTypeEnum.AUDIOVISUALOUTLET +communicationsoutlet = IfcOutletTypeEnum.COMMUNICATIONSOUTLET +dataoutlet = IfcOutletTypeEnum.DATAOUTLET +poweroutlet = IfcOutletTypeEnum.POWEROUTLET +telephoneoutlet = IfcOutletTypeEnum.TELEPHONEOUTLET +userdefined = IfcOutletTypeEnum.USERDEFINED +notdefined = IfcOutletTypeEnum.NOTDEFINED IfcPavementTypeEnum = enum_namespace() -flexible = express_getattr(IfcPavementTypeEnum, 'FLEXIBLE', INDETERMINATE) -rigid = express_getattr(IfcPavementTypeEnum, 'RIGID', INDETERMINATE) -userdefined = express_getattr(IfcPavementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPavementTypeEnum, 'NOTDEFINED', INDETERMINATE) +flexible = IfcPavementTypeEnum.FLEXIBLE +rigid = IfcPavementTypeEnum.RIGID +userdefined = IfcPavementTypeEnum.USERDEFINED +notdefined = IfcPavementTypeEnum.NOTDEFINED IfcPerformanceHistoryTypeEnum = enum_namespace() -userdefined = express_getattr(IfcPerformanceHistoryTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPerformanceHistoryTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcPerformanceHistoryTypeEnum.USERDEFINED +notdefined = IfcPerformanceHistoryTypeEnum.NOTDEFINED IfcPermeableCoveringOperationEnum = enum_namespace() -grill = express_getattr(IfcPermeableCoveringOperationEnum, 'GRILL', INDETERMINATE) -louver = express_getattr(IfcPermeableCoveringOperationEnum, 'LOUVER', INDETERMINATE) -screen = express_getattr(IfcPermeableCoveringOperationEnum, 'SCREEN', INDETERMINATE) -userdefined = express_getattr(IfcPermeableCoveringOperationEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPermeableCoveringOperationEnum, 'NOTDEFINED', INDETERMINATE) +grill = IfcPermeableCoveringOperationEnum.GRILL +louver = IfcPermeableCoveringOperationEnum.LOUVER +screen = IfcPermeableCoveringOperationEnum.SCREEN +userdefined = IfcPermeableCoveringOperationEnum.USERDEFINED +notdefined = IfcPermeableCoveringOperationEnum.NOTDEFINED IfcPermitTypeEnum = enum_namespace() -access = express_getattr(IfcPermitTypeEnum, 'ACCESS', INDETERMINATE) -building = express_getattr(IfcPermitTypeEnum, 'BUILDING', INDETERMINATE) -work = express_getattr(IfcPermitTypeEnum, 'WORK', INDETERMINATE) -userdefined = express_getattr(IfcPermitTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPermitTypeEnum, 'NOTDEFINED', INDETERMINATE) +access = IfcPermitTypeEnum.ACCESS +building = IfcPermitTypeEnum.BUILDING +work = IfcPermitTypeEnum.WORK +userdefined = IfcPermitTypeEnum.USERDEFINED +notdefined = IfcPermitTypeEnum.NOTDEFINED IfcPhysicalOrVirtualEnum = enum_namespace() -physical = express_getattr(IfcPhysicalOrVirtualEnum, 'PHYSICAL', INDETERMINATE) -virtual = express_getattr(IfcPhysicalOrVirtualEnum, 'VIRTUAL', INDETERMINATE) -notdefined = express_getattr(IfcPhysicalOrVirtualEnum, 'NOTDEFINED', INDETERMINATE) +physical = IfcPhysicalOrVirtualEnum.PHYSICAL +virtual = IfcPhysicalOrVirtualEnum.VIRTUAL +notdefined = IfcPhysicalOrVirtualEnum.NOTDEFINED IfcPileConstructionEnum = enum_namespace() -cast_in_place = express_getattr(IfcPileConstructionEnum, 'CAST_IN_PLACE', INDETERMINATE) -composite = express_getattr(IfcPileConstructionEnum, 'COMPOSITE', INDETERMINATE) -precast_concrete = express_getattr(IfcPileConstructionEnum, 'PRECAST_CONCRETE', INDETERMINATE) -prefab_steel = express_getattr(IfcPileConstructionEnum, 'PREFAB_STEEL', INDETERMINATE) -userdefined = express_getattr(IfcPileConstructionEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPileConstructionEnum, 'NOTDEFINED', INDETERMINATE) +cast_in_place = IfcPileConstructionEnum.CAST_IN_PLACE +composite = IfcPileConstructionEnum.COMPOSITE +precast_concrete = IfcPileConstructionEnum.PRECAST_CONCRETE +prefab_steel = IfcPileConstructionEnum.PREFAB_STEEL +userdefined = IfcPileConstructionEnum.USERDEFINED +notdefined = IfcPileConstructionEnum.NOTDEFINED IfcPileTypeEnum = enum_namespace() -bored = express_getattr(IfcPileTypeEnum, 'BORED', INDETERMINATE) -cohesion = express_getattr(IfcPileTypeEnum, 'COHESION', INDETERMINATE) -driven = express_getattr(IfcPileTypeEnum, 'DRIVEN', INDETERMINATE) -friction = express_getattr(IfcPileTypeEnum, 'FRICTION', INDETERMINATE) -jetgrouting = express_getattr(IfcPileTypeEnum, 'JETGROUTING', INDETERMINATE) -support = express_getattr(IfcPileTypeEnum, 'SUPPORT', INDETERMINATE) -userdefined = express_getattr(IfcPileTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPileTypeEnum, 'NOTDEFINED', INDETERMINATE) +bored = IfcPileTypeEnum.BORED +cohesion = IfcPileTypeEnum.COHESION +driven = IfcPileTypeEnum.DRIVEN +friction = IfcPileTypeEnum.FRICTION +jetgrouting = IfcPileTypeEnum.JETGROUTING +support = IfcPileTypeEnum.SUPPORT +userdefined = IfcPileTypeEnum.USERDEFINED +notdefined = IfcPileTypeEnum.NOTDEFINED IfcPipeFittingTypeEnum = enum_namespace() -bend = express_getattr(IfcPipeFittingTypeEnum, 'BEND', INDETERMINATE) -connector = express_getattr(IfcPipeFittingTypeEnum, 'CONNECTOR', INDETERMINATE) -entry = express_getattr(IfcPipeFittingTypeEnum, 'ENTRY', INDETERMINATE) -exit = express_getattr(IfcPipeFittingTypeEnum, 'EXIT', INDETERMINATE) -junction = express_getattr(IfcPipeFittingTypeEnum, 'JUNCTION', INDETERMINATE) -obstruction = express_getattr(IfcPipeFittingTypeEnum, 'OBSTRUCTION', INDETERMINATE) -transition = express_getattr(IfcPipeFittingTypeEnum, 'TRANSITION', INDETERMINATE) -userdefined = express_getattr(IfcPipeFittingTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPipeFittingTypeEnum, 'NOTDEFINED', INDETERMINATE) +bend = IfcPipeFittingTypeEnum.BEND +connector = IfcPipeFittingTypeEnum.CONNECTOR +entry = IfcPipeFittingTypeEnum.ENTRY +exit = IfcPipeFittingTypeEnum.EXIT +junction = IfcPipeFittingTypeEnum.JUNCTION +obstruction = IfcPipeFittingTypeEnum.OBSTRUCTION +transition = IfcPipeFittingTypeEnum.TRANSITION +userdefined = IfcPipeFittingTypeEnum.USERDEFINED +notdefined = IfcPipeFittingTypeEnum.NOTDEFINED IfcPipeSegmentTypeEnum = enum_namespace() -culvert = express_getattr(IfcPipeSegmentTypeEnum, 'CULVERT', INDETERMINATE) -flexiblesegment = express_getattr(IfcPipeSegmentTypeEnum, 'FLEXIBLESEGMENT', INDETERMINATE) -gutter = express_getattr(IfcPipeSegmentTypeEnum, 'GUTTER', INDETERMINATE) -rigidsegment = express_getattr(IfcPipeSegmentTypeEnum, 'RIGIDSEGMENT', INDETERMINATE) -spool = express_getattr(IfcPipeSegmentTypeEnum, 'SPOOL', INDETERMINATE) -userdefined = express_getattr(IfcPipeSegmentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPipeSegmentTypeEnum, 'NOTDEFINED', INDETERMINATE) +culvert = IfcPipeSegmentTypeEnum.CULVERT +flexiblesegment = IfcPipeSegmentTypeEnum.FLEXIBLESEGMENT +gutter = IfcPipeSegmentTypeEnum.GUTTER +rigidsegment = IfcPipeSegmentTypeEnum.RIGIDSEGMENT +spool = IfcPipeSegmentTypeEnum.SPOOL +userdefined = IfcPipeSegmentTypeEnum.USERDEFINED +notdefined = IfcPipeSegmentTypeEnum.NOTDEFINED IfcPlateTypeEnum = enum_namespace() -base_plate = express_getattr(IfcPlateTypeEnum, 'BASE_PLATE', INDETERMINATE) -cover_plate = express_getattr(IfcPlateTypeEnum, 'COVER_PLATE', INDETERMINATE) -curtain_panel = express_getattr(IfcPlateTypeEnum, 'CURTAIN_PANEL', INDETERMINATE) -flange_plate = express_getattr(IfcPlateTypeEnum, 'FLANGE_PLATE', INDETERMINATE) -gusset_plate = express_getattr(IfcPlateTypeEnum, 'GUSSET_PLATE', INDETERMINATE) -sheet = express_getattr(IfcPlateTypeEnum, 'SHEET', INDETERMINATE) -splice_plate = express_getattr(IfcPlateTypeEnum, 'SPLICE_PLATE', INDETERMINATE) -stiffener_plate = express_getattr(IfcPlateTypeEnum, 'STIFFENER_PLATE', INDETERMINATE) -web_plate = express_getattr(IfcPlateTypeEnum, 'WEB_PLATE', INDETERMINATE) -userdefined = express_getattr(IfcPlateTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPlateTypeEnum, 'NOTDEFINED', INDETERMINATE) +base_plate = IfcPlateTypeEnum.BASE_PLATE +cover_plate = IfcPlateTypeEnum.COVER_PLATE +curtain_panel = IfcPlateTypeEnum.CURTAIN_PANEL +flange_plate = IfcPlateTypeEnum.FLANGE_PLATE +gusset_plate = IfcPlateTypeEnum.GUSSET_PLATE +sheet = IfcPlateTypeEnum.SHEET +splice_plate = IfcPlateTypeEnum.SPLICE_PLATE +stiffener_plate = IfcPlateTypeEnum.STIFFENER_PLATE +web_plate = IfcPlateTypeEnum.WEB_PLATE +userdefined = IfcPlateTypeEnum.USERDEFINED +notdefined = IfcPlateTypeEnum.NOTDEFINED IfcPreferredSurfaceCurveRepresentation = enum_namespace() -curve3d = express_getattr(IfcPreferredSurfaceCurveRepresentation, 'CURVE3D', INDETERMINATE) -pcurve_s1 = express_getattr(IfcPreferredSurfaceCurveRepresentation, 'PCURVE_S1', INDETERMINATE) -pcurve_s2 = express_getattr(IfcPreferredSurfaceCurveRepresentation, 'PCURVE_S2', INDETERMINATE) +curve3d = IfcPreferredSurfaceCurveRepresentation.CURVE3D +pcurve_s1 = IfcPreferredSurfaceCurveRepresentation.PCURVE_S1 +pcurve_s2 = IfcPreferredSurfaceCurveRepresentation.PCURVE_S2 IfcProcedureTypeEnum = enum_namespace() -advice_caution = express_getattr(IfcProcedureTypeEnum, 'ADVICE_CAUTION', INDETERMINATE) -advice_note = express_getattr(IfcProcedureTypeEnum, 'ADVICE_NOTE', INDETERMINATE) -advice_warning = express_getattr(IfcProcedureTypeEnum, 'ADVICE_WARNING', INDETERMINATE) -calibration = express_getattr(IfcProcedureTypeEnum, 'CALIBRATION', INDETERMINATE) -diagnostic = express_getattr(IfcProcedureTypeEnum, 'DIAGNOSTIC', INDETERMINATE) -shutdown = express_getattr(IfcProcedureTypeEnum, 'SHUTDOWN', INDETERMINATE) -startup = express_getattr(IfcProcedureTypeEnum, 'STARTUP', INDETERMINATE) -userdefined = express_getattr(IfcProcedureTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcProcedureTypeEnum, 'NOTDEFINED', INDETERMINATE) +advice_caution = IfcProcedureTypeEnum.ADVICE_CAUTION +advice_note = IfcProcedureTypeEnum.ADVICE_NOTE +advice_warning = IfcProcedureTypeEnum.ADVICE_WARNING +calibration = IfcProcedureTypeEnum.CALIBRATION +diagnostic = IfcProcedureTypeEnum.DIAGNOSTIC +shutdown = IfcProcedureTypeEnum.SHUTDOWN +startup = IfcProcedureTypeEnum.STARTUP +userdefined = IfcProcedureTypeEnum.USERDEFINED +notdefined = IfcProcedureTypeEnum.NOTDEFINED IfcProfileTypeEnum = enum_namespace() -area = express_getattr(IfcProfileTypeEnum, 'AREA', INDETERMINATE) -curve = express_getattr(IfcProfileTypeEnum, 'CURVE', INDETERMINATE) +area = IfcProfileTypeEnum.AREA +curve = IfcProfileTypeEnum.CURVE IfcProjectOrderTypeEnum = enum_namespace() -changeorder = express_getattr(IfcProjectOrderTypeEnum, 'CHANGEORDER', INDETERMINATE) -maintenanceworkorder = express_getattr(IfcProjectOrderTypeEnum, 'MAINTENANCEWORKORDER', INDETERMINATE) -moveorder = express_getattr(IfcProjectOrderTypeEnum, 'MOVEORDER', INDETERMINATE) -purchaseorder = express_getattr(IfcProjectOrderTypeEnum, 'PURCHASEORDER', INDETERMINATE) -workorder = express_getattr(IfcProjectOrderTypeEnum, 'WORKORDER', INDETERMINATE) -userdefined = express_getattr(IfcProjectOrderTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcProjectOrderTypeEnum, 'NOTDEFINED', INDETERMINATE) +changeorder = IfcProjectOrderTypeEnum.CHANGEORDER +maintenanceworkorder = IfcProjectOrderTypeEnum.MAINTENANCEWORKORDER +moveorder = IfcProjectOrderTypeEnum.MOVEORDER +purchaseorder = IfcProjectOrderTypeEnum.PURCHASEORDER +workorder = IfcProjectOrderTypeEnum.WORKORDER +userdefined = IfcProjectOrderTypeEnum.USERDEFINED +notdefined = IfcProjectOrderTypeEnum.NOTDEFINED IfcProjectedOrTrueLengthEnum = enum_namespace() -projected_length = express_getattr(IfcProjectedOrTrueLengthEnum, 'PROJECTED_LENGTH', INDETERMINATE) -true_length = express_getattr(IfcProjectedOrTrueLengthEnum, 'TRUE_LENGTH', INDETERMINATE) +projected_length = IfcProjectedOrTrueLengthEnum.PROJECTED_LENGTH +true_length = IfcProjectedOrTrueLengthEnum.TRUE_LENGTH IfcProjectionElementTypeEnum = enum_namespace() -blister = express_getattr(IfcProjectionElementTypeEnum, 'BLISTER', INDETERMINATE) -deviator = express_getattr(IfcProjectionElementTypeEnum, 'DEVIATOR', INDETERMINATE) -userdefined = express_getattr(IfcProjectionElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcProjectionElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +blister = IfcProjectionElementTypeEnum.BLISTER +deviator = IfcProjectionElementTypeEnum.DEVIATOR +userdefined = IfcProjectionElementTypeEnum.USERDEFINED +notdefined = IfcProjectionElementTypeEnum.NOTDEFINED IfcPropertySetTemplateTypeEnum = enum_namespace() -pset_materialdriven = express_getattr(IfcPropertySetTemplateTypeEnum, 'PSET_MATERIALDRIVEN', INDETERMINATE) -pset_occurrencedriven = express_getattr(IfcPropertySetTemplateTypeEnum, 'PSET_OCCURRENCEDRIVEN', INDETERMINATE) -pset_performancedriven = express_getattr(IfcPropertySetTemplateTypeEnum, 'PSET_PERFORMANCEDRIVEN', INDETERMINATE) -pset_profiledriven = express_getattr(IfcPropertySetTemplateTypeEnum, 'PSET_PROFILEDRIVEN', INDETERMINATE) -pset_typedrivenonly = express_getattr(IfcPropertySetTemplateTypeEnum, 'PSET_TYPEDRIVENONLY', INDETERMINATE) -pset_typedrivenoverride = express_getattr(IfcPropertySetTemplateTypeEnum, 'PSET_TYPEDRIVENOVERRIDE', INDETERMINATE) -qto_occurrencedriven = express_getattr(IfcPropertySetTemplateTypeEnum, 'QTO_OCCURRENCEDRIVEN', INDETERMINATE) -qto_typedrivenonly = express_getattr(IfcPropertySetTemplateTypeEnum, 'QTO_TYPEDRIVENONLY', INDETERMINATE) -qto_typedrivenoverride = express_getattr(IfcPropertySetTemplateTypeEnum, 'QTO_TYPEDRIVENOVERRIDE', INDETERMINATE) -notdefined = express_getattr(IfcPropertySetTemplateTypeEnum, 'NOTDEFINED', INDETERMINATE) +pset_materialdriven = IfcPropertySetTemplateTypeEnum.PSET_MATERIALDRIVEN +pset_occurrencedriven = IfcPropertySetTemplateTypeEnum.PSET_OCCURRENCEDRIVEN +pset_performancedriven = IfcPropertySetTemplateTypeEnum.PSET_PERFORMANCEDRIVEN +pset_profiledriven = IfcPropertySetTemplateTypeEnum.PSET_PROFILEDRIVEN +pset_typedrivenonly = IfcPropertySetTemplateTypeEnum.PSET_TYPEDRIVENONLY +pset_typedrivenoverride = IfcPropertySetTemplateTypeEnum.PSET_TYPEDRIVENOVERRIDE +qto_occurrencedriven = IfcPropertySetTemplateTypeEnum.QTO_OCCURRENCEDRIVEN +qto_typedrivenonly = IfcPropertySetTemplateTypeEnum.QTO_TYPEDRIVENONLY +qto_typedrivenoverride = IfcPropertySetTemplateTypeEnum.QTO_TYPEDRIVENOVERRIDE +notdefined = IfcPropertySetTemplateTypeEnum.NOTDEFINED IfcProtectiveDeviceTrippingUnitTypeEnum = enum_namespace() -electromagnetic = express_getattr(IfcProtectiveDeviceTrippingUnitTypeEnum, 'ELECTROMAGNETIC', INDETERMINATE) -electronic = express_getattr(IfcProtectiveDeviceTrippingUnitTypeEnum, 'ELECTRONIC', INDETERMINATE) -residualcurrent = express_getattr(IfcProtectiveDeviceTrippingUnitTypeEnum, 'RESIDUALCURRENT', INDETERMINATE) -thermal = express_getattr(IfcProtectiveDeviceTrippingUnitTypeEnum, 'THERMAL', INDETERMINATE) -userdefined = express_getattr(IfcProtectiveDeviceTrippingUnitTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcProtectiveDeviceTrippingUnitTypeEnum, 'NOTDEFINED', INDETERMINATE) +electromagnetic = IfcProtectiveDeviceTrippingUnitTypeEnum.ELECTROMAGNETIC +electronic = IfcProtectiveDeviceTrippingUnitTypeEnum.ELECTRONIC +residualcurrent = IfcProtectiveDeviceTrippingUnitTypeEnum.RESIDUALCURRENT +thermal = IfcProtectiveDeviceTrippingUnitTypeEnum.THERMAL +userdefined = IfcProtectiveDeviceTrippingUnitTypeEnum.USERDEFINED +notdefined = IfcProtectiveDeviceTrippingUnitTypeEnum.NOTDEFINED IfcProtectiveDeviceTypeEnum = enum_namespace() -anti_arcing_device = express_getattr(IfcProtectiveDeviceTypeEnum, 'ANTI_ARCING_DEVICE', INDETERMINATE) -circuitbreaker = express_getattr(IfcProtectiveDeviceTypeEnum, 'CIRCUITBREAKER', INDETERMINATE) -earthingswitch = express_getattr(IfcProtectiveDeviceTypeEnum, 'EARTHINGSWITCH', INDETERMINATE) -earthleakagecircuitbreaker = express_getattr(IfcProtectiveDeviceTypeEnum, 'EARTHLEAKAGECIRCUITBREAKER', INDETERMINATE) -fusedisconnector = express_getattr(IfcProtectiveDeviceTypeEnum, 'FUSEDISCONNECTOR', INDETERMINATE) -residualcurrentcircuitbreaker = express_getattr(IfcProtectiveDeviceTypeEnum, 'RESIDUALCURRENTCIRCUITBREAKER', INDETERMINATE) -residualcurrentswitch = express_getattr(IfcProtectiveDeviceTypeEnum, 'RESIDUALCURRENTSWITCH', INDETERMINATE) -sparkgap = express_getattr(IfcProtectiveDeviceTypeEnum, 'SPARKGAP', INDETERMINATE) -varistor = express_getattr(IfcProtectiveDeviceTypeEnum, 'VARISTOR', INDETERMINATE) -voltagelimiter = express_getattr(IfcProtectiveDeviceTypeEnum, 'VOLTAGELIMITER', INDETERMINATE) -userdefined = express_getattr(IfcProtectiveDeviceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcProtectiveDeviceTypeEnum, 'NOTDEFINED', INDETERMINATE) +anti_arcing_device = IfcProtectiveDeviceTypeEnum.ANTI_ARCING_DEVICE +circuitbreaker = IfcProtectiveDeviceTypeEnum.CIRCUITBREAKER +earthingswitch = IfcProtectiveDeviceTypeEnum.EARTHINGSWITCH +earthleakagecircuitbreaker = IfcProtectiveDeviceTypeEnum.EARTHLEAKAGECIRCUITBREAKER +fusedisconnector = IfcProtectiveDeviceTypeEnum.FUSEDISCONNECTOR +residualcurrentcircuitbreaker = IfcProtectiveDeviceTypeEnum.RESIDUALCURRENTCIRCUITBREAKER +residualcurrentswitch = IfcProtectiveDeviceTypeEnum.RESIDUALCURRENTSWITCH +sparkgap = IfcProtectiveDeviceTypeEnum.SPARKGAP +varistor = IfcProtectiveDeviceTypeEnum.VARISTOR +voltagelimiter = IfcProtectiveDeviceTypeEnum.VOLTAGELIMITER +userdefined = IfcProtectiveDeviceTypeEnum.USERDEFINED +notdefined = IfcProtectiveDeviceTypeEnum.NOTDEFINED IfcPumpTypeEnum = enum_namespace() -circulator = express_getattr(IfcPumpTypeEnum, 'CIRCULATOR', INDETERMINATE) -endsuction = express_getattr(IfcPumpTypeEnum, 'ENDSUCTION', INDETERMINATE) -splitcase = express_getattr(IfcPumpTypeEnum, 'SPLITCASE', INDETERMINATE) -submersiblepump = express_getattr(IfcPumpTypeEnum, 'SUBMERSIBLEPUMP', INDETERMINATE) -sumppump = express_getattr(IfcPumpTypeEnum, 'SUMPPUMP', INDETERMINATE) -verticalinline = express_getattr(IfcPumpTypeEnum, 'VERTICALINLINE', INDETERMINATE) -verticalturbine = express_getattr(IfcPumpTypeEnum, 'VERTICALTURBINE', INDETERMINATE) -userdefined = express_getattr(IfcPumpTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPumpTypeEnum, 'NOTDEFINED', INDETERMINATE) +circulator = IfcPumpTypeEnum.CIRCULATOR +endsuction = IfcPumpTypeEnum.ENDSUCTION +splitcase = IfcPumpTypeEnum.SPLITCASE +submersiblepump = IfcPumpTypeEnum.SUBMERSIBLEPUMP +sumppump = IfcPumpTypeEnum.SUMPPUMP +verticalinline = IfcPumpTypeEnum.VERTICALINLINE +verticalturbine = IfcPumpTypeEnum.VERTICALTURBINE +userdefined = IfcPumpTypeEnum.USERDEFINED +notdefined = IfcPumpTypeEnum.NOTDEFINED IfcRailTypeEnum = enum_namespace() -blade = express_getattr(IfcRailTypeEnum, 'BLADE', INDETERMINATE) -checkrail = express_getattr(IfcRailTypeEnum, 'CHECKRAIL', INDETERMINATE) -guardrail = express_getattr(IfcRailTypeEnum, 'GUARDRAIL', INDETERMINATE) -rackrail = express_getattr(IfcRailTypeEnum, 'RACKRAIL', INDETERMINATE) -rail = express_getattr(IfcRailTypeEnum, 'RAIL', INDETERMINATE) -stockrail = express_getattr(IfcRailTypeEnum, 'STOCKRAIL', INDETERMINATE) -userdefined = express_getattr(IfcRailTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcRailTypeEnum, 'NOTDEFINED', INDETERMINATE) +blade = IfcRailTypeEnum.BLADE +checkrail = IfcRailTypeEnum.CHECKRAIL +guardrail = IfcRailTypeEnum.GUARDRAIL +rackrail = IfcRailTypeEnum.RACKRAIL +rail = IfcRailTypeEnum.RAIL +stockrail = IfcRailTypeEnum.STOCKRAIL +userdefined = IfcRailTypeEnum.USERDEFINED +notdefined = IfcRailTypeEnum.NOTDEFINED IfcRailingTypeEnum = enum_namespace() -balustrade = express_getattr(IfcRailingTypeEnum, 'BALUSTRADE', INDETERMINATE) -fence = express_getattr(IfcRailingTypeEnum, 'FENCE', INDETERMINATE) -guardrail = express_getattr(IfcRailingTypeEnum, 'GUARDRAIL', INDETERMINATE) -handrail = express_getattr(IfcRailingTypeEnum, 'HANDRAIL', INDETERMINATE) -userdefined = express_getattr(IfcRailingTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcRailingTypeEnum, 'NOTDEFINED', INDETERMINATE) +balustrade = IfcRailingTypeEnum.BALUSTRADE +fence = IfcRailingTypeEnum.FENCE +guardrail = IfcRailingTypeEnum.GUARDRAIL +handrail = IfcRailingTypeEnum.HANDRAIL +userdefined = IfcRailingTypeEnum.USERDEFINED +notdefined = IfcRailingTypeEnum.NOTDEFINED IfcRailwayPartTypeEnum = enum_namespace() -dilatationsuperstructure = express_getattr(IfcRailwayPartTypeEnum, 'DILATATIONSUPERSTRUCTURE', INDETERMINATE) -linesidestructure = express_getattr(IfcRailwayPartTypeEnum, 'LINESIDESTRUCTURE', INDETERMINATE) -linesidestructurepart = express_getattr(IfcRailwayPartTypeEnum, 'LINESIDESTRUCTUREPART', INDETERMINATE) -plaintracksuperstructure = express_getattr(IfcRailwayPartTypeEnum, 'PLAINTRACKSUPERSTRUCTURE', INDETERMINATE) -superstructure = express_getattr(IfcRailwayPartTypeEnum, 'SUPERSTRUCTURE', INDETERMINATE) -trackstructure = express_getattr(IfcRailwayPartTypeEnum, 'TRACKSTRUCTURE', INDETERMINATE) -trackstructurepart = express_getattr(IfcRailwayPartTypeEnum, 'TRACKSTRUCTUREPART', INDETERMINATE) -turnoutsuperstructure = express_getattr(IfcRailwayPartTypeEnum, 'TURNOUTSUPERSTRUCTURE', INDETERMINATE) -userdefined = express_getattr(IfcRailwayPartTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcRailwayPartTypeEnum, 'NOTDEFINED', INDETERMINATE) +dilatationsuperstructure = IfcRailwayPartTypeEnum.DILATATIONSUPERSTRUCTURE +linesidestructure = IfcRailwayPartTypeEnum.LINESIDESTRUCTURE +linesidestructurepart = IfcRailwayPartTypeEnum.LINESIDESTRUCTUREPART +plaintracksuperstructure = IfcRailwayPartTypeEnum.PLAINTRACKSUPERSTRUCTURE +superstructure = IfcRailwayPartTypeEnum.SUPERSTRUCTURE +trackstructure = IfcRailwayPartTypeEnum.TRACKSTRUCTURE +trackstructurepart = IfcRailwayPartTypeEnum.TRACKSTRUCTUREPART +turnoutsuperstructure = IfcRailwayPartTypeEnum.TURNOUTSUPERSTRUCTURE +userdefined = IfcRailwayPartTypeEnum.USERDEFINED +notdefined = IfcRailwayPartTypeEnum.NOTDEFINED IfcRailwayTypeEnum = enum_namespace() -userdefined = express_getattr(IfcRailwayTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcRailwayTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcRailwayTypeEnum.USERDEFINED +notdefined = IfcRailwayTypeEnum.NOTDEFINED IfcRampFlightTypeEnum = enum_namespace() -spiral = express_getattr(IfcRampFlightTypeEnum, 'SPIRAL', INDETERMINATE) -straight = express_getattr(IfcRampFlightTypeEnum, 'STRAIGHT', INDETERMINATE) -userdefined = express_getattr(IfcRampFlightTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcRampFlightTypeEnum, 'NOTDEFINED', INDETERMINATE) +spiral = IfcRampFlightTypeEnum.SPIRAL +straight = IfcRampFlightTypeEnum.STRAIGHT +userdefined = IfcRampFlightTypeEnum.USERDEFINED +notdefined = IfcRampFlightTypeEnum.NOTDEFINED IfcRampTypeEnum = enum_namespace() -half_turn_ramp = express_getattr(IfcRampTypeEnum, 'HALF_TURN_RAMP', INDETERMINATE) -quarter_turn_ramp = express_getattr(IfcRampTypeEnum, 'QUARTER_TURN_RAMP', INDETERMINATE) -spiral_ramp = express_getattr(IfcRampTypeEnum, 'SPIRAL_RAMP', INDETERMINATE) -straight_run_ramp = express_getattr(IfcRampTypeEnum, 'STRAIGHT_RUN_RAMP', INDETERMINATE) -two_quarter_turn_ramp = express_getattr(IfcRampTypeEnum, 'TWO_QUARTER_TURN_RAMP', INDETERMINATE) -two_straight_run_ramp = express_getattr(IfcRampTypeEnum, 'TWO_STRAIGHT_RUN_RAMP', INDETERMINATE) -userdefined = express_getattr(IfcRampTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcRampTypeEnum, 'NOTDEFINED', INDETERMINATE) +half_turn_ramp = IfcRampTypeEnum.HALF_TURN_RAMP +quarter_turn_ramp = IfcRampTypeEnum.QUARTER_TURN_RAMP +spiral_ramp = IfcRampTypeEnum.SPIRAL_RAMP +straight_run_ramp = IfcRampTypeEnum.STRAIGHT_RUN_RAMP +two_quarter_turn_ramp = IfcRampTypeEnum.TWO_QUARTER_TURN_RAMP +two_straight_run_ramp = IfcRampTypeEnum.TWO_STRAIGHT_RUN_RAMP +userdefined = IfcRampTypeEnum.USERDEFINED +notdefined = IfcRampTypeEnum.NOTDEFINED IfcRecurrenceTypeEnum = enum_namespace() -by_day_count = express_getattr(IfcRecurrenceTypeEnum, 'BY_DAY_COUNT', INDETERMINATE) -by_weekday_count = express_getattr(IfcRecurrenceTypeEnum, 'BY_WEEKDAY_COUNT', INDETERMINATE) -daily = express_getattr(IfcRecurrenceTypeEnum, 'DAILY', INDETERMINATE) -monthly_by_day_of_month = express_getattr(IfcRecurrenceTypeEnum, 'MONTHLY_BY_DAY_OF_MONTH', INDETERMINATE) -monthly_by_position = express_getattr(IfcRecurrenceTypeEnum, 'MONTHLY_BY_POSITION', INDETERMINATE) -weekly = express_getattr(IfcRecurrenceTypeEnum, 'WEEKLY', INDETERMINATE) -yearly_by_day_of_month = express_getattr(IfcRecurrenceTypeEnum, 'YEARLY_BY_DAY_OF_MONTH', INDETERMINATE) -yearly_by_position = express_getattr(IfcRecurrenceTypeEnum, 'YEARLY_BY_POSITION', INDETERMINATE) +by_day_count = IfcRecurrenceTypeEnum.BY_DAY_COUNT +by_weekday_count = IfcRecurrenceTypeEnum.BY_WEEKDAY_COUNT +daily = IfcRecurrenceTypeEnum.DAILY +monthly_by_day_of_month = IfcRecurrenceTypeEnum.MONTHLY_BY_DAY_OF_MONTH +monthly_by_position = IfcRecurrenceTypeEnum.MONTHLY_BY_POSITION +weekly = IfcRecurrenceTypeEnum.WEEKLY +yearly_by_day_of_month = IfcRecurrenceTypeEnum.YEARLY_BY_DAY_OF_MONTH +yearly_by_position = IfcRecurrenceTypeEnum.YEARLY_BY_POSITION IfcReferentTypeEnum = enum_namespace() -boundary = express_getattr(IfcReferentTypeEnum, 'BOUNDARY', INDETERMINATE) -intersection = express_getattr(IfcReferentTypeEnum, 'INTERSECTION', INDETERMINATE) -kilopoint = express_getattr(IfcReferentTypeEnum, 'KILOPOINT', INDETERMINATE) -landmark = express_getattr(IfcReferentTypeEnum, 'LANDMARK', INDETERMINATE) -milepoint = express_getattr(IfcReferentTypeEnum, 'MILEPOINT', INDETERMINATE) -position = express_getattr(IfcReferentTypeEnum, 'POSITION', INDETERMINATE) -referencemarker = express_getattr(IfcReferentTypeEnum, 'REFERENCEMARKER', INDETERMINATE) -station = express_getattr(IfcReferentTypeEnum, 'STATION', INDETERMINATE) -userdefined = express_getattr(IfcReferentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcReferentTypeEnum, 'NOTDEFINED', INDETERMINATE) +boundary = IfcReferentTypeEnum.BOUNDARY +intersection = IfcReferentTypeEnum.INTERSECTION +kilopoint = IfcReferentTypeEnum.KILOPOINT +landmark = IfcReferentTypeEnum.LANDMARK +milepoint = IfcReferentTypeEnum.MILEPOINT +position = IfcReferentTypeEnum.POSITION +referencemarker = IfcReferentTypeEnum.REFERENCEMARKER +station = IfcReferentTypeEnum.STATION +userdefined = IfcReferentTypeEnum.USERDEFINED +notdefined = IfcReferentTypeEnum.NOTDEFINED IfcReflectanceMethodEnum = enum_namespace() -blinn = express_getattr(IfcReflectanceMethodEnum, 'BLINN', INDETERMINATE) -flat = express_getattr(IfcReflectanceMethodEnum, 'FLAT', INDETERMINATE) -glass = express_getattr(IfcReflectanceMethodEnum, 'GLASS', INDETERMINATE) -matt = express_getattr(IfcReflectanceMethodEnum, 'MATT', INDETERMINATE) -metal = express_getattr(IfcReflectanceMethodEnum, 'METAL', INDETERMINATE) -mirror = express_getattr(IfcReflectanceMethodEnum, 'MIRROR', INDETERMINATE) -phong = express_getattr(IfcReflectanceMethodEnum, 'PHONG', INDETERMINATE) -physical = express_getattr(IfcReflectanceMethodEnum, 'PHYSICAL', INDETERMINATE) -plastic = express_getattr(IfcReflectanceMethodEnum, 'PLASTIC', INDETERMINATE) -strauss = express_getattr(IfcReflectanceMethodEnum, 'STRAUSS', INDETERMINATE) -notdefined = express_getattr(IfcReflectanceMethodEnum, 'NOTDEFINED', INDETERMINATE) +blinn = IfcReflectanceMethodEnum.BLINN +flat = IfcReflectanceMethodEnum.FLAT +glass = IfcReflectanceMethodEnum.GLASS +matt = IfcReflectanceMethodEnum.MATT +metal = IfcReflectanceMethodEnum.METAL +mirror = IfcReflectanceMethodEnum.MIRROR +phong = IfcReflectanceMethodEnum.PHONG +physical = IfcReflectanceMethodEnum.PHYSICAL +plastic = IfcReflectanceMethodEnum.PLASTIC +strauss = IfcReflectanceMethodEnum.STRAUSS +notdefined = IfcReflectanceMethodEnum.NOTDEFINED IfcReinforcedSoilTypeEnum = enum_namespace() -dynamicallycompacted = express_getattr(IfcReinforcedSoilTypeEnum, 'DYNAMICALLYCOMPACTED', INDETERMINATE) -grouted = express_getattr(IfcReinforcedSoilTypeEnum, 'GROUTED', INDETERMINATE) -replaced = express_getattr(IfcReinforcedSoilTypeEnum, 'REPLACED', INDETERMINATE) -rollercompacted = express_getattr(IfcReinforcedSoilTypeEnum, 'ROLLERCOMPACTED', INDETERMINATE) -surchargepreloaded = express_getattr(IfcReinforcedSoilTypeEnum, 'SURCHARGEPRELOADED', INDETERMINATE) -verticallydrained = express_getattr(IfcReinforcedSoilTypeEnum, 'VERTICALLYDRAINED', INDETERMINATE) -userdefined = express_getattr(IfcReinforcedSoilTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcReinforcedSoilTypeEnum, 'NOTDEFINED', INDETERMINATE) +dynamicallycompacted = IfcReinforcedSoilTypeEnum.DYNAMICALLYCOMPACTED +grouted = IfcReinforcedSoilTypeEnum.GROUTED +replaced = IfcReinforcedSoilTypeEnum.REPLACED +rollercompacted = IfcReinforcedSoilTypeEnum.ROLLERCOMPACTED +surchargepreloaded = IfcReinforcedSoilTypeEnum.SURCHARGEPRELOADED +verticallydrained = IfcReinforcedSoilTypeEnum.VERTICALLYDRAINED +userdefined = IfcReinforcedSoilTypeEnum.USERDEFINED +notdefined = IfcReinforcedSoilTypeEnum.NOTDEFINED IfcReinforcingBarRoleEnum = enum_namespace() -anchoring = express_getattr(IfcReinforcingBarRoleEnum, 'ANCHORING', INDETERMINATE) -edge = express_getattr(IfcReinforcingBarRoleEnum, 'EDGE', INDETERMINATE) -ligature = express_getattr(IfcReinforcingBarRoleEnum, 'LIGATURE', INDETERMINATE) -main = express_getattr(IfcReinforcingBarRoleEnum, 'MAIN', INDETERMINATE) -punching = express_getattr(IfcReinforcingBarRoleEnum, 'PUNCHING', INDETERMINATE) -ring = express_getattr(IfcReinforcingBarRoleEnum, 'RING', INDETERMINATE) -shear = express_getattr(IfcReinforcingBarRoleEnum, 'SHEAR', INDETERMINATE) -stud = express_getattr(IfcReinforcingBarRoleEnum, 'STUD', INDETERMINATE) -userdefined = express_getattr(IfcReinforcingBarRoleEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcReinforcingBarRoleEnum, 'NOTDEFINED', INDETERMINATE) +anchoring = IfcReinforcingBarRoleEnum.ANCHORING +edge = IfcReinforcingBarRoleEnum.EDGE +ligature = IfcReinforcingBarRoleEnum.LIGATURE +main = IfcReinforcingBarRoleEnum.MAIN +punching = IfcReinforcingBarRoleEnum.PUNCHING +ring = IfcReinforcingBarRoleEnum.RING +shear = IfcReinforcingBarRoleEnum.SHEAR +stud = IfcReinforcingBarRoleEnum.STUD +userdefined = IfcReinforcingBarRoleEnum.USERDEFINED +notdefined = IfcReinforcingBarRoleEnum.NOTDEFINED IfcReinforcingBarSurfaceEnum = enum_namespace() -plain = express_getattr(IfcReinforcingBarSurfaceEnum, 'PLAIN', INDETERMINATE) -textured = express_getattr(IfcReinforcingBarSurfaceEnum, 'TEXTURED', INDETERMINATE) +plain = IfcReinforcingBarSurfaceEnum.PLAIN +textured = IfcReinforcingBarSurfaceEnum.TEXTURED IfcReinforcingBarTypeEnum = enum_namespace() -anchoring = express_getattr(IfcReinforcingBarTypeEnum, 'ANCHORING', INDETERMINATE) -edge = express_getattr(IfcReinforcingBarTypeEnum, 'EDGE', INDETERMINATE) -ligature = express_getattr(IfcReinforcingBarTypeEnum, 'LIGATURE', INDETERMINATE) -main = express_getattr(IfcReinforcingBarTypeEnum, 'MAIN', INDETERMINATE) -punching = express_getattr(IfcReinforcingBarTypeEnum, 'PUNCHING', INDETERMINATE) -ring = express_getattr(IfcReinforcingBarTypeEnum, 'RING', INDETERMINATE) -shear = express_getattr(IfcReinforcingBarTypeEnum, 'SHEAR', INDETERMINATE) -spacebar = express_getattr(IfcReinforcingBarTypeEnum, 'SPACEBAR', INDETERMINATE) -stud = express_getattr(IfcReinforcingBarTypeEnum, 'STUD', INDETERMINATE) -userdefined = express_getattr(IfcReinforcingBarTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcReinforcingBarTypeEnum, 'NOTDEFINED', INDETERMINATE) +anchoring = IfcReinforcingBarTypeEnum.ANCHORING +edge = IfcReinforcingBarTypeEnum.EDGE +ligature = IfcReinforcingBarTypeEnum.LIGATURE +main = IfcReinforcingBarTypeEnum.MAIN +punching = IfcReinforcingBarTypeEnum.PUNCHING +ring = IfcReinforcingBarTypeEnum.RING +shear = IfcReinforcingBarTypeEnum.SHEAR +spacebar = IfcReinforcingBarTypeEnum.SPACEBAR +stud = IfcReinforcingBarTypeEnum.STUD +userdefined = IfcReinforcingBarTypeEnum.USERDEFINED +notdefined = IfcReinforcingBarTypeEnum.NOTDEFINED IfcReinforcingMeshTypeEnum = enum_namespace() -userdefined = express_getattr(IfcReinforcingMeshTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcReinforcingMeshTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcReinforcingMeshTypeEnum.USERDEFINED +notdefined = IfcReinforcingMeshTypeEnum.NOTDEFINED IfcRoadPartTypeEnum = enum_namespace() -bicyclecrossing = express_getattr(IfcRoadPartTypeEnum, 'BICYCLECROSSING', INDETERMINATE) -bus_stop = express_getattr(IfcRoadPartTypeEnum, 'BUS_STOP', INDETERMINATE) -carriageway = express_getattr(IfcRoadPartTypeEnum, 'CARRIAGEWAY', INDETERMINATE) -centralisland = express_getattr(IfcRoadPartTypeEnum, 'CENTRALISLAND', INDETERMINATE) -centralreserve = express_getattr(IfcRoadPartTypeEnum, 'CENTRALRESERVE', INDETERMINATE) -hardshoulder = express_getattr(IfcRoadPartTypeEnum, 'HARDSHOULDER', INDETERMINATE) -intersection = express_getattr(IfcRoadPartTypeEnum, 'INTERSECTION', INDETERMINATE) -layby = express_getattr(IfcRoadPartTypeEnum, 'LAYBY', INDETERMINATE) -parkingbay = express_getattr(IfcRoadPartTypeEnum, 'PARKINGBAY', INDETERMINATE) -passingbay = express_getattr(IfcRoadPartTypeEnum, 'PASSINGBAY', INDETERMINATE) -pedestrian_crossing = express_getattr(IfcRoadPartTypeEnum, 'PEDESTRIAN_CROSSING', INDETERMINATE) -railwaycrossing = express_getattr(IfcRoadPartTypeEnum, 'RAILWAYCROSSING', INDETERMINATE) -refugeisland = express_getattr(IfcRoadPartTypeEnum, 'REFUGEISLAND', INDETERMINATE) -roadsegment = express_getattr(IfcRoadPartTypeEnum, 'ROADSEGMENT', INDETERMINATE) -roadside = express_getattr(IfcRoadPartTypeEnum, 'ROADSIDE', INDETERMINATE) -roadsidepart = express_getattr(IfcRoadPartTypeEnum, 'ROADSIDEPART', INDETERMINATE) -roadwayplateau = express_getattr(IfcRoadPartTypeEnum, 'ROADWAYPLATEAU', INDETERMINATE) -roundabout = express_getattr(IfcRoadPartTypeEnum, 'ROUNDABOUT', INDETERMINATE) -shoulder = express_getattr(IfcRoadPartTypeEnum, 'SHOULDER', INDETERMINATE) -sidewalk = express_getattr(IfcRoadPartTypeEnum, 'SIDEWALK', INDETERMINATE) -softshoulder = express_getattr(IfcRoadPartTypeEnum, 'SOFTSHOULDER', INDETERMINATE) -tollplaza = express_getattr(IfcRoadPartTypeEnum, 'TOLLPLAZA', INDETERMINATE) -trafficisland = express_getattr(IfcRoadPartTypeEnum, 'TRAFFICISLAND', INDETERMINATE) -trafficlane = express_getattr(IfcRoadPartTypeEnum, 'TRAFFICLANE', INDETERMINATE) -userdefined = express_getattr(IfcRoadPartTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcRoadPartTypeEnum, 'NOTDEFINED', INDETERMINATE) +bicyclecrossing = IfcRoadPartTypeEnum.BICYCLECROSSING +bus_stop = IfcRoadPartTypeEnum.BUS_STOP +carriageway = IfcRoadPartTypeEnum.CARRIAGEWAY +centralisland = IfcRoadPartTypeEnum.CENTRALISLAND +centralreserve = IfcRoadPartTypeEnum.CENTRALRESERVE +hardshoulder = IfcRoadPartTypeEnum.HARDSHOULDER +intersection = IfcRoadPartTypeEnum.INTERSECTION +layby = IfcRoadPartTypeEnum.LAYBY +parkingbay = IfcRoadPartTypeEnum.PARKINGBAY +passingbay = IfcRoadPartTypeEnum.PASSINGBAY +pedestrian_crossing = IfcRoadPartTypeEnum.PEDESTRIAN_CROSSING +railwaycrossing = IfcRoadPartTypeEnum.RAILWAYCROSSING +refugeisland = IfcRoadPartTypeEnum.REFUGEISLAND +roadsegment = IfcRoadPartTypeEnum.ROADSEGMENT +roadside = IfcRoadPartTypeEnum.ROADSIDE +roadsidepart = IfcRoadPartTypeEnum.ROADSIDEPART +roadwayplateau = IfcRoadPartTypeEnum.ROADWAYPLATEAU +roundabout = IfcRoadPartTypeEnum.ROUNDABOUT +shoulder = IfcRoadPartTypeEnum.SHOULDER +sidewalk = IfcRoadPartTypeEnum.SIDEWALK +softshoulder = IfcRoadPartTypeEnum.SOFTSHOULDER +tollplaza = IfcRoadPartTypeEnum.TOLLPLAZA +trafficisland = IfcRoadPartTypeEnum.TRAFFICISLAND +trafficlane = IfcRoadPartTypeEnum.TRAFFICLANE +userdefined = IfcRoadPartTypeEnum.USERDEFINED +notdefined = IfcRoadPartTypeEnum.NOTDEFINED IfcRoadTypeEnum = enum_namespace() -userdefined = express_getattr(IfcRoadTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcRoadTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcRoadTypeEnum.USERDEFINED +notdefined = IfcRoadTypeEnum.NOTDEFINED IfcRoleEnum = enum_namespace() -architect = express_getattr(IfcRoleEnum, 'ARCHITECT', INDETERMINATE) -buildingoperator = express_getattr(IfcRoleEnum, 'BUILDINGOPERATOR', INDETERMINATE) -buildingowner = express_getattr(IfcRoleEnum, 'BUILDINGOWNER', INDETERMINATE) -civilengineer = express_getattr(IfcRoleEnum, 'CIVILENGINEER', INDETERMINATE) -client = express_getattr(IfcRoleEnum, 'CLIENT', INDETERMINATE) -commissioningengineer = express_getattr(IfcRoleEnum, 'COMMISSIONINGENGINEER', INDETERMINATE) -constructionmanager = express_getattr(IfcRoleEnum, 'CONSTRUCTIONMANAGER', INDETERMINATE) -consultant = express_getattr(IfcRoleEnum, 'CONSULTANT', INDETERMINATE) -contractor = express_getattr(IfcRoleEnum, 'CONTRACTOR', INDETERMINATE) -costengineer = express_getattr(IfcRoleEnum, 'COSTENGINEER', INDETERMINATE) -electricalengineer = express_getattr(IfcRoleEnum, 'ELECTRICALENGINEER', INDETERMINATE) -engineer = express_getattr(IfcRoleEnum, 'ENGINEER', INDETERMINATE) -facilitiesmanager = express_getattr(IfcRoleEnum, 'FACILITIESMANAGER', INDETERMINATE) -fieldconstructionmanager = express_getattr(IfcRoleEnum, 'FIELDCONSTRUCTIONMANAGER', INDETERMINATE) -manufacturer = express_getattr(IfcRoleEnum, 'MANUFACTURER', INDETERMINATE) -mechanicalengineer = express_getattr(IfcRoleEnum, 'MECHANICALENGINEER', INDETERMINATE) -owner = express_getattr(IfcRoleEnum, 'OWNER', INDETERMINATE) -projectmanager = express_getattr(IfcRoleEnum, 'PROJECTMANAGER', INDETERMINATE) -reseller = express_getattr(IfcRoleEnum, 'RESELLER', INDETERMINATE) -structuralengineer = express_getattr(IfcRoleEnum, 'STRUCTURALENGINEER', INDETERMINATE) -subcontractor = express_getattr(IfcRoleEnum, 'SUBCONTRACTOR', INDETERMINATE) -supplier = express_getattr(IfcRoleEnum, 'SUPPLIER', INDETERMINATE) -userdefined = express_getattr(IfcRoleEnum, 'USERDEFINED', INDETERMINATE) +architect = IfcRoleEnum.ARCHITECT +buildingoperator = IfcRoleEnum.BUILDINGOPERATOR +buildingowner = IfcRoleEnum.BUILDINGOWNER +civilengineer = IfcRoleEnum.CIVILENGINEER +client = IfcRoleEnum.CLIENT +commissioningengineer = IfcRoleEnum.COMMISSIONINGENGINEER +constructionmanager = IfcRoleEnum.CONSTRUCTIONMANAGER +consultant = IfcRoleEnum.CONSULTANT +contractor = IfcRoleEnum.CONTRACTOR +costengineer = IfcRoleEnum.COSTENGINEER +electricalengineer = IfcRoleEnum.ELECTRICALENGINEER +engineer = IfcRoleEnum.ENGINEER +facilitiesmanager = IfcRoleEnum.FACILITIESMANAGER +fieldconstructionmanager = IfcRoleEnum.FIELDCONSTRUCTIONMANAGER +manufacturer = IfcRoleEnum.MANUFACTURER +mechanicalengineer = IfcRoleEnum.MECHANICALENGINEER +owner = IfcRoleEnum.OWNER +projectmanager = IfcRoleEnum.PROJECTMANAGER +reseller = IfcRoleEnum.RESELLER +structuralengineer = IfcRoleEnum.STRUCTURALENGINEER +subcontractor = IfcRoleEnum.SUBCONTRACTOR +supplier = IfcRoleEnum.SUPPLIER +userdefined = IfcRoleEnum.USERDEFINED IfcRoofTypeEnum = enum_namespace() -barrel_roof = express_getattr(IfcRoofTypeEnum, 'BARREL_ROOF', INDETERMINATE) -butterfly_roof = express_getattr(IfcRoofTypeEnum, 'BUTTERFLY_ROOF', INDETERMINATE) -dome_roof = express_getattr(IfcRoofTypeEnum, 'DOME_ROOF', INDETERMINATE) -flat_roof = express_getattr(IfcRoofTypeEnum, 'FLAT_ROOF', INDETERMINATE) -freeform = express_getattr(IfcRoofTypeEnum, 'FREEFORM', INDETERMINATE) -gable_roof = express_getattr(IfcRoofTypeEnum, 'GABLE_ROOF', INDETERMINATE) -gambrel_roof = express_getattr(IfcRoofTypeEnum, 'GAMBREL_ROOF', INDETERMINATE) -hipped_gable_roof = express_getattr(IfcRoofTypeEnum, 'HIPPED_GABLE_ROOF', INDETERMINATE) -hip_roof = express_getattr(IfcRoofTypeEnum, 'HIP_ROOF', INDETERMINATE) -mansard_roof = express_getattr(IfcRoofTypeEnum, 'MANSARD_ROOF', INDETERMINATE) -pavilion_roof = express_getattr(IfcRoofTypeEnum, 'PAVILION_ROOF', INDETERMINATE) -rainbow_roof = express_getattr(IfcRoofTypeEnum, 'RAINBOW_ROOF', INDETERMINATE) -shed_roof = express_getattr(IfcRoofTypeEnum, 'SHED_ROOF', INDETERMINATE) -userdefined = express_getattr(IfcRoofTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcRoofTypeEnum, 'NOTDEFINED', INDETERMINATE) +barrel_roof = IfcRoofTypeEnum.BARREL_ROOF +butterfly_roof = IfcRoofTypeEnum.BUTTERFLY_ROOF +dome_roof = IfcRoofTypeEnum.DOME_ROOF +flat_roof = IfcRoofTypeEnum.FLAT_ROOF +freeform = IfcRoofTypeEnum.FREEFORM +gable_roof = IfcRoofTypeEnum.GABLE_ROOF +gambrel_roof = IfcRoofTypeEnum.GAMBREL_ROOF +hipped_gable_roof = IfcRoofTypeEnum.HIPPED_GABLE_ROOF +hip_roof = IfcRoofTypeEnum.HIP_ROOF +mansard_roof = IfcRoofTypeEnum.MANSARD_ROOF +pavilion_roof = IfcRoofTypeEnum.PAVILION_ROOF +rainbow_roof = IfcRoofTypeEnum.RAINBOW_ROOF +shed_roof = IfcRoofTypeEnum.SHED_ROOF +userdefined = IfcRoofTypeEnum.USERDEFINED +notdefined = IfcRoofTypeEnum.NOTDEFINED IfcSIPrefix = enum_namespace() -atto = express_getattr(IfcSIPrefix, 'ATTO', INDETERMINATE) -centi = express_getattr(IfcSIPrefix, 'CENTI', INDETERMINATE) -deca = express_getattr(IfcSIPrefix, 'DECA', INDETERMINATE) -deci = express_getattr(IfcSIPrefix, 'DECI', INDETERMINATE) -exa = express_getattr(IfcSIPrefix, 'EXA', INDETERMINATE) -femto = express_getattr(IfcSIPrefix, 'FEMTO', INDETERMINATE) -giga = express_getattr(IfcSIPrefix, 'GIGA', INDETERMINATE) -hecto = express_getattr(IfcSIPrefix, 'HECTO', INDETERMINATE) -kilo = express_getattr(IfcSIPrefix, 'KILO', INDETERMINATE) -mega = express_getattr(IfcSIPrefix, 'MEGA', INDETERMINATE) -micro = express_getattr(IfcSIPrefix, 'MICRO', INDETERMINATE) -milli = express_getattr(IfcSIPrefix, 'MILLI', INDETERMINATE) -nano = express_getattr(IfcSIPrefix, 'NANO', INDETERMINATE) -peta = express_getattr(IfcSIPrefix, 'PETA', INDETERMINATE) -pico = express_getattr(IfcSIPrefix, 'PICO', INDETERMINATE) -tera = express_getattr(IfcSIPrefix, 'TERA', INDETERMINATE) +atto = IfcSIPrefix.ATTO +centi = IfcSIPrefix.CENTI +deca = IfcSIPrefix.DECA +deci = IfcSIPrefix.DECI +exa = IfcSIPrefix.EXA +femto = IfcSIPrefix.FEMTO +giga = IfcSIPrefix.GIGA +hecto = IfcSIPrefix.HECTO +kilo = IfcSIPrefix.KILO +mega = IfcSIPrefix.MEGA +micro = IfcSIPrefix.MICRO +milli = IfcSIPrefix.MILLI +nano = IfcSIPrefix.NANO +peta = IfcSIPrefix.PETA +pico = IfcSIPrefix.PICO +tera = IfcSIPrefix.TERA IfcSIUnitName = enum_namespace() -ampere = express_getattr(IfcSIUnitName, 'AMPERE', INDETERMINATE) -becquerel = express_getattr(IfcSIUnitName, 'BECQUEREL', INDETERMINATE) -candela = express_getattr(IfcSIUnitName, 'CANDELA', INDETERMINATE) -coulomb = express_getattr(IfcSIUnitName, 'COULOMB', INDETERMINATE) -cubic_metre = express_getattr(IfcSIUnitName, 'CUBIC_METRE', INDETERMINATE) -degree_celsius = express_getattr(IfcSIUnitName, 'DEGREE_CELSIUS', INDETERMINATE) -farad = express_getattr(IfcSIUnitName, 'FARAD', INDETERMINATE) -gram = express_getattr(IfcSIUnitName, 'GRAM', INDETERMINATE) -gray = express_getattr(IfcSIUnitName, 'GRAY', INDETERMINATE) -henry = express_getattr(IfcSIUnitName, 'HENRY', INDETERMINATE) -hertz = express_getattr(IfcSIUnitName, 'HERTZ', INDETERMINATE) -joule = express_getattr(IfcSIUnitName, 'JOULE', INDETERMINATE) -kelvin = express_getattr(IfcSIUnitName, 'KELVIN', INDETERMINATE) -lumen = express_getattr(IfcSIUnitName, 'LUMEN', INDETERMINATE) -lux = express_getattr(IfcSIUnitName, 'LUX', INDETERMINATE) -metre = express_getattr(IfcSIUnitName, 'METRE', INDETERMINATE) -mole = express_getattr(IfcSIUnitName, 'MOLE', INDETERMINATE) -newton = express_getattr(IfcSIUnitName, 'NEWTON', INDETERMINATE) -ohm = express_getattr(IfcSIUnitName, 'OHM', INDETERMINATE) -pascal = express_getattr(IfcSIUnitName, 'PASCAL', INDETERMINATE) -radian = express_getattr(IfcSIUnitName, 'RADIAN', INDETERMINATE) -second = express_getattr(IfcSIUnitName, 'SECOND', INDETERMINATE) -siemens = express_getattr(IfcSIUnitName, 'SIEMENS', INDETERMINATE) -sievert = express_getattr(IfcSIUnitName, 'SIEVERT', INDETERMINATE) -square_metre = express_getattr(IfcSIUnitName, 'SQUARE_METRE', INDETERMINATE) -steradian = express_getattr(IfcSIUnitName, 'STERADIAN', INDETERMINATE) -tesla = express_getattr(IfcSIUnitName, 'TESLA', INDETERMINATE) -volt = express_getattr(IfcSIUnitName, 'VOLT', INDETERMINATE) -watt = express_getattr(IfcSIUnitName, 'WATT', INDETERMINATE) -weber = express_getattr(IfcSIUnitName, 'WEBER', INDETERMINATE) +ampere = IfcSIUnitName.AMPERE +becquerel = IfcSIUnitName.BECQUEREL +candela = IfcSIUnitName.CANDELA +coulomb = IfcSIUnitName.COULOMB +cubic_metre = IfcSIUnitName.CUBIC_METRE +degree_celsius = IfcSIUnitName.DEGREE_CELSIUS +farad = IfcSIUnitName.FARAD +gram = IfcSIUnitName.GRAM +gray = IfcSIUnitName.GRAY +henry = IfcSIUnitName.HENRY +hertz = IfcSIUnitName.HERTZ +joule = IfcSIUnitName.JOULE +kelvin = IfcSIUnitName.KELVIN +lumen = IfcSIUnitName.LUMEN +lux = IfcSIUnitName.LUX +metre = IfcSIUnitName.METRE +mole = IfcSIUnitName.MOLE +newton = IfcSIUnitName.NEWTON +ohm = IfcSIUnitName.OHM +pascal = IfcSIUnitName.PASCAL +radian = IfcSIUnitName.RADIAN +second = IfcSIUnitName.SECOND +siemens = IfcSIUnitName.SIEMENS +sievert = IfcSIUnitName.SIEVERT +square_metre = IfcSIUnitName.SQUARE_METRE +steradian = IfcSIUnitName.STERADIAN +tesla = IfcSIUnitName.TESLA +volt = IfcSIUnitName.VOLT +watt = IfcSIUnitName.WATT +weber = IfcSIUnitName.WEBER IfcSanitaryTerminalTypeEnum = enum_namespace() -bath = express_getattr(IfcSanitaryTerminalTypeEnum, 'BATH', INDETERMINATE) -bidet = express_getattr(IfcSanitaryTerminalTypeEnum, 'BIDET', INDETERMINATE) -cistern = express_getattr(IfcSanitaryTerminalTypeEnum, 'CISTERN', INDETERMINATE) -sanitaryfountain = express_getattr(IfcSanitaryTerminalTypeEnum, 'SANITARYFOUNTAIN', INDETERMINATE) -shower = express_getattr(IfcSanitaryTerminalTypeEnum, 'SHOWER', INDETERMINATE) -sink = express_getattr(IfcSanitaryTerminalTypeEnum, 'SINK', INDETERMINATE) -toiletpan = express_getattr(IfcSanitaryTerminalTypeEnum, 'TOILETPAN', INDETERMINATE) -urinal = express_getattr(IfcSanitaryTerminalTypeEnum, 'URINAL', INDETERMINATE) -washhandbasin = express_getattr(IfcSanitaryTerminalTypeEnum, 'WASHHANDBASIN', INDETERMINATE) -wcseat = express_getattr(IfcSanitaryTerminalTypeEnum, 'WCSEAT', INDETERMINATE) -userdefined = express_getattr(IfcSanitaryTerminalTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSanitaryTerminalTypeEnum, 'NOTDEFINED', INDETERMINATE) +bath = IfcSanitaryTerminalTypeEnum.BATH +bidet = IfcSanitaryTerminalTypeEnum.BIDET +cistern = IfcSanitaryTerminalTypeEnum.CISTERN +sanitaryfountain = IfcSanitaryTerminalTypeEnum.SANITARYFOUNTAIN +shower = IfcSanitaryTerminalTypeEnum.SHOWER +sink = IfcSanitaryTerminalTypeEnum.SINK +toiletpan = IfcSanitaryTerminalTypeEnum.TOILETPAN +urinal = IfcSanitaryTerminalTypeEnum.URINAL +washhandbasin = IfcSanitaryTerminalTypeEnum.WASHHANDBASIN +wcseat = IfcSanitaryTerminalTypeEnum.WCSEAT +userdefined = IfcSanitaryTerminalTypeEnum.USERDEFINED +notdefined = IfcSanitaryTerminalTypeEnum.NOTDEFINED IfcSectionTypeEnum = enum_namespace() -tapered = express_getattr(IfcSectionTypeEnum, 'TAPERED', INDETERMINATE) -uniform = express_getattr(IfcSectionTypeEnum, 'UNIFORM', INDETERMINATE) +tapered = IfcSectionTypeEnum.TAPERED +uniform = IfcSectionTypeEnum.UNIFORM IfcSensorTypeEnum = enum_namespace() -co2sensor = express_getattr(IfcSensorTypeEnum, 'CO2SENSOR', INDETERMINATE) -conductancesensor = express_getattr(IfcSensorTypeEnum, 'CONDUCTANCESENSOR', INDETERMINATE) -contactsensor = express_getattr(IfcSensorTypeEnum, 'CONTACTSENSOR', INDETERMINATE) -cosensor = express_getattr(IfcSensorTypeEnum, 'COSENSOR', INDETERMINATE) -earthquakesensor = express_getattr(IfcSensorTypeEnum, 'EARTHQUAKESENSOR', INDETERMINATE) -firesensor = express_getattr(IfcSensorTypeEnum, 'FIRESENSOR', INDETERMINATE) -flowsensor = express_getattr(IfcSensorTypeEnum, 'FLOWSENSOR', INDETERMINATE) -foreignobjectdetectionsensor = express_getattr(IfcSensorTypeEnum, 'FOREIGNOBJECTDETECTIONSENSOR', INDETERMINATE) -frostsensor = express_getattr(IfcSensorTypeEnum, 'FROSTSENSOR', INDETERMINATE) -gassensor = express_getattr(IfcSensorTypeEnum, 'GASSENSOR', INDETERMINATE) -heatsensor = express_getattr(IfcSensorTypeEnum, 'HEATSENSOR', INDETERMINATE) -humiditysensor = express_getattr(IfcSensorTypeEnum, 'HUMIDITYSENSOR', INDETERMINATE) -identifiersensor = express_getattr(IfcSensorTypeEnum, 'IDENTIFIERSENSOR', INDETERMINATE) -ionconcentrationsensor = express_getattr(IfcSensorTypeEnum, 'IONCONCENTRATIONSENSOR', INDETERMINATE) -levelsensor = express_getattr(IfcSensorTypeEnum, 'LEVELSENSOR', INDETERMINATE) -lightsensor = express_getattr(IfcSensorTypeEnum, 'LIGHTSENSOR', INDETERMINATE) -moisturesensor = express_getattr(IfcSensorTypeEnum, 'MOISTURESENSOR', INDETERMINATE) -movementsensor = express_getattr(IfcSensorTypeEnum, 'MOVEMENTSENSOR', INDETERMINATE) -obstaclesensor = express_getattr(IfcSensorTypeEnum, 'OBSTACLESENSOR', INDETERMINATE) -phsensor = express_getattr(IfcSensorTypeEnum, 'PHSENSOR', INDETERMINATE) -pressuresensor = express_getattr(IfcSensorTypeEnum, 'PRESSURESENSOR', INDETERMINATE) -radiationsensor = express_getattr(IfcSensorTypeEnum, 'RADIATIONSENSOR', INDETERMINATE) -radioactivitysensor = express_getattr(IfcSensorTypeEnum, 'RADIOACTIVITYSENSOR', INDETERMINATE) -rainsensor = express_getattr(IfcSensorTypeEnum, 'RAINSENSOR', INDETERMINATE) -smokesensor = express_getattr(IfcSensorTypeEnum, 'SMOKESENSOR', INDETERMINATE) -snowdepthsensor = express_getattr(IfcSensorTypeEnum, 'SNOWDEPTHSENSOR', INDETERMINATE) -soundsensor = express_getattr(IfcSensorTypeEnum, 'SOUNDSENSOR', INDETERMINATE) -temperaturesensor = express_getattr(IfcSensorTypeEnum, 'TEMPERATURESENSOR', INDETERMINATE) -trainsensor = express_getattr(IfcSensorTypeEnum, 'TRAINSENSOR', INDETERMINATE) -turnoutclosuresensor = express_getattr(IfcSensorTypeEnum, 'TURNOUTCLOSURESENSOR', INDETERMINATE) -wheelsensor = express_getattr(IfcSensorTypeEnum, 'WHEELSENSOR', INDETERMINATE) -windsensor = express_getattr(IfcSensorTypeEnum, 'WINDSENSOR', INDETERMINATE) -userdefined = express_getattr(IfcSensorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSensorTypeEnum, 'NOTDEFINED', INDETERMINATE) +co2sensor = IfcSensorTypeEnum.CO2SENSOR +conductancesensor = IfcSensorTypeEnum.CONDUCTANCESENSOR +contactsensor = IfcSensorTypeEnum.CONTACTSENSOR +cosensor = IfcSensorTypeEnum.COSENSOR +earthquakesensor = IfcSensorTypeEnum.EARTHQUAKESENSOR +firesensor = IfcSensorTypeEnum.FIRESENSOR +flowsensor = IfcSensorTypeEnum.FLOWSENSOR +foreignobjectdetectionsensor = IfcSensorTypeEnum.FOREIGNOBJECTDETECTIONSENSOR +frostsensor = IfcSensorTypeEnum.FROSTSENSOR +gassensor = IfcSensorTypeEnum.GASSENSOR +heatsensor = IfcSensorTypeEnum.HEATSENSOR +humiditysensor = IfcSensorTypeEnum.HUMIDITYSENSOR +identifiersensor = IfcSensorTypeEnum.IDENTIFIERSENSOR +ionconcentrationsensor = IfcSensorTypeEnum.IONCONCENTRATIONSENSOR +levelsensor = IfcSensorTypeEnum.LEVELSENSOR +lightsensor = IfcSensorTypeEnum.LIGHTSENSOR +moisturesensor = IfcSensorTypeEnum.MOISTURESENSOR +movementsensor = IfcSensorTypeEnum.MOVEMENTSENSOR +obstaclesensor = IfcSensorTypeEnum.OBSTACLESENSOR +phsensor = IfcSensorTypeEnum.PHSENSOR +pressuresensor = IfcSensorTypeEnum.PRESSURESENSOR +radiationsensor = IfcSensorTypeEnum.RADIATIONSENSOR +radioactivitysensor = IfcSensorTypeEnum.RADIOACTIVITYSENSOR +rainsensor = IfcSensorTypeEnum.RAINSENSOR +smokesensor = IfcSensorTypeEnum.SMOKESENSOR +snowdepthsensor = IfcSensorTypeEnum.SNOWDEPTHSENSOR +soundsensor = IfcSensorTypeEnum.SOUNDSENSOR +temperaturesensor = IfcSensorTypeEnum.TEMPERATURESENSOR +trainsensor = IfcSensorTypeEnum.TRAINSENSOR +turnoutclosuresensor = IfcSensorTypeEnum.TURNOUTCLOSURESENSOR +wheelsensor = IfcSensorTypeEnum.WHEELSENSOR +windsensor = IfcSensorTypeEnum.WINDSENSOR +userdefined = IfcSensorTypeEnum.USERDEFINED +notdefined = IfcSensorTypeEnum.NOTDEFINED IfcSequenceEnum = enum_namespace() -finish_finish = express_getattr(IfcSequenceEnum, 'FINISH_FINISH', INDETERMINATE) -finish_start = express_getattr(IfcSequenceEnum, 'FINISH_START', INDETERMINATE) -start_finish = express_getattr(IfcSequenceEnum, 'START_FINISH', INDETERMINATE) -start_start = express_getattr(IfcSequenceEnum, 'START_START', INDETERMINATE) -userdefined = express_getattr(IfcSequenceEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSequenceEnum, 'NOTDEFINED', INDETERMINATE) +finish_finish = IfcSequenceEnum.FINISH_FINISH +finish_start = IfcSequenceEnum.FINISH_START +start_finish = IfcSequenceEnum.START_FINISH +start_start = IfcSequenceEnum.START_START +userdefined = IfcSequenceEnum.USERDEFINED +notdefined = IfcSequenceEnum.NOTDEFINED IfcShadingDeviceTypeEnum = enum_namespace() -awning = express_getattr(IfcShadingDeviceTypeEnum, 'AWNING', INDETERMINATE) -jalousie = express_getattr(IfcShadingDeviceTypeEnum, 'JALOUSIE', INDETERMINATE) -shutter = express_getattr(IfcShadingDeviceTypeEnum, 'SHUTTER', INDETERMINATE) -userdefined = express_getattr(IfcShadingDeviceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcShadingDeviceTypeEnum, 'NOTDEFINED', INDETERMINATE) +awning = IfcShadingDeviceTypeEnum.AWNING +jalousie = IfcShadingDeviceTypeEnum.JALOUSIE +shutter = IfcShadingDeviceTypeEnum.SHUTTER +userdefined = IfcShadingDeviceTypeEnum.USERDEFINED +notdefined = IfcShadingDeviceTypeEnum.NOTDEFINED IfcSignTypeEnum = enum_namespace() -marker = express_getattr(IfcSignTypeEnum, 'MARKER', INDETERMINATE) -mirror = express_getattr(IfcSignTypeEnum, 'MIRROR', INDETERMINATE) -pictoral = express_getattr(IfcSignTypeEnum, 'PICTORAL', INDETERMINATE) -userdefined = express_getattr(IfcSignTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSignTypeEnum, 'NOTDEFINED', INDETERMINATE) +marker = IfcSignTypeEnum.MARKER +mirror = IfcSignTypeEnum.MIRROR +pictoral = IfcSignTypeEnum.PICTORAL +userdefined = IfcSignTypeEnum.USERDEFINED +notdefined = IfcSignTypeEnum.NOTDEFINED IfcSignalTypeEnum = enum_namespace() -audio = express_getattr(IfcSignalTypeEnum, 'AUDIO', INDETERMINATE) -mixed = express_getattr(IfcSignalTypeEnum, 'MIXED', INDETERMINATE) -visual = express_getattr(IfcSignalTypeEnum, 'VISUAL', INDETERMINATE) -userdefined = express_getattr(IfcSignalTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSignalTypeEnum, 'NOTDEFINED', INDETERMINATE) +audio = IfcSignalTypeEnum.AUDIO +mixed = IfcSignalTypeEnum.MIXED +visual = IfcSignalTypeEnum.VISUAL +userdefined = IfcSignalTypeEnum.USERDEFINED +notdefined = IfcSignalTypeEnum.NOTDEFINED IfcSimplePropertyTemplateTypeEnum = enum_namespace() -p_boundedvalue = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'P_BOUNDEDVALUE', INDETERMINATE) -p_enumeratedvalue = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'P_ENUMERATEDVALUE', INDETERMINATE) -p_listvalue = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'P_LISTVALUE', INDETERMINATE) -p_referencevalue = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'P_REFERENCEVALUE', INDETERMINATE) -p_singlevalue = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'P_SINGLEVALUE', INDETERMINATE) -p_tablevalue = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'P_TABLEVALUE', INDETERMINATE) -q_area = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'Q_AREA', INDETERMINATE) -q_count = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'Q_COUNT', INDETERMINATE) -q_length = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'Q_LENGTH', INDETERMINATE) -q_number = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'Q_NUMBER', INDETERMINATE) -q_time = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'Q_TIME', INDETERMINATE) -q_volume = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'Q_VOLUME', INDETERMINATE) -q_weight = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'Q_WEIGHT', INDETERMINATE) +p_boundedvalue = IfcSimplePropertyTemplateTypeEnum.P_BOUNDEDVALUE +p_enumeratedvalue = IfcSimplePropertyTemplateTypeEnum.P_ENUMERATEDVALUE +p_listvalue = IfcSimplePropertyTemplateTypeEnum.P_LISTVALUE +p_referencevalue = IfcSimplePropertyTemplateTypeEnum.P_REFERENCEVALUE +p_singlevalue = IfcSimplePropertyTemplateTypeEnum.P_SINGLEVALUE +p_tablevalue = IfcSimplePropertyTemplateTypeEnum.P_TABLEVALUE +q_area = IfcSimplePropertyTemplateTypeEnum.Q_AREA +q_count = IfcSimplePropertyTemplateTypeEnum.Q_COUNT +q_length = IfcSimplePropertyTemplateTypeEnum.Q_LENGTH +q_number = IfcSimplePropertyTemplateTypeEnum.Q_NUMBER +q_time = IfcSimplePropertyTemplateTypeEnum.Q_TIME +q_volume = IfcSimplePropertyTemplateTypeEnum.Q_VOLUME +q_weight = IfcSimplePropertyTemplateTypeEnum.Q_WEIGHT IfcSlabTypeEnum = enum_namespace() -approach_slab = express_getattr(IfcSlabTypeEnum, 'APPROACH_SLAB', INDETERMINATE) -baseslab = express_getattr(IfcSlabTypeEnum, 'BASESLAB', INDETERMINATE) -floor = express_getattr(IfcSlabTypeEnum, 'FLOOR', INDETERMINATE) -landing = express_getattr(IfcSlabTypeEnum, 'LANDING', INDETERMINATE) -paving = express_getattr(IfcSlabTypeEnum, 'PAVING', INDETERMINATE) -roof = express_getattr(IfcSlabTypeEnum, 'ROOF', INDETERMINATE) -sidewalk = express_getattr(IfcSlabTypeEnum, 'SIDEWALK', INDETERMINATE) -trackslab = express_getattr(IfcSlabTypeEnum, 'TRACKSLAB', INDETERMINATE) -wearing = express_getattr(IfcSlabTypeEnum, 'WEARING', INDETERMINATE) -userdefined = express_getattr(IfcSlabTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSlabTypeEnum, 'NOTDEFINED', INDETERMINATE) +approach_slab = IfcSlabTypeEnum.APPROACH_SLAB +baseslab = IfcSlabTypeEnum.BASESLAB +floor = IfcSlabTypeEnum.FLOOR +landing = IfcSlabTypeEnum.LANDING +paving = IfcSlabTypeEnum.PAVING +roof = IfcSlabTypeEnum.ROOF +sidewalk = IfcSlabTypeEnum.SIDEWALK +trackslab = IfcSlabTypeEnum.TRACKSLAB +wearing = IfcSlabTypeEnum.WEARING +userdefined = IfcSlabTypeEnum.USERDEFINED +notdefined = IfcSlabTypeEnum.NOTDEFINED IfcSolarDeviceTypeEnum = enum_namespace() -solarcollector = express_getattr(IfcSolarDeviceTypeEnum, 'SOLARCOLLECTOR', INDETERMINATE) -solarpanel = express_getattr(IfcSolarDeviceTypeEnum, 'SOLARPANEL', INDETERMINATE) -userdefined = express_getattr(IfcSolarDeviceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSolarDeviceTypeEnum, 'NOTDEFINED', INDETERMINATE) +solarcollector = IfcSolarDeviceTypeEnum.SOLARCOLLECTOR +solarpanel = IfcSolarDeviceTypeEnum.SOLARPANEL +userdefined = IfcSolarDeviceTypeEnum.USERDEFINED +notdefined = IfcSolarDeviceTypeEnum.NOTDEFINED IfcSpaceHeaterTypeEnum = enum_namespace() -convector = express_getattr(IfcSpaceHeaterTypeEnum, 'CONVECTOR', INDETERMINATE) -radiator = express_getattr(IfcSpaceHeaterTypeEnum, 'RADIATOR', INDETERMINATE) -userdefined = express_getattr(IfcSpaceHeaterTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSpaceHeaterTypeEnum, 'NOTDEFINED', INDETERMINATE) +convector = IfcSpaceHeaterTypeEnum.CONVECTOR +radiator = IfcSpaceHeaterTypeEnum.RADIATOR +userdefined = IfcSpaceHeaterTypeEnum.USERDEFINED +notdefined = IfcSpaceHeaterTypeEnum.NOTDEFINED IfcSpaceTypeEnum = enum_namespace() -berth = express_getattr(IfcSpaceTypeEnum, 'BERTH', INDETERMINATE) -external = express_getattr(IfcSpaceTypeEnum, 'EXTERNAL', INDETERMINATE) -gfa = express_getattr(IfcSpaceTypeEnum, 'GFA', INDETERMINATE) -internal = express_getattr(IfcSpaceTypeEnum, 'INTERNAL', INDETERMINATE) -parking = express_getattr(IfcSpaceTypeEnum, 'PARKING', INDETERMINATE) -space = express_getattr(IfcSpaceTypeEnum, 'SPACE', INDETERMINATE) -userdefined = express_getattr(IfcSpaceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSpaceTypeEnum, 'NOTDEFINED', INDETERMINATE) +berth = IfcSpaceTypeEnum.BERTH +external = IfcSpaceTypeEnum.EXTERNAL +gfa = IfcSpaceTypeEnum.GFA +internal = IfcSpaceTypeEnum.INTERNAL +parking = IfcSpaceTypeEnum.PARKING +space = IfcSpaceTypeEnum.SPACE +userdefined = IfcSpaceTypeEnum.USERDEFINED +notdefined = IfcSpaceTypeEnum.NOTDEFINED IfcSpatialZoneTypeEnum = enum_namespace() -construction = express_getattr(IfcSpatialZoneTypeEnum, 'CONSTRUCTION', INDETERMINATE) -firesafety = express_getattr(IfcSpatialZoneTypeEnum, 'FIRESAFETY', INDETERMINATE) -interference = express_getattr(IfcSpatialZoneTypeEnum, 'INTERFERENCE', INDETERMINATE) -lighting = express_getattr(IfcSpatialZoneTypeEnum, 'LIGHTING', INDETERMINATE) -occupancy = express_getattr(IfcSpatialZoneTypeEnum, 'OCCUPANCY', INDETERMINATE) -reservation = express_getattr(IfcSpatialZoneTypeEnum, 'RESERVATION', INDETERMINATE) -security = express_getattr(IfcSpatialZoneTypeEnum, 'SECURITY', INDETERMINATE) -thermal = express_getattr(IfcSpatialZoneTypeEnum, 'THERMAL', INDETERMINATE) -transport = express_getattr(IfcSpatialZoneTypeEnum, 'TRANSPORT', INDETERMINATE) -ventilation = express_getattr(IfcSpatialZoneTypeEnum, 'VENTILATION', INDETERMINATE) -userdefined = express_getattr(IfcSpatialZoneTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSpatialZoneTypeEnum, 'NOTDEFINED', INDETERMINATE) +construction = IfcSpatialZoneTypeEnum.CONSTRUCTION +firesafety = IfcSpatialZoneTypeEnum.FIRESAFETY +interference = IfcSpatialZoneTypeEnum.INTERFERENCE +lighting = IfcSpatialZoneTypeEnum.LIGHTING +occupancy = IfcSpatialZoneTypeEnum.OCCUPANCY +reservation = IfcSpatialZoneTypeEnum.RESERVATION +security = IfcSpatialZoneTypeEnum.SECURITY +thermal = IfcSpatialZoneTypeEnum.THERMAL +transport = IfcSpatialZoneTypeEnum.TRANSPORT +ventilation = IfcSpatialZoneTypeEnum.VENTILATION +userdefined = IfcSpatialZoneTypeEnum.USERDEFINED +notdefined = IfcSpatialZoneTypeEnum.NOTDEFINED IfcStackTerminalTypeEnum = enum_namespace() -birdcage = express_getattr(IfcStackTerminalTypeEnum, 'BIRDCAGE', INDETERMINATE) -cowl = express_getattr(IfcStackTerminalTypeEnum, 'COWL', INDETERMINATE) -rainwaterhopper = express_getattr(IfcStackTerminalTypeEnum, 'RAINWATERHOPPER', INDETERMINATE) -userdefined = express_getattr(IfcStackTerminalTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcStackTerminalTypeEnum, 'NOTDEFINED', INDETERMINATE) +birdcage = IfcStackTerminalTypeEnum.BIRDCAGE +cowl = IfcStackTerminalTypeEnum.COWL +rainwaterhopper = IfcStackTerminalTypeEnum.RAINWATERHOPPER +userdefined = IfcStackTerminalTypeEnum.USERDEFINED +notdefined = IfcStackTerminalTypeEnum.NOTDEFINED IfcStairFlightTypeEnum = enum_namespace() -curved = express_getattr(IfcStairFlightTypeEnum, 'CURVED', INDETERMINATE) -freeform = express_getattr(IfcStairFlightTypeEnum, 'FREEFORM', INDETERMINATE) -spiral = express_getattr(IfcStairFlightTypeEnum, 'SPIRAL', INDETERMINATE) -straight = express_getattr(IfcStairFlightTypeEnum, 'STRAIGHT', INDETERMINATE) -winder = express_getattr(IfcStairFlightTypeEnum, 'WINDER', INDETERMINATE) -userdefined = express_getattr(IfcStairFlightTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcStairFlightTypeEnum, 'NOTDEFINED', INDETERMINATE) +curved = IfcStairFlightTypeEnum.CURVED +freeform = IfcStairFlightTypeEnum.FREEFORM +spiral = IfcStairFlightTypeEnum.SPIRAL +straight = IfcStairFlightTypeEnum.STRAIGHT +winder = IfcStairFlightTypeEnum.WINDER +userdefined = IfcStairFlightTypeEnum.USERDEFINED +notdefined = IfcStairFlightTypeEnum.NOTDEFINED IfcStairTypeEnum = enum_namespace() -curved_run_stair = express_getattr(IfcStairTypeEnum, 'CURVED_RUN_STAIR', INDETERMINATE) -double_return_stair = express_getattr(IfcStairTypeEnum, 'DOUBLE_RETURN_STAIR', INDETERMINATE) -half_turn_stair = express_getattr(IfcStairTypeEnum, 'HALF_TURN_STAIR', INDETERMINATE) -half_winding_stair = express_getattr(IfcStairTypeEnum, 'HALF_WINDING_STAIR', INDETERMINATE) -ladder = express_getattr(IfcStairTypeEnum, 'LADDER', INDETERMINATE) -quarter_turn_stair = express_getattr(IfcStairTypeEnum, 'QUARTER_TURN_STAIR', INDETERMINATE) -quarter_winding_stair = express_getattr(IfcStairTypeEnum, 'QUARTER_WINDING_STAIR', INDETERMINATE) -spiral_stair = express_getattr(IfcStairTypeEnum, 'SPIRAL_STAIR', INDETERMINATE) -straight_run_stair = express_getattr(IfcStairTypeEnum, 'STRAIGHT_RUN_STAIR', INDETERMINATE) -three_quarter_turn_stair = express_getattr(IfcStairTypeEnum, 'THREE_QUARTER_TURN_STAIR', INDETERMINATE) -three_quarter_winding_stair = express_getattr(IfcStairTypeEnum, 'THREE_QUARTER_WINDING_STAIR', INDETERMINATE) -two_curved_run_stair = express_getattr(IfcStairTypeEnum, 'TWO_CURVED_RUN_STAIR', INDETERMINATE) -two_quarter_turn_stair = express_getattr(IfcStairTypeEnum, 'TWO_QUARTER_TURN_STAIR', INDETERMINATE) -two_quarter_winding_stair = express_getattr(IfcStairTypeEnum, 'TWO_QUARTER_WINDING_STAIR', INDETERMINATE) -two_straight_run_stair = express_getattr(IfcStairTypeEnum, 'TWO_STRAIGHT_RUN_STAIR', INDETERMINATE) -userdefined = express_getattr(IfcStairTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcStairTypeEnum, 'NOTDEFINED', INDETERMINATE) +curved_run_stair = IfcStairTypeEnum.CURVED_RUN_STAIR +double_return_stair = IfcStairTypeEnum.DOUBLE_RETURN_STAIR +half_turn_stair = IfcStairTypeEnum.HALF_TURN_STAIR +half_winding_stair = IfcStairTypeEnum.HALF_WINDING_STAIR +ladder = IfcStairTypeEnum.LADDER +quarter_turn_stair = IfcStairTypeEnum.QUARTER_TURN_STAIR +quarter_winding_stair = IfcStairTypeEnum.QUARTER_WINDING_STAIR +spiral_stair = IfcStairTypeEnum.SPIRAL_STAIR +straight_run_stair = IfcStairTypeEnum.STRAIGHT_RUN_STAIR +three_quarter_turn_stair = IfcStairTypeEnum.THREE_QUARTER_TURN_STAIR +three_quarter_winding_stair = IfcStairTypeEnum.THREE_QUARTER_WINDING_STAIR +two_curved_run_stair = IfcStairTypeEnum.TWO_CURVED_RUN_STAIR +two_quarter_turn_stair = IfcStairTypeEnum.TWO_QUARTER_TURN_STAIR +two_quarter_winding_stair = IfcStairTypeEnum.TWO_QUARTER_WINDING_STAIR +two_straight_run_stair = IfcStairTypeEnum.TWO_STRAIGHT_RUN_STAIR +userdefined = IfcStairTypeEnum.USERDEFINED +notdefined = IfcStairTypeEnum.NOTDEFINED IfcStateEnum = enum_namespace() -locked = express_getattr(IfcStateEnum, 'LOCKED', INDETERMINATE) -readonly = express_getattr(IfcStateEnum, 'READONLY', INDETERMINATE) -readonlylocked = express_getattr(IfcStateEnum, 'READONLYLOCKED', INDETERMINATE) -readwrite = express_getattr(IfcStateEnum, 'READWRITE', INDETERMINATE) -readwritelocked = express_getattr(IfcStateEnum, 'READWRITELOCKED', INDETERMINATE) +locked = IfcStateEnum.LOCKED +readonly = IfcStateEnum.READONLY +readonlylocked = IfcStateEnum.READONLYLOCKED +readwrite = IfcStateEnum.READWRITE +readwritelocked = IfcStateEnum.READWRITELOCKED IfcStructuralCurveActivityTypeEnum = enum_namespace() -const = express_getattr(IfcStructuralCurveActivityTypeEnum, 'CONST', INDETERMINATE) -discrete = express_getattr(IfcStructuralCurveActivityTypeEnum, 'DISCRETE', INDETERMINATE) -equidistant = express_getattr(IfcStructuralCurveActivityTypeEnum, 'EQUIDISTANT', INDETERMINATE) -linear = express_getattr(IfcStructuralCurveActivityTypeEnum, 'LINEAR', INDETERMINATE) -parabola = express_getattr(IfcStructuralCurveActivityTypeEnum, 'PARABOLA', INDETERMINATE) -polygonal = express_getattr(IfcStructuralCurveActivityTypeEnum, 'POLYGONAL', INDETERMINATE) -sinus = express_getattr(IfcStructuralCurveActivityTypeEnum, 'SINUS', INDETERMINATE) -userdefined = express_getattr(IfcStructuralCurveActivityTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcStructuralCurveActivityTypeEnum, 'NOTDEFINED', INDETERMINATE) +const = IfcStructuralCurveActivityTypeEnum.CONST +discrete = IfcStructuralCurveActivityTypeEnum.DISCRETE +equidistant = IfcStructuralCurveActivityTypeEnum.EQUIDISTANT +linear = IfcStructuralCurveActivityTypeEnum.LINEAR +parabola = IfcStructuralCurveActivityTypeEnum.PARABOLA +polygonal = IfcStructuralCurveActivityTypeEnum.POLYGONAL +sinus = IfcStructuralCurveActivityTypeEnum.SINUS +userdefined = IfcStructuralCurveActivityTypeEnum.USERDEFINED +notdefined = IfcStructuralCurveActivityTypeEnum.NOTDEFINED IfcStructuralCurveMemberTypeEnum = enum_namespace() -cable = express_getattr(IfcStructuralCurveMemberTypeEnum, 'CABLE', INDETERMINATE) -compression_member = express_getattr(IfcStructuralCurveMemberTypeEnum, 'COMPRESSION_MEMBER', INDETERMINATE) -pin_joined_member = express_getattr(IfcStructuralCurveMemberTypeEnum, 'PIN_JOINED_MEMBER', INDETERMINATE) -rigid_joined_member = express_getattr(IfcStructuralCurveMemberTypeEnum, 'RIGID_JOINED_MEMBER', INDETERMINATE) -tension_member = express_getattr(IfcStructuralCurveMemberTypeEnum, 'TENSION_MEMBER', INDETERMINATE) -userdefined = express_getattr(IfcStructuralCurveMemberTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcStructuralCurveMemberTypeEnum, 'NOTDEFINED', INDETERMINATE) +cable = IfcStructuralCurveMemberTypeEnum.CABLE +compression_member = IfcStructuralCurveMemberTypeEnum.COMPRESSION_MEMBER +pin_joined_member = IfcStructuralCurveMemberTypeEnum.PIN_JOINED_MEMBER +rigid_joined_member = IfcStructuralCurveMemberTypeEnum.RIGID_JOINED_MEMBER +tension_member = IfcStructuralCurveMemberTypeEnum.TENSION_MEMBER +userdefined = IfcStructuralCurveMemberTypeEnum.USERDEFINED +notdefined = IfcStructuralCurveMemberTypeEnum.NOTDEFINED IfcStructuralSurfaceActivityTypeEnum = enum_namespace() -bilinear = express_getattr(IfcStructuralSurfaceActivityTypeEnum, 'BILINEAR', INDETERMINATE) -const = express_getattr(IfcStructuralSurfaceActivityTypeEnum, 'CONST', INDETERMINATE) -discrete = express_getattr(IfcStructuralSurfaceActivityTypeEnum, 'DISCRETE', INDETERMINATE) -isocontour = express_getattr(IfcStructuralSurfaceActivityTypeEnum, 'ISOCONTOUR', INDETERMINATE) -userdefined = express_getattr(IfcStructuralSurfaceActivityTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcStructuralSurfaceActivityTypeEnum, 'NOTDEFINED', INDETERMINATE) +bilinear = IfcStructuralSurfaceActivityTypeEnum.BILINEAR +const = IfcStructuralSurfaceActivityTypeEnum.CONST +discrete = IfcStructuralSurfaceActivityTypeEnum.DISCRETE +isocontour = IfcStructuralSurfaceActivityTypeEnum.ISOCONTOUR +userdefined = IfcStructuralSurfaceActivityTypeEnum.USERDEFINED +notdefined = IfcStructuralSurfaceActivityTypeEnum.NOTDEFINED IfcStructuralSurfaceMemberTypeEnum = enum_namespace() -bending_element = express_getattr(IfcStructuralSurfaceMemberTypeEnum, 'BENDING_ELEMENT', INDETERMINATE) -membrane_element = express_getattr(IfcStructuralSurfaceMemberTypeEnum, 'MEMBRANE_ELEMENT', INDETERMINATE) -shell = express_getattr(IfcStructuralSurfaceMemberTypeEnum, 'SHELL', INDETERMINATE) -userdefined = express_getattr(IfcStructuralSurfaceMemberTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcStructuralSurfaceMemberTypeEnum, 'NOTDEFINED', INDETERMINATE) +bending_element = IfcStructuralSurfaceMemberTypeEnum.BENDING_ELEMENT +membrane_element = IfcStructuralSurfaceMemberTypeEnum.MEMBRANE_ELEMENT +shell = IfcStructuralSurfaceMemberTypeEnum.SHELL +userdefined = IfcStructuralSurfaceMemberTypeEnum.USERDEFINED +notdefined = IfcStructuralSurfaceMemberTypeEnum.NOTDEFINED IfcSubContractResourceTypeEnum = enum_namespace() -purchase = express_getattr(IfcSubContractResourceTypeEnum, 'PURCHASE', INDETERMINATE) -work = express_getattr(IfcSubContractResourceTypeEnum, 'WORK', INDETERMINATE) -userdefined = express_getattr(IfcSubContractResourceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSubContractResourceTypeEnum, 'NOTDEFINED', INDETERMINATE) +purchase = IfcSubContractResourceTypeEnum.PURCHASE +work = IfcSubContractResourceTypeEnum.WORK +userdefined = IfcSubContractResourceTypeEnum.USERDEFINED +notdefined = IfcSubContractResourceTypeEnum.NOTDEFINED IfcSurfaceFeatureTypeEnum = enum_namespace() -defect = express_getattr(IfcSurfaceFeatureTypeEnum, 'DEFECT', INDETERMINATE) -hatchmarking = express_getattr(IfcSurfaceFeatureTypeEnum, 'HATCHMARKING', INDETERMINATE) -linemarking = express_getattr(IfcSurfaceFeatureTypeEnum, 'LINEMARKING', INDETERMINATE) -mark = express_getattr(IfcSurfaceFeatureTypeEnum, 'MARK', INDETERMINATE) -nonskidsurfacing = express_getattr(IfcSurfaceFeatureTypeEnum, 'NONSKIDSURFACING', INDETERMINATE) -pavementsurfacemarking = express_getattr(IfcSurfaceFeatureTypeEnum, 'PAVEMENTSURFACEMARKING', INDETERMINATE) -rumblestrip = express_getattr(IfcSurfaceFeatureTypeEnum, 'RUMBLESTRIP', INDETERMINATE) -symbolmarking = express_getattr(IfcSurfaceFeatureTypeEnum, 'SYMBOLMARKING', INDETERMINATE) -tag = express_getattr(IfcSurfaceFeatureTypeEnum, 'TAG', INDETERMINATE) -transverserumblestrip = express_getattr(IfcSurfaceFeatureTypeEnum, 'TRANSVERSERUMBLESTRIP', INDETERMINATE) -treatment = express_getattr(IfcSurfaceFeatureTypeEnum, 'TREATMENT', INDETERMINATE) -userdefined = express_getattr(IfcSurfaceFeatureTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSurfaceFeatureTypeEnum, 'NOTDEFINED', INDETERMINATE) +defect = IfcSurfaceFeatureTypeEnum.DEFECT +hatchmarking = IfcSurfaceFeatureTypeEnum.HATCHMARKING +linemarking = IfcSurfaceFeatureTypeEnum.LINEMARKING +mark = IfcSurfaceFeatureTypeEnum.MARK +nonskidsurfacing = IfcSurfaceFeatureTypeEnum.NONSKIDSURFACING +pavementsurfacemarking = IfcSurfaceFeatureTypeEnum.PAVEMENTSURFACEMARKING +rumblestrip = IfcSurfaceFeatureTypeEnum.RUMBLESTRIP +symbolmarking = IfcSurfaceFeatureTypeEnum.SYMBOLMARKING +tag = IfcSurfaceFeatureTypeEnum.TAG +transverserumblestrip = IfcSurfaceFeatureTypeEnum.TRANSVERSERUMBLESTRIP +treatment = IfcSurfaceFeatureTypeEnum.TREATMENT +userdefined = IfcSurfaceFeatureTypeEnum.USERDEFINED +notdefined = IfcSurfaceFeatureTypeEnum.NOTDEFINED IfcSurfaceSide = enum_namespace() -both = express_getattr(IfcSurfaceSide, 'BOTH', INDETERMINATE) -negative = express_getattr(IfcSurfaceSide, 'NEGATIVE', INDETERMINATE) -positive = express_getattr(IfcSurfaceSide, 'POSITIVE', INDETERMINATE) +both = IfcSurfaceSide.BOTH +negative = IfcSurfaceSide.NEGATIVE +positive = IfcSurfaceSide.POSITIVE IfcSwitchingDeviceTypeEnum = enum_namespace() -contactor = express_getattr(IfcSwitchingDeviceTypeEnum, 'CONTACTOR', INDETERMINATE) -dimmerswitch = express_getattr(IfcSwitchingDeviceTypeEnum, 'DIMMERSWITCH', INDETERMINATE) -emergencystop = express_getattr(IfcSwitchingDeviceTypeEnum, 'EMERGENCYSTOP', INDETERMINATE) -keypad = express_getattr(IfcSwitchingDeviceTypeEnum, 'KEYPAD', INDETERMINATE) -momentaryswitch = express_getattr(IfcSwitchingDeviceTypeEnum, 'MOMENTARYSWITCH', INDETERMINATE) -relay = express_getattr(IfcSwitchingDeviceTypeEnum, 'RELAY', INDETERMINATE) -selectorswitch = express_getattr(IfcSwitchingDeviceTypeEnum, 'SELECTORSWITCH', INDETERMINATE) -starter = express_getattr(IfcSwitchingDeviceTypeEnum, 'STARTER', INDETERMINATE) -start_and_stop_equipment = express_getattr(IfcSwitchingDeviceTypeEnum, 'START_AND_STOP_EQUIPMENT', INDETERMINATE) -switchdisconnector = express_getattr(IfcSwitchingDeviceTypeEnum, 'SWITCHDISCONNECTOR', INDETERMINATE) -toggleswitch = express_getattr(IfcSwitchingDeviceTypeEnum, 'TOGGLESWITCH', INDETERMINATE) -userdefined = express_getattr(IfcSwitchingDeviceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSwitchingDeviceTypeEnum, 'NOTDEFINED', INDETERMINATE) +contactor = IfcSwitchingDeviceTypeEnum.CONTACTOR +dimmerswitch = IfcSwitchingDeviceTypeEnum.DIMMERSWITCH +emergencystop = IfcSwitchingDeviceTypeEnum.EMERGENCYSTOP +keypad = IfcSwitchingDeviceTypeEnum.KEYPAD +momentaryswitch = IfcSwitchingDeviceTypeEnum.MOMENTARYSWITCH +relay = IfcSwitchingDeviceTypeEnum.RELAY +selectorswitch = IfcSwitchingDeviceTypeEnum.SELECTORSWITCH +starter = IfcSwitchingDeviceTypeEnum.STARTER +start_and_stop_equipment = IfcSwitchingDeviceTypeEnum.START_AND_STOP_EQUIPMENT +switchdisconnector = IfcSwitchingDeviceTypeEnum.SWITCHDISCONNECTOR +toggleswitch = IfcSwitchingDeviceTypeEnum.TOGGLESWITCH +userdefined = IfcSwitchingDeviceTypeEnum.USERDEFINED +notdefined = IfcSwitchingDeviceTypeEnum.NOTDEFINED IfcSystemFurnitureElementTypeEnum = enum_namespace() -panel = express_getattr(IfcSystemFurnitureElementTypeEnum, 'PANEL', INDETERMINATE) -subrack = express_getattr(IfcSystemFurnitureElementTypeEnum, 'SUBRACK', INDETERMINATE) -worksurface = express_getattr(IfcSystemFurnitureElementTypeEnum, 'WORKSURFACE', INDETERMINATE) -userdefined = express_getattr(IfcSystemFurnitureElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSystemFurnitureElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +panel = IfcSystemFurnitureElementTypeEnum.PANEL +subrack = IfcSystemFurnitureElementTypeEnum.SUBRACK +worksurface = IfcSystemFurnitureElementTypeEnum.WORKSURFACE +userdefined = IfcSystemFurnitureElementTypeEnum.USERDEFINED +notdefined = IfcSystemFurnitureElementTypeEnum.NOTDEFINED IfcTankTypeEnum = enum_namespace() -basin = express_getattr(IfcTankTypeEnum, 'BASIN', INDETERMINATE) -breakpressure = express_getattr(IfcTankTypeEnum, 'BREAKPRESSURE', INDETERMINATE) -expansion = express_getattr(IfcTankTypeEnum, 'EXPANSION', INDETERMINATE) -feedandexpansion = express_getattr(IfcTankTypeEnum, 'FEEDANDEXPANSION', INDETERMINATE) -oilretentiontray = express_getattr(IfcTankTypeEnum, 'OILRETENTIONTRAY', INDETERMINATE) -pressurevessel = express_getattr(IfcTankTypeEnum, 'PRESSUREVESSEL', INDETERMINATE) -storage = express_getattr(IfcTankTypeEnum, 'STORAGE', INDETERMINATE) -vessel = express_getattr(IfcTankTypeEnum, 'VESSEL', INDETERMINATE) -userdefined = express_getattr(IfcTankTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTankTypeEnum, 'NOTDEFINED', INDETERMINATE) +basin = IfcTankTypeEnum.BASIN +breakpressure = IfcTankTypeEnum.BREAKPRESSURE +expansion = IfcTankTypeEnum.EXPANSION +feedandexpansion = IfcTankTypeEnum.FEEDANDEXPANSION +oilretentiontray = IfcTankTypeEnum.OILRETENTIONTRAY +pressurevessel = IfcTankTypeEnum.PRESSUREVESSEL +storage = IfcTankTypeEnum.STORAGE +vessel = IfcTankTypeEnum.VESSEL +userdefined = IfcTankTypeEnum.USERDEFINED +notdefined = IfcTankTypeEnum.NOTDEFINED IfcTaskDurationEnum = enum_namespace() -elapsedtime = express_getattr(IfcTaskDurationEnum, 'ELAPSEDTIME', INDETERMINATE) -worktime = express_getattr(IfcTaskDurationEnum, 'WORKTIME', INDETERMINATE) -notdefined = express_getattr(IfcTaskDurationEnum, 'NOTDEFINED', INDETERMINATE) +elapsedtime = IfcTaskDurationEnum.ELAPSEDTIME +worktime = IfcTaskDurationEnum.WORKTIME +notdefined = IfcTaskDurationEnum.NOTDEFINED IfcTaskTypeEnum = enum_namespace() -adjustment = express_getattr(IfcTaskTypeEnum, 'ADJUSTMENT', INDETERMINATE) -attendance = express_getattr(IfcTaskTypeEnum, 'ATTENDANCE', INDETERMINATE) -calibration = express_getattr(IfcTaskTypeEnum, 'CALIBRATION', INDETERMINATE) -construction = express_getattr(IfcTaskTypeEnum, 'CONSTRUCTION', INDETERMINATE) -demolition = express_getattr(IfcTaskTypeEnum, 'DEMOLITION', INDETERMINATE) -dismantle = express_getattr(IfcTaskTypeEnum, 'DISMANTLE', INDETERMINATE) -disposal = express_getattr(IfcTaskTypeEnum, 'DISPOSAL', INDETERMINATE) -emergency = express_getattr(IfcTaskTypeEnum, 'EMERGENCY', INDETERMINATE) -inspection = express_getattr(IfcTaskTypeEnum, 'INSPECTION', INDETERMINATE) -installation = express_getattr(IfcTaskTypeEnum, 'INSTALLATION', INDETERMINATE) -logistic = express_getattr(IfcTaskTypeEnum, 'LOGISTIC', INDETERMINATE) -maintenance = express_getattr(IfcTaskTypeEnum, 'MAINTENANCE', INDETERMINATE) -move = express_getattr(IfcTaskTypeEnum, 'MOVE', INDETERMINATE) -operation = express_getattr(IfcTaskTypeEnum, 'OPERATION', INDETERMINATE) -removal = express_getattr(IfcTaskTypeEnum, 'REMOVAL', INDETERMINATE) -renovation = express_getattr(IfcTaskTypeEnum, 'RENOVATION', INDETERMINATE) -safety = express_getattr(IfcTaskTypeEnum, 'SAFETY', INDETERMINATE) -shutdown = express_getattr(IfcTaskTypeEnum, 'SHUTDOWN', INDETERMINATE) -startup = express_getattr(IfcTaskTypeEnum, 'STARTUP', INDETERMINATE) -testing = express_getattr(IfcTaskTypeEnum, 'TESTING', INDETERMINATE) -troubleshooting = express_getattr(IfcTaskTypeEnum, 'TROUBLESHOOTING', INDETERMINATE) -userdefined = express_getattr(IfcTaskTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTaskTypeEnum, 'NOTDEFINED', INDETERMINATE) +adjustment = IfcTaskTypeEnum.ADJUSTMENT +attendance = IfcTaskTypeEnum.ATTENDANCE +calibration = IfcTaskTypeEnum.CALIBRATION +construction = IfcTaskTypeEnum.CONSTRUCTION +demolition = IfcTaskTypeEnum.DEMOLITION +dismantle = IfcTaskTypeEnum.DISMANTLE +disposal = IfcTaskTypeEnum.DISPOSAL +emergency = IfcTaskTypeEnum.EMERGENCY +inspection = IfcTaskTypeEnum.INSPECTION +installation = IfcTaskTypeEnum.INSTALLATION +logistic = IfcTaskTypeEnum.LOGISTIC +maintenance = IfcTaskTypeEnum.MAINTENANCE +move = IfcTaskTypeEnum.MOVE +operation = IfcTaskTypeEnum.OPERATION +removal = IfcTaskTypeEnum.REMOVAL +renovation = IfcTaskTypeEnum.RENOVATION +safety = IfcTaskTypeEnum.SAFETY +shutdown = IfcTaskTypeEnum.SHUTDOWN +startup = IfcTaskTypeEnum.STARTUP +testing = IfcTaskTypeEnum.TESTING +troubleshooting = IfcTaskTypeEnum.TROUBLESHOOTING +userdefined = IfcTaskTypeEnum.USERDEFINED +notdefined = IfcTaskTypeEnum.NOTDEFINED IfcTendonAnchorTypeEnum = enum_namespace() -coupler = express_getattr(IfcTendonAnchorTypeEnum, 'COUPLER', INDETERMINATE) -fixed_end = express_getattr(IfcTendonAnchorTypeEnum, 'FIXED_END', INDETERMINATE) -tensioning_end = express_getattr(IfcTendonAnchorTypeEnum, 'TENSIONING_END', INDETERMINATE) -userdefined = express_getattr(IfcTendonAnchorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTendonAnchorTypeEnum, 'NOTDEFINED', INDETERMINATE) +coupler = IfcTendonAnchorTypeEnum.COUPLER +fixed_end = IfcTendonAnchorTypeEnum.FIXED_END +tensioning_end = IfcTendonAnchorTypeEnum.TENSIONING_END +userdefined = IfcTendonAnchorTypeEnum.USERDEFINED +notdefined = IfcTendonAnchorTypeEnum.NOTDEFINED IfcTendonConduitTypeEnum = enum_namespace() -coupler = express_getattr(IfcTendonConduitTypeEnum, 'COUPLER', INDETERMINATE) -diabolo = express_getattr(IfcTendonConduitTypeEnum, 'DIABOLO', INDETERMINATE) -duct = express_getattr(IfcTendonConduitTypeEnum, 'DUCT', INDETERMINATE) -grouting_duct = express_getattr(IfcTendonConduitTypeEnum, 'GROUTING_DUCT', INDETERMINATE) -trumpet = express_getattr(IfcTendonConduitTypeEnum, 'TRUMPET', INDETERMINATE) -userdefined = express_getattr(IfcTendonConduitTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTendonConduitTypeEnum, 'NOTDEFINED', INDETERMINATE) +coupler = IfcTendonConduitTypeEnum.COUPLER +diabolo = IfcTendonConduitTypeEnum.DIABOLO +duct = IfcTendonConduitTypeEnum.DUCT +grouting_duct = IfcTendonConduitTypeEnum.GROUTING_DUCT +trumpet = IfcTendonConduitTypeEnum.TRUMPET +userdefined = IfcTendonConduitTypeEnum.USERDEFINED +notdefined = IfcTendonConduitTypeEnum.NOTDEFINED IfcTendonTypeEnum = enum_namespace() -bar = express_getattr(IfcTendonTypeEnum, 'BAR', INDETERMINATE) -coated = express_getattr(IfcTendonTypeEnum, 'COATED', INDETERMINATE) -strand = express_getattr(IfcTendonTypeEnum, 'STRAND', INDETERMINATE) -wire = express_getattr(IfcTendonTypeEnum, 'WIRE', INDETERMINATE) -userdefined = express_getattr(IfcTendonTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTendonTypeEnum, 'NOTDEFINED', INDETERMINATE) +bar = IfcTendonTypeEnum.BAR +coated = IfcTendonTypeEnum.COATED +strand = IfcTendonTypeEnum.STRAND +wire = IfcTendonTypeEnum.WIRE +userdefined = IfcTendonTypeEnum.USERDEFINED +notdefined = IfcTendonTypeEnum.NOTDEFINED IfcTextPath = enum_namespace() -down = express_getattr(IfcTextPath, 'DOWN', INDETERMINATE) -left = express_getattr(IfcTextPath, 'LEFT', INDETERMINATE) -right = express_getattr(IfcTextPath, 'RIGHT', INDETERMINATE) -up = express_getattr(IfcTextPath, 'UP', INDETERMINATE) +down = IfcTextPath.DOWN +left = IfcTextPath.LEFT +right = IfcTextPath.RIGHT +up = IfcTextPath.UP IfcTimeSeriesDataTypeEnum = enum_namespace() -continuous = express_getattr(IfcTimeSeriesDataTypeEnum, 'CONTINUOUS', INDETERMINATE) -discrete = express_getattr(IfcTimeSeriesDataTypeEnum, 'DISCRETE', INDETERMINATE) -discretebinary = express_getattr(IfcTimeSeriesDataTypeEnum, 'DISCRETEBINARY', INDETERMINATE) -piecewisebinary = express_getattr(IfcTimeSeriesDataTypeEnum, 'PIECEWISEBINARY', INDETERMINATE) -piecewiseconstant = express_getattr(IfcTimeSeriesDataTypeEnum, 'PIECEWISECONSTANT', INDETERMINATE) -piecewisecontinuous = express_getattr(IfcTimeSeriesDataTypeEnum, 'PIECEWISECONTINUOUS', INDETERMINATE) -notdefined = express_getattr(IfcTimeSeriesDataTypeEnum, 'NOTDEFINED', INDETERMINATE) +continuous = IfcTimeSeriesDataTypeEnum.CONTINUOUS +discrete = IfcTimeSeriesDataTypeEnum.DISCRETE +discretebinary = IfcTimeSeriesDataTypeEnum.DISCRETEBINARY +piecewisebinary = IfcTimeSeriesDataTypeEnum.PIECEWISEBINARY +piecewiseconstant = IfcTimeSeriesDataTypeEnum.PIECEWISECONSTANT +piecewisecontinuous = IfcTimeSeriesDataTypeEnum.PIECEWISECONTINUOUS +notdefined = IfcTimeSeriesDataTypeEnum.NOTDEFINED IfcTrackElementTypeEnum = enum_namespace() -blockingdevice = express_getattr(IfcTrackElementTypeEnum, 'BLOCKINGDEVICE', INDETERMINATE) -derailer = express_getattr(IfcTrackElementTypeEnum, 'DERAILER', INDETERMINATE) -frog = express_getattr(IfcTrackElementTypeEnum, 'FROG', INDETERMINATE) -half_set_of_blades = express_getattr(IfcTrackElementTypeEnum, 'HALF_SET_OF_BLADES', INDETERMINATE) -sleeper = express_getattr(IfcTrackElementTypeEnum, 'SLEEPER', INDETERMINATE) -speedregulator = express_getattr(IfcTrackElementTypeEnum, 'SPEEDREGULATOR', INDETERMINATE) -trackendofalignment = express_getattr(IfcTrackElementTypeEnum, 'TRACKENDOFALIGNMENT', INDETERMINATE) -vehiclestop = express_getattr(IfcTrackElementTypeEnum, 'VEHICLESTOP', INDETERMINATE) -userdefined = express_getattr(IfcTrackElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTrackElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +blockingdevice = IfcTrackElementTypeEnum.BLOCKINGDEVICE +derailer = IfcTrackElementTypeEnum.DERAILER +frog = IfcTrackElementTypeEnum.FROG +half_set_of_blades = IfcTrackElementTypeEnum.HALF_SET_OF_BLADES +sleeper = IfcTrackElementTypeEnum.SLEEPER +speedregulator = IfcTrackElementTypeEnum.SPEEDREGULATOR +trackendofalignment = IfcTrackElementTypeEnum.TRACKENDOFALIGNMENT +vehiclestop = IfcTrackElementTypeEnum.VEHICLESTOP +userdefined = IfcTrackElementTypeEnum.USERDEFINED +notdefined = IfcTrackElementTypeEnum.NOTDEFINED IfcTransformerTypeEnum = enum_namespace() -chopper = express_getattr(IfcTransformerTypeEnum, 'CHOPPER', INDETERMINATE) -combined = express_getattr(IfcTransformerTypeEnum, 'COMBINED', INDETERMINATE) -current = express_getattr(IfcTransformerTypeEnum, 'CURRENT', INDETERMINATE) -frequency = express_getattr(IfcTransformerTypeEnum, 'FREQUENCY', INDETERMINATE) -inverter = express_getattr(IfcTransformerTypeEnum, 'INVERTER', INDETERMINATE) -rectifier = express_getattr(IfcTransformerTypeEnum, 'RECTIFIER', INDETERMINATE) -voltage = express_getattr(IfcTransformerTypeEnum, 'VOLTAGE', INDETERMINATE) -userdefined = express_getattr(IfcTransformerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTransformerTypeEnum, 'NOTDEFINED', INDETERMINATE) +chopper = IfcTransformerTypeEnum.CHOPPER +combined = IfcTransformerTypeEnum.COMBINED +current = IfcTransformerTypeEnum.CURRENT +frequency = IfcTransformerTypeEnum.FREQUENCY +inverter = IfcTransformerTypeEnum.INVERTER +rectifier = IfcTransformerTypeEnum.RECTIFIER +voltage = IfcTransformerTypeEnum.VOLTAGE +userdefined = IfcTransformerTypeEnum.USERDEFINED +notdefined = IfcTransformerTypeEnum.NOTDEFINED IfcTransitionCode = enum_namespace() -continuous = express_getattr(IfcTransitionCode, 'CONTINUOUS', INDETERMINATE) -contsamegradient = express_getattr(IfcTransitionCode, 'CONTSAMEGRADIENT', INDETERMINATE) -contsamegradientsamecurvature = express_getattr(IfcTransitionCode, 'CONTSAMEGRADIENTSAMECURVATURE', INDETERMINATE) -discontinuous = express_getattr(IfcTransitionCode, 'DISCONTINUOUS', INDETERMINATE) +continuous = IfcTransitionCode.CONTINUOUS +contsamegradient = IfcTransitionCode.CONTSAMEGRADIENT +contsamegradientsamecurvature = IfcTransitionCode.CONTSAMEGRADIENTSAMECURVATURE +discontinuous = IfcTransitionCode.DISCONTINUOUS IfcTransportElementTypeEnum = enum_namespace() -craneway = express_getattr(IfcTransportElementTypeEnum, 'CRANEWAY', INDETERMINATE) -elevator = express_getattr(IfcTransportElementTypeEnum, 'ELEVATOR', INDETERMINATE) -escalator = express_getattr(IfcTransportElementTypeEnum, 'ESCALATOR', INDETERMINATE) -haulinggear = express_getattr(IfcTransportElementTypeEnum, 'HAULINGGEAR', INDETERMINATE) -liftinggear = express_getattr(IfcTransportElementTypeEnum, 'LIFTINGGEAR', INDETERMINATE) -movingwalkway = express_getattr(IfcTransportElementTypeEnum, 'MOVINGWALKWAY', INDETERMINATE) -userdefined = express_getattr(IfcTransportElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTransportElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +craneway = IfcTransportElementTypeEnum.CRANEWAY +elevator = IfcTransportElementTypeEnum.ELEVATOR +escalator = IfcTransportElementTypeEnum.ESCALATOR +haulinggear = IfcTransportElementTypeEnum.HAULINGGEAR +liftinggear = IfcTransportElementTypeEnum.LIFTINGGEAR +movingwalkway = IfcTransportElementTypeEnum.MOVINGWALKWAY +userdefined = IfcTransportElementTypeEnum.USERDEFINED +notdefined = IfcTransportElementTypeEnum.NOTDEFINED IfcTrimmingPreference = enum_namespace() -cartesian = express_getattr(IfcTrimmingPreference, 'CARTESIAN', INDETERMINATE) -parameter = express_getattr(IfcTrimmingPreference, 'PARAMETER', INDETERMINATE) -unspecified = express_getattr(IfcTrimmingPreference, 'UNSPECIFIED', INDETERMINATE) +cartesian = IfcTrimmingPreference.CARTESIAN +parameter = IfcTrimmingPreference.PARAMETER +unspecified = IfcTrimmingPreference.UNSPECIFIED IfcTubeBundleTypeEnum = enum_namespace() -finned = express_getattr(IfcTubeBundleTypeEnum, 'FINNED', INDETERMINATE) -userdefined = express_getattr(IfcTubeBundleTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTubeBundleTypeEnum, 'NOTDEFINED', INDETERMINATE) +finned = IfcTubeBundleTypeEnum.FINNED +userdefined = IfcTubeBundleTypeEnum.USERDEFINED +notdefined = IfcTubeBundleTypeEnum.NOTDEFINED IfcUnitEnum = enum_namespace() -absorbeddoseunit = express_getattr(IfcUnitEnum, 'ABSORBEDDOSEUNIT', INDETERMINATE) -amountofsubstanceunit = express_getattr(IfcUnitEnum, 'AMOUNTOFSUBSTANCEUNIT', INDETERMINATE) -areaunit = express_getattr(IfcUnitEnum, 'AREAUNIT', INDETERMINATE) -doseequivalentunit = express_getattr(IfcUnitEnum, 'DOSEEQUIVALENTUNIT', INDETERMINATE) -electriccapacitanceunit = express_getattr(IfcUnitEnum, 'ELECTRICCAPACITANCEUNIT', INDETERMINATE) -electricchargeunit = express_getattr(IfcUnitEnum, 'ELECTRICCHARGEUNIT', INDETERMINATE) -electricconductanceunit = express_getattr(IfcUnitEnum, 'ELECTRICCONDUCTANCEUNIT', INDETERMINATE) -electriccurrentunit = express_getattr(IfcUnitEnum, 'ELECTRICCURRENTUNIT', INDETERMINATE) -electricresistanceunit = express_getattr(IfcUnitEnum, 'ELECTRICRESISTANCEUNIT', INDETERMINATE) -electricvoltageunit = express_getattr(IfcUnitEnum, 'ELECTRICVOLTAGEUNIT', INDETERMINATE) -energyunit = express_getattr(IfcUnitEnum, 'ENERGYUNIT', INDETERMINATE) -forceunit = express_getattr(IfcUnitEnum, 'FORCEUNIT', INDETERMINATE) -frequencyunit = express_getattr(IfcUnitEnum, 'FREQUENCYUNIT', INDETERMINATE) -illuminanceunit = express_getattr(IfcUnitEnum, 'ILLUMINANCEUNIT', INDETERMINATE) -inductanceunit = express_getattr(IfcUnitEnum, 'INDUCTANCEUNIT', INDETERMINATE) -lengthunit = express_getattr(IfcUnitEnum, 'LENGTHUNIT', INDETERMINATE) -luminousfluxunit = express_getattr(IfcUnitEnum, 'LUMINOUSFLUXUNIT', INDETERMINATE) -luminousintensityunit = express_getattr(IfcUnitEnum, 'LUMINOUSINTENSITYUNIT', INDETERMINATE) -magneticfluxdensityunit = express_getattr(IfcUnitEnum, 'MAGNETICFLUXDENSITYUNIT', INDETERMINATE) -magneticfluxunit = express_getattr(IfcUnitEnum, 'MAGNETICFLUXUNIT', INDETERMINATE) -massunit = express_getattr(IfcUnitEnum, 'MASSUNIT', INDETERMINATE) -planeangleunit = express_getattr(IfcUnitEnum, 'PLANEANGLEUNIT', INDETERMINATE) -powerunit = express_getattr(IfcUnitEnum, 'POWERUNIT', INDETERMINATE) -pressureunit = express_getattr(IfcUnitEnum, 'PRESSUREUNIT', INDETERMINATE) -radioactivityunit = express_getattr(IfcUnitEnum, 'RADIOACTIVITYUNIT', INDETERMINATE) -solidangleunit = express_getattr(IfcUnitEnum, 'SOLIDANGLEUNIT', INDETERMINATE) -thermodynamictemperatureunit = express_getattr(IfcUnitEnum, 'THERMODYNAMICTEMPERATUREUNIT', INDETERMINATE) -timeunit = express_getattr(IfcUnitEnum, 'TIMEUNIT', INDETERMINATE) -volumeunit = express_getattr(IfcUnitEnum, 'VOLUMEUNIT', INDETERMINATE) -userdefined = express_getattr(IfcUnitEnum, 'USERDEFINED', INDETERMINATE) +absorbeddoseunit = IfcUnitEnum.ABSORBEDDOSEUNIT +amountofsubstanceunit = IfcUnitEnum.AMOUNTOFSUBSTANCEUNIT +areaunit = IfcUnitEnum.AREAUNIT +doseequivalentunit = IfcUnitEnum.DOSEEQUIVALENTUNIT +electriccapacitanceunit = IfcUnitEnum.ELECTRICCAPACITANCEUNIT +electricchargeunit = IfcUnitEnum.ELECTRICCHARGEUNIT +electricconductanceunit = IfcUnitEnum.ELECTRICCONDUCTANCEUNIT +electriccurrentunit = IfcUnitEnum.ELECTRICCURRENTUNIT +electricresistanceunit = IfcUnitEnum.ELECTRICRESISTANCEUNIT +electricvoltageunit = IfcUnitEnum.ELECTRICVOLTAGEUNIT +energyunit = IfcUnitEnum.ENERGYUNIT +forceunit = IfcUnitEnum.FORCEUNIT +frequencyunit = IfcUnitEnum.FREQUENCYUNIT +illuminanceunit = IfcUnitEnum.ILLUMINANCEUNIT +inductanceunit = IfcUnitEnum.INDUCTANCEUNIT +lengthunit = IfcUnitEnum.LENGTHUNIT +luminousfluxunit = IfcUnitEnum.LUMINOUSFLUXUNIT +luminousintensityunit = IfcUnitEnum.LUMINOUSINTENSITYUNIT +magneticfluxdensityunit = IfcUnitEnum.MAGNETICFLUXDENSITYUNIT +magneticfluxunit = IfcUnitEnum.MAGNETICFLUXUNIT +massunit = IfcUnitEnum.MASSUNIT +planeangleunit = IfcUnitEnum.PLANEANGLEUNIT +powerunit = IfcUnitEnum.POWERUNIT +pressureunit = IfcUnitEnum.PRESSUREUNIT +radioactivityunit = IfcUnitEnum.RADIOACTIVITYUNIT +solidangleunit = IfcUnitEnum.SOLIDANGLEUNIT +thermodynamictemperatureunit = IfcUnitEnum.THERMODYNAMICTEMPERATUREUNIT +timeunit = IfcUnitEnum.TIMEUNIT +volumeunit = IfcUnitEnum.VOLUMEUNIT +userdefined = IfcUnitEnum.USERDEFINED IfcUnitaryControlElementTypeEnum = enum_namespace() -alarmpanel = express_getattr(IfcUnitaryControlElementTypeEnum, 'ALARMPANEL', INDETERMINATE) -basestationcontroller = express_getattr(IfcUnitaryControlElementTypeEnum, 'BASESTATIONCONTROLLER', INDETERMINATE) -combined = express_getattr(IfcUnitaryControlElementTypeEnum, 'COMBINED', INDETERMINATE) -controlpanel = express_getattr(IfcUnitaryControlElementTypeEnum, 'CONTROLPANEL', INDETERMINATE) -gasdetectionpanel = express_getattr(IfcUnitaryControlElementTypeEnum, 'GASDETECTIONPANEL', INDETERMINATE) -humidistat = express_getattr(IfcUnitaryControlElementTypeEnum, 'HUMIDISTAT', INDETERMINATE) -indicatorpanel = express_getattr(IfcUnitaryControlElementTypeEnum, 'INDICATORPANEL', INDETERMINATE) -mimicpanel = express_getattr(IfcUnitaryControlElementTypeEnum, 'MIMICPANEL', INDETERMINATE) -thermostat = express_getattr(IfcUnitaryControlElementTypeEnum, 'THERMOSTAT', INDETERMINATE) -weatherstation = express_getattr(IfcUnitaryControlElementTypeEnum, 'WEATHERSTATION', INDETERMINATE) -userdefined = express_getattr(IfcUnitaryControlElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcUnitaryControlElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +alarmpanel = IfcUnitaryControlElementTypeEnum.ALARMPANEL +basestationcontroller = IfcUnitaryControlElementTypeEnum.BASESTATIONCONTROLLER +combined = IfcUnitaryControlElementTypeEnum.COMBINED +controlpanel = IfcUnitaryControlElementTypeEnum.CONTROLPANEL +gasdetectionpanel = IfcUnitaryControlElementTypeEnum.GASDETECTIONPANEL +humidistat = IfcUnitaryControlElementTypeEnum.HUMIDISTAT +indicatorpanel = IfcUnitaryControlElementTypeEnum.INDICATORPANEL +mimicpanel = IfcUnitaryControlElementTypeEnum.MIMICPANEL +thermostat = IfcUnitaryControlElementTypeEnum.THERMOSTAT +weatherstation = IfcUnitaryControlElementTypeEnum.WEATHERSTATION +userdefined = IfcUnitaryControlElementTypeEnum.USERDEFINED +notdefined = IfcUnitaryControlElementTypeEnum.NOTDEFINED IfcUnitaryEquipmentTypeEnum = enum_namespace() -airconditioningunit = express_getattr(IfcUnitaryEquipmentTypeEnum, 'AIRCONDITIONINGUNIT', INDETERMINATE) -airhandler = express_getattr(IfcUnitaryEquipmentTypeEnum, 'AIRHANDLER', INDETERMINATE) -dehumidifier = express_getattr(IfcUnitaryEquipmentTypeEnum, 'DEHUMIDIFIER', INDETERMINATE) -rooftopunit = express_getattr(IfcUnitaryEquipmentTypeEnum, 'ROOFTOPUNIT', INDETERMINATE) -splitsystem = express_getattr(IfcUnitaryEquipmentTypeEnum, 'SPLITSYSTEM', INDETERMINATE) -userdefined = express_getattr(IfcUnitaryEquipmentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcUnitaryEquipmentTypeEnum, 'NOTDEFINED', INDETERMINATE) +airconditioningunit = IfcUnitaryEquipmentTypeEnum.AIRCONDITIONINGUNIT +airhandler = IfcUnitaryEquipmentTypeEnum.AIRHANDLER +dehumidifier = IfcUnitaryEquipmentTypeEnum.DEHUMIDIFIER +rooftopunit = IfcUnitaryEquipmentTypeEnum.ROOFTOPUNIT +splitsystem = IfcUnitaryEquipmentTypeEnum.SPLITSYSTEM +userdefined = IfcUnitaryEquipmentTypeEnum.USERDEFINED +notdefined = IfcUnitaryEquipmentTypeEnum.NOTDEFINED IfcValveTypeEnum = enum_namespace() -airrelease = express_getattr(IfcValveTypeEnum, 'AIRRELEASE', INDETERMINATE) -antivacuum = express_getattr(IfcValveTypeEnum, 'ANTIVACUUM', INDETERMINATE) -changeover = express_getattr(IfcValveTypeEnum, 'CHANGEOVER', INDETERMINATE) -check = express_getattr(IfcValveTypeEnum, 'CHECK', INDETERMINATE) -commissioning = express_getattr(IfcValveTypeEnum, 'COMMISSIONING', INDETERMINATE) -diverting = express_getattr(IfcValveTypeEnum, 'DIVERTING', INDETERMINATE) -doublecheck = express_getattr(IfcValveTypeEnum, 'DOUBLECHECK', INDETERMINATE) -doubleregulating = express_getattr(IfcValveTypeEnum, 'DOUBLEREGULATING', INDETERMINATE) -drawoffcock = express_getattr(IfcValveTypeEnum, 'DRAWOFFCOCK', INDETERMINATE) -faucet = express_getattr(IfcValveTypeEnum, 'FAUCET', INDETERMINATE) -flushing = express_getattr(IfcValveTypeEnum, 'FLUSHING', INDETERMINATE) -gascock = express_getattr(IfcValveTypeEnum, 'GASCOCK', INDETERMINATE) -gastap = express_getattr(IfcValveTypeEnum, 'GASTAP', INDETERMINATE) -isolating = express_getattr(IfcValveTypeEnum, 'ISOLATING', INDETERMINATE) -mixing = express_getattr(IfcValveTypeEnum, 'MIXING', INDETERMINATE) -pressurereducing = express_getattr(IfcValveTypeEnum, 'PRESSUREREDUCING', INDETERMINATE) -pressurerelief = express_getattr(IfcValveTypeEnum, 'PRESSURERELIEF', INDETERMINATE) -regulating = express_getattr(IfcValveTypeEnum, 'REGULATING', INDETERMINATE) -safetycutoff = express_getattr(IfcValveTypeEnum, 'SAFETYCUTOFF', INDETERMINATE) -steamtrap = express_getattr(IfcValveTypeEnum, 'STEAMTRAP', INDETERMINATE) -stopcock = express_getattr(IfcValveTypeEnum, 'STOPCOCK', INDETERMINATE) -userdefined = express_getattr(IfcValveTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcValveTypeEnum, 'NOTDEFINED', INDETERMINATE) +airrelease = IfcValveTypeEnum.AIRRELEASE +antivacuum = IfcValveTypeEnum.ANTIVACUUM +changeover = IfcValveTypeEnum.CHANGEOVER +check = IfcValveTypeEnum.CHECK +commissioning = IfcValveTypeEnum.COMMISSIONING +diverting = IfcValveTypeEnum.DIVERTING +doublecheck = IfcValveTypeEnum.DOUBLECHECK +doubleregulating = IfcValveTypeEnum.DOUBLEREGULATING +drawoffcock = IfcValveTypeEnum.DRAWOFFCOCK +faucet = IfcValveTypeEnum.FAUCET +flushing = IfcValveTypeEnum.FLUSHING +gascock = IfcValveTypeEnum.GASCOCK +gastap = IfcValveTypeEnum.GASTAP +isolating = IfcValveTypeEnum.ISOLATING +mixing = IfcValveTypeEnum.MIXING +pressurereducing = IfcValveTypeEnum.PRESSUREREDUCING +pressurerelief = IfcValveTypeEnum.PRESSURERELIEF +regulating = IfcValveTypeEnum.REGULATING +safetycutoff = IfcValveTypeEnum.SAFETYCUTOFF +steamtrap = IfcValveTypeEnum.STEAMTRAP +stopcock = IfcValveTypeEnum.STOPCOCK +userdefined = IfcValveTypeEnum.USERDEFINED +notdefined = IfcValveTypeEnum.NOTDEFINED IfcVehicleTypeEnum = enum_namespace() -cargo = express_getattr(IfcVehicleTypeEnum, 'CARGO', INDETERMINATE) -rollingstock = express_getattr(IfcVehicleTypeEnum, 'ROLLINGSTOCK', INDETERMINATE) -vehicle = express_getattr(IfcVehicleTypeEnum, 'VEHICLE', INDETERMINATE) -vehicleair = express_getattr(IfcVehicleTypeEnum, 'VEHICLEAIR', INDETERMINATE) -vehiclemarine = express_getattr(IfcVehicleTypeEnum, 'VEHICLEMARINE', INDETERMINATE) -vehicletracked = express_getattr(IfcVehicleTypeEnum, 'VEHICLETRACKED', INDETERMINATE) -vehiclewheeled = express_getattr(IfcVehicleTypeEnum, 'VEHICLEWHEELED', INDETERMINATE) -userdefined = express_getattr(IfcVehicleTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcVehicleTypeEnum, 'NOTDEFINED', INDETERMINATE) +cargo = IfcVehicleTypeEnum.CARGO +rollingstock = IfcVehicleTypeEnum.ROLLINGSTOCK +vehicle = IfcVehicleTypeEnum.VEHICLE +vehicleair = IfcVehicleTypeEnum.VEHICLEAIR +vehiclemarine = IfcVehicleTypeEnum.VEHICLEMARINE +vehicletracked = IfcVehicleTypeEnum.VEHICLETRACKED +vehiclewheeled = IfcVehicleTypeEnum.VEHICLEWHEELED +userdefined = IfcVehicleTypeEnum.USERDEFINED +notdefined = IfcVehicleTypeEnum.NOTDEFINED IfcVibrationDamperTypeEnum = enum_namespace() -axial_yield = express_getattr(IfcVibrationDamperTypeEnum, 'AXIAL_YIELD', INDETERMINATE) -bending_yield = express_getattr(IfcVibrationDamperTypeEnum, 'BENDING_YIELD', INDETERMINATE) -friction = express_getattr(IfcVibrationDamperTypeEnum, 'FRICTION', INDETERMINATE) -rubber = express_getattr(IfcVibrationDamperTypeEnum, 'RUBBER', INDETERMINATE) -shear_yield = express_getattr(IfcVibrationDamperTypeEnum, 'SHEAR_YIELD', INDETERMINATE) -viscous = express_getattr(IfcVibrationDamperTypeEnum, 'VISCOUS', INDETERMINATE) -userdefined = express_getattr(IfcVibrationDamperTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcVibrationDamperTypeEnum, 'NOTDEFINED', INDETERMINATE) +axial_yield = IfcVibrationDamperTypeEnum.AXIAL_YIELD +bending_yield = IfcVibrationDamperTypeEnum.BENDING_YIELD +friction = IfcVibrationDamperTypeEnum.FRICTION +rubber = IfcVibrationDamperTypeEnum.RUBBER +shear_yield = IfcVibrationDamperTypeEnum.SHEAR_YIELD +viscous = IfcVibrationDamperTypeEnum.VISCOUS +userdefined = IfcVibrationDamperTypeEnum.USERDEFINED +notdefined = IfcVibrationDamperTypeEnum.NOTDEFINED IfcVibrationIsolatorTypeEnum = enum_namespace() -base = express_getattr(IfcVibrationIsolatorTypeEnum, 'BASE', INDETERMINATE) -compression = express_getattr(IfcVibrationIsolatorTypeEnum, 'COMPRESSION', INDETERMINATE) -spring = express_getattr(IfcVibrationIsolatorTypeEnum, 'SPRING', INDETERMINATE) -userdefined = express_getattr(IfcVibrationIsolatorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcVibrationIsolatorTypeEnum, 'NOTDEFINED', INDETERMINATE) +base = IfcVibrationIsolatorTypeEnum.BASE +compression = IfcVibrationIsolatorTypeEnum.COMPRESSION +spring = IfcVibrationIsolatorTypeEnum.SPRING +userdefined = IfcVibrationIsolatorTypeEnum.USERDEFINED +notdefined = IfcVibrationIsolatorTypeEnum.NOTDEFINED IfcVirtualElementTypeEnum = enum_namespace() -boundary = express_getattr(IfcVirtualElementTypeEnum, 'BOUNDARY', INDETERMINATE) -clearance = express_getattr(IfcVirtualElementTypeEnum, 'CLEARANCE', INDETERMINATE) -provisionforvoid = express_getattr(IfcVirtualElementTypeEnum, 'PROVISIONFORVOID', INDETERMINATE) -userdefined = express_getattr(IfcVirtualElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcVirtualElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +boundary = IfcVirtualElementTypeEnum.BOUNDARY +clearance = IfcVirtualElementTypeEnum.CLEARANCE +provisionforvoid = IfcVirtualElementTypeEnum.PROVISIONFORVOID +userdefined = IfcVirtualElementTypeEnum.USERDEFINED +notdefined = IfcVirtualElementTypeEnum.NOTDEFINED IfcVoidingFeatureTypeEnum = enum_namespace() -chamfer = express_getattr(IfcVoidingFeatureTypeEnum, 'CHAMFER', INDETERMINATE) -cutout = express_getattr(IfcVoidingFeatureTypeEnum, 'CUTOUT', INDETERMINATE) -edge = express_getattr(IfcVoidingFeatureTypeEnum, 'EDGE', INDETERMINATE) -hole = express_getattr(IfcVoidingFeatureTypeEnum, 'HOLE', INDETERMINATE) -miter = express_getattr(IfcVoidingFeatureTypeEnum, 'MITER', INDETERMINATE) -notch = express_getattr(IfcVoidingFeatureTypeEnum, 'NOTCH', INDETERMINATE) -userdefined = express_getattr(IfcVoidingFeatureTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcVoidingFeatureTypeEnum, 'NOTDEFINED', INDETERMINATE) +chamfer = IfcVoidingFeatureTypeEnum.CHAMFER +cutout = IfcVoidingFeatureTypeEnum.CUTOUT +edge = IfcVoidingFeatureTypeEnum.EDGE +hole = IfcVoidingFeatureTypeEnum.HOLE +miter = IfcVoidingFeatureTypeEnum.MITER +notch = IfcVoidingFeatureTypeEnum.NOTCH +userdefined = IfcVoidingFeatureTypeEnum.USERDEFINED +notdefined = IfcVoidingFeatureTypeEnum.NOTDEFINED IfcWallTypeEnum = enum_namespace() -elementedwall = express_getattr(IfcWallTypeEnum, 'ELEMENTEDWALL', INDETERMINATE) -movable = express_getattr(IfcWallTypeEnum, 'MOVABLE', INDETERMINATE) -parapet = express_getattr(IfcWallTypeEnum, 'PARAPET', INDETERMINATE) -partitioning = express_getattr(IfcWallTypeEnum, 'PARTITIONING', INDETERMINATE) -plumbingwall = express_getattr(IfcWallTypeEnum, 'PLUMBINGWALL', INDETERMINATE) -polygonal = express_getattr(IfcWallTypeEnum, 'POLYGONAL', INDETERMINATE) -retainingwall = express_getattr(IfcWallTypeEnum, 'RETAININGWALL', INDETERMINATE) -shear = express_getattr(IfcWallTypeEnum, 'SHEAR', INDETERMINATE) -solidwall = express_getattr(IfcWallTypeEnum, 'SOLIDWALL', INDETERMINATE) -standard = express_getattr(IfcWallTypeEnum, 'STANDARD', INDETERMINATE) -wavewall = express_getattr(IfcWallTypeEnum, 'WAVEWALL', INDETERMINATE) -userdefined = express_getattr(IfcWallTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcWallTypeEnum, 'NOTDEFINED', INDETERMINATE) +elementedwall = IfcWallTypeEnum.ELEMENTEDWALL +movable = IfcWallTypeEnum.MOVABLE +parapet = IfcWallTypeEnum.PARAPET +partitioning = IfcWallTypeEnum.PARTITIONING +plumbingwall = IfcWallTypeEnum.PLUMBINGWALL +polygonal = IfcWallTypeEnum.POLYGONAL +retainingwall = IfcWallTypeEnum.RETAININGWALL +shear = IfcWallTypeEnum.SHEAR +solidwall = IfcWallTypeEnum.SOLIDWALL +standard = IfcWallTypeEnum.STANDARD +wavewall = IfcWallTypeEnum.WAVEWALL +userdefined = IfcWallTypeEnum.USERDEFINED +notdefined = IfcWallTypeEnum.NOTDEFINED IfcWasteTerminalTypeEnum = enum_namespace() -floortrap = express_getattr(IfcWasteTerminalTypeEnum, 'FLOORTRAP', INDETERMINATE) -floorwaste = express_getattr(IfcWasteTerminalTypeEnum, 'FLOORWASTE', INDETERMINATE) -gullysump = express_getattr(IfcWasteTerminalTypeEnum, 'GULLYSUMP', INDETERMINATE) -gullytrap = express_getattr(IfcWasteTerminalTypeEnum, 'GULLYTRAP', INDETERMINATE) -roofdrain = express_getattr(IfcWasteTerminalTypeEnum, 'ROOFDRAIN', INDETERMINATE) -wastedisposalunit = express_getattr(IfcWasteTerminalTypeEnum, 'WASTEDISPOSALUNIT', INDETERMINATE) -wastetrap = express_getattr(IfcWasteTerminalTypeEnum, 'WASTETRAP', INDETERMINATE) -userdefined = express_getattr(IfcWasteTerminalTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcWasteTerminalTypeEnum, 'NOTDEFINED', INDETERMINATE) +floortrap = IfcWasteTerminalTypeEnum.FLOORTRAP +floorwaste = IfcWasteTerminalTypeEnum.FLOORWASTE +gullysump = IfcWasteTerminalTypeEnum.GULLYSUMP +gullytrap = IfcWasteTerminalTypeEnum.GULLYTRAP +roofdrain = IfcWasteTerminalTypeEnum.ROOFDRAIN +wastedisposalunit = IfcWasteTerminalTypeEnum.WASTEDISPOSALUNIT +wastetrap = IfcWasteTerminalTypeEnum.WASTETRAP +userdefined = IfcWasteTerminalTypeEnum.USERDEFINED +notdefined = IfcWasteTerminalTypeEnum.NOTDEFINED IfcWindowPanelOperationEnum = enum_namespace() -bottomhung = express_getattr(IfcWindowPanelOperationEnum, 'BOTTOMHUNG', INDETERMINATE) -fixedcasement = express_getattr(IfcWindowPanelOperationEnum, 'FIXEDCASEMENT', INDETERMINATE) -otheroperation = express_getattr(IfcWindowPanelOperationEnum, 'OTHEROPERATION', INDETERMINATE) -pivothorizontal = express_getattr(IfcWindowPanelOperationEnum, 'PIVOTHORIZONTAL', INDETERMINATE) -pivotvertical = express_getattr(IfcWindowPanelOperationEnum, 'PIVOTVERTICAL', INDETERMINATE) -removablecasement = express_getattr(IfcWindowPanelOperationEnum, 'REMOVABLECASEMENT', INDETERMINATE) -sidehunglefthand = express_getattr(IfcWindowPanelOperationEnum, 'SIDEHUNGLEFTHAND', INDETERMINATE) -sidehungrighthand = express_getattr(IfcWindowPanelOperationEnum, 'SIDEHUNGRIGHTHAND', INDETERMINATE) -slidinghorizontal = express_getattr(IfcWindowPanelOperationEnum, 'SLIDINGHORIZONTAL', INDETERMINATE) -slidingvertical = express_getattr(IfcWindowPanelOperationEnum, 'SLIDINGVERTICAL', INDETERMINATE) -tiltandturnlefthand = express_getattr(IfcWindowPanelOperationEnum, 'TILTANDTURNLEFTHAND', INDETERMINATE) -tiltandturnrighthand = express_getattr(IfcWindowPanelOperationEnum, 'TILTANDTURNRIGHTHAND', INDETERMINATE) -tophung = express_getattr(IfcWindowPanelOperationEnum, 'TOPHUNG', INDETERMINATE) -notdefined = express_getattr(IfcWindowPanelOperationEnum, 'NOTDEFINED', INDETERMINATE) +bottomhung = IfcWindowPanelOperationEnum.BOTTOMHUNG +fixedcasement = IfcWindowPanelOperationEnum.FIXEDCASEMENT +otheroperation = IfcWindowPanelOperationEnum.OTHEROPERATION +pivothorizontal = IfcWindowPanelOperationEnum.PIVOTHORIZONTAL +pivotvertical = IfcWindowPanelOperationEnum.PIVOTVERTICAL +removablecasement = IfcWindowPanelOperationEnum.REMOVABLECASEMENT +sidehunglefthand = IfcWindowPanelOperationEnum.SIDEHUNGLEFTHAND +sidehungrighthand = IfcWindowPanelOperationEnum.SIDEHUNGRIGHTHAND +slidinghorizontal = IfcWindowPanelOperationEnum.SLIDINGHORIZONTAL +slidingvertical = IfcWindowPanelOperationEnum.SLIDINGVERTICAL +tiltandturnlefthand = IfcWindowPanelOperationEnum.TILTANDTURNLEFTHAND +tiltandturnrighthand = IfcWindowPanelOperationEnum.TILTANDTURNRIGHTHAND +tophung = IfcWindowPanelOperationEnum.TOPHUNG +notdefined = IfcWindowPanelOperationEnum.NOTDEFINED IfcWindowPanelPositionEnum = enum_namespace() -bottom = express_getattr(IfcWindowPanelPositionEnum, 'BOTTOM', INDETERMINATE) -left = express_getattr(IfcWindowPanelPositionEnum, 'LEFT', INDETERMINATE) -middle = express_getattr(IfcWindowPanelPositionEnum, 'MIDDLE', INDETERMINATE) -right = express_getattr(IfcWindowPanelPositionEnum, 'RIGHT', INDETERMINATE) -top = express_getattr(IfcWindowPanelPositionEnum, 'TOP', INDETERMINATE) -notdefined = express_getattr(IfcWindowPanelPositionEnum, 'NOTDEFINED', INDETERMINATE) +bottom = IfcWindowPanelPositionEnum.BOTTOM +left = IfcWindowPanelPositionEnum.LEFT +middle = IfcWindowPanelPositionEnum.MIDDLE +right = IfcWindowPanelPositionEnum.RIGHT +top = IfcWindowPanelPositionEnum.TOP +notdefined = IfcWindowPanelPositionEnum.NOTDEFINED IfcWindowStyleConstructionEnum = enum_namespace() -aluminium = express_getattr(IfcWindowStyleConstructionEnum, 'ALUMINIUM', INDETERMINATE) -aluminium_wood = express_getattr(IfcWindowStyleConstructionEnum, 'ALUMINIUM_WOOD', INDETERMINATE) -high_grade_steel = express_getattr(IfcWindowStyleConstructionEnum, 'HIGH_GRADE_STEEL', INDETERMINATE) -other_construction = express_getattr(IfcWindowStyleConstructionEnum, 'OTHER_CONSTRUCTION', INDETERMINATE) -plastic = express_getattr(IfcWindowStyleConstructionEnum, 'PLASTIC', INDETERMINATE) -steel = express_getattr(IfcWindowStyleConstructionEnum, 'STEEL', INDETERMINATE) -wood = express_getattr(IfcWindowStyleConstructionEnum, 'WOOD', INDETERMINATE) -notdefined = express_getattr(IfcWindowStyleConstructionEnum, 'NOTDEFINED', INDETERMINATE) +aluminium = IfcWindowStyleConstructionEnum.ALUMINIUM +aluminium_wood = IfcWindowStyleConstructionEnum.ALUMINIUM_WOOD +high_grade_steel = IfcWindowStyleConstructionEnum.HIGH_GRADE_STEEL +other_construction = IfcWindowStyleConstructionEnum.OTHER_CONSTRUCTION +plastic = IfcWindowStyleConstructionEnum.PLASTIC +steel = IfcWindowStyleConstructionEnum.STEEL +wood = IfcWindowStyleConstructionEnum.WOOD +notdefined = IfcWindowStyleConstructionEnum.NOTDEFINED IfcWindowStyleOperationEnum = enum_namespace() -double_panel_horizontal = express_getattr(IfcWindowStyleOperationEnum, 'DOUBLE_PANEL_HORIZONTAL', INDETERMINATE) -double_panel_vertical = express_getattr(IfcWindowStyleOperationEnum, 'DOUBLE_PANEL_VERTICAL', INDETERMINATE) -single_panel = express_getattr(IfcWindowStyleOperationEnum, 'SINGLE_PANEL', INDETERMINATE) -triple_panel_bottom = express_getattr(IfcWindowStyleOperationEnum, 'TRIPLE_PANEL_BOTTOM', INDETERMINATE) -triple_panel_horizontal = express_getattr(IfcWindowStyleOperationEnum, 'TRIPLE_PANEL_HORIZONTAL', INDETERMINATE) -triple_panel_left = express_getattr(IfcWindowStyleOperationEnum, 'TRIPLE_PANEL_LEFT', INDETERMINATE) -triple_panel_right = express_getattr(IfcWindowStyleOperationEnum, 'TRIPLE_PANEL_RIGHT', INDETERMINATE) -triple_panel_top = express_getattr(IfcWindowStyleOperationEnum, 'TRIPLE_PANEL_TOP', INDETERMINATE) -triple_panel_vertical = express_getattr(IfcWindowStyleOperationEnum, 'TRIPLE_PANEL_VERTICAL', INDETERMINATE) -userdefined = express_getattr(IfcWindowStyleOperationEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcWindowStyleOperationEnum, 'NOTDEFINED', INDETERMINATE) +double_panel_horizontal = IfcWindowStyleOperationEnum.DOUBLE_PANEL_HORIZONTAL +double_panel_vertical = IfcWindowStyleOperationEnum.DOUBLE_PANEL_VERTICAL +single_panel = IfcWindowStyleOperationEnum.SINGLE_PANEL +triple_panel_bottom = IfcWindowStyleOperationEnum.TRIPLE_PANEL_BOTTOM +triple_panel_horizontal = IfcWindowStyleOperationEnum.TRIPLE_PANEL_HORIZONTAL +triple_panel_left = IfcWindowStyleOperationEnum.TRIPLE_PANEL_LEFT +triple_panel_right = IfcWindowStyleOperationEnum.TRIPLE_PANEL_RIGHT +triple_panel_top = IfcWindowStyleOperationEnum.TRIPLE_PANEL_TOP +triple_panel_vertical = IfcWindowStyleOperationEnum.TRIPLE_PANEL_VERTICAL +userdefined = IfcWindowStyleOperationEnum.USERDEFINED +notdefined = IfcWindowStyleOperationEnum.NOTDEFINED IfcWindowTypeEnum = enum_namespace() -lightdome = express_getattr(IfcWindowTypeEnum, 'LIGHTDOME', INDETERMINATE) -skylight = express_getattr(IfcWindowTypeEnum, 'SKYLIGHT', INDETERMINATE) -window = express_getattr(IfcWindowTypeEnum, 'WINDOW', INDETERMINATE) -userdefined = express_getattr(IfcWindowTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcWindowTypeEnum, 'NOTDEFINED', INDETERMINATE) +lightdome = IfcWindowTypeEnum.LIGHTDOME +skylight = IfcWindowTypeEnum.SKYLIGHT +window = IfcWindowTypeEnum.WINDOW +userdefined = IfcWindowTypeEnum.USERDEFINED +notdefined = IfcWindowTypeEnum.NOTDEFINED IfcWindowTypePartitioningEnum = enum_namespace() -double_panel_horizontal = express_getattr(IfcWindowTypePartitioningEnum, 'DOUBLE_PANEL_HORIZONTAL', INDETERMINATE) -double_panel_vertical = express_getattr(IfcWindowTypePartitioningEnum, 'DOUBLE_PANEL_VERTICAL', INDETERMINATE) -single_panel = express_getattr(IfcWindowTypePartitioningEnum, 'SINGLE_PANEL', INDETERMINATE) -triple_panel_bottom = express_getattr(IfcWindowTypePartitioningEnum, 'TRIPLE_PANEL_BOTTOM', INDETERMINATE) -triple_panel_horizontal = express_getattr(IfcWindowTypePartitioningEnum, 'TRIPLE_PANEL_HORIZONTAL', INDETERMINATE) -triple_panel_left = express_getattr(IfcWindowTypePartitioningEnum, 'TRIPLE_PANEL_LEFT', INDETERMINATE) -triple_panel_right = express_getattr(IfcWindowTypePartitioningEnum, 'TRIPLE_PANEL_RIGHT', INDETERMINATE) -triple_panel_top = express_getattr(IfcWindowTypePartitioningEnum, 'TRIPLE_PANEL_TOP', INDETERMINATE) -triple_panel_vertical = express_getattr(IfcWindowTypePartitioningEnum, 'TRIPLE_PANEL_VERTICAL', INDETERMINATE) -userdefined = express_getattr(IfcWindowTypePartitioningEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcWindowTypePartitioningEnum, 'NOTDEFINED', INDETERMINATE) +double_panel_horizontal = IfcWindowTypePartitioningEnum.DOUBLE_PANEL_HORIZONTAL +double_panel_vertical = IfcWindowTypePartitioningEnum.DOUBLE_PANEL_VERTICAL +single_panel = IfcWindowTypePartitioningEnum.SINGLE_PANEL +triple_panel_bottom = IfcWindowTypePartitioningEnum.TRIPLE_PANEL_BOTTOM +triple_panel_horizontal = IfcWindowTypePartitioningEnum.TRIPLE_PANEL_HORIZONTAL +triple_panel_left = IfcWindowTypePartitioningEnum.TRIPLE_PANEL_LEFT +triple_panel_right = IfcWindowTypePartitioningEnum.TRIPLE_PANEL_RIGHT +triple_panel_top = IfcWindowTypePartitioningEnum.TRIPLE_PANEL_TOP +triple_panel_vertical = IfcWindowTypePartitioningEnum.TRIPLE_PANEL_VERTICAL +userdefined = IfcWindowTypePartitioningEnum.USERDEFINED +notdefined = IfcWindowTypePartitioningEnum.NOTDEFINED IfcWorkCalendarTypeEnum = enum_namespace() -firstshift = express_getattr(IfcWorkCalendarTypeEnum, 'FIRSTSHIFT', INDETERMINATE) -secondshift = express_getattr(IfcWorkCalendarTypeEnum, 'SECONDSHIFT', INDETERMINATE) -thirdshift = express_getattr(IfcWorkCalendarTypeEnum, 'THIRDSHIFT', INDETERMINATE) -userdefined = express_getattr(IfcWorkCalendarTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcWorkCalendarTypeEnum, 'NOTDEFINED', INDETERMINATE) +firstshift = IfcWorkCalendarTypeEnum.FIRSTSHIFT +secondshift = IfcWorkCalendarTypeEnum.SECONDSHIFT +thirdshift = IfcWorkCalendarTypeEnum.THIRDSHIFT +userdefined = IfcWorkCalendarTypeEnum.USERDEFINED +notdefined = IfcWorkCalendarTypeEnum.NOTDEFINED IfcWorkPlanTypeEnum = enum_namespace() -actual = express_getattr(IfcWorkPlanTypeEnum, 'ACTUAL', INDETERMINATE) -baseline = express_getattr(IfcWorkPlanTypeEnum, 'BASELINE', INDETERMINATE) -planned = express_getattr(IfcWorkPlanTypeEnum, 'PLANNED', INDETERMINATE) -userdefined = express_getattr(IfcWorkPlanTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcWorkPlanTypeEnum, 'NOTDEFINED', INDETERMINATE) +actual = IfcWorkPlanTypeEnum.ACTUAL +baseline = IfcWorkPlanTypeEnum.BASELINE +planned = IfcWorkPlanTypeEnum.PLANNED +userdefined = IfcWorkPlanTypeEnum.USERDEFINED +notdefined = IfcWorkPlanTypeEnum.NOTDEFINED IfcWorkScheduleTypeEnum = enum_namespace() -actual = express_getattr(IfcWorkScheduleTypeEnum, 'ACTUAL', INDETERMINATE) -baseline = express_getattr(IfcWorkScheduleTypeEnum, 'BASELINE', INDETERMINATE) -planned = express_getattr(IfcWorkScheduleTypeEnum, 'PLANNED', INDETERMINATE) -userdefined = express_getattr(IfcWorkScheduleTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcWorkScheduleTypeEnum, 'NOTDEFINED', INDETERMINATE) +actual = IfcWorkScheduleTypeEnum.ACTUAL +baseline = IfcWorkScheduleTypeEnum.BASELINE +planned = IfcWorkScheduleTypeEnum.PLANNED +userdefined = IfcWorkScheduleTypeEnum.USERDEFINED +notdefined = IfcWorkScheduleTypeEnum.NOTDEFINED def IfcActionRequest(*args, **kwargs): return ifcopenshell.create_entity('IfcActionRequest', 'IFC4X3', *args, **kwargs) diff --git a/src/ifcopenshell-python/ifcopenshell/express/rules/IFC4X3_ADD1.py b/src/ifcopenshell-python/ifcopenshell/express/rules/IFC4X3_ADD1.py index 2fcbb1f7347..64f436782a0 100644 --- a/src/ifcopenshell-python/ifcopenshell/express/rules/IFC4X3_ADD1.py +++ b/src/ifcopenshell-python/ifcopenshell/express/rules/IFC4X3_ADD1.py @@ -1,5 +1,8 @@ import ifcopenshell +def is_indeterminate(v): + return v is None or type(v).__name__ == 'indeterminate_type' + def exists(v): if callable(v): try: @@ -7,10 +10,10 @@ def exists(v): except IndexError as e: return False else: - return v is not None + return not is_indeterminate(v) def nvl(v, default): - return v if v is not None else default + return v if not is_indeterminate(v) else default def is_entity(inst): if isinstance(inst, ifcopenshell.entity_instance): @@ -22,13 +25,13 @@ def is_entity(inst): def express_len(v): if isinstance(v, ifcopenshell.entity_instance) and (not is_entity(v)): v = v[0] - elif v is None or v is INDETERMINATE: + elif is_indeterminate(v): return INDETERMINATE return len(v) old_range = range def range(*args): - if INDETERMINATE in args: + if any(map(is_indeterminate, args)): return yield from old_range(*args) sizeof = express_len @@ -149,2361 +152,2361 @@ class enum_namespace: def __getattr__(self, k): return express_getattr(k, 'upper', INDETERMINATE)() IfcActionRequestTypeEnum = enum_namespace() -email = express_getattr(IfcActionRequestTypeEnum, 'EMAIL', INDETERMINATE) -fax = express_getattr(IfcActionRequestTypeEnum, 'FAX', INDETERMINATE) -phone = express_getattr(IfcActionRequestTypeEnum, 'PHONE', INDETERMINATE) -post = express_getattr(IfcActionRequestTypeEnum, 'POST', INDETERMINATE) -verbal = express_getattr(IfcActionRequestTypeEnum, 'VERBAL', INDETERMINATE) -userdefined = express_getattr(IfcActionRequestTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcActionRequestTypeEnum, 'NOTDEFINED', INDETERMINATE) +email = IfcActionRequestTypeEnum.EMAIL +fax = IfcActionRequestTypeEnum.FAX +phone = IfcActionRequestTypeEnum.PHONE +post = IfcActionRequestTypeEnum.POST +verbal = IfcActionRequestTypeEnum.VERBAL +userdefined = IfcActionRequestTypeEnum.USERDEFINED +notdefined = IfcActionRequestTypeEnum.NOTDEFINED IfcActionSourceTypeEnum = enum_namespace() -brakes = express_getattr(IfcActionSourceTypeEnum, 'BRAKES', INDETERMINATE) -buoyancy = express_getattr(IfcActionSourceTypeEnum, 'BUOYANCY', INDETERMINATE) -completion_g1 = express_getattr(IfcActionSourceTypeEnum, 'COMPLETION_G1', INDETERMINATE) -creep = express_getattr(IfcActionSourceTypeEnum, 'CREEP', INDETERMINATE) -current = express_getattr(IfcActionSourceTypeEnum, 'CURRENT', INDETERMINATE) -dead_load_g = express_getattr(IfcActionSourceTypeEnum, 'DEAD_LOAD_G', INDETERMINATE) -earthquake_e = express_getattr(IfcActionSourceTypeEnum, 'EARTHQUAKE_E', INDETERMINATE) -erection = express_getattr(IfcActionSourceTypeEnum, 'ERECTION', INDETERMINATE) -fire = express_getattr(IfcActionSourceTypeEnum, 'FIRE', INDETERMINATE) -ice = express_getattr(IfcActionSourceTypeEnum, 'ICE', INDETERMINATE) -impact = express_getattr(IfcActionSourceTypeEnum, 'IMPACT', INDETERMINATE) -impulse = express_getattr(IfcActionSourceTypeEnum, 'IMPULSE', INDETERMINATE) -lack_of_fit = express_getattr(IfcActionSourceTypeEnum, 'LACK_OF_FIT', INDETERMINATE) -live_load_q = express_getattr(IfcActionSourceTypeEnum, 'LIVE_LOAD_Q', INDETERMINATE) -prestressing_p = express_getattr(IfcActionSourceTypeEnum, 'PRESTRESSING_P', INDETERMINATE) -propping = express_getattr(IfcActionSourceTypeEnum, 'PROPPING', INDETERMINATE) -rain = express_getattr(IfcActionSourceTypeEnum, 'RAIN', INDETERMINATE) -settlement_u = express_getattr(IfcActionSourceTypeEnum, 'SETTLEMENT_U', INDETERMINATE) -shrinkage = express_getattr(IfcActionSourceTypeEnum, 'SHRINKAGE', INDETERMINATE) -snow_s = express_getattr(IfcActionSourceTypeEnum, 'SNOW_S', INDETERMINATE) -system_imperfection = express_getattr(IfcActionSourceTypeEnum, 'SYSTEM_IMPERFECTION', INDETERMINATE) -temperature_t = express_getattr(IfcActionSourceTypeEnum, 'TEMPERATURE_T', INDETERMINATE) -transport = express_getattr(IfcActionSourceTypeEnum, 'TRANSPORT', INDETERMINATE) -wave = express_getattr(IfcActionSourceTypeEnum, 'WAVE', INDETERMINATE) -wind_w = express_getattr(IfcActionSourceTypeEnum, 'WIND_W', INDETERMINATE) -userdefined = express_getattr(IfcActionSourceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcActionSourceTypeEnum, 'NOTDEFINED', INDETERMINATE) +brakes = IfcActionSourceTypeEnum.BRAKES +buoyancy = IfcActionSourceTypeEnum.BUOYANCY +completion_g1 = IfcActionSourceTypeEnum.COMPLETION_G1 +creep = IfcActionSourceTypeEnum.CREEP +current = IfcActionSourceTypeEnum.CURRENT +dead_load_g = IfcActionSourceTypeEnum.DEAD_LOAD_G +earthquake_e = IfcActionSourceTypeEnum.EARTHQUAKE_E +erection = IfcActionSourceTypeEnum.ERECTION +fire = IfcActionSourceTypeEnum.FIRE +ice = IfcActionSourceTypeEnum.ICE +impact = IfcActionSourceTypeEnum.IMPACT +impulse = IfcActionSourceTypeEnum.IMPULSE +lack_of_fit = IfcActionSourceTypeEnum.LACK_OF_FIT +live_load_q = IfcActionSourceTypeEnum.LIVE_LOAD_Q +prestressing_p = IfcActionSourceTypeEnum.PRESTRESSING_P +propping = IfcActionSourceTypeEnum.PROPPING +rain = IfcActionSourceTypeEnum.RAIN +settlement_u = IfcActionSourceTypeEnum.SETTLEMENT_U +shrinkage = IfcActionSourceTypeEnum.SHRINKAGE +snow_s = IfcActionSourceTypeEnum.SNOW_S +system_imperfection = IfcActionSourceTypeEnum.SYSTEM_IMPERFECTION +temperature_t = IfcActionSourceTypeEnum.TEMPERATURE_T +transport = IfcActionSourceTypeEnum.TRANSPORT +wave = IfcActionSourceTypeEnum.WAVE +wind_w = IfcActionSourceTypeEnum.WIND_W +userdefined = IfcActionSourceTypeEnum.USERDEFINED +notdefined = IfcActionSourceTypeEnum.NOTDEFINED IfcActionTypeEnum = enum_namespace() -extraordinary_a = express_getattr(IfcActionTypeEnum, 'EXTRAORDINARY_A', INDETERMINATE) -permanent_g = express_getattr(IfcActionTypeEnum, 'PERMANENT_G', INDETERMINATE) -variable_q = express_getattr(IfcActionTypeEnum, 'VARIABLE_Q', INDETERMINATE) -userdefined = express_getattr(IfcActionTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcActionTypeEnum, 'NOTDEFINED', INDETERMINATE) +extraordinary_a = IfcActionTypeEnum.EXTRAORDINARY_A +permanent_g = IfcActionTypeEnum.PERMANENT_G +variable_q = IfcActionTypeEnum.VARIABLE_Q +userdefined = IfcActionTypeEnum.USERDEFINED +notdefined = IfcActionTypeEnum.NOTDEFINED IfcActuatorTypeEnum = enum_namespace() -electricactuator = express_getattr(IfcActuatorTypeEnum, 'ELECTRICACTUATOR', INDETERMINATE) -handoperatedactuator = express_getattr(IfcActuatorTypeEnum, 'HANDOPERATEDACTUATOR', INDETERMINATE) -hydraulicactuator = express_getattr(IfcActuatorTypeEnum, 'HYDRAULICACTUATOR', INDETERMINATE) -pneumaticactuator = express_getattr(IfcActuatorTypeEnum, 'PNEUMATICACTUATOR', INDETERMINATE) -thermostaticactuator = express_getattr(IfcActuatorTypeEnum, 'THERMOSTATICACTUATOR', INDETERMINATE) -userdefined = express_getattr(IfcActuatorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcActuatorTypeEnum, 'NOTDEFINED', INDETERMINATE) +electricactuator = IfcActuatorTypeEnum.ELECTRICACTUATOR +handoperatedactuator = IfcActuatorTypeEnum.HANDOPERATEDACTUATOR +hydraulicactuator = IfcActuatorTypeEnum.HYDRAULICACTUATOR +pneumaticactuator = IfcActuatorTypeEnum.PNEUMATICACTUATOR +thermostaticactuator = IfcActuatorTypeEnum.THERMOSTATICACTUATOR +userdefined = IfcActuatorTypeEnum.USERDEFINED +notdefined = IfcActuatorTypeEnum.NOTDEFINED IfcAddressTypeEnum = enum_namespace() -distributionpoint = express_getattr(IfcAddressTypeEnum, 'DISTRIBUTIONPOINT', INDETERMINATE) -home = express_getattr(IfcAddressTypeEnum, 'HOME', INDETERMINATE) -office = express_getattr(IfcAddressTypeEnum, 'OFFICE', INDETERMINATE) -site = express_getattr(IfcAddressTypeEnum, 'SITE', INDETERMINATE) -userdefined = express_getattr(IfcAddressTypeEnum, 'USERDEFINED', INDETERMINATE) +distributionpoint = IfcAddressTypeEnum.DISTRIBUTIONPOINT +home = IfcAddressTypeEnum.HOME +office = IfcAddressTypeEnum.OFFICE +site = IfcAddressTypeEnum.SITE +userdefined = IfcAddressTypeEnum.USERDEFINED IfcAirTerminalBoxTypeEnum = enum_namespace() -constantflow = express_getattr(IfcAirTerminalBoxTypeEnum, 'CONSTANTFLOW', INDETERMINATE) -variableflowpressuredependant = express_getattr(IfcAirTerminalBoxTypeEnum, 'VARIABLEFLOWPRESSUREDEPENDANT', INDETERMINATE) -variableflowpressureindependant = express_getattr(IfcAirTerminalBoxTypeEnum, 'VARIABLEFLOWPRESSUREINDEPENDANT', INDETERMINATE) -userdefined = express_getattr(IfcAirTerminalBoxTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAirTerminalBoxTypeEnum, 'NOTDEFINED', INDETERMINATE) +constantflow = IfcAirTerminalBoxTypeEnum.CONSTANTFLOW +variableflowpressuredependant = IfcAirTerminalBoxTypeEnum.VARIABLEFLOWPRESSUREDEPENDANT +variableflowpressureindependant = IfcAirTerminalBoxTypeEnum.VARIABLEFLOWPRESSUREINDEPENDANT +userdefined = IfcAirTerminalBoxTypeEnum.USERDEFINED +notdefined = IfcAirTerminalBoxTypeEnum.NOTDEFINED IfcAirTerminalTypeEnum = enum_namespace() -diffuser = express_getattr(IfcAirTerminalTypeEnum, 'DIFFUSER', INDETERMINATE) -grille = express_getattr(IfcAirTerminalTypeEnum, 'GRILLE', INDETERMINATE) -louvre = express_getattr(IfcAirTerminalTypeEnum, 'LOUVRE', INDETERMINATE) -register = express_getattr(IfcAirTerminalTypeEnum, 'REGISTER', INDETERMINATE) -userdefined = express_getattr(IfcAirTerminalTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAirTerminalTypeEnum, 'NOTDEFINED', INDETERMINATE) +diffuser = IfcAirTerminalTypeEnum.DIFFUSER +grille = IfcAirTerminalTypeEnum.GRILLE +louvre = IfcAirTerminalTypeEnum.LOUVRE +register = IfcAirTerminalTypeEnum.REGISTER +userdefined = IfcAirTerminalTypeEnum.USERDEFINED +notdefined = IfcAirTerminalTypeEnum.NOTDEFINED IfcAirToAirHeatRecoveryTypeEnum = enum_namespace() -fixedplatecounterflowexchanger = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'FIXEDPLATECOUNTERFLOWEXCHANGER', INDETERMINATE) -fixedplatecrossflowexchanger = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'FIXEDPLATECROSSFLOWEXCHANGER', INDETERMINATE) -fixedplateparallelflowexchanger = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'FIXEDPLATEPARALLELFLOWEXCHANGER', INDETERMINATE) -heatpipe = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'HEATPIPE', INDETERMINATE) -rotarywheel = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'ROTARYWHEEL', INDETERMINATE) -runaroundcoilloop = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'RUNAROUNDCOILLOOP', INDETERMINATE) -thermosiphoncoiltypeheatexchangers = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'THERMOSIPHONCOILTYPEHEATEXCHANGERS', INDETERMINATE) -thermosiphonsealedtubeheatexchangers = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'THERMOSIPHONSEALEDTUBEHEATEXCHANGERS', INDETERMINATE) -twintowerenthalpyrecoveryloops = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'TWINTOWERENTHALPYRECOVERYLOOPS', INDETERMINATE) -userdefined = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'NOTDEFINED', INDETERMINATE) +fixedplatecounterflowexchanger = IfcAirToAirHeatRecoveryTypeEnum.FIXEDPLATECOUNTERFLOWEXCHANGER +fixedplatecrossflowexchanger = IfcAirToAirHeatRecoveryTypeEnum.FIXEDPLATECROSSFLOWEXCHANGER +fixedplateparallelflowexchanger = IfcAirToAirHeatRecoveryTypeEnum.FIXEDPLATEPARALLELFLOWEXCHANGER +heatpipe = IfcAirToAirHeatRecoveryTypeEnum.HEATPIPE +rotarywheel = IfcAirToAirHeatRecoveryTypeEnum.ROTARYWHEEL +runaroundcoilloop = IfcAirToAirHeatRecoveryTypeEnum.RUNAROUNDCOILLOOP +thermosiphoncoiltypeheatexchangers = IfcAirToAirHeatRecoveryTypeEnum.THERMOSIPHONCOILTYPEHEATEXCHANGERS +thermosiphonsealedtubeheatexchangers = IfcAirToAirHeatRecoveryTypeEnum.THERMOSIPHONSEALEDTUBEHEATEXCHANGERS +twintowerenthalpyrecoveryloops = IfcAirToAirHeatRecoveryTypeEnum.TWINTOWERENTHALPYRECOVERYLOOPS +userdefined = IfcAirToAirHeatRecoveryTypeEnum.USERDEFINED +notdefined = IfcAirToAirHeatRecoveryTypeEnum.NOTDEFINED IfcAlarmTypeEnum = enum_namespace() -bell = express_getattr(IfcAlarmTypeEnum, 'BELL', INDETERMINATE) -breakglassbutton = express_getattr(IfcAlarmTypeEnum, 'BREAKGLASSBUTTON', INDETERMINATE) -light = express_getattr(IfcAlarmTypeEnum, 'LIGHT', INDETERMINATE) -manualpullbox = express_getattr(IfcAlarmTypeEnum, 'MANUALPULLBOX', INDETERMINATE) -railwaycrocodile = express_getattr(IfcAlarmTypeEnum, 'RAILWAYCROCODILE', INDETERMINATE) -railwaydetonator = express_getattr(IfcAlarmTypeEnum, 'RAILWAYDETONATOR', INDETERMINATE) -siren = express_getattr(IfcAlarmTypeEnum, 'SIREN', INDETERMINATE) -whistle = express_getattr(IfcAlarmTypeEnum, 'WHISTLE', INDETERMINATE) -userdefined = express_getattr(IfcAlarmTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAlarmTypeEnum, 'NOTDEFINED', INDETERMINATE) +bell = IfcAlarmTypeEnum.BELL +breakglassbutton = IfcAlarmTypeEnum.BREAKGLASSBUTTON +light = IfcAlarmTypeEnum.LIGHT +manualpullbox = IfcAlarmTypeEnum.MANUALPULLBOX +railwaycrocodile = IfcAlarmTypeEnum.RAILWAYCROCODILE +railwaydetonator = IfcAlarmTypeEnum.RAILWAYDETONATOR +siren = IfcAlarmTypeEnum.SIREN +whistle = IfcAlarmTypeEnum.WHISTLE +userdefined = IfcAlarmTypeEnum.USERDEFINED +notdefined = IfcAlarmTypeEnum.NOTDEFINED IfcAlignmentCantSegmentTypeEnum = enum_namespace() -blosscurve = express_getattr(IfcAlignmentCantSegmentTypeEnum, 'BLOSSCURVE', INDETERMINATE) -constantcant = express_getattr(IfcAlignmentCantSegmentTypeEnum, 'CONSTANTCANT', INDETERMINATE) -cosinecurve = express_getattr(IfcAlignmentCantSegmentTypeEnum, 'COSINECURVE', INDETERMINATE) -helmertcurve = express_getattr(IfcAlignmentCantSegmentTypeEnum, 'HELMERTCURVE', INDETERMINATE) -lineartransition = express_getattr(IfcAlignmentCantSegmentTypeEnum, 'LINEARTRANSITION', INDETERMINATE) -sinecurve = express_getattr(IfcAlignmentCantSegmentTypeEnum, 'SINECURVE', INDETERMINATE) -viennesebend = express_getattr(IfcAlignmentCantSegmentTypeEnum, 'VIENNESEBEND', INDETERMINATE) +blosscurve = IfcAlignmentCantSegmentTypeEnum.BLOSSCURVE +constantcant = IfcAlignmentCantSegmentTypeEnum.CONSTANTCANT +cosinecurve = IfcAlignmentCantSegmentTypeEnum.COSINECURVE +helmertcurve = IfcAlignmentCantSegmentTypeEnum.HELMERTCURVE +lineartransition = IfcAlignmentCantSegmentTypeEnum.LINEARTRANSITION +sinecurve = IfcAlignmentCantSegmentTypeEnum.SINECURVE +viennesebend = IfcAlignmentCantSegmentTypeEnum.VIENNESEBEND IfcAlignmentHorizontalSegmentTypeEnum = enum_namespace() -blosscurve = express_getattr(IfcAlignmentHorizontalSegmentTypeEnum, 'BLOSSCURVE', INDETERMINATE) -circulararc = express_getattr(IfcAlignmentHorizontalSegmentTypeEnum, 'CIRCULARARC', INDETERMINATE) -clothoid = express_getattr(IfcAlignmentHorizontalSegmentTypeEnum, 'CLOTHOID', INDETERMINATE) -cosinecurve = express_getattr(IfcAlignmentHorizontalSegmentTypeEnum, 'COSINECURVE', INDETERMINATE) -cubic = express_getattr(IfcAlignmentHorizontalSegmentTypeEnum, 'CUBIC', INDETERMINATE) -helmertcurve = express_getattr(IfcAlignmentHorizontalSegmentTypeEnum, 'HELMERTCURVE', INDETERMINATE) -line = express_getattr(IfcAlignmentHorizontalSegmentTypeEnum, 'LINE', INDETERMINATE) -sinecurve = express_getattr(IfcAlignmentHorizontalSegmentTypeEnum, 'SINECURVE', INDETERMINATE) -viennesebend = express_getattr(IfcAlignmentHorizontalSegmentTypeEnum, 'VIENNESEBEND', INDETERMINATE) +blosscurve = IfcAlignmentHorizontalSegmentTypeEnum.BLOSSCURVE +circulararc = IfcAlignmentHorizontalSegmentTypeEnum.CIRCULARARC +clothoid = IfcAlignmentHorizontalSegmentTypeEnum.CLOTHOID +cosinecurve = IfcAlignmentHorizontalSegmentTypeEnum.COSINECURVE +cubic = IfcAlignmentHorizontalSegmentTypeEnum.CUBIC +helmertcurve = IfcAlignmentHorizontalSegmentTypeEnum.HELMERTCURVE +line = IfcAlignmentHorizontalSegmentTypeEnum.LINE +sinecurve = IfcAlignmentHorizontalSegmentTypeEnum.SINECURVE +viennesebend = IfcAlignmentHorizontalSegmentTypeEnum.VIENNESEBEND IfcAlignmentTypeEnum = enum_namespace() -userdefined = express_getattr(IfcAlignmentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAlignmentTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcAlignmentTypeEnum.USERDEFINED +notdefined = IfcAlignmentTypeEnum.NOTDEFINED IfcAlignmentVerticalSegmentTypeEnum = enum_namespace() -circulararc = express_getattr(IfcAlignmentVerticalSegmentTypeEnum, 'CIRCULARARC', INDETERMINATE) -clothoid = express_getattr(IfcAlignmentVerticalSegmentTypeEnum, 'CLOTHOID', INDETERMINATE) -constantgradient = express_getattr(IfcAlignmentVerticalSegmentTypeEnum, 'CONSTANTGRADIENT', INDETERMINATE) -parabolicarc = express_getattr(IfcAlignmentVerticalSegmentTypeEnum, 'PARABOLICARC', INDETERMINATE) +circulararc = IfcAlignmentVerticalSegmentTypeEnum.CIRCULARARC +clothoid = IfcAlignmentVerticalSegmentTypeEnum.CLOTHOID +constantgradient = IfcAlignmentVerticalSegmentTypeEnum.CONSTANTGRADIENT +parabolicarc = IfcAlignmentVerticalSegmentTypeEnum.PARABOLICARC IfcAnalysisModelTypeEnum = enum_namespace() -in_plane_loading_2d = express_getattr(IfcAnalysisModelTypeEnum, 'IN_PLANE_LOADING_2D', INDETERMINATE) -loading_3d = express_getattr(IfcAnalysisModelTypeEnum, 'LOADING_3D', INDETERMINATE) -out_plane_loading_2d = express_getattr(IfcAnalysisModelTypeEnum, 'OUT_PLANE_LOADING_2D', INDETERMINATE) -userdefined = express_getattr(IfcAnalysisModelTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAnalysisModelTypeEnum, 'NOTDEFINED', INDETERMINATE) +in_plane_loading_2d = IfcAnalysisModelTypeEnum.IN_PLANE_LOADING_2D +loading_3d = IfcAnalysisModelTypeEnum.LOADING_3D +out_plane_loading_2d = IfcAnalysisModelTypeEnum.OUT_PLANE_LOADING_2D +userdefined = IfcAnalysisModelTypeEnum.USERDEFINED +notdefined = IfcAnalysisModelTypeEnum.NOTDEFINED IfcAnalysisTheoryTypeEnum = enum_namespace() -first_order_theory = express_getattr(IfcAnalysisTheoryTypeEnum, 'FIRST_ORDER_THEORY', INDETERMINATE) -full_nonlinear_theory = express_getattr(IfcAnalysisTheoryTypeEnum, 'FULL_NONLINEAR_THEORY', INDETERMINATE) -second_order_theory = express_getattr(IfcAnalysisTheoryTypeEnum, 'SECOND_ORDER_THEORY', INDETERMINATE) -third_order_theory = express_getattr(IfcAnalysisTheoryTypeEnum, 'THIRD_ORDER_THEORY', INDETERMINATE) -userdefined = express_getattr(IfcAnalysisTheoryTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAnalysisTheoryTypeEnum, 'NOTDEFINED', INDETERMINATE) +first_order_theory = IfcAnalysisTheoryTypeEnum.FIRST_ORDER_THEORY +full_nonlinear_theory = IfcAnalysisTheoryTypeEnum.FULL_NONLINEAR_THEORY +second_order_theory = IfcAnalysisTheoryTypeEnum.SECOND_ORDER_THEORY +third_order_theory = IfcAnalysisTheoryTypeEnum.THIRD_ORDER_THEORY +userdefined = IfcAnalysisTheoryTypeEnum.USERDEFINED +notdefined = IfcAnalysisTheoryTypeEnum.NOTDEFINED IfcAnnotationTypeEnum = enum_namespace() -asbuiltarea = express_getattr(IfcAnnotationTypeEnum, 'ASBUILTAREA', INDETERMINATE) -asbuiltline = express_getattr(IfcAnnotationTypeEnum, 'ASBUILTLINE', INDETERMINATE) -asbuiltpoint = express_getattr(IfcAnnotationTypeEnum, 'ASBUILTPOINT', INDETERMINATE) -assumedarea = express_getattr(IfcAnnotationTypeEnum, 'ASSUMEDAREA', INDETERMINATE) -assumedline = express_getattr(IfcAnnotationTypeEnum, 'ASSUMEDLINE', INDETERMINATE) -assumedpoint = express_getattr(IfcAnnotationTypeEnum, 'ASSUMEDPOINT', INDETERMINATE) -non_physical_signal = express_getattr(IfcAnnotationTypeEnum, 'NON_PHYSICAL_SIGNAL', INDETERMINATE) -superelevationevent = express_getattr(IfcAnnotationTypeEnum, 'SUPERELEVATIONEVENT', INDETERMINATE) -widthevent = express_getattr(IfcAnnotationTypeEnum, 'WIDTHEVENT', INDETERMINATE) -userdefined = express_getattr(IfcAnnotationTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAnnotationTypeEnum, 'NOTDEFINED', INDETERMINATE) +asbuiltarea = IfcAnnotationTypeEnum.ASBUILTAREA +asbuiltline = IfcAnnotationTypeEnum.ASBUILTLINE +asbuiltpoint = IfcAnnotationTypeEnum.ASBUILTPOINT +assumedarea = IfcAnnotationTypeEnum.ASSUMEDAREA +assumedline = IfcAnnotationTypeEnum.ASSUMEDLINE +assumedpoint = IfcAnnotationTypeEnum.ASSUMEDPOINT +non_physical_signal = IfcAnnotationTypeEnum.NON_PHYSICAL_SIGNAL +superelevationevent = IfcAnnotationTypeEnum.SUPERELEVATIONEVENT +widthevent = IfcAnnotationTypeEnum.WIDTHEVENT +userdefined = IfcAnnotationTypeEnum.USERDEFINED +notdefined = IfcAnnotationTypeEnum.NOTDEFINED IfcArithmeticOperatorEnum = enum_namespace() -add = express_getattr(IfcArithmeticOperatorEnum, 'ADD', INDETERMINATE) -divide = express_getattr(IfcArithmeticOperatorEnum, 'DIVIDE', INDETERMINATE) -multiply = express_getattr(IfcArithmeticOperatorEnum, 'MULTIPLY', INDETERMINATE) -subtract = express_getattr(IfcArithmeticOperatorEnum, 'SUBTRACT', INDETERMINATE) +add = IfcArithmeticOperatorEnum.ADD +divide = IfcArithmeticOperatorEnum.DIVIDE +multiply = IfcArithmeticOperatorEnum.MULTIPLY +subtract = IfcArithmeticOperatorEnum.SUBTRACT IfcAssemblyPlaceEnum = enum_namespace() -factory = express_getattr(IfcAssemblyPlaceEnum, 'FACTORY', INDETERMINATE) -site = express_getattr(IfcAssemblyPlaceEnum, 'SITE', INDETERMINATE) -notdefined = express_getattr(IfcAssemblyPlaceEnum, 'NOTDEFINED', INDETERMINATE) +factory = IfcAssemblyPlaceEnum.FACTORY +site = IfcAssemblyPlaceEnum.SITE +notdefined = IfcAssemblyPlaceEnum.NOTDEFINED IfcAudioVisualApplianceTypeEnum = enum_namespace() -amplifier = express_getattr(IfcAudioVisualApplianceTypeEnum, 'AMPLIFIER', INDETERMINATE) -camera = express_getattr(IfcAudioVisualApplianceTypeEnum, 'CAMERA', INDETERMINATE) -communicationterminal = express_getattr(IfcAudioVisualApplianceTypeEnum, 'COMMUNICATIONTERMINAL', INDETERMINATE) -display = express_getattr(IfcAudioVisualApplianceTypeEnum, 'DISPLAY', INDETERMINATE) -microphone = express_getattr(IfcAudioVisualApplianceTypeEnum, 'MICROPHONE', INDETERMINATE) -player = express_getattr(IfcAudioVisualApplianceTypeEnum, 'PLAYER', INDETERMINATE) -projector = express_getattr(IfcAudioVisualApplianceTypeEnum, 'PROJECTOR', INDETERMINATE) -receiver = express_getattr(IfcAudioVisualApplianceTypeEnum, 'RECEIVER', INDETERMINATE) -recordingequipment = express_getattr(IfcAudioVisualApplianceTypeEnum, 'RECORDINGEQUIPMENT', INDETERMINATE) -speaker = express_getattr(IfcAudioVisualApplianceTypeEnum, 'SPEAKER', INDETERMINATE) -switcher = express_getattr(IfcAudioVisualApplianceTypeEnum, 'SWITCHER', INDETERMINATE) -telephone = express_getattr(IfcAudioVisualApplianceTypeEnum, 'TELEPHONE', INDETERMINATE) -tuner = express_getattr(IfcAudioVisualApplianceTypeEnum, 'TUNER', INDETERMINATE) -userdefined = express_getattr(IfcAudioVisualApplianceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAudioVisualApplianceTypeEnum, 'NOTDEFINED', INDETERMINATE) +amplifier = IfcAudioVisualApplianceTypeEnum.AMPLIFIER +camera = IfcAudioVisualApplianceTypeEnum.CAMERA +communicationterminal = IfcAudioVisualApplianceTypeEnum.COMMUNICATIONTERMINAL +display = IfcAudioVisualApplianceTypeEnum.DISPLAY +microphone = IfcAudioVisualApplianceTypeEnum.MICROPHONE +player = IfcAudioVisualApplianceTypeEnum.PLAYER +projector = IfcAudioVisualApplianceTypeEnum.PROJECTOR +receiver = IfcAudioVisualApplianceTypeEnum.RECEIVER +recordingequipment = IfcAudioVisualApplianceTypeEnum.RECORDINGEQUIPMENT +speaker = IfcAudioVisualApplianceTypeEnum.SPEAKER +switcher = IfcAudioVisualApplianceTypeEnum.SWITCHER +telephone = IfcAudioVisualApplianceTypeEnum.TELEPHONE +tuner = IfcAudioVisualApplianceTypeEnum.TUNER +userdefined = IfcAudioVisualApplianceTypeEnum.USERDEFINED +notdefined = IfcAudioVisualApplianceTypeEnum.NOTDEFINED IfcBSplineCurveForm = enum_namespace() -circular_arc = express_getattr(IfcBSplineCurveForm, 'CIRCULAR_ARC', INDETERMINATE) -elliptic_arc = express_getattr(IfcBSplineCurveForm, 'ELLIPTIC_ARC', INDETERMINATE) -hyperbolic_arc = express_getattr(IfcBSplineCurveForm, 'HYPERBOLIC_ARC', INDETERMINATE) -parabolic_arc = express_getattr(IfcBSplineCurveForm, 'PARABOLIC_ARC', INDETERMINATE) -polyline_form = express_getattr(IfcBSplineCurveForm, 'POLYLINE_FORM', INDETERMINATE) -unspecified = express_getattr(IfcBSplineCurveForm, 'UNSPECIFIED', INDETERMINATE) +circular_arc = IfcBSplineCurveForm.CIRCULAR_ARC +elliptic_arc = IfcBSplineCurveForm.ELLIPTIC_ARC +hyperbolic_arc = IfcBSplineCurveForm.HYPERBOLIC_ARC +parabolic_arc = IfcBSplineCurveForm.PARABOLIC_ARC +polyline_form = IfcBSplineCurveForm.POLYLINE_FORM +unspecified = IfcBSplineCurveForm.UNSPECIFIED IfcBSplineSurfaceForm = enum_namespace() -conical_surf = express_getattr(IfcBSplineSurfaceForm, 'CONICAL_SURF', INDETERMINATE) -cylindrical_surf = express_getattr(IfcBSplineSurfaceForm, 'CYLINDRICAL_SURF', INDETERMINATE) -generalised_cone = express_getattr(IfcBSplineSurfaceForm, 'GENERALISED_CONE', INDETERMINATE) -plane_surf = express_getattr(IfcBSplineSurfaceForm, 'PLANE_SURF', INDETERMINATE) -quadric_surf = express_getattr(IfcBSplineSurfaceForm, 'QUADRIC_SURF', INDETERMINATE) -ruled_surf = express_getattr(IfcBSplineSurfaceForm, 'RULED_SURF', INDETERMINATE) -spherical_surf = express_getattr(IfcBSplineSurfaceForm, 'SPHERICAL_SURF', INDETERMINATE) -surf_of_linear_extrusion = express_getattr(IfcBSplineSurfaceForm, 'SURF_OF_LINEAR_EXTRUSION', INDETERMINATE) -surf_of_revolution = express_getattr(IfcBSplineSurfaceForm, 'SURF_OF_REVOLUTION', INDETERMINATE) -toroidal_surf = express_getattr(IfcBSplineSurfaceForm, 'TOROIDAL_SURF', INDETERMINATE) -unspecified = express_getattr(IfcBSplineSurfaceForm, 'UNSPECIFIED', INDETERMINATE) +conical_surf = IfcBSplineSurfaceForm.CONICAL_SURF +cylindrical_surf = IfcBSplineSurfaceForm.CYLINDRICAL_SURF +generalised_cone = IfcBSplineSurfaceForm.GENERALISED_CONE +plane_surf = IfcBSplineSurfaceForm.PLANE_SURF +quadric_surf = IfcBSplineSurfaceForm.QUADRIC_SURF +ruled_surf = IfcBSplineSurfaceForm.RULED_SURF +spherical_surf = IfcBSplineSurfaceForm.SPHERICAL_SURF +surf_of_linear_extrusion = IfcBSplineSurfaceForm.SURF_OF_LINEAR_EXTRUSION +surf_of_revolution = IfcBSplineSurfaceForm.SURF_OF_REVOLUTION +toroidal_surf = IfcBSplineSurfaceForm.TOROIDAL_SURF +unspecified = IfcBSplineSurfaceForm.UNSPECIFIED IfcBeamTypeEnum = enum_namespace() -beam = express_getattr(IfcBeamTypeEnum, 'BEAM', INDETERMINATE) -cornice = express_getattr(IfcBeamTypeEnum, 'CORNICE', INDETERMINATE) -diaphragm = express_getattr(IfcBeamTypeEnum, 'DIAPHRAGM', INDETERMINATE) -edgebeam = express_getattr(IfcBeamTypeEnum, 'EDGEBEAM', INDETERMINATE) -girder_segment = express_getattr(IfcBeamTypeEnum, 'GIRDER_SEGMENT', INDETERMINATE) -hatstone = express_getattr(IfcBeamTypeEnum, 'HATSTONE', INDETERMINATE) -hollowcore = express_getattr(IfcBeamTypeEnum, 'HOLLOWCORE', INDETERMINATE) -joist = express_getattr(IfcBeamTypeEnum, 'JOIST', INDETERMINATE) -lintel = express_getattr(IfcBeamTypeEnum, 'LINTEL', INDETERMINATE) -piercap = express_getattr(IfcBeamTypeEnum, 'PIERCAP', INDETERMINATE) -spandrel = express_getattr(IfcBeamTypeEnum, 'SPANDREL', INDETERMINATE) -t_beam = express_getattr(IfcBeamTypeEnum, 'T_BEAM', INDETERMINATE) -userdefined = express_getattr(IfcBeamTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBeamTypeEnum, 'NOTDEFINED', INDETERMINATE) +beam = IfcBeamTypeEnum.BEAM +cornice = IfcBeamTypeEnum.CORNICE +diaphragm = IfcBeamTypeEnum.DIAPHRAGM +edgebeam = IfcBeamTypeEnum.EDGEBEAM +girder_segment = IfcBeamTypeEnum.GIRDER_SEGMENT +hatstone = IfcBeamTypeEnum.HATSTONE +hollowcore = IfcBeamTypeEnum.HOLLOWCORE +joist = IfcBeamTypeEnum.JOIST +lintel = IfcBeamTypeEnum.LINTEL +piercap = IfcBeamTypeEnum.PIERCAP +spandrel = IfcBeamTypeEnum.SPANDREL +t_beam = IfcBeamTypeEnum.T_BEAM +userdefined = IfcBeamTypeEnum.USERDEFINED +notdefined = IfcBeamTypeEnum.NOTDEFINED IfcBearingTypeEnum = enum_namespace() -cylindrical = express_getattr(IfcBearingTypeEnum, 'CYLINDRICAL', INDETERMINATE) -disk = express_getattr(IfcBearingTypeEnum, 'DISK', INDETERMINATE) -elastomeric = express_getattr(IfcBearingTypeEnum, 'ELASTOMERIC', INDETERMINATE) -guide = express_getattr(IfcBearingTypeEnum, 'GUIDE', INDETERMINATE) -pot = express_getattr(IfcBearingTypeEnum, 'POT', INDETERMINATE) -rocker = express_getattr(IfcBearingTypeEnum, 'ROCKER', INDETERMINATE) -roller = express_getattr(IfcBearingTypeEnum, 'ROLLER', INDETERMINATE) -spherical = express_getattr(IfcBearingTypeEnum, 'SPHERICAL', INDETERMINATE) -userdefined = express_getattr(IfcBearingTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBearingTypeEnum, 'NOTDEFINED', INDETERMINATE) +cylindrical = IfcBearingTypeEnum.CYLINDRICAL +disk = IfcBearingTypeEnum.DISK +elastomeric = IfcBearingTypeEnum.ELASTOMERIC +guide = IfcBearingTypeEnum.GUIDE +pot = IfcBearingTypeEnum.POT +rocker = IfcBearingTypeEnum.ROCKER +roller = IfcBearingTypeEnum.ROLLER +spherical = IfcBearingTypeEnum.SPHERICAL +userdefined = IfcBearingTypeEnum.USERDEFINED +notdefined = IfcBearingTypeEnum.NOTDEFINED IfcBenchmarkEnum = enum_namespace() -equalto = express_getattr(IfcBenchmarkEnum, 'EQUALTO', INDETERMINATE) -greaterthan = express_getattr(IfcBenchmarkEnum, 'GREATERTHAN', INDETERMINATE) -greaterthanorequalto = express_getattr(IfcBenchmarkEnum, 'GREATERTHANOREQUALTO', INDETERMINATE) -includedin = express_getattr(IfcBenchmarkEnum, 'INCLUDEDIN', INDETERMINATE) -includes = express_getattr(IfcBenchmarkEnum, 'INCLUDES', INDETERMINATE) -lessthan = express_getattr(IfcBenchmarkEnum, 'LESSTHAN', INDETERMINATE) -lessthanorequalto = express_getattr(IfcBenchmarkEnum, 'LESSTHANOREQUALTO', INDETERMINATE) -notequalto = express_getattr(IfcBenchmarkEnum, 'NOTEQUALTO', INDETERMINATE) -notincludedin = express_getattr(IfcBenchmarkEnum, 'NOTINCLUDEDIN', INDETERMINATE) -notincludes = express_getattr(IfcBenchmarkEnum, 'NOTINCLUDES', INDETERMINATE) +equalto = IfcBenchmarkEnum.EQUALTO +greaterthan = IfcBenchmarkEnum.GREATERTHAN +greaterthanorequalto = IfcBenchmarkEnum.GREATERTHANOREQUALTO +includedin = IfcBenchmarkEnum.INCLUDEDIN +includes = IfcBenchmarkEnum.INCLUDES +lessthan = IfcBenchmarkEnum.LESSTHAN +lessthanorequalto = IfcBenchmarkEnum.LESSTHANOREQUALTO +notequalto = IfcBenchmarkEnum.NOTEQUALTO +notincludedin = IfcBenchmarkEnum.NOTINCLUDEDIN +notincludes = IfcBenchmarkEnum.NOTINCLUDES IfcBoilerTypeEnum = enum_namespace() -steam = express_getattr(IfcBoilerTypeEnum, 'STEAM', INDETERMINATE) -water = express_getattr(IfcBoilerTypeEnum, 'WATER', INDETERMINATE) -userdefined = express_getattr(IfcBoilerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBoilerTypeEnum, 'NOTDEFINED', INDETERMINATE) +steam = IfcBoilerTypeEnum.STEAM +water = IfcBoilerTypeEnum.WATER +userdefined = IfcBoilerTypeEnum.USERDEFINED +notdefined = IfcBoilerTypeEnum.NOTDEFINED IfcBooleanOperator = enum_namespace() -difference = express_getattr(IfcBooleanOperator, 'DIFFERENCE', INDETERMINATE) -intersection = express_getattr(IfcBooleanOperator, 'INTERSECTION', INDETERMINATE) -union = express_getattr(IfcBooleanOperator, 'UNION', INDETERMINATE) +difference = IfcBooleanOperator.DIFFERENCE +intersection = IfcBooleanOperator.INTERSECTION +union = IfcBooleanOperator.UNION IfcBridgePartTypeEnum = enum_namespace() -abutment = express_getattr(IfcBridgePartTypeEnum, 'ABUTMENT', INDETERMINATE) -deck = express_getattr(IfcBridgePartTypeEnum, 'DECK', INDETERMINATE) -deck_segment = express_getattr(IfcBridgePartTypeEnum, 'DECK_SEGMENT', INDETERMINATE) -foundation = express_getattr(IfcBridgePartTypeEnum, 'FOUNDATION', INDETERMINATE) -pier = express_getattr(IfcBridgePartTypeEnum, 'PIER', INDETERMINATE) -pier_segment = express_getattr(IfcBridgePartTypeEnum, 'PIER_SEGMENT', INDETERMINATE) -pylon = express_getattr(IfcBridgePartTypeEnum, 'PYLON', INDETERMINATE) -substructure = express_getattr(IfcBridgePartTypeEnum, 'SUBSTRUCTURE', INDETERMINATE) -superstructure = express_getattr(IfcBridgePartTypeEnum, 'SUPERSTRUCTURE', INDETERMINATE) -surfacestructure = express_getattr(IfcBridgePartTypeEnum, 'SURFACESTRUCTURE', INDETERMINATE) -userdefined = express_getattr(IfcBridgePartTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBridgePartTypeEnum, 'NOTDEFINED', INDETERMINATE) +abutment = IfcBridgePartTypeEnum.ABUTMENT +deck = IfcBridgePartTypeEnum.DECK +deck_segment = IfcBridgePartTypeEnum.DECK_SEGMENT +foundation = IfcBridgePartTypeEnum.FOUNDATION +pier = IfcBridgePartTypeEnum.PIER +pier_segment = IfcBridgePartTypeEnum.PIER_SEGMENT +pylon = IfcBridgePartTypeEnum.PYLON +substructure = IfcBridgePartTypeEnum.SUBSTRUCTURE +superstructure = IfcBridgePartTypeEnum.SUPERSTRUCTURE +surfacestructure = IfcBridgePartTypeEnum.SURFACESTRUCTURE +userdefined = IfcBridgePartTypeEnum.USERDEFINED +notdefined = IfcBridgePartTypeEnum.NOTDEFINED IfcBridgeTypeEnum = enum_namespace() -arched = express_getattr(IfcBridgeTypeEnum, 'ARCHED', INDETERMINATE) -cable_stayed = express_getattr(IfcBridgeTypeEnum, 'CABLE_STAYED', INDETERMINATE) -cantilever = express_getattr(IfcBridgeTypeEnum, 'CANTILEVER', INDETERMINATE) -culvert = express_getattr(IfcBridgeTypeEnum, 'CULVERT', INDETERMINATE) -framework = express_getattr(IfcBridgeTypeEnum, 'FRAMEWORK', INDETERMINATE) -girder = express_getattr(IfcBridgeTypeEnum, 'GIRDER', INDETERMINATE) -suspension = express_getattr(IfcBridgeTypeEnum, 'SUSPENSION', INDETERMINATE) -truss = express_getattr(IfcBridgeTypeEnum, 'TRUSS', INDETERMINATE) -userdefined = express_getattr(IfcBridgeTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBridgeTypeEnum, 'NOTDEFINED', INDETERMINATE) +arched = IfcBridgeTypeEnum.ARCHED +cable_stayed = IfcBridgeTypeEnum.CABLE_STAYED +cantilever = IfcBridgeTypeEnum.CANTILEVER +culvert = IfcBridgeTypeEnum.CULVERT +framework = IfcBridgeTypeEnum.FRAMEWORK +girder = IfcBridgeTypeEnum.GIRDER +suspension = IfcBridgeTypeEnum.SUSPENSION +truss = IfcBridgeTypeEnum.TRUSS +userdefined = IfcBridgeTypeEnum.USERDEFINED +notdefined = IfcBridgeTypeEnum.NOTDEFINED IfcBuildingElementPartTypeEnum = enum_namespace() -apron = express_getattr(IfcBuildingElementPartTypeEnum, 'APRON', INDETERMINATE) -armourunit = express_getattr(IfcBuildingElementPartTypeEnum, 'ARMOURUNIT', INDETERMINATE) -insulation = express_getattr(IfcBuildingElementPartTypeEnum, 'INSULATION', INDETERMINATE) -precastpanel = express_getattr(IfcBuildingElementPartTypeEnum, 'PRECASTPANEL', INDETERMINATE) -safetycage = express_getattr(IfcBuildingElementPartTypeEnum, 'SAFETYCAGE', INDETERMINATE) -userdefined = express_getattr(IfcBuildingElementPartTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBuildingElementPartTypeEnum, 'NOTDEFINED', INDETERMINATE) +apron = IfcBuildingElementPartTypeEnum.APRON +armourunit = IfcBuildingElementPartTypeEnum.ARMOURUNIT +insulation = IfcBuildingElementPartTypeEnum.INSULATION +precastpanel = IfcBuildingElementPartTypeEnum.PRECASTPANEL +safetycage = IfcBuildingElementPartTypeEnum.SAFETYCAGE +userdefined = IfcBuildingElementPartTypeEnum.USERDEFINED +notdefined = IfcBuildingElementPartTypeEnum.NOTDEFINED IfcBuildingElementProxyTypeEnum = enum_namespace() -complex = express_getattr(IfcBuildingElementProxyTypeEnum, 'COMPLEX', INDETERMINATE) -element = express_getattr(IfcBuildingElementProxyTypeEnum, 'ELEMENT', INDETERMINATE) -partial = express_getattr(IfcBuildingElementProxyTypeEnum, 'PARTIAL', INDETERMINATE) -provisionforspace = express_getattr(IfcBuildingElementProxyTypeEnum, 'PROVISIONFORSPACE', INDETERMINATE) -provisionforvoid = express_getattr(IfcBuildingElementProxyTypeEnum, 'PROVISIONFORVOID', INDETERMINATE) -userdefined = express_getattr(IfcBuildingElementProxyTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBuildingElementProxyTypeEnum, 'NOTDEFINED', INDETERMINATE) +complex = IfcBuildingElementProxyTypeEnum.COMPLEX +element = IfcBuildingElementProxyTypeEnum.ELEMENT +partial = IfcBuildingElementProxyTypeEnum.PARTIAL +provisionforspace = IfcBuildingElementProxyTypeEnum.PROVISIONFORSPACE +provisionforvoid = IfcBuildingElementProxyTypeEnum.PROVISIONFORVOID +userdefined = IfcBuildingElementProxyTypeEnum.USERDEFINED +notdefined = IfcBuildingElementProxyTypeEnum.NOTDEFINED IfcBuildingSystemTypeEnum = enum_namespace() -fenestration = express_getattr(IfcBuildingSystemTypeEnum, 'FENESTRATION', INDETERMINATE) -foundation = express_getattr(IfcBuildingSystemTypeEnum, 'FOUNDATION', INDETERMINATE) -loadbearing = express_getattr(IfcBuildingSystemTypeEnum, 'LOADBEARING', INDETERMINATE) -outershell = express_getattr(IfcBuildingSystemTypeEnum, 'OUTERSHELL', INDETERMINATE) -shading = express_getattr(IfcBuildingSystemTypeEnum, 'SHADING', INDETERMINATE) -transport = express_getattr(IfcBuildingSystemTypeEnum, 'TRANSPORT', INDETERMINATE) -userdefined = express_getattr(IfcBuildingSystemTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBuildingSystemTypeEnum, 'NOTDEFINED', INDETERMINATE) +fenestration = IfcBuildingSystemTypeEnum.FENESTRATION +foundation = IfcBuildingSystemTypeEnum.FOUNDATION +loadbearing = IfcBuildingSystemTypeEnum.LOADBEARING +outershell = IfcBuildingSystemTypeEnum.OUTERSHELL +shading = IfcBuildingSystemTypeEnum.SHADING +transport = IfcBuildingSystemTypeEnum.TRANSPORT +userdefined = IfcBuildingSystemTypeEnum.USERDEFINED +notdefined = IfcBuildingSystemTypeEnum.NOTDEFINED IfcBuiltSystemTypeEnum = enum_namespace() -erosionprevention = express_getattr(IfcBuiltSystemTypeEnum, 'EROSIONPREVENTION', INDETERMINATE) -fenestration = express_getattr(IfcBuiltSystemTypeEnum, 'FENESTRATION', INDETERMINATE) -foundation = express_getattr(IfcBuiltSystemTypeEnum, 'FOUNDATION', INDETERMINATE) -loadbearing = express_getattr(IfcBuiltSystemTypeEnum, 'LOADBEARING', INDETERMINATE) -mooring = express_getattr(IfcBuiltSystemTypeEnum, 'MOORING', INDETERMINATE) -outershell = express_getattr(IfcBuiltSystemTypeEnum, 'OUTERSHELL', INDETERMINATE) -prestressing = express_getattr(IfcBuiltSystemTypeEnum, 'PRESTRESSING', INDETERMINATE) -railwayline = express_getattr(IfcBuiltSystemTypeEnum, 'RAILWAYLINE', INDETERMINATE) -railwaytrack = express_getattr(IfcBuiltSystemTypeEnum, 'RAILWAYTRACK', INDETERMINATE) -reinforcing = express_getattr(IfcBuiltSystemTypeEnum, 'REINFORCING', INDETERMINATE) -shading = express_getattr(IfcBuiltSystemTypeEnum, 'SHADING', INDETERMINATE) -trackcircuit = express_getattr(IfcBuiltSystemTypeEnum, 'TRACKCIRCUIT', INDETERMINATE) -transport = express_getattr(IfcBuiltSystemTypeEnum, 'TRANSPORT', INDETERMINATE) -userdefined = express_getattr(IfcBuiltSystemTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBuiltSystemTypeEnum, 'NOTDEFINED', INDETERMINATE) +erosionprevention = IfcBuiltSystemTypeEnum.EROSIONPREVENTION +fenestration = IfcBuiltSystemTypeEnum.FENESTRATION +foundation = IfcBuiltSystemTypeEnum.FOUNDATION +loadbearing = IfcBuiltSystemTypeEnum.LOADBEARING +mooring = IfcBuiltSystemTypeEnum.MOORING +outershell = IfcBuiltSystemTypeEnum.OUTERSHELL +prestressing = IfcBuiltSystemTypeEnum.PRESTRESSING +railwayline = IfcBuiltSystemTypeEnum.RAILWAYLINE +railwaytrack = IfcBuiltSystemTypeEnum.RAILWAYTRACK +reinforcing = IfcBuiltSystemTypeEnum.REINFORCING +shading = IfcBuiltSystemTypeEnum.SHADING +trackcircuit = IfcBuiltSystemTypeEnum.TRACKCIRCUIT +transport = IfcBuiltSystemTypeEnum.TRANSPORT +userdefined = IfcBuiltSystemTypeEnum.USERDEFINED +notdefined = IfcBuiltSystemTypeEnum.NOTDEFINED IfcBurnerTypeEnum = enum_namespace() -userdefined = express_getattr(IfcBurnerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBurnerTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcBurnerTypeEnum.USERDEFINED +notdefined = IfcBurnerTypeEnum.NOTDEFINED IfcCableCarrierFittingTypeEnum = enum_namespace() -bend = express_getattr(IfcCableCarrierFittingTypeEnum, 'BEND', INDETERMINATE) -connector = express_getattr(IfcCableCarrierFittingTypeEnum, 'CONNECTOR', INDETERMINATE) -cross = express_getattr(IfcCableCarrierFittingTypeEnum, 'CROSS', INDETERMINATE) -junction = express_getattr(IfcCableCarrierFittingTypeEnum, 'JUNCTION', INDETERMINATE) -reducer = express_getattr(IfcCableCarrierFittingTypeEnum, 'REDUCER', INDETERMINATE) -tee = express_getattr(IfcCableCarrierFittingTypeEnum, 'TEE', INDETERMINATE) -transition = express_getattr(IfcCableCarrierFittingTypeEnum, 'TRANSITION', INDETERMINATE) -userdefined = express_getattr(IfcCableCarrierFittingTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCableCarrierFittingTypeEnum, 'NOTDEFINED', INDETERMINATE) +bend = IfcCableCarrierFittingTypeEnum.BEND +connector = IfcCableCarrierFittingTypeEnum.CONNECTOR +cross = IfcCableCarrierFittingTypeEnum.CROSS +junction = IfcCableCarrierFittingTypeEnum.JUNCTION +reducer = IfcCableCarrierFittingTypeEnum.REDUCER +tee = IfcCableCarrierFittingTypeEnum.TEE +transition = IfcCableCarrierFittingTypeEnum.TRANSITION +userdefined = IfcCableCarrierFittingTypeEnum.USERDEFINED +notdefined = IfcCableCarrierFittingTypeEnum.NOTDEFINED IfcCableCarrierSegmentTypeEnum = enum_namespace() -cablebracket = express_getattr(IfcCableCarrierSegmentTypeEnum, 'CABLEBRACKET', INDETERMINATE) -cableladdersegment = express_getattr(IfcCableCarrierSegmentTypeEnum, 'CABLELADDERSEGMENT', INDETERMINATE) -cabletraysegment = express_getattr(IfcCableCarrierSegmentTypeEnum, 'CABLETRAYSEGMENT', INDETERMINATE) -cabletrunkingsegment = express_getattr(IfcCableCarrierSegmentTypeEnum, 'CABLETRUNKINGSEGMENT', INDETERMINATE) -catenarywire = express_getattr(IfcCableCarrierSegmentTypeEnum, 'CATENARYWIRE', INDETERMINATE) -conduitsegment = express_getattr(IfcCableCarrierSegmentTypeEnum, 'CONDUITSEGMENT', INDETERMINATE) -dropper = express_getattr(IfcCableCarrierSegmentTypeEnum, 'DROPPER', INDETERMINATE) -userdefined = express_getattr(IfcCableCarrierSegmentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCableCarrierSegmentTypeEnum, 'NOTDEFINED', INDETERMINATE) +cablebracket = IfcCableCarrierSegmentTypeEnum.CABLEBRACKET +cableladdersegment = IfcCableCarrierSegmentTypeEnum.CABLELADDERSEGMENT +cabletraysegment = IfcCableCarrierSegmentTypeEnum.CABLETRAYSEGMENT +cabletrunkingsegment = IfcCableCarrierSegmentTypeEnum.CABLETRUNKINGSEGMENT +catenarywire = IfcCableCarrierSegmentTypeEnum.CATENARYWIRE +conduitsegment = IfcCableCarrierSegmentTypeEnum.CONDUITSEGMENT +dropper = IfcCableCarrierSegmentTypeEnum.DROPPER +userdefined = IfcCableCarrierSegmentTypeEnum.USERDEFINED +notdefined = IfcCableCarrierSegmentTypeEnum.NOTDEFINED IfcCableFittingTypeEnum = enum_namespace() -connector = express_getattr(IfcCableFittingTypeEnum, 'CONNECTOR', INDETERMINATE) -entry = express_getattr(IfcCableFittingTypeEnum, 'ENTRY', INDETERMINATE) -exit = express_getattr(IfcCableFittingTypeEnum, 'EXIT', INDETERMINATE) -fanout = express_getattr(IfcCableFittingTypeEnum, 'FANOUT', INDETERMINATE) -junction = express_getattr(IfcCableFittingTypeEnum, 'JUNCTION', INDETERMINATE) -transition = express_getattr(IfcCableFittingTypeEnum, 'TRANSITION', INDETERMINATE) -userdefined = express_getattr(IfcCableFittingTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCableFittingTypeEnum, 'NOTDEFINED', INDETERMINATE) +connector = IfcCableFittingTypeEnum.CONNECTOR +entry = IfcCableFittingTypeEnum.ENTRY +exit = IfcCableFittingTypeEnum.EXIT +fanout = IfcCableFittingTypeEnum.FANOUT +junction = IfcCableFittingTypeEnum.JUNCTION +transition = IfcCableFittingTypeEnum.TRANSITION +userdefined = IfcCableFittingTypeEnum.USERDEFINED +notdefined = IfcCableFittingTypeEnum.NOTDEFINED IfcCableSegmentTypeEnum = enum_namespace() -busbarsegment = express_getattr(IfcCableSegmentTypeEnum, 'BUSBARSEGMENT', INDETERMINATE) -cablesegment = express_getattr(IfcCableSegmentTypeEnum, 'CABLESEGMENT', INDETERMINATE) -conductorsegment = express_getattr(IfcCableSegmentTypeEnum, 'CONDUCTORSEGMENT', INDETERMINATE) -contactwiresegment = express_getattr(IfcCableSegmentTypeEnum, 'CONTACTWIRESEGMENT', INDETERMINATE) -coresegment = express_getattr(IfcCableSegmentTypeEnum, 'CORESEGMENT', INDETERMINATE) -fibersegment = express_getattr(IfcCableSegmentTypeEnum, 'FIBERSEGMENT', INDETERMINATE) -fibertube = express_getattr(IfcCableSegmentTypeEnum, 'FIBERTUBE', INDETERMINATE) -opticalcablesegment = express_getattr(IfcCableSegmentTypeEnum, 'OPTICALCABLESEGMENT', INDETERMINATE) -stitchwire = express_getattr(IfcCableSegmentTypeEnum, 'STITCHWIRE', INDETERMINATE) -wirepairsegment = express_getattr(IfcCableSegmentTypeEnum, 'WIREPAIRSEGMENT', INDETERMINATE) -userdefined = express_getattr(IfcCableSegmentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCableSegmentTypeEnum, 'NOTDEFINED', INDETERMINATE) +busbarsegment = IfcCableSegmentTypeEnum.BUSBARSEGMENT +cablesegment = IfcCableSegmentTypeEnum.CABLESEGMENT +conductorsegment = IfcCableSegmentTypeEnum.CONDUCTORSEGMENT +contactwiresegment = IfcCableSegmentTypeEnum.CONTACTWIRESEGMENT +coresegment = IfcCableSegmentTypeEnum.CORESEGMENT +fibersegment = IfcCableSegmentTypeEnum.FIBERSEGMENT +fibertube = IfcCableSegmentTypeEnum.FIBERTUBE +opticalcablesegment = IfcCableSegmentTypeEnum.OPTICALCABLESEGMENT +stitchwire = IfcCableSegmentTypeEnum.STITCHWIRE +wirepairsegment = IfcCableSegmentTypeEnum.WIREPAIRSEGMENT +userdefined = IfcCableSegmentTypeEnum.USERDEFINED +notdefined = IfcCableSegmentTypeEnum.NOTDEFINED IfcCaissonFoundationTypeEnum = enum_namespace() -caisson = express_getattr(IfcCaissonFoundationTypeEnum, 'CAISSON', INDETERMINATE) -well = express_getattr(IfcCaissonFoundationTypeEnum, 'WELL', INDETERMINATE) -userdefined = express_getattr(IfcCaissonFoundationTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCaissonFoundationTypeEnum, 'NOTDEFINED', INDETERMINATE) +caisson = IfcCaissonFoundationTypeEnum.CAISSON +well = IfcCaissonFoundationTypeEnum.WELL +userdefined = IfcCaissonFoundationTypeEnum.USERDEFINED +notdefined = IfcCaissonFoundationTypeEnum.NOTDEFINED IfcChangeActionEnum = enum_namespace() -added = express_getattr(IfcChangeActionEnum, 'ADDED', INDETERMINATE) -deleted = express_getattr(IfcChangeActionEnum, 'DELETED', INDETERMINATE) -modified = express_getattr(IfcChangeActionEnum, 'MODIFIED', INDETERMINATE) -nochange = express_getattr(IfcChangeActionEnum, 'NOCHANGE', INDETERMINATE) -notdefined = express_getattr(IfcChangeActionEnum, 'NOTDEFINED', INDETERMINATE) +added = IfcChangeActionEnum.ADDED +deleted = IfcChangeActionEnum.DELETED +modified = IfcChangeActionEnum.MODIFIED +nochange = IfcChangeActionEnum.NOCHANGE +notdefined = IfcChangeActionEnum.NOTDEFINED IfcChillerTypeEnum = enum_namespace() -aircooled = express_getattr(IfcChillerTypeEnum, 'AIRCOOLED', INDETERMINATE) -heatrecovery = express_getattr(IfcChillerTypeEnum, 'HEATRECOVERY', INDETERMINATE) -watercooled = express_getattr(IfcChillerTypeEnum, 'WATERCOOLED', INDETERMINATE) -userdefined = express_getattr(IfcChillerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcChillerTypeEnum, 'NOTDEFINED', INDETERMINATE) +aircooled = IfcChillerTypeEnum.AIRCOOLED +heatrecovery = IfcChillerTypeEnum.HEATRECOVERY +watercooled = IfcChillerTypeEnum.WATERCOOLED +userdefined = IfcChillerTypeEnum.USERDEFINED +notdefined = IfcChillerTypeEnum.NOTDEFINED IfcChimneyTypeEnum = enum_namespace() -userdefined = express_getattr(IfcChimneyTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcChimneyTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcChimneyTypeEnum.USERDEFINED +notdefined = IfcChimneyTypeEnum.NOTDEFINED IfcCoilTypeEnum = enum_namespace() -dxcoolingcoil = express_getattr(IfcCoilTypeEnum, 'DXCOOLINGCOIL', INDETERMINATE) -electricheatingcoil = express_getattr(IfcCoilTypeEnum, 'ELECTRICHEATINGCOIL', INDETERMINATE) -gasheatingcoil = express_getattr(IfcCoilTypeEnum, 'GASHEATINGCOIL', INDETERMINATE) -hydroniccoil = express_getattr(IfcCoilTypeEnum, 'HYDRONICCOIL', INDETERMINATE) -steamheatingcoil = express_getattr(IfcCoilTypeEnum, 'STEAMHEATINGCOIL', INDETERMINATE) -watercoolingcoil = express_getattr(IfcCoilTypeEnum, 'WATERCOOLINGCOIL', INDETERMINATE) -waterheatingcoil = express_getattr(IfcCoilTypeEnum, 'WATERHEATINGCOIL', INDETERMINATE) -userdefined = express_getattr(IfcCoilTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCoilTypeEnum, 'NOTDEFINED', INDETERMINATE) +dxcoolingcoil = IfcCoilTypeEnum.DXCOOLINGCOIL +electricheatingcoil = IfcCoilTypeEnum.ELECTRICHEATINGCOIL +gasheatingcoil = IfcCoilTypeEnum.GASHEATINGCOIL +hydroniccoil = IfcCoilTypeEnum.HYDRONICCOIL +steamheatingcoil = IfcCoilTypeEnum.STEAMHEATINGCOIL +watercoolingcoil = IfcCoilTypeEnum.WATERCOOLINGCOIL +waterheatingcoil = IfcCoilTypeEnum.WATERHEATINGCOIL +userdefined = IfcCoilTypeEnum.USERDEFINED +notdefined = IfcCoilTypeEnum.NOTDEFINED IfcColumnTypeEnum = enum_namespace() -column = express_getattr(IfcColumnTypeEnum, 'COLUMN', INDETERMINATE) -pierstem = express_getattr(IfcColumnTypeEnum, 'PIERSTEM', INDETERMINATE) -pierstem_segment = express_getattr(IfcColumnTypeEnum, 'PIERSTEM_SEGMENT', INDETERMINATE) -pilaster = express_getattr(IfcColumnTypeEnum, 'PILASTER', INDETERMINATE) -standcolumn = express_getattr(IfcColumnTypeEnum, 'STANDCOLUMN', INDETERMINATE) -userdefined = express_getattr(IfcColumnTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcColumnTypeEnum, 'NOTDEFINED', INDETERMINATE) +column = IfcColumnTypeEnum.COLUMN +pierstem = IfcColumnTypeEnum.PIERSTEM +pierstem_segment = IfcColumnTypeEnum.PIERSTEM_SEGMENT +pilaster = IfcColumnTypeEnum.PILASTER +standcolumn = IfcColumnTypeEnum.STANDCOLUMN +userdefined = IfcColumnTypeEnum.USERDEFINED +notdefined = IfcColumnTypeEnum.NOTDEFINED IfcCommunicationsApplianceTypeEnum = enum_namespace() -antenna = express_getattr(IfcCommunicationsApplianceTypeEnum, 'ANTENNA', INDETERMINATE) -automaton = express_getattr(IfcCommunicationsApplianceTypeEnum, 'AUTOMATON', INDETERMINATE) -computer = express_getattr(IfcCommunicationsApplianceTypeEnum, 'COMPUTER', INDETERMINATE) -fax = express_getattr(IfcCommunicationsApplianceTypeEnum, 'FAX', INDETERMINATE) -gateway = express_getattr(IfcCommunicationsApplianceTypeEnum, 'GATEWAY', INDETERMINATE) -intelligentperipheral = express_getattr(IfcCommunicationsApplianceTypeEnum, 'INTELLIGENTPERIPHERAL', INDETERMINATE) -ipnetworkequipment = express_getattr(IfcCommunicationsApplianceTypeEnum, 'IPNETWORKEQUIPMENT', INDETERMINATE) -linesideelectronicunit = express_getattr(IfcCommunicationsApplianceTypeEnum, 'LINESIDEELECTRONICUNIT', INDETERMINATE) -modem = express_getattr(IfcCommunicationsApplianceTypeEnum, 'MODEM', INDETERMINATE) -networkappliance = express_getattr(IfcCommunicationsApplianceTypeEnum, 'NETWORKAPPLIANCE', INDETERMINATE) -networkbridge = express_getattr(IfcCommunicationsApplianceTypeEnum, 'NETWORKBRIDGE', INDETERMINATE) -networkhub = express_getattr(IfcCommunicationsApplianceTypeEnum, 'NETWORKHUB', INDETERMINATE) -opticallineterminal = express_getattr(IfcCommunicationsApplianceTypeEnum, 'OPTICALLINETERMINAL', INDETERMINATE) -opticalnetworkunit = express_getattr(IfcCommunicationsApplianceTypeEnum, 'OPTICALNETWORKUNIT', INDETERMINATE) -printer = express_getattr(IfcCommunicationsApplianceTypeEnum, 'PRINTER', INDETERMINATE) -radioblockcenter = express_getattr(IfcCommunicationsApplianceTypeEnum, 'RADIOBLOCKCENTER', INDETERMINATE) -repeater = express_getattr(IfcCommunicationsApplianceTypeEnum, 'REPEATER', INDETERMINATE) -router = express_getattr(IfcCommunicationsApplianceTypeEnum, 'ROUTER', INDETERMINATE) -scanner = express_getattr(IfcCommunicationsApplianceTypeEnum, 'SCANNER', INDETERMINATE) -telecommand = express_getattr(IfcCommunicationsApplianceTypeEnum, 'TELECOMMAND', INDETERMINATE) -telephonyexchange = express_getattr(IfcCommunicationsApplianceTypeEnum, 'TELEPHONYEXCHANGE', INDETERMINATE) -transitioncomponent = express_getattr(IfcCommunicationsApplianceTypeEnum, 'TRANSITIONCOMPONENT', INDETERMINATE) -transponder = express_getattr(IfcCommunicationsApplianceTypeEnum, 'TRANSPONDER', INDETERMINATE) -transportequipment = express_getattr(IfcCommunicationsApplianceTypeEnum, 'TRANSPORTEQUIPMENT', INDETERMINATE) -userdefined = express_getattr(IfcCommunicationsApplianceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCommunicationsApplianceTypeEnum, 'NOTDEFINED', INDETERMINATE) +antenna = IfcCommunicationsApplianceTypeEnum.ANTENNA +automaton = IfcCommunicationsApplianceTypeEnum.AUTOMATON +computer = IfcCommunicationsApplianceTypeEnum.COMPUTER +fax = IfcCommunicationsApplianceTypeEnum.FAX +gateway = IfcCommunicationsApplianceTypeEnum.GATEWAY +intelligentperipheral = IfcCommunicationsApplianceTypeEnum.INTELLIGENTPERIPHERAL +ipnetworkequipment = IfcCommunicationsApplianceTypeEnum.IPNETWORKEQUIPMENT +linesideelectronicunit = IfcCommunicationsApplianceTypeEnum.LINESIDEELECTRONICUNIT +modem = IfcCommunicationsApplianceTypeEnum.MODEM +networkappliance = IfcCommunicationsApplianceTypeEnum.NETWORKAPPLIANCE +networkbridge = IfcCommunicationsApplianceTypeEnum.NETWORKBRIDGE +networkhub = IfcCommunicationsApplianceTypeEnum.NETWORKHUB +opticallineterminal = IfcCommunicationsApplianceTypeEnum.OPTICALLINETERMINAL +opticalnetworkunit = IfcCommunicationsApplianceTypeEnum.OPTICALNETWORKUNIT +printer = IfcCommunicationsApplianceTypeEnum.PRINTER +radioblockcenter = IfcCommunicationsApplianceTypeEnum.RADIOBLOCKCENTER +repeater = IfcCommunicationsApplianceTypeEnum.REPEATER +router = IfcCommunicationsApplianceTypeEnum.ROUTER +scanner = IfcCommunicationsApplianceTypeEnum.SCANNER +telecommand = IfcCommunicationsApplianceTypeEnum.TELECOMMAND +telephonyexchange = IfcCommunicationsApplianceTypeEnum.TELEPHONYEXCHANGE +transitioncomponent = IfcCommunicationsApplianceTypeEnum.TRANSITIONCOMPONENT +transponder = IfcCommunicationsApplianceTypeEnum.TRANSPONDER +transportequipment = IfcCommunicationsApplianceTypeEnum.TRANSPORTEQUIPMENT +userdefined = IfcCommunicationsApplianceTypeEnum.USERDEFINED +notdefined = IfcCommunicationsApplianceTypeEnum.NOTDEFINED IfcComplexPropertyTemplateTypeEnum = enum_namespace() -p_complex = express_getattr(IfcComplexPropertyTemplateTypeEnum, 'P_COMPLEX', INDETERMINATE) -q_complex = express_getattr(IfcComplexPropertyTemplateTypeEnum, 'Q_COMPLEX', INDETERMINATE) +p_complex = IfcComplexPropertyTemplateTypeEnum.P_COMPLEX +q_complex = IfcComplexPropertyTemplateTypeEnum.Q_COMPLEX IfcCompressorTypeEnum = enum_namespace() -booster = express_getattr(IfcCompressorTypeEnum, 'BOOSTER', INDETERMINATE) -dynamic = express_getattr(IfcCompressorTypeEnum, 'DYNAMIC', INDETERMINATE) -hermetic = express_getattr(IfcCompressorTypeEnum, 'HERMETIC', INDETERMINATE) -opentype = express_getattr(IfcCompressorTypeEnum, 'OPENTYPE', INDETERMINATE) -reciprocating = express_getattr(IfcCompressorTypeEnum, 'RECIPROCATING', INDETERMINATE) -rollingpiston = express_getattr(IfcCompressorTypeEnum, 'ROLLINGPISTON', INDETERMINATE) -rotary = express_getattr(IfcCompressorTypeEnum, 'ROTARY', INDETERMINATE) -rotaryvane = express_getattr(IfcCompressorTypeEnum, 'ROTARYVANE', INDETERMINATE) -scroll = express_getattr(IfcCompressorTypeEnum, 'SCROLL', INDETERMINATE) -semihermetic = express_getattr(IfcCompressorTypeEnum, 'SEMIHERMETIC', INDETERMINATE) -singlescrew = express_getattr(IfcCompressorTypeEnum, 'SINGLESCREW', INDETERMINATE) -singlestage = express_getattr(IfcCompressorTypeEnum, 'SINGLESTAGE', INDETERMINATE) -trochoidal = express_getattr(IfcCompressorTypeEnum, 'TROCHOIDAL', INDETERMINATE) -twinscrew = express_getattr(IfcCompressorTypeEnum, 'TWINSCREW', INDETERMINATE) -weldedshellhermetic = express_getattr(IfcCompressorTypeEnum, 'WELDEDSHELLHERMETIC', INDETERMINATE) -userdefined = express_getattr(IfcCompressorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCompressorTypeEnum, 'NOTDEFINED', INDETERMINATE) +booster = IfcCompressorTypeEnum.BOOSTER +dynamic = IfcCompressorTypeEnum.DYNAMIC +hermetic = IfcCompressorTypeEnum.HERMETIC +opentype = IfcCompressorTypeEnum.OPENTYPE +reciprocating = IfcCompressorTypeEnum.RECIPROCATING +rollingpiston = IfcCompressorTypeEnum.ROLLINGPISTON +rotary = IfcCompressorTypeEnum.ROTARY +rotaryvane = IfcCompressorTypeEnum.ROTARYVANE +scroll = IfcCompressorTypeEnum.SCROLL +semihermetic = IfcCompressorTypeEnum.SEMIHERMETIC +singlescrew = IfcCompressorTypeEnum.SINGLESCREW +singlestage = IfcCompressorTypeEnum.SINGLESTAGE +trochoidal = IfcCompressorTypeEnum.TROCHOIDAL +twinscrew = IfcCompressorTypeEnum.TWINSCREW +weldedshellhermetic = IfcCompressorTypeEnum.WELDEDSHELLHERMETIC +userdefined = IfcCompressorTypeEnum.USERDEFINED +notdefined = IfcCompressorTypeEnum.NOTDEFINED IfcCondenserTypeEnum = enum_namespace() -aircooled = express_getattr(IfcCondenserTypeEnum, 'AIRCOOLED', INDETERMINATE) -evaporativecooled = express_getattr(IfcCondenserTypeEnum, 'EVAPORATIVECOOLED', INDETERMINATE) -watercooled = express_getattr(IfcCondenserTypeEnum, 'WATERCOOLED', INDETERMINATE) -watercooledbrazedplate = express_getattr(IfcCondenserTypeEnum, 'WATERCOOLEDBRAZEDPLATE', INDETERMINATE) -watercooledshellcoil = express_getattr(IfcCondenserTypeEnum, 'WATERCOOLEDSHELLCOIL', INDETERMINATE) -watercooledshelltube = express_getattr(IfcCondenserTypeEnum, 'WATERCOOLEDSHELLTUBE', INDETERMINATE) -watercooledtubeintube = express_getattr(IfcCondenserTypeEnum, 'WATERCOOLEDTUBEINTUBE', INDETERMINATE) -userdefined = express_getattr(IfcCondenserTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCondenserTypeEnum, 'NOTDEFINED', INDETERMINATE) +aircooled = IfcCondenserTypeEnum.AIRCOOLED +evaporativecooled = IfcCondenserTypeEnum.EVAPORATIVECOOLED +watercooled = IfcCondenserTypeEnum.WATERCOOLED +watercooledbrazedplate = IfcCondenserTypeEnum.WATERCOOLEDBRAZEDPLATE +watercooledshellcoil = IfcCondenserTypeEnum.WATERCOOLEDSHELLCOIL +watercooledshelltube = IfcCondenserTypeEnum.WATERCOOLEDSHELLTUBE +watercooledtubeintube = IfcCondenserTypeEnum.WATERCOOLEDTUBEINTUBE +userdefined = IfcCondenserTypeEnum.USERDEFINED +notdefined = IfcCondenserTypeEnum.NOTDEFINED IfcConnectionTypeEnum = enum_namespace() -atend = express_getattr(IfcConnectionTypeEnum, 'ATEND', INDETERMINATE) -atpath = express_getattr(IfcConnectionTypeEnum, 'ATPATH', INDETERMINATE) -atstart = express_getattr(IfcConnectionTypeEnum, 'ATSTART', INDETERMINATE) -notdefined = express_getattr(IfcConnectionTypeEnum, 'NOTDEFINED', INDETERMINATE) +atend = IfcConnectionTypeEnum.ATEND +atpath = IfcConnectionTypeEnum.ATPATH +atstart = IfcConnectionTypeEnum.ATSTART +notdefined = IfcConnectionTypeEnum.NOTDEFINED IfcConstraintEnum = enum_namespace() -advisory = express_getattr(IfcConstraintEnum, 'ADVISORY', INDETERMINATE) -hard = express_getattr(IfcConstraintEnum, 'HARD', INDETERMINATE) -soft = express_getattr(IfcConstraintEnum, 'SOFT', INDETERMINATE) -userdefined = express_getattr(IfcConstraintEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcConstraintEnum, 'NOTDEFINED', INDETERMINATE) +advisory = IfcConstraintEnum.ADVISORY +hard = IfcConstraintEnum.HARD +soft = IfcConstraintEnum.SOFT +userdefined = IfcConstraintEnum.USERDEFINED +notdefined = IfcConstraintEnum.NOTDEFINED IfcConstructionEquipmentResourceTypeEnum = enum_namespace() -demolishing = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'DEMOLISHING', INDETERMINATE) -earthmoving = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'EARTHMOVING', INDETERMINATE) -erecting = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'ERECTING', INDETERMINATE) -heating = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'HEATING', INDETERMINATE) -lighting = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'LIGHTING', INDETERMINATE) -paving = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'PAVING', INDETERMINATE) -pumping = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'PUMPING', INDETERMINATE) -transporting = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'TRANSPORTING', INDETERMINATE) -userdefined = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'NOTDEFINED', INDETERMINATE) +demolishing = IfcConstructionEquipmentResourceTypeEnum.DEMOLISHING +earthmoving = IfcConstructionEquipmentResourceTypeEnum.EARTHMOVING +erecting = IfcConstructionEquipmentResourceTypeEnum.ERECTING +heating = IfcConstructionEquipmentResourceTypeEnum.HEATING +lighting = IfcConstructionEquipmentResourceTypeEnum.LIGHTING +paving = IfcConstructionEquipmentResourceTypeEnum.PAVING +pumping = IfcConstructionEquipmentResourceTypeEnum.PUMPING +transporting = IfcConstructionEquipmentResourceTypeEnum.TRANSPORTING +userdefined = IfcConstructionEquipmentResourceTypeEnum.USERDEFINED +notdefined = IfcConstructionEquipmentResourceTypeEnum.NOTDEFINED IfcConstructionMaterialResourceTypeEnum = enum_namespace() -aggregates = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'AGGREGATES', INDETERMINATE) -concrete = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'CONCRETE', INDETERMINATE) -drywall = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'DRYWALL', INDETERMINATE) -fuel = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'FUEL', INDETERMINATE) -gypsum = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'GYPSUM', INDETERMINATE) -masonry = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'MASONRY', INDETERMINATE) -metal = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'METAL', INDETERMINATE) -plastic = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'PLASTIC', INDETERMINATE) -wood = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'WOOD', INDETERMINATE) -userdefined = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'NOTDEFINED', INDETERMINATE) +aggregates = IfcConstructionMaterialResourceTypeEnum.AGGREGATES +concrete = IfcConstructionMaterialResourceTypeEnum.CONCRETE +drywall = IfcConstructionMaterialResourceTypeEnum.DRYWALL +fuel = IfcConstructionMaterialResourceTypeEnum.FUEL +gypsum = IfcConstructionMaterialResourceTypeEnum.GYPSUM +masonry = IfcConstructionMaterialResourceTypeEnum.MASONRY +metal = IfcConstructionMaterialResourceTypeEnum.METAL +plastic = IfcConstructionMaterialResourceTypeEnum.PLASTIC +wood = IfcConstructionMaterialResourceTypeEnum.WOOD +userdefined = IfcConstructionMaterialResourceTypeEnum.USERDEFINED +notdefined = IfcConstructionMaterialResourceTypeEnum.NOTDEFINED IfcConstructionProductResourceTypeEnum = enum_namespace() -assembly = express_getattr(IfcConstructionProductResourceTypeEnum, 'ASSEMBLY', INDETERMINATE) -formwork = express_getattr(IfcConstructionProductResourceTypeEnum, 'FORMWORK', INDETERMINATE) -userdefined = express_getattr(IfcConstructionProductResourceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcConstructionProductResourceTypeEnum, 'NOTDEFINED', INDETERMINATE) +assembly = IfcConstructionProductResourceTypeEnum.ASSEMBLY +formwork = IfcConstructionProductResourceTypeEnum.FORMWORK +userdefined = IfcConstructionProductResourceTypeEnum.USERDEFINED +notdefined = IfcConstructionProductResourceTypeEnum.NOTDEFINED IfcControllerTypeEnum = enum_namespace() -floating = express_getattr(IfcControllerTypeEnum, 'FLOATING', INDETERMINATE) -multiposition = express_getattr(IfcControllerTypeEnum, 'MULTIPOSITION', INDETERMINATE) -programmable = express_getattr(IfcControllerTypeEnum, 'PROGRAMMABLE', INDETERMINATE) -proportional = express_getattr(IfcControllerTypeEnum, 'PROPORTIONAL', INDETERMINATE) -twoposition = express_getattr(IfcControllerTypeEnum, 'TWOPOSITION', INDETERMINATE) -userdefined = express_getattr(IfcControllerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcControllerTypeEnum, 'NOTDEFINED', INDETERMINATE) +floating = IfcControllerTypeEnum.FLOATING +multiposition = IfcControllerTypeEnum.MULTIPOSITION +programmable = IfcControllerTypeEnum.PROGRAMMABLE +proportional = IfcControllerTypeEnum.PROPORTIONAL +twoposition = IfcControllerTypeEnum.TWOPOSITION +userdefined = IfcControllerTypeEnum.USERDEFINED +notdefined = IfcControllerTypeEnum.NOTDEFINED IfcConveyorSegmentTypeEnum = enum_namespace() -beltconveyor = express_getattr(IfcConveyorSegmentTypeEnum, 'BELTCONVEYOR', INDETERMINATE) -bucketconveyor = express_getattr(IfcConveyorSegmentTypeEnum, 'BUCKETCONVEYOR', INDETERMINATE) -chuteconveyor = express_getattr(IfcConveyorSegmentTypeEnum, 'CHUTECONVEYOR', INDETERMINATE) -screwconveyor = express_getattr(IfcConveyorSegmentTypeEnum, 'SCREWCONVEYOR', INDETERMINATE) -userdefined = express_getattr(IfcConveyorSegmentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcConveyorSegmentTypeEnum, 'NOTDEFINED', INDETERMINATE) +beltconveyor = IfcConveyorSegmentTypeEnum.BELTCONVEYOR +bucketconveyor = IfcConveyorSegmentTypeEnum.BUCKETCONVEYOR +chuteconveyor = IfcConveyorSegmentTypeEnum.CHUTECONVEYOR +screwconveyor = IfcConveyorSegmentTypeEnum.SCREWCONVEYOR +userdefined = IfcConveyorSegmentTypeEnum.USERDEFINED +notdefined = IfcConveyorSegmentTypeEnum.NOTDEFINED IfcCooledBeamTypeEnum = enum_namespace() -active = express_getattr(IfcCooledBeamTypeEnum, 'ACTIVE', INDETERMINATE) -passive = express_getattr(IfcCooledBeamTypeEnum, 'PASSIVE', INDETERMINATE) -userdefined = express_getattr(IfcCooledBeamTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCooledBeamTypeEnum, 'NOTDEFINED', INDETERMINATE) +active = IfcCooledBeamTypeEnum.ACTIVE +passive = IfcCooledBeamTypeEnum.PASSIVE +userdefined = IfcCooledBeamTypeEnum.USERDEFINED +notdefined = IfcCooledBeamTypeEnum.NOTDEFINED IfcCoolingTowerTypeEnum = enum_namespace() -mechanicalforceddraft = express_getattr(IfcCoolingTowerTypeEnum, 'MECHANICALFORCEDDRAFT', INDETERMINATE) -mechanicalinduceddraft = express_getattr(IfcCoolingTowerTypeEnum, 'MECHANICALINDUCEDDRAFT', INDETERMINATE) -naturaldraft = express_getattr(IfcCoolingTowerTypeEnum, 'NATURALDRAFT', INDETERMINATE) -userdefined = express_getattr(IfcCoolingTowerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCoolingTowerTypeEnum, 'NOTDEFINED', INDETERMINATE) +mechanicalforceddraft = IfcCoolingTowerTypeEnum.MECHANICALFORCEDDRAFT +mechanicalinduceddraft = IfcCoolingTowerTypeEnum.MECHANICALINDUCEDDRAFT +naturaldraft = IfcCoolingTowerTypeEnum.NATURALDRAFT +userdefined = IfcCoolingTowerTypeEnum.USERDEFINED +notdefined = IfcCoolingTowerTypeEnum.NOTDEFINED IfcCostItemTypeEnum = enum_namespace() -userdefined = express_getattr(IfcCostItemTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCostItemTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcCostItemTypeEnum.USERDEFINED +notdefined = IfcCostItemTypeEnum.NOTDEFINED IfcCostScheduleTypeEnum = enum_namespace() -budget = express_getattr(IfcCostScheduleTypeEnum, 'BUDGET', INDETERMINATE) -costplan = express_getattr(IfcCostScheduleTypeEnum, 'COSTPLAN', INDETERMINATE) -estimate = express_getattr(IfcCostScheduleTypeEnum, 'ESTIMATE', INDETERMINATE) -pricedbillofquantities = express_getattr(IfcCostScheduleTypeEnum, 'PRICEDBILLOFQUANTITIES', INDETERMINATE) -scheduleofrates = express_getattr(IfcCostScheduleTypeEnum, 'SCHEDULEOFRATES', INDETERMINATE) -tender = express_getattr(IfcCostScheduleTypeEnum, 'TENDER', INDETERMINATE) -unpricedbillofquantities = express_getattr(IfcCostScheduleTypeEnum, 'UNPRICEDBILLOFQUANTITIES', INDETERMINATE) -userdefined = express_getattr(IfcCostScheduleTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCostScheduleTypeEnum, 'NOTDEFINED', INDETERMINATE) +budget = IfcCostScheduleTypeEnum.BUDGET +costplan = IfcCostScheduleTypeEnum.COSTPLAN +estimate = IfcCostScheduleTypeEnum.ESTIMATE +pricedbillofquantities = IfcCostScheduleTypeEnum.PRICEDBILLOFQUANTITIES +scheduleofrates = IfcCostScheduleTypeEnum.SCHEDULEOFRATES +tender = IfcCostScheduleTypeEnum.TENDER +unpricedbillofquantities = IfcCostScheduleTypeEnum.UNPRICEDBILLOFQUANTITIES +userdefined = IfcCostScheduleTypeEnum.USERDEFINED +notdefined = IfcCostScheduleTypeEnum.NOTDEFINED IfcCourseTypeEnum = enum_namespace() -armour = express_getattr(IfcCourseTypeEnum, 'ARMOUR', INDETERMINATE) -ballastbed = express_getattr(IfcCourseTypeEnum, 'BALLASTBED', INDETERMINATE) -core = express_getattr(IfcCourseTypeEnum, 'CORE', INDETERMINATE) -filter = express_getattr(IfcCourseTypeEnum, 'FILTER', INDETERMINATE) -pavement = express_getattr(IfcCourseTypeEnum, 'PAVEMENT', INDETERMINATE) -protection = express_getattr(IfcCourseTypeEnum, 'PROTECTION', INDETERMINATE) -userdefined = express_getattr(IfcCourseTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCourseTypeEnum, 'NOTDEFINED', INDETERMINATE) +armour = IfcCourseTypeEnum.ARMOUR +ballastbed = IfcCourseTypeEnum.BALLASTBED +core = IfcCourseTypeEnum.CORE +filter = IfcCourseTypeEnum.FILTER +pavement = IfcCourseTypeEnum.PAVEMENT +protection = IfcCourseTypeEnum.PROTECTION +userdefined = IfcCourseTypeEnum.USERDEFINED +notdefined = IfcCourseTypeEnum.NOTDEFINED IfcCoveringTypeEnum = enum_namespace() -ceiling = express_getattr(IfcCoveringTypeEnum, 'CEILING', INDETERMINATE) -cladding = express_getattr(IfcCoveringTypeEnum, 'CLADDING', INDETERMINATE) -coping = express_getattr(IfcCoveringTypeEnum, 'COPING', INDETERMINATE) -flooring = express_getattr(IfcCoveringTypeEnum, 'FLOORING', INDETERMINATE) -insulation = express_getattr(IfcCoveringTypeEnum, 'INSULATION', INDETERMINATE) -membrane = express_getattr(IfcCoveringTypeEnum, 'MEMBRANE', INDETERMINATE) -molding = express_getattr(IfcCoveringTypeEnum, 'MOLDING', INDETERMINATE) -roofing = express_getattr(IfcCoveringTypeEnum, 'ROOFING', INDETERMINATE) -skirtingboard = express_getattr(IfcCoveringTypeEnum, 'SKIRTINGBOARD', INDETERMINATE) -sleeving = express_getattr(IfcCoveringTypeEnum, 'SLEEVING', INDETERMINATE) -topping = express_getattr(IfcCoveringTypeEnum, 'TOPPING', INDETERMINATE) -wrapping = express_getattr(IfcCoveringTypeEnum, 'WRAPPING', INDETERMINATE) -userdefined = express_getattr(IfcCoveringTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCoveringTypeEnum, 'NOTDEFINED', INDETERMINATE) +ceiling = IfcCoveringTypeEnum.CEILING +cladding = IfcCoveringTypeEnum.CLADDING +coping = IfcCoveringTypeEnum.COPING +flooring = IfcCoveringTypeEnum.FLOORING +insulation = IfcCoveringTypeEnum.INSULATION +membrane = IfcCoveringTypeEnum.MEMBRANE +molding = IfcCoveringTypeEnum.MOLDING +roofing = IfcCoveringTypeEnum.ROOFING +skirtingboard = IfcCoveringTypeEnum.SKIRTINGBOARD +sleeving = IfcCoveringTypeEnum.SLEEVING +topping = IfcCoveringTypeEnum.TOPPING +wrapping = IfcCoveringTypeEnum.WRAPPING +userdefined = IfcCoveringTypeEnum.USERDEFINED +notdefined = IfcCoveringTypeEnum.NOTDEFINED IfcCrewResourceTypeEnum = enum_namespace() -office = express_getattr(IfcCrewResourceTypeEnum, 'OFFICE', INDETERMINATE) -site = express_getattr(IfcCrewResourceTypeEnum, 'SITE', INDETERMINATE) -userdefined = express_getattr(IfcCrewResourceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCrewResourceTypeEnum, 'NOTDEFINED', INDETERMINATE) +office = IfcCrewResourceTypeEnum.OFFICE +site = IfcCrewResourceTypeEnum.SITE +userdefined = IfcCrewResourceTypeEnum.USERDEFINED +notdefined = IfcCrewResourceTypeEnum.NOTDEFINED IfcCurtainWallTypeEnum = enum_namespace() -userdefined = express_getattr(IfcCurtainWallTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCurtainWallTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcCurtainWallTypeEnum.USERDEFINED +notdefined = IfcCurtainWallTypeEnum.NOTDEFINED IfcCurveInterpolationEnum = enum_namespace() -linear = express_getattr(IfcCurveInterpolationEnum, 'LINEAR', INDETERMINATE) -log_linear = express_getattr(IfcCurveInterpolationEnum, 'LOG_LINEAR', INDETERMINATE) -log_log = express_getattr(IfcCurveInterpolationEnum, 'LOG_LOG', INDETERMINATE) -notdefined = express_getattr(IfcCurveInterpolationEnum, 'NOTDEFINED', INDETERMINATE) +linear = IfcCurveInterpolationEnum.LINEAR +log_linear = IfcCurveInterpolationEnum.LOG_LINEAR +log_log = IfcCurveInterpolationEnum.LOG_LOG +notdefined = IfcCurveInterpolationEnum.NOTDEFINED IfcDamperTypeEnum = enum_namespace() -backdraftdamper = express_getattr(IfcDamperTypeEnum, 'BACKDRAFTDAMPER', INDETERMINATE) -balancingdamper = express_getattr(IfcDamperTypeEnum, 'BALANCINGDAMPER', INDETERMINATE) -blastdamper = express_getattr(IfcDamperTypeEnum, 'BLASTDAMPER', INDETERMINATE) -controldamper = express_getattr(IfcDamperTypeEnum, 'CONTROLDAMPER', INDETERMINATE) -firedamper = express_getattr(IfcDamperTypeEnum, 'FIREDAMPER', INDETERMINATE) -firesmokedamper = express_getattr(IfcDamperTypeEnum, 'FIRESMOKEDAMPER', INDETERMINATE) -fumehoodexhaust = express_getattr(IfcDamperTypeEnum, 'FUMEHOODEXHAUST', INDETERMINATE) -gravitydamper = express_getattr(IfcDamperTypeEnum, 'GRAVITYDAMPER', INDETERMINATE) -gravityreliefdamper = express_getattr(IfcDamperTypeEnum, 'GRAVITYRELIEFDAMPER', INDETERMINATE) -reliefdamper = express_getattr(IfcDamperTypeEnum, 'RELIEFDAMPER', INDETERMINATE) -smokedamper = express_getattr(IfcDamperTypeEnum, 'SMOKEDAMPER', INDETERMINATE) -userdefined = express_getattr(IfcDamperTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDamperTypeEnum, 'NOTDEFINED', INDETERMINATE) +backdraftdamper = IfcDamperTypeEnum.BACKDRAFTDAMPER +balancingdamper = IfcDamperTypeEnum.BALANCINGDAMPER +blastdamper = IfcDamperTypeEnum.BLASTDAMPER +controldamper = IfcDamperTypeEnum.CONTROLDAMPER +firedamper = IfcDamperTypeEnum.FIREDAMPER +firesmokedamper = IfcDamperTypeEnum.FIRESMOKEDAMPER +fumehoodexhaust = IfcDamperTypeEnum.FUMEHOODEXHAUST +gravitydamper = IfcDamperTypeEnum.GRAVITYDAMPER +gravityreliefdamper = IfcDamperTypeEnum.GRAVITYRELIEFDAMPER +reliefdamper = IfcDamperTypeEnum.RELIEFDAMPER +smokedamper = IfcDamperTypeEnum.SMOKEDAMPER +userdefined = IfcDamperTypeEnum.USERDEFINED +notdefined = IfcDamperTypeEnum.NOTDEFINED IfcDataOriginEnum = enum_namespace() -measured = express_getattr(IfcDataOriginEnum, 'MEASURED', INDETERMINATE) -predicted = express_getattr(IfcDataOriginEnum, 'PREDICTED', INDETERMINATE) -simulated = express_getattr(IfcDataOriginEnum, 'SIMULATED', INDETERMINATE) -userdefined = express_getattr(IfcDataOriginEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDataOriginEnum, 'NOTDEFINED', INDETERMINATE) +measured = IfcDataOriginEnum.MEASURED +predicted = IfcDataOriginEnum.PREDICTED +simulated = IfcDataOriginEnum.SIMULATED +userdefined = IfcDataOriginEnum.USERDEFINED +notdefined = IfcDataOriginEnum.NOTDEFINED IfcDerivedUnitEnum = enum_namespace() -accelerationunit = express_getattr(IfcDerivedUnitEnum, 'ACCELERATIONUNIT', INDETERMINATE) -angularvelocityunit = express_getattr(IfcDerivedUnitEnum, 'ANGULARVELOCITYUNIT', INDETERMINATE) -areadensityunit = express_getattr(IfcDerivedUnitEnum, 'AREADENSITYUNIT', INDETERMINATE) -compoundplaneangleunit = express_getattr(IfcDerivedUnitEnum, 'COMPOUNDPLANEANGLEUNIT', INDETERMINATE) -curvatureunit = express_getattr(IfcDerivedUnitEnum, 'CURVATUREUNIT', INDETERMINATE) -dynamicviscosityunit = express_getattr(IfcDerivedUnitEnum, 'DYNAMICVISCOSITYUNIT', INDETERMINATE) -heatfluxdensityunit = express_getattr(IfcDerivedUnitEnum, 'HEATFLUXDENSITYUNIT', INDETERMINATE) -heatingvalueunit = express_getattr(IfcDerivedUnitEnum, 'HEATINGVALUEUNIT', INDETERMINATE) -integercountrateunit = express_getattr(IfcDerivedUnitEnum, 'INTEGERCOUNTRATEUNIT', INDETERMINATE) -ionconcentrationunit = express_getattr(IfcDerivedUnitEnum, 'IONCONCENTRATIONUNIT', INDETERMINATE) -isothermalmoisturecapacityunit = express_getattr(IfcDerivedUnitEnum, 'ISOTHERMALMOISTURECAPACITYUNIT', INDETERMINATE) -kinematicviscosityunit = express_getattr(IfcDerivedUnitEnum, 'KINEMATICVISCOSITYUNIT', INDETERMINATE) -linearforceunit = express_getattr(IfcDerivedUnitEnum, 'LINEARFORCEUNIT', INDETERMINATE) -linearmomentunit = express_getattr(IfcDerivedUnitEnum, 'LINEARMOMENTUNIT', INDETERMINATE) -linearstiffnessunit = express_getattr(IfcDerivedUnitEnum, 'LINEARSTIFFNESSUNIT', INDETERMINATE) -linearvelocityunit = express_getattr(IfcDerivedUnitEnum, 'LINEARVELOCITYUNIT', INDETERMINATE) -luminousintensitydistributionunit = express_getattr(IfcDerivedUnitEnum, 'LUMINOUSINTENSITYDISTRIBUTIONUNIT', INDETERMINATE) -massdensityunit = express_getattr(IfcDerivedUnitEnum, 'MASSDENSITYUNIT', INDETERMINATE) -massflowrateunit = express_getattr(IfcDerivedUnitEnum, 'MASSFLOWRATEUNIT', INDETERMINATE) -massperlengthunit = express_getattr(IfcDerivedUnitEnum, 'MASSPERLENGTHUNIT', INDETERMINATE) -modulusofelasticityunit = express_getattr(IfcDerivedUnitEnum, 'MODULUSOFELASTICITYUNIT', INDETERMINATE) -modulusoflinearsubgradereactionunit = express_getattr(IfcDerivedUnitEnum, 'MODULUSOFLINEARSUBGRADEREACTIONUNIT', INDETERMINATE) -modulusofrotationalsubgradereactionunit = express_getattr(IfcDerivedUnitEnum, 'MODULUSOFROTATIONALSUBGRADEREACTIONUNIT', INDETERMINATE) -modulusofsubgradereactionunit = express_getattr(IfcDerivedUnitEnum, 'MODULUSOFSUBGRADEREACTIONUNIT', INDETERMINATE) -moisturediffusivityunit = express_getattr(IfcDerivedUnitEnum, 'MOISTUREDIFFUSIVITYUNIT', INDETERMINATE) -molecularweightunit = express_getattr(IfcDerivedUnitEnum, 'MOLECULARWEIGHTUNIT', INDETERMINATE) -momentofinertiaunit = express_getattr(IfcDerivedUnitEnum, 'MOMENTOFINERTIAUNIT', INDETERMINATE) -phunit = express_getattr(IfcDerivedUnitEnum, 'PHUNIT', INDETERMINATE) -planarforceunit = express_getattr(IfcDerivedUnitEnum, 'PLANARFORCEUNIT', INDETERMINATE) -rotationalfrequencyunit = express_getattr(IfcDerivedUnitEnum, 'ROTATIONALFREQUENCYUNIT', INDETERMINATE) -rotationalmassunit = express_getattr(IfcDerivedUnitEnum, 'ROTATIONALMASSUNIT', INDETERMINATE) -rotationalstiffnessunit = express_getattr(IfcDerivedUnitEnum, 'ROTATIONALSTIFFNESSUNIT', INDETERMINATE) -sectionareaintegralunit = express_getattr(IfcDerivedUnitEnum, 'SECTIONAREAINTEGRALUNIT', INDETERMINATE) -sectionmodulusunit = express_getattr(IfcDerivedUnitEnum, 'SECTIONMODULUSUNIT', INDETERMINATE) -shearmodulusunit = express_getattr(IfcDerivedUnitEnum, 'SHEARMODULUSUNIT', INDETERMINATE) -soundpowerlevelunit = express_getattr(IfcDerivedUnitEnum, 'SOUNDPOWERLEVELUNIT', INDETERMINATE) -soundpowerunit = express_getattr(IfcDerivedUnitEnum, 'SOUNDPOWERUNIT', INDETERMINATE) -soundpressurelevelunit = express_getattr(IfcDerivedUnitEnum, 'SOUNDPRESSURELEVELUNIT', INDETERMINATE) -soundpressureunit = express_getattr(IfcDerivedUnitEnum, 'SOUNDPRESSUREUNIT', INDETERMINATE) -specificheatcapacityunit = express_getattr(IfcDerivedUnitEnum, 'SPECIFICHEATCAPACITYUNIT', INDETERMINATE) -temperaturegradientunit = express_getattr(IfcDerivedUnitEnum, 'TEMPERATUREGRADIENTUNIT', INDETERMINATE) -temperaturerateofchangeunit = express_getattr(IfcDerivedUnitEnum, 'TEMPERATURERATEOFCHANGEUNIT', INDETERMINATE) -thermaladmittanceunit = express_getattr(IfcDerivedUnitEnum, 'THERMALADMITTANCEUNIT', INDETERMINATE) -thermalconductanceunit = express_getattr(IfcDerivedUnitEnum, 'THERMALCONDUCTANCEUNIT', INDETERMINATE) -thermalexpansioncoefficientunit = express_getattr(IfcDerivedUnitEnum, 'THERMALEXPANSIONCOEFFICIENTUNIT', INDETERMINATE) -thermalresistanceunit = express_getattr(IfcDerivedUnitEnum, 'THERMALRESISTANCEUNIT', INDETERMINATE) -thermaltransmittanceunit = express_getattr(IfcDerivedUnitEnum, 'THERMALTRANSMITTANCEUNIT', INDETERMINATE) -torqueunit = express_getattr(IfcDerivedUnitEnum, 'TORQUEUNIT', INDETERMINATE) -vaporpermeabilityunit = express_getattr(IfcDerivedUnitEnum, 'VAPORPERMEABILITYUNIT', INDETERMINATE) -volumetricflowrateunit = express_getattr(IfcDerivedUnitEnum, 'VOLUMETRICFLOWRATEUNIT', INDETERMINATE) -warpingconstantunit = express_getattr(IfcDerivedUnitEnum, 'WARPINGCONSTANTUNIT', INDETERMINATE) -warpingmomentunit = express_getattr(IfcDerivedUnitEnum, 'WARPINGMOMENTUNIT', INDETERMINATE) -userdefined = express_getattr(IfcDerivedUnitEnum, 'USERDEFINED', INDETERMINATE) +accelerationunit = IfcDerivedUnitEnum.ACCELERATIONUNIT +angularvelocityunit = IfcDerivedUnitEnum.ANGULARVELOCITYUNIT +areadensityunit = IfcDerivedUnitEnum.AREADENSITYUNIT +compoundplaneangleunit = IfcDerivedUnitEnum.COMPOUNDPLANEANGLEUNIT +curvatureunit = IfcDerivedUnitEnum.CURVATUREUNIT +dynamicviscosityunit = IfcDerivedUnitEnum.DYNAMICVISCOSITYUNIT +heatfluxdensityunit = IfcDerivedUnitEnum.HEATFLUXDENSITYUNIT +heatingvalueunit = IfcDerivedUnitEnum.HEATINGVALUEUNIT +integercountrateunit = IfcDerivedUnitEnum.INTEGERCOUNTRATEUNIT +ionconcentrationunit = IfcDerivedUnitEnum.IONCONCENTRATIONUNIT +isothermalmoisturecapacityunit = IfcDerivedUnitEnum.ISOTHERMALMOISTURECAPACITYUNIT +kinematicviscosityunit = IfcDerivedUnitEnum.KINEMATICVISCOSITYUNIT +linearforceunit = IfcDerivedUnitEnum.LINEARFORCEUNIT +linearmomentunit = IfcDerivedUnitEnum.LINEARMOMENTUNIT +linearstiffnessunit = IfcDerivedUnitEnum.LINEARSTIFFNESSUNIT +linearvelocityunit = IfcDerivedUnitEnum.LINEARVELOCITYUNIT +luminousintensitydistributionunit = IfcDerivedUnitEnum.LUMINOUSINTENSITYDISTRIBUTIONUNIT +massdensityunit = IfcDerivedUnitEnum.MASSDENSITYUNIT +massflowrateunit = IfcDerivedUnitEnum.MASSFLOWRATEUNIT +massperlengthunit = IfcDerivedUnitEnum.MASSPERLENGTHUNIT +modulusofelasticityunit = IfcDerivedUnitEnum.MODULUSOFELASTICITYUNIT +modulusoflinearsubgradereactionunit = IfcDerivedUnitEnum.MODULUSOFLINEARSUBGRADEREACTIONUNIT +modulusofrotationalsubgradereactionunit = IfcDerivedUnitEnum.MODULUSOFROTATIONALSUBGRADEREACTIONUNIT +modulusofsubgradereactionunit = IfcDerivedUnitEnum.MODULUSOFSUBGRADEREACTIONUNIT +moisturediffusivityunit = IfcDerivedUnitEnum.MOISTUREDIFFUSIVITYUNIT +molecularweightunit = IfcDerivedUnitEnum.MOLECULARWEIGHTUNIT +momentofinertiaunit = IfcDerivedUnitEnum.MOMENTOFINERTIAUNIT +phunit = IfcDerivedUnitEnum.PHUNIT +planarforceunit = IfcDerivedUnitEnum.PLANARFORCEUNIT +rotationalfrequencyunit = IfcDerivedUnitEnum.ROTATIONALFREQUENCYUNIT +rotationalmassunit = IfcDerivedUnitEnum.ROTATIONALMASSUNIT +rotationalstiffnessunit = IfcDerivedUnitEnum.ROTATIONALSTIFFNESSUNIT +sectionareaintegralunit = IfcDerivedUnitEnum.SECTIONAREAINTEGRALUNIT +sectionmodulusunit = IfcDerivedUnitEnum.SECTIONMODULUSUNIT +shearmodulusunit = IfcDerivedUnitEnum.SHEARMODULUSUNIT +soundpowerlevelunit = IfcDerivedUnitEnum.SOUNDPOWERLEVELUNIT +soundpowerunit = IfcDerivedUnitEnum.SOUNDPOWERUNIT +soundpressurelevelunit = IfcDerivedUnitEnum.SOUNDPRESSURELEVELUNIT +soundpressureunit = IfcDerivedUnitEnum.SOUNDPRESSUREUNIT +specificheatcapacityunit = IfcDerivedUnitEnum.SPECIFICHEATCAPACITYUNIT +temperaturegradientunit = IfcDerivedUnitEnum.TEMPERATUREGRADIENTUNIT +temperaturerateofchangeunit = IfcDerivedUnitEnum.TEMPERATURERATEOFCHANGEUNIT +thermaladmittanceunit = IfcDerivedUnitEnum.THERMALADMITTANCEUNIT +thermalconductanceunit = IfcDerivedUnitEnum.THERMALCONDUCTANCEUNIT +thermalexpansioncoefficientunit = IfcDerivedUnitEnum.THERMALEXPANSIONCOEFFICIENTUNIT +thermalresistanceunit = IfcDerivedUnitEnum.THERMALRESISTANCEUNIT +thermaltransmittanceunit = IfcDerivedUnitEnum.THERMALTRANSMITTANCEUNIT +torqueunit = IfcDerivedUnitEnum.TORQUEUNIT +vaporpermeabilityunit = IfcDerivedUnitEnum.VAPORPERMEABILITYUNIT +volumetricflowrateunit = IfcDerivedUnitEnum.VOLUMETRICFLOWRATEUNIT +warpingconstantunit = IfcDerivedUnitEnum.WARPINGCONSTANTUNIT +warpingmomentunit = IfcDerivedUnitEnum.WARPINGMOMENTUNIT +userdefined = IfcDerivedUnitEnum.USERDEFINED IfcDirectionSenseEnum = enum_namespace() -negative = express_getattr(IfcDirectionSenseEnum, 'NEGATIVE', INDETERMINATE) -positive = express_getattr(IfcDirectionSenseEnum, 'POSITIVE', INDETERMINATE) +negative = IfcDirectionSenseEnum.NEGATIVE +positive = IfcDirectionSenseEnum.POSITIVE IfcDiscreteAccessoryTypeEnum = enum_namespace() -anchorplate = express_getattr(IfcDiscreteAccessoryTypeEnum, 'ANCHORPLATE', INDETERMINATE) -birdprotection = express_getattr(IfcDiscreteAccessoryTypeEnum, 'BIRDPROTECTION', INDETERMINATE) -bracket = express_getattr(IfcDiscreteAccessoryTypeEnum, 'BRACKET', INDETERMINATE) -cablearranger = express_getattr(IfcDiscreteAccessoryTypeEnum, 'CABLEARRANGER', INDETERMINATE) -elastic_cushion = express_getattr(IfcDiscreteAccessoryTypeEnum, 'ELASTIC_CUSHION', INDETERMINATE) -expansion_joint_device = express_getattr(IfcDiscreteAccessoryTypeEnum, 'EXPANSION_JOINT_DEVICE', INDETERMINATE) -filler = express_getattr(IfcDiscreteAccessoryTypeEnum, 'FILLER', INDETERMINATE) -flashing = express_getattr(IfcDiscreteAccessoryTypeEnum, 'FLASHING', INDETERMINATE) -insulator = express_getattr(IfcDiscreteAccessoryTypeEnum, 'INSULATOR', INDETERMINATE) -lock = express_getattr(IfcDiscreteAccessoryTypeEnum, 'LOCK', INDETERMINATE) -panel_strengthening = express_getattr(IfcDiscreteAccessoryTypeEnum, 'PANEL_STRENGTHENING', INDETERMINATE) -pointmachinemountingdevice = express_getattr(IfcDiscreteAccessoryTypeEnum, 'POINTMACHINEMOUNTINGDEVICE', INDETERMINATE) -point_machine_locking_device = express_getattr(IfcDiscreteAccessoryTypeEnum, 'POINT_MACHINE_LOCKING_DEVICE', INDETERMINATE) -railbrace = express_getattr(IfcDiscreteAccessoryTypeEnum, 'RAILBRACE', INDETERMINATE) -railpad = express_getattr(IfcDiscreteAccessoryTypeEnum, 'RAILPAD', INDETERMINATE) -rail_lubrication = express_getattr(IfcDiscreteAccessoryTypeEnum, 'RAIL_LUBRICATION', INDETERMINATE) -rail_mechanical_equipment = express_getattr(IfcDiscreteAccessoryTypeEnum, 'RAIL_MECHANICAL_EQUIPMENT', INDETERMINATE) -shoe = express_getattr(IfcDiscreteAccessoryTypeEnum, 'SHOE', INDETERMINATE) -slidingchair = express_getattr(IfcDiscreteAccessoryTypeEnum, 'SLIDINGCHAIR', INDETERMINATE) -soundabsorption = express_getattr(IfcDiscreteAccessoryTypeEnum, 'SOUNDABSORPTION', INDETERMINATE) -tensioningequipment = express_getattr(IfcDiscreteAccessoryTypeEnum, 'TENSIONINGEQUIPMENT', INDETERMINATE) -userdefined = express_getattr(IfcDiscreteAccessoryTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDiscreteAccessoryTypeEnum, 'NOTDEFINED', INDETERMINATE) +anchorplate = IfcDiscreteAccessoryTypeEnum.ANCHORPLATE +birdprotection = IfcDiscreteAccessoryTypeEnum.BIRDPROTECTION +bracket = IfcDiscreteAccessoryTypeEnum.BRACKET +cablearranger = IfcDiscreteAccessoryTypeEnum.CABLEARRANGER +elastic_cushion = IfcDiscreteAccessoryTypeEnum.ELASTIC_CUSHION +expansion_joint_device = IfcDiscreteAccessoryTypeEnum.EXPANSION_JOINT_DEVICE +filler = IfcDiscreteAccessoryTypeEnum.FILLER +flashing = IfcDiscreteAccessoryTypeEnum.FLASHING +insulator = IfcDiscreteAccessoryTypeEnum.INSULATOR +lock = IfcDiscreteAccessoryTypeEnum.LOCK +panel_strengthening = IfcDiscreteAccessoryTypeEnum.PANEL_STRENGTHENING +pointmachinemountingdevice = IfcDiscreteAccessoryTypeEnum.POINTMACHINEMOUNTINGDEVICE +point_machine_locking_device = IfcDiscreteAccessoryTypeEnum.POINT_MACHINE_LOCKING_DEVICE +railbrace = IfcDiscreteAccessoryTypeEnum.RAILBRACE +railpad = IfcDiscreteAccessoryTypeEnum.RAILPAD +rail_lubrication = IfcDiscreteAccessoryTypeEnum.RAIL_LUBRICATION +rail_mechanical_equipment = IfcDiscreteAccessoryTypeEnum.RAIL_MECHANICAL_EQUIPMENT +shoe = IfcDiscreteAccessoryTypeEnum.SHOE +slidingchair = IfcDiscreteAccessoryTypeEnum.SLIDINGCHAIR +soundabsorption = IfcDiscreteAccessoryTypeEnum.SOUNDABSORPTION +tensioningequipment = IfcDiscreteAccessoryTypeEnum.TENSIONINGEQUIPMENT +userdefined = IfcDiscreteAccessoryTypeEnum.USERDEFINED +notdefined = IfcDiscreteAccessoryTypeEnum.NOTDEFINED IfcDistributionBoardTypeEnum = enum_namespace() -consumerunit = express_getattr(IfcDistributionBoardTypeEnum, 'CONSUMERUNIT', INDETERMINATE) -dispatchingboard = express_getattr(IfcDistributionBoardTypeEnum, 'DISPATCHINGBOARD', INDETERMINATE) -distributionboard = express_getattr(IfcDistributionBoardTypeEnum, 'DISTRIBUTIONBOARD', INDETERMINATE) -distributionframe = express_getattr(IfcDistributionBoardTypeEnum, 'DISTRIBUTIONFRAME', INDETERMINATE) -motorcontrolcentre = express_getattr(IfcDistributionBoardTypeEnum, 'MOTORCONTROLCENTRE', INDETERMINATE) -switchboard = express_getattr(IfcDistributionBoardTypeEnum, 'SWITCHBOARD', INDETERMINATE) -userdefined = express_getattr(IfcDistributionBoardTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDistributionBoardTypeEnum, 'NOTDEFINED', INDETERMINATE) +consumerunit = IfcDistributionBoardTypeEnum.CONSUMERUNIT +dispatchingboard = IfcDistributionBoardTypeEnum.DISPATCHINGBOARD +distributionboard = IfcDistributionBoardTypeEnum.DISTRIBUTIONBOARD +distributionframe = IfcDistributionBoardTypeEnum.DISTRIBUTIONFRAME +motorcontrolcentre = IfcDistributionBoardTypeEnum.MOTORCONTROLCENTRE +switchboard = IfcDistributionBoardTypeEnum.SWITCHBOARD +userdefined = IfcDistributionBoardTypeEnum.USERDEFINED +notdefined = IfcDistributionBoardTypeEnum.NOTDEFINED IfcDistributionChamberElementTypeEnum = enum_namespace() -formedduct = express_getattr(IfcDistributionChamberElementTypeEnum, 'FORMEDDUCT', INDETERMINATE) -inspectionchamber = express_getattr(IfcDistributionChamberElementTypeEnum, 'INSPECTIONCHAMBER', INDETERMINATE) -inspectionpit = express_getattr(IfcDistributionChamberElementTypeEnum, 'INSPECTIONPIT', INDETERMINATE) -manhole = express_getattr(IfcDistributionChamberElementTypeEnum, 'MANHOLE', INDETERMINATE) -meterchamber = express_getattr(IfcDistributionChamberElementTypeEnum, 'METERCHAMBER', INDETERMINATE) -sump = express_getattr(IfcDistributionChamberElementTypeEnum, 'SUMP', INDETERMINATE) -trench = express_getattr(IfcDistributionChamberElementTypeEnum, 'TRENCH', INDETERMINATE) -valvechamber = express_getattr(IfcDistributionChamberElementTypeEnum, 'VALVECHAMBER', INDETERMINATE) -userdefined = express_getattr(IfcDistributionChamberElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDistributionChamberElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +formedduct = IfcDistributionChamberElementTypeEnum.FORMEDDUCT +inspectionchamber = IfcDistributionChamberElementTypeEnum.INSPECTIONCHAMBER +inspectionpit = IfcDistributionChamberElementTypeEnum.INSPECTIONPIT +manhole = IfcDistributionChamberElementTypeEnum.MANHOLE +meterchamber = IfcDistributionChamberElementTypeEnum.METERCHAMBER +sump = IfcDistributionChamberElementTypeEnum.SUMP +trench = IfcDistributionChamberElementTypeEnum.TRENCH +valvechamber = IfcDistributionChamberElementTypeEnum.VALVECHAMBER +userdefined = IfcDistributionChamberElementTypeEnum.USERDEFINED +notdefined = IfcDistributionChamberElementTypeEnum.NOTDEFINED IfcDistributionPortTypeEnum = enum_namespace() -cable = express_getattr(IfcDistributionPortTypeEnum, 'CABLE', INDETERMINATE) -cablecarrier = express_getattr(IfcDistributionPortTypeEnum, 'CABLECARRIER', INDETERMINATE) -duct = express_getattr(IfcDistributionPortTypeEnum, 'DUCT', INDETERMINATE) -pipe = express_getattr(IfcDistributionPortTypeEnum, 'PIPE', INDETERMINATE) -wireless = express_getattr(IfcDistributionPortTypeEnum, 'WIRELESS', INDETERMINATE) -userdefined = express_getattr(IfcDistributionPortTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDistributionPortTypeEnum, 'NOTDEFINED', INDETERMINATE) +cable = IfcDistributionPortTypeEnum.CABLE +cablecarrier = IfcDistributionPortTypeEnum.CABLECARRIER +duct = IfcDistributionPortTypeEnum.DUCT +pipe = IfcDistributionPortTypeEnum.PIPE +wireless = IfcDistributionPortTypeEnum.WIRELESS +userdefined = IfcDistributionPortTypeEnum.USERDEFINED +notdefined = IfcDistributionPortTypeEnum.NOTDEFINED IfcDistributionSystemEnum = enum_namespace() -airconditioning = express_getattr(IfcDistributionSystemEnum, 'AIRCONDITIONING', INDETERMINATE) -audiovisual = express_getattr(IfcDistributionSystemEnum, 'AUDIOVISUAL', INDETERMINATE) -catenary_system = express_getattr(IfcDistributionSystemEnum, 'CATENARY_SYSTEM', INDETERMINATE) -chemical = express_getattr(IfcDistributionSystemEnum, 'CHEMICAL', INDETERMINATE) -chilledwater = express_getattr(IfcDistributionSystemEnum, 'CHILLEDWATER', INDETERMINATE) -communication = express_getattr(IfcDistributionSystemEnum, 'COMMUNICATION', INDETERMINATE) -compressedair = express_getattr(IfcDistributionSystemEnum, 'COMPRESSEDAIR', INDETERMINATE) -condenserwater = express_getattr(IfcDistributionSystemEnum, 'CONDENSERWATER', INDETERMINATE) -control = express_getattr(IfcDistributionSystemEnum, 'CONTROL', INDETERMINATE) -conveying = express_getattr(IfcDistributionSystemEnum, 'CONVEYING', INDETERMINATE) -data = express_getattr(IfcDistributionSystemEnum, 'DATA', INDETERMINATE) -disposal = express_getattr(IfcDistributionSystemEnum, 'DISPOSAL', INDETERMINATE) -domesticcoldwater = express_getattr(IfcDistributionSystemEnum, 'DOMESTICCOLDWATER', INDETERMINATE) -domestichotwater = express_getattr(IfcDistributionSystemEnum, 'DOMESTICHOTWATER', INDETERMINATE) -drainage = express_getattr(IfcDistributionSystemEnum, 'DRAINAGE', INDETERMINATE) -earthing = express_getattr(IfcDistributionSystemEnum, 'EARTHING', INDETERMINATE) -electrical = express_getattr(IfcDistributionSystemEnum, 'ELECTRICAL', INDETERMINATE) -electroacoustic = express_getattr(IfcDistributionSystemEnum, 'ELECTROACOUSTIC', INDETERMINATE) -exhaust = express_getattr(IfcDistributionSystemEnum, 'EXHAUST', INDETERMINATE) -fireprotection = express_getattr(IfcDistributionSystemEnum, 'FIREPROTECTION', INDETERMINATE) -fixedtransmissionnetwork = express_getattr(IfcDistributionSystemEnum, 'FIXEDTRANSMISSIONNETWORK', INDETERMINATE) -fuel = express_getattr(IfcDistributionSystemEnum, 'FUEL', INDETERMINATE) -gas = express_getattr(IfcDistributionSystemEnum, 'GAS', INDETERMINATE) -hazardous = express_getattr(IfcDistributionSystemEnum, 'HAZARDOUS', INDETERMINATE) -heating = express_getattr(IfcDistributionSystemEnum, 'HEATING', INDETERMINATE) -lighting = express_getattr(IfcDistributionSystemEnum, 'LIGHTING', INDETERMINATE) -lightningprotection = express_getattr(IfcDistributionSystemEnum, 'LIGHTNINGPROTECTION', INDETERMINATE) -mobilenetwork = express_getattr(IfcDistributionSystemEnum, 'MOBILENETWORK', INDETERMINATE) -monitoringsystem = express_getattr(IfcDistributionSystemEnum, 'MONITORINGSYSTEM', INDETERMINATE) -municipalsolidwaste = express_getattr(IfcDistributionSystemEnum, 'MUNICIPALSOLIDWASTE', INDETERMINATE) -oil = express_getattr(IfcDistributionSystemEnum, 'OIL', INDETERMINATE) -operational = express_getattr(IfcDistributionSystemEnum, 'OPERATIONAL', INDETERMINATE) -operationaltelephonysystem = express_getattr(IfcDistributionSystemEnum, 'OPERATIONALTELEPHONYSYSTEM', INDETERMINATE) -overhead_contactline_system = express_getattr(IfcDistributionSystemEnum, 'OVERHEAD_CONTACTLINE_SYSTEM', INDETERMINATE) -powergeneration = express_getattr(IfcDistributionSystemEnum, 'POWERGENERATION', INDETERMINATE) -rainwater = express_getattr(IfcDistributionSystemEnum, 'RAINWATER', INDETERMINATE) -refrigeration = express_getattr(IfcDistributionSystemEnum, 'REFRIGERATION', INDETERMINATE) -return_circuit = express_getattr(IfcDistributionSystemEnum, 'RETURN_CIRCUIT', INDETERMINATE) -security = express_getattr(IfcDistributionSystemEnum, 'SECURITY', INDETERMINATE) -sewage = express_getattr(IfcDistributionSystemEnum, 'SEWAGE', INDETERMINATE) -signal = express_getattr(IfcDistributionSystemEnum, 'SIGNAL', INDETERMINATE) -stormwater = express_getattr(IfcDistributionSystemEnum, 'STORMWATER', INDETERMINATE) -telephone = express_getattr(IfcDistributionSystemEnum, 'TELEPHONE', INDETERMINATE) -tv = express_getattr(IfcDistributionSystemEnum, 'TV', INDETERMINATE) -vacuum = express_getattr(IfcDistributionSystemEnum, 'VACUUM', INDETERMINATE) -vent = express_getattr(IfcDistributionSystemEnum, 'VENT', INDETERMINATE) -ventilation = express_getattr(IfcDistributionSystemEnum, 'VENTILATION', INDETERMINATE) -wastewater = express_getattr(IfcDistributionSystemEnum, 'WASTEWATER', INDETERMINATE) -watersupply = express_getattr(IfcDistributionSystemEnum, 'WATERSUPPLY', INDETERMINATE) -userdefined = express_getattr(IfcDistributionSystemEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDistributionSystemEnum, 'NOTDEFINED', INDETERMINATE) +airconditioning = IfcDistributionSystemEnum.AIRCONDITIONING +audiovisual = IfcDistributionSystemEnum.AUDIOVISUAL +catenary_system = IfcDistributionSystemEnum.CATENARY_SYSTEM +chemical = IfcDistributionSystemEnum.CHEMICAL +chilledwater = IfcDistributionSystemEnum.CHILLEDWATER +communication = IfcDistributionSystemEnum.COMMUNICATION +compressedair = IfcDistributionSystemEnum.COMPRESSEDAIR +condenserwater = IfcDistributionSystemEnum.CONDENSERWATER +control = IfcDistributionSystemEnum.CONTROL +conveying = IfcDistributionSystemEnum.CONVEYING +data = IfcDistributionSystemEnum.DATA +disposal = IfcDistributionSystemEnum.DISPOSAL +domesticcoldwater = IfcDistributionSystemEnum.DOMESTICCOLDWATER +domestichotwater = IfcDistributionSystemEnum.DOMESTICHOTWATER +drainage = IfcDistributionSystemEnum.DRAINAGE +earthing = IfcDistributionSystemEnum.EARTHING +electrical = IfcDistributionSystemEnum.ELECTRICAL +electroacoustic = IfcDistributionSystemEnum.ELECTROACOUSTIC +exhaust = IfcDistributionSystemEnum.EXHAUST +fireprotection = IfcDistributionSystemEnum.FIREPROTECTION +fixedtransmissionnetwork = IfcDistributionSystemEnum.FIXEDTRANSMISSIONNETWORK +fuel = IfcDistributionSystemEnum.FUEL +gas = IfcDistributionSystemEnum.GAS +hazardous = IfcDistributionSystemEnum.HAZARDOUS +heating = IfcDistributionSystemEnum.HEATING +lighting = IfcDistributionSystemEnum.LIGHTING +lightningprotection = IfcDistributionSystemEnum.LIGHTNINGPROTECTION +mobilenetwork = IfcDistributionSystemEnum.MOBILENETWORK +monitoringsystem = IfcDistributionSystemEnum.MONITORINGSYSTEM +municipalsolidwaste = IfcDistributionSystemEnum.MUNICIPALSOLIDWASTE +oil = IfcDistributionSystemEnum.OIL +operational = IfcDistributionSystemEnum.OPERATIONAL +operationaltelephonysystem = IfcDistributionSystemEnum.OPERATIONALTELEPHONYSYSTEM +overhead_contactline_system = IfcDistributionSystemEnum.OVERHEAD_CONTACTLINE_SYSTEM +powergeneration = IfcDistributionSystemEnum.POWERGENERATION +rainwater = IfcDistributionSystemEnum.RAINWATER +refrigeration = IfcDistributionSystemEnum.REFRIGERATION +return_circuit = IfcDistributionSystemEnum.RETURN_CIRCUIT +security = IfcDistributionSystemEnum.SECURITY +sewage = IfcDistributionSystemEnum.SEWAGE +signal = IfcDistributionSystemEnum.SIGNAL +stormwater = IfcDistributionSystemEnum.STORMWATER +telephone = IfcDistributionSystemEnum.TELEPHONE +tv = IfcDistributionSystemEnum.TV +vacuum = IfcDistributionSystemEnum.VACUUM +vent = IfcDistributionSystemEnum.VENT +ventilation = IfcDistributionSystemEnum.VENTILATION +wastewater = IfcDistributionSystemEnum.WASTEWATER +watersupply = IfcDistributionSystemEnum.WATERSUPPLY +userdefined = IfcDistributionSystemEnum.USERDEFINED +notdefined = IfcDistributionSystemEnum.NOTDEFINED IfcDocumentConfidentialityEnum = enum_namespace() -confidential = express_getattr(IfcDocumentConfidentialityEnum, 'CONFIDENTIAL', INDETERMINATE) -personal = express_getattr(IfcDocumentConfidentialityEnum, 'PERSONAL', INDETERMINATE) -public = express_getattr(IfcDocumentConfidentialityEnum, 'PUBLIC', INDETERMINATE) -restricted = express_getattr(IfcDocumentConfidentialityEnum, 'RESTRICTED', INDETERMINATE) -userdefined = express_getattr(IfcDocumentConfidentialityEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDocumentConfidentialityEnum, 'NOTDEFINED', INDETERMINATE) +confidential = IfcDocumentConfidentialityEnum.CONFIDENTIAL +personal = IfcDocumentConfidentialityEnum.PERSONAL +public = IfcDocumentConfidentialityEnum.PUBLIC +restricted = IfcDocumentConfidentialityEnum.RESTRICTED +userdefined = IfcDocumentConfidentialityEnum.USERDEFINED +notdefined = IfcDocumentConfidentialityEnum.NOTDEFINED IfcDocumentStatusEnum = enum_namespace() -draft = express_getattr(IfcDocumentStatusEnum, 'DRAFT', INDETERMINATE) -final = express_getattr(IfcDocumentStatusEnum, 'FINAL', INDETERMINATE) -finaldraft = express_getattr(IfcDocumentStatusEnum, 'FINALDRAFT', INDETERMINATE) -revision = express_getattr(IfcDocumentStatusEnum, 'REVISION', INDETERMINATE) -notdefined = express_getattr(IfcDocumentStatusEnum, 'NOTDEFINED', INDETERMINATE) +draft = IfcDocumentStatusEnum.DRAFT +final = IfcDocumentStatusEnum.FINAL +finaldraft = IfcDocumentStatusEnum.FINALDRAFT +revision = IfcDocumentStatusEnum.REVISION +notdefined = IfcDocumentStatusEnum.NOTDEFINED IfcDoorPanelOperationEnum = enum_namespace() -double_acting = express_getattr(IfcDoorPanelOperationEnum, 'DOUBLE_ACTING', INDETERMINATE) -fixedpanel = express_getattr(IfcDoorPanelOperationEnum, 'FIXEDPANEL', INDETERMINATE) -folding = express_getattr(IfcDoorPanelOperationEnum, 'FOLDING', INDETERMINATE) -revolving = express_getattr(IfcDoorPanelOperationEnum, 'REVOLVING', INDETERMINATE) -rollingup = express_getattr(IfcDoorPanelOperationEnum, 'ROLLINGUP', INDETERMINATE) -sliding = express_getattr(IfcDoorPanelOperationEnum, 'SLIDING', INDETERMINATE) -swinging = express_getattr(IfcDoorPanelOperationEnum, 'SWINGING', INDETERMINATE) -userdefined = express_getattr(IfcDoorPanelOperationEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDoorPanelOperationEnum, 'NOTDEFINED', INDETERMINATE) +double_acting = IfcDoorPanelOperationEnum.DOUBLE_ACTING +fixedpanel = IfcDoorPanelOperationEnum.FIXEDPANEL +folding = IfcDoorPanelOperationEnum.FOLDING +revolving = IfcDoorPanelOperationEnum.REVOLVING +rollingup = IfcDoorPanelOperationEnum.ROLLINGUP +sliding = IfcDoorPanelOperationEnum.SLIDING +swinging = IfcDoorPanelOperationEnum.SWINGING +userdefined = IfcDoorPanelOperationEnum.USERDEFINED +notdefined = IfcDoorPanelOperationEnum.NOTDEFINED IfcDoorPanelPositionEnum = enum_namespace() -left = express_getattr(IfcDoorPanelPositionEnum, 'LEFT', INDETERMINATE) -middle = express_getattr(IfcDoorPanelPositionEnum, 'MIDDLE', INDETERMINATE) -right = express_getattr(IfcDoorPanelPositionEnum, 'RIGHT', INDETERMINATE) -notdefined = express_getattr(IfcDoorPanelPositionEnum, 'NOTDEFINED', INDETERMINATE) +left = IfcDoorPanelPositionEnum.LEFT +middle = IfcDoorPanelPositionEnum.MIDDLE +right = IfcDoorPanelPositionEnum.RIGHT +notdefined = IfcDoorPanelPositionEnum.NOTDEFINED IfcDoorTypeEnum = enum_namespace() -boom_barrier = express_getattr(IfcDoorTypeEnum, 'BOOM_BARRIER', INDETERMINATE) -door = express_getattr(IfcDoorTypeEnum, 'DOOR', INDETERMINATE) -gate = express_getattr(IfcDoorTypeEnum, 'GATE', INDETERMINATE) -trapdoor = express_getattr(IfcDoorTypeEnum, 'TRAPDOOR', INDETERMINATE) -turnstile = express_getattr(IfcDoorTypeEnum, 'TURNSTILE', INDETERMINATE) -userdefined = express_getattr(IfcDoorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDoorTypeEnum, 'NOTDEFINED', INDETERMINATE) +boom_barrier = IfcDoorTypeEnum.BOOM_BARRIER +door = IfcDoorTypeEnum.DOOR +gate = IfcDoorTypeEnum.GATE +trapdoor = IfcDoorTypeEnum.TRAPDOOR +turnstile = IfcDoorTypeEnum.TURNSTILE +userdefined = IfcDoorTypeEnum.USERDEFINED +notdefined = IfcDoorTypeEnum.NOTDEFINED IfcDoorTypeOperationEnum = enum_namespace() -double_door_double_swing = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_DOOR_DOUBLE_SWING', INDETERMINATE) -double_door_folding = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_DOOR_FOLDING', INDETERMINATE) -double_door_lifting_vertical = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_DOOR_LIFTING_VERTICAL', INDETERMINATE) -double_door_single_swing = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_DOOR_SINGLE_SWING', INDETERMINATE) -double_door_single_swing_opposite_left = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_LEFT', INDETERMINATE) -double_door_single_swing_opposite_right = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_RIGHT', INDETERMINATE) -double_door_sliding = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_DOOR_SLIDING', INDETERMINATE) -double_swing_left = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_SWING_LEFT', INDETERMINATE) -double_swing_right = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_SWING_RIGHT', INDETERMINATE) -folding_to_left = express_getattr(IfcDoorTypeOperationEnum, 'FOLDING_TO_LEFT', INDETERMINATE) -folding_to_right = express_getattr(IfcDoorTypeOperationEnum, 'FOLDING_TO_RIGHT', INDETERMINATE) -lifting_horizontal = express_getattr(IfcDoorTypeOperationEnum, 'LIFTING_HORIZONTAL', INDETERMINATE) -lifting_vertical_left = express_getattr(IfcDoorTypeOperationEnum, 'LIFTING_VERTICAL_LEFT', INDETERMINATE) -lifting_vertical_right = express_getattr(IfcDoorTypeOperationEnum, 'LIFTING_VERTICAL_RIGHT', INDETERMINATE) -revolving = express_getattr(IfcDoorTypeOperationEnum, 'REVOLVING', INDETERMINATE) -revolving_vertical = express_getattr(IfcDoorTypeOperationEnum, 'REVOLVING_VERTICAL', INDETERMINATE) -rollingup = express_getattr(IfcDoorTypeOperationEnum, 'ROLLINGUP', INDETERMINATE) -single_swing_left = express_getattr(IfcDoorTypeOperationEnum, 'SINGLE_SWING_LEFT', INDETERMINATE) -single_swing_right = express_getattr(IfcDoorTypeOperationEnum, 'SINGLE_SWING_RIGHT', INDETERMINATE) -sliding_to_left = express_getattr(IfcDoorTypeOperationEnum, 'SLIDING_TO_LEFT', INDETERMINATE) -sliding_to_right = express_getattr(IfcDoorTypeOperationEnum, 'SLIDING_TO_RIGHT', INDETERMINATE) -swing_fixed_left = express_getattr(IfcDoorTypeOperationEnum, 'SWING_FIXED_LEFT', INDETERMINATE) -swing_fixed_right = express_getattr(IfcDoorTypeOperationEnum, 'SWING_FIXED_RIGHT', INDETERMINATE) -userdefined = express_getattr(IfcDoorTypeOperationEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDoorTypeOperationEnum, 'NOTDEFINED', INDETERMINATE) +double_door_double_swing = IfcDoorTypeOperationEnum.DOUBLE_DOOR_DOUBLE_SWING +double_door_folding = IfcDoorTypeOperationEnum.DOUBLE_DOOR_FOLDING +double_door_lifting_vertical = IfcDoorTypeOperationEnum.DOUBLE_DOOR_LIFTING_VERTICAL +double_door_single_swing = IfcDoorTypeOperationEnum.DOUBLE_DOOR_SINGLE_SWING +double_door_single_swing_opposite_left = IfcDoorTypeOperationEnum.DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_LEFT +double_door_single_swing_opposite_right = IfcDoorTypeOperationEnum.DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_RIGHT +double_door_sliding = IfcDoorTypeOperationEnum.DOUBLE_DOOR_SLIDING +double_swing_left = IfcDoorTypeOperationEnum.DOUBLE_SWING_LEFT +double_swing_right = IfcDoorTypeOperationEnum.DOUBLE_SWING_RIGHT +folding_to_left = IfcDoorTypeOperationEnum.FOLDING_TO_LEFT +folding_to_right = IfcDoorTypeOperationEnum.FOLDING_TO_RIGHT +lifting_horizontal = IfcDoorTypeOperationEnum.LIFTING_HORIZONTAL +lifting_vertical_left = IfcDoorTypeOperationEnum.LIFTING_VERTICAL_LEFT +lifting_vertical_right = IfcDoorTypeOperationEnum.LIFTING_VERTICAL_RIGHT +revolving = IfcDoorTypeOperationEnum.REVOLVING +revolving_vertical = IfcDoorTypeOperationEnum.REVOLVING_VERTICAL +rollingup = IfcDoorTypeOperationEnum.ROLLINGUP +single_swing_left = IfcDoorTypeOperationEnum.SINGLE_SWING_LEFT +single_swing_right = IfcDoorTypeOperationEnum.SINGLE_SWING_RIGHT +sliding_to_left = IfcDoorTypeOperationEnum.SLIDING_TO_LEFT +sliding_to_right = IfcDoorTypeOperationEnum.SLIDING_TO_RIGHT +swing_fixed_left = IfcDoorTypeOperationEnum.SWING_FIXED_LEFT +swing_fixed_right = IfcDoorTypeOperationEnum.SWING_FIXED_RIGHT +userdefined = IfcDoorTypeOperationEnum.USERDEFINED +notdefined = IfcDoorTypeOperationEnum.NOTDEFINED IfcDuctFittingTypeEnum = enum_namespace() -bend = express_getattr(IfcDuctFittingTypeEnum, 'BEND', INDETERMINATE) -connector = express_getattr(IfcDuctFittingTypeEnum, 'CONNECTOR', INDETERMINATE) -entry = express_getattr(IfcDuctFittingTypeEnum, 'ENTRY', INDETERMINATE) -exit = express_getattr(IfcDuctFittingTypeEnum, 'EXIT', INDETERMINATE) -junction = express_getattr(IfcDuctFittingTypeEnum, 'JUNCTION', INDETERMINATE) -obstruction = express_getattr(IfcDuctFittingTypeEnum, 'OBSTRUCTION', INDETERMINATE) -transition = express_getattr(IfcDuctFittingTypeEnum, 'TRANSITION', INDETERMINATE) -userdefined = express_getattr(IfcDuctFittingTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDuctFittingTypeEnum, 'NOTDEFINED', INDETERMINATE) +bend = IfcDuctFittingTypeEnum.BEND +connector = IfcDuctFittingTypeEnum.CONNECTOR +entry = IfcDuctFittingTypeEnum.ENTRY +exit = IfcDuctFittingTypeEnum.EXIT +junction = IfcDuctFittingTypeEnum.JUNCTION +obstruction = IfcDuctFittingTypeEnum.OBSTRUCTION +transition = IfcDuctFittingTypeEnum.TRANSITION +userdefined = IfcDuctFittingTypeEnum.USERDEFINED +notdefined = IfcDuctFittingTypeEnum.NOTDEFINED IfcDuctSegmentTypeEnum = enum_namespace() -flexiblesegment = express_getattr(IfcDuctSegmentTypeEnum, 'FLEXIBLESEGMENT', INDETERMINATE) -rigidsegment = express_getattr(IfcDuctSegmentTypeEnum, 'RIGIDSEGMENT', INDETERMINATE) -userdefined = express_getattr(IfcDuctSegmentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDuctSegmentTypeEnum, 'NOTDEFINED', INDETERMINATE) +flexiblesegment = IfcDuctSegmentTypeEnum.FLEXIBLESEGMENT +rigidsegment = IfcDuctSegmentTypeEnum.RIGIDSEGMENT +userdefined = IfcDuctSegmentTypeEnum.USERDEFINED +notdefined = IfcDuctSegmentTypeEnum.NOTDEFINED IfcDuctSilencerTypeEnum = enum_namespace() -flatoval = express_getattr(IfcDuctSilencerTypeEnum, 'FLATOVAL', INDETERMINATE) -rectangular = express_getattr(IfcDuctSilencerTypeEnum, 'RECTANGULAR', INDETERMINATE) -round = express_getattr(IfcDuctSilencerTypeEnum, 'ROUND', INDETERMINATE) -userdefined = express_getattr(IfcDuctSilencerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDuctSilencerTypeEnum, 'NOTDEFINED', INDETERMINATE) +flatoval = IfcDuctSilencerTypeEnum.FLATOVAL +rectangular = IfcDuctSilencerTypeEnum.RECTANGULAR +round = IfcDuctSilencerTypeEnum.ROUND +userdefined = IfcDuctSilencerTypeEnum.USERDEFINED +notdefined = IfcDuctSilencerTypeEnum.NOTDEFINED IfcEarthworksCutTypeEnum = enum_namespace() -base_excavation = express_getattr(IfcEarthworksCutTypeEnum, 'BASE_EXCAVATION', INDETERMINATE) -cut = express_getattr(IfcEarthworksCutTypeEnum, 'CUT', INDETERMINATE) -dredging = express_getattr(IfcEarthworksCutTypeEnum, 'DREDGING', INDETERMINATE) -excavation = express_getattr(IfcEarthworksCutTypeEnum, 'EXCAVATION', INDETERMINATE) -overexcavation = express_getattr(IfcEarthworksCutTypeEnum, 'OVEREXCAVATION', INDETERMINATE) -pavementmilling = express_getattr(IfcEarthworksCutTypeEnum, 'PAVEMENTMILLING', INDETERMINATE) -stepexcavation = express_getattr(IfcEarthworksCutTypeEnum, 'STEPEXCAVATION', INDETERMINATE) -topsoilremoval = express_getattr(IfcEarthworksCutTypeEnum, 'TOPSOILREMOVAL', INDETERMINATE) -trench = express_getattr(IfcEarthworksCutTypeEnum, 'TRENCH', INDETERMINATE) -userdefined = express_getattr(IfcEarthworksCutTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcEarthworksCutTypeEnum, 'NOTDEFINED', INDETERMINATE) +base_excavation = IfcEarthworksCutTypeEnum.BASE_EXCAVATION +cut = IfcEarthworksCutTypeEnum.CUT +dredging = IfcEarthworksCutTypeEnum.DREDGING +excavation = IfcEarthworksCutTypeEnum.EXCAVATION +overexcavation = IfcEarthworksCutTypeEnum.OVEREXCAVATION +pavementmilling = IfcEarthworksCutTypeEnum.PAVEMENTMILLING +stepexcavation = IfcEarthworksCutTypeEnum.STEPEXCAVATION +topsoilremoval = IfcEarthworksCutTypeEnum.TOPSOILREMOVAL +trench = IfcEarthworksCutTypeEnum.TRENCH +userdefined = IfcEarthworksCutTypeEnum.USERDEFINED +notdefined = IfcEarthworksCutTypeEnum.NOTDEFINED IfcEarthworksFillTypeEnum = enum_namespace() -backfill = express_getattr(IfcEarthworksFillTypeEnum, 'BACKFILL', INDETERMINATE) -counterweight = express_getattr(IfcEarthworksFillTypeEnum, 'COUNTERWEIGHT', INDETERMINATE) -embankment = express_getattr(IfcEarthworksFillTypeEnum, 'EMBANKMENT', INDETERMINATE) -slopefill = express_getattr(IfcEarthworksFillTypeEnum, 'SLOPEFILL', INDETERMINATE) -subgrade = express_getattr(IfcEarthworksFillTypeEnum, 'SUBGRADE', INDETERMINATE) -subgradebed = express_getattr(IfcEarthworksFillTypeEnum, 'SUBGRADEBED', INDETERMINATE) -transitionsection = express_getattr(IfcEarthworksFillTypeEnum, 'TRANSITIONSECTION', INDETERMINATE) -userdefined = express_getattr(IfcEarthworksFillTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcEarthworksFillTypeEnum, 'NOTDEFINED', INDETERMINATE) +backfill = IfcEarthworksFillTypeEnum.BACKFILL +counterweight = IfcEarthworksFillTypeEnum.COUNTERWEIGHT +embankment = IfcEarthworksFillTypeEnum.EMBANKMENT +slopefill = IfcEarthworksFillTypeEnum.SLOPEFILL +subgrade = IfcEarthworksFillTypeEnum.SUBGRADE +subgradebed = IfcEarthworksFillTypeEnum.SUBGRADEBED +transitionsection = IfcEarthworksFillTypeEnum.TRANSITIONSECTION +userdefined = IfcEarthworksFillTypeEnum.USERDEFINED +notdefined = IfcEarthworksFillTypeEnum.NOTDEFINED IfcElectricApplianceTypeEnum = enum_namespace() -dishwasher = express_getattr(IfcElectricApplianceTypeEnum, 'DISHWASHER', INDETERMINATE) -electriccooker = express_getattr(IfcElectricApplianceTypeEnum, 'ELECTRICCOOKER', INDETERMINATE) -freestandingelectricheater = express_getattr(IfcElectricApplianceTypeEnum, 'FREESTANDINGELECTRICHEATER', INDETERMINATE) -freestandingfan = express_getattr(IfcElectricApplianceTypeEnum, 'FREESTANDINGFAN', INDETERMINATE) -freestandingwatercooler = express_getattr(IfcElectricApplianceTypeEnum, 'FREESTANDINGWATERCOOLER', INDETERMINATE) -freestandingwaterheater = express_getattr(IfcElectricApplianceTypeEnum, 'FREESTANDINGWATERHEATER', INDETERMINATE) -freezer = express_getattr(IfcElectricApplianceTypeEnum, 'FREEZER', INDETERMINATE) -fridge_freezer = express_getattr(IfcElectricApplianceTypeEnum, 'FRIDGE_FREEZER', INDETERMINATE) -handdryer = express_getattr(IfcElectricApplianceTypeEnum, 'HANDDRYER', INDETERMINATE) -kitchenmachine = express_getattr(IfcElectricApplianceTypeEnum, 'KITCHENMACHINE', INDETERMINATE) -microwave = express_getattr(IfcElectricApplianceTypeEnum, 'MICROWAVE', INDETERMINATE) -photocopier = express_getattr(IfcElectricApplianceTypeEnum, 'PHOTOCOPIER', INDETERMINATE) -refrigerator = express_getattr(IfcElectricApplianceTypeEnum, 'REFRIGERATOR', INDETERMINATE) -tumbledryer = express_getattr(IfcElectricApplianceTypeEnum, 'TUMBLEDRYER', INDETERMINATE) -vendingmachine = express_getattr(IfcElectricApplianceTypeEnum, 'VENDINGMACHINE', INDETERMINATE) -washingmachine = express_getattr(IfcElectricApplianceTypeEnum, 'WASHINGMACHINE', INDETERMINATE) -userdefined = express_getattr(IfcElectricApplianceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcElectricApplianceTypeEnum, 'NOTDEFINED', INDETERMINATE) +dishwasher = IfcElectricApplianceTypeEnum.DISHWASHER +electriccooker = IfcElectricApplianceTypeEnum.ELECTRICCOOKER +freestandingelectricheater = IfcElectricApplianceTypeEnum.FREESTANDINGELECTRICHEATER +freestandingfan = IfcElectricApplianceTypeEnum.FREESTANDINGFAN +freestandingwatercooler = IfcElectricApplianceTypeEnum.FREESTANDINGWATERCOOLER +freestandingwaterheater = IfcElectricApplianceTypeEnum.FREESTANDINGWATERHEATER +freezer = IfcElectricApplianceTypeEnum.FREEZER +fridge_freezer = IfcElectricApplianceTypeEnum.FRIDGE_FREEZER +handdryer = IfcElectricApplianceTypeEnum.HANDDRYER +kitchenmachine = IfcElectricApplianceTypeEnum.KITCHENMACHINE +microwave = IfcElectricApplianceTypeEnum.MICROWAVE +photocopier = IfcElectricApplianceTypeEnum.PHOTOCOPIER +refrigerator = IfcElectricApplianceTypeEnum.REFRIGERATOR +tumbledryer = IfcElectricApplianceTypeEnum.TUMBLEDRYER +vendingmachine = IfcElectricApplianceTypeEnum.VENDINGMACHINE +washingmachine = IfcElectricApplianceTypeEnum.WASHINGMACHINE +userdefined = IfcElectricApplianceTypeEnum.USERDEFINED +notdefined = IfcElectricApplianceTypeEnum.NOTDEFINED IfcElectricDistributionBoardTypeEnum = enum_namespace() -consumerunit = express_getattr(IfcElectricDistributionBoardTypeEnum, 'CONSUMERUNIT', INDETERMINATE) -distributionboard = express_getattr(IfcElectricDistributionBoardTypeEnum, 'DISTRIBUTIONBOARD', INDETERMINATE) -motorcontrolcentre = express_getattr(IfcElectricDistributionBoardTypeEnum, 'MOTORCONTROLCENTRE', INDETERMINATE) -switchboard = express_getattr(IfcElectricDistributionBoardTypeEnum, 'SWITCHBOARD', INDETERMINATE) -userdefined = express_getattr(IfcElectricDistributionBoardTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcElectricDistributionBoardTypeEnum, 'NOTDEFINED', INDETERMINATE) +consumerunit = IfcElectricDistributionBoardTypeEnum.CONSUMERUNIT +distributionboard = IfcElectricDistributionBoardTypeEnum.DISTRIBUTIONBOARD +motorcontrolcentre = IfcElectricDistributionBoardTypeEnum.MOTORCONTROLCENTRE +switchboard = IfcElectricDistributionBoardTypeEnum.SWITCHBOARD +userdefined = IfcElectricDistributionBoardTypeEnum.USERDEFINED +notdefined = IfcElectricDistributionBoardTypeEnum.NOTDEFINED IfcElectricFlowStorageDeviceTypeEnum = enum_namespace() -battery = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'BATTERY', INDETERMINATE) -capacitor = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'CAPACITOR', INDETERMINATE) -capacitorbank = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'CAPACITORBANK', INDETERMINATE) -compensator = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'COMPENSATOR', INDETERMINATE) -harmonicfilter = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'HARMONICFILTER', INDETERMINATE) -inductor = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'INDUCTOR', INDETERMINATE) -inductorbank = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'INDUCTORBANK', INDETERMINATE) -recharger = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'RECHARGER', INDETERMINATE) -ups = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'UPS', INDETERMINATE) -userdefined = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'NOTDEFINED', INDETERMINATE) +battery = IfcElectricFlowStorageDeviceTypeEnum.BATTERY +capacitor = IfcElectricFlowStorageDeviceTypeEnum.CAPACITOR +capacitorbank = IfcElectricFlowStorageDeviceTypeEnum.CAPACITORBANK +compensator = IfcElectricFlowStorageDeviceTypeEnum.COMPENSATOR +harmonicfilter = IfcElectricFlowStorageDeviceTypeEnum.HARMONICFILTER +inductor = IfcElectricFlowStorageDeviceTypeEnum.INDUCTOR +inductorbank = IfcElectricFlowStorageDeviceTypeEnum.INDUCTORBANK +recharger = IfcElectricFlowStorageDeviceTypeEnum.RECHARGER +ups = IfcElectricFlowStorageDeviceTypeEnum.UPS +userdefined = IfcElectricFlowStorageDeviceTypeEnum.USERDEFINED +notdefined = IfcElectricFlowStorageDeviceTypeEnum.NOTDEFINED IfcElectricFlowTreatmentDeviceTypeEnum = enum_namespace() -electronicfilter = express_getattr(IfcElectricFlowTreatmentDeviceTypeEnum, 'ELECTRONICFILTER', INDETERMINATE) -userdefined = express_getattr(IfcElectricFlowTreatmentDeviceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcElectricFlowTreatmentDeviceTypeEnum, 'NOTDEFINED', INDETERMINATE) +electronicfilter = IfcElectricFlowTreatmentDeviceTypeEnum.ELECTRONICFILTER +userdefined = IfcElectricFlowTreatmentDeviceTypeEnum.USERDEFINED +notdefined = IfcElectricFlowTreatmentDeviceTypeEnum.NOTDEFINED IfcElectricGeneratorTypeEnum = enum_namespace() -chp = express_getattr(IfcElectricGeneratorTypeEnum, 'CHP', INDETERMINATE) -enginegenerator = express_getattr(IfcElectricGeneratorTypeEnum, 'ENGINEGENERATOR', INDETERMINATE) -standalone = express_getattr(IfcElectricGeneratorTypeEnum, 'STANDALONE', INDETERMINATE) -userdefined = express_getattr(IfcElectricGeneratorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcElectricGeneratorTypeEnum, 'NOTDEFINED', INDETERMINATE) +chp = IfcElectricGeneratorTypeEnum.CHP +enginegenerator = IfcElectricGeneratorTypeEnum.ENGINEGENERATOR +standalone = IfcElectricGeneratorTypeEnum.STANDALONE +userdefined = IfcElectricGeneratorTypeEnum.USERDEFINED +notdefined = IfcElectricGeneratorTypeEnum.NOTDEFINED IfcElectricMotorTypeEnum = enum_namespace() -dc = express_getattr(IfcElectricMotorTypeEnum, 'DC', INDETERMINATE) -induction = express_getattr(IfcElectricMotorTypeEnum, 'INDUCTION', INDETERMINATE) -polyphase = express_getattr(IfcElectricMotorTypeEnum, 'POLYPHASE', INDETERMINATE) -reluctancesynchronous = express_getattr(IfcElectricMotorTypeEnum, 'RELUCTANCESYNCHRONOUS', INDETERMINATE) -synchronous = express_getattr(IfcElectricMotorTypeEnum, 'SYNCHRONOUS', INDETERMINATE) -userdefined = express_getattr(IfcElectricMotorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcElectricMotorTypeEnum, 'NOTDEFINED', INDETERMINATE) +dc = IfcElectricMotorTypeEnum.DC +induction = IfcElectricMotorTypeEnum.INDUCTION +polyphase = IfcElectricMotorTypeEnum.POLYPHASE +reluctancesynchronous = IfcElectricMotorTypeEnum.RELUCTANCESYNCHRONOUS +synchronous = IfcElectricMotorTypeEnum.SYNCHRONOUS +userdefined = IfcElectricMotorTypeEnum.USERDEFINED +notdefined = IfcElectricMotorTypeEnum.NOTDEFINED IfcElectricTimeControlTypeEnum = enum_namespace() -relay = express_getattr(IfcElectricTimeControlTypeEnum, 'RELAY', INDETERMINATE) -timeclock = express_getattr(IfcElectricTimeControlTypeEnum, 'TIMECLOCK', INDETERMINATE) -timedelay = express_getattr(IfcElectricTimeControlTypeEnum, 'TIMEDELAY', INDETERMINATE) -userdefined = express_getattr(IfcElectricTimeControlTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcElectricTimeControlTypeEnum, 'NOTDEFINED', INDETERMINATE) +relay = IfcElectricTimeControlTypeEnum.RELAY +timeclock = IfcElectricTimeControlTypeEnum.TIMECLOCK +timedelay = IfcElectricTimeControlTypeEnum.TIMEDELAY +userdefined = IfcElectricTimeControlTypeEnum.USERDEFINED +notdefined = IfcElectricTimeControlTypeEnum.NOTDEFINED IfcElementAssemblyTypeEnum = enum_namespace() -abutment = express_getattr(IfcElementAssemblyTypeEnum, 'ABUTMENT', INDETERMINATE) -accessory_assembly = express_getattr(IfcElementAssemblyTypeEnum, 'ACCESSORY_ASSEMBLY', INDETERMINATE) -arch = express_getattr(IfcElementAssemblyTypeEnum, 'ARCH', INDETERMINATE) -beam_grid = express_getattr(IfcElementAssemblyTypeEnum, 'BEAM_GRID', INDETERMINATE) -braced_frame = express_getattr(IfcElementAssemblyTypeEnum, 'BRACED_FRAME', INDETERMINATE) -cross_bracing = express_getattr(IfcElementAssemblyTypeEnum, 'CROSS_BRACING', INDETERMINATE) -deck = express_getattr(IfcElementAssemblyTypeEnum, 'DECK', INDETERMINATE) -dilatationpanel = express_getattr(IfcElementAssemblyTypeEnum, 'DILATATIONPANEL', INDETERMINATE) -entranceworks = express_getattr(IfcElementAssemblyTypeEnum, 'ENTRANCEWORKS', INDETERMINATE) -girder = express_getattr(IfcElementAssemblyTypeEnum, 'GIRDER', INDETERMINATE) -grid = express_getattr(IfcElementAssemblyTypeEnum, 'GRID', INDETERMINATE) -mast = express_getattr(IfcElementAssemblyTypeEnum, 'MAST', INDETERMINATE) -pier = express_getattr(IfcElementAssemblyTypeEnum, 'PIER', INDETERMINATE) -pylon = express_getattr(IfcElementAssemblyTypeEnum, 'PYLON', INDETERMINATE) -rail_mechanical_equipment_assembly = express_getattr(IfcElementAssemblyTypeEnum, 'RAIL_MECHANICAL_EQUIPMENT_ASSEMBLY', INDETERMINATE) -reinforcement_unit = express_getattr(IfcElementAssemblyTypeEnum, 'REINFORCEMENT_UNIT', INDETERMINATE) -rigid_frame = express_getattr(IfcElementAssemblyTypeEnum, 'RIGID_FRAME', INDETERMINATE) -shelter = express_getattr(IfcElementAssemblyTypeEnum, 'SHELTER', INDETERMINATE) -signalassembly = express_getattr(IfcElementAssemblyTypeEnum, 'SIGNALASSEMBLY', INDETERMINATE) -slab_field = express_getattr(IfcElementAssemblyTypeEnum, 'SLAB_FIELD', INDETERMINATE) -sumpbuster = express_getattr(IfcElementAssemblyTypeEnum, 'SUMPBUSTER', INDETERMINATE) -supportingassembly = express_getattr(IfcElementAssemblyTypeEnum, 'SUPPORTINGASSEMBLY', INDETERMINATE) -suspensionassembly = express_getattr(IfcElementAssemblyTypeEnum, 'SUSPENSIONASSEMBLY', INDETERMINATE) -trackpanel = express_getattr(IfcElementAssemblyTypeEnum, 'TRACKPANEL', INDETERMINATE) -traction_switching_assembly = express_getattr(IfcElementAssemblyTypeEnum, 'TRACTION_SWITCHING_ASSEMBLY', INDETERMINATE) -traffic_calming_device = express_getattr(IfcElementAssemblyTypeEnum, 'TRAFFIC_CALMING_DEVICE', INDETERMINATE) -truss = express_getattr(IfcElementAssemblyTypeEnum, 'TRUSS', INDETERMINATE) -turnoutpanel = express_getattr(IfcElementAssemblyTypeEnum, 'TURNOUTPANEL', INDETERMINATE) -userdefined = express_getattr(IfcElementAssemblyTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcElementAssemblyTypeEnum, 'NOTDEFINED', INDETERMINATE) +abutment = IfcElementAssemblyTypeEnum.ABUTMENT +accessory_assembly = IfcElementAssemblyTypeEnum.ACCESSORY_ASSEMBLY +arch = IfcElementAssemblyTypeEnum.ARCH +beam_grid = IfcElementAssemblyTypeEnum.BEAM_GRID +braced_frame = IfcElementAssemblyTypeEnum.BRACED_FRAME +cross_bracing = IfcElementAssemblyTypeEnum.CROSS_BRACING +deck = IfcElementAssemblyTypeEnum.DECK +dilatationpanel = IfcElementAssemblyTypeEnum.DILATATIONPANEL +entranceworks = IfcElementAssemblyTypeEnum.ENTRANCEWORKS +girder = IfcElementAssemblyTypeEnum.GIRDER +grid = IfcElementAssemblyTypeEnum.GRID +mast = IfcElementAssemblyTypeEnum.MAST +pier = IfcElementAssemblyTypeEnum.PIER +pylon = IfcElementAssemblyTypeEnum.PYLON +rail_mechanical_equipment_assembly = IfcElementAssemblyTypeEnum.RAIL_MECHANICAL_EQUIPMENT_ASSEMBLY +reinforcement_unit = IfcElementAssemblyTypeEnum.REINFORCEMENT_UNIT +rigid_frame = IfcElementAssemblyTypeEnum.RIGID_FRAME +shelter = IfcElementAssemblyTypeEnum.SHELTER +signalassembly = IfcElementAssemblyTypeEnum.SIGNALASSEMBLY +slab_field = IfcElementAssemblyTypeEnum.SLAB_FIELD +sumpbuster = IfcElementAssemblyTypeEnum.SUMPBUSTER +supportingassembly = IfcElementAssemblyTypeEnum.SUPPORTINGASSEMBLY +suspensionassembly = IfcElementAssemblyTypeEnum.SUSPENSIONASSEMBLY +trackpanel = IfcElementAssemblyTypeEnum.TRACKPANEL +traction_switching_assembly = IfcElementAssemblyTypeEnum.TRACTION_SWITCHING_ASSEMBLY +traffic_calming_device = IfcElementAssemblyTypeEnum.TRAFFIC_CALMING_DEVICE +truss = IfcElementAssemblyTypeEnum.TRUSS +turnoutpanel = IfcElementAssemblyTypeEnum.TURNOUTPANEL +userdefined = IfcElementAssemblyTypeEnum.USERDEFINED +notdefined = IfcElementAssemblyTypeEnum.NOTDEFINED IfcElementCompositionEnum = enum_namespace() -complex = express_getattr(IfcElementCompositionEnum, 'COMPLEX', INDETERMINATE) -element = express_getattr(IfcElementCompositionEnum, 'ELEMENT', INDETERMINATE) -partial = express_getattr(IfcElementCompositionEnum, 'PARTIAL', INDETERMINATE) +complex = IfcElementCompositionEnum.COMPLEX +element = IfcElementCompositionEnum.ELEMENT +partial = IfcElementCompositionEnum.PARTIAL IfcEngineTypeEnum = enum_namespace() -externalcombustion = express_getattr(IfcEngineTypeEnum, 'EXTERNALCOMBUSTION', INDETERMINATE) -internalcombustion = express_getattr(IfcEngineTypeEnum, 'INTERNALCOMBUSTION', INDETERMINATE) -userdefined = express_getattr(IfcEngineTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcEngineTypeEnum, 'NOTDEFINED', INDETERMINATE) +externalcombustion = IfcEngineTypeEnum.EXTERNALCOMBUSTION +internalcombustion = IfcEngineTypeEnum.INTERNALCOMBUSTION +userdefined = IfcEngineTypeEnum.USERDEFINED +notdefined = IfcEngineTypeEnum.NOTDEFINED IfcEvaporativeCoolerTypeEnum = enum_namespace() -directevaporativeairwasher = express_getattr(IfcEvaporativeCoolerTypeEnum, 'DIRECTEVAPORATIVEAIRWASHER', INDETERMINATE) -directevaporativepackagedrotaryaircooler = express_getattr(IfcEvaporativeCoolerTypeEnum, 'DIRECTEVAPORATIVEPACKAGEDROTARYAIRCOOLER', INDETERMINATE) -directevaporativerandommediaaircooler = express_getattr(IfcEvaporativeCoolerTypeEnum, 'DIRECTEVAPORATIVERANDOMMEDIAAIRCOOLER', INDETERMINATE) -directevaporativerigidmediaaircooler = express_getattr(IfcEvaporativeCoolerTypeEnum, 'DIRECTEVAPORATIVERIGIDMEDIAAIRCOOLER', INDETERMINATE) -directevaporativeslingerspackagedaircooler = express_getattr(IfcEvaporativeCoolerTypeEnum, 'DIRECTEVAPORATIVESLINGERSPACKAGEDAIRCOOLER', INDETERMINATE) -indirectdirectcombination = express_getattr(IfcEvaporativeCoolerTypeEnum, 'INDIRECTDIRECTCOMBINATION', INDETERMINATE) -indirectevaporativecoolingtowerorcoilcooler = express_getattr(IfcEvaporativeCoolerTypeEnum, 'INDIRECTEVAPORATIVECOOLINGTOWERORCOILCOOLER', INDETERMINATE) -indirectevaporativepackageaircooler = express_getattr(IfcEvaporativeCoolerTypeEnum, 'INDIRECTEVAPORATIVEPACKAGEAIRCOOLER', INDETERMINATE) -indirectevaporativewetcoil = express_getattr(IfcEvaporativeCoolerTypeEnum, 'INDIRECTEVAPORATIVEWETCOIL', INDETERMINATE) -userdefined = express_getattr(IfcEvaporativeCoolerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcEvaporativeCoolerTypeEnum, 'NOTDEFINED', INDETERMINATE) +directevaporativeairwasher = IfcEvaporativeCoolerTypeEnum.DIRECTEVAPORATIVEAIRWASHER +directevaporativepackagedrotaryaircooler = IfcEvaporativeCoolerTypeEnum.DIRECTEVAPORATIVEPACKAGEDROTARYAIRCOOLER +directevaporativerandommediaaircooler = IfcEvaporativeCoolerTypeEnum.DIRECTEVAPORATIVERANDOMMEDIAAIRCOOLER +directevaporativerigidmediaaircooler = IfcEvaporativeCoolerTypeEnum.DIRECTEVAPORATIVERIGIDMEDIAAIRCOOLER +directevaporativeslingerspackagedaircooler = IfcEvaporativeCoolerTypeEnum.DIRECTEVAPORATIVESLINGERSPACKAGEDAIRCOOLER +indirectdirectcombination = IfcEvaporativeCoolerTypeEnum.INDIRECTDIRECTCOMBINATION +indirectevaporativecoolingtowerorcoilcooler = IfcEvaporativeCoolerTypeEnum.INDIRECTEVAPORATIVECOOLINGTOWERORCOILCOOLER +indirectevaporativepackageaircooler = IfcEvaporativeCoolerTypeEnum.INDIRECTEVAPORATIVEPACKAGEAIRCOOLER +indirectevaporativewetcoil = IfcEvaporativeCoolerTypeEnum.INDIRECTEVAPORATIVEWETCOIL +userdefined = IfcEvaporativeCoolerTypeEnum.USERDEFINED +notdefined = IfcEvaporativeCoolerTypeEnum.NOTDEFINED IfcEvaporatorTypeEnum = enum_namespace() -directexpansion = express_getattr(IfcEvaporatorTypeEnum, 'DIRECTEXPANSION', INDETERMINATE) -directexpansionbrazedplate = express_getattr(IfcEvaporatorTypeEnum, 'DIRECTEXPANSIONBRAZEDPLATE', INDETERMINATE) -directexpansionshellandtube = express_getattr(IfcEvaporatorTypeEnum, 'DIRECTEXPANSIONSHELLANDTUBE', INDETERMINATE) -directexpansiontubeintube = express_getattr(IfcEvaporatorTypeEnum, 'DIRECTEXPANSIONTUBEINTUBE', INDETERMINATE) -floodedshellandtube = express_getattr(IfcEvaporatorTypeEnum, 'FLOODEDSHELLANDTUBE', INDETERMINATE) -shellandcoil = express_getattr(IfcEvaporatorTypeEnum, 'SHELLANDCOIL', INDETERMINATE) -userdefined = express_getattr(IfcEvaporatorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcEvaporatorTypeEnum, 'NOTDEFINED', INDETERMINATE) +directexpansion = IfcEvaporatorTypeEnum.DIRECTEXPANSION +directexpansionbrazedplate = IfcEvaporatorTypeEnum.DIRECTEXPANSIONBRAZEDPLATE +directexpansionshellandtube = IfcEvaporatorTypeEnum.DIRECTEXPANSIONSHELLANDTUBE +directexpansiontubeintube = IfcEvaporatorTypeEnum.DIRECTEXPANSIONTUBEINTUBE +floodedshellandtube = IfcEvaporatorTypeEnum.FLOODEDSHELLANDTUBE +shellandcoil = IfcEvaporatorTypeEnum.SHELLANDCOIL +userdefined = IfcEvaporatorTypeEnum.USERDEFINED +notdefined = IfcEvaporatorTypeEnum.NOTDEFINED IfcEventTriggerTypeEnum = enum_namespace() -eventcomplex = express_getattr(IfcEventTriggerTypeEnum, 'EVENTCOMPLEX', INDETERMINATE) -eventmessage = express_getattr(IfcEventTriggerTypeEnum, 'EVENTMESSAGE', INDETERMINATE) -eventrule = express_getattr(IfcEventTriggerTypeEnum, 'EVENTRULE', INDETERMINATE) -eventtime = express_getattr(IfcEventTriggerTypeEnum, 'EVENTTIME', INDETERMINATE) -userdefined = express_getattr(IfcEventTriggerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcEventTriggerTypeEnum, 'NOTDEFINED', INDETERMINATE) +eventcomplex = IfcEventTriggerTypeEnum.EVENTCOMPLEX +eventmessage = IfcEventTriggerTypeEnum.EVENTMESSAGE +eventrule = IfcEventTriggerTypeEnum.EVENTRULE +eventtime = IfcEventTriggerTypeEnum.EVENTTIME +userdefined = IfcEventTriggerTypeEnum.USERDEFINED +notdefined = IfcEventTriggerTypeEnum.NOTDEFINED IfcEventTypeEnum = enum_namespace() -endevent = express_getattr(IfcEventTypeEnum, 'ENDEVENT', INDETERMINATE) -intermediateevent = express_getattr(IfcEventTypeEnum, 'INTERMEDIATEEVENT', INDETERMINATE) -startevent = express_getattr(IfcEventTypeEnum, 'STARTEVENT', INDETERMINATE) -userdefined = express_getattr(IfcEventTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcEventTypeEnum, 'NOTDEFINED', INDETERMINATE) +endevent = IfcEventTypeEnum.ENDEVENT +intermediateevent = IfcEventTypeEnum.INTERMEDIATEEVENT +startevent = IfcEventTypeEnum.STARTEVENT +userdefined = IfcEventTypeEnum.USERDEFINED +notdefined = IfcEventTypeEnum.NOTDEFINED IfcExternalSpatialElementTypeEnum = enum_namespace() -external = express_getattr(IfcExternalSpatialElementTypeEnum, 'EXTERNAL', INDETERMINATE) -external_earth = express_getattr(IfcExternalSpatialElementTypeEnum, 'EXTERNAL_EARTH', INDETERMINATE) -external_fire = express_getattr(IfcExternalSpatialElementTypeEnum, 'EXTERNAL_FIRE', INDETERMINATE) -external_water = express_getattr(IfcExternalSpatialElementTypeEnum, 'EXTERNAL_WATER', INDETERMINATE) -userdefined = express_getattr(IfcExternalSpatialElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcExternalSpatialElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +external = IfcExternalSpatialElementTypeEnum.EXTERNAL +external_earth = IfcExternalSpatialElementTypeEnum.EXTERNAL_EARTH +external_fire = IfcExternalSpatialElementTypeEnum.EXTERNAL_FIRE +external_water = IfcExternalSpatialElementTypeEnum.EXTERNAL_WATER +userdefined = IfcExternalSpatialElementTypeEnum.USERDEFINED +notdefined = IfcExternalSpatialElementTypeEnum.NOTDEFINED IfcFacilityPartCommonTypeEnum = enum_namespace() -aboveground = express_getattr(IfcFacilityPartCommonTypeEnum, 'ABOVEGROUND', INDETERMINATE) -belowground = express_getattr(IfcFacilityPartCommonTypeEnum, 'BELOWGROUND', INDETERMINATE) -junction = express_getattr(IfcFacilityPartCommonTypeEnum, 'JUNCTION', INDETERMINATE) -levelcrossing = express_getattr(IfcFacilityPartCommonTypeEnum, 'LEVELCROSSING', INDETERMINATE) -segment = express_getattr(IfcFacilityPartCommonTypeEnum, 'SEGMENT', INDETERMINATE) -substructure = express_getattr(IfcFacilityPartCommonTypeEnum, 'SUBSTRUCTURE', INDETERMINATE) -superstructure = express_getattr(IfcFacilityPartCommonTypeEnum, 'SUPERSTRUCTURE', INDETERMINATE) -terminal = express_getattr(IfcFacilityPartCommonTypeEnum, 'TERMINAL', INDETERMINATE) -userdefined = express_getattr(IfcFacilityPartCommonTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFacilityPartCommonTypeEnum, 'NOTDEFINED', INDETERMINATE) +aboveground = IfcFacilityPartCommonTypeEnum.ABOVEGROUND +belowground = IfcFacilityPartCommonTypeEnum.BELOWGROUND +junction = IfcFacilityPartCommonTypeEnum.JUNCTION +levelcrossing = IfcFacilityPartCommonTypeEnum.LEVELCROSSING +segment = IfcFacilityPartCommonTypeEnum.SEGMENT +substructure = IfcFacilityPartCommonTypeEnum.SUBSTRUCTURE +superstructure = IfcFacilityPartCommonTypeEnum.SUPERSTRUCTURE +terminal = IfcFacilityPartCommonTypeEnum.TERMINAL +userdefined = IfcFacilityPartCommonTypeEnum.USERDEFINED +notdefined = IfcFacilityPartCommonTypeEnum.NOTDEFINED IfcFacilityUsageEnum = enum_namespace() -lateral = express_getattr(IfcFacilityUsageEnum, 'LATERAL', INDETERMINATE) -longitudinal = express_getattr(IfcFacilityUsageEnum, 'LONGITUDINAL', INDETERMINATE) -region = express_getattr(IfcFacilityUsageEnum, 'REGION', INDETERMINATE) -vertical = express_getattr(IfcFacilityUsageEnum, 'VERTICAL', INDETERMINATE) -userdefined = express_getattr(IfcFacilityUsageEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFacilityUsageEnum, 'NOTDEFINED', INDETERMINATE) +lateral = IfcFacilityUsageEnum.LATERAL +longitudinal = IfcFacilityUsageEnum.LONGITUDINAL +region = IfcFacilityUsageEnum.REGION +vertical = IfcFacilityUsageEnum.VERTICAL +userdefined = IfcFacilityUsageEnum.USERDEFINED +notdefined = IfcFacilityUsageEnum.NOTDEFINED IfcFanTypeEnum = enum_namespace() -centrifugalairfoil = express_getattr(IfcFanTypeEnum, 'CENTRIFUGALAIRFOIL', INDETERMINATE) -centrifugalbackwardinclinedcurved = express_getattr(IfcFanTypeEnum, 'CENTRIFUGALBACKWARDINCLINEDCURVED', INDETERMINATE) -centrifugalforwardcurved = express_getattr(IfcFanTypeEnum, 'CENTRIFUGALFORWARDCURVED', INDETERMINATE) -centrifugalradial = express_getattr(IfcFanTypeEnum, 'CENTRIFUGALRADIAL', INDETERMINATE) -propelloraxial = express_getattr(IfcFanTypeEnum, 'PROPELLORAXIAL', INDETERMINATE) -tubeaxial = express_getattr(IfcFanTypeEnum, 'TUBEAXIAL', INDETERMINATE) -vaneaxial = express_getattr(IfcFanTypeEnum, 'VANEAXIAL', INDETERMINATE) -userdefined = express_getattr(IfcFanTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFanTypeEnum, 'NOTDEFINED', INDETERMINATE) +centrifugalairfoil = IfcFanTypeEnum.CENTRIFUGALAIRFOIL +centrifugalbackwardinclinedcurved = IfcFanTypeEnum.CENTRIFUGALBACKWARDINCLINEDCURVED +centrifugalforwardcurved = IfcFanTypeEnum.CENTRIFUGALFORWARDCURVED +centrifugalradial = IfcFanTypeEnum.CENTRIFUGALRADIAL +propelloraxial = IfcFanTypeEnum.PROPELLORAXIAL +tubeaxial = IfcFanTypeEnum.TUBEAXIAL +vaneaxial = IfcFanTypeEnum.VANEAXIAL +userdefined = IfcFanTypeEnum.USERDEFINED +notdefined = IfcFanTypeEnum.NOTDEFINED IfcFastenerTypeEnum = enum_namespace() -glue = express_getattr(IfcFastenerTypeEnum, 'GLUE', INDETERMINATE) -mortar = express_getattr(IfcFastenerTypeEnum, 'MORTAR', INDETERMINATE) -weld = express_getattr(IfcFastenerTypeEnum, 'WELD', INDETERMINATE) -userdefined = express_getattr(IfcFastenerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFastenerTypeEnum, 'NOTDEFINED', INDETERMINATE) +glue = IfcFastenerTypeEnum.GLUE +mortar = IfcFastenerTypeEnum.MORTAR +weld = IfcFastenerTypeEnum.WELD +userdefined = IfcFastenerTypeEnum.USERDEFINED +notdefined = IfcFastenerTypeEnum.NOTDEFINED IfcFilterTypeEnum = enum_namespace() -airparticlefilter = express_getattr(IfcFilterTypeEnum, 'AIRPARTICLEFILTER', INDETERMINATE) -compressedairfilter = express_getattr(IfcFilterTypeEnum, 'COMPRESSEDAIRFILTER', INDETERMINATE) -odorfilter = express_getattr(IfcFilterTypeEnum, 'ODORFILTER', INDETERMINATE) -oilfilter = express_getattr(IfcFilterTypeEnum, 'OILFILTER', INDETERMINATE) -strainer = express_getattr(IfcFilterTypeEnum, 'STRAINER', INDETERMINATE) -waterfilter = express_getattr(IfcFilterTypeEnum, 'WATERFILTER', INDETERMINATE) -userdefined = express_getattr(IfcFilterTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFilterTypeEnum, 'NOTDEFINED', INDETERMINATE) +airparticlefilter = IfcFilterTypeEnum.AIRPARTICLEFILTER +compressedairfilter = IfcFilterTypeEnum.COMPRESSEDAIRFILTER +odorfilter = IfcFilterTypeEnum.ODORFILTER +oilfilter = IfcFilterTypeEnum.OILFILTER +strainer = IfcFilterTypeEnum.STRAINER +waterfilter = IfcFilterTypeEnum.WATERFILTER +userdefined = IfcFilterTypeEnum.USERDEFINED +notdefined = IfcFilterTypeEnum.NOTDEFINED IfcFireSuppressionTerminalTypeEnum = enum_namespace() -breechinginlet = express_getattr(IfcFireSuppressionTerminalTypeEnum, 'BREECHINGINLET', INDETERMINATE) -firehydrant = express_getattr(IfcFireSuppressionTerminalTypeEnum, 'FIREHYDRANT', INDETERMINATE) -firemonitor = express_getattr(IfcFireSuppressionTerminalTypeEnum, 'FIREMONITOR', INDETERMINATE) -hosereel = express_getattr(IfcFireSuppressionTerminalTypeEnum, 'HOSEREEL', INDETERMINATE) -sprinkler = express_getattr(IfcFireSuppressionTerminalTypeEnum, 'SPRINKLER', INDETERMINATE) -sprinklerdeflector = express_getattr(IfcFireSuppressionTerminalTypeEnum, 'SPRINKLERDEFLECTOR', INDETERMINATE) -userdefined = express_getattr(IfcFireSuppressionTerminalTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFireSuppressionTerminalTypeEnum, 'NOTDEFINED', INDETERMINATE) +breechinginlet = IfcFireSuppressionTerminalTypeEnum.BREECHINGINLET +firehydrant = IfcFireSuppressionTerminalTypeEnum.FIREHYDRANT +firemonitor = IfcFireSuppressionTerminalTypeEnum.FIREMONITOR +hosereel = IfcFireSuppressionTerminalTypeEnum.HOSEREEL +sprinkler = IfcFireSuppressionTerminalTypeEnum.SPRINKLER +sprinklerdeflector = IfcFireSuppressionTerminalTypeEnum.SPRINKLERDEFLECTOR +userdefined = IfcFireSuppressionTerminalTypeEnum.USERDEFINED +notdefined = IfcFireSuppressionTerminalTypeEnum.NOTDEFINED IfcFlowDirectionEnum = enum_namespace() -sink = express_getattr(IfcFlowDirectionEnum, 'SINK', INDETERMINATE) -source = express_getattr(IfcFlowDirectionEnum, 'SOURCE', INDETERMINATE) -sourceandsink = express_getattr(IfcFlowDirectionEnum, 'SOURCEANDSINK', INDETERMINATE) -notdefined = express_getattr(IfcFlowDirectionEnum, 'NOTDEFINED', INDETERMINATE) +sink = IfcFlowDirectionEnum.SINK +source = IfcFlowDirectionEnum.SOURCE +sourceandsink = IfcFlowDirectionEnum.SOURCEANDSINK +notdefined = IfcFlowDirectionEnum.NOTDEFINED IfcFlowInstrumentTypeEnum = enum_namespace() -ammeter = express_getattr(IfcFlowInstrumentTypeEnum, 'AMMETER', INDETERMINATE) -combined = express_getattr(IfcFlowInstrumentTypeEnum, 'COMBINED', INDETERMINATE) -frequencymeter = express_getattr(IfcFlowInstrumentTypeEnum, 'FREQUENCYMETER', INDETERMINATE) -phaseanglemeter = express_getattr(IfcFlowInstrumentTypeEnum, 'PHASEANGLEMETER', INDETERMINATE) -powerfactormeter = express_getattr(IfcFlowInstrumentTypeEnum, 'POWERFACTORMETER', INDETERMINATE) -pressuregauge = express_getattr(IfcFlowInstrumentTypeEnum, 'PRESSUREGAUGE', INDETERMINATE) -thermometer = express_getattr(IfcFlowInstrumentTypeEnum, 'THERMOMETER', INDETERMINATE) -voltmeter = express_getattr(IfcFlowInstrumentTypeEnum, 'VOLTMETER', INDETERMINATE) -voltmeter_peak = express_getattr(IfcFlowInstrumentTypeEnum, 'VOLTMETER_PEAK', INDETERMINATE) -voltmeter_rms = express_getattr(IfcFlowInstrumentTypeEnum, 'VOLTMETER_RMS', INDETERMINATE) -userdefined = express_getattr(IfcFlowInstrumentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFlowInstrumentTypeEnum, 'NOTDEFINED', INDETERMINATE) +ammeter = IfcFlowInstrumentTypeEnum.AMMETER +combined = IfcFlowInstrumentTypeEnum.COMBINED +frequencymeter = IfcFlowInstrumentTypeEnum.FREQUENCYMETER +phaseanglemeter = IfcFlowInstrumentTypeEnum.PHASEANGLEMETER +powerfactormeter = IfcFlowInstrumentTypeEnum.POWERFACTORMETER +pressuregauge = IfcFlowInstrumentTypeEnum.PRESSUREGAUGE +thermometer = IfcFlowInstrumentTypeEnum.THERMOMETER +voltmeter = IfcFlowInstrumentTypeEnum.VOLTMETER +voltmeter_peak = IfcFlowInstrumentTypeEnum.VOLTMETER_PEAK +voltmeter_rms = IfcFlowInstrumentTypeEnum.VOLTMETER_RMS +userdefined = IfcFlowInstrumentTypeEnum.USERDEFINED +notdefined = IfcFlowInstrumentTypeEnum.NOTDEFINED IfcFlowMeterTypeEnum = enum_namespace() -energymeter = express_getattr(IfcFlowMeterTypeEnum, 'ENERGYMETER', INDETERMINATE) -gasmeter = express_getattr(IfcFlowMeterTypeEnum, 'GASMETER', INDETERMINATE) -oilmeter = express_getattr(IfcFlowMeterTypeEnum, 'OILMETER', INDETERMINATE) -watermeter = express_getattr(IfcFlowMeterTypeEnum, 'WATERMETER', INDETERMINATE) -userdefined = express_getattr(IfcFlowMeterTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFlowMeterTypeEnum, 'NOTDEFINED', INDETERMINATE) +energymeter = IfcFlowMeterTypeEnum.ENERGYMETER +gasmeter = IfcFlowMeterTypeEnum.GASMETER +oilmeter = IfcFlowMeterTypeEnum.OILMETER +watermeter = IfcFlowMeterTypeEnum.WATERMETER +userdefined = IfcFlowMeterTypeEnum.USERDEFINED +notdefined = IfcFlowMeterTypeEnum.NOTDEFINED IfcFootingTypeEnum = enum_namespace() -caisson_foundation = express_getattr(IfcFootingTypeEnum, 'CAISSON_FOUNDATION', INDETERMINATE) -footing_beam = express_getattr(IfcFootingTypeEnum, 'FOOTING_BEAM', INDETERMINATE) -pad_footing = express_getattr(IfcFootingTypeEnum, 'PAD_FOOTING', INDETERMINATE) -pile_cap = express_getattr(IfcFootingTypeEnum, 'PILE_CAP', INDETERMINATE) -strip_footing = express_getattr(IfcFootingTypeEnum, 'STRIP_FOOTING', INDETERMINATE) -userdefined = express_getattr(IfcFootingTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFootingTypeEnum, 'NOTDEFINED', INDETERMINATE) +caisson_foundation = IfcFootingTypeEnum.CAISSON_FOUNDATION +footing_beam = IfcFootingTypeEnum.FOOTING_BEAM +pad_footing = IfcFootingTypeEnum.PAD_FOOTING +pile_cap = IfcFootingTypeEnum.PILE_CAP +strip_footing = IfcFootingTypeEnum.STRIP_FOOTING +userdefined = IfcFootingTypeEnum.USERDEFINED +notdefined = IfcFootingTypeEnum.NOTDEFINED IfcFurnitureTypeEnum = enum_namespace() -bed = express_getattr(IfcFurnitureTypeEnum, 'BED', INDETERMINATE) -chair = express_getattr(IfcFurnitureTypeEnum, 'CHAIR', INDETERMINATE) -desk = express_getattr(IfcFurnitureTypeEnum, 'DESK', INDETERMINATE) -filecabinet = express_getattr(IfcFurnitureTypeEnum, 'FILECABINET', INDETERMINATE) -shelf = express_getattr(IfcFurnitureTypeEnum, 'SHELF', INDETERMINATE) -sofa = express_getattr(IfcFurnitureTypeEnum, 'SOFA', INDETERMINATE) -table = express_getattr(IfcFurnitureTypeEnum, 'TABLE', INDETERMINATE) -technicalcabinet = express_getattr(IfcFurnitureTypeEnum, 'TECHNICALCABINET', INDETERMINATE) -userdefined = express_getattr(IfcFurnitureTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFurnitureTypeEnum, 'NOTDEFINED', INDETERMINATE) +bed = IfcFurnitureTypeEnum.BED +chair = IfcFurnitureTypeEnum.CHAIR +desk = IfcFurnitureTypeEnum.DESK +filecabinet = IfcFurnitureTypeEnum.FILECABINET +shelf = IfcFurnitureTypeEnum.SHELF +sofa = IfcFurnitureTypeEnum.SOFA +table = IfcFurnitureTypeEnum.TABLE +technicalcabinet = IfcFurnitureTypeEnum.TECHNICALCABINET +userdefined = IfcFurnitureTypeEnum.USERDEFINED +notdefined = IfcFurnitureTypeEnum.NOTDEFINED IfcGeographicElementTypeEnum = enum_namespace() -soil_boring_point = express_getattr(IfcGeographicElementTypeEnum, 'SOIL_BORING_POINT', INDETERMINATE) -terrain = express_getattr(IfcGeographicElementTypeEnum, 'TERRAIN', INDETERMINATE) -vegetation = express_getattr(IfcGeographicElementTypeEnum, 'VEGETATION', INDETERMINATE) -userdefined = express_getattr(IfcGeographicElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcGeographicElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +soil_boring_point = IfcGeographicElementTypeEnum.SOIL_BORING_POINT +terrain = IfcGeographicElementTypeEnum.TERRAIN +vegetation = IfcGeographicElementTypeEnum.VEGETATION +userdefined = IfcGeographicElementTypeEnum.USERDEFINED +notdefined = IfcGeographicElementTypeEnum.NOTDEFINED IfcGeometricProjectionEnum = enum_namespace() -elevation_view = express_getattr(IfcGeometricProjectionEnum, 'ELEVATION_VIEW', INDETERMINATE) -graph_view = express_getattr(IfcGeometricProjectionEnum, 'GRAPH_VIEW', INDETERMINATE) -model_view = express_getattr(IfcGeometricProjectionEnum, 'MODEL_VIEW', INDETERMINATE) -plan_view = express_getattr(IfcGeometricProjectionEnum, 'PLAN_VIEW', INDETERMINATE) -reflected_plan_view = express_getattr(IfcGeometricProjectionEnum, 'REFLECTED_PLAN_VIEW', INDETERMINATE) -section_view = express_getattr(IfcGeometricProjectionEnum, 'SECTION_VIEW', INDETERMINATE) -sketch_view = express_getattr(IfcGeometricProjectionEnum, 'SKETCH_VIEW', INDETERMINATE) -userdefined = express_getattr(IfcGeometricProjectionEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcGeometricProjectionEnum, 'NOTDEFINED', INDETERMINATE) +elevation_view = IfcGeometricProjectionEnum.ELEVATION_VIEW +graph_view = IfcGeometricProjectionEnum.GRAPH_VIEW +model_view = IfcGeometricProjectionEnum.MODEL_VIEW +plan_view = IfcGeometricProjectionEnum.PLAN_VIEW +reflected_plan_view = IfcGeometricProjectionEnum.REFLECTED_PLAN_VIEW +section_view = IfcGeometricProjectionEnum.SECTION_VIEW +sketch_view = IfcGeometricProjectionEnum.SKETCH_VIEW +userdefined = IfcGeometricProjectionEnum.USERDEFINED +notdefined = IfcGeometricProjectionEnum.NOTDEFINED IfcGeotechnicalStratumTypeEnum = enum_namespace() -solid = express_getattr(IfcGeotechnicalStratumTypeEnum, 'SOLID', INDETERMINATE) -void = express_getattr(IfcGeotechnicalStratumTypeEnum, 'VOID', INDETERMINATE) -water = express_getattr(IfcGeotechnicalStratumTypeEnum, 'WATER', INDETERMINATE) -userdefined = express_getattr(IfcGeotechnicalStratumTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcGeotechnicalStratumTypeEnum, 'NOTDEFINED', INDETERMINATE) +solid = IfcGeotechnicalStratumTypeEnum.SOLID +void = IfcGeotechnicalStratumTypeEnum.VOID +water = IfcGeotechnicalStratumTypeEnum.WATER +userdefined = IfcGeotechnicalStratumTypeEnum.USERDEFINED +notdefined = IfcGeotechnicalStratumTypeEnum.NOTDEFINED IfcGlobalOrLocalEnum = enum_namespace() -global_coords = express_getattr(IfcGlobalOrLocalEnum, 'GLOBAL_COORDS', INDETERMINATE) -local_coords = express_getattr(IfcGlobalOrLocalEnum, 'LOCAL_COORDS', INDETERMINATE) +global_coords = IfcGlobalOrLocalEnum.GLOBAL_COORDS +local_coords = IfcGlobalOrLocalEnum.LOCAL_COORDS IfcGridTypeEnum = enum_namespace() -irregular = express_getattr(IfcGridTypeEnum, 'IRREGULAR', INDETERMINATE) -radial = express_getattr(IfcGridTypeEnum, 'RADIAL', INDETERMINATE) -rectangular = express_getattr(IfcGridTypeEnum, 'RECTANGULAR', INDETERMINATE) -triangular = express_getattr(IfcGridTypeEnum, 'TRIANGULAR', INDETERMINATE) -userdefined = express_getattr(IfcGridTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcGridTypeEnum, 'NOTDEFINED', INDETERMINATE) +irregular = IfcGridTypeEnum.IRREGULAR +radial = IfcGridTypeEnum.RADIAL +rectangular = IfcGridTypeEnum.RECTANGULAR +triangular = IfcGridTypeEnum.TRIANGULAR +userdefined = IfcGridTypeEnum.USERDEFINED +notdefined = IfcGridTypeEnum.NOTDEFINED IfcHeatExchangerTypeEnum = enum_namespace() -plate = express_getattr(IfcHeatExchangerTypeEnum, 'PLATE', INDETERMINATE) -shellandtube = express_getattr(IfcHeatExchangerTypeEnum, 'SHELLANDTUBE', INDETERMINATE) -turnoutheating = express_getattr(IfcHeatExchangerTypeEnum, 'TURNOUTHEATING', INDETERMINATE) -userdefined = express_getattr(IfcHeatExchangerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcHeatExchangerTypeEnum, 'NOTDEFINED', INDETERMINATE) +plate = IfcHeatExchangerTypeEnum.PLATE +shellandtube = IfcHeatExchangerTypeEnum.SHELLANDTUBE +turnoutheating = IfcHeatExchangerTypeEnum.TURNOUTHEATING +userdefined = IfcHeatExchangerTypeEnum.USERDEFINED +notdefined = IfcHeatExchangerTypeEnum.NOTDEFINED IfcHumidifierTypeEnum = enum_namespace() -adiabaticairwasher = express_getattr(IfcHumidifierTypeEnum, 'ADIABATICAIRWASHER', INDETERMINATE) -adiabaticatomizing = express_getattr(IfcHumidifierTypeEnum, 'ADIABATICATOMIZING', INDETERMINATE) -adiabaticcompressedairnozzle = express_getattr(IfcHumidifierTypeEnum, 'ADIABATICCOMPRESSEDAIRNOZZLE', INDETERMINATE) -adiabaticpan = express_getattr(IfcHumidifierTypeEnum, 'ADIABATICPAN', INDETERMINATE) -adiabaticrigidmedia = express_getattr(IfcHumidifierTypeEnum, 'ADIABATICRIGIDMEDIA', INDETERMINATE) -adiabaticultrasonic = express_getattr(IfcHumidifierTypeEnum, 'ADIABATICULTRASONIC', INDETERMINATE) -adiabaticwettedelement = express_getattr(IfcHumidifierTypeEnum, 'ADIABATICWETTEDELEMENT', INDETERMINATE) -assistedbutane = express_getattr(IfcHumidifierTypeEnum, 'ASSISTEDBUTANE', INDETERMINATE) -assistedelectric = express_getattr(IfcHumidifierTypeEnum, 'ASSISTEDELECTRIC', INDETERMINATE) -assistednaturalgas = express_getattr(IfcHumidifierTypeEnum, 'ASSISTEDNATURALGAS', INDETERMINATE) -assistedpropane = express_getattr(IfcHumidifierTypeEnum, 'ASSISTEDPROPANE', INDETERMINATE) -assistedsteam = express_getattr(IfcHumidifierTypeEnum, 'ASSISTEDSTEAM', INDETERMINATE) -steaminjection = express_getattr(IfcHumidifierTypeEnum, 'STEAMINJECTION', INDETERMINATE) -userdefined = express_getattr(IfcHumidifierTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcHumidifierTypeEnum, 'NOTDEFINED', INDETERMINATE) +adiabaticairwasher = IfcHumidifierTypeEnum.ADIABATICAIRWASHER +adiabaticatomizing = IfcHumidifierTypeEnum.ADIABATICATOMIZING +adiabaticcompressedairnozzle = IfcHumidifierTypeEnum.ADIABATICCOMPRESSEDAIRNOZZLE +adiabaticpan = IfcHumidifierTypeEnum.ADIABATICPAN +adiabaticrigidmedia = IfcHumidifierTypeEnum.ADIABATICRIGIDMEDIA +adiabaticultrasonic = IfcHumidifierTypeEnum.ADIABATICULTRASONIC +adiabaticwettedelement = IfcHumidifierTypeEnum.ADIABATICWETTEDELEMENT +assistedbutane = IfcHumidifierTypeEnum.ASSISTEDBUTANE +assistedelectric = IfcHumidifierTypeEnum.ASSISTEDELECTRIC +assistednaturalgas = IfcHumidifierTypeEnum.ASSISTEDNATURALGAS +assistedpropane = IfcHumidifierTypeEnum.ASSISTEDPROPANE +assistedsteam = IfcHumidifierTypeEnum.ASSISTEDSTEAM +steaminjection = IfcHumidifierTypeEnum.STEAMINJECTION +userdefined = IfcHumidifierTypeEnum.USERDEFINED +notdefined = IfcHumidifierTypeEnum.NOTDEFINED IfcImpactProtectionDeviceTypeEnum = enum_namespace() -bumper = express_getattr(IfcImpactProtectionDeviceTypeEnum, 'BUMPER', INDETERMINATE) -crashcushion = express_getattr(IfcImpactProtectionDeviceTypeEnum, 'CRASHCUSHION', INDETERMINATE) -dampingsystem = express_getattr(IfcImpactProtectionDeviceTypeEnum, 'DAMPINGSYSTEM', INDETERMINATE) -fender = express_getattr(IfcImpactProtectionDeviceTypeEnum, 'FENDER', INDETERMINATE) -userdefined = express_getattr(IfcImpactProtectionDeviceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcImpactProtectionDeviceTypeEnum, 'NOTDEFINED', INDETERMINATE) +bumper = IfcImpactProtectionDeviceTypeEnum.BUMPER +crashcushion = IfcImpactProtectionDeviceTypeEnum.CRASHCUSHION +dampingsystem = IfcImpactProtectionDeviceTypeEnum.DAMPINGSYSTEM +fender = IfcImpactProtectionDeviceTypeEnum.FENDER +userdefined = IfcImpactProtectionDeviceTypeEnum.USERDEFINED +notdefined = IfcImpactProtectionDeviceTypeEnum.NOTDEFINED IfcInterceptorTypeEnum = enum_namespace() -cyclonic = express_getattr(IfcInterceptorTypeEnum, 'CYCLONIC', INDETERMINATE) -grease = express_getattr(IfcInterceptorTypeEnum, 'GREASE', INDETERMINATE) -oil = express_getattr(IfcInterceptorTypeEnum, 'OIL', INDETERMINATE) -petrol = express_getattr(IfcInterceptorTypeEnum, 'PETROL', INDETERMINATE) -userdefined = express_getattr(IfcInterceptorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcInterceptorTypeEnum, 'NOTDEFINED', INDETERMINATE) +cyclonic = IfcInterceptorTypeEnum.CYCLONIC +grease = IfcInterceptorTypeEnum.GREASE +oil = IfcInterceptorTypeEnum.OIL +petrol = IfcInterceptorTypeEnum.PETROL +userdefined = IfcInterceptorTypeEnum.USERDEFINED +notdefined = IfcInterceptorTypeEnum.NOTDEFINED IfcInternalOrExternalEnum = enum_namespace() -external = express_getattr(IfcInternalOrExternalEnum, 'EXTERNAL', INDETERMINATE) -external_earth = express_getattr(IfcInternalOrExternalEnum, 'EXTERNAL_EARTH', INDETERMINATE) -external_fire = express_getattr(IfcInternalOrExternalEnum, 'EXTERNAL_FIRE', INDETERMINATE) -external_water = express_getattr(IfcInternalOrExternalEnum, 'EXTERNAL_WATER', INDETERMINATE) -internal = express_getattr(IfcInternalOrExternalEnum, 'INTERNAL', INDETERMINATE) -notdefined = express_getattr(IfcInternalOrExternalEnum, 'NOTDEFINED', INDETERMINATE) +external = IfcInternalOrExternalEnum.EXTERNAL +external_earth = IfcInternalOrExternalEnum.EXTERNAL_EARTH +external_fire = IfcInternalOrExternalEnum.EXTERNAL_FIRE +external_water = IfcInternalOrExternalEnum.EXTERNAL_WATER +internal = IfcInternalOrExternalEnum.INTERNAL +notdefined = IfcInternalOrExternalEnum.NOTDEFINED IfcInventoryTypeEnum = enum_namespace() -assetinventory = express_getattr(IfcInventoryTypeEnum, 'ASSETINVENTORY', INDETERMINATE) -furnitureinventory = express_getattr(IfcInventoryTypeEnum, 'FURNITUREINVENTORY', INDETERMINATE) -spaceinventory = express_getattr(IfcInventoryTypeEnum, 'SPACEINVENTORY', INDETERMINATE) -userdefined = express_getattr(IfcInventoryTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcInventoryTypeEnum, 'NOTDEFINED', INDETERMINATE) +assetinventory = IfcInventoryTypeEnum.ASSETINVENTORY +furnitureinventory = IfcInventoryTypeEnum.FURNITUREINVENTORY +spaceinventory = IfcInventoryTypeEnum.SPACEINVENTORY +userdefined = IfcInventoryTypeEnum.USERDEFINED +notdefined = IfcInventoryTypeEnum.NOTDEFINED IfcJunctionBoxTypeEnum = enum_namespace() -data = express_getattr(IfcJunctionBoxTypeEnum, 'DATA', INDETERMINATE) -power = express_getattr(IfcJunctionBoxTypeEnum, 'POWER', INDETERMINATE) -userdefined = express_getattr(IfcJunctionBoxTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcJunctionBoxTypeEnum, 'NOTDEFINED', INDETERMINATE) +data = IfcJunctionBoxTypeEnum.DATA +power = IfcJunctionBoxTypeEnum.POWER +userdefined = IfcJunctionBoxTypeEnum.USERDEFINED +notdefined = IfcJunctionBoxTypeEnum.NOTDEFINED IfcKerbTypeEnum = enum_namespace() -userdefined = express_getattr(IfcKerbTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcKerbTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcKerbTypeEnum.USERDEFINED +notdefined = IfcKerbTypeEnum.NOTDEFINED IfcKnotType = enum_namespace() -piecewise_bezier_knots = express_getattr(IfcKnotType, 'PIECEWISE_BEZIER_KNOTS', INDETERMINATE) -quasi_uniform_knots = express_getattr(IfcKnotType, 'QUASI_UNIFORM_KNOTS', INDETERMINATE) -uniform_knots = express_getattr(IfcKnotType, 'UNIFORM_KNOTS', INDETERMINATE) -unspecified = express_getattr(IfcKnotType, 'UNSPECIFIED', INDETERMINATE) +piecewise_bezier_knots = IfcKnotType.PIECEWISE_BEZIER_KNOTS +quasi_uniform_knots = IfcKnotType.QUASI_UNIFORM_KNOTS +uniform_knots = IfcKnotType.UNIFORM_KNOTS +unspecified = IfcKnotType.UNSPECIFIED IfcLaborResourceTypeEnum = enum_namespace() -administration = express_getattr(IfcLaborResourceTypeEnum, 'ADMINISTRATION', INDETERMINATE) -carpentry = express_getattr(IfcLaborResourceTypeEnum, 'CARPENTRY', INDETERMINATE) -cleaning = express_getattr(IfcLaborResourceTypeEnum, 'CLEANING', INDETERMINATE) -concrete = express_getattr(IfcLaborResourceTypeEnum, 'CONCRETE', INDETERMINATE) -drywall = express_getattr(IfcLaborResourceTypeEnum, 'DRYWALL', INDETERMINATE) -electric = express_getattr(IfcLaborResourceTypeEnum, 'ELECTRIC', INDETERMINATE) -finishing = express_getattr(IfcLaborResourceTypeEnum, 'FINISHING', INDETERMINATE) -flooring = express_getattr(IfcLaborResourceTypeEnum, 'FLOORING', INDETERMINATE) -general = express_getattr(IfcLaborResourceTypeEnum, 'GENERAL', INDETERMINATE) -hvac = express_getattr(IfcLaborResourceTypeEnum, 'HVAC', INDETERMINATE) -landscaping = express_getattr(IfcLaborResourceTypeEnum, 'LANDSCAPING', INDETERMINATE) -masonry = express_getattr(IfcLaborResourceTypeEnum, 'MASONRY', INDETERMINATE) -painting = express_getattr(IfcLaborResourceTypeEnum, 'PAINTING', INDETERMINATE) -paving = express_getattr(IfcLaborResourceTypeEnum, 'PAVING', INDETERMINATE) -plumbing = express_getattr(IfcLaborResourceTypeEnum, 'PLUMBING', INDETERMINATE) -roofing = express_getattr(IfcLaborResourceTypeEnum, 'ROOFING', INDETERMINATE) -sitegrading = express_getattr(IfcLaborResourceTypeEnum, 'SITEGRADING', INDETERMINATE) -steelwork = express_getattr(IfcLaborResourceTypeEnum, 'STEELWORK', INDETERMINATE) -surveying = express_getattr(IfcLaborResourceTypeEnum, 'SURVEYING', INDETERMINATE) -userdefined = express_getattr(IfcLaborResourceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcLaborResourceTypeEnum, 'NOTDEFINED', INDETERMINATE) +administration = IfcLaborResourceTypeEnum.ADMINISTRATION +carpentry = IfcLaborResourceTypeEnum.CARPENTRY +cleaning = IfcLaborResourceTypeEnum.CLEANING +concrete = IfcLaborResourceTypeEnum.CONCRETE +drywall = IfcLaborResourceTypeEnum.DRYWALL +electric = IfcLaborResourceTypeEnum.ELECTRIC +finishing = IfcLaborResourceTypeEnum.FINISHING +flooring = IfcLaborResourceTypeEnum.FLOORING +general = IfcLaborResourceTypeEnum.GENERAL +hvac = IfcLaborResourceTypeEnum.HVAC +landscaping = IfcLaborResourceTypeEnum.LANDSCAPING +masonry = IfcLaborResourceTypeEnum.MASONRY +painting = IfcLaborResourceTypeEnum.PAINTING +paving = IfcLaborResourceTypeEnum.PAVING +plumbing = IfcLaborResourceTypeEnum.PLUMBING +roofing = IfcLaborResourceTypeEnum.ROOFING +sitegrading = IfcLaborResourceTypeEnum.SITEGRADING +steelwork = IfcLaborResourceTypeEnum.STEELWORK +surveying = IfcLaborResourceTypeEnum.SURVEYING +userdefined = IfcLaborResourceTypeEnum.USERDEFINED +notdefined = IfcLaborResourceTypeEnum.NOTDEFINED IfcLampTypeEnum = enum_namespace() -compactfluorescent = express_getattr(IfcLampTypeEnum, 'COMPACTFLUORESCENT', INDETERMINATE) -fluorescent = express_getattr(IfcLampTypeEnum, 'FLUORESCENT', INDETERMINATE) -halogen = express_getattr(IfcLampTypeEnum, 'HALOGEN', INDETERMINATE) -highpressuremercury = express_getattr(IfcLampTypeEnum, 'HIGHPRESSUREMERCURY', INDETERMINATE) -highpressuresodium = express_getattr(IfcLampTypeEnum, 'HIGHPRESSURESODIUM', INDETERMINATE) -led = express_getattr(IfcLampTypeEnum, 'LED', INDETERMINATE) -metalhalide = express_getattr(IfcLampTypeEnum, 'METALHALIDE', INDETERMINATE) -oled = express_getattr(IfcLampTypeEnum, 'OLED', INDETERMINATE) -tungstenfilament = express_getattr(IfcLampTypeEnum, 'TUNGSTENFILAMENT', INDETERMINATE) -userdefined = express_getattr(IfcLampTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcLampTypeEnum, 'NOTDEFINED', INDETERMINATE) +compactfluorescent = IfcLampTypeEnum.COMPACTFLUORESCENT +fluorescent = IfcLampTypeEnum.FLUORESCENT +halogen = IfcLampTypeEnum.HALOGEN +highpressuremercury = IfcLampTypeEnum.HIGHPRESSUREMERCURY +highpressuresodium = IfcLampTypeEnum.HIGHPRESSURESODIUM +led = IfcLampTypeEnum.LED +metalhalide = IfcLampTypeEnum.METALHALIDE +oled = IfcLampTypeEnum.OLED +tungstenfilament = IfcLampTypeEnum.TUNGSTENFILAMENT +userdefined = IfcLampTypeEnum.USERDEFINED +notdefined = IfcLampTypeEnum.NOTDEFINED IfcLayerSetDirectionEnum = enum_namespace() -axis1 = express_getattr(IfcLayerSetDirectionEnum, 'AXIS1', INDETERMINATE) -axis2 = express_getattr(IfcLayerSetDirectionEnum, 'AXIS2', INDETERMINATE) -axis3 = express_getattr(IfcLayerSetDirectionEnum, 'AXIS3', INDETERMINATE) +axis1 = IfcLayerSetDirectionEnum.AXIS1 +axis2 = IfcLayerSetDirectionEnum.AXIS2 +axis3 = IfcLayerSetDirectionEnum.AXIS3 IfcLightDistributionCurveEnum = enum_namespace() -type_a = express_getattr(IfcLightDistributionCurveEnum, 'TYPE_A', INDETERMINATE) -type_b = express_getattr(IfcLightDistributionCurveEnum, 'TYPE_B', INDETERMINATE) -type_c = express_getattr(IfcLightDistributionCurveEnum, 'TYPE_C', INDETERMINATE) -notdefined = express_getattr(IfcLightDistributionCurveEnum, 'NOTDEFINED', INDETERMINATE) +type_a = IfcLightDistributionCurveEnum.TYPE_A +type_b = IfcLightDistributionCurveEnum.TYPE_B +type_c = IfcLightDistributionCurveEnum.TYPE_C +notdefined = IfcLightDistributionCurveEnum.NOTDEFINED IfcLightEmissionSourceEnum = enum_namespace() -compactfluorescent = express_getattr(IfcLightEmissionSourceEnum, 'COMPACTFLUORESCENT', INDETERMINATE) -fluorescent = express_getattr(IfcLightEmissionSourceEnum, 'FLUORESCENT', INDETERMINATE) -highpressuremercury = express_getattr(IfcLightEmissionSourceEnum, 'HIGHPRESSUREMERCURY', INDETERMINATE) -highpressuresodium = express_getattr(IfcLightEmissionSourceEnum, 'HIGHPRESSURESODIUM', INDETERMINATE) -lightemittingdiode = express_getattr(IfcLightEmissionSourceEnum, 'LIGHTEMITTINGDIODE', INDETERMINATE) -lowpressuresodium = express_getattr(IfcLightEmissionSourceEnum, 'LOWPRESSURESODIUM', INDETERMINATE) -lowvoltagehalogen = express_getattr(IfcLightEmissionSourceEnum, 'LOWVOLTAGEHALOGEN', INDETERMINATE) -mainvoltagehalogen = express_getattr(IfcLightEmissionSourceEnum, 'MAINVOLTAGEHALOGEN', INDETERMINATE) -metalhalide = express_getattr(IfcLightEmissionSourceEnum, 'METALHALIDE', INDETERMINATE) -tungstenfilament = express_getattr(IfcLightEmissionSourceEnum, 'TUNGSTENFILAMENT', INDETERMINATE) -notdefined = express_getattr(IfcLightEmissionSourceEnum, 'NOTDEFINED', INDETERMINATE) +compactfluorescent = IfcLightEmissionSourceEnum.COMPACTFLUORESCENT +fluorescent = IfcLightEmissionSourceEnum.FLUORESCENT +highpressuremercury = IfcLightEmissionSourceEnum.HIGHPRESSUREMERCURY +highpressuresodium = IfcLightEmissionSourceEnum.HIGHPRESSURESODIUM +lightemittingdiode = IfcLightEmissionSourceEnum.LIGHTEMITTINGDIODE +lowpressuresodium = IfcLightEmissionSourceEnum.LOWPRESSURESODIUM +lowvoltagehalogen = IfcLightEmissionSourceEnum.LOWVOLTAGEHALOGEN +mainvoltagehalogen = IfcLightEmissionSourceEnum.MAINVOLTAGEHALOGEN +metalhalide = IfcLightEmissionSourceEnum.METALHALIDE +tungstenfilament = IfcLightEmissionSourceEnum.TUNGSTENFILAMENT +notdefined = IfcLightEmissionSourceEnum.NOTDEFINED IfcLightFixtureTypeEnum = enum_namespace() -directionsource = express_getattr(IfcLightFixtureTypeEnum, 'DIRECTIONSOURCE', INDETERMINATE) -pointsource = express_getattr(IfcLightFixtureTypeEnum, 'POINTSOURCE', INDETERMINATE) -securitylighting = express_getattr(IfcLightFixtureTypeEnum, 'SECURITYLIGHTING', INDETERMINATE) -userdefined = express_getattr(IfcLightFixtureTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcLightFixtureTypeEnum, 'NOTDEFINED', INDETERMINATE) +directionsource = IfcLightFixtureTypeEnum.DIRECTIONSOURCE +pointsource = IfcLightFixtureTypeEnum.POINTSOURCE +securitylighting = IfcLightFixtureTypeEnum.SECURITYLIGHTING +userdefined = IfcLightFixtureTypeEnum.USERDEFINED +notdefined = IfcLightFixtureTypeEnum.NOTDEFINED IfcLiquidTerminalTypeEnum = enum_namespace() -hosereel = express_getattr(IfcLiquidTerminalTypeEnum, 'HOSEREEL', INDETERMINATE) -loadingarm = express_getattr(IfcLiquidTerminalTypeEnum, 'LOADINGARM', INDETERMINATE) -userdefined = express_getattr(IfcLiquidTerminalTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcLiquidTerminalTypeEnum, 'NOTDEFINED', INDETERMINATE) +hosereel = IfcLiquidTerminalTypeEnum.HOSEREEL +loadingarm = IfcLiquidTerminalTypeEnum.LOADINGARM +userdefined = IfcLiquidTerminalTypeEnum.USERDEFINED +notdefined = IfcLiquidTerminalTypeEnum.NOTDEFINED IfcLoadGroupTypeEnum = enum_namespace() -load_case = express_getattr(IfcLoadGroupTypeEnum, 'LOAD_CASE', INDETERMINATE) -load_combination = express_getattr(IfcLoadGroupTypeEnum, 'LOAD_COMBINATION', INDETERMINATE) -load_group = express_getattr(IfcLoadGroupTypeEnum, 'LOAD_GROUP', INDETERMINATE) -userdefined = express_getattr(IfcLoadGroupTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcLoadGroupTypeEnum, 'NOTDEFINED', INDETERMINATE) +load_case = IfcLoadGroupTypeEnum.LOAD_CASE +load_combination = IfcLoadGroupTypeEnum.LOAD_COMBINATION +load_group = IfcLoadGroupTypeEnum.LOAD_GROUP +userdefined = IfcLoadGroupTypeEnum.USERDEFINED +notdefined = IfcLoadGroupTypeEnum.NOTDEFINED IfcLogicalOperatorEnum = enum_namespace() -logicaland = express_getattr(IfcLogicalOperatorEnum, 'LOGICALAND', INDETERMINATE) -logicalnotand = express_getattr(IfcLogicalOperatorEnum, 'LOGICALNOTAND', INDETERMINATE) -logicalnotor = express_getattr(IfcLogicalOperatorEnum, 'LOGICALNOTOR', INDETERMINATE) -logicalor = express_getattr(IfcLogicalOperatorEnum, 'LOGICALOR', INDETERMINATE) -logicalxor = express_getattr(IfcLogicalOperatorEnum, 'LOGICALXOR', INDETERMINATE) +logicaland = IfcLogicalOperatorEnum.LOGICALAND +logicalnotand = IfcLogicalOperatorEnum.LOGICALNOTAND +logicalnotor = IfcLogicalOperatorEnum.LOGICALNOTOR +logicalor = IfcLogicalOperatorEnum.LOGICALOR +logicalxor = IfcLogicalOperatorEnum.LOGICALXOR IfcMarineFacilityTypeEnum = enum_namespace() -barrierbeach = express_getattr(IfcMarineFacilityTypeEnum, 'BARRIERBEACH', INDETERMINATE) -breakwater = express_getattr(IfcMarineFacilityTypeEnum, 'BREAKWATER', INDETERMINATE) -canal = express_getattr(IfcMarineFacilityTypeEnum, 'CANAL', INDETERMINATE) -drydock = express_getattr(IfcMarineFacilityTypeEnum, 'DRYDOCK', INDETERMINATE) -floatingdock = express_getattr(IfcMarineFacilityTypeEnum, 'FLOATINGDOCK', INDETERMINATE) -hydrolift = express_getattr(IfcMarineFacilityTypeEnum, 'HYDROLIFT', INDETERMINATE) -jetty = express_getattr(IfcMarineFacilityTypeEnum, 'JETTY', INDETERMINATE) -launchrecovery = express_getattr(IfcMarineFacilityTypeEnum, 'LAUNCHRECOVERY', INDETERMINATE) -marinedefence = express_getattr(IfcMarineFacilityTypeEnum, 'MARINEDEFENCE', INDETERMINATE) -navigationalchannel = express_getattr(IfcMarineFacilityTypeEnum, 'NAVIGATIONALCHANNEL', INDETERMINATE) -port = express_getattr(IfcMarineFacilityTypeEnum, 'PORT', INDETERMINATE) -quay = express_getattr(IfcMarineFacilityTypeEnum, 'QUAY', INDETERMINATE) -revetment = express_getattr(IfcMarineFacilityTypeEnum, 'REVETMENT', INDETERMINATE) -shiplift = express_getattr(IfcMarineFacilityTypeEnum, 'SHIPLIFT', INDETERMINATE) -shiplock = express_getattr(IfcMarineFacilityTypeEnum, 'SHIPLOCK', INDETERMINATE) -shipyard = express_getattr(IfcMarineFacilityTypeEnum, 'SHIPYARD', INDETERMINATE) -slipway = express_getattr(IfcMarineFacilityTypeEnum, 'SLIPWAY', INDETERMINATE) -waterway = express_getattr(IfcMarineFacilityTypeEnum, 'WATERWAY', INDETERMINATE) -waterwayshiplift = express_getattr(IfcMarineFacilityTypeEnum, 'WATERWAYSHIPLIFT', INDETERMINATE) -userdefined = express_getattr(IfcMarineFacilityTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcMarineFacilityTypeEnum, 'NOTDEFINED', INDETERMINATE) +barrierbeach = IfcMarineFacilityTypeEnum.BARRIERBEACH +breakwater = IfcMarineFacilityTypeEnum.BREAKWATER +canal = IfcMarineFacilityTypeEnum.CANAL +drydock = IfcMarineFacilityTypeEnum.DRYDOCK +floatingdock = IfcMarineFacilityTypeEnum.FLOATINGDOCK +hydrolift = IfcMarineFacilityTypeEnum.HYDROLIFT +jetty = IfcMarineFacilityTypeEnum.JETTY +launchrecovery = IfcMarineFacilityTypeEnum.LAUNCHRECOVERY +marinedefence = IfcMarineFacilityTypeEnum.MARINEDEFENCE +navigationalchannel = IfcMarineFacilityTypeEnum.NAVIGATIONALCHANNEL +port = IfcMarineFacilityTypeEnum.PORT +quay = IfcMarineFacilityTypeEnum.QUAY +revetment = IfcMarineFacilityTypeEnum.REVETMENT +shiplift = IfcMarineFacilityTypeEnum.SHIPLIFT +shiplock = IfcMarineFacilityTypeEnum.SHIPLOCK +shipyard = IfcMarineFacilityTypeEnum.SHIPYARD +slipway = IfcMarineFacilityTypeEnum.SLIPWAY +waterway = IfcMarineFacilityTypeEnum.WATERWAY +waterwayshiplift = IfcMarineFacilityTypeEnum.WATERWAYSHIPLIFT +userdefined = IfcMarineFacilityTypeEnum.USERDEFINED +notdefined = IfcMarineFacilityTypeEnum.NOTDEFINED IfcMarinePartTypeEnum = enum_namespace() -abovewaterline = express_getattr(IfcMarinePartTypeEnum, 'ABOVEWATERLINE', INDETERMINATE) -anchorage = express_getattr(IfcMarinePartTypeEnum, 'ANCHORAGE', INDETERMINATE) -approachchannel = express_getattr(IfcMarinePartTypeEnum, 'APPROACHCHANNEL', INDETERMINATE) -belowwaterline = express_getattr(IfcMarinePartTypeEnum, 'BELOWWATERLINE', INDETERMINATE) -berthingstructure = express_getattr(IfcMarinePartTypeEnum, 'BERTHINGSTRUCTURE', INDETERMINATE) -chamber = express_getattr(IfcMarinePartTypeEnum, 'CHAMBER', INDETERMINATE) -cill_level = express_getattr(IfcMarinePartTypeEnum, 'CILL_LEVEL', INDETERMINATE) -copelevel = express_getattr(IfcMarinePartTypeEnum, 'COPELEVEL', INDETERMINATE) -core = express_getattr(IfcMarinePartTypeEnum, 'CORE', INDETERMINATE) -crest = express_getattr(IfcMarinePartTypeEnum, 'CREST', INDETERMINATE) -gatehead = express_getattr(IfcMarinePartTypeEnum, 'GATEHEAD', INDETERMINATE) -gudingstructure = express_getattr(IfcMarinePartTypeEnum, 'GUDINGSTRUCTURE', INDETERMINATE) -highwaterline = express_getattr(IfcMarinePartTypeEnum, 'HIGHWATERLINE', INDETERMINATE) -landfield = express_getattr(IfcMarinePartTypeEnum, 'LANDFIELD', INDETERMINATE) -leewardside = express_getattr(IfcMarinePartTypeEnum, 'LEEWARDSIDE', INDETERMINATE) -lowwaterline = express_getattr(IfcMarinePartTypeEnum, 'LOWWATERLINE', INDETERMINATE) -manufacturing = express_getattr(IfcMarinePartTypeEnum, 'MANUFACTURING', INDETERMINATE) -navigationalarea = express_getattr(IfcMarinePartTypeEnum, 'NAVIGATIONALAREA', INDETERMINATE) -protection = express_getattr(IfcMarinePartTypeEnum, 'PROTECTION', INDETERMINATE) -shiptransfer = express_getattr(IfcMarinePartTypeEnum, 'SHIPTRANSFER', INDETERMINATE) -storagearea = express_getattr(IfcMarinePartTypeEnum, 'STORAGEAREA', INDETERMINATE) -vehicleservicing = express_getattr(IfcMarinePartTypeEnum, 'VEHICLESERVICING', INDETERMINATE) -waterfield = express_getattr(IfcMarinePartTypeEnum, 'WATERFIELD', INDETERMINATE) -weatherside = express_getattr(IfcMarinePartTypeEnum, 'WEATHERSIDE', INDETERMINATE) -userdefined = express_getattr(IfcMarinePartTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcMarinePartTypeEnum, 'NOTDEFINED', INDETERMINATE) +abovewaterline = IfcMarinePartTypeEnum.ABOVEWATERLINE +anchorage = IfcMarinePartTypeEnum.ANCHORAGE +approachchannel = IfcMarinePartTypeEnum.APPROACHCHANNEL +belowwaterline = IfcMarinePartTypeEnum.BELOWWATERLINE +berthingstructure = IfcMarinePartTypeEnum.BERTHINGSTRUCTURE +chamber = IfcMarinePartTypeEnum.CHAMBER +cill_level = IfcMarinePartTypeEnum.CILL_LEVEL +copelevel = IfcMarinePartTypeEnum.COPELEVEL +core = IfcMarinePartTypeEnum.CORE +crest = IfcMarinePartTypeEnum.CREST +gatehead = IfcMarinePartTypeEnum.GATEHEAD +gudingstructure = IfcMarinePartTypeEnum.GUDINGSTRUCTURE +highwaterline = IfcMarinePartTypeEnum.HIGHWATERLINE +landfield = IfcMarinePartTypeEnum.LANDFIELD +leewardside = IfcMarinePartTypeEnum.LEEWARDSIDE +lowwaterline = IfcMarinePartTypeEnum.LOWWATERLINE +manufacturing = IfcMarinePartTypeEnum.MANUFACTURING +navigationalarea = IfcMarinePartTypeEnum.NAVIGATIONALAREA +protection = IfcMarinePartTypeEnum.PROTECTION +shiptransfer = IfcMarinePartTypeEnum.SHIPTRANSFER +storagearea = IfcMarinePartTypeEnum.STORAGEAREA +vehicleservicing = IfcMarinePartTypeEnum.VEHICLESERVICING +waterfield = IfcMarinePartTypeEnum.WATERFIELD +weatherside = IfcMarinePartTypeEnum.WEATHERSIDE +userdefined = IfcMarinePartTypeEnum.USERDEFINED +notdefined = IfcMarinePartTypeEnum.NOTDEFINED IfcMechanicalFastenerTypeEnum = enum_namespace() -anchorbolt = express_getattr(IfcMechanicalFastenerTypeEnum, 'ANCHORBOLT', INDETERMINATE) -bolt = express_getattr(IfcMechanicalFastenerTypeEnum, 'BOLT', INDETERMINATE) -chain = express_getattr(IfcMechanicalFastenerTypeEnum, 'CHAIN', INDETERMINATE) -coupler = express_getattr(IfcMechanicalFastenerTypeEnum, 'COUPLER', INDETERMINATE) -dowel = express_getattr(IfcMechanicalFastenerTypeEnum, 'DOWEL', INDETERMINATE) -nail = express_getattr(IfcMechanicalFastenerTypeEnum, 'NAIL', INDETERMINATE) -nailplate = express_getattr(IfcMechanicalFastenerTypeEnum, 'NAILPLATE', INDETERMINATE) -railfastening = express_getattr(IfcMechanicalFastenerTypeEnum, 'RAILFASTENING', INDETERMINATE) -railjoint = express_getattr(IfcMechanicalFastenerTypeEnum, 'RAILJOINT', INDETERMINATE) -rivet = express_getattr(IfcMechanicalFastenerTypeEnum, 'RIVET', INDETERMINATE) -rope = express_getattr(IfcMechanicalFastenerTypeEnum, 'ROPE', INDETERMINATE) -screw = express_getattr(IfcMechanicalFastenerTypeEnum, 'SCREW', INDETERMINATE) -shearconnector = express_getattr(IfcMechanicalFastenerTypeEnum, 'SHEARCONNECTOR', INDETERMINATE) -staple = express_getattr(IfcMechanicalFastenerTypeEnum, 'STAPLE', INDETERMINATE) -studshearconnector = express_getattr(IfcMechanicalFastenerTypeEnum, 'STUDSHEARCONNECTOR', INDETERMINATE) -userdefined = express_getattr(IfcMechanicalFastenerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcMechanicalFastenerTypeEnum, 'NOTDEFINED', INDETERMINATE) +anchorbolt = IfcMechanicalFastenerTypeEnum.ANCHORBOLT +bolt = IfcMechanicalFastenerTypeEnum.BOLT +chain = IfcMechanicalFastenerTypeEnum.CHAIN +coupler = IfcMechanicalFastenerTypeEnum.COUPLER +dowel = IfcMechanicalFastenerTypeEnum.DOWEL +nail = IfcMechanicalFastenerTypeEnum.NAIL +nailplate = IfcMechanicalFastenerTypeEnum.NAILPLATE +railfastening = IfcMechanicalFastenerTypeEnum.RAILFASTENING +railjoint = IfcMechanicalFastenerTypeEnum.RAILJOINT +rivet = IfcMechanicalFastenerTypeEnum.RIVET +rope = IfcMechanicalFastenerTypeEnum.ROPE +screw = IfcMechanicalFastenerTypeEnum.SCREW +shearconnector = IfcMechanicalFastenerTypeEnum.SHEARCONNECTOR +staple = IfcMechanicalFastenerTypeEnum.STAPLE +studshearconnector = IfcMechanicalFastenerTypeEnum.STUDSHEARCONNECTOR +userdefined = IfcMechanicalFastenerTypeEnum.USERDEFINED +notdefined = IfcMechanicalFastenerTypeEnum.NOTDEFINED IfcMedicalDeviceTypeEnum = enum_namespace() -airstation = express_getattr(IfcMedicalDeviceTypeEnum, 'AIRSTATION', INDETERMINATE) -feedairunit = express_getattr(IfcMedicalDeviceTypeEnum, 'FEEDAIRUNIT', INDETERMINATE) -oxygengenerator = express_getattr(IfcMedicalDeviceTypeEnum, 'OXYGENGENERATOR', INDETERMINATE) -oxygenplant = express_getattr(IfcMedicalDeviceTypeEnum, 'OXYGENPLANT', INDETERMINATE) -vacuumstation = express_getattr(IfcMedicalDeviceTypeEnum, 'VACUUMSTATION', INDETERMINATE) -userdefined = express_getattr(IfcMedicalDeviceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcMedicalDeviceTypeEnum, 'NOTDEFINED', INDETERMINATE) +airstation = IfcMedicalDeviceTypeEnum.AIRSTATION +feedairunit = IfcMedicalDeviceTypeEnum.FEEDAIRUNIT +oxygengenerator = IfcMedicalDeviceTypeEnum.OXYGENGENERATOR +oxygenplant = IfcMedicalDeviceTypeEnum.OXYGENPLANT +vacuumstation = IfcMedicalDeviceTypeEnum.VACUUMSTATION +userdefined = IfcMedicalDeviceTypeEnum.USERDEFINED +notdefined = IfcMedicalDeviceTypeEnum.NOTDEFINED IfcMemberTypeEnum = enum_namespace() -arch_segment = express_getattr(IfcMemberTypeEnum, 'ARCH_SEGMENT', INDETERMINATE) -brace = express_getattr(IfcMemberTypeEnum, 'BRACE', INDETERMINATE) -chord = express_getattr(IfcMemberTypeEnum, 'CHORD', INDETERMINATE) -collar = express_getattr(IfcMemberTypeEnum, 'COLLAR', INDETERMINATE) -member = express_getattr(IfcMemberTypeEnum, 'MEMBER', INDETERMINATE) -mullion = express_getattr(IfcMemberTypeEnum, 'MULLION', INDETERMINATE) -plate = express_getattr(IfcMemberTypeEnum, 'PLATE', INDETERMINATE) -post = express_getattr(IfcMemberTypeEnum, 'POST', INDETERMINATE) -purlin = express_getattr(IfcMemberTypeEnum, 'PURLIN', INDETERMINATE) -rafter = express_getattr(IfcMemberTypeEnum, 'RAFTER', INDETERMINATE) -stay_cable = express_getattr(IfcMemberTypeEnum, 'STAY_CABLE', INDETERMINATE) -stiffening_rib = express_getattr(IfcMemberTypeEnum, 'STIFFENING_RIB', INDETERMINATE) -stringer = express_getattr(IfcMemberTypeEnum, 'STRINGER', INDETERMINATE) -structuralcable = express_getattr(IfcMemberTypeEnum, 'STRUCTURALCABLE', INDETERMINATE) -strut = express_getattr(IfcMemberTypeEnum, 'STRUT', INDETERMINATE) -stud = express_getattr(IfcMemberTypeEnum, 'STUD', INDETERMINATE) -suspender = express_getattr(IfcMemberTypeEnum, 'SUSPENDER', INDETERMINATE) -suspension_cable = express_getattr(IfcMemberTypeEnum, 'SUSPENSION_CABLE', INDETERMINATE) -tiebar = express_getattr(IfcMemberTypeEnum, 'TIEBAR', INDETERMINATE) -userdefined = express_getattr(IfcMemberTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcMemberTypeEnum, 'NOTDEFINED', INDETERMINATE) +arch_segment = IfcMemberTypeEnum.ARCH_SEGMENT +brace = IfcMemberTypeEnum.BRACE +chord = IfcMemberTypeEnum.CHORD +collar = IfcMemberTypeEnum.COLLAR +member = IfcMemberTypeEnum.MEMBER +mullion = IfcMemberTypeEnum.MULLION +plate = IfcMemberTypeEnum.PLATE +post = IfcMemberTypeEnum.POST +purlin = IfcMemberTypeEnum.PURLIN +rafter = IfcMemberTypeEnum.RAFTER +stay_cable = IfcMemberTypeEnum.STAY_CABLE +stiffening_rib = IfcMemberTypeEnum.STIFFENING_RIB +stringer = IfcMemberTypeEnum.STRINGER +structuralcable = IfcMemberTypeEnum.STRUCTURALCABLE +strut = IfcMemberTypeEnum.STRUT +stud = IfcMemberTypeEnum.STUD +suspender = IfcMemberTypeEnum.SUSPENDER +suspension_cable = IfcMemberTypeEnum.SUSPENSION_CABLE +tiebar = IfcMemberTypeEnum.TIEBAR +userdefined = IfcMemberTypeEnum.USERDEFINED +notdefined = IfcMemberTypeEnum.NOTDEFINED IfcMobileTelecommunicationsApplianceTypeEnum = enum_namespace() -accesspoint = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'ACCESSPOINT', INDETERMINATE) -basebandunit = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'BASEBANDUNIT', INDETERMINATE) -basetransceiverstation = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'BASETRANSCEIVERSTATION', INDETERMINATE) -e_utran_node_b = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'E_UTRAN_NODE_B', INDETERMINATE) -gateway_gprs_support_node = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'GATEWAY_GPRS_SUPPORT_NODE', INDETERMINATE) -masterunit = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'MASTERUNIT', INDETERMINATE) -mobileswitchingcenter = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'MOBILESWITCHINGCENTER', INDETERMINATE) -mscserver = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'MSCSERVER', INDETERMINATE) -packetcontrolunit = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'PACKETCONTROLUNIT', INDETERMINATE) -remoteradiounit = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'REMOTERADIOUNIT', INDETERMINATE) -remoteunit = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'REMOTEUNIT', INDETERMINATE) -service_gprs_support_node = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'SERVICE_GPRS_SUPPORT_NODE', INDETERMINATE) -subscriberserver = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'SUBSCRIBERSERVER', INDETERMINATE) -userdefined = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'NOTDEFINED', INDETERMINATE) +accesspoint = IfcMobileTelecommunicationsApplianceTypeEnum.ACCESSPOINT +basebandunit = IfcMobileTelecommunicationsApplianceTypeEnum.BASEBANDUNIT +basetransceiverstation = IfcMobileTelecommunicationsApplianceTypeEnum.BASETRANSCEIVERSTATION +e_utran_node_b = IfcMobileTelecommunicationsApplianceTypeEnum.E_UTRAN_NODE_B +gateway_gprs_support_node = IfcMobileTelecommunicationsApplianceTypeEnum.GATEWAY_GPRS_SUPPORT_NODE +masterunit = IfcMobileTelecommunicationsApplianceTypeEnum.MASTERUNIT +mobileswitchingcenter = IfcMobileTelecommunicationsApplianceTypeEnum.MOBILESWITCHINGCENTER +mscserver = IfcMobileTelecommunicationsApplianceTypeEnum.MSCSERVER +packetcontrolunit = IfcMobileTelecommunicationsApplianceTypeEnum.PACKETCONTROLUNIT +remoteradiounit = IfcMobileTelecommunicationsApplianceTypeEnum.REMOTERADIOUNIT +remoteunit = IfcMobileTelecommunicationsApplianceTypeEnum.REMOTEUNIT +service_gprs_support_node = IfcMobileTelecommunicationsApplianceTypeEnum.SERVICE_GPRS_SUPPORT_NODE +subscriberserver = IfcMobileTelecommunicationsApplianceTypeEnum.SUBSCRIBERSERVER +userdefined = IfcMobileTelecommunicationsApplianceTypeEnum.USERDEFINED +notdefined = IfcMobileTelecommunicationsApplianceTypeEnum.NOTDEFINED IfcMooringDeviceTypeEnum = enum_namespace() -bollard = express_getattr(IfcMooringDeviceTypeEnum, 'BOLLARD', INDETERMINATE) -linetensioner = express_getattr(IfcMooringDeviceTypeEnum, 'LINETENSIONER', INDETERMINATE) -magneticdevice = express_getattr(IfcMooringDeviceTypeEnum, 'MAGNETICDEVICE', INDETERMINATE) -mooringhooks = express_getattr(IfcMooringDeviceTypeEnum, 'MOORINGHOOKS', INDETERMINATE) -vacuumdevice = express_getattr(IfcMooringDeviceTypeEnum, 'VACUUMDEVICE', INDETERMINATE) -userdefined = express_getattr(IfcMooringDeviceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcMooringDeviceTypeEnum, 'NOTDEFINED', INDETERMINATE) +bollard = IfcMooringDeviceTypeEnum.BOLLARD +linetensioner = IfcMooringDeviceTypeEnum.LINETENSIONER +magneticdevice = IfcMooringDeviceTypeEnum.MAGNETICDEVICE +mooringhooks = IfcMooringDeviceTypeEnum.MOORINGHOOKS +vacuumdevice = IfcMooringDeviceTypeEnum.VACUUMDEVICE +userdefined = IfcMooringDeviceTypeEnum.USERDEFINED +notdefined = IfcMooringDeviceTypeEnum.NOTDEFINED IfcMotorConnectionTypeEnum = enum_namespace() -beltdrive = express_getattr(IfcMotorConnectionTypeEnum, 'BELTDRIVE', INDETERMINATE) -coupling = express_getattr(IfcMotorConnectionTypeEnum, 'COUPLING', INDETERMINATE) -directdrive = express_getattr(IfcMotorConnectionTypeEnum, 'DIRECTDRIVE', INDETERMINATE) -userdefined = express_getattr(IfcMotorConnectionTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcMotorConnectionTypeEnum, 'NOTDEFINED', INDETERMINATE) +beltdrive = IfcMotorConnectionTypeEnum.BELTDRIVE +coupling = IfcMotorConnectionTypeEnum.COUPLING +directdrive = IfcMotorConnectionTypeEnum.DIRECTDRIVE +userdefined = IfcMotorConnectionTypeEnum.USERDEFINED +notdefined = IfcMotorConnectionTypeEnum.NOTDEFINED IfcNavigationElementTypeEnum = enum_namespace() -beacon = express_getattr(IfcNavigationElementTypeEnum, 'BEACON', INDETERMINATE) -buoy = express_getattr(IfcNavigationElementTypeEnum, 'BUOY', INDETERMINATE) -userdefined = express_getattr(IfcNavigationElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcNavigationElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +beacon = IfcNavigationElementTypeEnum.BEACON +buoy = IfcNavigationElementTypeEnum.BUOY +userdefined = IfcNavigationElementTypeEnum.USERDEFINED +notdefined = IfcNavigationElementTypeEnum.NOTDEFINED IfcObjectiveEnum = enum_namespace() -codecompliance = express_getattr(IfcObjectiveEnum, 'CODECOMPLIANCE', INDETERMINATE) -codewaiver = express_getattr(IfcObjectiveEnum, 'CODEWAIVER', INDETERMINATE) -designintent = express_getattr(IfcObjectiveEnum, 'DESIGNINTENT', INDETERMINATE) -external = express_getattr(IfcObjectiveEnum, 'EXTERNAL', INDETERMINATE) -healthandsafety = express_getattr(IfcObjectiveEnum, 'HEALTHANDSAFETY', INDETERMINATE) -mergeconflict = express_getattr(IfcObjectiveEnum, 'MERGECONFLICT', INDETERMINATE) -modelview = express_getattr(IfcObjectiveEnum, 'MODELVIEW', INDETERMINATE) -parameter = express_getattr(IfcObjectiveEnum, 'PARAMETER', INDETERMINATE) -requirement = express_getattr(IfcObjectiveEnum, 'REQUIREMENT', INDETERMINATE) -specification = express_getattr(IfcObjectiveEnum, 'SPECIFICATION', INDETERMINATE) -triggercondition = express_getattr(IfcObjectiveEnum, 'TRIGGERCONDITION', INDETERMINATE) -userdefined = express_getattr(IfcObjectiveEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcObjectiveEnum, 'NOTDEFINED', INDETERMINATE) +codecompliance = IfcObjectiveEnum.CODECOMPLIANCE +codewaiver = IfcObjectiveEnum.CODEWAIVER +designintent = IfcObjectiveEnum.DESIGNINTENT +external = IfcObjectiveEnum.EXTERNAL +healthandsafety = IfcObjectiveEnum.HEALTHANDSAFETY +mergeconflict = IfcObjectiveEnum.MERGECONFLICT +modelview = IfcObjectiveEnum.MODELVIEW +parameter = IfcObjectiveEnum.PARAMETER +requirement = IfcObjectiveEnum.REQUIREMENT +specification = IfcObjectiveEnum.SPECIFICATION +triggercondition = IfcObjectiveEnum.TRIGGERCONDITION +userdefined = IfcObjectiveEnum.USERDEFINED +notdefined = IfcObjectiveEnum.NOTDEFINED IfcOccupantTypeEnum = enum_namespace() -assignee = express_getattr(IfcOccupantTypeEnum, 'ASSIGNEE', INDETERMINATE) -assignor = express_getattr(IfcOccupantTypeEnum, 'ASSIGNOR', INDETERMINATE) -lessee = express_getattr(IfcOccupantTypeEnum, 'LESSEE', INDETERMINATE) -lessor = express_getattr(IfcOccupantTypeEnum, 'LESSOR', INDETERMINATE) -lettingagent = express_getattr(IfcOccupantTypeEnum, 'LETTINGAGENT', INDETERMINATE) -owner = express_getattr(IfcOccupantTypeEnum, 'OWNER', INDETERMINATE) -tenant = express_getattr(IfcOccupantTypeEnum, 'TENANT', INDETERMINATE) -userdefined = express_getattr(IfcOccupantTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcOccupantTypeEnum, 'NOTDEFINED', INDETERMINATE) +assignee = IfcOccupantTypeEnum.ASSIGNEE +assignor = IfcOccupantTypeEnum.ASSIGNOR +lessee = IfcOccupantTypeEnum.LESSEE +lessor = IfcOccupantTypeEnum.LESSOR +lettingagent = IfcOccupantTypeEnum.LETTINGAGENT +owner = IfcOccupantTypeEnum.OWNER +tenant = IfcOccupantTypeEnum.TENANT +userdefined = IfcOccupantTypeEnum.USERDEFINED +notdefined = IfcOccupantTypeEnum.NOTDEFINED IfcOpeningElementTypeEnum = enum_namespace() -opening = express_getattr(IfcOpeningElementTypeEnum, 'OPENING', INDETERMINATE) -recess = express_getattr(IfcOpeningElementTypeEnum, 'RECESS', INDETERMINATE) -userdefined = express_getattr(IfcOpeningElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcOpeningElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +opening = IfcOpeningElementTypeEnum.OPENING +recess = IfcOpeningElementTypeEnum.RECESS +userdefined = IfcOpeningElementTypeEnum.USERDEFINED +notdefined = IfcOpeningElementTypeEnum.NOTDEFINED IfcOutletTypeEnum = enum_namespace() -audiovisualoutlet = express_getattr(IfcOutletTypeEnum, 'AUDIOVISUALOUTLET', INDETERMINATE) -communicationsoutlet = express_getattr(IfcOutletTypeEnum, 'COMMUNICATIONSOUTLET', INDETERMINATE) -dataoutlet = express_getattr(IfcOutletTypeEnum, 'DATAOUTLET', INDETERMINATE) -poweroutlet = express_getattr(IfcOutletTypeEnum, 'POWEROUTLET', INDETERMINATE) -telephoneoutlet = express_getattr(IfcOutletTypeEnum, 'TELEPHONEOUTLET', INDETERMINATE) -userdefined = express_getattr(IfcOutletTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcOutletTypeEnum, 'NOTDEFINED', INDETERMINATE) +audiovisualoutlet = IfcOutletTypeEnum.AUDIOVISUALOUTLET +communicationsoutlet = IfcOutletTypeEnum.COMMUNICATIONSOUTLET +dataoutlet = IfcOutletTypeEnum.DATAOUTLET +poweroutlet = IfcOutletTypeEnum.POWEROUTLET +telephoneoutlet = IfcOutletTypeEnum.TELEPHONEOUTLET +userdefined = IfcOutletTypeEnum.USERDEFINED +notdefined = IfcOutletTypeEnum.NOTDEFINED IfcPavementTypeEnum = enum_namespace() -flexible = express_getattr(IfcPavementTypeEnum, 'FLEXIBLE', INDETERMINATE) -rigid = express_getattr(IfcPavementTypeEnum, 'RIGID', INDETERMINATE) -userdefined = express_getattr(IfcPavementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPavementTypeEnum, 'NOTDEFINED', INDETERMINATE) +flexible = IfcPavementTypeEnum.FLEXIBLE +rigid = IfcPavementTypeEnum.RIGID +userdefined = IfcPavementTypeEnum.USERDEFINED +notdefined = IfcPavementTypeEnum.NOTDEFINED IfcPerformanceHistoryTypeEnum = enum_namespace() -userdefined = express_getattr(IfcPerformanceHistoryTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPerformanceHistoryTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcPerformanceHistoryTypeEnum.USERDEFINED +notdefined = IfcPerformanceHistoryTypeEnum.NOTDEFINED IfcPermeableCoveringOperationEnum = enum_namespace() -grill = express_getattr(IfcPermeableCoveringOperationEnum, 'GRILL', INDETERMINATE) -louver = express_getattr(IfcPermeableCoveringOperationEnum, 'LOUVER', INDETERMINATE) -screen = express_getattr(IfcPermeableCoveringOperationEnum, 'SCREEN', INDETERMINATE) -userdefined = express_getattr(IfcPermeableCoveringOperationEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPermeableCoveringOperationEnum, 'NOTDEFINED', INDETERMINATE) +grill = IfcPermeableCoveringOperationEnum.GRILL +louver = IfcPermeableCoveringOperationEnum.LOUVER +screen = IfcPermeableCoveringOperationEnum.SCREEN +userdefined = IfcPermeableCoveringOperationEnum.USERDEFINED +notdefined = IfcPermeableCoveringOperationEnum.NOTDEFINED IfcPermitTypeEnum = enum_namespace() -access = express_getattr(IfcPermitTypeEnum, 'ACCESS', INDETERMINATE) -building = express_getattr(IfcPermitTypeEnum, 'BUILDING', INDETERMINATE) -work = express_getattr(IfcPermitTypeEnum, 'WORK', INDETERMINATE) -userdefined = express_getattr(IfcPermitTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPermitTypeEnum, 'NOTDEFINED', INDETERMINATE) +access = IfcPermitTypeEnum.ACCESS +building = IfcPermitTypeEnum.BUILDING +work = IfcPermitTypeEnum.WORK +userdefined = IfcPermitTypeEnum.USERDEFINED +notdefined = IfcPermitTypeEnum.NOTDEFINED IfcPhysicalOrVirtualEnum = enum_namespace() -physical = express_getattr(IfcPhysicalOrVirtualEnum, 'PHYSICAL', INDETERMINATE) -virtual = express_getattr(IfcPhysicalOrVirtualEnum, 'VIRTUAL', INDETERMINATE) -notdefined = express_getattr(IfcPhysicalOrVirtualEnum, 'NOTDEFINED', INDETERMINATE) +physical = IfcPhysicalOrVirtualEnum.PHYSICAL +virtual = IfcPhysicalOrVirtualEnum.VIRTUAL +notdefined = IfcPhysicalOrVirtualEnum.NOTDEFINED IfcPileConstructionEnum = enum_namespace() -cast_in_place = express_getattr(IfcPileConstructionEnum, 'CAST_IN_PLACE', INDETERMINATE) -composite = express_getattr(IfcPileConstructionEnum, 'COMPOSITE', INDETERMINATE) -precast_concrete = express_getattr(IfcPileConstructionEnum, 'PRECAST_CONCRETE', INDETERMINATE) -prefab_steel = express_getattr(IfcPileConstructionEnum, 'PREFAB_STEEL', INDETERMINATE) -userdefined = express_getattr(IfcPileConstructionEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPileConstructionEnum, 'NOTDEFINED', INDETERMINATE) +cast_in_place = IfcPileConstructionEnum.CAST_IN_PLACE +composite = IfcPileConstructionEnum.COMPOSITE +precast_concrete = IfcPileConstructionEnum.PRECAST_CONCRETE +prefab_steel = IfcPileConstructionEnum.PREFAB_STEEL +userdefined = IfcPileConstructionEnum.USERDEFINED +notdefined = IfcPileConstructionEnum.NOTDEFINED IfcPileTypeEnum = enum_namespace() -bored = express_getattr(IfcPileTypeEnum, 'BORED', INDETERMINATE) -cohesion = express_getattr(IfcPileTypeEnum, 'COHESION', INDETERMINATE) -driven = express_getattr(IfcPileTypeEnum, 'DRIVEN', INDETERMINATE) -friction = express_getattr(IfcPileTypeEnum, 'FRICTION', INDETERMINATE) -jetgrouting = express_getattr(IfcPileTypeEnum, 'JETGROUTING', INDETERMINATE) -support = express_getattr(IfcPileTypeEnum, 'SUPPORT', INDETERMINATE) -userdefined = express_getattr(IfcPileTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPileTypeEnum, 'NOTDEFINED', INDETERMINATE) +bored = IfcPileTypeEnum.BORED +cohesion = IfcPileTypeEnum.COHESION +driven = IfcPileTypeEnum.DRIVEN +friction = IfcPileTypeEnum.FRICTION +jetgrouting = IfcPileTypeEnum.JETGROUTING +support = IfcPileTypeEnum.SUPPORT +userdefined = IfcPileTypeEnum.USERDEFINED +notdefined = IfcPileTypeEnum.NOTDEFINED IfcPipeFittingTypeEnum = enum_namespace() -bend = express_getattr(IfcPipeFittingTypeEnum, 'BEND', INDETERMINATE) -connector = express_getattr(IfcPipeFittingTypeEnum, 'CONNECTOR', INDETERMINATE) -entry = express_getattr(IfcPipeFittingTypeEnum, 'ENTRY', INDETERMINATE) -exit = express_getattr(IfcPipeFittingTypeEnum, 'EXIT', INDETERMINATE) -junction = express_getattr(IfcPipeFittingTypeEnum, 'JUNCTION', INDETERMINATE) -obstruction = express_getattr(IfcPipeFittingTypeEnum, 'OBSTRUCTION', INDETERMINATE) -transition = express_getattr(IfcPipeFittingTypeEnum, 'TRANSITION', INDETERMINATE) -userdefined = express_getattr(IfcPipeFittingTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPipeFittingTypeEnum, 'NOTDEFINED', INDETERMINATE) +bend = IfcPipeFittingTypeEnum.BEND +connector = IfcPipeFittingTypeEnum.CONNECTOR +entry = IfcPipeFittingTypeEnum.ENTRY +exit = IfcPipeFittingTypeEnum.EXIT +junction = IfcPipeFittingTypeEnum.JUNCTION +obstruction = IfcPipeFittingTypeEnum.OBSTRUCTION +transition = IfcPipeFittingTypeEnum.TRANSITION +userdefined = IfcPipeFittingTypeEnum.USERDEFINED +notdefined = IfcPipeFittingTypeEnum.NOTDEFINED IfcPipeSegmentTypeEnum = enum_namespace() -culvert = express_getattr(IfcPipeSegmentTypeEnum, 'CULVERT', INDETERMINATE) -flexiblesegment = express_getattr(IfcPipeSegmentTypeEnum, 'FLEXIBLESEGMENT', INDETERMINATE) -gutter = express_getattr(IfcPipeSegmentTypeEnum, 'GUTTER', INDETERMINATE) -rigidsegment = express_getattr(IfcPipeSegmentTypeEnum, 'RIGIDSEGMENT', INDETERMINATE) -spool = express_getattr(IfcPipeSegmentTypeEnum, 'SPOOL', INDETERMINATE) -userdefined = express_getattr(IfcPipeSegmentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPipeSegmentTypeEnum, 'NOTDEFINED', INDETERMINATE) +culvert = IfcPipeSegmentTypeEnum.CULVERT +flexiblesegment = IfcPipeSegmentTypeEnum.FLEXIBLESEGMENT +gutter = IfcPipeSegmentTypeEnum.GUTTER +rigidsegment = IfcPipeSegmentTypeEnum.RIGIDSEGMENT +spool = IfcPipeSegmentTypeEnum.SPOOL +userdefined = IfcPipeSegmentTypeEnum.USERDEFINED +notdefined = IfcPipeSegmentTypeEnum.NOTDEFINED IfcPlateTypeEnum = enum_namespace() -base_plate = express_getattr(IfcPlateTypeEnum, 'BASE_PLATE', INDETERMINATE) -cover_plate = express_getattr(IfcPlateTypeEnum, 'COVER_PLATE', INDETERMINATE) -curtain_panel = express_getattr(IfcPlateTypeEnum, 'CURTAIN_PANEL', INDETERMINATE) -flange_plate = express_getattr(IfcPlateTypeEnum, 'FLANGE_PLATE', INDETERMINATE) -gusset_plate = express_getattr(IfcPlateTypeEnum, 'GUSSET_PLATE', INDETERMINATE) -sheet = express_getattr(IfcPlateTypeEnum, 'SHEET', INDETERMINATE) -splice_plate = express_getattr(IfcPlateTypeEnum, 'SPLICE_PLATE', INDETERMINATE) -stiffener_plate = express_getattr(IfcPlateTypeEnum, 'STIFFENER_PLATE', INDETERMINATE) -web_plate = express_getattr(IfcPlateTypeEnum, 'WEB_PLATE', INDETERMINATE) -userdefined = express_getattr(IfcPlateTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPlateTypeEnum, 'NOTDEFINED', INDETERMINATE) +base_plate = IfcPlateTypeEnum.BASE_PLATE +cover_plate = IfcPlateTypeEnum.COVER_PLATE +curtain_panel = IfcPlateTypeEnum.CURTAIN_PANEL +flange_plate = IfcPlateTypeEnum.FLANGE_PLATE +gusset_plate = IfcPlateTypeEnum.GUSSET_PLATE +sheet = IfcPlateTypeEnum.SHEET +splice_plate = IfcPlateTypeEnum.SPLICE_PLATE +stiffener_plate = IfcPlateTypeEnum.STIFFENER_PLATE +web_plate = IfcPlateTypeEnum.WEB_PLATE +userdefined = IfcPlateTypeEnum.USERDEFINED +notdefined = IfcPlateTypeEnum.NOTDEFINED IfcPreferredSurfaceCurveRepresentation = enum_namespace() -curve3d = express_getattr(IfcPreferredSurfaceCurveRepresentation, 'CURVE3D', INDETERMINATE) -pcurve_s1 = express_getattr(IfcPreferredSurfaceCurveRepresentation, 'PCURVE_S1', INDETERMINATE) -pcurve_s2 = express_getattr(IfcPreferredSurfaceCurveRepresentation, 'PCURVE_S2', INDETERMINATE) +curve3d = IfcPreferredSurfaceCurveRepresentation.CURVE3D +pcurve_s1 = IfcPreferredSurfaceCurveRepresentation.PCURVE_S1 +pcurve_s2 = IfcPreferredSurfaceCurveRepresentation.PCURVE_S2 IfcProcedureTypeEnum = enum_namespace() -advice_caution = express_getattr(IfcProcedureTypeEnum, 'ADVICE_CAUTION', INDETERMINATE) -advice_note = express_getattr(IfcProcedureTypeEnum, 'ADVICE_NOTE', INDETERMINATE) -advice_warning = express_getattr(IfcProcedureTypeEnum, 'ADVICE_WARNING', INDETERMINATE) -calibration = express_getattr(IfcProcedureTypeEnum, 'CALIBRATION', INDETERMINATE) -diagnostic = express_getattr(IfcProcedureTypeEnum, 'DIAGNOSTIC', INDETERMINATE) -shutdown = express_getattr(IfcProcedureTypeEnum, 'SHUTDOWN', INDETERMINATE) -startup = express_getattr(IfcProcedureTypeEnum, 'STARTUP', INDETERMINATE) -userdefined = express_getattr(IfcProcedureTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcProcedureTypeEnum, 'NOTDEFINED', INDETERMINATE) +advice_caution = IfcProcedureTypeEnum.ADVICE_CAUTION +advice_note = IfcProcedureTypeEnum.ADVICE_NOTE +advice_warning = IfcProcedureTypeEnum.ADVICE_WARNING +calibration = IfcProcedureTypeEnum.CALIBRATION +diagnostic = IfcProcedureTypeEnum.DIAGNOSTIC +shutdown = IfcProcedureTypeEnum.SHUTDOWN +startup = IfcProcedureTypeEnum.STARTUP +userdefined = IfcProcedureTypeEnum.USERDEFINED +notdefined = IfcProcedureTypeEnum.NOTDEFINED IfcProfileTypeEnum = enum_namespace() -area = express_getattr(IfcProfileTypeEnum, 'AREA', INDETERMINATE) -curve = express_getattr(IfcProfileTypeEnum, 'CURVE', INDETERMINATE) +area = IfcProfileTypeEnum.AREA +curve = IfcProfileTypeEnum.CURVE IfcProjectOrderTypeEnum = enum_namespace() -changeorder = express_getattr(IfcProjectOrderTypeEnum, 'CHANGEORDER', INDETERMINATE) -maintenanceworkorder = express_getattr(IfcProjectOrderTypeEnum, 'MAINTENANCEWORKORDER', INDETERMINATE) -moveorder = express_getattr(IfcProjectOrderTypeEnum, 'MOVEORDER', INDETERMINATE) -purchaseorder = express_getattr(IfcProjectOrderTypeEnum, 'PURCHASEORDER', INDETERMINATE) -workorder = express_getattr(IfcProjectOrderTypeEnum, 'WORKORDER', INDETERMINATE) -userdefined = express_getattr(IfcProjectOrderTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcProjectOrderTypeEnum, 'NOTDEFINED', INDETERMINATE) +changeorder = IfcProjectOrderTypeEnum.CHANGEORDER +maintenanceworkorder = IfcProjectOrderTypeEnum.MAINTENANCEWORKORDER +moveorder = IfcProjectOrderTypeEnum.MOVEORDER +purchaseorder = IfcProjectOrderTypeEnum.PURCHASEORDER +workorder = IfcProjectOrderTypeEnum.WORKORDER +userdefined = IfcProjectOrderTypeEnum.USERDEFINED +notdefined = IfcProjectOrderTypeEnum.NOTDEFINED IfcProjectedOrTrueLengthEnum = enum_namespace() -projected_length = express_getattr(IfcProjectedOrTrueLengthEnum, 'PROJECTED_LENGTH', INDETERMINATE) -true_length = express_getattr(IfcProjectedOrTrueLengthEnum, 'TRUE_LENGTH', INDETERMINATE) +projected_length = IfcProjectedOrTrueLengthEnum.PROJECTED_LENGTH +true_length = IfcProjectedOrTrueLengthEnum.TRUE_LENGTH IfcProjectionElementTypeEnum = enum_namespace() -blister = express_getattr(IfcProjectionElementTypeEnum, 'BLISTER', INDETERMINATE) -deviator = express_getattr(IfcProjectionElementTypeEnum, 'DEVIATOR', INDETERMINATE) -userdefined = express_getattr(IfcProjectionElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcProjectionElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +blister = IfcProjectionElementTypeEnum.BLISTER +deviator = IfcProjectionElementTypeEnum.DEVIATOR +userdefined = IfcProjectionElementTypeEnum.USERDEFINED +notdefined = IfcProjectionElementTypeEnum.NOTDEFINED IfcPropertySetTemplateTypeEnum = enum_namespace() -pset_materialdriven = express_getattr(IfcPropertySetTemplateTypeEnum, 'PSET_MATERIALDRIVEN', INDETERMINATE) -pset_occurrencedriven = express_getattr(IfcPropertySetTemplateTypeEnum, 'PSET_OCCURRENCEDRIVEN', INDETERMINATE) -pset_performancedriven = express_getattr(IfcPropertySetTemplateTypeEnum, 'PSET_PERFORMANCEDRIVEN', INDETERMINATE) -pset_profiledriven = express_getattr(IfcPropertySetTemplateTypeEnum, 'PSET_PROFILEDRIVEN', INDETERMINATE) -pset_typedrivenonly = express_getattr(IfcPropertySetTemplateTypeEnum, 'PSET_TYPEDRIVENONLY', INDETERMINATE) -pset_typedrivenoverride = express_getattr(IfcPropertySetTemplateTypeEnum, 'PSET_TYPEDRIVENOVERRIDE', INDETERMINATE) -qto_occurrencedriven = express_getattr(IfcPropertySetTemplateTypeEnum, 'QTO_OCCURRENCEDRIVEN', INDETERMINATE) -qto_typedrivenonly = express_getattr(IfcPropertySetTemplateTypeEnum, 'QTO_TYPEDRIVENONLY', INDETERMINATE) -qto_typedrivenoverride = express_getattr(IfcPropertySetTemplateTypeEnum, 'QTO_TYPEDRIVENOVERRIDE', INDETERMINATE) -notdefined = express_getattr(IfcPropertySetTemplateTypeEnum, 'NOTDEFINED', INDETERMINATE) +pset_materialdriven = IfcPropertySetTemplateTypeEnum.PSET_MATERIALDRIVEN +pset_occurrencedriven = IfcPropertySetTemplateTypeEnum.PSET_OCCURRENCEDRIVEN +pset_performancedriven = IfcPropertySetTemplateTypeEnum.PSET_PERFORMANCEDRIVEN +pset_profiledriven = IfcPropertySetTemplateTypeEnum.PSET_PROFILEDRIVEN +pset_typedrivenonly = IfcPropertySetTemplateTypeEnum.PSET_TYPEDRIVENONLY +pset_typedrivenoverride = IfcPropertySetTemplateTypeEnum.PSET_TYPEDRIVENOVERRIDE +qto_occurrencedriven = IfcPropertySetTemplateTypeEnum.QTO_OCCURRENCEDRIVEN +qto_typedrivenonly = IfcPropertySetTemplateTypeEnum.QTO_TYPEDRIVENONLY +qto_typedrivenoverride = IfcPropertySetTemplateTypeEnum.QTO_TYPEDRIVENOVERRIDE +notdefined = IfcPropertySetTemplateTypeEnum.NOTDEFINED IfcProtectiveDeviceTrippingUnitTypeEnum = enum_namespace() -electromagnetic = express_getattr(IfcProtectiveDeviceTrippingUnitTypeEnum, 'ELECTROMAGNETIC', INDETERMINATE) -electronic = express_getattr(IfcProtectiveDeviceTrippingUnitTypeEnum, 'ELECTRONIC', INDETERMINATE) -residualcurrent = express_getattr(IfcProtectiveDeviceTrippingUnitTypeEnum, 'RESIDUALCURRENT', INDETERMINATE) -thermal = express_getattr(IfcProtectiveDeviceTrippingUnitTypeEnum, 'THERMAL', INDETERMINATE) -userdefined = express_getattr(IfcProtectiveDeviceTrippingUnitTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcProtectiveDeviceTrippingUnitTypeEnum, 'NOTDEFINED', INDETERMINATE) +electromagnetic = IfcProtectiveDeviceTrippingUnitTypeEnum.ELECTROMAGNETIC +electronic = IfcProtectiveDeviceTrippingUnitTypeEnum.ELECTRONIC +residualcurrent = IfcProtectiveDeviceTrippingUnitTypeEnum.RESIDUALCURRENT +thermal = IfcProtectiveDeviceTrippingUnitTypeEnum.THERMAL +userdefined = IfcProtectiveDeviceTrippingUnitTypeEnum.USERDEFINED +notdefined = IfcProtectiveDeviceTrippingUnitTypeEnum.NOTDEFINED IfcProtectiveDeviceTypeEnum = enum_namespace() -anti_arcing_device = express_getattr(IfcProtectiveDeviceTypeEnum, 'ANTI_ARCING_DEVICE', INDETERMINATE) -circuitbreaker = express_getattr(IfcProtectiveDeviceTypeEnum, 'CIRCUITBREAKER', INDETERMINATE) -earthingswitch = express_getattr(IfcProtectiveDeviceTypeEnum, 'EARTHINGSWITCH', INDETERMINATE) -earthleakagecircuitbreaker = express_getattr(IfcProtectiveDeviceTypeEnum, 'EARTHLEAKAGECIRCUITBREAKER', INDETERMINATE) -fusedisconnector = express_getattr(IfcProtectiveDeviceTypeEnum, 'FUSEDISCONNECTOR', INDETERMINATE) -residualcurrentcircuitbreaker = express_getattr(IfcProtectiveDeviceTypeEnum, 'RESIDUALCURRENTCIRCUITBREAKER', INDETERMINATE) -residualcurrentswitch = express_getattr(IfcProtectiveDeviceTypeEnum, 'RESIDUALCURRENTSWITCH', INDETERMINATE) -sparkgap = express_getattr(IfcProtectiveDeviceTypeEnum, 'SPARKGAP', INDETERMINATE) -varistor = express_getattr(IfcProtectiveDeviceTypeEnum, 'VARISTOR', INDETERMINATE) -voltagelimiter = express_getattr(IfcProtectiveDeviceTypeEnum, 'VOLTAGELIMITER', INDETERMINATE) -userdefined = express_getattr(IfcProtectiveDeviceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcProtectiveDeviceTypeEnum, 'NOTDEFINED', INDETERMINATE) +anti_arcing_device = IfcProtectiveDeviceTypeEnum.ANTI_ARCING_DEVICE +circuitbreaker = IfcProtectiveDeviceTypeEnum.CIRCUITBREAKER +earthingswitch = IfcProtectiveDeviceTypeEnum.EARTHINGSWITCH +earthleakagecircuitbreaker = IfcProtectiveDeviceTypeEnum.EARTHLEAKAGECIRCUITBREAKER +fusedisconnector = IfcProtectiveDeviceTypeEnum.FUSEDISCONNECTOR +residualcurrentcircuitbreaker = IfcProtectiveDeviceTypeEnum.RESIDUALCURRENTCIRCUITBREAKER +residualcurrentswitch = IfcProtectiveDeviceTypeEnum.RESIDUALCURRENTSWITCH +sparkgap = IfcProtectiveDeviceTypeEnum.SPARKGAP +varistor = IfcProtectiveDeviceTypeEnum.VARISTOR +voltagelimiter = IfcProtectiveDeviceTypeEnum.VOLTAGELIMITER +userdefined = IfcProtectiveDeviceTypeEnum.USERDEFINED +notdefined = IfcProtectiveDeviceTypeEnum.NOTDEFINED IfcPumpTypeEnum = enum_namespace() -circulator = express_getattr(IfcPumpTypeEnum, 'CIRCULATOR', INDETERMINATE) -endsuction = express_getattr(IfcPumpTypeEnum, 'ENDSUCTION', INDETERMINATE) -splitcase = express_getattr(IfcPumpTypeEnum, 'SPLITCASE', INDETERMINATE) -submersiblepump = express_getattr(IfcPumpTypeEnum, 'SUBMERSIBLEPUMP', INDETERMINATE) -sumppump = express_getattr(IfcPumpTypeEnum, 'SUMPPUMP', INDETERMINATE) -verticalinline = express_getattr(IfcPumpTypeEnum, 'VERTICALINLINE', INDETERMINATE) -verticalturbine = express_getattr(IfcPumpTypeEnum, 'VERTICALTURBINE', INDETERMINATE) -userdefined = express_getattr(IfcPumpTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPumpTypeEnum, 'NOTDEFINED', INDETERMINATE) +circulator = IfcPumpTypeEnum.CIRCULATOR +endsuction = IfcPumpTypeEnum.ENDSUCTION +splitcase = IfcPumpTypeEnum.SPLITCASE +submersiblepump = IfcPumpTypeEnum.SUBMERSIBLEPUMP +sumppump = IfcPumpTypeEnum.SUMPPUMP +verticalinline = IfcPumpTypeEnum.VERTICALINLINE +verticalturbine = IfcPumpTypeEnum.VERTICALTURBINE +userdefined = IfcPumpTypeEnum.USERDEFINED +notdefined = IfcPumpTypeEnum.NOTDEFINED IfcRailTypeEnum = enum_namespace() -blade = express_getattr(IfcRailTypeEnum, 'BLADE', INDETERMINATE) -checkrail = express_getattr(IfcRailTypeEnum, 'CHECKRAIL', INDETERMINATE) -guardrail = express_getattr(IfcRailTypeEnum, 'GUARDRAIL', INDETERMINATE) -rackrail = express_getattr(IfcRailTypeEnum, 'RACKRAIL', INDETERMINATE) -rail = express_getattr(IfcRailTypeEnum, 'RAIL', INDETERMINATE) -stockrail = express_getattr(IfcRailTypeEnum, 'STOCKRAIL', INDETERMINATE) -userdefined = express_getattr(IfcRailTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcRailTypeEnum, 'NOTDEFINED', INDETERMINATE) +blade = IfcRailTypeEnum.BLADE +checkrail = IfcRailTypeEnum.CHECKRAIL +guardrail = IfcRailTypeEnum.GUARDRAIL +rackrail = IfcRailTypeEnum.RACKRAIL +rail = IfcRailTypeEnum.RAIL +stockrail = IfcRailTypeEnum.STOCKRAIL +userdefined = IfcRailTypeEnum.USERDEFINED +notdefined = IfcRailTypeEnum.NOTDEFINED IfcRailingTypeEnum = enum_namespace() -balustrade = express_getattr(IfcRailingTypeEnum, 'BALUSTRADE', INDETERMINATE) -fence = express_getattr(IfcRailingTypeEnum, 'FENCE', INDETERMINATE) -guardrail = express_getattr(IfcRailingTypeEnum, 'GUARDRAIL', INDETERMINATE) -handrail = express_getattr(IfcRailingTypeEnum, 'HANDRAIL', INDETERMINATE) -userdefined = express_getattr(IfcRailingTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcRailingTypeEnum, 'NOTDEFINED', INDETERMINATE) +balustrade = IfcRailingTypeEnum.BALUSTRADE +fence = IfcRailingTypeEnum.FENCE +guardrail = IfcRailingTypeEnum.GUARDRAIL +handrail = IfcRailingTypeEnum.HANDRAIL +userdefined = IfcRailingTypeEnum.USERDEFINED +notdefined = IfcRailingTypeEnum.NOTDEFINED IfcRailwayPartTypeEnum = enum_namespace() -dilatationsuperstructure = express_getattr(IfcRailwayPartTypeEnum, 'DILATATIONSUPERSTRUCTURE', INDETERMINATE) -linesidestructure = express_getattr(IfcRailwayPartTypeEnum, 'LINESIDESTRUCTURE', INDETERMINATE) -linesidestructurepart = express_getattr(IfcRailwayPartTypeEnum, 'LINESIDESTRUCTUREPART', INDETERMINATE) -plaintracksuperstructure = express_getattr(IfcRailwayPartTypeEnum, 'PLAINTRACKSUPERSTRUCTURE', INDETERMINATE) -superstructure = express_getattr(IfcRailwayPartTypeEnum, 'SUPERSTRUCTURE', INDETERMINATE) -trackstructure = express_getattr(IfcRailwayPartTypeEnum, 'TRACKSTRUCTURE', INDETERMINATE) -trackstructurepart = express_getattr(IfcRailwayPartTypeEnum, 'TRACKSTRUCTUREPART', INDETERMINATE) -turnoutsuperstructure = express_getattr(IfcRailwayPartTypeEnum, 'TURNOUTSUPERSTRUCTURE', INDETERMINATE) -userdefined = express_getattr(IfcRailwayPartTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcRailwayPartTypeEnum, 'NOTDEFINED', INDETERMINATE) +dilatationsuperstructure = IfcRailwayPartTypeEnum.DILATATIONSUPERSTRUCTURE +linesidestructure = IfcRailwayPartTypeEnum.LINESIDESTRUCTURE +linesidestructurepart = IfcRailwayPartTypeEnum.LINESIDESTRUCTUREPART +plaintracksuperstructure = IfcRailwayPartTypeEnum.PLAINTRACKSUPERSTRUCTURE +superstructure = IfcRailwayPartTypeEnum.SUPERSTRUCTURE +trackstructure = IfcRailwayPartTypeEnum.TRACKSTRUCTURE +trackstructurepart = IfcRailwayPartTypeEnum.TRACKSTRUCTUREPART +turnoutsuperstructure = IfcRailwayPartTypeEnum.TURNOUTSUPERSTRUCTURE +userdefined = IfcRailwayPartTypeEnum.USERDEFINED +notdefined = IfcRailwayPartTypeEnum.NOTDEFINED IfcRailwayTypeEnum = enum_namespace() -userdefined = express_getattr(IfcRailwayTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcRailwayTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcRailwayTypeEnum.USERDEFINED +notdefined = IfcRailwayTypeEnum.NOTDEFINED IfcRampFlightTypeEnum = enum_namespace() -spiral = express_getattr(IfcRampFlightTypeEnum, 'SPIRAL', INDETERMINATE) -straight = express_getattr(IfcRampFlightTypeEnum, 'STRAIGHT', INDETERMINATE) -userdefined = express_getattr(IfcRampFlightTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcRampFlightTypeEnum, 'NOTDEFINED', INDETERMINATE) +spiral = IfcRampFlightTypeEnum.SPIRAL +straight = IfcRampFlightTypeEnum.STRAIGHT +userdefined = IfcRampFlightTypeEnum.USERDEFINED +notdefined = IfcRampFlightTypeEnum.NOTDEFINED IfcRampTypeEnum = enum_namespace() -half_turn_ramp = express_getattr(IfcRampTypeEnum, 'HALF_TURN_RAMP', INDETERMINATE) -quarter_turn_ramp = express_getattr(IfcRampTypeEnum, 'QUARTER_TURN_RAMP', INDETERMINATE) -spiral_ramp = express_getattr(IfcRampTypeEnum, 'SPIRAL_RAMP', INDETERMINATE) -straight_run_ramp = express_getattr(IfcRampTypeEnum, 'STRAIGHT_RUN_RAMP', INDETERMINATE) -two_quarter_turn_ramp = express_getattr(IfcRampTypeEnum, 'TWO_QUARTER_TURN_RAMP', INDETERMINATE) -two_straight_run_ramp = express_getattr(IfcRampTypeEnum, 'TWO_STRAIGHT_RUN_RAMP', INDETERMINATE) -userdefined = express_getattr(IfcRampTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcRampTypeEnum, 'NOTDEFINED', INDETERMINATE) +half_turn_ramp = IfcRampTypeEnum.HALF_TURN_RAMP +quarter_turn_ramp = IfcRampTypeEnum.QUARTER_TURN_RAMP +spiral_ramp = IfcRampTypeEnum.SPIRAL_RAMP +straight_run_ramp = IfcRampTypeEnum.STRAIGHT_RUN_RAMP +two_quarter_turn_ramp = IfcRampTypeEnum.TWO_QUARTER_TURN_RAMP +two_straight_run_ramp = IfcRampTypeEnum.TWO_STRAIGHT_RUN_RAMP +userdefined = IfcRampTypeEnum.USERDEFINED +notdefined = IfcRampTypeEnum.NOTDEFINED IfcRecurrenceTypeEnum = enum_namespace() -by_day_count = express_getattr(IfcRecurrenceTypeEnum, 'BY_DAY_COUNT', INDETERMINATE) -by_weekday_count = express_getattr(IfcRecurrenceTypeEnum, 'BY_WEEKDAY_COUNT', INDETERMINATE) -daily = express_getattr(IfcRecurrenceTypeEnum, 'DAILY', INDETERMINATE) -monthly_by_day_of_month = express_getattr(IfcRecurrenceTypeEnum, 'MONTHLY_BY_DAY_OF_MONTH', INDETERMINATE) -monthly_by_position = express_getattr(IfcRecurrenceTypeEnum, 'MONTHLY_BY_POSITION', INDETERMINATE) -weekly = express_getattr(IfcRecurrenceTypeEnum, 'WEEKLY', INDETERMINATE) -yearly_by_day_of_month = express_getattr(IfcRecurrenceTypeEnum, 'YEARLY_BY_DAY_OF_MONTH', INDETERMINATE) -yearly_by_position = express_getattr(IfcRecurrenceTypeEnum, 'YEARLY_BY_POSITION', INDETERMINATE) +by_day_count = IfcRecurrenceTypeEnum.BY_DAY_COUNT +by_weekday_count = IfcRecurrenceTypeEnum.BY_WEEKDAY_COUNT +daily = IfcRecurrenceTypeEnum.DAILY +monthly_by_day_of_month = IfcRecurrenceTypeEnum.MONTHLY_BY_DAY_OF_MONTH +monthly_by_position = IfcRecurrenceTypeEnum.MONTHLY_BY_POSITION +weekly = IfcRecurrenceTypeEnum.WEEKLY +yearly_by_day_of_month = IfcRecurrenceTypeEnum.YEARLY_BY_DAY_OF_MONTH +yearly_by_position = IfcRecurrenceTypeEnum.YEARLY_BY_POSITION IfcReferentTypeEnum = enum_namespace() -boundary = express_getattr(IfcReferentTypeEnum, 'BOUNDARY', INDETERMINATE) -intersection = express_getattr(IfcReferentTypeEnum, 'INTERSECTION', INDETERMINATE) -kilopoint = express_getattr(IfcReferentTypeEnum, 'KILOPOINT', INDETERMINATE) -landmark = express_getattr(IfcReferentTypeEnum, 'LANDMARK', INDETERMINATE) -milepoint = express_getattr(IfcReferentTypeEnum, 'MILEPOINT', INDETERMINATE) -position = express_getattr(IfcReferentTypeEnum, 'POSITION', INDETERMINATE) -referencemarker = express_getattr(IfcReferentTypeEnum, 'REFERENCEMARKER', INDETERMINATE) -station = express_getattr(IfcReferentTypeEnum, 'STATION', INDETERMINATE) -userdefined = express_getattr(IfcReferentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcReferentTypeEnum, 'NOTDEFINED', INDETERMINATE) +boundary = IfcReferentTypeEnum.BOUNDARY +intersection = IfcReferentTypeEnum.INTERSECTION +kilopoint = IfcReferentTypeEnum.KILOPOINT +landmark = IfcReferentTypeEnum.LANDMARK +milepoint = IfcReferentTypeEnum.MILEPOINT +position = IfcReferentTypeEnum.POSITION +referencemarker = IfcReferentTypeEnum.REFERENCEMARKER +station = IfcReferentTypeEnum.STATION +userdefined = IfcReferentTypeEnum.USERDEFINED +notdefined = IfcReferentTypeEnum.NOTDEFINED IfcReflectanceMethodEnum = enum_namespace() -blinn = express_getattr(IfcReflectanceMethodEnum, 'BLINN', INDETERMINATE) -flat = express_getattr(IfcReflectanceMethodEnum, 'FLAT', INDETERMINATE) -glass = express_getattr(IfcReflectanceMethodEnum, 'GLASS', INDETERMINATE) -matt = express_getattr(IfcReflectanceMethodEnum, 'MATT', INDETERMINATE) -metal = express_getattr(IfcReflectanceMethodEnum, 'METAL', INDETERMINATE) -mirror = express_getattr(IfcReflectanceMethodEnum, 'MIRROR', INDETERMINATE) -phong = express_getattr(IfcReflectanceMethodEnum, 'PHONG', INDETERMINATE) -physical = express_getattr(IfcReflectanceMethodEnum, 'PHYSICAL', INDETERMINATE) -plastic = express_getattr(IfcReflectanceMethodEnum, 'PLASTIC', INDETERMINATE) -strauss = express_getattr(IfcReflectanceMethodEnum, 'STRAUSS', INDETERMINATE) -notdefined = express_getattr(IfcReflectanceMethodEnum, 'NOTDEFINED', INDETERMINATE) +blinn = IfcReflectanceMethodEnum.BLINN +flat = IfcReflectanceMethodEnum.FLAT +glass = IfcReflectanceMethodEnum.GLASS +matt = IfcReflectanceMethodEnum.MATT +metal = IfcReflectanceMethodEnum.METAL +mirror = IfcReflectanceMethodEnum.MIRROR +phong = IfcReflectanceMethodEnum.PHONG +physical = IfcReflectanceMethodEnum.PHYSICAL +plastic = IfcReflectanceMethodEnum.PLASTIC +strauss = IfcReflectanceMethodEnum.STRAUSS +notdefined = IfcReflectanceMethodEnum.NOTDEFINED IfcReinforcedSoilTypeEnum = enum_namespace() -dynamicallycompacted = express_getattr(IfcReinforcedSoilTypeEnum, 'DYNAMICALLYCOMPACTED', INDETERMINATE) -grouted = express_getattr(IfcReinforcedSoilTypeEnum, 'GROUTED', INDETERMINATE) -replaced = express_getattr(IfcReinforcedSoilTypeEnum, 'REPLACED', INDETERMINATE) -rollercompacted = express_getattr(IfcReinforcedSoilTypeEnum, 'ROLLERCOMPACTED', INDETERMINATE) -surchargepreloaded = express_getattr(IfcReinforcedSoilTypeEnum, 'SURCHARGEPRELOADED', INDETERMINATE) -verticallydrained = express_getattr(IfcReinforcedSoilTypeEnum, 'VERTICALLYDRAINED', INDETERMINATE) -userdefined = express_getattr(IfcReinforcedSoilTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcReinforcedSoilTypeEnum, 'NOTDEFINED', INDETERMINATE) +dynamicallycompacted = IfcReinforcedSoilTypeEnum.DYNAMICALLYCOMPACTED +grouted = IfcReinforcedSoilTypeEnum.GROUTED +replaced = IfcReinforcedSoilTypeEnum.REPLACED +rollercompacted = IfcReinforcedSoilTypeEnum.ROLLERCOMPACTED +surchargepreloaded = IfcReinforcedSoilTypeEnum.SURCHARGEPRELOADED +verticallydrained = IfcReinforcedSoilTypeEnum.VERTICALLYDRAINED +userdefined = IfcReinforcedSoilTypeEnum.USERDEFINED +notdefined = IfcReinforcedSoilTypeEnum.NOTDEFINED IfcReinforcingBarRoleEnum = enum_namespace() -anchoring = express_getattr(IfcReinforcingBarRoleEnum, 'ANCHORING', INDETERMINATE) -edge = express_getattr(IfcReinforcingBarRoleEnum, 'EDGE', INDETERMINATE) -ligature = express_getattr(IfcReinforcingBarRoleEnum, 'LIGATURE', INDETERMINATE) -main = express_getattr(IfcReinforcingBarRoleEnum, 'MAIN', INDETERMINATE) -punching = express_getattr(IfcReinforcingBarRoleEnum, 'PUNCHING', INDETERMINATE) -ring = express_getattr(IfcReinforcingBarRoleEnum, 'RING', INDETERMINATE) -shear = express_getattr(IfcReinforcingBarRoleEnum, 'SHEAR', INDETERMINATE) -stud = express_getattr(IfcReinforcingBarRoleEnum, 'STUD', INDETERMINATE) -userdefined = express_getattr(IfcReinforcingBarRoleEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcReinforcingBarRoleEnum, 'NOTDEFINED', INDETERMINATE) +anchoring = IfcReinforcingBarRoleEnum.ANCHORING +edge = IfcReinforcingBarRoleEnum.EDGE +ligature = IfcReinforcingBarRoleEnum.LIGATURE +main = IfcReinforcingBarRoleEnum.MAIN +punching = IfcReinforcingBarRoleEnum.PUNCHING +ring = IfcReinforcingBarRoleEnum.RING +shear = IfcReinforcingBarRoleEnum.SHEAR +stud = IfcReinforcingBarRoleEnum.STUD +userdefined = IfcReinforcingBarRoleEnum.USERDEFINED +notdefined = IfcReinforcingBarRoleEnum.NOTDEFINED IfcReinforcingBarSurfaceEnum = enum_namespace() -plain = express_getattr(IfcReinforcingBarSurfaceEnum, 'PLAIN', INDETERMINATE) -textured = express_getattr(IfcReinforcingBarSurfaceEnum, 'TEXTURED', INDETERMINATE) +plain = IfcReinforcingBarSurfaceEnum.PLAIN +textured = IfcReinforcingBarSurfaceEnum.TEXTURED IfcReinforcingBarTypeEnum = enum_namespace() -anchoring = express_getattr(IfcReinforcingBarTypeEnum, 'ANCHORING', INDETERMINATE) -edge = express_getattr(IfcReinforcingBarTypeEnum, 'EDGE', INDETERMINATE) -ligature = express_getattr(IfcReinforcingBarTypeEnum, 'LIGATURE', INDETERMINATE) -main = express_getattr(IfcReinforcingBarTypeEnum, 'MAIN', INDETERMINATE) -punching = express_getattr(IfcReinforcingBarTypeEnum, 'PUNCHING', INDETERMINATE) -ring = express_getattr(IfcReinforcingBarTypeEnum, 'RING', INDETERMINATE) -shear = express_getattr(IfcReinforcingBarTypeEnum, 'SHEAR', INDETERMINATE) -spacebar = express_getattr(IfcReinforcingBarTypeEnum, 'SPACEBAR', INDETERMINATE) -stud = express_getattr(IfcReinforcingBarTypeEnum, 'STUD', INDETERMINATE) -userdefined = express_getattr(IfcReinforcingBarTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcReinforcingBarTypeEnum, 'NOTDEFINED', INDETERMINATE) +anchoring = IfcReinforcingBarTypeEnum.ANCHORING +edge = IfcReinforcingBarTypeEnum.EDGE +ligature = IfcReinforcingBarTypeEnum.LIGATURE +main = IfcReinforcingBarTypeEnum.MAIN +punching = IfcReinforcingBarTypeEnum.PUNCHING +ring = IfcReinforcingBarTypeEnum.RING +shear = IfcReinforcingBarTypeEnum.SHEAR +spacebar = IfcReinforcingBarTypeEnum.SPACEBAR +stud = IfcReinforcingBarTypeEnum.STUD +userdefined = IfcReinforcingBarTypeEnum.USERDEFINED +notdefined = IfcReinforcingBarTypeEnum.NOTDEFINED IfcReinforcingMeshTypeEnum = enum_namespace() -userdefined = express_getattr(IfcReinforcingMeshTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcReinforcingMeshTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcReinforcingMeshTypeEnum.USERDEFINED +notdefined = IfcReinforcingMeshTypeEnum.NOTDEFINED IfcRoadPartTypeEnum = enum_namespace() -bicyclecrossing = express_getattr(IfcRoadPartTypeEnum, 'BICYCLECROSSING', INDETERMINATE) -bus_stop = express_getattr(IfcRoadPartTypeEnum, 'BUS_STOP', INDETERMINATE) -carriageway = express_getattr(IfcRoadPartTypeEnum, 'CARRIAGEWAY', INDETERMINATE) -centralisland = express_getattr(IfcRoadPartTypeEnum, 'CENTRALISLAND', INDETERMINATE) -centralreserve = express_getattr(IfcRoadPartTypeEnum, 'CENTRALRESERVE', INDETERMINATE) -hardshoulder = express_getattr(IfcRoadPartTypeEnum, 'HARDSHOULDER', INDETERMINATE) -intersection = express_getattr(IfcRoadPartTypeEnum, 'INTERSECTION', INDETERMINATE) -layby = express_getattr(IfcRoadPartTypeEnum, 'LAYBY', INDETERMINATE) -parkingbay = express_getattr(IfcRoadPartTypeEnum, 'PARKINGBAY', INDETERMINATE) -passingbay = express_getattr(IfcRoadPartTypeEnum, 'PASSINGBAY', INDETERMINATE) -pedestrian_crossing = express_getattr(IfcRoadPartTypeEnum, 'PEDESTRIAN_CROSSING', INDETERMINATE) -railwaycrossing = express_getattr(IfcRoadPartTypeEnum, 'RAILWAYCROSSING', INDETERMINATE) -refugeisland = express_getattr(IfcRoadPartTypeEnum, 'REFUGEISLAND', INDETERMINATE) -roadsegment = express_getattr(IfcRoadPartTypeEnum, 'ROADSEGMENT', INDETERMINATE) -roadside = express_getattr(IfcRoadPartTypeEnum, 'ROADSIDE', INDETERMINATE) -roadsidepart = express_getattr(IfcRoadPartTypeEnum, 'ROADSIDEPART', INDETERMINATE) -roadwayplateau = express_getattr(IfcRoadPartTypeEnum, 'ROADWAYPLATEAU', INDETERMINATE) -roundabout = express_getattr(IfcRoadPartTypeEnum, 'ROUNDABOUT', INDETERMINATE) -shoulder = express_getattr(IfcRoadPartTypeEnum, 'SHOULDER', INDETERMINATE) -sidewalk = express_getattr(IfcRoadPartTypeEnum, 'SIDEWALK', INDETERMINATE) -softshoulder = express_getattr(IfcRoadPartTypeEnum, 'SOFTSHOULDER', INDETERMINATE) -tollplaza = express_getattr(IfcRoadPartTypeEnum, 'TOLLPLAZA', INDETERMINATE) -trafficisland = express_getattr(IfcRoadPartTypeEnum, 'TRAFFICISLAND', INDETERMINATE) -trafficlane = express_getattr(IfcRoadPartTypeEnum, 'TRAFFICLANE', INDETERMINATE) -userdefined = express_getattr(IfcRoadPartTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcRoadPartTypeEnum, 'NOTDEFINED', INDETERMINATE) +bicyclecrossing = IfcRoadPartTypeEnum.BICYCLECROSSING +bus_stop = IfcRoadPartTypeEnum.BUS_STOP +carriageway = IfcRoadPartTypeEnum.CARRIAGEWAY +centralisland = IfcRoadPartTypeEnum.CENTRALISLAND +centralreserve = IfcRoadPartTypeEnum.CENTRALRESERVE +hardshoulder = IfcRoadPartTypeEnum.HARDSHOULDER +intersection = IfcRoadPartTypeEnum.INTERSECTION +layby = IfcRoadPartTypeEnum.LAYBY +parkingbay = IfcRoadPartTypeEnum.PARKINGBAY +passingbay = IfcRoadPartTypeEnum.PASSINGBAY +pedestrian_crossing = IfcRoadPartTypeEnum.PEDESTRIAN_CROSSING +railwaycrossing = IfcRoadPartTypeEnum.RAILWAYCROSSING +refugeisland = IfcRoadPartTypeEnum.REFUGEISLAND +roadsegment = IfcRoadPartTypeEnum.ROADSEGMENT +roadside = IfcRoadPartTypeEnum.ROADSIDE +roadsidepart = IfcRoadPartTypeEnum.ROADSIDEPART +roadwayplateau = IfcRoadPartTypeEnum.ROADWAYPLATEAU +roundabout = IfcRoadPartTypeEnum.ROUNDABOUT +shoulder = IfcRoadPartTypeEnum.SHOULDER +sidewalk = IfcRoadPartTypeEnum.SIDEWALK +softshoulder = IfcRoadPartTypeEnum.SOFTSHOULDER +tollplaza = IfcRoadPartTypeEnum.TOLLPLAZA +trafficisland = IfcRoadPartTypeEnum.TRAFFICISLAND +trafficlane = IfcRoadPartTypeEnum.TRAFFICLANE +userdefined = IfcRoadPartTypeEnum.USERDEFINED +notdefined = IfcRoadPartTypeEnum.NOTDEFINED IfcRoadTypeEnum = enum_namespace() -userdefined = express_getattr(IfcRoadTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcRoadTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcRoadTypeEnum.USERDEFINED +notdefined = IfcRoadTypeEnum.NOTDEFINED IfcRoleEnum = enum_namespace() -architect = express_getattr(IfcRoleEnum, 'ARCHITECT', INDETERMINATE) -buildingoperator = express_getattr(IfcRoleEnum, 'BUILDINGOPERATOR', INDETERMINATE) -buildingowner = express_getattr(IfcRoleEnum, 'BUILDINGOWNER', INDETERMINATE) -civilengineer = express_getattr(IfcRoleEnum, 'CIVILENGINEER', INDETERMINATE) -client = express_getattr(IfcRoleEnum, 'CLIENT', INDETERMINATE) -commissioningengineer = express_getattr(IfcRoleEnum, 'COMMISSIONINGENGINEER', INDETERMINATE) -constructionmanager = express_getattr(IfcRoleEnum, 'CONSTRUCTIONMANAGER', INDETERMINATE) -consultant = express_getattr(IfcRoleEnum, 'CONSULTANT', INDETERMINATE) -contractor = express_getattr(IfcRoleEnum, 'CONTRACTOR', INDETERMINATE) -costengineer = express_getattr(IfcRoleEnum, 'COSTENGINEER', INDETERMINATE) -electricalengineer = express_getattr(IfcRoleEnum, 'ELECTRICALENGINEER', INDETERMINATE) -engineer = express_getattr(IfcRoleEnum, 'ENGINEER', INDETERMINATE) -facilitiesmanager = express_getattr(IfcRoleEnum, 'FACILITIESMANAGER', INDETERMINATE) -fieldconstructionmanager = express_getattr(IfcRoleEnum, 'FIELDCONSTRUCTIONMANAGER', INDETERMINATE) -manufacturer = express_getattr(IfcRoleEnum, 'MANUFACTURER', INDETERMINATE) -mechanicalengineer = express_getattr(IfcRoleEnum, 'MECHANICALENGINEER', INDETERMINATE) -owner = express_getattr(IfcRoleEnum, 'OWNER', INDETERMINATE) -projectmanager = express_getattr(IfcRoleEnum, 'PROJECTMANAGER', INDETERMINATE) -reseller = express_getattr(IfcRoleEnum, 'RESELLER', INDETERMINATE) -structuralengineer = express_getattr(IfcRoleEnum, 'STRUCTURALENGINEER', INDETERMINATE) -subcontractor = express_getattr(IfcRoleEnum, 'SUBCONTRACTOR', INDETERMINATE) -supplier = express_getattr(IfcRoleEnum, 'SUPPLIER', INDETERMINATE) -userdefined = express_getattr(IfcRoleEnum, 'USERDEFINED', INDETERMINATE) +architect = IfcRoleEnum.ARCHITECT +buildingoperator = IfcRoleEnum.BUILDINGOPERATOR +buildingowner = IfcRoleEnum.BUILDINGOWNER +civilengineer = IfcRoleEnum.CIVILENGINEER +client = IfcRoleEnum.CLIENT +commissioningengineer = IfcRoleEnum.COMMISSIONINGENGINEER +constructionmanager = IfcRoleEnum.CONSTRUCTIONMANAGER +consultant = IfcRoleEnum.CONSULTANT +contractor = IfcRoleEnum.CONTRACTOR +costengineer = IfcRoleEnum.COSTENGINEER +electricalengineer = IfcRoleEnum.ELECTRICALENGINEER +engineer = IfcRoleEnum.ENGINEER +facilitiesmanager = IfcRoleEnum.FACILITIESMANAGER +fieldconstructionmanager = IfcRoleEnum.FIELDCONSTRUCTIONMANAGER +manufacturer = IfcRoleEnum.MANUFACTURER +mechanicalengineer = IfcRoleEnum.MECHANICALENGINEER +owner = IfcRoleEnum.OWNER +projectmanager = IfcRoleEnum.PROJECTMANAGER +reseller = IfcRoleEnum.RESELLER +structuralengineer = IfcRoleEnum.STRUCTURALENGINEER +subcontractor = IfcRoleEnum.SUBCONTRACTOR +supplier = IfcRoleEnum.SUPPLIER +userdefined = IfcRoleEnum.USERDEFINED IfcRoofTypeEnum = enum_namespace() -barrel_roof = express_getattr(IfcRoofTypeEnum, 'BARREL_ROOF', INDETERMINATE) -butterfly_roof = express_getattr(IfcRoofTypeEnum, 'BUTTERFLY_ROOF', INDETERMINATE) -dome_roof = express_getattr(IfcRoofTypeEnum, 'DOME_ROOF', INDETERMINATE) -flat_roof = express_getattr(IfcRoofTypeEnum, 'FLAT_ROOF', INDETERMINATE) -freeform = express_getattr(IfcRoofTypeEnum, 'FREEFORM', INDETERMINATE) -gable_roof = express_getattr(IfcRoofTypeEnum, 'GABLE_ROOF', INDETERMINATE) -gambrel_roof = express_getattr(IfcRoofTypeEnum, 'GAMBREL_ROOF', INDETERMINATE) -hipped_gable_roof = express_getattr(IfcRoofTypeEnum, 'HIPPED_GABLE_ROOF', INDETERMINATE) -hip_roof = express_getattr(IfcRoofTypeEnum, 'HIP_ROOF', INDETERMINATE) -mansard_roof = express_getattr(IfcRoofTypeEnum, 'MANSARD_ROOF', INDETERMINATE) -pavilion_roof = express_getattr(IfcRoofTypeEnum, 'PAVILION_ROOF', INDETERMINATE) -rainbow_roof = express_getattr(IfcRoofTypeEnum, 'RAINBOW_ROOF', INDETERMINATE) -shed_roof = express_getattr(IfcRoofTypeEnum, 'SHED_ROOF', INDETERMINATE) -userdefined = express_getattr(IfcRoofTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcRoofTypeEnum, 'NOTDEFINED', INDETERMINATE) +barrel_roof = IfcRoofTypeEnum.BARREL_ROOF +butterfly_roof = IfcRoofTypeEnum.BUTTERFLY_ROOF +dome_roof = IfcRoofTypeEnum.DOME_ROOF +flat_roof = IfcRoofTypeEnum.FLAT_ROOF +freeform = IfcRoofTypeEnum.FREEFORM +gable_roof = IfcRoofTypeEnum.GABLE_ROOF +gambrel_roof = IfcRoofTypeEnum.GAMBREL_ROOF +hipped_gable_roof = IfcRoofTypeEnum.HIPPED_GABLE_ROOF +hip_roof = IfcRoofTypeEnum.HIP_ROOF +mansard_roof = IfcRoofTypeEnum.MANSARD_ROOF +pavilion_roof = IfcRoofTypeEnum.PAVILION_ROOF +rainbow_roof = IfcRoofTypeEnum.RAINBOW_ROOF +shed_roof = IfcRoofTypeEnum.SHED_ROOF +userdefined = IfcRoofTypeEnum.USERDEFINED +notdefined = IfcRoofTypeEnum.NOTDEFINED IfcSIPrefix = enum_namespace() -atto = express_getattr(IfcSIPrefix, 'ATTO', INDETERMINATE) -centi = express_getattr(IfcSIPrefix, 'CENTI', INDETERMINATE) -deca = express_getattr(IfcSIPrefix, 'DECA', INDETERMINATE) -deci = express_getattr(IfcSIPrefix, 'DECI', INDETERMINATE) -exa = express_getattr(IfcSIPrefix, 'EXA', INDETERMINATE) -femto = express_getattr(IfcSIPrefix, 'FEMTO', INDETERMINATE) -giga = express_getattr(IfcSIPrefix, 'GIGA', INDETERMINATE) -hecto = express_getattr(IfcSIPrefix, 'HECTO', INDETERMINATE) -kilo = express_getattr(IfcSIPrefix, 'KILO', INDETERMINATE) -mega = express_getattr(IfcSIPrefix, 'MEGA', INDETERMINATE) -micro = express_getattr(IfcSIPrefix, 'MICRO', INDETERMINATE) -milli = express_getattr(IfcSIPrefix, 'MILLI', INDETERMINATE) -nano = express_getattr(IfcSIPrefix, 'NANO', INDETERMINATE) -peta = express_getattr(IfcSIPrefix, 'PETA', INDETERMINATE) -pico = express_getattr(IfcSIPrefix, 'PICO', INDETERMINATE) -tera = express_getattr(IfcSIPrefix, 'TERA', INDETERMINATE) +atto = IfcSIPrefix.ATTO +centi = IfcSIPrefix.CENTI +deca = IfcSIPrefix.DECA +deci = IfcSIPrefix.DECI +exa = IfcSIPrefix.EXA +femto = IfcSIPrefix.FEMTO +giga = IfcSIPrefix.GIGA +hecto = IfcSIPrefix.HECTO +kilo = IfcSIPrefix.KILO +mega = IfcSIPrefix.MEGA +micro = IfcSIPrefix.MICRO +milli = IfcSIPrefix.MILLI +nano = IfcSIPrefix.NANO +peta = IfcSIPrefix.PETA +pico = IfcSIPrefix.PICO +tera = IfcSIPrefix.TERA IfcSIUnitName = enum_namespace() -ampere = express_getattr(IfcSIUnitName, 'AMPERE', INDETERMINATE) -becquerel = express_getattr(IfcSIUnitName, 'BECQUEREL', INDETERMINATE) -candela = express_getattr(IfcSIUnitName, 'CANDELA', INDETERMINATE) -coulomb = express_getattr(IfcSIUnitName, 'COULOMB', INDETERMINATE) -cubic_metre = express_getattr(IfcSIUnitName, 'CUBIC_METRE', INDETERMINATE) -degree_celsius = express_getattr(IfcSIUnitName, 'DEGREE_CELSIUS', INDETERMINATE) -farad = express_getattr(IfcSIUnitName, 'FARAD', INDETERMINATE) -gram = express_getattr(IfcSIUnitName, 'GRAM', INDETERMINATE) -gray = express_getattr(IfcSIUnitName, 'GRAY', INDETERMINATE) -henry = express_getattr(IfcSIUnitName, 'HENRY', INDETERMINATE) -hertz = express_getattr(IfcSIUnitName, 'HERTZ', INDETERMINATE) -joule = express_getattr(IfcSIUnitName, 'JOULE', INDETERMINATE) -kelvin = express_getattr(IfcSIUnitName, 'KELVIN', INDETERMINATE) -lumen = express_getattr(IfcSIUnitName, 'LUMEN', INDETERMINATE) -lux = express_getattr(IfcSIUnitName, 'LUX', INDETERMINATE) -metre = express_getattr(IfcSIUnitName, 'METRE', INDETERMINATE) -mole = express_getattr(IfcSIUnitName, 'MOLE', INDETERMINATE) -newton = express_getattr(IfcSIUnitName, 'NEWTON', INDETERMINATE) -ohm = express_getattr(IfcSIUnitName, 'OHM', INDETERMINATE) -pascal = express_getattr(IfcSIUnitName, 'PASCAL', INDETERMINATE) -radian = express_getattr(IfcSIUnitName, 'RADIAN', INDETERMINATE) -second = express_getattr(IfcSIUnitName, 'SECOND', INDETERMINATE) -siemens = express_getattr(IfcSIUnitName, 'SIEMENS', INDETERMINATE) -sievert = express_getattr(IfcSIUnitName, 'SIEVERT', INDETERMINATE) -square_metre = express_getattr(IfcSIUnitName, 'SQUARE_METRE', INDETERMINATE) -steradian = express_getattr(IfcSIUnitName, 'STERADIAN', INDETERMINATE) -tesla = express_getattr(IfcSIUnitName, 'TESLA', INDETERMINATE) -volt = express_getattr(IfcSIUnitName, 'VOLT', INDETERMINATE) -watt = express_getattr(IfcSIUnitName, 'WATT', INDETERMINATE) -weber = express_getattr(IfcSIUnitName, 'WEBER', INDETERMINATE) +ampere = IfcSIUnitName.AMPERE +becquerel = IfcSIUnitName.BECQUEREL +candela = IfcSIUnitName.CANDELA +coulomb = IfcSIUnitName.COULOMB +cubic_metre = IfcSIUnitName.CUBIC_METRE +degree_celsius = IfcSIUnitName.DEGREE_CELSIUS +farad = IfcSIUnitName.FARAD +gram = IfcSIUnitName.GRAM +gray = IfcSIUnitName.GRAY +henry = IfcSIUnitName.HENRY +hertz = IfcSIUnitName.HERTZ +joule = IfcSIUnitName.JOULE +kelvin = IfcSIUnitName.KELVIN +lumen = IfcSIUnitName.LUMEN +lux = IfcSIUnitName.LUX +metre = IfcSIUnitName.METRE +mole = IfcSIUnitName.MOLE +newton = IfcSIUnitName.NEWTON +ohm = IfcSIUnitName.OHM +pascal = IfcSIUnitName.PASCAL +radian = IfcSIUnitName.RADIAN +second = IfcSIUnitName.SECOND +siemens = IfcSIUnitName.SIEMENS +sievert = IfcSIUnitName.SIEVERT +square_metre = IfcSIUnitName.SQUARE_METRE +steradian = IfcSIUnitName.STERADIAN +tesla = IfcSIUnitName.TESLA +volt = IfcSIUnitName.VOLT +watt = IfcSIUnitName.WATT +weber = IfcSIUnitName.WEBER IfcSanitaryTerminalTypeEnum = enum_namespace() -bath = express_getattr(IfcSanitaryTerminalTypeEnum, 'BATH', INDETERMINATE) -bidet = express_getattr(IfcSanitaryTerminalTypeEnum, 'BIDET', INDETERMINATE) -cistern = express_getattr(IfcSanitaryTerminalTypeEnum, 'CISTERN', INDETERMINATE) -sanitaryfountain = express_getattr(IfcSanitaryTerminalTypeEnum, 'SANITARYFOUNTAIN', INDETERMINATE) -shower = express_getattr(IfcSanitaryTerminalTypeEnum, 'SHOWER', INDETERMINATE) -sink = express_getattr(IfcSanitaryTerminalTypeEnum, 'SINK', INDETERMINATE) -toiletpan = express_getattr(IfcSanitaryTerminalTypeEnum, 'TOILETPAN', INDETERMINATE) -urinal = express_getattr(IfcSanitaryTerminalTypeEnum, 'URINAL', INDETERMINATE) -washhandbasin = express_getattr(IfcSanitaryTerminalTypeEnum, 'WASHHANDBASIN', INDETERMINATE) -wcseat = express_getattr(IfcSanitaryTerminalTypeEnum, 'WCSEAT', INDETERMINATE) -userdefined = express_getattr(IfcSanitaryTerminalTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSanitaryTerminalTypeEnum, 'NOTDEFINED', INDETERMINATE) +bath = IfcSanitaryTerminalTypeEnum.BATH +bidet = IfcSanitaryTerminalTypeEnum.BIDET +cistern = IfcSanitaryTerminalTypeEnum.CISTERN +sanitaryfountain = IfcSanitaryTerminalTypeEnum.SANITARYFOUNTAIN +shower = IfcSanitaryTerminalTypeEnum.SHOWER +sink = IfcSanitaryTerminalTypeEnum.SINK +toiletpan = IfcSanitaryTerminalTypeEnum.TOILETPAN +urinal = IfcSanitaryTerminalTypeEnum.URINAL +washhandbasin = IfcSanitaryTerminalTypeEnum.WASHHANDBASIN +wcseat = IfcSanitaryTerminalTypeEnum.WCSEAT +userdefined = IfcSanitaryTerminalTypeEnum.USERDEFINED +notdefined = IfcSanitaryTerminalTypeEnum.NOTDEFINED IfcSectionTypeEnum = enum_namespace() -tapered = express_getattr(IfcSectionTypeEnum, 'TAPERED', INDETERMINATE) -uniform = express_getattr(IfcSectionTypeEnum, 'UNIFORM', INDETERMINATE) +tapered = IfcSectionTypeEnum.TAPERED +uniform = IfcSectionTypeEnum.UNIFORM IfcSensorTypeEnum = enum_namespace() -co2sensor = express_getattr(IfcSensorTypeEnum, 'CO2SENSOR', INDETERMINATE) -conductancesensor = express_getattr(IfcSensorTypeEnum, 'CONDUCTANCESENSOR', INDETERMINATE) -contactsensor = express_getattr(IfcSensorTypeEnum, 'CONTACTSENSOR', INDETERMINATE) -cosensor = express_getattr(IfcSensorTypeEnum, 'COSENSOR', INDETERMINATE) -earthquakesensor = express_getattr(IfcSensorTypeEnum, 'EARTHQUAKESENSOR', INDETERMINATE) -firesensor = express_getattr(IfcSensorTypeEnum, 'FIRESENSOR', INDETERMINATE) -flowsensor = express_getattr(IfcSensorTypeEnum, 'FLOWSENSOR', INDETERMINATE) -foreignobjectdetectionsensor = express_getattr(IfcSensorTypeEnum, 'FOREIGNOBJECTDETECTIONSENSOR', INDETERMINATE) -frostsensor = express_getattr(IfcSensorTypeEnum, 'FROSTSENSOR', INDETERMINATE) -gassensor = express_getattr(IfcSensorTypeEnum, 'GASSENSOR', INDETERMINATE) -heatsensor = express_getattr(IfcSensorTypeEnum, 'HEATSENSOR', INDETERMINATE) -humiditysensor = express_getattr(IfcSensorTypeEnum, 'HUMIDITYSENSOR', INDETERMINATE) -identifiersensor = express_getattr(IfcSensorTypeEnum, 'IDENTIFIERSENSOR', INDETERMINATE) -ionconcentrationsensor = express_getattr(IfcSensorTypeEnum, 'IONCONCENTRATIONSENSOR', INDETERMINATE) -levelsensor = express_getattr(IfcSensorTypeEnum, 'LEVELSENSOR', INDETERMINATE) -lightsensor = express_getattr(IfcSensorTypeEnum, 'LIGHTSENSOR', INDETERMINATE) -moisturesensor = express_getattr(IfcSensorTypeEnum, 'MOISTURESENSOR', INDETERMINATE) -movementsensor = express_getattr(IfcSensorTypeEnum, 'MOVEMENTSENSOR', INDETERMINATE) -obstaclesensor = express_getattr(IfcSensorTypeEnum, 'OBSTACLESENSOR', INDETERMINATE) -phsensor = express_getattr(IfcSensorTypeEnum, 'PHSENSOR', INDETERMINATE) -pressuresensor = express_getattr(IfcSensorTypeEnum, 'PRESSURESENSOR', INDETERMINATE) -radiationsensor = express_getattr(IfcSensorTypeEnum, 'RADIATIONSENSOR', INDETERMINATE) -radioactivitysensor = express_getattr(IfcSensorTypeEnum, 'RADIOACTIVITYSENSOR', INDETERMINATE) -rainsensor = express_getattr(IfcSensorTypeEnum, 'RAINSENSOR', INDETERMINATE) -smokesensor = express_getattr(IfcSensorTypeEnum, 'SMOKESENSOR', INDETERMINATE) -snowdepthsensor = express_getattr(IfcSensorTypeEnum, 'SNOWDEPTHSENSOR', INDETERMINATE) -soundsensor = express_getattr(IfcSensorTypeEnum, 'SOUNDSENSOR', INDETERMINATE) -temperaturesensor = express_getattr(IfcSensorTypeEnum, 'TEMPERATURESENSOR', INDETERMINATE) -trainsensor = express_getattr(IfcSensorTypeEnum, 'TRAINSENSOR', INDETERMINATE) -turnoutclosuresensor = express_getattr(IfcSensorTypeEnum, 'TURNOUTCLOSURESENSOR', INDETERMINATE) -wheelsensor = express_getattr(IfcSensorTypeEnum, 'WHEELSENSOR', INDETERMINATE) -windsensor = express_getattr(IfcSensorTypeEnum, 'WINDSENSOR', INDETERMINATE) -userdefined = express_getattr(IfcSensorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSensorTypeEnum, 'NOTDEFINED', INDETERMINATE) +co2sensor = IfcSensorTypeEnum.CO2SENSOR +conductancesensor = IfcSensorTypeEnum.CONDUCTANCESENSOR +contactsensor = IfcSensorTypeEnum.CONTACTSENSOR +cosensor = IfcSensorTypeEnum.COSENSOR +earthquakesensor = IfcSensorTypeEnum.EARTHQUAKESENSOR +firesensor = IfcSensorTypeEnum.FIRESENSOR +flowsensor = IfcSensorTypeEnum.FLOWSENSOR +foreignobjectdetectionsensor = IfcSensorTypeEnum.FOREIGNOBJECTDETECTIONSENSOR +frostsensor = IfcSensorTypeEnum.FROSTSENSOR +gassensor = IfcSensorTypeEnum.GASSENSOR +heatsensor = IfcSensorTypeEnum.HEATSENSOR +humiditysensor = IfcSensorTypeEnum.HUMIDITYSENSOR +identifiersensor = IfcSensorTypeEnum.IDENTIFIERSENSOR +ionconcentrationsensor = IfcSensorTypeEnum.IONCONCENTRATIONSENSOR +levelsensor = IfcSensorTypeEnum.LEVELSENSOR +lightsensor = IfcSensorTypeEnum.LIGHTSENSOR +moisturesensor = IfcSensorTypeEnum.MOISTURESENSOR +movementsensor = IfcSensorTypeEnum.MOVEMENTSENSOR +obstaclesensor = IfcSensorTypeEnum.OBSTACLESENSOR +phsensor = IfcSensorTypeEnum.PHSENSOR +pressuresensor = IfcSensorTypeEnum.PRESSURESENSOR +radiationsensor = IfcSensorTypeEnum.RADIATIONSENSOR +radioactivitysensor = IfcSensorTypeEnum.RADIOACTIVITYSENSOR +rainsensor = IfcSensorTypeEnum.RAINSENSOR +smokesensor = IfcSensorTypeEnum.SMOKESENSOR +snowdepthsensor = IfcSensorTypeEnum.SNOWDEPTHSENSOR +soundsensor = IfcSensorTypeEnum.SOUNDSENSOR +temperaturesensor = IfcSensorTypeEnum.TEMPERATURESENSOR +trainsensor = IfcSensorTypeEnum.TRAINSENSOR +turnoutclosuresensor = IfcSensorTypeEnum.TURNOUTCLOSURESENSOR +wheelsensor = IfcSensorTypeEnum.WHEELSENSOR +windsensor = IfcSensorTypeEnum.WINDSENSOR +userdefined = IfcSensorTypeEnum.USERDEFINED +notdefined = IfcSensorTypeEnum.NOTDEFINED IfcSequenceEnum = enum_namespace() -finish_finish = express_getattr(IfcSequenceEnum, 'FINISH_FINISH', INDETERMINATE) -finish_start = express_getattr(IfcSequenceEnum, 'FINISH_START', INDETERMINATE) -start_finish = express_getattr(IfcSequenceEnum, 'START_FINISH', INDETERMINATE) -start_start = express_getattr(IfcSequenceEnum, 'START_START', INDETERMINATE) -userdefined = express_getattr(IfcSequenceEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSequenceEnum, 'NOTDEFINED', INDETERMINATE) +finish_finish = IfcSequenceEnum.FINISH_FINISH +finish_start = IfcSequenceEnum.FINISH_START +start_finish = IfcSequenceEnum.START_FINISH +start_start = IfcSequenceEnum.START_START +userdefined = IfcSequenceEnum.USERDEFINED +notdefined = IfcSequenceEnum.NOTDEFINED IfcShadingDeviceTypeEnum = enum_namespace() -awning = express_getattr(IfcShadingDeviceTypeEnum, 'AWNING', INDETERMINATE) -jalousie = express_getattr(IfcShadingDeviceTypeEnum, 'JALOUSIE', INDETERMINATE) -shutter = express_getattr(IfcShadingDeviceTypeEnum, 'SHUTTER', INDETERMINATE) -userdefined = express_getattr(IfcShadingDeviceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcShadingDeviceTypeEnum, 'NOTDEFINED', INDETERMINATE) +awning = IfcShadingDeviceTypeEnum.AWNING +jalousie = IfcShadingDeviceTypeEnum.JALOUSIE +shutter = IfcShadingDeviceTypeEnum.SHUTTER +userdefined = IfcShadingDeviceTypeEnum.USERDEFINED +notdefined = IfcShadingDeviceTypeEnum.NOTDEFINED IfcSignTypeEnum = enum_namespace() -marker = express_getattr(IfcSignTypeEnum, 'MARKER', INDETERMINATE) -mirror = express_getattr(IfcSignTypeEnum, 'MIRROR', INDETERMINATE) -pictoral = express_getattr(IfcSignTypeEnum, 'PICTORAL', INDETERMINATE) -userdefined = express_getattr(IfcSignTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSignTypeEnum, 'NOTDEFINED', INDETERMINATE) +marker = IfcSignTypeEnum.MARKER +mirror = IfcSignTypeEnum.MIRROR +pictoral = IfcSignTypeEnum.PICTORAL +userdefined = IfcSignTypeEnum.USERDEFINED +notdefined = IfcSignTypeEnum.NOTDEFINED IfcSignalTypeEnum = enum_namespace() -audio = express_getattr(IfcSignalTypeEnum, 'AUDIO', INDETERMINATE) -mixed = express_getattr(IfcSignalTypeEnum, 'MIXED', INDETERMINATE) -visual = express_getattr(IfcSignalTypeEnum, 'VISUAL', INDETERMINATE) -userdefined = express_getattr(IfcSignalTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSignalTypeEnum, 'NOTDEFINED', INDETERMINATE) +audio = IfcSignalTypeEnum.AUDIO +mixed = IfcSignalTypeEnum.MIXED +visual = IfcSignalTypeEnum.VISUAL +userdefined = IfcSignalTypeEnum.USERDEFINED +notdefined = IfcSignalTypeEnum.NOTDEFINED IfcSimplePropertyTemplateTypeEnum = enum_namespace() -p_boundedvalue = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'P_BOUNDEDVALUE', INDETERMINATE) -p_enumeratedvalue = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'P_ENUMERATEDVALUE', INDETERMINATE) -p_listvalue = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'P_LISTVALUE', INDETERMINATE) -p_referencevalue = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'P_REFERENCEVALUE', INDETERMINATE) -p_singlevalue = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'P_SINGLEVALUE', INDETERMINATE) -p_tablevalue = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'P_TABLEVALUE', INDETERMINATE) -q_area = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'Q_AREA', INDETERMINATE) -q_count = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'Q_COUNT', INDETERMINATE) -q_length = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'Q_LENGTH', INDETERMINATE) -q_number = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'Q_NUMBER', INDETERMINATE) -q_time = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'Q_TIME', INDETERMINATE) -q_volume = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'Q_VOLUME', INDETERMINATE) -q_weight = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'Q_WEIGHT', INDETERMINATE) +p_boundedvalue = IfcSimplePropertyTemplateTypeEnum.P_BOUNDEDVALUE +p_enumeratedvalue = IfcSimplePropertyTemplateTypeEnum.P_ENUMERATEDVALUE +p_listvalue = IfcSimplePropertyTemplateTypeEnum.P_LISTVALUE +p_referencevalue = IfcSimplePropertyTemplateTypeEnum.P_REFERENCEVALUE +p_singlevalue = IfcSimplePropertyTemplateTypeEnum.P_SINGLEVALUE +p_tablevalue = IfcSimplePropertyTemplateTypeEnum.P_TABLEVALUE +q_area = IfcSimplePropertyTemplateTypeEnum.Q_AREA +q_count = IfcSimplePropertyTemplateTypeEnum.Q_COUNT +q_length = IfcSimplePropertyTemplateTypeEnum.Q_LENGTH +q_number = IfcSimplePropertyTemplateTypeEnum.Q_NUMBER +q_time = IfcSimplePropertyTemplateTypeEnum.Q_TIME +q_volume = IfcSimplePropertyTemplateTypeEnum.Q_VOLUME +q_weight = IfcSimplePropertyTemplateTypeEnum.Q_WEIGHT IfcSlabTypeEnum = enum_namespace() -approach_slab = express_getattr(IfcSlabTypeEnum, 'APPROACH_SLAB', INDETERMINATE) -baseslab = express_getattr(IfcSlabTypeEnum, 'BASESLAB', INDETERMINATE) -floor = express_getattr(IfcSlabTypeEnum, 'FLOOR', INDETERMINATE) -landing = express_getattr(IfcSlabTypeEnum, 'LANDING', INDETERMINATE) -paving = express_getattr(IfcSlabTypeEnum, 'PAVING', INDETERMINATE) -roof = express_getattr(IfcSlabTypeEnum, 'ROOF', INDETERMINATE) -sidewalk = express_getattr(IfcSlabTypeEnum, 'SIDEWALK', INDETERMINATE) -trackslab = express_getattr(IfcSlabTypeEnum, 'TRACKSLAB', INDETERMINATE) -wearing = express_getattr(IfcSlabTypeEnum, 'WEARING', INDETERMINATE) -userdefined = express_getattr(IfcSlabTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSlabTypeEnum, 'NOTDEFINED', INDETERMINATE) +approach_slab = IfcSlabTypeEnum.APPROACH_SLAB +baseslab = IfcSlabTypeEnum.BASESLAB +floor = IfcSlabTypeEnum.FLOOR +landing = IfcSlabTypeEnum.LANDING +paving = IfcSlabTypeEnum.PAVING +roof = IfcSlabTypeEnum.ROOF +sidewalk = IfcSlabTypeEnum.SIDEWALK +trackslab = IfcSlabTypeEnum.TRACKSLAB +wearing = IfcSlabTypeEnum.WEARING +userdefined = IfcSlabTypeEnum.USERDEFINED +notdefined = IfcSlabTypeEnum.NOTDEFINED IfcSolarDeviceTypeEnum = enum_namespace() -solarcollector = express_getattr(IfcSolarDeviceTypeEnum, 'SOLARCOLLECTOR', INDETERMINATE) -solarpanel = express_getattr(IfcSolarDeviceTypeEnum, 'SOLARPANEL', INDETERMINATE) -userdefined = express_getattr(IfcSolarDeviceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSolarDeviceTypeEnum, 'NOTDEFINED', INDETERMINATE) +solarcollector = IfcSolarDeviceTypeEnum.SOLARCOLLECTOR +solarpanel = IfcSolarDeviceTypeEnum.SOLARPANEL +userdefined = IfcSolarDeviceTypeEnum.USERDEFINED +notdefined = IfcSolarDeviceTypeEnum.NOTDEFINED IfcSpaceHeaterTypeEnum = enum_namespace() -convector = express_getattr(IfcSpaceHeaterTypeEnum, 'CONVECTOR', INDETERMINATE) -radiator = express_getattr(IfcSpaceHeaterTypeEnum, 'RADIATOR', INDETERMINATE) -userdefined = express_getattr(IfcSpaceHeaterTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSpaceHeaterTypeEnum, 'NOTDEFINED', INDETERMINATE) +convector = IfcSpaceHeaterTypeEnum.CONVECTOR +radiator = IfcSpaceHeaterTypeEnum.RADIATOR +userdefined = IfcSpaceHeaterTypeEnum.USERDEFINED +notdefined = IfcSpaceHeaterTypeEnum.NOTDEFINED IfcSpaceTypeEnum = enum_namespace() -berth = express_getattr(IfcSpaceTypeEnum, 'BERTH', INDETERMINATE) -external = express_getattr(IfcSpaceTypeEnum, 'EXTERNAL', INDETERMINATE) -gfa = express_getattr(IfcSpaceTypeEnum, 'GFA', INDETERMINATE) -internal = express_getattr(IfcSpaceTypeEnum, 'INTERNAL', INDETERMINATE) -parking = express_getattr(IfcSpaceTypeEnum, 'PARKING', INDETERMINATE) -space = express_getattr(IfcSpaceTypeEnum, 'SPACE', INDETERMINATE) -userdefined = express_getattr(IfcSpaceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSpaceTypeEnum, 'NOTDEFINED', INDETERMINATE) +berth = IfcSpaceTypeEnum.BERTH +external = IfcSpaceTypeEnum.EXTERNAL +gfa = IfcSpaceTypeEnum.GFA +internal = IfcSpaceTypeEnum.INTERNAL +parking = IfcSpaceTypeEnum.PARKING +space = IfcSpaceTypeEnum.SPACE +userdefined = IfcSpaceTypeEnum.USERDEFINED +notdefined = IfcSpaceTypeEnum.NOTDEFINED IfcSpatialZoneTypeEnum = enum_namespace() -construction = express_getattr(IfcSpatialZoneTypeEnum, 'CONSTRUCTION', INDETERMINATE) -firesafety = express_getattr(IfcSpatialZoneTypeEnum, 'FIRESAFETY', INDETERMINATE) -interference = express_getattr(IfcSpatialZoneTypeEnum, 'INTERFERENCE', INDETERMINATE) -lighting = express_getattr(IfcSpatialZoneTypeEnum, 'LIGHTING', INDETERMINATE) -occupancy = express_getattr(IfcSpatialZoneTypeEnum, 'OCCUPANCY', INDETERMINATE) -reservation = express_getattr(IfcSpatialZoneTypeEnum, 'RESERVATION', INDETERMINATE) -security = express_getattr(IfcSpatialZoneTypeEnum, 'SECURITY', INDETERMINATE) -thermal = express_getattr(IfcSpatialZoneTypeEnum, 'THERMAL', INDETERMINATE) -transport = express_getattr(IfcSpatialZoneTypeEnum, 'TRANSPORT', INDETERMINATE) -ventilation = express_getattr(IfcSpatialZoneTypeEnum, 'VENTILATION', INDETERMINATE) -userdefined = express_getattr(IfcSpatialZoneTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSpatialZoneTypeEnum, 'NOTDEFINED', INDETERMINATE) +construction = IfcSpatialZoneTypeEnum.CONSTRUCTION +firesafety = IfcSpatialZoneTypeEnum.FIRESAFETY +interference = IfcSpatialZoneTypeEnum.INTERFERENCE +lighting = IfcSpatialZoneTypeEnum.LIGHTING +occupancy = IfcSpatialZoneTypeEnum.OCCUPANCY +reservation = IfcSpatialZoneTypeEnum.RESERVATION +security = IfcSpatialZoneTypeEnum.SECURITY +thermal = IfcSpatialZoneTypeEnum.THERMAL +transport = IfcSpatialZoneTypeEnum.TRANSPORT +ventilation = IfcSpatialZoneTypeEnum.VENTILATION +userdefined = IfcSpatialZoneTypeEnum.USERDEFINED +notdefined = IfcSpatialZoneTypeEnum.NOTDEFINED IfcStackTerminalTypeEnum = enum_namespace() -birdcage = express_getattr(IfcStackTerminalTypeEnum, 'BIRDCAGE', INDETERMINATE) -cowl = express_getattr(IfcStackTerminalTypeEnum, 'COWL', INDETERMINATE) -rainwaterhopper = express_getattr(IfcStackTerminalTypeEnum, 'RAINWATERHOPPER', INDETERMINATE) -userdefined = express_getattr(IfcStackTerminalTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcStackTerminalTypeEnum, 'NOTDEFINED', INDETERMINATE) +birdcage = IfcStackTerminalTypeEnum.BIRDCAGE +cowl = IfcStackTerminalTypeEnum.COWL +rainwaterhopper = IfcStackTerminalTypeEnum.RAINWATERHOPPER +userdefined = IfcStackTerminalTypeEnum.USERDEFINED +notdefined = IfcStackTerminalTypeEnum.NOTDEFINED IfcStairFlightTypeEnum = enum_namespace() -curved = express_getattr(IfcStairFlightTypeEnum, 'CURVED', INDETERMINATE) -freeform = express_getattr(IfcStairFlightTypeEnum, 'FREEFORM', INDETERMINATE) -spiral = express_getattr(IfcStairFlightTypeEnum, 'SPIRAL', INDETERMINATE) -straight = express_getattr(IfcStairFlightTypeEnum, 'STRAIGHT', INDETERMINATE) -winder = express_getattr(IfcStairFlightTypeEnum, 'WINDER', INDETERMINATE) -userdefined = express_getattr(IfcStairFlightTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcStairFlightTypeEnum, 'NOTDEFINED', INDETERMINATE) +curved = IfcStairFlightTypeEnum.CURVED +freeform = IfcStairFlightTypeEnum.FREEFORM +spiral = IfcStairFlightTypeEnum.SPIRAL +straight = IfcStairFlightTypeEnum.STRAIGHT +winder = IfcStairFlightTypeEnum.WINDER +userdefined = IfcStairFlightTypeEnum.USERDEFINED +notdefined = IfcStairFlightTypeEnum.NOTDEFINED IfcStairTypeEnum = enum_namespace() -curved_run_stair = express_getattr(IfcStairTypeEnum, 'CURVED_RUN_STAIR', INDETERMINATE) -double_return_stair = express_getattr(IfcStairTypeEnum, 'DOUBLE_RETURN_STAIR', INDETERMINATE) -half_turn_stair = express_getattr(IfcStairTypeEnum, 'HALF_TURN_STAIR', INDETERMINATE) -half_winding_stair = express_getattr(IfcStairTypeEnum, 'HALF_WINDING_STAIR', INDETERMINATE) -ladder = express_getattr(IfcStairTypeEnum, 'LADDER', INDETERMINATE) -quarter_turn_stair = express_getattr(IfcStairTypeEnum, 'QUARTER_TURN_STAIR', INDETERMINATE) -quarter_winding_stair = express_getattr(IfcStairTypeEnum, 'QUARTER_WINDING_STAIR', INDETERMINATE) -spiral_stair = express_getattr(IfcStairTypeEnum, 'SPIRAL_STAIR', INDETERMINATE) -straight_run_stair = express_getattr(IfcStairTypeEnum, 'STRAIGHT_RUN_STAIR', INDETERMINATE) -three_quarter_turn_stair = express_getattr(IfcStairTypeEnum, 'THREE_QUARTER_TURN_STAIR', INDETERMINATE) -three_quarter_winding_stair = express_getattr(IfcStairTypeEnum, 'THREE_QUARTER_WINDING_STAIR', INDETERMINATE) -two_curved_run_stair = express_getattr(IfcStairTypeEnum, 'TWO_CURVED_RUN_STAIR', INDETERMINATE) -two_quarter_turn_stair = express_getattr(IfcStairTypeEnum, 'TWO_QUARTER_TURN_STAIR', INDETERMINATE) -two_quarter_winding_stair = express_getattr(IfcStairTypeEnum, 'TWO_QUARTER_WINDING_STAIR', INDETERMINATE) -two_straight_run_stair = express_getattr(IfcStairTypeEnum, 'TWO_STRAIGHT_RUN_STAIR', INDETERMINATE) -userdefined = express_getattr(IfcStairTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcStairTypeEnum, 'NOTDEFINED', INDETERMINATE) +curved_run_stair = IfcStairTypeEnum.CURVED_RUN_STAIR +double_return_stair = IfcStairTypeEnum.DOUBLE_RETURN_STAIR +half_turn_stair = IfcStairTypeEnum.HALF_TURN_STAIR +half_winding_stair = IfcStairTypeEnum.HALF_WINDING_STAIR +ladder = IfcStairTypeEnum.LADDER +quarter_turn_stair = IfcStairTypeEnum.QUARTER_TURN_STAIR +quarter_winding_stair = IfcStairTypeEnum.QUARTER_WINDING_STAIR +spiral_stair = IfcStairTypeEnum.SPIRAL_STAIR +straight_run_stair = IfcStairTypeEnum.STRAIGHT_RUN_STAIR +three_quarter_turn_stair = IfcStairTypeEnum.THREE_QUARTER_TURN_STAIR +three_quarter_winding_stair = IfcStairTypeEnum.THREE_QUARTER_WINDING_STAIR +two_curved_run_stair = IfcStairTypeEnum.TWO_CURVED_RUN_STAIR +two_quarter_turn_stair = IfcStairTypeEnum.TWO_QUARTER_TURN_STAIR +two_quarter_winding_stair = IfcStairTypeEnum.TWO_QUARTER_WINDING_STAIR +two_straight_run_stair = IfcStairTypeEnum.TWO_STRAIGHT_RUN_STAIR +userdefined = IfcStairTypeEnum.USERDEFINED +notdefined = IfcStairTypeEnum.NOTDEFINED IfcStateEnum = enum_namespace() -locked = express_getattr(IfcStateEnum, 'LOCKED', INDETERMINATE) -readonly = express_getattr(IfcStateEnum, 'READONLY', INDETERMINATE) -readonlylocked = express_getattr(IfcStateEnum, 'READONLYLOCKED', INDETERMINATE) -readwrite = express_getattr(IfcStateEnum, 'READWRITE', INDETERMINATE) -readwritelocked = express_getattr(IfcStateEnum, 'READWRITELOCKED', INDETERMINATE) +locked = IfcStateEnum.LOCKED +readonly = IfcStateEnum.READONLY +readonlylocked = IfcStateEnum.READONLYLOCKED +readwrite = IfcStateEnum.READWRITE +readwritelocked = IfcStateEnum.READWRITELOCKED IfcStructuralCurveActivityTypeEnum = enum_namespace() -const = express_getattr(IfcStructuralCurveActivityTypeEnum, 'CONST', INDETERMINATE) -discrete = express_getattr(IfcStructuralCurveActivityTypeEnum, 'DISCRETE', INDETERMINATE) -equidistant = express_getattr(IfcStructuralCurveActivityTypeEnum, 'EQUIDISTANT', INDETERMINATE) -linear = express_getattr(IfcStructuralCurveActivityTypeEnum, 'LINEAR', INDETERMINATE) -parabola = express_getattr(IfcStructuralCurveActivityTypeEnum, 'PARABOLA', INDETERMINATE) -polygonal = express_getattr(IfcStructuralCurveActivityTypeEnum, 'POLYGONAL', INDETERMINATE) -sinus = express_getattr(IfcStructuralCurveActivityTypeEnum, 'SINUS', INDETERMINATE) -userdefined = express_getattr(IfcStructuralCurveActivityTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcStructuralCurveActivityTypeEnum, 'NOTDEFINED', INDETERMINATE) +const = IfcStructuralCurveActivityTypeEnum.CONST +discrete = IfcStructuralCurveActivityTypeEnum.DISCRETE +equidistant = IfcStructuralCurveActivityTypeEnum.EQUIDISTANT +linear = IfcStructuralCurveActivityTypeEnum.LINEAR +parabola = IfcStructuralCurveActivityTypeEnum.PARABOLA +polygonal = IfcStructuralCurveActivityTypeEnum.POLYGONAL +sinus = IfcStructuralCurveActivityTypeEnum.SINUS +userdefined = IfcStructuralCurveActivityTypeEnum.USERDEFINED +notdefined = IfcStructuralCurveActivityTypeEnum.NOTDEFINED IfcStructuralCurveMemberTypeEnum = enum_namespace() -cable = express_getattr(IfcStructuralCurveMemberTypeEnum, 'CABLE', INDETERMINATE) -compression_member = express_getattr(IfcStructuralCurveMemberTypeEnum, 'COMPRESSION_MEMBER', INDETERMINATE) -pin_joined_member = express_getattr(IfcStructuralCurveMemberTypeEnum, 'PIN_JOINED_MEMBER', INDETERMINATE) -rigid_joined_member = express_getattr(IfcStructuralCurveMemberTypeEnum, 'RIGID_JOINED_MEMBER', INDETERMINATE) -tension_member = express_getattr(IfcStructuralCurveMemberTypeEnum, 'TENSION_MEMBER', INDETERMINATE) -userdefined = express_getattr(IfcStructuralCurveMemberTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcStructuralCurveMemberTypeEnum, 'NOTDEFINED', INDETERMINATE) +cable = IfcStructuralCurveMemberTypeEnum.CABLE +compression_member = IfcStructuralCurveMemberTypeEnum.COMPRESSION_MEMBER +pin_joined_member = IfcStructuralCurveMemberTypeEnum.PIN_JOINED_MEMBER +rigid_joined_member = IfcStructuralCurveMemberTypeEnum.RIGID_JOINED_MEMBER +tension_member = IfcStructuralCurveMemberTypeEnum.TENSION_MEMBER +userdefined = IfcStructuralCurveMemberTypeEnum.USERDEFINED +notdefined = IfcStructuralCurveMemberTypeEnum.NOTDEFINED IfcStructuralSurfaceActivityTypeEnum = enum_namespace() -bilinear = express_getattr(IfcStructuralSurfaceActivityTypeEnum, 'BILINEAR', INDETERMINATE) -const = express_getattr(IfcStructuralSurfaceActivityTypeEnum, 'CONST', INDETERMINATE) -discrete = express_getattr(IfcStructuralSurfaceActivityTypeEnum, 'DISCRETE', INDETERMINATE) -isocontour = express_getattr(IfcStructuralSurfaceActivityTypeEnum, 'ISOCONTOUR', INDETERMINATE) -userdefined = express_getattr(IfcStructuralSurfaceActivityTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcStructuralSurfaceActivityTypeEnum, 'NOTDEFINED', INDETERMINATE) +bilinear = IfcStructuralSurfaceActivityTypeEnum.BILINEAR +const = IfcStructuralSurfaceActivityTypeEnum.CONST +discrete = IfcStructuralSurfaceActivityTypeEnum.DISCRETE +isocontour = IfcStructuralSurfaceActivityTypeEnum.ISOCONTOUR +userdefined = IfcStructuralSurfaceActivityTypeEnum.USERDEFINED +notdefined = IfcStructuralSurfaceActivityTypeEnum.NOTDEFINED IfcStructuralSurfaceMemberTypeEnum = enum_namespace() -bending_element = express_getattr(IfcStructuralSurfaceMemberTypeEnum, 'BENDING_ELEMENT', INDETERMINATE) -membrane_element = express_getattr(IfcStructuralSurfaceMemberTypeEnum, 'MEMBRANE_ELEMENT', INDETERMINATE) -shell = express_getattr(IfcStructuralSurfaceMemberTypeEnum, 'SHELL', INDETERMINATE) -userdefined = express_getattr(IfcStructuralSurfaceMemberTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcStructuralSurfaceMemberTypeEnum, 'NOTDEFINED', INDETERMINATE) +bending_element = IfcStructuralSurfaceMemberTypeEnum.BENDING_ELEMENT +membrane_element = IfcStructuralSurfaceMemberTypeEnum.MEMBRANE_ELEMENT +shell = IfcStructuralSurfaceMemberTypeEnum.SHELL +userdefined = IfcStructuralSurfaceMemberTypeEnum.USERDEFINED +notdefined = IfcStructuralSurfaceMemberTypeEnum.NOTDEFINED IfcSubContractResourceTypeEnum = enum_namespace() -purchase = express_getattr(IfcSubContractResourceTypeEnum, 'PURCHASE', INDETERMINATE) -work = express_getattr(IfcSubContractResourceTypeEnum, 'WORK', INDETERMINATE) -userdefined = express_getattr(IfcSubContractResourceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSubContractResourceTypeEnum, 'NOTDEFINED', INDETERMINATE) +purchase = IfcSubContractResourceTypeEnum.PURCHASE +work = IfcSubContractResourceTypeEnum.WORK +userdefined = IfcSubContractResourceTypeEnum.USERDEFINED +notdefined = IfcSubContractResourceTypeEnum.NOTDEFINED IfcSurfaceFeatureTypeEnum = enum_namespace() -defect = express_getattr(IfcSurfaceFeatureTypeEnum, 'DEFECT', INDETERMINATE) -hatchmarking = express_getattr(IfcSurfaceFeatureTypeEnum, 'HATCHMARKING', INDETERMINATE) -linemarking = express_getattr(IfcSurfaceFeatureTypeEnum, 'LINEMARKING', INDETERMINATE) -mark = express_getattr(IfcSurfaceFeatureTypeEnum, 'MARK', INDETERMINATE) -nonskidsurfacing = express_getattr(IfcSurfaceFeatureTypeEnum, 'NONSKIDSURFACING', INDETERMINATE) -pavementsurfacemarking = express_getattr(IfcSurfaceFeatureTypeEnum, 'PAVEMENTSURFACEMARKING', INDETERMINATE) -rumblestrip = express_getattr(IfcSurfaceFeatureTypeEnum, 'RUMBLESTRIP', INDETERMINATE) -symbolmarking = express_getattr(IfcSurfaceFeatureTypeEnum, 'SYMBOLMARKING', INDETERMINATE) -tag = express_getattr(IfcSurfaceFeatureTypeEnum, 'TAG', INDETERMINATE) -transverserumblestrip = express_getattr(IfcSurfaceFeatureTypeEnum, 'TRANSVERSERUMBLESTRIP', INDETERMINATE) -treatment = express_getattr(IfcSurfaceFeatureTypeEnum, 'TREATMENT', INDETERMINATE) -userdefined = express_getattr(IfcSurfaceFeatureTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSurfaceFeatureTypeEnum, 'NOTDEFINED', INDETERMINATE) +defect = IfcSurfaceFeatureTypeEnum.DEFECT +hatchmarking = IfcSurfaceFeatureTypeEnum.HATCHMARKING +linemarking = IfcSurfaceFeatureTypeEnum.LINEMARKING +mark = IfcSurfaceFeatureTypeEnum.MARK +nonskidsurfacing = IfcSurfaceFeatureTypeEnum.NONSKIDSURFACING +pavementsurfacemarking = IfcSurfaceFeatureTypeEnum.PAVEMENTSURFACEMARKING +rumblestrip = IfcSurfaceFeatureTypeEnum.RUMBLESTRIP +symbolmarking = IfcSurfaceFeatureTypeEnum.SYMBOLMARKING +tag = IfcSurfaceFeatureTypeEnum.TAG +transverserumblestrip = IfcSurfaceFeatureTypeEnum.TRANSVERSERUMBLESTRIP +treatment = IfcSurfaceFeatureTypeEnum.TREATMENT +userdefined = IfcSurfaceFeatureTypeEnum.USERDEFINED +notdefined = IfcSurfaceFeatureTypeEnum.NOTDEFINED IfcSurfaceSide = enum_namespace() -both = express_getattr(IfcSurfaceSide, 'BOTH', INDETERMINATE) -negative = express_getattr(IfcSurfaceSide, 'NEGATIVE', INDETERMINATE) -positive = express_getattr(IfcSurfaceSide, 'POSITIVE', INDETERMINATE) +both = IfcSurfaceSide.BOTH +negative = IfcSurfaceSide.NEGATIVE +positive = IfcSurfaceSide.POSITIVE IfcSwitchingDeviceTypeEnum = enum_namespace() -contactor = express_getattr(IfcSwitchingDeviceTypeEnum, 'CONTACTOR', INDETERMINATE) -dimmerswitch = express_getattr(IfcSwitchingDeviceTypeEnum, 'DIMMERSWITCH', INDETERMINATE) -emergencystop = express_getattr(IfcSwitchingDeviceTypeEnum, 'EMERGENCYSTOP', INDETERMINATE) -keypad = express_getattr(IfcSwitchingDeviceTypeEnum, 'KEYPAD', INDETERMINATE) -momentaryswitch = express_getattr(IfcSwitchingDeviceTypeEnum, 'MOMENTARYSWITCH', INDETERMINATE) -relay = express_getattr(IfcSwitchingDeviceTypeEnum, 'RELAY', INDETERMINATE) -selectorswitch = express_getattr(IfcSwitchingDeviceTypeEnum, 'SELECTORSWITCH', INDETERMINATE) -starter = express_getattr(IfcSwitchingDeviceTypeEnum, 'STARTER', INDETERMINATE) -start_and_stop_equipment = express_getattr(IfcSwitchingDeviceTypeEnum, 'START_AND_STOP_EQUIPMENT', INDETERMINATE) -switchdisconnector = express_getattr(IfcSwitchingDeviceTypeEnum, 'SWITCHDISCONNECTOR', INDETERMINATE) -toggleswitch = express_getattr(IfcSwitchingDeviceTypeEnum, 'TOGGLESWITCH', INDETERMINATE) -userdefined = express_getattr(IfcSwitchingDeviceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSwitchingDeviceTypeEnum, 'NOTDEFINED', INDETERMINATE) +contactor = IfcSwitchingDeviceTypeEnum.CONTACTOR +dimmerswitch = IfcSwitchingDeviceTypeEnum.DIMMERSWITCH +emergencystop = IfcSwitchingDeviceTypeEnum.EMERGENCYSTOP +keypad = IfcSwitchingDeviceTypeEnum.KEYPAD +momentaryswitch = IfcSwitchingDeviceTypeEnum.MOMENTARYSWITCH +relay = IfcSwitchingDeviceTypeEnum.RELAY +selectorswitch = IfcSwitchingDeviceTypeEnum.SELECTORSWITCH +starter = IfcSwitchingDeviceTypeEnum.STARTER +start_and_stop_equipment = IfcSwitchingDeviceTypeEnum.START_AND_STOP_EQUIPMENT +switchdisconnector = IfcSwitchingDeviceTypeEnum.SWITCHDISCONNECTOR +toggleswitch = IfcSwitchingDeviceTypeEnum.TOGGLESWITCH +userdefined = IfcSwitchingDeviceTypeEnum.USERDEFINED +notdefined = IfcSwitchingDeviceTypeEnum.NOTDEFINED IfcSystemFurnitureElementTypeEnum = enum_namespace() -panel = express_getattr(IfcSystemFurnitureElementTypeEnum, 'PANEL', INDETERMINATE) -subrack = express_getattr(IfcSystemFurnitureElementTypeEnum, 'SUBRACK', INDETERMINATE) -worksurface = express_getattr(IfcSystemFurnitureElementTypeEnum, 'WORKSURFACE', INDETERMINATE) -userdefined = express_getattr(IfcSystemFurnitureElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSystemFurnitureElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +panel = IfcSystemFurnitureElementTypeEnum.PANEL +subrack = IfcSystemFurnitureElementTypeEnum.SUBRACK +worksurface = IfcSystemFurnitureElementTypeEnum.WORKSURFACE +userdefined = IfcSystemFurnitureElementTypeEnum.USERDEFINED +notdefined = IfcSystemFurnitureElementTypeEnum.NOTDEFINED IfcTankTypeEnum = enum_namespace() -basin = express_getattr(IfcTankTypeEnum, 'BASIN', INDETERMINATE) -breakpressure = express_getattr(IfcTankTypeEnum, 'BREAKPRESSURE', INDETERMINATE) -expansion = express_getattr(IfcTankTypeEnum, 'EXPANSION', INDETERMINATE) -feedandexpansion = express_getattr(IfcTankTypeEnum, 'FEEDANDEXPANSION', INDETERMINATE) -oilretentiontray = express_getattr(IfcTankTypeEnum, 'OILRETENTIONTRAY', INDETERMINATE) -pressurevessel = express_getattr(IfcTankTypeEnum, 'PRESSUREVESSEL', INDETERMINATE) -storage = express_getattr(IfcTankTypeEnum, 'STORAGE', INDETERMINATE) -vessel = express_getattr(IfcTankTypeEnum, 'VESSEL', INDETERMINATE) -userdefined = express_getattr(IfcTankTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTankTypeEnum, 'NOTDEFINED', INDETERMINATE) +basin = IfcTankTypeEnum.BASIN +breakpressure = IfcTankTypeEnum.BREAKPRESSURE +expansion = IfcTankTypeEnum.EXPANSION +feedandexpansion = IfcTankTypeEnum.FEEDANDEXPANSION +oilretentiontray = IfcTankTypeEnum.OILRETENTIONTRAY +pressurevessel = IfcTankTypeEnum.PRESSUREVESSEL +storage = IfcTankTypeEnum.STORAGE +vessel = IfcTankTypeEnum.VESSEL +userdefined = IfcTankTypeEnum.USERDEFINED +notdefined = IfcTankTypeEnum.NOTDEFINED IfcTaskDurationEnum = enum_namespace() -elapsedtime = express_getattr(IfcTaskDurationEnum, 'ELAPSEDTIME', INDETERMINATE) -worktime = express_getattr(IfcTaskDurationEnum, 'WORKTIME', INDETERMINATE) -notdefined = express_getattr(IfcTaskDurationEnum, 'NOTDEFINED', INDETERMINATE) +elapsedtime = IfcTaskDurationEnum.ELAPSEDTIME +worktime = IfcTaskDurationEnum.WORKTIME +notdefined = IfcTaskDurationEnum.NOTDEFINED IfcTaskTypeEnum = enum_namespace() -adjustment = express_getattr(IfcTaskTypeEnum, 'ADJUSTMENT', INDETERMINATE) -attendance = express_getattr(IfcTaskTypeEnum, 'ATTENDANCE', INDETERMINATE) -calibration = express_getattr(IfcTaskTypeEnum, 'CALIBRATION', INDETERMINATE) -construction = express_getattr(IfcTaskTypeEnum, 'CONSTRUCTION', INDETERMINATE) -demolition = express_getattr(IfcTaskTypeEnum, 'DEMOLITION', INDETERMINATE) -dismantle = express_getattr(IfcTaskTypeEnum, 'DISMANTLE', INDETERMINATE) -disposal = express_getattr(IfcTaskTypeEnum, 'DISPOSAL', INDETERMINATE) -emergency = express_getattr(IfcTaskTypeEnum, 'EMERGENCY', INDETERMINATE) -inspection = express_getattr(IfcTaskTypeEnum, 'INSPECTION', INDETERMINATE) -installation = express_getattr(IfcTaskTypeEnum, 'INSTALLATION', INDETERMINATE) -logistic = express_getattr(IfcTaskTypeEnum, 'LOGISTIC', INDETERMINATE) -maintenance = express_getattr(IfcTaskTypeEnum, 'MAINTENANCE', INDETERMINATE) -move = express_getattr(IfcTaskTypeEnum, 'MOVE', INDETERMINATE) -operation = express_getattr(IfcTaskTypeEnum, 'OPERATION', INDETERMINATE) -removal = express_getattr(IfcTaskTypeEnum, 'REMOVAL', INDETERMINATE) -renovation = express_getattr(IfcTaskTypeEnum, 'RENOVATION', INDETERMINATE) -safety = express_getattr(IfcTaskTypeEnum, 'SAFETY', INDETERMINATE) -shutdown = express_getattr(IfcTaskTypeEnum, 'SHUTDOWN', INDETERMINATE) -startup = express_getattr(IfcTaskTypeEnum, 'STARTUP', INDETERMINATE) -testing = express_getattr(IfcTaskTypeEnum, 'TESTING', INDETERMINATE) -troubleshooting = express_getattr(IfcTaskTypeEnum, 'TROUBLESHOOTING', INDETERMINATE) -userdefined = express_getattr(IfcTaskTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTaskTypeEnum, 'NOTDEFINED', INDETERMINATE) +adjustment = IfcTaskTypeEnum.ADJUSTMENT +attendance = IfcTaskTypeEnum.ATTENDANCE +calibration = IfcTaskTypeEnum.CALIBRATION +construction = IfcTaskTypeEnum.CONSTRUCTION +demolition = IfcTaskTypeEnum.DEMOLITION +dismantle = IfcTaskTypeEnum.DISMANTLE +disposal = IfcTaskTypeEnum.DISPOSAL +emergency = IfcTaskTypeEnum.EMERGENCY +inspection = IfcTaskTypeEnum.INSPECTION +installation = IfcTaskTypeEnum.INSTALLATION +logistic = IfcTaskTypeEnum.LOGISTIC +maintenance = IfcTaskTypeEnum.MAINTENANCE +move = IfcTaskTypeEnum.MOVE +operation = IfcTaskTypeEnum.OPERATION +removal = IfcTaskTypeEnum.REMOVAL +renovation = IfcTaskTypeEnum.RENOVATION +safety = IfcTaskTypeEnum.SAFETY +shutdown = IfcTaskTypeEnum.SHUTDOWN +startup = IfcTaskTypeEnum.STARTUP +testing = IfcTaskTypeEnum.TESTING +troubleshooting = IfcTaskTypeEnum.TROUBLESHOOTING +userdefined = IfcTaskTypeEnum.USERDEFINED +notdefined = IfcTaskTypeEnum.NOTDEFINED IfcTendonAnchorTypeEnum = enum_namespace() -coupler = express_getattr(IfcTendonAnchorTypeEnum, 'COUPLER', INDETERMINATE) -fixed_end = express_getattr(IfcTendonAnchorTypeEnum, 'FIXED_END', INDETERMINATE) -tensioning_end = express_getattr(IfcTendonAnchorTypeEnum, 'TENSIONING_END', INDETERMINATE) -userdefined = express_getattr(IfcTendonAnchorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTendonAnchorTypeEnum, 'NOTDEFINED', INDETERMINATE) +coupler = IfcTendonAnchorTypeEnum.COUPLER +fixed_end = IfcTendonAnchorTypeEnum.FIXED_END +tensioning_end = IfcTendonAnchorTypeEnum.TENSIONING_END +userdefined = IfcTendonAnchorTypeEnum.USERDEFINED +notdefined = IfcTendonAnchorTypeEnum.NOTDEFINED IfcTendonConduitTypeEnum = enum_namespace() -coupler = express_getattr(IfcTendonConduitTypeEnum, 'COUPLER', INDETERMINATE) -diabolo = express_getattr(IfcTendonConduitTypeEnum, 'DIABOLO', INDETERMINATE) -duct = express_getattr(IfcTendonConduitTypeEnum, 'DUCT', INDETERMINATE) -grouting_duct = express_getattr(IfcTendonConduitTypeEnum, 'GROUTING_DUCT', INDETERMINATE) -trumpet = express_getattr(IfcTendonConduitTypeEnum, 'TRUMPET', INDETERMINATE) -userdefined = express_getattr(IfcTendonConduitTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTendonConduitTypeEnum, 'NOTDEFINED', INDETERMINATE) +coupler = IfcTendonConduitTypeEnum.COUPLER +diabolo = IfcTendonConduitTypeEnum.DIABOLO +duct = IfcTendonConduitTypeEnum.DUCT +grouting_duct = IfcTendonConduitTypeEnum.GROUTING_DUCT +trumpet = IfcTendonConduitTypeEnum.TRUMPET +userdefined = IfcTendonConduitTypeEnum.USERDEFINED +notdefined = IfcTendonConduitTypeEnum.NOTDEFINED IfcTendonTypeEnum = enum_namespace() -bar = express_getattr(IfcTendonTypeEnum, 'BAR', INDETERMINATE) -coated = express_getattr(IfcTendonTypeEnum, 'COATED', INDETERMINATE) -strand = express_getattr(IfcTendonTypeEnum, 'STRAND', INDETERMINATE) -wire = express_getattr(IfcTendonTypeEnum, 'WIRE', INDETERMINATE) -userdefined = express_getattr(IfcTendonTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTendonTypeEnum, 'NOTDEFINED', INDETERMINATE) +bar = IfcTendonTypeEnum.BAR +coated = IfcTendonTypeEnum.COATED +strand = IfcTendonTypeEnum.STRAND +wire = IfcTendonTypeEnum.WIRE +userdefined = IfcTendonTypeEnum.USERDEFINED +notdefined = IfcTendonTypeEnum.NOTDEFINED IfcTextPath = enum_namespace() -down = express_getattr(IfcTextPath, 'DOWN', INDETERMINATE) -left = express_getattr(IfcTextPath, 'LEFT', INDETERMINATE) -right = express_getattr(IfcTextPath, 'RIGHT', INDETERMINATE) -up = express_getattr(IfcTextPath, 'UP', INDETERMINATE) +down = IfcTextPath.DOWN +left = IfcTextPath.LEFT +right = IfcTextPath.RIGHT +up = IfcTextPath.UP IfcTimeSeriesDataTypeEnum = enum_namespace() -continuous = express_getattr(IfcTimeSeriesDataTypeEnum, 'CONTINUOUS', INDETERMINATE) -discrete = express_getattr(IfcTimeSeriesDataTypeEnum, 'DISCRETE', INDETERMINATE) -discretebinary = express_getattr(IfcTimeSeriesDataTypeEnum, 'DISCRETEBINARY', INDETERMINATE) -piecewisebinary = express_getattr(IfcTimeSeriesDataTypeEnum, 'PIECEWISEBINARY', INDETERMINATE) -piecewiseconstant = express_getattr(IfcTimeSeriesDataTypeEnum, 'PIECEWISECONSTANT', INDETERMINATE) -piecewisecontinuous = express_getattr(IfcTimeSeriesDataTypeEnum, 'PIECEWISECONTINUOUS', INDETERMINATE) -notdefined = express_getattr(IfcTimeSeriesDataTypeEnum, 'NOTDEFINED', INDETERMINATE) +continuous = IfcTimeSeriesDataTypeEnum.CONTINUOUS +discrete = IfcTimeSeriesDataTypeEnum.DISCRETE +discretebinary = IfcTimeSeriesDataTypeEnum.DISCRETEBINARY +piecewisebinary = IfcTimeSeriesDataTypeEnum.PIECEWISEBINARY +piecewiseconstant = IfcTimeSeriesDataTypeEnum.PIECEWISECONSTANT +piecewisecontinuous = IfcTimeSeriesDataTypeEnum.PIECEWISECONTINUOUS +notdefined = IfcTimeSeriesDataTypeEnum.NOTDEFINED IfcTrackElementTypeEnum = enum_namespace() -blockingdevice = express_getattr(IfcTrackElementTypeEnum, 'BLOCKINGDEVICE', INDETERMINATE) -derailer = express_getattr(IfcTrackElementTypeEnum, 'DERAILER', INDETERMINATE) -frog = express_getattr(IfcTrackElementTypeEnum, 'FROG', INDETERMINATE) -half_set_of_blades = express_getattr(IfcTrackElementTypeEnum, 'HALF_SET_OF_BLADES', INDETERMINATE) -sleeper = express_getattr(IfcTrackElementTypeEnum, 'SLEEPER', INDETERMINATE) -speedregulator = express_getattr(IfcTrackElementTypeEnum, 'SPEEDREGULATOR', INDETERMINATE) -trackendofalignment = express_getattr(IfcTrackElementTypeEnum, 'TRACKENDOFALIGNMENT', INDETERMINATE) -vehiclestop = express_getattr(IfcTrackElementTypeEnum, 'VEHICLESTOP', INDETERMINATE) -userdefined = express_getattr(IfcTrackElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTrackElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +blockingdevice = IfcTrackElementTypeEnum.BLOCKINGDEVICE +derailer = IfcTrackElementTypeEnum.DERAILER +frog = IfcTrackElementTypeEnum.FROG +half_set_of_blades = IfcTrackElementTypeEnum.HALF_SET_OF_BLADES +sleeper = IfcTrackElementTypeEnum.SLEEPER +speedregulator = IfcTrackElementTypeEnum.SPEEDREGULATOR +trackendofalignment = IfcTrackElementTypeEnum.TRACKENDOFALIGNMENT +vehiclestop = IfcTrackElementTypeEnum.VEHICLESTOP +userdefined = IfcTrackElementTypeEnum.USERDEFINED +notdefined = IfcTrackElementTypeEnum.NOTDEFINED IfcTransformerTypeEnum = enum_namespace() -chopper = express_getattr(IfcTransformerTypeEnum, 'CHOPPER', INDETERMINATE) -combined = express_getattr(IfcTransformerTypeEnum, 'COMBINED', INDETERMINATE) -current = express_getattr(IfcTransformerTypeEnum, 'CURRENT', INDETERMINATE) -frequency = express_getattr(IfcTransformerTypeEnum, 'FREQUENCY', INDETERMINATE) -inverter = express_getattr(IfcTransformerTypeEnum, 'INVERTER', INDETERMINATE) -rectifier = express_getattr(IfcTransformerTypeEnum, 'RECTIFIER', INDETERMINATE) -voltage = express_getattr(IfcTransformerTypeEnum, 'VOLTAGE', INDETERMINATE) -userdefined = express_getattr(IfcTransformerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTransformerTypeEnum, 'NOTDEFINED', INDETERMINATE) +chopper = IfcTransformerTypeEnum.CHOPPER +combined = IfcTransformerTypeEnum.COMBINED +current = IfcTransformerTypeEnum.CURRENT +frequency = IfcTransformerTypeEnum.FREQUENCY +inverter = IfcTransformerTypeEnum.INVERTER +rectifier = IfcTransformerTypeEnum.RECTIFIER +voltage = IfcTransformerTypeEnum.VOLTAGE +userdefined = IfcTransformerTypeEnum.USERDEFINED +notdefined = IfcTransformerTypeEnum.NOTDEFINED IfcTransitionCode = enum_namespace() -continuous = express_getattr(IfcTransitionCode, 'CONTINUOUS', INDETERMINATE) -contsamegradient = express_getattr(IfcTransitionCode, 'CONTSAMEGRADIENT', INDETERMINATE) -contsamegradientsamecurvature = express_getattr(IfcTransitionCode, 'CONTSAMEGRADIENTSAMECURVATURE', INDETERMINATE) -discontinuous = express_getattr(IfcTransitionCode, 'DISCONTINUOUS', INDETERMINATE) +continuous = IfcTransitionCode.CONTINUOUS +contsamegradient = IfcTransitionCode.CONTSAMEGRADIENT +contsamegradientsamecurvature = IfcTransitionCode.CONTSAMEGRADIENTSAMECURVATURE +discontinuous = IfcTransitionCode.DISCONTINUOUS IfcTransportElementTypeEnum = enum_namespace() -craneway = express_getattr(IfcTransportElementTypeEnum, 'CRANEWAY', INDETERMINATE) -elevator = express_getattr(IfcTransportElementTypeEnum, 'ELEVATOR', INDETERMINATE) -escalator = express_getattr(IfcTransportElementTypeEnum, 'ESCALATOR', INDETERMINATE) -haulinggear = express_getattr(IfcTransportElementTypeEnum, 'HAULINGGEAR', INDETERMINATE) -liftinggear = express_getattr(IfcTransportElementTypeEnum, 'LIFTINGGEAR', INDETERMINATE) -movingwalkway = express_getattr(IfcTransportElementTypeEnum, 'MOVINGWALKWAY', INDETERMINATE) -userdefined = express_getattr(IfcTransportElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTransportElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +craneway = IfcTransportElementTypeEnum.CRANEWAY +elevator = IfcTransportElementTypeEnum.ELEVATOR +escalator = IfcTransportElementTypeEnum.ESCALATOR +haulinggear = IfcTransportElementTypeEnum.HAULINGGEAR +liftinggear = IfcTransportElementTypeEnum.LIFTINGGEAR +movingwalkway = IfcTransportElementTypeEnum.MOVINGWALKWAY +userdefined = IfcTransportElementTypeEnum.USERDEFINED +notdefined = IfcTransportElementTypeEnum.NOTDEFINED IfcTrimmingPreference = enum_namespace() -cartesian = express_getattr(IfcTrimmingPreference, 'CARTESIAN', INDETERMINATE) -parameter = express_getattr(IfcTrimmingPreference, 'PARAMETER', INDETERMINATE) -unspecified = express_getattr(IfcTrimmingPreference, 'UNSPECIFIED', INDETERMINATE) +cartesian = IfcTrimmingPreference.CARTESIAN +parameter = IfcTrimmingPreference.PARAMETER +unspecified = IfcTrimmingPreference.UNSPECIFIED IfcTubeBundleTypeEnum = enum_namespace() -finned = express_getattr(IfcTubeBundleTypeEnum, 'FINNED', INDETERMINATE) -userdefined = express_getattr(IfcTubeBundleTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTubeBundleTypeEnum, 'NOTDEFINED', INDETERMINATE) +finned = IfcTubeBundleTypeEnum.FINNED +userdefined = IfcTubeBundleTypeEnum.USERDEFINED +notdefined = IfcTubeBundleTypeEnum.NOTDEFINED IfcUnitEnum = enum_namespace() -absorbeddoseunit = express_getattr(IfcUnitEnum, 'ABSORBEDDOSEUNIT', INDETERMINATE) -amountofsubstanceunit = express_getattr(IfcUnitEnum, 'AMOUNTOFSUBSTANCEUNIT', INDETERMINATE) -areaunit = express_getattr(IfcUnitEnum, 'AREAUNIT', INDETERMINATE) -doseequivalentunit = express_getattr(IfcUnitEnum, 'DOSEEQUIVALENTUNIT', INDETERMINATE) -electriccapacitanceunit = express_getattr(IfcUnitEnum, 'ELECTRICCAPACITANCEUNIT', INDETERMINATE) -electricchargeunit = express_getattr(IfcUnitEnum, 'ELECTRICCHARGEUNIT', INDETERMINATE) -electricconductanceunit = express_getattr(IfcUnitEnum, 'ELECTRICCONDUCTANCEUNIT', INDETERMINATE) -electriccurrentunit = express_getattr(IfcUnitEnum, 'ELECTRICCURRENTUNIT', INDETERMINATE) -electricresistanceunit = express_getattr(IfcUnitEnum, 'ELECTRICRESISTANCEUNIT', INDETERMINATE) -electricvoltageunit = express_getattr(IfcUnitEnum, 'ELECTRICVOLTAGEUNIT', INDETERMINATE) -energyunit = express_getattr(IfcUnitEnum, 'ENERGYUNIT', INDETERMINATE) -forceunit = express_getattr(IfcUnitEnum, 'FORCEUNIT', INDETERMINATE) -frequencyunit = express_getattr(IfcUnitEnum, 'FREQUENCYUNIT', INDETERMINATE) -illuminanceunit = express_getattr(IfcUnitEnum, 'ILLUMINANCEUNIT', INDETERMINATE) -inductanceunit = express_getattr(IfcUnitEnum, 'INDUCTANCEUNIT', INDETERMINATE) -lengthunit = express_getattr(IfcUnitEnum, 'LENGTHUNIT', INDETERMINATE) -luminousfluxunit = express_getattr(IfcUnitEnum, 'LUMINOUSFLUXUNIT', INDETERMINATE) -luminousintensityunit = express_getattr(IfcUnitEnum, 'LUMINOUSINTENSITYUNIT', INDETERMINATE) -magneticfluxdensityunit = express_getattr(IfcUnitEnum, 'MAGNETICFLUXDENSITYUNIT', INDETERMINATE) -magneticfluxunit = express_getattr(IfcUnitEnum, 'MAGNETICFLUXUNIT', INDETERMINATE) -massunit = express_getattr(IfcUnitEnum, 'MASSUNIT', INDETERMINATE) -planeangleunit = express_getattr(IfcUnitEnum, 'PLANEANGLEUNIT', INDETERMINATE) -powerunit = express_getattr(IfcUnitEnum, 'POWERUNIT', INDETERMINATE) -pressureunit = express_getattr(IfcUnitEnum, 'PRESSUREUNIT', INDETERMINATE) -radioactivityunit = express_getattr(IfcUnitEnum, 'RADIOACTIVITYUNIT', INDETERMINATE) -solidangleunit = express_getattr(IfcUnitEnum, 'SOLIDANGLEUNIT', INDETERMINATE) -thermodynamictemperatureunit = express_getattr(IfcUnitEnum, 'THERMODYNAMICTEMPERATUREUNIT', INDETERMINATE) -timeunit = express_getattr(IfcUnitEnum, 'TIMEUNIT', INDETERMINATE) -volumeunit = express_getattr(IfcUnitEnum, 'VOLUMEUNIT', INDETERMINATE) -userdefined = express_getattr(IfcUnitEnum, 'USERDEFINED', INDETERMINATE) +absorbeddoseunit = IfcUnitEnum.ABSORBEDDOSEUNIT +amountofsubstanceunit = IfcUnitEnum.AMOUNTOFSUBSTANCEUNIT +areaunit = IfcUnitEnum.AREAUNIT +doseequivalentunit = IfcUnitEnum.DOSEEQUIVALENTUNIT +electriccapacitanceunit = IfcUnitEnum.ELECTRICCAPACITANCEUNIT +electricchargeunit = IfcUnitEnum.ELECTRICCHARGEUNIT +electricconductanceunit = IfcUnitEnum.ELECTRICCONDUCTANCEUNIT +electriccurrentunit = IfcUnitEnum.ELECTRICCURRENTUNIT +electricresistanceunit = IfcUnitEnum.ELECTRICRESISTANCEUNIT +electricvoltageunit = IfcUnitEnum.ELECTRICVOLTAGEUNIT +energyunit = IfcUnitEnum.ENERGYUNIT +forceunit = IfcUnitEnum.FORCEUNIT +frequencyunit = IfcUnitEnum.FREQUENCYUNIT +illuminanceunit = IfcUnitEnum.ILLUMINANCEUNIT +inductanceunit = IfcUnitEnum.INDUCTANCEUNIT +lengthunit = IfcUnitEnum.LENGTHUNIT +luminousfluxunit = IfcUnitEnum.LUMINOUSFLUXUNIT +luminousintensityunit = IfcUnitEnum.LUMINOUSINTENSITYUNIT +magneticfluxdensityunit = IfcUnitEnum.MAGNETICFLUXDENSITYUNIT +magneticfluxunit = IfcUnitEnum.MAGNETICFLUXUNIT +massunit = IfcUnitEnum.MASSUNIT +planeangleunit = IfcUnitEnum.PLANEANGLEUNIT +powerunit = IfcUnitEnum.POWERUNIT +pressureunit = IfcUnitEnum.PRESSUREUNIT +radioactivityunit = IfcUnitEnum.RADIOACTIVITYUNIT +solidangleunit = IfcUnitEnum.SOLIDANGLEUNIT +thermodynamictemperatureunit = IfcUnitEnum.THERMODYNAMICTEMPERATUREUNIT +timeunit = IfcUnitEnum.TIMEUNIT +volumeunit = IfcUnitEnum.VOLUMEUNIT +userdefined = IfcUnitEnum.USERDEFINED IfcUnitaryControlElementTypeEnum = enum_namespace() -alarmpanel = express_getattr(IfcUnitaryControlElementTypeEnum, 'ALARMPANEL', INDETERMINATE) -basestationcontroller = express_getattr(IfcUnitaryControlElementTypeEnum, 'BASESTATIONCONTROLLER', INDETERMINATE) -combined = express_getattr(IfcUnitaryControlElementTypeEnum, 'COMBINED', INDETERMINATE) -controlpanel = express_getattr(IfcUnitaryControlElementTypeEnum, 'CONTROLPANEL', INDETERMINATE) -gasdetectionpanel = express_getattr(IfcUnitaryControlElementTypeEnum, 'GASDETECTIONPANEL', INDETERMINATE) -humidistat = express_getattr(IfcUnitaryControlElementTypeEnum, 'HUMIDISTAT', INDETERMINATE) -indicatorpanel = express_getattr(IfcUnitaryControlElementTypeEnum, 'INDICATORPANEL', INDETERMINATE) -mimicpanel = express_getattr(IfcUnitaryControlElementTypeEnum, 'MIMICPANEL', INDETERMINATE) -thermostat = express_getattr(IfcUnitaryControlElementTypeEnum, 'THERMOSTAT', INDETERMINATE) -weatherstation = express_getattr(IfcUnitaryControlElementTypeEnum, 'WEATHERSTATION', INDETERMINATE) -userdefined = express_getattr(IfcUnitaryControlElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcUnitaryControlElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +alarmpanel = IfcUnitaryControlElementTypeEnum.ALARMPANEL +basestationcontroller = IfcUnitaryControlElementTypeEnum.BASESTATIONCONTROLLER +combined = IfcUnitaryControlElementTypeEnum.COMBINED +controlpanel = IfcUnitaryControlElementTypeEnum.CONTROLPANEL +gasdetectionpanel = IfcUnitaryControlElementTypeEnum.GASDETECTIONPANEL +humidistat = IfcUnitaryControlElementTypeEnum.HUMIDISTAT +indicatorpanel = IfcUnitaryControlElementTypeEnum.INDICATORPANEL +mimicpanel = IfcUnitaryControlElementTypeEnum.MIMICPANEL +thermostat = IfcUnitaryControlElementTypeEnum.THERMOSTAT +weatherstation = IfcUnitaryControlElementTypeEnum.WEATHERSTATION +userdefined = IfcUnitaryControlElementTypeEnum.USERDEFINED +notdefined = IfcUnitaryControlElementTypeEnum.NOTDEFINED IfcUnitaryEquipmentTypeEnum = enum_namespace() -airconditioningunit = express_getattr(IfcUnitaryEquipmentTypeEnum, 'AIRCONDITIONINGUNIT', INDETERMINATE) -airhandler = express_getattr(IfcUnitaryEquipmentTypeEnum, 'AIRHANDLER', INDETERMINATE) -dehumidifier = express_getattr(IfcUnitaryEquipmentTypeEnum, 'DEHUMIDIFIER', INDETERMINATE) -rooftopunit = express_getattr(IfcUnitaryEquipmentTypeEnum, 'ROOFTOPUNIT', INDETERMINATE) -splitsystem = express_getattr(IfcUnitaryEquipmentTypeEnum, 'SPLITSYSTEM', INDETERMINATE) -userdefined = express_getattr(IfcUnitaryEquipmentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcUnitaryEquipmentTypeEnum, 'NOTDEFINED', INDETERMINATE) +airconditioningunit = IfcUnitaryEquipmentTypeEnum.AIRCONDITIONINGUNIT +airhandler = IfcUnitaryEquipmentTypeEnum.AIRHANDLER +dehumidifier = IfcUnitaryEquipmentTypeEnum.DEHUMIDIFIER +rooftopunit = IfcUnitaryEquipmentTypeEnum.ROOFTOPUNIT +splitsystem = IfcUnitaryEquipmentTypeEnum.SPLITSYSTEM +userdefined = IfcUnitaryEquipmentTypeEnum.USERDEFINED +notdefined = IfcUnitaryEquipmentTypeEnum.NOTDEFINED IfcValveTypeEnum = enum_namespace() -airrelease = express_getattr(IfcValveTypeEnum, 'AIRRELEASE', INDETERMINATE) -antivacuum = express_getattr(IfcValveTypeEnum, 'ANTIVACUUM', INDETERMINATE) -changeover = express_getattr(IfcValveTypeEnum, 'CHANGEOVER', INDETERMINATE) -check = express_getattr(IfcValveTypeEnum, 'CHECK', INDETERMINATE) -commissioning = express_getattr(IfcValveTypeEnum, 'COMMISSIONING', INDETERMINATE) -diverting = express_getattr(IfcValveTypeEnum, 'DIVERTING', INDETERMINATE) -doublecheck = express_getattr(IfcValveTypeEnum, 'DOUBLECHECK', INDETERMINATE) -doubleregulating = express_getattr(IfcValveTypeEnum, 'DOUBLEREGULATING', INDETERMINATE) -drawoffcock = express_getattr(IfcValveTypeEnum, 'DRAWOFFCOCK', INDETERMINATE) -faucet = express_getattr(IfcValveTypeEnum, 'FAUCET', INDETERMINATE) -flushing = express_getattr(IfcValveTypeEnum, 'FLUSHING', INDETERMINATE) -gascock = express_getattr(IfcValveTypeEnum, 'GASCOCK', INDETERMINATE) -gastap = express_getattr(IfcValveTypeEnum, 'GASTAP', INDETERMINATE) -isolating = express_getattr(IfcValveTypeEnum, 'ISOLATING', INDETERMINATE) -mixing = express_getattr(IfcValveTypeEnum, 'MIXING', INDETERMINATE) -pressurereducing = express_getattr(IfcValveTypeEnum, 'PRESSUREREDUCING', INDETERMINATE) -pressurerelief = express_getattr(IfcValveTypeEnum, 'PRESSURERELIEF', INDETERMINATE) -regulating = express_getattr(IfcValveTypeEnum, 'REGULATING', INDETERMINATE) -safetycutoff = express_getattr(IfcValveTypeEnum, 'SAFETYCUTOFF', INDETERMINATE) -steamtrap = express_getattr(IfcValveTypeEnum, 'STEAMTRAP', INDETERMINATE) -stopcock = express_getattr(IfcValveTypeEnum, 'STOPCOCK', INDETERMINATE) -userdefined = express_getattr(IfcValveTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcValveTypeEnum, 'NOTDEFINED', INDETERMINATE) +airrelease = IfcValveTypeEnum.AIRRELEASE +antivacuum = IfcValveTypeEnum.ANTIVACUUM +changeover = IfcValveTypeEnum.CHANGEOVER +check = IfcValveTypeEnum.CHECK +commissioning = IfcValveTypeEnum.COMMISSIONING +diverting = IfcValveTypeEnum.DIVERTING +doublecheck = IfcValveTypeEnum.DOUBLECHECK +doubleregulating = IfcValveTypeEnum.DOUBLEREGULATING +drawoffcock = IfcValveTypeEnum.DRAWOFFCOCK +faucet = IfcValveTypeEnum.FAUCET +flushing = IfcValveTypeEnum.FLUSHING +gascock = IfcValveTypeEnum.GASCOCK +gastap = IfcValveTypeEnum.GASTAP +isolating = IfcValveTypeEnum.ISOLATING +mixing = IfcValveTypeEnum.MIXING +pressurereducing = IfcValveTypeEnum.PRESSUREREDUCING +pressurerelief = IfcValveTypeEnum.PRESSURERELIEF +regulating = IfcValveTypeEnum.REGULATING +safetycutoff = IfcValveTypeEnum.SAFETYCUTOFF +steamtrap = IfcValveTypeEnum.STEAMTRAP +stopcock = IfcValveTypeEnum.STOPCOCK +userdefined = IfcValveTypeEnum.USERDEFINED +notdefined = IfcValveTypeEnum.NOTDEFINED IfcVehicleTypeEnum = enum_namespace() -cargo = express_getattr(IfcVehicleTypeEnum, 'CARGO', INDETERMINATE) -rollingstock = express_getattr(IfcVehicleTypeEnum, 'ROLLINGSTOCK', INDETERMINATE) -vehicle = express_getattr(IfcVehicleTypeEnum, 'VEHICLE', INDETERMINATE) -vehicleair = express_getattr(IfcVehicleTypeEnum, 'VEHICLEAIR', INDETERMINATE) -vehiclemarine = express_getattr(IfcVehicleTypeEnum, 'VEHICLEMARINE', INDETERMINATE) -vehicletracked = express_getattr(IfcVehicleTypeEnum, 'VEHICLETRACKED', INDETERMINATE) -vehiclewheeled = express_getattr(IfcVehicleTypeEnum, 'VEHICLEWHEELED', INDETERMINATE) -userdefined = express_getattr(IfcVehicleTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcVehicleTypeEnum, 'NOTDEFINED', INDETERMINATE) +cargo = IfcVehicleTypeEnum.CARGO +rollingstock = IfcVehicleTypeEnum.ROLLINGSTOCK +vehicle = IfcVehicleTypeEnum.VEHICLE +vehicleair = IfcVehicleTypeEnum.VEHICLEAIR +vehiclemarine = IfcVehicleTypeEnum.VEHICLEMARINE +vehicletracked = IfcVehicleTypeEnum.VEHICLETRACKED +vehiclewheeled = IfcVehicleTypeEnum.VEHICLEWHEELED +userdefined = IfcVehicleTypeEnum.USERDEFINED +notdefined = IfcVehicleTypeEnum.NOTDEFINED IfcVibrationDamperTypeEnum = enum_namespace() -axial_yield = express_getattr(IfcVibrationDamperTypeEnum, 'AXIAL_YIELD', INDETERMINATE) -bending_yield = express_getattr(IfcVibrationDamperTypeEnum, 'BENDING_YIELD', INDETERMINATE) -friction = express_getattr(IfcVibrationDamperTypeEnum, 'FRICTION', INDETERMINATE) -rubber = express_getattr(IfcVibrationDamperTypeEnum, 'RUBBER', INDETERMINATE) -shear_yield = express_getattr(IfcVibrationDamperTypeEnum, 'SHEAR_YIELD', INDETERMINATE) -viscous = express_getattr(IfcVibrationDamperTypeEnum, 'VISCOUS', INDETERMINATE) -userdefined = express_getattr(IfcVibrationDamperTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcVibrationDamperTypeEnum, 'NOTDEFINED', INDETERMINATE) +axial_yield = IfcVibrationDamperTypeEnum.AXIAL_YIELD +bending_yield = IfcVibrationDamperTypeEnum.BENDING_YIELD +friction = IfcVibrationDamperTypeEnum.FRICTION +rubber = IfcVibrationDamperTypeEnum.RUBBER +shear_yield = IfcVibrationDamperTypeEnum.SHEAR_YIELD +viscous = IfcVibrationDamperTypeEnum.VISCOUS +userdefined = IfcVibrationDamperTypeEnum.USERDEFINED +notdefined = IfcVibrationDamperTypeEnum.NOTDEFINED IfcVibrationIsolatorTypeEnum = enum_namespace() -base = express_getattr(IfcVibrationIsolatorTypeEnum, 'BASE', INDETERMINATE) -compression = express_getattr(IfcVibrationIsolatorTypeEnum, 'COMPRESSION', INDETERMINATE) -spring = express_getattr(IfcVibrationIsolatorTypeEnum, 'SPRING', INDETERMINATE) -userdefined = express_getattr(IfcVibrationIsolatorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcVibrationIsolatorTypeEnum, 'NOTDEFINED', INDETERMINATE) +base = IfcVibrationIsolatorTypeEnum.BASE +compression = IfcVibrationIsolatorTypeEnum.COMPRESSION +spring = IfcVibrationIsolatorTypeEnum.SPRING +userdefined = IfcVibrationIsolatorTypeEnum.USERDEFINED +notdefined = IfcVibrationIsolatorTypeEnum.NOTDEFINED IfcVirtualElementTypeEnum = enum_namespace() -boundary = express_getattr(IfcVirtualElementTypeEnum, 'BOUNDARY', INDETERMINATE) -clearance = express_getattr(IfcVirtualElementTypeEnum, 'CLEARANCE', INDETERMINATE) -provisionforvoid = express_getattr(IfcVirtualElementTypeEnum, 'PROVISIONFORVOID', INDETERMINATE) -userdefined = express_getattr(IfcVirtualElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcVirtualElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +boundary = IfcVirtualElementTypeEnum.BOUNDARY +clearance = IfcVirtualElementTypeEnum.CLEARANCE +provisionforvoid = IfcVirtualElementTypeEnum.PROVISIONFORVOID +userdefined = IfcVirtualElementTypeEnum.USERDEFINED +notdefined = IfcVirtualElementTypeEnum.NOTDEFINED IfcVoidingFeatureTypeEnum = enum_namespace() -chamfer = express_getattr(IfcVoidingFeatureTypeEnum, 'CHAMFER', INDETERMINATE) -cutout = express_getattr(IfcVoidingFeatureTypeEnum, 'CUTOUT', INDETERMINATE) -edge = express_getattr(IfcVoidingFeatureTypeEnum, 'EDGE', INDETERMINATE) -hole = express_getattr(IfcVoidingFeatureTypeEnum, 'HOLE', INDETERMINATE) -miter = express_getattr(IfcVoidingFeatureTypeEnum, 'MITER', INDETERMINATE) -notch = express_getattr(IfcVoidingFeatureTypeEnum, 'NOTCH', INDETERMINATE) -userdefined = express_getattr(IfcVoidingFeatureTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcVoidingFeatureTypeEnum, 'NOTDEFINED', INDETERMINATE) +chamfer = IfcVoidingFeatureTypeEnum.CHAMFER +cutout = IfcVoidingFeatureTypeEnum.CUTOUT +edge = IfcVoidingFeatureTypeEnum.EDGE +hole = IfcVoidingFeatureTypeEnum.HOLE +miter = IfcVoidingFeatureTypeEnum.MITER +notch = IfcVoidingFeatureTypeEnum.NOTCH +userdefined = IfcVoidingFeatureTypeEnum.USERDEFINED +notdefined = IfcVoidingFeatureTypeEnum.NOTDEFINED IfcWallTypeEnum = enum_namespace() -elementedwall = express_getattr(IfcWallTypeEnum, 'ELEMENTEDWALL', INDETERMINATE) -movable = express_getattr(IfcWallTypeEnum, 'MOVABLE', INDETERMINATE) -parapet = express_getattr(IfcWallTypeEnum, 'PARAPET', INDETERMINATE) -partitioning = express_getattr(IfcWallTypeEnum, 'PARTITIONING', INDETERMINATE) -plumbingwall = express_getattr(IfcWallTypeEnum, 'PLUMBINGWALL', INDETERMINATE) -polygonal = express_getattr(IfcWallTypeEnum, 'POLYGONAL', INDETERMINATE) -retainingwall = express_getattr(IfcWallTypeEnum, 'RETAININGWALL', INDETERMINATE) -shear = express_getattr(IfcWallTypeEnum, 'SHEAR', INDETERMINATE) -solidwall = express_getattr(IfcWallTypeEnum, 'SOLIDWALL', INDETERMINATE) -standard = express_getattr(IfcWallTypeEnum, 'STANDARD', INDETERMINATE) -wavewall = express_getattr(IfcWallTypeEnum, 'WAVEWALL', INDETERMINATE) -userdefined = express_getattr(IfcWallTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcWallTypeEnum, 'NOTDEFINED', INDETERMINATE) +elementedwall = IfcWallTypeEnum.ELEMENTEDWALL +movable = IfcWallTypeEnum.MOVABLE +parapet = IfcWallTypeEnum.PARAPET +partitioning = IfcWallTypeEnum.PARTITIONING +plumbingwall = IfcWallTypeEnum.PLUMBINGWALL +polygonal = IfcWallTypeEnum.POLYGONAL +retainingwall = IfcWallTypeEnum.RETAININGWALL +shear = IfcWallTypeEnum.SHEAR +solidwall = IfcWallTypeEnum.SOLIDWALL +standard = IfcWallTypeEnum.STANDARD +wavewall = IfcWallTypeEnum.WAVEWALL +userdefined = IfcWallTypeEnum.USERDEFINED +notdefined = IfcWallTypeEnum.NOTDEFINED IfcWasteTerminalTypeEnum = enum_namespace() -floortrap = express_getattr(IfcWasteTerminalTypeEnum, 'FLOORTRAP', INDETERMINATE) -floorwaste = express_getattr(IfcWasteTerminalTypeEnum, 'FLOORWASTE', INDETERMINATE) -gullysump = express_getattr(IfcWasteTerminalTypeEnum, 'GULLYSUMP', INDETERMINATE) -gullytrap = express_getattr(IfcWasteTerminalTypeEnum, 'GULLYTRAP', INDETERMINATE) -roofdrain = express_getattr(IfcWasteTerminalTypeEnum, 'ROOFDRAIN', INDETERMINATE) -wastedisposalunit = express_getattr(IfcWasteTerminalTypeEnum, 'WASTEDISPOSALUNIT', INDETERMINATE) -wastetrap = express_getattr(IfcWasteTerminalTypeEnum, 'WASTETRAP', INDETERMINATE) -userdefined = express_getattr(IfcWasteTerminalTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcWasteTerminalTypeEnum, 'NOTDEFINED', INDETERMINATE) +floortrap = IfcWasteTerminalTypeEnum.FLOORTRAP +floorwaste = IfcWasteTerminalTypeEnum.FLOORWASTE +gullysump = IfcWasteTerminalTypeEnum.GULLYSUMP +gullytrap = IfcWasteTerminalTypeEnum.GULLYTRAP +roofdrain = IfcWasteTerminalTypeEnum.ROOFDRAIN +wastedisposalunit = IfcWasteTerminalTypeEnum.WASTEDISPOSALUNIT +wastetrap = IfcWasteTerminalTypeEnum.WASTETRAP +userdefined = IfcWasteTerminalTypeEnum.USERDEFINED +notdefined = IfcWasteTerminalTypeEnum.NOTDEFINED IfcWindowPanelOperationEnum = enum_namespace() -bottomhung = express_getattr(IfcWindowPanelOperationEnum, 'BOTTOMHUNG', INDETERMINATE) -fixedcasement = express_getattr(IfcWindowPanelOperationEnum, 'FIXEDCASEMENT', INDETERMINATE) -otheroperation = express_getattr(IfcWindowPanelOperationEnum, 'OTHEROPERATION', INDETERMINATE) -pivothorizontal = express_getattr(IfcWindowPanelOperationEnum, 'PIVOTHORIZONTAL', INDETERMINATE) -pivotvertical = express_getattr(IfcWindowPanelOperationEnum, 'PIVOTVERTICAL', INDETERMINATE) -removablecasement = express_getattr(IfcWindowPanelOperationEnum, 'REMOVABLECASEMENT', INDETERMINATE) -sidehunglefthand = express_getattr(IfcWindowPanelOperationEnum, 'SIDEHUNGLEFTHAND', INDETERMINATE) -sidehungrighthand = express_getattr(IfcWindowPanelOperationEnum, 'SIDEHUNGRIGHTHAND', INDETERMINATE) -slidinghorizontal = express_getattr(IfcWindowPanelOperationEnum, 'SLIDINGHORIZONTAL', INDETERMINATE) -slidingvertical = express_getattr(IfcWindowPanelOperationEnum, 'SLIDINGVERTICAL', INDETERMINATE) -tiltandturnlefthand = express_getattr(IfcWindowPanelOperationEnum, 'TILTANDTURNLEFTHAND', INDETERMINATE) -tiltandturnrighthand = express_getattr(IfcWindowPanelOperationEnum, 'TILTANDTURNRIGHTHAND', INDETERMINATE) -tophung = express_getattr(IfcWindowPanelOperationEnum, 'TOPHUNG', INDETERMINATE) -notdefined = express_getattr(IfcWindowPanelOperationEnum, 'NOTDEFINED', INDETERMINATE) +bottomhung = IfcWindowPanelOperationEnum.BOTTOMHUNG +fixedcasement = IfcWindowPanelOperationEnum.FIXEDCASEMENT +otheroperation = IfcWindowPanelOperationEnum.OTHEROPERATION +pivothorizontal = IfcWindowPanelOperationEnum.PIVOTHORIZONTAL +pivotvertical = IfcWindowPanelOperationEnum.PIVOTVERTICAL +removablecasement = IfcWindowPanelOperationEnum.REMOVABLECASEMENT +sidehunglefthand = IfcWindowPanelOperationEnum.SIDEHUNGLEFTHAND +sidehungrighthand = IfcWindowPanelOperationEnum.SIDEHUNGRIGHTHAND +slidinghorizontal = IfcWindowPanelOperationEnum.SLIDINGHORIZONTAL +slidingvertical = IfcWindowPanelOperationEnum.SLIDINGVERTICAL +tiltandturnlefthand = IfcWindowPanelOperationEnum.TILTANDTURNLEFTHAND +tiltandturnrighthand = IfcWindowPanelOperationEnum.TILTANDTURNRIGHTHAND +tophung = IfcWindowPanelOperationEnum.TOPHUNG +notdefined = IfcWindowPanelOperationEnum.NOTDEFINED IfcWindowPanelPositionEnum = enum_namespace() -bottom = express_getattr(IfcWindowPanelPositionEnum, 'BOTTOM', INDETERMINATE) -left = express_getattr(IfcWindowPanelPositionEnum, 'LEFT', INDETERMINATE) -middle = express_getattr(IfcWindowPanelPositionEnum, 'MIDDLE', INDETERMINATE) -right = express_getattr(IfcWindowPanelPositionEnum, 'RIGHT', INDETERMINATE) -top = express_getattr(IfcWindowPanelPositionEnum, 'TOP', INDETERMINATE) -notdefined = express_getattr(IfcWindowPanelPositionEnum, 'NOTDEFINED', INDETERMINATE) +bottom = IfcWindowPanelPositionEnum.BOTTOM +left = IfcWindowPanelPositionEnum.LEFT +middle = IfcWindowPanelPositionEnum.MIDDLE +right = IfcWindowPanelPositionEnum.RIGHT +top = IfcWindowPanelPositionEnum.TOP +notdefined = IfcWindowPanelPositionEnum.NOTDEFINED IfcWindowTypeEnum = enum_namespace() -lightdome = express_getattr(IfcWindowTypeEnum, 'LIGHTDOME', INDETERMINATE) -skylight = express_getattr(IfcWindowTypeEnum, 'SKYLIGHT', INDETERMINATE) -window = express_getattr(IfcWindowTypeEnum, 'WINDOW', INDETERMINATE) -userdefined = express_getattr(IfcWindowTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcWindowTypeEnum, 'NOTDEFINED', INDETERMINATE) +lightdome = IfcWindowTypeEnum.LIGHTDOME +skylight = IfcWindowTypeEnum.SKYLIGHT +window = IfcWindowTypeEnum.WINDOW +userdefined = IfcWindowTypeEnum.USERDEFINED +notdefined = IfcWindowTypeEnum.NOTDEFINED IfcWindowTypePartitioningEnum = enum_namespace() -double_panel_horizontal = express_getattr(IfcWindowTypePartitioningEnum, 'DOUBLE_PANEL_HORIZONTAL', INDETERMINATE) -double_panel_vertical = express_getattr(IfcWindowTypePartitioningEnum, 'DOUBLE_PANEL_VERTICAL', INDETERMINATE) -single_panel = express_getattr(IfcWindowTypePartitioningEnum, 'SINGLE_PANEL', INDETERMINATE) -triple_panel_bottom = express_getattr(IfcWindowTypePartitioningEnum, 'TRIPLE_PANEL_BOTTOM', INDETERMINATE) -triple_panel_horizontal = express_getattr(IfcWindowTypePartitioningEnum, 'TRIPLE_PANEL_HORIZONTAL', INDETERMINATE) -triple_panel_left = express_getattr(IfcWindowTypePartitioningEnum, 'TRIPLE_PANEL_LEFT', INDETERMINATE) -triple_panel_right = express_getattr(IfcWindowTypePartitioningEnum, 'TRIPLE_PANEL_RIGHT', INDETERMINATE) -triple_panel_top = express_getattr(IfcWindowTypePartitioningEnum, 'TRIPLE_PANEL_TOP', INDETERMINATE) -triple_panel_vertical = express_getattr(IfcWindowTypePartitioningEnum, 'TRIPLE_PANEL_VERTICAL', INDETERMINATE) -userdefined = express_getattr(IfcWindowTypePartitioningEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcWindowTypePartitioningEnum, 'NOTDEFINED', INDETERMINATE) +double_panel_horizontal = IfcWindowTypePartitioningEnum.DOUBLE_PANEL_HORIZONTAL +double_panel_vertical = IfcWindowTypePartitioningEnum.DOUBLE_PANEL_VERTICAL +single_panel = IfcWindowTypePartitioningEnum.SINGLE_PANEL +triple_panel_bottom = IfcWindowTypePartitioningEnum.TRIPLE_PANEL_BOTTOM +triple_panel_horizontal = IfcWindowTypePartitioningEnum.TRIPLE_PANEL_HORIZONTAL +triple_panel_left = IfcWindowTypePartitioningEnum.TRIPLE_PANEL_LEFT +triple_panel_right = IfcWindowTypePartitioningEnum.TRIPLE_PANEL_RIGHT +triple_panel_top = IfcWindowTypePartitioningEnum.TRIPLE_PANEL_TOP +triple_panel_vertical = IfcWindowTypePartitioningEnum.TRIPLE_PANEL_VERTICAL +userdefined = IfcWindowTypePartitioningEnum.USERDEFINED +notdefined = IfcWindowTypePartitioningEnum.NOTDEFINED IfcWorkCalendarTypeEnum = enum_namespace() -firstshift = express_getattr(IfcWorkCalendarTypeEnum, 'FIRSTSHIFT', INDETERMINATE) -secondshift = express_getattr(IfcWorkCalendarTypeEnum, 'SECONDSHIFT', INDETERMINATE) -thirdshift = express_getattr(IfcWorkCalendarTypeEnum, 'THIRDSHIFT', INDETERMINATE) -userdefined = express_getattr(IfcWorkCalendarTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcWorkCalendarTypeEnum, 'NOTDEFINED', INDETERMINATE) +firstshift = IfcWorkCalendarTypeEnum.FIRSTSHIFT +secondshift = IfcWorkCalendarTypeEnum.SECONDSHIFT +thirdshift = IfcWorkCalendarTypeEnum.THIRDSHIFT +userdefined = IfcWorkCalendarTypeEnum.USERDEFINED +notdefined = IfcWorkCalendarTypeEnum.NOTDEFINED IfcWorkPlanTypeEnum = enum_namespace() -actual = express_getattr(IfcWorkPlanTypeEnum, 'ACTUAL', INDETERMINATE) -baseline = express_getattr(IfcWorkPlanTypeEnum, 'BASELINE', INDETERMINATE) -planned = express_getattr(IfcWorkPlanTypeEnum, 'PLANNED', INDETERMINATE) -userdefined = express_getattr(IfcWorkPlanTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcWorkPlanTypeEnum, 'NOTDEFINED', INDETERMINATE) +actual = IfcWorkPlanTypeEnum.ACTUAL +baseline = IfcWorkPlanTypeEnum.BASELINE +planned = IfcWorkPlanTypeEnum.PLANNED +userdefined = IfcWorkPlanTypeEnum.USERDEFINED +notdefined = IfcWorkPlanTypeEnum.NOTDEFINED IfcWorkScheduleTypeEnum = enum_namespace() -actual = express_getattr(IfcWorkScheduleTypeEnum, 'ACTUAL', INDETERMINATE) -baseline = express_getattr(IfcWorkScheduleTypeEnum, 'BASELINE', INDETERMINATE) -planned = express_getattr(IfcWorkScheduleTypeEnum, 'PLANNED', INDETERMINATE) -userdefined = express_getattr(IfcWorkScheduleTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcWorkScheduleTypeEnum, 'NOTDEFINED', INDETERMINATE) +actual = IfcWorkScheduleTypeEnum.ACTUAL +baseline = IfcWorkScheduleTypeEnum.BASELINE +planned = IfcWorkScheduleTypeEnum.PLANNED +userdefined = IfcWorkScheduleTypeEnum.USERDEFINED +notdefined = IfcWorkScheduleTypeEnum.NOTDEFINED def IfcActionRequest(*args, **kwargs): return ifcopenshell.create_entity('IfcActionRequest', 'IFC4X3_ADD1', *args, **kwargs) diff --git a/src/ifcopenshell-python/ifcopenshell/express/rules/IFC4X3_ADD2.py b/src/ifcopenshell-python/ifcopenshell/express/rules/IFC4X3_ADD2.py index 5e6f27dd99f..5eebf0d4d45 100644 --- a/src/ifcopenshell-python/ifcopenshell/express/rules/IFC4X3_ADD2.py +++ b/src/ifcopenshell-python/ifcopenshell/express/rules/IFC4X3_ADD2.py @@ -1,5 +1,8 @@ import ifcopenshell +def is_indeterminate(v): + return v is None or type(v).__name__ == 'indeterminate_type' + def exists(v): if callable(v): try: @@ -7,10 +10,10 @@ def exists(v): except IndexError as e: return False else: - return v is not None + return not is_indeterminate(v) def nvl(v, default): - return v if v is not None else default + return v if not is_indeterminate(v) else default def is_entity(inst): if isinstance(inst, ifcopenshell.entity_instance): @@ -22,13 +25,13 @@ def is_entity(inst): def express_len(v): if isinstance(v, ifcopenshell.entity_instance) and (not is_entity(v)): v = v[0] - elif v is None or v is INDETERMINATE: + elif is_indeterminate(v): return INDETERMINATE return len(v) old_range = range def range(*args): - if INDETERMINATE in args: + if any(map(is_indeterminate, args)): return yield from old_range(*args) sizeof = express_len @@ -149,2365 +152,2365 @@ class enum_namespace: def __getattr__(self, k): return express_getattr(k, 'upper', INDETERMINATE)() IfcActionRequestTypeEnum = enum_namespace() -email = express_getattr(IfcActionRequestTypeEnum, 'EMAIL', INDETERMINATE) -fax = express_getattr(IfcActionRequestTypeEnum, 'FAX', INDETERMINATE) -phone = express_getattr(IfcActionRequestTypeEnum, 'PHONE', INDETERMINATE) -post = express_getattr(IfcActionRequestTypeEnum, 'POST', INDETERMINATE) -verbal = express_getattr(IfcActionRequestTypeEnum, 'VERBAL', INDETERMINATE) -userdefined = express_getattr(IfcActionRequestTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcActionRequestTypeEnum, 'NOTDEFINED', INDETERMINATE) +email = IfcActionRequestTypeEnum.EMAIL +fax = IfcActionRequestTypeEnum.FAX +phone = IfcActionRequestTypeEnum.PHONE +post = IfcActionRequestTypeEnum.POST +verbal = IfcActionRequestTypeEnum.VERBAL +userdefined = IfcActionRequestTypeEnum.USERDEFINED +notdefined = IfcActionRequestTypeEnum.NOTDEFINED IfcActionSourceTypeEnum = enum_namespace() -brakes = express_getattr(IfcActionSourceTypeEnum, 'BRAKES', INDETERMINATE) -buoyancy = express_getattr(IfcActionSourceTypeEnum, 'BUOYANCY', INDETERMINATE) -completion_g1 = express_getattr(IfcActionSourceTypeEnum, 'COMPLETION_G1', INDETERMINATE) -creep = express_getattr(IfcActionSourceTypeEnum, 'CREEP', INDETERMINATE) -current = express_getattr(IfcActionSourceTypeEnum, 'CURRENT', INDETERMINATE) -dead_load_g = express_getattr(IfcActionSourceTypeEnum, 'DEAD_LOAD_G', INDETERMINATE) -earthquake_e = express_getattr(IfcActionSourceTypeEnum, 'EARTHQUAKE_E', INDETERMINATE) -erection = express_getattr(IfcActionSourceTypeEnum, 'ERECTION', INDETERMINATE) -fire = express_getattr(IfcActionSourceTypeEnum, 'FIRE', INDETERMINATE) -ice = express_getattr(IfcActionSourceTypeEnum, 'ICE', INDETERMINATE) -impact = express_getattr(IfcActionSourceTypeEnum, 'IMPACT', INDETERMINATE) -impulse = express_getattr(IfcActionSourceTypeEnum, 'IMPULSE', INDETERMINATE) -lack_of_fit = express_getattr(IfcActionSourceTypeEnum, 'LACK_OF_FIT', INDETERMINATE) -live_load_q = express_getattr(IfcActionSourceTypeEnum, 'LIVE_LOAD_Q', INDETERMINATE) -prestressing_p = express_getattr(IfcActionSourceTypeEnum, 'PRESTRESSING_P', INDETERMINATE) -propping = express_getattr(IfcActionSourceTypeEnum, 'PROPPING', INDETERMINATE) -rain = express_getattr(IfcActionSourceTypeEnum, 'RAIN', INDETERMINATE) -settlement_u = express_getattr(IfcActionSourceTypeEnum, 'SETTLEMENT_U', INDETERMINATE) -shrinkage = express_getattr(IfcActionSourceTypeEnum, 'SHRINKAGE', INDETERMINATE) -snow_s = express_getattr(IfcActionSourceTypeEnum, 'SNOW_S', INDETERMINATE) -system_imperfection = express_getattr(IfcActionSourceTypeEnum, 'SYSTEM_IMPERFECTION', INDETERMINATE) -temperature_t = express_getattr(IfcActionSourceTypeEnum, 'TEMPERATURE_T', INDETERMINATE) -transport = express_getattr(IfcActionSourceTypeEnum, 'TRANSPORT', INDETERMINATE) -wave = express_getattr(IfcActionSourceTypeEnum, 'WAVE', INDETERMINATE) -wind_w = express_getattr(IfcActionSourceTypeEnum, 'WIND_W', INDETERMINATE) -userdefined = express_getattr(IfcActionSourceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcActionSourceTypeEnum, 'NOTDEFINED', INDETERMINATE) +brakes = IfcActionSourceTypeEnum.BRAKES +buoyancy = IfcActionSourceTypeEnum.BUOYANCY +completion_g1 = IfcActionSourceTypeEnum.COMPLETION_G1 +creep = IfcActionSourceTypeEnum.CREEP +current = IfcActionSourceTypeEnum.CURRENT +dead_load_g = IfcActionSourceTypeEnum.DEAD_LOAD_G +earthquake_e = IfcActionSourceTypeEnum.EARTHQUAKE_E +erection = IfcActionSourceTypeEnum.ERECTION +fire = IfcActionSourceTypeEnum.FIRE +ice = IfcActionSourceTypeEnum.ICE +impact = IfcActionSourceTypeEnum.IMPACT +impulse = IfcActionSourceTypeEnum.IMPULSE +lack_of_fit = IfcActionSourceTypeEnum.LACK_OF_FIT +live_load_q = IfcActionSourceTypeEnum.LIVE_LOAD_Q +prestressing_p = IfcActionSourceTypeEnum.PRESTRESSING_P +propping = IfcActionSourceTypeEnum.PROPPING +rain = IfcActionSourceTypeEnum.RAIN +settlement_u = IfcActionSourceTypeEnum.SETTLEMENT_U +shrinkage = IfcActionSourceTypeEnum.SHRINKAGE +snow_s = IfcActionSourceTypeEnum.SNOW_S +system_imperfection = IfcActionSourceTypeEnum.SYSTEM_IMPERFECTION +temperature_t = IfcActionSourceTypeEnum.TEMPERATURE_T +transport = IfcActionSourceTypeEnum.TRANSPORT +wave = IfcActionSourceTypeEnum.WAVE +wind_w = IfcActionSourceTypeEnum.WIND_W +userdefined = IfcActionSourceTypeEnum.USERDEFINED +notdefined = IfcActionSourceTypeEnum.NOTDEFINED IfcActionTypeEnum = enum_namespace() -extraordinary_a = express_getattr(IfcActionTypeEnum, 'EXTRAORDINARY_A', INDETERMINATE) -permanent_g = express_getattr(IfcActionTypeEnum, 'PERMANENT_G', INDETERMINATE) -variable_q = express_getattr(IfcActionTypeEnum, 'VARIABLE_Q', INDETERMINATE) -userdefined = express_getattr(IfcActionTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcActionTypeEnum, 'NOTDEFINED', INDETERMINATE) +extraordinary_a = IfcActionTypeEnum.EXTRAORDINARY_A +permanent_g = IfcActionTypeEnum.PERMANENT_G +variable_q = IfcActionTypeEnum.VARIABLE_Q +userdefined = IfcActionTypeEnum.USERDEFINED +notdefined = IfcActionTypeEnum.NOTDEFINED IfcActuatorTypeEnum = enum_namespace() -electricactuator = express_getattr(IfcActuatorTypeEnum, 'ELECTRICACTUATOR', INDETERMINATE) -handoperatedactuator = express_getattr(IfcActuatorTypeEnum, 'HANDOPERATEDACTUATOR', INDETERMINATE) -hydraulicactuator = express_getattr(IfcActuatorTypeEnum, 'HYDRAULICACTUATOR', INDETERMINATE) -pneumaticactuator = express_getattr(IfcActuatorTypeEnum, 'PNEUMATICACTUATOR', INDETERMINATE) -thermostaticactuator = express_getattr(IfcActuatorTypeEnum, 'THERMOSTATICACTUATOR', INDETERMINATE) -userdefined = express_getattr(IfcActuatorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcActuatorTypeEnum, 'NOTDEFINED', INDETERMINATE) +electricactuator = IfcActuatorTypeEnum.ELECTRICACTUATOR +handoperatedactuator = IfcActuatorTypeEnum.HANDOPERATEDACTUATOR +hydraulicactuator = IfcActuatorTypeEnum.HYDRAULICACTUATOR +pneumaticactuator = IfcActuatorTypeEnum.PNEUMATICACTUATOR +thermostaticactuator = IfcActuatorTypeEnum.THERMOSTATICACTUATOR +userdefined = IfcActuatorTypeEnum.USERDEFINED +notdefined = IfcActuatorTypeEnum.NOTDEFINED IfcAddressTypeEnum = enum_namespace() -distributionpoint = express_getattr(IfcAddressTypeEnum, 'DISTRIBUTIONPOINT', INDETERMINATE) -home = express_getattr(IfcAddressTypeEnum, 'HOME', INDETERMINATE) -office = express_getattr(IfcAddressTypeEnum, 'OFFICE', INDETERMINATE) -site = express_getattr(IfcAddressTypeEnum, 'SITE', INDETERMINATE) -userdefined = express_getattr(IfcAddressTypeEnum, 'USERDEFINED', INDETERMINATE) +distributionpoint = IfcAddressTypeEnum.DISTRIBUTIONPOINT +home = IfcAddressTypeEnum.HOME +office = IfcAddressTypeEnum.OFFICE +site = IfcAddressTypeEnum.SITE +userdefined = IfcAddressTypeEnum.USERDEFINED IfcAirTerminalBoxTypeEnum = enum_namespace() -constantflow = express_getattr(IfcAirTerminalBoxTypeEnum, 'CONSTANTFLOW', INDETERMINATE) -variableflowpressuredependant = express_getattr(IfcAirTerminalBoxTypeEnum, 'VARIABLEFLOWPRESSUREDEPENDANT', INDETERMINATE) -variableflowpressureindependant = express_getattr(IfcAirTerminalBoxTypeEnum, 'VARIABLEFLOWPRESSUREINDEPENDANT', INDETERMINATE) -userdefined = express_getattr(IfcAirTerminalBoxTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAirTerminalBoxTypeEnum, 'NOTDEFINED', INDETERMINATE) +constantflow = IfcAirTerminalBoxTypeEnum.CONSTANTFLOW +variableflowpressuredependant = IfcAirTerminalBoxTypeEnum.VARIABLEFLOWPRESSUREDEPENDANT +variableflowpressureindependant = IfcAirTerminalBoxTypeEnum.VARIABLEFLOWPRESSUREINDEPENDANT +userdefined = IfcAirTerminalBoxTypeEnum.USERDEFINED +notdefined = IfcAirTerminalBoxTypeEnum.NOTDEFINED IfcAirTerminalTypeEnum = enum_namespace() -diffuser = express_getattr(IfcAirTerminalTypeEnum, 'DIFFUSER', INDETERMINATE) -grille = express_getattr(IfcAirTerminalTypeEnum, 'GRILLE', INDETERMINATE) -louvre = express_getattr(IfcAirTerminalTypeEnum, 'LOUVRE', INDETERMINATE) -register = express_getattr(IfcAirTerminalTypeEnum, 'REGISTER', INDETERMINATE) -userdefined = express_getattr(IfcAirTerminalTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAirTerminalTypeEnum, 'NOTDEFINED', INDETERMINATE) +diffuser = IfcAirTerminalTypeEnum.DIFFUSER +grille = IfcAirTerminalTypeEnum.GRILLE +louvre = IfcAirTerminalTypeEnum.LOUVRE +register = IfcAirTerminalTypeEnum.REGISTER +userdefined = IfcAirTerminalTypeEnum.USERDEFINED +notdefined = IfcAirTerminalTypeEnum.NOTDEFINED IfcAirToAirHeatRecoveryTypeEnum = enum_namespace() -fixedplatecounterflowexchanger = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'FIXEDPLATECOUNTERFLOWEXCHANGER', INDETERMINATE) -fixedplatecrossflowexchanger = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'FIXEDPLATECROSSFLOWEXCHANGER', INDETERMINATE) -fixedplateparallelflowexchanger = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'FIXEDPLATEPARALLELFLOWEXCHANGER', INDETERMINATE) -heatpipe = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'HEATPIPE', INDETERMINATE) -rotarywheel = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'ROTARYWHEEL', INDETERMINATE) -runaroundcoilloop = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'RUNAROUNDCOILLOOP', INDETERMINATE) -thermosiphoncoiltypeheatexchangers = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'THERMOSIPHONCOILTYPEHEATEXCHANGERS', INDETERMINATE) -thermosiphonsealedtubeheatexchangers = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'THERMOSIPHONSEALEDTUBEHEATEXCHANGERS', INDETERMINATE) -twintowerenthalpyrecoveryloops = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'TWINTOWERENTHALPYRECOVERYLOOPS', INDETERMINATE) -userdefined = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'NOTDEFINED', INDETERMINATE) +fixedplatecounterflowexchanger = IfcAirToAirHeatRecoveryTypeEnum.FIXEDPLATECOUNTERFLOWEXCHANGER +fixedplatecrossflowexchanger = IfcAirToAirHeatRecoveryTypeEnum.FIXEDPLATECROSSFLOWEXCHANGER +fixedplateparallelflowexchanger = IfcAirToAirHeatRecoveryTypeEnum.FIXEDPLATEPARALLELFLOWEXCHANGER +heatpipe = IfcAirToAirHeatRecoveryTypeEnum.HEATPIPE +rotarywheel = IfcAirToAirHeatRecoveryTypeEnum.ROTARYWHEEL +runaroundcoilloop = IfcAirToAirHeatRecoveryTypeEnum.RUNAROUNDCOILLOOP +thermosiphoncoiltypeheatexchangers = IfcAirToAirHeatRecoveryTypeEnum.THERMOSIPHONCOILTYPEHEATEXCHANGERS +thermosiphonsealedtubeheatexchangers = IfcAirToAirHeatRecoveryTypeEnum.THERMOSIPHONSEALEDTUBEHEATEXCHANGERS +twintowerenthalpyrecoveryloops = IfcAirToAirHeatRecoveryTypeEnum.TWINTOWERENTHALPYRECOVERYLOOPS +userdefined = IfcAirToAirHeatRecoveryTypeEnum.USERDEFINED +notdefined = IfcAirToAirHeatRecoveryTypeEnum.NOTDEFINED IfcAlarmTypeEnum = enum_namespace() -bell = express_getattr(IfcAlarmTypeEnum, 'BELL', INDETERMINATE) -breakglassbutton = express_getattr(IfcAlarmTypeEnum, 'BREAKGLASSBUTTON', INDETERMINATE) -light = express_getattr(IfcAlarmTypeEnum, 'LIGHT', INDETERMINATE) -manualpullbox = express_getattr(IfcAlarmTypeEnum, 'MANUALPULLBOX', INDETERMINATE) -railwaycrocodile = express_getattr(IfcAlarmTypeEnum, 'RAILWAYCROCODILE', INDETERMINATE) -railwaydetonator = express_getattr(IfcAlarmTypeEnum, 'RAILWAYDETONATOR', INDETERMINATE) -siren = express_getattr(IfcAlarmTypeEnum, 'SIREN', INDETERMINATE) -whistle = express_getattr(IfcAlarmTypeEnum, 'WHISTLE', INDETERMINATE) -userdefined = express_getattr(IfcAlarmTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAlarmTypeEnum, 'NOTDEFINED', INDETERMINATE) +bell = IfcAlarmTypeEnum.BELL +breakglassbutton = IfcAlarmTypeEnum.BREAKGLASSBUTTON +light = IfcAlarmTypeEnum.LIGHT +manualpullbox = IfcAlarmTypeEnum.MANUALPULLBOX +railwaycrocodile = IfcAlarmTypeEnum.RAILWAYCROCODILE +railwaydetonator = IfcAlarmTypeEnum.RAILWAYDETONATOR +siren = IfcAlarmTypeEnum.SIREN +whistle = IfcAlarmTypeEnum.WHISTLE +userdefined = IfcAlarmTypeEnum.USERDEFINED +notdefined = IfcAlarmTypeEnum.NOTDEFINED IfcAlignmentCantSegmentTypeEnum = enum_namespace() -blosscurve = express_getattr(IfcAlignmentCantSegmentTypeEnum, 'BLOSSCURVE', INDETERMINATE) -constantcant = express_getattr(IfcAlignmentCantSegmentTypeEnum, 'CONSTANTCANT', INDETERMINATE) -cosinecurve = express_getattr(IfcAlignmentCantSegmentTypeEnum, 'COSINECURVE', INDETERMINATE) -helmertcurve = express_getattr(IfcAlignmentCantSegmentTypeEnum, 'HELMERTCURVE', INDETERMINATE) -lineartransition = express_getattr(IfcAlignmentCantSegmentTypeEnum, 'LINEARTRANSITION', INDETERMINATE) -sinecurve = express_getattr(IfcAlignmentCantSegmentTypeEnum, 'SINECURVE', INDETERMINATE) -viennesebend = express_getattr(IfcAlignmentCantSegmentTypeEnum, 'VIENNESEBEND', INDETERMINATE) +blosscurve = IfcAlignmentCantSegmentTypeEnum.BLOSSCURVE +constantcant = IfcAlignmentCantSegmentTypeEnum.CONSTANTCANT +cosinecurve = IfcAlignmentCantSegmentTypeEnum.COSINECURVE +helmertcurve = IfcAlignmentCantSegmentTypeEnum.HELMERTCURVE +lineartransition = IfcAlignmentCantSegmentTypeEnum.LINEARTRANSITION +sinecurve = IfcAlignmentCantSegmentTypeEnum.SINECURVE +viennesebend = IfcAlignmentCantSegmentTypeEnum.VIENNESEBEND IfcAlignmentHorizontalSegmentTypeEnum = enum_namespace() -blosscurve = express_getattr(IfcAlignmentHorizontalSegmentTypeEnum, 'BLOSSCURVE', INDETERMINATE) -circulararc = express_getattr(IfcAlignmentHorizontalSegmentTypeEnum, 'CIRCULARARC', INDETERMINATE) -clothoid = express_getattr(IfcAlignmentHorizontalSegmentTypeEnum, 'CLOTHOID', INDETERMINATE) -cosinecurve = express_getattr(IfcAlignmentHorizontalSegmentTypeEnum, 'COSINECURVE', INDETERMINATE) -cubic = express_getattr(IfcAlignmentHorizontalSegmentTypeEnum, 'CUBIC', INDETERMINATE) -helmertcurve = express_getattr(IfcAlignmentHorizontalSegmentTypeEnum, 'HELMERTCURVE', INDETERMINATE) -line = express_getattr(IfcAlignmentHorizontalSegmentTypeEnum, 'LINE', INDETERMINATE) -sinecurve = express_getattr(IfcAlignmentHorizontalSegmentTypeEnum, 'SINECURVE', INDETERMINATE) -viennesebend = express_getattr(IfcAlignmentHorizontalSegmentTypeEnum, 'VIENNESEBEND', INDETERMINATE) +blosscurve = IfcAlignmentHorizontalSegmentTypeEnum.BLOSSCURVE +circulararc = IfcAlignmentHorizontalSegmentTypeEnum.CIRCULARARC +clothoid = IfcAlignmentHorizontalSegmentTypeEnum.CLOTHOID +cosinecurve = IfcAlignmentHorizontalSegmentTypeEnum.COSINECURVE +cubic = IfcAlignmentHorizontalSegmentTypeEnum.CUBIC +helmertcurve = IfcAlignmentHorizontalSegmentTypeEnum.HELMERTCURVE +line = IfcAlignmentHorizontalSegmentTypeEnum.LINE +sinecurve = IfcAlignmentHorizontalSegmentTypeEnum.SINECURVE +viennesebend = IfcAlignmentHorizontalSegmentTypeEnum.VIENNESEBEND IfcAlignmentTypeEnum = enum_namespace() -userdefined = express_getattr(IfcAlignmentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAlignmentTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcAlignmentTypeEnum.USERDEFINED +notdefined = IfcAlignmentTypeEnum.NOTDEFINED IfcAlignmentVerticalSegmentTypeEnum = enum_namespace() -circulararc = express_getattr(IfcAlignmentVerticalSegmentTypeEnum, 'CIRCULARARC', INDETERMINATE) -clothoid = express_getattr(IfcAlignmentVerticalSegmentTypeEnum, 'CLOTHOID', INDETERMINATE) -constantgradient = express_getattr(IfcAlignmentVerticalSegmentTypeEnum, 'CONSTANTGRADIENT', INDETERMINATE) -parabolicarc = express_getattr(IfcAlignmentVerticalSegmentTypeEnum, 'PARABOLICARC', INDETERMINATE) +circulararc = IfcAlignmentVerticalSegmentTypeEnum.CIRCULARARC +clothoid = IfcAlignmentVerticalSegmentTypeEnum.CLOTHOID +constantgradient = IfcAlignmentVerticalSegmentTypeEnum.CONSTANTGRADIENT +parabolicarc = IfcAlignmentVerticalSegmentTypeEnum.PARABOLICARC IfcAnalysisModelTypeEnum = enum_namespace() -in_plane_loading_2d = express_getattr(IfcAnalysisModelTypeEnum, 'IN_PLANE_LOADING_2D', INDETERMINATE) -loading_3d = express_getattr(IfcAnalysisModelTypeEnum, 'LOADING_3D', INDETERMINATE) -out_plane_loading_2d = express_getattr(IfcAnalysisModelTypeEnum, 'OUT_PLANE_LOADING_2D', INDETERMINATE) -userdefined = express_getattr(IfcAnalysisModelTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAnalysisModelTypeEnum, 'NOTDEFINED', INDETERMINATE) +in_plane_loading_2d = IfcAnalysisModelTypeEnum.IN_PLANE_LOADING_2D +loading_3d = IfcAnalysisModelTypeEnum.LOADING_3D +out_plane_loading_2d = IfcAnalysisModelTypeEnum.OUT_PLANE_LOADING_2D +userdefined = IfcAnalysisModelTypeEnum.USERDEFINED +notdefined = IfcAnalysisModelTypeEnum.NOTDEFINED IfcAnalysisTheoryTypeEnum = enum_namespace() -first_order_theory = express_getattr(IfcAnalysisTheoryTypeEnum, 'FIRST_ORDER_THEORY', INDETERMINATE) -full_nonlinear_theory = express_getattr(IfcAnalysisTheoryTypeEnum, 'FULL_NONLINEAR_THEORY', INDETERMINATE) -second_order_theory = express_getattr(IfcAnalysisTheoryTypeEnum, 'SECOND_ORDER_THEORY', INDETERMINATE) -third_order_theory = express_getattr(IfcAnalysisTheoryTypeEnum, 'THIRD_ORDER_THEORY', INDETERMINATE) -userdefined = express_getattr(IfcAnalysisTheoryTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAnalysisTheoryTypeEnum, 'NOTDEFINED', INDETERMINATE) +first_order_theory = IfcAnalysisTheoryTypeEnum.FIRST_ORDER_THEORY +full_nonlinear_theory = IfcAnalysisTheoryTypeEnum.FULL_NONLINEAR_THEORY +second_order_theory = IfcAnalysisTheoryTypeEnum.SECOND_ORDER_THEORY +third_order_theory = IfcAnalysisTheoryTypeEnum.THIRD_ORDER_THEORY +userdefined = IfcAnalysisTheoryTypeEnum.USERDEFINED +notdefined = IfcAnalysisTheoryTypeEnum.NOTDEFINED IfcAnnotationTypeEnum = enum_namespace() -contourline = express_getattr(IfcAnnotationTypeEnum, 'CONTOURLINE', INDETERMINATE) -dimension = express_getattr(IfcAnnotationTypeEnum, 'DIMENSION', INDETERMINATE) -isobar = express_getattr(IfcAnnotationTypeEnum, 'ISOBAR', INDETERMINATE) -isolux = express_getattr(IfcAnnotationTypeEnum, 'ISOLUX', INDETERMINATE) -isotherm = express_getattr(IfcAnnotationTypeEnum, 'ISOTHERM', INDETERMINATE) -leader = express_getattr(IfcAnnotationTypeEnum, 'LEADER', INDETERMINATE) -survey = express_getattr(IfcAnnotationTypeEnum, 'SURVEY', INDETERMINATE) -symbol = express_getattr(IfcAnnotationTypeEnum, 'SYMBOL', INDETERMINATE) -text = express_getattr(IfcAnnotationTypeEnum, 'TEXT', INDETERMINATE) -userdefined = express_getattr(IfcAnnotationTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAnnotationTypeEnum, 'NOTDEFINED', INDETERMINATE) +contourline = IfcAnnotationTypeEnum.CONTOURLINE +dimension = IfcAnnotationTypeEnum.DIMENSION +isobar = IfcAnnotationTypeEnum.ISOBAR +isolux = IfcAnnotationTypeEnum.ISOLUX +isotherm = IfcAnnotationTypeEnum.ISOTHERM +leader = IfcAnnotationTypeEnum.LEADER +survey = IfcAnnotationTypeEnum.SURVEY +symbol = IfcAnnotationTypeEnum.SYMBOL +text = IfcAnnotationTypeEnum.TEXT +userdefined = IfcAnnotationTypeEnum.USERDEFINED +notdefined = IfcAnnotationTypeEnum.NOTDEFINED IfcArithmeticOperatorEnum = enum_namespace() -add = express_getattr(IfcArithmeticOperatorEnum, 'ADD', INDETERMINATE) -divide = express_getattr(IfcArithmeticOperatorEnum, 'DIVIDE', INDETERMINATE) -modulo = express_getattr(IfcArithmeticOperatorEnum, 'MODULO', INDETERMINATE) -multiply = express_getattr(IfcArithmeticOperatorEnum, 'MULTIPLY', INDETERMINATE) -subtract = express_getattr(IfcArithmeticOperatorEnum, 'SUBTRACT', INDETERMINATE) +add = IfcArithmeticOperatorEnum.ADD +divide = IfcArithmeticOperatorEnum.DIVIDE +modulo = IfcArithmeticOperatorEnum.MODULO +multiply = IfcArithmeticOperatorEnum.MULTIPLY +subtract = IfcArithmeticOperatorEnum.SUBTRACT IfcAssemblyPlaceEnum = enum_namespace() -factory = express_getattr(IfcAssemblyPlaceEnum, 'FACTORY', INDETERMINATE) -site = express_getattr(IfcAssemblyPlaceEnum, 'SITE', INDETERMINATE) -notdefined = express_getattr(IfcAssemblyPlaceEnum, 'NOTDEFINED', INDETERMINATE) +factory = IfcAssemblyPlaceEnum.FACTORY +site = IfcAssemblyPlaceEnum.SITE +notdefined = IfcAssemblyPlaceEnum.NOTDEFINED IfcAudioVisualApplianceTypeEnum = enum_namespace() -amplifier = express_getattr(IfcAudioVisualApplianceTypeEnum, 'AMPLIFIER', INDETERMINATE) -camera = express_getattr(IfcAudioVisualApplianceTypeEnum, 'CAMERA', INDETERMINATE) -communicationterminal = express_getattr(IfcAudioVisualApplianceTypeEnum, 'COMMUNICATIONTERMINAL', INDETERMINATE) -display = express_getattr(IfcAudioVisualApplianceTypeEnum, 'DISPLAY', INDETERMINATE) -microphone = express_getattr(IfcAudioVisualApplianceTypeEnum, 'MICROPHONE', INDETERMINATE) -player = express_getattr(IfcAudioVisualApplianceTypeEnum, 'PLAYER', INDETERMINATE) -projector = express_getattr(IfcAudioVisualApplianceTypeEnum, 'PROJECTOR', INDETERMINATE) -receiver = express_getattr(IfcAudioVisualApplianceTypeEnum, 'RECEIVER', INDETERMINATE) -recordingequipment = express_getattr(IfcAudioVisualApplianceTypeEnum, 'RECORDINGEQUIPMENT', INDETERMINATE) -speaker = express_getattr(IfcAudioVisualApplianceTypeEnum, 'SPEAKER', INDETERMINATE) -switcher = express_getattr(IfcAudioVisualApplianceTypeEnum, 'SWITCHER', INDETERMINATE) -telephone = express_getattr(IfcAudioVisualApplianceTypeEnum, 'TELEPHONE', INDETERMINATE) -tuner = express_getattr(IfcAudioVisualApplianceTypeEnum, 'TUNER', INDETERMINATE) -userdefined = express_getattr(IfcAudioVisualApplianceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAudioVisualApplianceTypeEnum, 'NOTDEFINED', INDETERMINATE) +amplifier = IfcAudioVisualApplianceTypeEnum.AMPLIFIER +camera = IfcAudioVisualApplianceTypeEnum.CAMERA +communicationterminal = IfcAudioVisualApplianceTypeEnum.COMMUNICATIONTERMINAL +display = IfcAudioVisualApplianceTypeEnum.DISPLAY +microphone = IfcAudioVisualApplianceTypeEnum.MICROPHONE +player = IfcAudioVisualApplianceTypeEnum.PLAYER +projector = IfcAudioVisualApplianceTypeEnum.PROJECTOR +receiver = IfcAudioVisualApplianceTypeEnum.RECEIVER +recordingequipment = IfcAudioVisualApplianceTypeEnum.RECORDINGEQUIPMENT +speaker = IfcAudioVisualApplianceTypeEnum.SPEAKER +switcher = IfcAudioVisualApplianceTypeEnum.SWITCHER +telephone = IfcAudioVisualApplianceTypeEnum.TELEPHONE +tuner = IfcAudioVisualApplianceTypeEnum.TUNER +userdefined = IfcAudioVisualApplianceTypeEnum.USERDEFINED +notdefined = IfcAudioVisualApplianceTypeEnum.NOTDEFINED IfcBSplineCurveForm = enum_namespace() -circular_arc = express_getattr(IfcBSplineCurveForm, 'CIRCULAR_ARC', INDETERMINATE) -elliptic_arc = express_getattr(IfcBSplineCurveForm, 'ELLIPTIC_ARC', INDETERMINATE) -hyperbolic_arc = express_getattr(IfcBSplineCurveForm, 'HYPERBOLIC_ARC', INDETERMINATE) -parabolic_arc = express_getattr(IfcBSplineCurveForm, 'PARABOLIC_ARC', INDETERMINATE) -polyline_form = express_getattr(IfcBSplineCurveForm, 'POLYLINE_FORM', INDETERMINATE) -unspecified = express_getattr(IfcBSplineCurveForm, 'UNSPECIFIED', INDETERMINATE) +circular_arc = IfcBSplineCurveForm.CIRCULAR_ARC +elliptic_arc = IfcBSplineCurveForm.ELLIPTIC_ARC +hyperbolic_arc = IfcBSplineCurveForm.HYPERBOLIC_ARC +parabolic_arc = IfcBSplineCurveForm.PARABOLIC_ARC +polyline_form = IfcBSplineCurveForm.POLYLINE_FORM +unspecified = IfcBSplineCurveForm.UNSPECIFIED IfcBSplineSurfaceForm = enum_namespace() -conical_surf = express_getattr(IfcBSplineSurfaceForm, 'CONICAL_SURF', INDETERMINATE) -cylindrical_surf = express_getattr(IfcBSplineSurfaceForm, 'CYLINDRICAL_SURF', INDETERMINATE) -generalised_cone = express_getattr(IfcBSplineSurfaceForm, 'GENERALISED_CONE', INDETERMINATE) -plane_surf = express_getattr(IfcBSplineSurfaceForm, 'PLANE_SURF', INDETERMINATE) -quadric_surf = express_getattr(IfcBSplineSurfaceForm, 'QUADRIC_SURF', INDETERMINATE) -ruled_surf = express_getattr(IfcBSplineSurfaceForm, 'RULED_SURF', INDETERMINATE) -spherical_surf = express_getattr(IfcBSplineSurfaceForm, 'SPHERICAL_SURF', INDETERMINATE) -surf_of_linear_extrusion = express_getattr(IfcBSplineSurfaceForm, 'SURF_OF_LINEAR_EXTRUSION', INDETERMINATE) -surf_of_revolution = express_getattr(IfcBSplineSurfaceForm, 'SURF_OF_REVOLUTION', INDETERMINATE) -toroidal_surf = express_getattr(IfcBSplineSurfaceForm, 'TOROIDAL_SURF', INDETERMINATE) -unspecified = express_getattr(IfcBSplineSurfaceForm, 'UNSPECIFIED', INDETERMINATE) +conical_surf = IfcBSplineSurfaceForm.CONICAL_SURF +cylindrical_surf = IfcBSplineSurfaceForm.CYLINDRICAL_SURF +generalised_cone = IfcBSplineSurfaceForm.GENERALISED_CONE +plane_surf = IfcBSplineSurfaceForm.PLANE_SURF +quadric_surf = IfcBSplineSurfaceForm.QUADRIC_SURF +ruled_surf = IfcBSplineSurfaceForm.RULED_SURF +spherical_surf = IfcBSplineSurfaceForm.SPHERICAL_SURF +surf_of_linear_extrusion = IfcBSplineSurfaceForm.SURF_OF_LINEAR_EXTRUSION +surf_of_revolution = IfcBSplineSurfaceForm.SURF_OF_REVOLUTION +toroidal_surf = IfcBSplineSurfaceForm.TOROIDAL_SURF +unspecified = IfcBSplineSurfaceForm.UNSPECIFIED IfcBeamTypeEnum = enum_namespace() -beam = express_getattr(IfcBeamTypeEnum, 'BEAM', INDETERMINATE) -cornice = express_getattr(IfcBeamTypeEnum, 'CORNICE', INDETERMINATE) -diaphragm = express_getattr(IfcBeamTypeEnum, 'DIAPHRAGM', INDETERMINATE) -edgebeam = express_getattr(IfcBeamTypeEnum, 'EDGEBEAM', INDETERMINATE) -girder_segment = express_getattr(IfcBeamTypeEnum, 'GIRDER_SEGMENT', INDETERMINATE) -hatstone = express_getattr(IfcBeamTypeEnum, 'HATSTONE', INDETERMINATE) -hollowcore = express_getattr(IfcBeamTypeEnum, 'HOLLOWCORE', INDETERMINATE) -joist = express_getattr(IfcBeamTypeEnum, 'JOIST', INDETERMINATE) -lintel = express_getattr(IfcBeamTypeEnum, 'LINTEL', INDETERMINATE) -piercap = express_getattr(IfcBeamTypeEnum, 'PIERCAP', INDETERMINATE) -spandrel = express_getattr(IfcBeamTypeEnum, 'SPANDREL', INDETERMINATE) -t_beam = express_getattr(IfcBeamTypeEnum, 'T_BEAM', INDETERMINATE) -userdefined = express_getattr(IfcBeamTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBeamTypeEnum, 'NOTDEFINED', INDETERMINATE) +beam = IfcBeamTypeEnum.BEAM +cornice = IfcBeamTypeEnum.CORNICE +diaphragm = IfcBeamTypeEnum.DIAPHRAGM +edgebeam = IfcBeamTypeEnum.EDGEBEAM +girder_segment = IfcBeamTypeEnum.GIRDER_SEGMENT +hatstone = IfcBeamTypeEnum.HATSTONE +hollowcore = IfcBeamTypeEnum.HOLLOWCORE +joist = IfcBeamTypeEnum.JOIST +lintel = IfcBeamTypeEnum.LINTEL +piercap = IfcBeamTypeEnum.PIERCAP +spandrel = IfcBeamTypeEnum.SPANDREL +t_beam = IfcBeamTypeEnum.T_BEAM +userdefined = IfcBeamTypeEnum.USERDEFINED +notdefined = IfcBeamTypeEnum.NOTDEFINED IfcBearingTypeEnum = enum_namespace() -cylindrical = express_getattr(IfcBearingTypeEnum, 'CYLINDRICAL', INDETERMINATE) -disk = express_getattr(IfcBearingTypeEnum, 'DISK', INDETERMINATE) -elastomeric = express_getattr(IfcBearingTypeEnum, 'ELASTOMERIC', INDETERMINATE) -guide = express_getattr(IfcBearingTypeEnum, 'GUIDE', INDETERMINATE) -pot = express_getattr(IfcBearingTypeEnum, 'POT', INDETERMINATE) -rocker = express_getattr(IfcBearingTypeEnum, 'ROCKER', INDETERMINATE) -roller = express_getattr(IfcBearingTypeEnum, 'ROLLER', INDETERMINATE) -spherical = express_getattr(IfcBearingTypeEnum, 'SPHERICAL', INDETERMINATE) -userdefined = express_getattr(IfcBearingTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBearingTypeEnum, 'NOTDEFINED', INDETERMINATE) +cylindrical = IfcBearingTypeEnum.CYLINDRICAL +disk = IfcBearingTypeEnum.DISK +elastomeric = IfcBearingTypeEnum.ELASTOMERIC +guide = IfcBearingTypeEnum.GUIDE +pot = IfcBearingTypeEnum.POT +rocker = IfcBearingTypeEnum.ROCKER +roller = IfcBearingTypeEnum.ROLLER +spherical = IfcBearingTypeEnum.SPHERICAL +userdefined = IfcBearingTypeEnum.USERDEFINED +notdefined = IfcBearingTypeEnum.NOTDEFINED IfcBenchmarkEnum = enum_namespace() -equalto = express_getattr(IfcBenchmarkEnum, 'EQUALTO', INDETERMINATE) -greaterthan = express_getattr(IfcBenchmarkEnum, 'GREATERTHAN', INDETERMINATE) -greaterthanorequalto = express_getattr(IfcBenchmarkEnum, 'GREATERTHANOREQUALTO', INDETERMINATE) -includedin = express_getattr(IfcBenchmarkEnum, 'INCLUDEDIN', INDETERMINATE) -includes = express_getattr(IfcBenchmarkEnum, 'INCLUDES', INDETERMINATE) -lessthan = express_getattr(IfcBenchmarkEnum, 'LESSTHAN', INDETERMINATE) -lessthanorequalto = express_getattr(IfcBenchmarkEnum, 'LESSTHANOREQUALTO', INDETERMINATE) -notequalto = express_getattr(IfcBenchmarkEnum, 'NOTEQUALTO', INDETERMINATE) -notincludedin = express_getattr(IfcBenchmarkEnum, 'NOTINCLUDEDIN', INDETERMINATE) -notincludes = express_getattr(IfcBenchmarkEnum, 'NOTINCLUDES', INDETERMINATE) +equalto = IfcBenchmarkEnum.EQUALTO +greaterthan = IfcBenchmarkEnum.GREATERTHAN +greaterthanorequalto = IfcBenchmarkEnum.GREATERTHANOREQUALTO +includedin = IfcBenchmarkEnum.INCLUDEDIN +includes = IfcBenchmarkEnum.INCLUDES +lessthan = IfcBenchmarkEnum.LESSTHAN +lessthanorequalto = IfcBenchmarkEnum.LESSTHANOREQUALTO +notequalto = IfcBenchmarkEnum.NOTEQUALTO +notincludedin = IfcBenchmarkEnum.NOTINCLUDEDIN +notincludes = IfcBenchmarkEnum.NOTINCLUDES IfcBoilerTypeEnum = enum_namespace() -steam = express_getattr(IfcBoilerTypeEnum, 'STEAM', INDETERMINATE) -water = express_getattr(IfcBoilerTypeEnum, 'WATER', INDETERMINATE) -userdefined = express_getattr(IfcBoilerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBoilerTypeEnum, 'NOTDEFINED', INDETERMINATE) +steam = IfcBoilerTypeEnum.STEAM +water = IfcBoilerTypeEnum.WATER +userdefined = IfcBoilerTypeEnum.USERDEFINED +notdefined = IfcBoilerTypeEnum.NOTDEFINED IfcBooleanOperator = enum_namespace() -difference = express_getattr(IfcBooleanOperator, 'DIFFERENCE', INDETERMINATE) -intersection = express_getattr(IfcBooleanOperator, 'INTERSECTION', INDETERMINATE) -union = express_getattr(IfcBooleanOperator, 'UNION', INDETERMINATE) +difference = IfcBooleanOperator.DIFFERENCE +intersection = IfcBooleanOperator.INTERSECTION +union = IfcBooleanOperator.UNION IfcBridgePartTypeEnum = enum_namespace() -abutment = express_getattr(IfcBridgePartTypeEnum, 'ABUTMENT', INDETERMINATE) -deck = express_getattr(IfcBridgePartTypeEnum, 'DECK', INDETERMINATE) -deck_segment = express_getattr(IfcBridgePartTypeEnum, 'DECK_SEGMENT', INDETERMINATE) -foundation = express_getattr(IfcBridgePartTypeEnum, 'FOUNDATION', INDETERMINATE) -pier = express_getattr(IfcBridgePartTypeEnum, 'PIER', INDETERMINATE) -pier_segment = express_getattr(IfcBridgePartTypeEnum, 'PIER_SEGMENT', INDETERMINATE) -pylon = express_getattr(IfcBridgePartTypeEnum, 'PYLON', INDETERMINATE) -substructure = express_getattr(IfcBridgePartTypeEnum, 'SUBSTRUCTURE', INDETERMINATE) -superstructure = express_getattr(IfcBridgePartTypeEnum, 'SUPERSTRUCTURE', INDETERMINATE) -surfacestructure = express_getattr(IfcBridgePartTypeEnum, 'SURFACESTRUCTURE', INDETERMINATE) -userdefined = express_getattr(IfcBridgePartTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBridgePartTypeEnum, 'NOTDEFINED', INDETERMINATE) +abutment = IfcBridgePartTypeEnum.ABUTMENT +deck = IfcBridgePartTypeEnum.DECK +deck_segment = IfcBridgePartTypeEnum.DECK_SEGMENT +foundation = IfcBridgePartTypeEnum.FOUNDATION +pier = IfcBridgePartTypeEnum.PIER +pier_segment = IfcBridgePartTypeEnum.PIER_SEGMENT +pylon = IfcBridgePartTypeEnum.PYLON +substructure = IfcBridgePartTypeEnum.SUBSTRUCTURE +superstructure = IfcBridgePartTypeEnum.SUPERSTRUCTURE +surfacestructure = IfcBridgePartTypeEnum.SURFACESTRUCTURE +userdefined = IfcBridgePartTypeEnum.USERDEFINED +notdefined = IfcBridgePartTypeEnum.NOTDEFINED IfcBridgeTypeEnum = enum_namespace() -arched = express_getattr(IfcBridgeTypeEnum, 'ARCHED', INDETERMINATE) -cable_stayed = express_getattr(IfcBridgeTypeEnum, 'CABLE_STAYED', INDETERMINATE) -cantilever = express_getattr(IfcBridgeTypeEnum, 'CANTILEVER', INDETERMINATE) -culvert = express_getattr(IfcBridgeTypeEnum, 'CULVERT', INDETERMINATE) -framework = express_getattr(IfcBridgeTypeEnum, 'FRAMEWORK', INDETERMINATE) -girder = express_getattr(IfcBridgeTypeEnum, 'GIRDER', INDETERMINATE) -suspension = express_getattr(IfcBridgeTypeEnum, 'SUSPENSION', INDETERMINATE) -truss = express_getattr(IfcBridgeTypeEnum, 'TRUSS', INDETERMINATE) -userdefined = express_getattr(IfcBridgeTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBridgeTypeEnum, 'NOTDEFINED', INDETERMINATE) +arched = IfcBridgeTypeEnum.ARCHED +cable_stayed = IfcBridgeTypeEnum.CABLE_STAYED +cantilever = IfcBridgeTypeEnum.CANTILEVER +culvert = IfcBridgeTypeEnum.CULVERT +framework = IfcBridgeTypeEnum.FRAMEWORK +girder = IfcBridgeTypeEnum.GIRDER +suspension = IfcBridgeTypeEnum.SUSPENSION +truss = IfcBridgeTypeEnum.TRUSS +userdefined = IfcBridgeTypeEnum.USERDEFINED +notdefined = IfcBridgeTypeEnum.NOTDEFINED IfcBuildingElementPartTypeEnum = enum_namespace() -apron = express_getattr(IfcBuildingElementPartTypeEnum, 'APRON', INDETERMINATE) -armourunit = express_getattr(IfcBuildingElementPartTypeEnum, 'ARMOURUNIT', INDETERMINATE) -insulation = express_getattr(IfcBuildingElementPartTypeEnum, 'INSULATION', INDETERMINATE) -precastpanel = express_getattr(IfcBuildingElementPartTypeEnum, 'PRECASTPANEL', INDETERMINATE) -safetycage = express_getattr(IfcBuildingElementPartTypeEnum, 'SAFETYCAGE', INDETERMINATE) -userdefined = express_getattr(IfcBuildingElementPartTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBuildingElementPartTypeEnum, 'NOTDEFINED', INDETERMINATE) +apron = IfcBuildingElementPartTypeEnum.APRON +armourunit = IfcBuildingElementPartTypeEnum.ARMOURUNIT +insulation = IfcBuildingElementPartTypeEnum.INSULATION +precastpanel = IfcBuildingElementPartTypeEnum.PRECASTPANEL +safetycage = IfcBuildingElementPartTypeEnum.SAFETYCAGE +userdefined = IfcBuildingElementPartTypeEnum.USERDEFINED +notdefined = IfcBuildingElementPartTypeEnum.NOTDEFINED IfcBuildingElementProxyTypeEnum = enum_namespace() -complex = express_getattr(IfcBuildingElementProxyTypeEnum, 'COMPLEX', INDETERMINATE) -element = express_getattr(IfcBuildingElementProxyTypeEnum, 'ELEMENT', INDETERMINATE) -partial = express_getattr(IfcBuildingElementProxyTypeEnum, 'PARTIAL', INDETERMINATE) -provisionforspace = express_getattr(IfcBuildingElementProxyTypeEnum, 'PROVISIONFORSPACE', INDETERMINATE) -provisionforvoid = express_getattr(IfcBuildingElementProxyTypeEnum, 'PROVISIONFORVOID', INDETERMINATE) -userdefined = express_getattr(IfcBuildingElementProxyTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBuildingElementProxyTypeEnum, 'NOTDEFINED', INDETERMINATE) +complex = IfcBuildingElementProxyTypeEnum.COMPLEX +element = IfcBuildingElementProxyTypeEnum.ELEMENT +partial = IfcBuildingElementProxyTypeEnum.PARTIAL +provisionforspace = IfcBuildingElementProxyTypeEnum.PROVISIONFORSPACE +provisionforvoid = IfcBuildingElementProxyTypeEnum.PROVISIONFORVOID +userdefined = IfcBuildingElementProxyTypeEnum.USERDEFINED +notdefined = IfcBuildingElementProxyTypeEnum.NOTDEFINED IfcBuildingSystemTypeEnum = enum_namespace() -fenestration = express_getattr(IfcBuildingSystemTypeEnum, 'FENESTRATION', INDETERMINATE) -foundation = express_getattr(IfcBuildingSystemTypeEnum, 'FOUNDATION', INDETERMINATE) -loadbearing = express_getattr(IfcBuildingSystemTypeEnum, 'LOADBEARING', INDETERMINATE) -outershell = express_getattr(IfcBuildingSystemTypeEnum, 'OUTERSHELL', INDETERMINATE) -shading = express_getattr(IfcBuildingSystemTypeEnum, 'SHADING', INDETERMINATE) -transport = express_getattr(IfcBuildingSystemTypeEnum, 'TRANSPORT', INDETERMINATE) -userdefined = express_getattr(IfcBuildingSystemTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBuildingSystemTypeEnum, 'NOTDEFINED', INDETERMINATE) +fenestration = IfcBuildingSystemTypeEnum.FENESTRATION +foundation = IfcBuildingSystemTypeEnum.FOUNDATION +loadbearing = IfcBuildingSystemTypeEnum.LOADBEARING +outershell = IfcBuildingSystemTypeEnum.OUTERSHELL +shading = IfcBuildingSystemTypeEnum.SHADING +transport = IfcBuildingSystemTypeEnum.TRANSPORT +userdefined = IfcBuildingSystemTypeEnum.USERDEFINED +notdefined = IfcBuildingSystemTypeEnum.NOTDEFINED IfcBuiltSystemTypeEnum = enum_namespace() -erosionprevention = express_getattr(IfcBuiltSystemTypeEnum, 'EROSIONPREVENTION', INDETERMINATE) -fenestration = express_getattr(IfcBuiltSystemTypeEnum, 'FENESTRATION', INDETERMINATE) -foundation = express_getattr(IfcBuiltSystemTypeEnum, 'FOUNDATION', INDETERMINATE) -loadbearing = express_getattr(IfcBuiltSystemTypeEnum, 'LOADBEARING', INDETERMINATE) -mooring = express_getattr(IfcBuiltSystemTypeEnum, 'MOORING', INDETERMINATE) -outershell = express_getattr(IfcBuiltSystemTypeEnum, 'OUTERSHELL', INDETERMINATE) -prestressing = express_getattr(IfcBuiltSystemTypeEnum, 'PRESTRESSING', INDETERMINATE) -railwayline = express_getattr(IfcBuiltSystemTypeEnum, 'RAILWAYLINE', INDETERMINATE) -railwaytrack = express_getattr(IfcBuiltSystemTypeEnum, 'RAILWAYTRACK', INDETERMINATE) -reinforcing = express_getattr(IfcBuiltSystemTypeEnum, 'REINFORCING', INDETERMINATE) -shading = express_getattr(IfcBuiltSystemTypeEnum, 'SHADING', INDETERMINATE) -trackcircuit = express_getattr(IfcBuiltSystemTypeEnum, 'TRACKCIRCUIT', INDETERMINATE) -transport = express_getattr(IfcBuiltSystemTypeEnum, 'TRANSPORT', INDETERMINATE) -userdefined = express_getattr(IfcBuiltSystemTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBuiltSystemTypeEnum, 'NOTDEFINED', INDETERMINATE) +erosionprevention = IfcBuiltSystemTypeEnum.EROSIONPREVENTION +fenestration = IfcBuiltSystemTypeEnum.FENESTRATION +foundation = IfcBuiltSystemTypeEnum.FOUNDATION +loadbearing = IfcBuiltSystemTypeEnum.LOADBEARING +mooring = IfcBuiltSystemTypeEnum.MOORING +outershell = IfcBuiltSystemTypeEnum.OUTERSHELL +prestressing = IfcBuiltSystemTypeEnum.PRESTRESSING +railwayline = IfcBuiltSystemTypeEnum.RAILWAYLINE +railwaytrack = IfcBuiltSystemTypeEnum.RAILWAYTRACK +reinforcing = IfcBuiltSystemTypeEnum.REINFORCING +shading = IfcBuiltSystemTypeEnum.SHADING +trackcircuit = IfcBuiltSystemTypeEnum.TRACKCIRCUIT +transport = IfcBuiltSystemTypeEnum.TRANSPORT +userdefined = IfcBuiltSystemTypeEnum.USERDEFINED +notdefined = IfcBuiltSystemTypeEnum.NOTDEFINED IfcBurnerTypeEnum = enum_namespace() -userdefined = express_getattr(IfcBurnerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBurnerTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcBurnerTypeEnum.USERDEFINED +notdefined = IfcBurnerTypeEnum.NOTDEFINED IfcCableCarrierFittingTypeEnum = enum_namespace() -bend = express_getattr(IfcCableCarrierFittingTypeEnum, 'BEND', INDETERMINATE) -connector = express_getattr(IfcCableCarrierFittingTypeEnum, 'CONNECTOR', INDETERMINATE) -cross = express_getattr(IfcCableCarrierFittingTypeEnum, 'CROSS', INDETERMINATE) -junction = express_getattr(IfcCableCarrierFittingTypeEnum, 'JUNCTION', INDETERMINATE) -reducer = express_getattr(IfcCableCarrierFittingTypeEnum, 'REDUCER', INDETERMINATE) -tee = express_getattr(IfcCableCarrierFittingTypeEnum, 'TEE', INDETERMINATE) -transition = express_getattr(IfcCableCarrierFittingTypeEnum, 'TRANSITION', INDETERMINATE) -userdefined = express_getattr(IfcCableCarrierFittingTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCableCarrierFittingTypeEnum, 'NOTDEFINED', INDETERMINATE) +bend = IfcCableCarrierFittingTypeEnum.BEND +connector = IfcCableCarrierFittingTypeEnum.CONNECTOR +cross = IfcCableCarrierFittingTypeEnum.CROSS +junction = IfcCableCarrierFittingTypeEnum.JUNCTION +reducer = IfcCableCarrierFittingTypeEnum.REDUCER +tee = IfcCableCarrierFittingTypeEnum.TEE +transition = IfcCableCarrierFittingTypeEnum.TRANSITION +userdefined = IfcCableCarrierFittingTypeEnum.USERDEFINED +notdefined = IfcCableCarrierFittingTypeEnum.NOTDEFINED IfcCableCarrierSegmentTypeEnum = enum_namespace() -cablebracket = express_getattr(IfcCableCarrierSegmentTypeEnum, 'CABLEBRACKET', INDETERMINATE) -cableladdersegment = express_getattr(IfcCableCarrierSegmentTypeEnum, 'CABLELADDERSEGMENT', INDETERMINATE) -cabletraysegment = express_getattr(IfcCableCarrierSegmentTypeEnum, 'CABLETRAYSEGMENT', INDETERMINATE) -cabletrunkingsegment = express_getattr(IfcCableCarrierSegmentTypeEnum, 'CABLETRUNKINGSEGMENT', INDETERMINATE) -catenarywire = express_getattr(IfcCableCarrierSegmentTypeEnum, 'CATENARYWIRE', INDETERMINATE) -conduitsegment = express_getattr(IfcCableCarrierSegmentTypeEnum, 'CONDUITSEGMENT', INDETERMINATE) -dropper = express_getattr(IfcCableCarrierSegmentTypeEnum, 'DROPPER', INDETERMINATE) -userdefined = express_getattr(IfcCableCarrierSegmentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCableCarrierSegmentTypeEnum, 'NOTDEFINED', INDETERMINATE) +cablebracket = IfcCableCarrierSegmentTypeEnum.CABLEBRACKET +cableladdersegment = IfcCableCarrierSegmentTypeEnum.CABLELADDERSEGMENT +cabletraysegment = IfcCableCarrierSegmentTypeEnum.CABLETRAYSEGMENT +cabletrunkingsegment = IfcCableCarrierSegmentTypeEnum.CABLETRUNKINGSEGMENT +catenarywire = IfcCableCarrierSegmentTypeEnum.CATENARYWIRE +conduitsegment = IfcCableCarrierSegmentTypeEnum.CONDUITSEGMENT +dropper = IfcCableCarrierSegmentTypeEnum.DROPPER +userdefined = IfcCableCarrierSegmentTypeEnum.USERDEFINED +notdefined = IfcCableCarrierSegmentTypeEnum.NOTDEFINED IfcCableFittingTypeEnum = enum_namespace() -connector = express_getattr(IfcCableFittingTypeEnum, 'CONNECTOR', INDETERMINATE) -entry = express_getattr(IfcCableFittingTypeEnum, 'ENTRY', INDETERMINATE) -exit = express_getattr(IfcCableFittingTypeEnum, 'EXIT', INDETERMINATE) -fanout = express_getattr(IfcCableFittingTypeEnum, 'FANOUT', INDETERMINATE) -junction = express_getattr(IfcCableFittingTypeEnum, 'JUNCTION', INDETERMINATE) -transition = express_getattr(IfcCableFittingTypeEnum, 'TRANSITION', INDETERMINATE) -userdefined = express_getattr(IfcCableFittingTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCableFittingTypeEnum, 'NOTDEFINED', INDETERMINATE) +connector = IfcCableFittingTypeEnum.CONNECTOR +entry = IfcCableFittingTypeEnum.ENTRY +exit = IfcCableFittingTypeEnum.EXIT +fanout = IfcCableFittingTypeEnum.FANOUT +junction = IfcCableFittingTypeEnum.JUNCTION +transition = IfcCableFittingTypeEnum.TRANSITION +userdefined = IfcCableFittingTypeEnum.USERDEFINED +notdefined = IfcCableFittingTypeEnum.NOTDEFINED IfcCableSegmentTypeEnum = enum_namespace() -busbarsegment = express_getattr(IfcCableSegmentTypeEnum, 'BUSBARSEGMENT', INDETERMINATE) -cablesegment = express_getattr(IfcCableSegmentTypeEnum, 'CABLESEGMENT', INDETERMINATE) -conductorsegment = express_getattr(IfcCableSegmentTypeEnum, 'CONDUCTORSEGMENT', INDETERMINATE) -contactwiresegment = express_getattr(IfcCableSegmentTypeEnum, 'CONTACTWIRESEGMENT', INDETERMINATE) -coresegment = express_getattr(IfcCableSegmentTypeEnum, 'CORESEGMENT', INDETERMINATE) -fibersegment = express_getattr(IfcCableSegmentTypeEnum, 'FIBERSEGMENT', INDETERMINATE) -fibertube = express_getattr(IfcCableSegmentTypeEnum, 'FIBERTUBE', INDETERMINATE) -opticalcablesegment = express_getattr(IfcCableSegmentTypeEnum, 'OPTICALCABLESEGMENT', INDETERMINATE) -stitchwire = express_getattr(IfcCableSegmentTypeEnum, 'STITCHWIRE', INDETERMINATE) -wirepairsegment = express_getattr(IfcCableSegmentTypeEnum, 'WIREPAIRSEGMENT', INDETERMINATE) -userdefined = express_getattr(IfcCableSegmentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCableSegmentTypeEnum, 'NOTDEFINED', INDETERMINATE) +busbarsegment = IfcCableSegmentTypeEnum.BUSBARSEGMENT +cablesegment = IfcCableSegmentTypeEnum.CABLESEGMENT +conductorsegment = IfcCableSegmentTypeEnum.CONDUCTORSEGMENT +contactwiresegment = IfcCableSegmentTypeEnum.CONTACTWIRESEGMENT +coresegment = IfcCableSegmentTypeEnum.CORESEGMENT +fibersegment = IfcCableSegmentTypeEnum.FIBERSEGMENT +fibertube = IfcCableSegmentTypeEnum.FIBERTUBE +opticalcablesegment = IfcCableSegmentTypeEnum.OPTICALCABLESEGMENT +stitchwire = IfcCableSegmentTypeEnum.STITCHWIRE +wirepairsegment = IfcCableSegmentTypeEnum.WIREPAIRSEGMENT +userdefined = IfcCableSegmentTypeEnum.USERDEFINED +notdefined = IfcCableSegmentTypeEnum.NOTDEFINED IfcCaissonFoundationTypeEnum = enum_namespace() -caisson = express_getattr(IfcCaissonFoundationTypeEnum, 'CAISSON', INDETERMINATE) -well = express_getattr(IfcCaissonFoundationTypeEnum, 'WELL', INDETERMINATE) -userdefined = express_getattr(IfcCaissonFoundationTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCaissonFoundationTypeEnum, 'NOTDEFINED', INDETERMINATE) +caisson = IfcCaissonFoundationTypeEnum.CAISSON +well = IfcCaissonFoundationTypeEnum.WELL +userdefined = IfcCaissonFoundationTypeEnum.USERDEFINED +notdefined = IfcCaissonFoundationTypeEnum.NOTDEFINED IfcChangeActionEnum = enum_namespace() -added = express_getattr(IfcChangeActionEnum, 'ADDED', INDETERMINATE) -deleted = express_getattr(IfcChangeActionEnum, 'DELETED', INDETERMINATE) -modified = express_getattr(IfcChangeActionEnum, 'MODIFIED', INDETERMINATE) -nochange = express_getattr(IfcChangeActionEnum, 'NOCHANGE', INDETERMINATE) -notdefined = express_getattr(IfcChangeActionEnum, 'NOTDEFINED', INDETERMINATE) +added = IfcChangeActionEnum.ADDED +deleted = IfcChangeActionEnum.DELETED +modified = IfcChangeActionEnum.MODIFIED +nochange = IfcChangeActionEnum.NOCHANGE +notdefined = IfcChangeActionEnum.NOTDEFINED IfcChillerTypeEnum = enum_namespace() -aircooled = express_getattr(IfcChillerTypeEnum, 'AIRCOOLED', INDETERMINATE) -heatrecovery = express_getattr(IfcChillerTypeEnum, 'HEATRECOVERY', INDETERMINATE) -watercooled = express_getattr(IfcChillerTypeEnum, 'WATERCOOLED', INDETERMINATE) -userdefined = express_getattr(IfcChillerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcChillerTypeEnum, 'NOTDEFINED', INDETERMINATE) +aircooled = IfcChillerTypeEnum.AIRCOOLED +heatrecovery = IfcChillerTypeEnum.HEATRECOVERY +watercooled = IfcChillerTypeEnum.WATERCOOLED +userdefined = IfcChillerTypeEnum.USERDEFINED +notdefined = IfcChillerTypeEnum.NOTDEFINED IfcChimneyTypeEnum = enum_namespace() -userdefined = express_getattr(IfcChimneyTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcChimneyTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcChimneyTypeEnum.USERDEFINED +notdefined = IfcChimneyTypeEnum.NOTDEFINED IfcCoilTypeEnum = enum_namespace() -dxcoolingcoil = express_getattr(IfcCoilTypeEnum, 'DXCOOLINGCOIL', INDETERMINATE) -electricheatingcoil = express_getattr(IfcCoilTypeEnum, 'ELECTRICHEATINGCOIL', INDETERMINATE) -gasheatingcoil = express_getattr(IfcCoilTypeEnum, 'GASHEATINGCOIL', INDETERMINATE) -hydroniccoil = express_getattr(IfcCoilTypeEnum, 'HYDRONICCOIL', INDETERMINATE) -steamheatingcoil = express_getattr(IfcCoilTypeEnum, 'STEAMHEATINGCOIL', INDETERMINATE) -watercoolingcoil = express_getattr(IfcCoilTypeEnum, 'WATERCOOLINGCOIL', INDETERMINATE) -waterheatingcoil = express_getattr(IfcCoilTypeEnum, 'WATERHEATINGCOIL', INDETERMINATE) -userdefined = express_getattr(IfcCoilTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCoilTypeEnum, 'NOTDEFINED', INDETERMINATE) +dxcoolingcoil = IfcCoilTypeEnum.DXCOOLINGCOIL +electricheatingcoil = IfcCoilTypeEnum.ELECTRICHEATINGCOIL +gasheatingcoil = IfcCoilTypeEnum.GASHEATINGCOIL +hydroniccoil = IfcCoilTypeEnum.HYDRONICCOIL +steamheatingcoil = IfcCoilTypeEnum.STEAMHEATINGCOIL +watercoolingcoil = IfcCoilTypeEnum.WATERCOOLINGCOIL +waterheatingcoil = IfcCoilTypeEnum.WATERHEATINGCOIL +userdefined = IfcCoilTypeEnum.USERDEFINED +notdefined = IfcCoilTypeEnum.NOTDEFINED IfcColumnTypeEnum = enum_namespace() -column = express_getattr(IfcColumnTypeEnum, 'COLUMN', INDETERMINATE) -pierstem = express_getattr(IfcColumnTypeEnum, 'PIERSTEM', INDETERMINATE) -pierstem_segment = express_getattr(IfcColumnTypeEnum, 'PIERSTEM_SEGMENT', INDETERMINATE) -pilaster = express_getattr(IfcColumnTypeEnum, 'PILASTER', INDETERMINATE) -standcolumn = express_getattr(IfcColumnTypeEnum, 'STANDCOLUMN', INDETERMINATE) -userdefined = express_getattr(IfcColumnTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcColumnTypeEnum, 'NOTDEFINED', INDETERMINATE) +column = IfcColumnTypeEnum.COLUMN +pierstem = IfcColumnTypeEnum.PIERSTEM +pierstem_segment = IfcColumnTypeEnum.PIERSTEM_SEGMENT +pilaster = IfcColumnTypeEnum.PILASTER +standcolumn = IfcColumnTypeEnum.STANDCOLUMN +userdefined = IfcColumnTypeEnum.USERDEFINED +notdefined = IfcColumnTypeEnum.NOTDEFINED IfcCommunicationsApplianceTypeEnum = enum_namespace() -antenna = express_getattr(IfcCommunicationsApplianceTypeEnum, 'ANTENNA', INDETERMINATE) -automaton = express_getattr(IfcCommunicationsApplianceTypeEnum, 'AUTOMATON', INDETERMINATE) -computer = express_getattr(IfcCommunicationsApplianceTypeEnum, 'COMPUTER', INDETERMINATE) -fax = express_getattr(IfcCommunicationsApplianceTypeEnum, 'FAX', INDETERMINATE) -gateway = express_getattr(IfcCommunicationsApplianceTypeEnum, 'GATEWAY', INDETERMINATE) -intelligentperipheral = express_getattr(IfcCommunicationsApplianceTypeEnum, 'INTELLIGENTPERIPHERAL', INDETERMINATE) -ipnetworkequipment = express_getattr(IfcCommunicationsApplianceTypeEnum, 'IPNETWORKEQUIPMENT', INDETERMINATE) -linesideelectronicunit = express_getattr(IfcCommunicationsApplianceTypeEnum, 'LINESIDEELECTRONICUNIT', INDETERMINATE) -modem = express_getattr(IfcCommunicationsApplianceTypeEnum, 'MODEM', INDETERMINATE) -networkappliance = express_getattr(IfcCommunicationsApplianceTypeEnum, 'NETWORKAPPLIANCE', INDETERMINATE) -networkbridge = express_getattr(IfcCommunicationsApplianceTypeEnum, 'NETWORKBRIDGE', INDETERMINATE) -networkhub = express_getattr(IfcCommunicationsApplianceTypeEnum, 'NETWORKHUB', INDETERMINATE) -opticallineterminal = express_getattr(IfcCommunicationsApplianceTypeEnum, 'OPTICALLINETERMINAL', INDETERMINATE) -opticalnetworkunit = express_getattr(IfcCommunicationsApplianceTypeEnum, 'OPTICALNETWORKUNIT', INDETERMINATE) -printer = express_getattr(IfcCommunicationsApplianceTypeEnum, 'PRINTER', INDETERMINATE) -radioblockcenter = express_getattr(IfcCommunicationsApplianceTypeEnum, 'RADIOBLOCKCENTER', INDETERMINATE) -repeater = express_getattr(IfcCommunicationsApplianceTypeEnum, 'REPEATER', INDETERMINATE) -router = express_getattr(IfcCommunicationsApplianceTypeEnum, 'ROUTER', INDETERMINATE) -scanner = express_getattr(IfcCommunicationsApplianceTypeEnum, 'SCANNER', INDETERMINATE) -telecommand = express_getattr(IfcCommunicationsApplianceTypeEnum, 'TELECOMMAND', INDETERMINATE) -telephonyexchange = express_getattr(IfcCommunicationsApplianceTypeEnum, 'TELEPHONYEXCHANGE', INDETERMINATE) -transitioncomponent = express_getattr(IfcCommunicationsApplianceTypeEnum, 'TRANSITIONCOMPONENT', INDETERMINATE) -transponder = express_getattr(IfcCommunicationsApplianceTypeEnum, 'TRANSPONDER', INDETERMINATE) -transportequipment = express_getattr(IfcCommunicationsApplianceTypeEnum, 'TRANSPORTEQUIPMENT', INDETERMINATE) -userdefined = express_getattr(IfcCommunicationsApplianceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCommunicationsApplianceTypeEnum, 'NOTDEFINED', INDETERMINATE) +antenna = IfcCommunicationsApplianceTypeEnum.ANTENNA +automaton = IfcCommunicationsApplianceTypeEnum.AUTOMATON +computer = IfcCommunicationsApplianceTypeEnum.COMPUTER +fax = IfcCommunicationsApplianceTypeEnum.FAX +gateway = IfcCommunicationsApplianceTypeEnum.GATEWAY +intelligentperipheral = IfcCommunicationsApplianceTypeEnum.INTELLIGENTPERIPHERAL +ipnetworkequipment = IfcCommunicationsApplianceTypeEnum.IPNETWORKEQUIPMENT +linesideelectronicunit = IfcCommunicationsApplianceTypeEnum.LINESIDEELECTRONICUNIT +modem = IfcCommunicationsApplianceTypeEnum.MODEM +networkappliance = IfcCommunicationsApplianceTypeEnum.NETWORKAPPLIANCE +networkbridge = IfcCommunicationsApplianceTypeEnum.NETWORKBRIDGE +networkhub = IfcCommunicationsApplianceTypeEnum.NETWORKHUB +opticallineterminal = IfcCommunicationsApplianceTypeEnum.OPTICALLINETERMINAL +opticalnetworkunit = IfcCommunicationsApplianceTypeEnum.OPTICALNETWORKUNIT +printer = IfcCommunicationsApplianceTypeEnum.PRINTER +radioblockcenter = IfcCommunicationsApplianceTypeEnum.RADIOBLOCKCENTER +repeater = IfcCommunicationsApplianceTypeEnum.REPEATER +router = IfcCommunicationsApplianceTypeEnum.ROUTER +scanner = IfcCommunicationsApplianceTypeEnum.SCANNER +telecommand = IfcCommunicationsApplianceTypeEnum.TELECOMMAND +telephonyexchange = IfcCommunicationsApplianceTypeEnum.TELEPHONYEXCHANGE +transitioncomponent = IfcCommunicationsApplianceTypeEnum.TRANSITIONCOMPONENT +transponder = IfcCommunicationsApplianceTypeEnum.TRANSPONDER +transportequipment = IfcCommunicationsApplianceTypeEnum.TRANSPORTEQUIPMENT +userdefined = IfcCommunicationsApplianceTypeEnum.USERDEFINED +notdefined = IfcCommunicationsApplianceTypeEnum.NOTDEFINED IfcComplexPropertyTemplateTypeEnum = enum_namespace() -p_complex = express_getattr(IfcComplexPropertyTemplateTypeEnum, 'P_COMPLEX', INDETERMINATE) -q_complex = express_getattr(IfcComplexPropertyTemplateTypeEnum, 'Q_COMPLEX', INDETERMINATE) +p_complex = IfcComplexPropertyTemplateTypeEnum.P_COMPLEX +q_complex = IfcComplexPropertyTemplateTypeEnum.Q_COMPLEX IfcCompressorTypeEnum = enum_namespace() -booster = express_getattr(IfcCompressorTypeEnum, 'BOOSTER', INDETERMINATE) -dynamic = express_getattr(IfcCompressorTypeEnum, 'DYNAMIC', INDETERMINATE) -hermetic = express_getattr(IfcCompressorTypeEnum, 'HERMETIC', INDETERMINATE) -opentype = express_getattr(IfcCompressorTypeEnum, 'OPENTYPE', INDETERMINATE) -reciprocating = express_getattr(IfcCompressorTypeEnum, 'RECIPROCATING', INDETERMINATE) -rollingpiston = express_getattr(IfcCompressorTypeEnum, 'ROLLINGPISTON', INDETERMINATE) -rotary = express_getattr(IfcCompressorTypeEnum, 'ROTARY', INDETERMINATE) -rotaryvane = express_getattr(IfcCompressorTypeEnum, 'ROTARYVANE', INDETERMINATE) -scroll = express_getattr(IfcCompressorTypeEnum, 'SCROLL', INDETERMINATE) -semihermetic = express_getattr(IfcCompressorTypeEnum, 'SEMIHERMETIC', INDETERMINATE) -singlescrew = express_getattr(IfcCompressorTypeEnum, 'SINGLESCREW', INDETERMINATE) -singlestage = express_getattr(IfcCompressorTypeEnum, 'SINGLESTAGE', INDETERMINATE) -trochoidal = express_getattr(IfcCompressorTypeEnum, 'TROCHOIDAL', INDETERMINATE) -twinscrew = express_getattr(IfcCompressorTypeEnum, 'TWINSCREW', INDETERMINATE) -weldedshellhermetic = express_getattr(IfcCompressorTypeEnum, 'WELDEDSHELLHERMETIC', INDETERMINATE) -userdefined = express_getattr(IfcCompressorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCompressorTypeEnum, 'NOTDEFINED', INDETERMINATE) +booster = IfcCompressorTypeEnum.BOOSTER +dynamic = IfcCompressorTypeEnum.DYNAMIC +hermetic = IfcCompressorTypeEnum.HERMETIC +opentype = IfcCompressorTypeEnum.OPENTYPE +reciprocating = IfcCompressorTypeEnum.RECIPROCATING +rollingpiston = IfcCompressorTypeEnum.ROLLINGPISTON +rotary = IfcCompressorTypeEnum.ROTARY +rotaryvane = IfcCompressorTypeEnum.ROTARYVANE +scroll = IfcCompressorTypeEnum.SCROLL +semihermetic = IfcCompressorTypeEnum.SEMIHERMETIC +singlescrew = IfcCompressorTypeEnum.SINGLESCREW +singlestage = IfcCompressorTypeEnum.SINGLESTAGE +trochoidal = IfcCompressorTypeEnum.TROCHOIDAL +twinscrew = IfcCompressorTypeEnum.TWINSCREW +weldedshellhermetic = IfcCompressorTypeEnum.WELDEDSHELLHERMETIC +userdefined = IfcCompressorTypeEnum.USERDEFINED +notdefined = IfcCompressorTypeEnum.NOTDEFINED IfcCondenserTypeEnum = enum_namespace() -aircooled = express_getattr(IfcCondenserTypeEnum, 'AIRCOOLED', INDETERMINATE) -evaporativecooled = express_getattr(IfcCondenserTypeEnum, 'EVAPORATIVECOOLED', INDETERMINATE) -watercooled = express_getattr(IfcCondenserTypeEnum, 'WATERCOOLED', INDETERMINATE) -watercooledbrazedplate = express_getattr(IfcCondenserTypeEnum, 'WATERCOOLEDBRAZEDPLATE', INDETERMINATE) -watercooledshellcoil = express_getattr(IfcCondenserTypeEnum, 'WATERCOOLEDSHELLCOIL', INDETERMINATE) -watercooledshelltube = express_getattr(IfcCondenserTypeEnum, 'WATERCOOLEDSHELLTUBE', INDETERMINATE) -watercooledtubeintube = express_getattr(IfcCondenserTypeEnum, 'WATERCOOLEDTUBEINTUBE', INDETERMINATE) -userdefined = express_getattr(IfcCondenserTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCondenserTypeEnum, 'NOTDEFINED', INDETERMINATE) +aircooled = IfcCondenserTypeEnum.AIRCOOLED +evaporativecooled = IfcCondenserTypeEnum.EVAPORATIVECOOLED +watercooled = IfcCondenserTypeEnum.WATERCOOLED +watercooledbrazedplate = IfcCondenserTypeEnum.WATERCOOLEDBRAZEDPLATE +watercooledshellcoil = IfcCondenserTypeEnum.WATERCOOLEDSHELLCOIL +watercooledshelltube = IfcCondenserTypeEnum.WATERCOOLEDSHELLTUBE +watercooledtubeintube = IfcCondenserTypeEnum.WATERCOOLEDTUBEINTUBE +userdefined = IfcCondenserTypeEnum.USERDEFINED +notdefined = IfcCondenserTypeEnum.NOTDEFINED IfcConnectionTypeEnum = enum_namespace() -atend = express_getattr(IfcConnectionTypeEnum, 'ATEND', INDETERMINATE) -atpath = express_getattr(IfcConnectionTypeEnum, 'ATPATH', INDETERMINATE) -atstart = express_getattr(IfcConnectionTypeEnum, 'ATSTART', INDETERMINATE) -notdefined = express_getattr(IfcConnectionTypeEnum, 'NOTDEFINED', INDETERMINATE) +atend = IfcConnectionTypeEnum.ATEND +atpath = IfcConnectionTypeEnum.ATPATH +atstart = IfcConnectionTypeEnum.ATSTART +notdefined = IfcConnectionTypeEnum.NOTDEFINED IfcConstraintEnum = enum_namespace() -advisory = express_getattr(IfcConstraintEnum, 'ADVISORY', INDETERMINATE) -hard = express_getattr(IfcConstraintEnum, 'HARD', INDETERMINATE) -soft = express_getattr(IfcConstraintEnum, 'SOFT', INDETERMINATE) -userdefined = express_getattr(IfcConstraintEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcConstraintEnum, 'NOTDEFINED', INDETERMINATE) +advisory = IfcConstraintEnum.ADVISORY +hard = IfcConstraintEnum.HARD +soft = IfcConstraintEnum.SOFT +userdefined = IfcConstraintEnum.USERDEFINED +notdefined = IfcConstraintEnum.NOTDEFINED IfcConstructionEquipmentResourceTypeEnum = enum_namespace() -demolishing = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'DEMOLISHING', INDETERMINATE) -earthmoving = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'EARTHMOVING', INDETERMINATE) -erecting = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'ERECTING', INDETERMINATE) -heating = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'HEATING', INDETERMINATE) -lighting = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'LIGHTING', INDETERMINATE) -paving = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'PAVING', INDETERMINATE) -pumping = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'PUMPING', INDETERMINATE) -transporting = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'TRANSPORTING', INDETERMINATE) -userdefined = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'NOTDEFINED', INDETERMINATE) +demolishing = IfcConstructionEquipmentResourceTypeEnum.DEMOLISHING +earthmoving = IfcConstructionEquipmentResourceTypeEnum.EARTHMOVING +erecting = IfcConstructionEquipmentResourceTypeEnum.ERECTING +heating = IfcConstructionEquipmentResourceTypeEnum.HEATING +lighting = IfcConstructionEquipmentResourceTypeEnum.LIGHTING +paving = IfcConstructionEquipmentResourceTypeEnum.PAVING +pumping = IfcConstructionEquipmentResourceTypeEnum.PUMPING +transporting = IfcConstructionEquipmentResourceTypeEnum.TRANSPORTING +userdefined = IfcConstructionEquipmentResourceTypeEnum.USERDEFINED +notdefined = IfcConstructionEquipmentResourceTypeEnum.NOTDEFINED IfcConstructionMaterialResourceTypeEnum = enum_namespace() -aggregates = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'AGGREGATES', INDETERMINATE) -concrete = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'CONCRETE', INDETERMINATE) -drywall = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'DRYWALL', INDETERMINATE) -fuel = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'FUEL', INDETERMINATE) -gypsum = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'GYPSUM', INDETERMINATE) -masonry = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'MASONRY', INDETERMINATE) -metal = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'METAL', INDETERMINATE) -plastic = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'PLASTIC', INDETERMINATE) -wood = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'WOOD', INDETERMINATE) -userdefined = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'NOTDEFINED', INDETERMINATE) +aggregates = IfcConstructionMaterialResourceTypeEnum.AGGREGATES +concrete = IfcConstructionMaterialResourceTypeEnum.CONCRETE +drywall = IfcConstructionMaterialResourceTypeEnum.DRYWALL +fuel = IfcConstructionMaterialResourceTypeEnum.FUEL +gypsum = IfcConstructionMaterialResourceTypeEnum.GYPSUM +masonry = IfcConstructionMaterialResourceTypeEnum.MASONRY +metal = IfcConstructionMaterialResourceTypeEnum.METAL +plastic = IfcConstructionMaterialResourceTypeEnum.PLASTIC +wood = IfcConstructionMaterialResourceTypeEnum.WOOD +userdefined = IfcConstructionMaterialResourceTypeEnum.USERDEFINED +notdefined = IfcConstructionMaterialResourceTypeEnum.NOTDEFINED IfcConstructionProductResourceTypeEnum = enum_namespace() -assembly = express_getattr(IfcConstructionProductResourceTypeEnum, 'ASSEMBLY', INDETERMINATE) -formwork = express_getattr(IfcConstructionProductResourceTypeEnum, 'FORMWORK', INDETERMINATE) -userdefined = express_getattr(IfcConstructionProductResourceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcConstructionProductResourceTypeEnum, 'NOTDEFINED', INDETERMINATE) +assembly = IfcConstructionProductResourceTypeEnum.ASSEMBLY +formwork = IfcConstructionProductResourceTypeEnum.FORMWORK +userdefined = IfcConstructionProductResourceTypeEnum.USERDEFINED +notdefined = IfcConstructionProductResourceTypeEnum.NOTDEFINED IfcControllerTypeEnum = enum_namespace() -floating = express_getattr(IfcControllerTypeEnum, 'FLOATING', INDETERMINATE) -multiposition = express_getattr(IfcControllerTypeEnum, 'MULTIPOSITION', INDETERMINATE) -programmable = express_getattr(IfcControllerTypeEnum, 'PROGRAMMABLE', INDETERMINATE) -proportional = express_getattr(IfcControllerTypeEnum, 'PROPORTIONAL', INDETERMINATE) -twoposition = express_getattr(IfcControllerTypeEnum, 'TWOPOSITION', INDETERMINATE) -userdefined = express_getattr(IfcControllerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcControllerTypeEnum, 'NOTDEFINED', INDETERMINATE) +floating = IfcControllerTypeEnum.FLOATING +multiposition = IfcControllerTypeEnum.MULTIPOSITION +programmable = IfcControllerTypeEnum.PROGRAMMABLE +proportional = IfcControllerTypeEnum.PROPORTIONAL +twoposition = IfcControllerTypeEnum.TWOPOSITION +userdefined = IfcControllerTypeEnum.USERDEFINED +notdefined = IfcControllerTypeEnum.NOTDEFINED IfcConveyorSegmentTypeEnum = enum_namespace() -beltconveyor = express_getattr(IfcConveyorSegmentTypeEnum, 'BELTCONVEYOR', INDETERMINATE) -bucketconveyor = express_getattr(IfcConveyorSegmentTypeEnum, 'BUCKETCONVEYOR', INDETERMINATE) -chuteconveyor = express_getattr(IfcConveyorSegmentTypeEnum, 'CHUTECONVEYOR', INDETERMINATE) -screwconveyor = express_getattr(IfcConveyorSegmentTypeEnum, 'SCREWCONVEYOR', INDETERMINATE) -userdefined = express_getattr(IfcConveyorSegmentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcConveyorSegmentTypeEnum, 'NOTDEFINED', INDETERMINATE) +beltconveyor = IfcConveyorSegmentTypeEnum.BELTCONVEYOR +bucketconveyor = IfcConveyorSegmentTypeEnum.BUCKETCONVEYOR +chuteconveyor = IfcConveyorSegmentTypeEnum.CHUTECONVEYOR +screwconveyor = IfcConveyorSegmentTypeEnum.SCREWCONVEYOR +userdefined = IfcConveyorSegmentTypeEnum.USERDEFINED +notdefined = IfcConveyorSegmentTypeEnum.NOTDEFINED IfcCooledBeamTypeEnum = enum_namespace() -active = express_getattr(IfcCooledBeamTypeEnum, 'ACTIVE', INDETERMINATE) -passive = express_getattr(IfcCooledBeamTypeEnum, 'PASSIVE', INDETERMINATE) -userdefined = express_getattr(IfcCooledBeamTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCooledBeamTypeEnum, 'NOTDEFINED', INDETERMINATE) +active = IfcCooledBeamTypeEnum.ACTIVE +passive = IfcCooledBeamTypeEnum.PASSIVE +userdefined = IfcCooledBeamTypeEnum.USERDEFINED +notdefined = IfcCooledBeamTypeEnum.NOTDEFINED IfcCoolingTowerTypeEnum = enum_namespace() -mechanicalforceddraft = express_getattr(IfcCoolingTowerTypeEnum, 'MECHANICALFORCEDDRAFT', INDETERMINATE) -mechanicalinduceddraft = express_getattr(IfcCoolingTowerTypeEnum, 'MECHANICALINDUCEDDRAFT', INDETERMINATE) -naturaldraft = express_getattr(IfcCoolingTowerTypeEnum, 'NATURALDRAFT', INDETERMINATE) -userdefined = express_getattr(IfcCoolingTowerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCoolingTowerTypeEnum, 'NOTDEFINED', INDETERMINATE) +mechanicalforceddraft = IfcCoolingTowerTypeEnum.MECHANICALFORCEDDRAFT +mechanicalinduceddraft = IfcCoolingTowerTypeEnum.MECHANICALINDUCEDDRAFT +naturaldraft = IfcCoolingTowerTypeEnum.NATURALDRAFT +userdefined = IfcCoolingTowerTypeEnum.USERDEFINED +notdefined = IfcCoolingTowerTypeEnum.NOTDEFINED IfcCostItemTypeEnum = enum_namespace() -userdefined = express_getattr(IfcCostItemTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCostItemTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcCostItemTypeEnum.USERDEFINED +notdefined = IfcCostItemTypeEnum.NOTDEFINED IfcCostScheduleTypeEnum = enum_namespace() -budget = express_getattr(IfcCostScheduleTypeEnum, 'BUDGET', INDETERMINATE) -costplan = express_getattr(IfcCostScheduleTypeEnum, 'COSTPLAN', INDETERMINATE) -estimate = express_getattr(IfcCostScheduleTypeEnum, 'ESTIMATE', INDETERMINATE) -pricedbillofquantities = express_getattr(IfcCostScheduleTypeEnum, 'PRICEDBILLOFQUANTITIES', INDETERMINATE) -scheduleofrates = express_getattr(IfcCostScheduleTypeEnum, 'SCHEDULEOFRATES', INDETERMINATE) -tender = express_getattr(IfcCostScheduleTypeEnum, 'TENDER', INDETERMINATE) -unpricedbillofquantities = express_getattr(IfcCostScheduleTypeEnum, 'UNPRICEDBILLOFQUANTITIES', INDETERMINATE) -userdefined = express_getattr(IfcCostScheduleTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCostScheduleTypeEnum, 'NOTDEFINED', INDETERMINATE) +budget = IfcCostScheduleTypeEnum.BUDGET +costplan = IfcCostScheduleTypeEnum.COSTPLAN +estimate = IfcCostScheduleTypeEnum.ESTIMATE +pricedbillofquantities = IfcCostScheduleTypeEnum.PRICEDBILLOFQUANTITIES +scheduleofrates = IfcCostScheduleTypeEnum.SCHEDULEOFRATES +tender = IfcCostScheduleTypeEnum.TENDER +unpricedbillofquantities = IfcCostScheduleTypeEnum.UNPRICEDBILLOFQUANTITIES +userdefined = IfcCostScheduleTypeEnum.USERDEFINED +notdefined = IfcCostScheduleTypeEnum.NOTDEFINED IfcCourseTypeEnum = enum_namespace() -armour = express_getattr(IfcCourseTypeEnum, 'ARMOUR', INDETERMINATE) -ballastbed = express_getattr(IfcCourseTypeEnum, 'BALLASTBED', INDETERMINATE) -core = express_getattr(IfcCourseTypeEnum, 'CORE', INDETERMINATE) -filter = express_getattr(IfcCourseTypeEnum, 'FILTER', INDETERMINATE) -pavement = express_getattr(IfcCourseTypeEnum, 'PAVEMENT', INDETERMINATE) -protection = express_getattr(IfcCourseTypeEnum, 'PROTECTION', INDETERMINATE) -userdefined = express_getattr(IfcCourseTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCourseTypeEnum, 'NOTDEFINED', INDETERMINATE) +armour = IfcCourseTypeEnum.ARMOUR +ballastbed = IfcCourseTypeEnum.BALLASTBED +core = IfcCourseTypeEnum.CORE +filter = IfcCourseTypeEnum.FILTER +pavement = IfcCourseTypeEnum.PAVEMENT +protection = IfcCourseTypeEnum.PROTECTION +userdefined = IfcCourseTypeEnum.USERDEFINED +notdefined = IfcCourseTypeEnum.NOTDEFINED IfcCoveringTypeEnum = enum_namespace() -ceiling = express_getattr(IfcCoveringTypeEnum, 'CEILING', INDETERMINATE) -cladding = express_getattr(IfcCoveringTypeEnum, 'CLADDING', INDETERMINATE) -coping = express_getattr(IfcCoveringTypeEnum, 'COPING', INDETERMINATE) -flooring = express_getattr(IfcCoveringTypeEnum, 'FLOORING', INDETERMINATE) -insulation = express_getattr(IfcCoveringTypeEnum, 'INSULATION', INDETERMINATE) -membrane = express_getattr(IfcCoveringTypeEnum, 'MEMBRANE', INDETERMINATE) -molding = express_getattr(IfcCoveringTypeEnum, 'MOLDING', INDETERMINATE) -roofing = express_getattr(IfcCoveringTypeEnum, 'ROOFING', INDETERMINATE) -skirtingboard = express_getattr(IfcCoveringTypeEnum, 'SKIRTINGBOARD', INDETERMINATE) -sleeving = express_getattr(IfcCoveringTypeEnum, 'SLEEVING', INDETERMINATE) -topping = express_getattr(IfcCoveringTypeEnum, 'TOPPING', INDETERMINATE) -wrapping = express_getattr(IfcCoveringTypeEnum, 'WRAPPING', INDETERMINATE) -userdefined = express_getattr(IfcCoveringTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCoveringTypeEnum, 'NOTDEFINED', INDETERMINATE) +ceiling = IfcCoveringTypeEnum.CEILING +cladding = IfcCoveringTypeEnum.CLADDING +coping = IfcCoveringTypeEnum.COPING +flooring = IfcCoveringTypeEnum.FLOORING +insulation = IfcCoveringTypeEnum.INSULATION +membrane = IfcCoveringTypeEnum.MEMBRANE +molding = IfcCoveringTypeEnum.MOLDING +roofing = IfcCoveringTypeEnum.ROOFING +skirtingboard = IfcCoveringTypeEnum.SKIRTINGBOARD +sleeving = IfcCoveringTypeEnum.SLEEVING +topping = IfcCoveringTypeEnum.TOPPING +wrapping = IfcCoveringTypeEnum.WRAPPING +userdefined = IfcCoveringTypeEnum.USERDEFINED +notdefined = IfcCoveringTypeEnum.NOTDEFINED IfcCrewResourceTypeEnum = enum_namespace() -office = express_getattr(IfcCrewResourceTypeEnum, 'OFFICE', INDETERMINATE) -site = express_getattr(IfcCrewResourceTypeEnum, 'SITE', INDETERMINATE) -userdefined = express_getattr(IfcCrewResourceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCrewResourceTypeEnum, 'NOTDEFINED', INDETERMINATE) +office = IfcCrewResourceTypeEnum.OFFICE +site = IfcCrewResourceTypeEnum.SITE +userdefined = IfcCrewResourceTypeEnum.USERDEFINED +notdefined = IfcCrewResourceTypeEnum.NOTDEFINED IfcCurtainWallTypeEnum = enum_namespace() -userdefined = express_getattr(IfcCurtainWallTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCurtainWallTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcCurtainWallTypeEnum.USERDEFINED +notdefined = IfcCurtainWallTypeEnum.NOTDEFINED IfcCurveInterpolationEnum = enum_namespace() -linear = express_getattr(IfcCurveInterpolationEnum, 'LINEAR', INDETERMINATE) -log_linear = express_getattr(IfcCurveInterpolationEnum, 'LOG_LINEAR', INDETERMINATE) -log_log = express_getattr(IfcCurveInterpolationEnum, 'LOG_LOG', INDETERMINATE) -notdefined = express_getattr(IfcCurveInterpolationEnum, 'NOTDEFINED', INDETERMINATE) +linear = IfcCurveInterpolationEnum.LINEAR +log_linear = IfcCurveInterpolationEnum.LOG_LINEAR +log_log = IfcCurveInterpolationEnum.LOG_LOG +notdefined = IfcCurveInterpolationEnum.NOTDEFINED IfcDamperTypeEnum = enum_namespace() -backdraftdamper = express_getattr(IfcDamperTypeEnum, 'BACKDRAFTDAMPER', INDETERMINATE) -balancingdamper = express_getattr(IfcDamperTypeEnum, 'BALANCINGDAMPER', INDETERMINATE) -blastdamper = express_getattr(IfcDamperTypeEnum, 'BLASTDAMPER', INDETERMINATE) -controldamper = express_getattr(IfcDamperTypeEnum, 'CONTROLDAMPER', INDETERMINATE) -firedamper = express_getattr(IfcDamperTypeEnum, 'FIREDAMPER', INDETERMINATE) -firesmokedamper = express_getattr(IfcDamperTypeEnum, 'FIRESMOKEDAMPER', INDETERMINATE) -fumehoodexhaust = express_getattr(IfcDamperTypeEnum, 'FUMEHOODEXHAUST', INDETERMINATE) -gravitydamper = express_getattr(IfcDamperTypeEnum, 'GRAVITYDAMPER', INDETERMINATE) -gravityreliefdamper = express_getattr(IfcDamperTypeEnum, 'GRAVITYRELIEFDAMPER', INDETERMINATE) -reliefdamper = express_getattr(IfcDamperTypeEnum, 'RELIEFDAMPER', INDETERMINATE) -smokedamper = express_getattr(IfcDamperTypeEnum, 'SMOKEDAMPER', INDETERMINATE) -userdefined = express_getattr(IfcDamperTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDamperTypeEnum, 'NOTDEFINED', INDETERMINATE) +backdraftdamper = IfcDamperTypeEnum.BACKDRAFTDAMPER +balancingdamper = IfcDamperTypeEnum.BALANCINGDAMPER +blastdamper = IfcDamperTypeEnum.BLASTDAMPER +controldamper = IfcDamperTypeEnum.CONTROLDAMPER +firedamper = IfcDamperTypeEnum.FIREDAMPER +firesmokedamper = IfcDamperTypeEnum.FIRESMOKEDAMPER +fumehoodexhaust = IfcDamperTypeEnum.FUMEHOODEXHAUST +gravitydamper = IfcDamperTypeEnum.GRAVITYDAMPER +gravityreliefdamper = IfcDamperTypeEnum.GRAVITYRELIEFDAMPER +reliefdamper = IfcDamperTypeEnum.RELIEFDAMPER +smokedamper = IfcDamperTypeEnum.SMOKEDAMPER +userdefined = IfcDamperTypeEnum.USERDEFINED +notdefined = IfcDamperTypeEnum.NOTDEFINED IfcDataOriginEnum = enum_namespace() -measured = express_getattr(IfcDataOriginEnum, 'MEASURED', INDETERMINATE) -predicted = express_getattr(IfcDataOriginEnum, 'PREDICTED', INDETERMINATE) -simulated = express_getattr(IfcDataOriginEnum, 'SIMULATED', INDETERMINATE) -userdefined = express_getattr(IfcDataOriginEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDataOriginEnum, 'NOTDEFINED', INDETERMINATE) +measured = IfcDataOriginEnum.MEASURED +predicted = IfcDataOriginEnum.PREDICTED +simulated = IfcDataOriginEnum.SIMULATED +userdefined = IfcDataOriginEnum.USERDEFINED +notdefined = IfcDataOriginEnum.NOTDEFINED IfcDerivedUnitEnum = enum_namespace() -accelerationunit = express_getattr(IfcDerivedUnitEnum, 'ACCELERATIONUNIT', INDETERMINATE) -angularvelocityunit = express_getattr(IfcDerivedUnitEnum, 'ANGULARVELOCITYUNIT', INDETERMINATE) -areadensityunit = express_getattr(IfcDerivedUnitEnum, 'AREADENSITYUNIT', INDETERMINATE) -compoundplaneangleunit = express_getattr(IfcDerivedUnitEnum, 'COMPOUNDPLANEANGLEUNIT', INDETERMINATE) -curvatureunit = express_getattr(IfcDerivedUnitEnum, 'CURVATUREUNIT', INDETERMINATE) -dynamicviscosityunit = express_getattr(IfcDerivedUnitEnum, 'DYNAMICVISCOSITYUNIT', INDETERMINATE) -heatfluxdensityunit = express_getattr(IfcDerivedUnitEnum, 'HEATFLUXDENSITYUNIT', INDETERMINATE) -heatingvalueunit = express_getattr(IfcDerivedUnitEnum, 'HEATINGVALUEUNIT', INDETERMINATE) -integercountrateunit = express_getattr(IfcDerivedUnitEnum, 'INTEGERCOUNTRATEUNIT', INDETERMINATE) -ionconcentrationunit = express_getattr(IfcDerivedUnitEnum, 'IONCONCENTRATIONUNIT', INDETERMINATE) -isothermalmoisturecapacityunit = express_getattr(IfcDerivedUnitEnum, 'ISOTHERMALMOISTURECAPACITYUNIT', INDETERMINATE) -kinematicviscosityunit = express_getattr(IfcDerivedUnitEnum, 'KINEMATICVISCOSITYUNIT', INDETERMINATE) -linearforceunit = express_getattr(IfcDerivedUnitEnum, 'LINEARFORCEUNIT', INDETERMINATE) -linearmomentunit = express_getattr(IfcDerivedUnitEnum, 'LINEARMOMENTUNIT', INDETERMINATE) -linearstiffnessunit = express_getattr(IfcDerivedUnitEnum, 'LINEARSTIFFNESSUNIT', INDETERMINATE) -linearvelocityunit = express_getattr(IfcDerivedUnitEnum, 'LINEARVELOCITYUNIT', INDETERMINATE) -luminousintensitydistributionunit = express_getattr(IfcDerivedUnitEnum, 'LUMINOUSINTENSITYDISTRIBUTIONUNIT', INDETERMINATE) -massdensityunit = express_getattr(IfcDerivedUnitEnum, 'MASSDENSITYUNIT', INDETERMINATE) -massflowrateunit = express_getattr(IfcDerivedUnitEnum, 'MASSFLOWRATEUNIT', INDETERMINATE) -massperlengthunit = express_getattr(IfcDerivedUnitEnum, 'MASSPERLENGTHUNIT', INDETERMINATE) -modulusofelasticityunit = express_getattr(IfcDerivedUnitEnum, 'MODULUSOFELASTICITYUNIT', INDETERMINATE) -modulusoflinearsubgradereactionunit = express_getattr(IfcDerivedUnitEnum, 'MODULUSOFLINEARSUBGRADEREACTIONUNIT', INDETERMINATE) -modulusofrotationalsubgradereactionunit = express_getattr(IfcDerivedUnitEnum, 'MODULUSOFROTATIONALSUBGRADEREACTIONUNIT', INDETERMINATE) -modulusofsubgradereactionunit = express_getattr(IfcDerivedUnitEnum, 'MODULUSOFSUBGRADEREACTIONUNIT', INDETERMINATE) -moisturediffusivityunit = express_getattr(IfcDerivedUnitEnum, 'MOISTUREDIFFUSIVITYUNIT', INDETERMINATE) -molecularweightunit = express_getattr(IfcDerivedUnitEnum, 'MOLECULARWEIGHTUNIT', INDETERMINATE) -momentofinertiaunit = express_getattr(IfcDerivedUnitEnum, 'MOMENTOFINERTIAUNIT', INDETERMINATE) -phunit = express_getattr(IfcDerivedUnitEnum, 'PHUNIT', INDETERMINATE) -planarforceunit = express_getattr(IfcDerivedUnitEnum, 'PLANARFORCEUNIT', INDETERMINATE) -rotationalfrequencyunit = express_getattr(IfcDerivedUnitEnum, 'ROTATIONALFREQUENCYUNIT', INDETERMINATE) -rotationalmassunit = express_getattr(IfcDerivedUnitEnum, 'ROTATIONALMASSUNIT', INDETERMINATE) -rotationalstiffnessunit = express_getattr(IfcDerivedUnitEnum, 'ROTATIONALSTIFFNESSUNIT', INDETERMINATE) -sectionareaintegralunit = express_getattr(IfcDerivedUnitEnum, 'SECTIONAREAINTEGRALUNIT', INDETERMINATE) -sectionmodulusunit = express_getattr(IfcDerivedUnitEnum, 'SECTIONMODULUSUNIT', INDETERMINATE) -shearmodulusunit = express_getattr(IfcDerivedUnitEnum, 'SHEARMODULUSUNIT', INDETERMINATE) -soundpowerlevelunit = express_getattr(IfcDerivedUnitEnum, 'SOUNDPOWERLEVELUNIT', INDETERMINATE) -soundpowerunit = express_getattr(IfcDerivedUnitEnum, 'SOUNDPOWERUNIT', INDETERMINATE) -soundpressurelevelunit = express_getattr(IfcDerivedUnitEnum, 'SOUNDPRESSURELEVELUNIT', INDETERMINATE) -soundpressureunit = express_getattr(IfcDerivedUnitEnum, 'SOUNDPRESSUREUNIT', INDETERMINATE) -specificheatcapacityunit = express_getattr(IfcDerivedUnitEnum, 'SPECIFICHEATCAPACITYUNIT', INDETERMINATE) -temperaturegradientunit = express_getattr(IfcDerivedUnitEnum, 'TEMPERATUREGRADIENTUNIT', INDETERMINATE) -temperaturerateofchangeunit = express_getattr(IfcDerivedUnitEnum, 'TEMPERATURERATEOFCHANGEUNIT', INDETERMINATE) -thermaladmittanceunit = express_getattr(IfcDerivedUnitEnum, 'THERMALADMITTANCEUNIT', INDETERMINATE) -thermalconductanceunit = express_getattr(IfcDerivedUnitEnum, 'THERMALCONDUCTANCEUNIT', INDETERMINATE) -thermalexpansioncoefficientunit = express_getattr(IfcDerivedUnitEnum, 'THERMALEXPANSIONCOEFFICIENTUNIT', INDETERMINATE) -thermalresistanceunit = express_getattr(IfcDerivedUnitEnum, 'THERMALRESISTANCEUNIT', INDETERMINATE) -thermaltransmittanceunit = express_getattr(IfcDerivedUnitEnum, 'THERMALTRANSMITTANCEUNIT', INDETERMINATE) -torqueunit = express_getattr(IfcDerivedUnitEnum, 'TORQUEUNIT', INDETERMINATE) -vaporpermeabilityunit = express_getattr(IfcDerivedUnitEnum, 'VAPORPERMEABILITYUNIT', INDETERMINATE) -volumetricflowrateunit = express_getattr(IfcDerivedUnitEnum, 'VOLUMETRICFLOWRATEUNIT', INDETERMINATE) -warpingconstantunit = express_getattr(IfcDerivedUnitEnum, 'WARPINGCONSTANTUNIT', INDETERMINATE) -warpingmomentunit = express_getattr(IfcDerivedUnitEnum, 'WARPINGMOMENTUNIT', INDETERMINATE) -userdefined = express_getattr(IfcDerivedUnitEnum, 'USERDEFINED', INDETERMINATE) +accelerationunit = IfcDerivedUnitEnum.ACCELERATIONUNIT +angularvelocityunit = IfcDerivedUnitEnum.ANGULARVELOCITYUNIT +areadensityunit = IfcDerivedUnitEnum.AREADENSITYUNIT +compoundplaneangleunit = IfcDerivedUnitEnum.COMPOUNDPLANEANGLEUNIT +curvatureunit = IfcDerivedUnitEnum.CURVATUREUNIT +dynamicviscosityunit = IfcDerivedUnitEnum.DYNAMICVISCOSITYUNIT +heatfluxdensityunit = IfcDerivedUnitEnum.HEATFLUXDENSITYUNIT +heatingvalueunit = IfcDerivedUnitEnum.HEATINGVALUEUNIT +integercountrateunit = IfcDerivedUnitEnum.INTEGERCOUNTRATEUNIT +ionconcentrationunit = IfcDerivedUnitEnum.IONCONCENTRATIONUNIT +isothermalmoisturecapacityunit = IfcDerivedUnitEnum.ISOTHERMALMOISTURECAPACITYUNIT +kinematicviscosityunit = IfcDerivedUnitEnum.KINEMATICVISCOSITYUNIT +linearforceunit = IfcDerivedUnitEnum.LINEARFORCEUNIT +linearmomentunit = IfcDerivedUnitEnum.LINEARMOMENTUNIT +linearstiffnessunit = IfcDerivedUnitEnum.LINEARSTIFFNESSUNIT +linearvelocityunit = IfcDerivedUnitEnum.LINEARVELOCITYUNIT +luminousintensitydistributionunit = IfcDerivedUnitEnum.LUMINOUSINTENSITYDISTRIBUTIONUNIT +massdensityunit = IfcDerivedUnitEnum.MASSDENSITYUNIT +massflowrateunit = IfcDerivedUnitEnum.MASSFLOWRATEUNIT +massperlengthunit = IfcDerivedUnitEnum.MASSPERLENGTHUNIT +modulusofelasticityunit = IfcDerivedUnitEnum.MODULUSOFELASTICITYUNIT +modulusoflinearsubgradereactionunit = IfcDerivedUnitEnum.MODULUSOFLINEARSUBGRADEREACTIONUNIT +modulusofrotationalsubgradereactionunit = IfcDerivedUnitEnum.MODULUSOFROTATIONALSUBGRADEREACTIONUNIT +modulusofsubgradereactionunit = IfcDerivedUnitEnum.MODULUSOFSUBGRADEREACTIONUNIT +moisturediffusivityunit = IfcDerivedUnitEnum.MOISTUREDIFFUSIVITYUNIT +molecularweightunit = IfcDerivedUnitEnum.MOLECULARWEIGHTUNIT +momentofinertiaunit = IfcDerivedUnitEnum.MOMENTOFINERTIAUNIT +phunit = IfcDerivedUnitEnum.PHUNIT +planarforceunit = IfcDerivedUnitEnum.PLANARFORCEUNIT +rotationalfrequencyunit = IfcDerivedUnitEnum.ROTATIONALFREQUENCYUNIT +rotationalmassunit = IfcDerivedUnitEnum.ROTATIONALMASSUNIT +rotationalstiffnessunit = IfcDerivedUnitEnum.ROTATIONALSTIFFNESSUNIT +sectionareaintegralunit = IfcDerivedUnitEnum.SECTIONAREAINTEGRALUNIT +sectionmodulusunit = IfcDerivedUnitEnum.SECTIONMODULUSUNIT +shearmodulusunit = IfcDerivedUnitEnum.SHEARMODULUSUNIT +soundpowerlevelunit = IfcDerivedUnitEnum.SOUNDPOWERLEVELUNIT +soundpowerunit = IfcDerivedUnitEnum.SOUNDPOWERUNIT +soundpressurelevelunit = IfcDerivedUnitEnum.SOUNDPRESSURELEVELUNIT +soundpressureunit = IfcDerivedUnitEnum.SOUNDPRESSUREUNIT +specificheatcapacityunit = IfcDerivedUnitEnum.SPECIFICHEATCAPACITYUNIT +temperaturegradientunit = IfcDerivedUnitEnum.TEMPERATUREGRADIENTUNIT +temperaturerateofchangeunit = IfcDerivedUnitEnum.TEMPERATURERATEOFCHANGEUNIT +thermaladmittanceunit = IfcDerivedUnitEnum.THERMALADMITTANCEUNIT +thermalconductanceunit = IfcDerivedUnitEnum.THERMALCONDUCTANCEUNIT +thermalexpansioncoefficientunit = IfcDerivedUnitEnum.THERMALEXPANSIONCOEFFICIENTUNIT +thermalresistanceunit = IfcDerivedUnitEnum.THERMALRESISTANCEUNIT +thermaltransmittanceunit = IfcDerivedUnitEnum.THERMALTRANSMITTANCEUNIT +torqueunit = IfcDerivedUnitEnum.TORQUEUNIT +vaporpermeabilityunit = IfcDerivedUnitEnum.VAPORPERMEABILITYUNIT +volumetricflowrateunit = IfcDerivedUnitEnum.VOLUMETRICFLOWRATEUNIT +warpingconstantunit = IfcDerivedUnitEnum.WARPINGCONSTANTUNIT +warpingmomentunit = IfcDerivedUnitEnum.WARPINGMOMENTUNIT +userdefined = IfcDerivedUnitEnum.USERDEFINED IfcDirectionSenseEnum = enum_namespace() -negative = express_getattr(IfcDirectionSenseEnum, 'NEGATIVE', INDETERMINATE) -positive = express_getattr(IfcDirectionSenseEnum, 'POSITIVE', INDETERMINATE) +negative = IfcDirectionSenseEnum.NEGATIVE +positive = IfcDirectionSenseEnum.POSITIVE IfcDiscreteAccessoryTypeEnum = enum_namespace() -anchorplate = express_getattr(IfcDiscreteAccessoryTypeEnum, 'ANCHORPLATE', INDETERMINATE) -birdprotection = express_getattr(IfcDiscreteAccessoryTypeEnum, 'BIRDPROTECTION', INDETERMINATE) -bracket = express_getattr(IfcDiscreteAccessoryTypeEnum, 'BRACKET', INDETERMINATE) -cablearranger = express_getattr(IfcDiscreteAccessoryTypeEnum, 'CABLEARRANGER', INDETERMINATE) -elastic_cushion = express_getattr(IfcDiscreteAccessoryTypeEnum, 'ELASTIC_CUSHION', INDETERMINATE) -expansion_joint_device = express_getattr(IfcDiscreteAccessoryTypeEnum, 'EXPANSION_JOINT_DEVICE', INDETERMINATE) -filler = express_getattr(IfcDiscreteAccessoryTypeEnum, 'FILLER', INDETERMINATE) -flashing = express_getattr(IfcDiscreteAccessoryTypeEnum, 'FLASHING', INDETERMINATE) -insulator = express_getattr(IfcDiscreteAccessoryTypeEnum, 'INSULATOR', INDETERMINATE) -lock = express_getattr(IfcDiscreteAccessoryTypeEnum, 'LOCK', INDETERMINATE) -panel_strengthening = express_getattr(IfcDiscreteAccessoryTypeEnum, 'PANEL_STRENGTHENING', INDETERMINATE) -pointmachinemountingdevice = express_getattr(IfcDiscreteAccessoryTypeEnum, 'POINTMACHINEMOUNTINGDEVICE', INDETERMINATE) -point_machine_locking_device = express_getattr(IfcDiscreteAccessoryTypeEnum, 'POINT_MACHINE_LOCKING_DEVICE', INDETERMINATE) -railbrace = express_getattr(IfcDiscreteAccessoryTypeEnum, 'RAILBRACE', INDETERMINATE) -railpad = express_getattr(IfcDiscreteAccessoryTypeEnum, 'RAILPAD', INDETERMINATE) -rail_lubrication = express_getattr(IfcDiscreteAccessoryTypeEnum, 'RAIL_LUBRICATION', INDETERMINATE) -rail_mechanical_equipment = express_getattr(IfcDiscreteAccessoryTypeEnum, 'RAIL_MECHANICAL_EQUIPMENT', INDETERMINATE) -shoe = express_getattr(IfcDiscreteAccessoryTypeEnum, 'SHOE', INDETERMINATE) -slidingchair = express_getattr(IfcDiscreteAccessoryTypeEnum, 'SLIDINGCHAIR', INDETERMINATE) -soundabsorption = express_getattr(IfcDiscreteAccessoryTypeEnum, 'SOUNDABSORPTION', INDETERMINATE) -tensioningequipment = express_getattr(IfcDiscreteAccessoryTypeEnum, 'TENSIONINGEQUIPMENT', INDETERMINATE) -userdefined = express_getattr(IfcDiscreteAccessoryTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDiscreteAccessoryTypeEnum, 'NOTDEFINED', INDETERMINATE) +anchorplate = IfcDiscreteAccessoryTypeEnum.ANCHORPLATE +birdprotection = IfcDiscreteAccessoryTypeEnum.BIRDPROTECTION +bracket = IfcDiscreteAccessoryTypeEnum.BRACKET +cablearranger = IfcDiscreteAccessoryTypeEnum.CABLEARRANGER +elastic_cushion = IfcDiscreteAccessoryTypeEnum.ELASTIC_CUSHION +expansion_joint_device = IfcDiscreteAccessoryTypeEnum.EXPANSION_JOINT_DEVICE +filler = IfcDiscreteAccessoryTypeEnum.FILLER +flashing = IfcDiscreteAccessoryTypeEnum.FLASHING +insulator = IfcDiscreteAccessoryTypeEnum.INSULATOR +lock = IfcDiscreteAccessoryTypeEnum.LOCK +panel_strengthening = IfcDiscreteAccessoryTypeEnum.PANEL_STRENGTHENING +pointmachinemountingdevice = IfcDiscreteAccessoryTypeEnum.POINTMACHINEMOUNTINGDEVICE +point_machine_locking_device = IfcDiscreteAccessoryTypeEnum.POINT_MACHINE_LOCKING_DEVICE +railbrace = IfcDiscreteAccessoryTypeEnum.RAILBRACE +railpad = IfcDiscreteAccessoryTypeEnum.RAILPAD +rail_lubrication = IfcDiscreteAccessoryTypeEnum.RAIL_LUBRICATION +rail_mechanical_equipment = IfcDiscreteAccessoryTypeEnum.RAIL_MECHANICAL_EQUIPMENT +shoe = IfcDiscreteAccessoryTypeEnum.SHOE +slidingchair = IfcDiscreteAccessoryTypeEnum.SLIDINGCHAIR +soundabsorption = IfcDiscreteAccessoryTypeEnum.SOUNDABSORPTION +tensioningequipment = IfcDiscreteAccessoryTypeEnum.TENSIONINGEQUIPMENT +userdefined = IfcDiscreteAccessoryTypeEnum.USERDEFINED +notdefined = IfcDiscreteAccessoryTypeEnum.NOTDEFINED IfcDistributionBoardTypeEnum = enum_namespace() -consumerunit = express_getattr(IfcDistributionBoardTypeEnum, 'CONSUMERUNIT', INDETERMINATE) -dispatchingboard = express_getattr(IfcDistributionBoardTypeEnum, 'DISPATCHINGBOARD', INDETERMINATE) -distributionboard = express_getattr(IfcDistributionBoardTypeEnum, 'DISTRIBUTIONBOARD', INDETERMINATE) -distributionframe = express_getattr(IfcDistributionBoardTypeEnum, 'DISTRIBUTIONFRAME', INDETERMINATE) -motorcontrolcentre = express_getattr(IfcDistributionBoardTypeEnum, 'MOTORCONTROLCENTRE', INDETERMINATE) -switchboard = express_getattr(IfcDistributionBoardTypeEnum, 'SWITCHBOARD', INDETERMINATE) -userdefined = express_getattr(IfcDistributionBoardTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDistributionBoardTypeEnum, 'NOTDEFINED', INDETERMINATE) +consumerunit = IfcDistributionBoardTypeEnum.CONSUMERUNIT +dispatchingboard = IfcDistributionBoardTypeEnum.DISPATCHINGBOARD +distributionboard = IfcDistributionBoardTypeEnum.DISTRIBUTIONBOARD +distributionframe = IfcDistributionBoardTypeEnum.DISTRIBUTIONFRAME +motorcontrolcentre = IfcDistributionBoardTypeEnum.MOTORCONTROLCENTRE +switchboard = IfcDistributionBoardTypeEnum.SWITCHBOARD +userdefined = IfcDistributionBoardTypeEnum.USERDEFINED +notdefined = IfcDistributionBoardTypeEnum.NOTDEFINED IfcDistributionChamberElementTypeEnum = enum_namespace() -formedduct = express_getattr(IfcDistributionChamberElementTypeEnum, 'FORMEDDUCT', INDETERMINATE) -inspectionchamber = express_getattr(IfcDistributionChamberElementTypeEnum, 'INSPECTIONCHAMBER', INDETERMINATE) -inspectionpit = express_getattr(IfcDistributionChamberElementTypeEnum, 'INSPECTIONPIT', INDETERMINATE) -manhole = express_getattr(IfcDistributionChamberElementTypeEnum, 'MANHOLE', INDETERMINATE) -meterchamber = express_getattr(IfcDistributionChamberElementTypeEnum, 'METERCHAMBER', INDETERMINATE) -sump = express_getattr(IfcDistributionChamberElementTypeEnum, 'SUMP', INDETERMINATE) -trench = express_getattr(IfcDistributionChamberElementTypeEnum, 'TRENCH', INDETERMINATE) -valvechamber = express_getattr(IfcDistributionChamberElementTypeEnum, 'VALVECHAMBER', INDETERMINATE) -userdefined = express_getattr(IfcDistributionChamberElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDistributionChamberElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +formedduct = IfcDistributionChamberElementTypeEnum.FORMEDDUCT +inspectionchamber = IfcDistributionChamberElementTypeEnum.INSPECTIONCHAMBER +inspectionpit = IfcDistributionChamberElementTypeEnum.INSPECTIONPIT +manhole = IfcDistributionChamberElementTypeEnum.MANHOLE +meterchamber = IfcDistributionChamberElementTypeEnum.METERCHAMBER +sump = IfcDistributionChamberElementTypeEnum.SUMP +trench = IfcDistributionChamberElementTypeEnum.TRENCH +valvechamber = IfcDistributionChamberElementTypeEnum.VALVECHAMBER +userdefined = IfcDistributionChamberElementTypeEnum.USERDEFINED +notdefined = IfcDistributionChamberElementTypeEnum.NOTDEFINED IfcDistributionPortTypeEnum = enum_namespace() -cable = express_getattr(IfcDistributionPortTypeEnum, 'CABLE', INDETERMINATE) -cablecarrier = express_getattr(IfcDistributionPortTypeEnum, 'CABLECARRIER', INDETERMINATE) -duct = express_getattr(IfcDistributionPortTypeEnum, 'DUCT', INDETERMINATE) -pipe = express_getattr(IfcDistributionPortTypeEnum, 'PIPE', INDETERMINATE) -wireless = express_getattr(IfcDistributionPortTypeEnum, 'WIRELESS', INDETERMINATE) -userdefined = express_getattr(IfcDistributionPortTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDistributionPortTypeEnum, 'NOTDEFINED', INDETERMINATE) +cable = IfcDistributionPortTypeEnum.CABLE +cablecarrier = IfcDistributionPortTypeEnum.CABLECARRIER +duct = IfcDistributionPortTypeEnum.DUCT +pipe = IfcDistributionPortTypeEnum.PIPE +wireless = IfcDistributionPortTypeEnum.WIRELESS +userdefined = IfcDistributionPortTypeEnum.USERDEFINED +notdefined = IfcDistributionPortTypeEnum.NOTDEFINED IfcDistributionSystemEnum = enum_namespace() -airconditioning = express_getattr(IfcDistributionSystemEnum, 'AIRCONDITIONING', INDETERMINATE) -audiovisual = express_getattr(IfcDistributionSystemEnum, 'AUDIOVISUAL', INDETERMINATE) -catenary_system = express_getattr(IfcDistributionSystemEnum, 'CATENARY_SYSTEM', INDETERMINATE) -chemical = express_getattr(IfcDistributionSystemEnum, 'CHEMICAL', INDETERMINATE) -chilledwater = express_getattr(IfcDistributionSystemEnum, 'CHILLEDWATER', INDETERMINATE) -communication = express_getattr(IfcDistributionSystemEnum, 'COMMUNICATION', INDETERMINATE) -compressedair = express_getattr(IfcDistributionSystemEnum, 'COMPRESSEDAIR', INDETERMINATE) -condenserwater = express_getattr(IfcDistributionSystemEnum, 'CONDENSERWATER', INDETERMINATE) -control = express_getattr(IfcDistributionSystemEnum, 'CONTROL', INDETERMINATE) -conveying = express_getattr(IfcDistributionSystemEnum, 'CONVEYING', INDETERMINATE) -data = express_getattr(IfcDistributionSystemEnum, 'DATA', INDETERMINATE) -disposal = express_getattr(IfcDistributionSystemEnum, 'DISPOSAL', INDETERMINATE) -domesticcoldwater = express_getattr(IfcDistributionSystemEnum, 'DOMESTICCOLDWATER', INDETERMINATE) -domestichotwater = express_getattr(IfcDistributionSystemEnum, 'DOMESTICHOTWATER', INDETERMINATE) -drainage = express_getattr(IfcDistributionSystemEnum, 'DRAINAGE', INDETERMINATE) -earthing = express_getattr(IfcDistributionSystemEnum, 'EARTHING', INDETERMINATE) -electrical = express_getattr(IfcDistributionSystemEnum, 'ELECTRICAL', INDETERMINATE) -electroacoustic = express_getattr(IfcDistributionSystemEnum, 'ELECTROACOUSTIC', INDETERMINATE) -exhaust = express_getattr(IfcDistributionSystemEnum, 'EXHAUST', INDETERMINATE) -fireprotection = express_getattr(IfcDistributionSystemEnum, 'FIREPROTECTION', INDETERMINATE) -fixedtransmissionnetwork = express_getattr(IfcDistributionSystemEnum, 'FIXEDTRANSMISSIONNETWORK', INDETERMINATE) -fuel = express_getattr(IfcDistributionSystemEnum, 'FUEL', INDETERMINATE) -gas = express_getattr(IfcDistributionSystemEnum, 'GAS', INDETERMINATE) -hazardous = express_getattr(IfcDistributionSystemEnum, 'HAZARDOUS', INDETERMINATE) -heating = express_getattr(IfcDistributionSystemEnum, 'HEATING', INDETERMINATE) -lighting = express_getattr(IfcDistributionSystemEnum, 'LIGHTING', INDETERMINATE) -lightningprotection = express_getattr(IfcDistributionSystemEnum, 'LIGHTNINGPROTECTION', INDETERMINATE) -mobilenetwork = express_getattr(IfcDistributionSystemEnum, 'MOBILENETWORK', INDETERMINATE) -monitoringsystem = express_getattr(IfcDistributionSystemEnum, 'MONITORINGSYSTEM', INDETERMINATE) -municipalsolidwaste = express_getattr(IfcDistributionSystemEnum, 'MUNICIPALSOLIDWASTE', INDETERMINATE) -oil = express_getattr(IfcDistributionSystemEnum, 'OIL', INDETERMINATE) -operational = express_getattr(IfcDistributionSystemEnum, 'OPERATIONAL', INDETERMINATE) -operationaltelephonysystem = express_getattr(IfcDistributionSystemEnum, 'OPERATIONALTELEPHONYSYSTEM', INDETERMINATE) -overhead_contactline_system = express_getattr(IfcDistributionSystemEnum, 'OVERHEAD_CONTACTLINE_SYSTEM', INDETERMINATE) -powergeneration = express_getattr(IfcDistributionSystemEnum, 'POWERGENERATION', INDETERMINATE) -rainwater = express_getattr(IfcDistributionSystemEnum, 'RAINWATER', INDETERMINATE) -refrigeration = express_getattr(IfcDistributionSystemEnum, 'REFRIGERATION', INDETERMINATE) -return_circuit = express_getattr(IfcDistributionSystemEnum, 'RETURN_CIRCUIT', INDETERMINATE) -security = express_getattr(IfcDistributionSystemEnum, 'SECURITY', INDETERMINATE) -sewage = express_getattr(IfcDistributionSystemEnum, 'SEWAGE', INDETERMINATE) -signal = express_getattr(IfcDistributionSystemEnum, 'SIGNAL', INDETERMINATE) -stormwater = express_getattr(IfcDistributionSystemEnum, 'STORMWATER', INDETERMINATE) -telephone = express_getattr(IfcDistributionSystemEnum, 'TELEPHONE', INDETERMINATE) -tv = express_getattr(IfcDistributionSystemEnum, 'TV', INDETERMINATE) -vacuum = express_getattr(IfcDistributionSystemEnum, 'VACUUM', INDETERMINATE) -vent = express_getattr(IfcDistributionSystemEnum, 'VENT', INDETERMINATE) -ventilation = express_getattr(IfcDistributionSystemEnum, 'VENTILATION', INDETERMINATE) -wastewater = express_getattr(IfcDistributionSystemEnum, 'WASTEWATER', INDETERMINATE) -watersupply = express_getattr(IfcDistributionSystemEnum, 'WATERSUPPLY', INDETERMINATE) -userdefined = express_getattr(IfcDistributionSystemEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDistributionSystemEnum, 'NOTDEFINED', INDETERMINATE) +airconditioning = IfcDistributionSystemEnum.AIRCONDITIONING +audiovisual = IfcDistributionSystemEnum.AUDIOVISUAL +catenary_system = IfcDistributionSystemEnum.CATENARY_SYSTEM +chemical = IfcDistributionSystemEnum.CHEMICAL +chilledwater = IfcDistributionSystemEnum.CHILLEDWATER +communication = IfcDistributionSystemEnum.COMMUNICATION +compressedair = IfcDistributionSystemEnum.COMPRESSEDAIR +condenserwater = IfcDistributionSystemEnum.CONDENSERWATER +control = IfcDistributionSystemEnum.CONTROL +conveying = IfcDistributionSystemEnum.CONVEYING +data = IfcDistributionSystemEnum.DATA +disposal = IfcDistributionSystemEnum.DISPOSAL +domesticcoldwater = IfcDistributionSystemEnum.DOMESTICCOLDWATER +domestichotwater = IfcDistributionSystemEnum.DOMESTICHOTWATER +drainage = IfcDistributionSystemEnum.DRAINAGE +earthing = IfcDistributionSystemEnum.EARTHING +electrical = IfcDistributionSystemEnum.ELECTRICAL +electroacoustic = IfcDistributionSystemEnum.ELECTROACOUSTIC +exhaust = IfcDistributionSystemEnum.EXHAUST +fireprotection = IfcDistributionSystemEnum.FIREPROTECTION +fixedtransmissionnetwork = IfcDistributionSystemEnum.FIXEDTRANSMISSIONNETWORK +fuel = IfcDistributionSystemEnum.FUEL +gas = IfcDistributionSystemEnum.GAS +hazardous = IfcDistributionSystemEnum.HAZARDOUS +heating = IfcDistributionSystemEnum.HEATING +lighting = IfcDistributionSystemEnum.LIGHTING +lightningprotection = IfcDistributionSystemEnum.LIGHTNINGPROTECTION +mobilenetwork = IfcDistributionSystemEnum.MOBILENETWORK +monitoringsystem = IfcDistributionSystemEnum.MONITORINGSYSTEM +municipalsolidwaste = IfcDistributionSystemEnum.MUNICIPALSOLIDWASTE +oil = IfcDistributionSystemEnum.OIL +operational = IfcDistributionSystemEnum.OPERATIONAL +operationaltelephonysystem = IfcDistributionSystemEnum.OPERATIONALTELEPHONYSYSTEM +overhead_contactline_system = IfcDistributionSystemEnum.OVERHEAD_CONTACTLINE_SYSTEM +powergeneration = IfcDistributionSystemEnum.POWERGENERATION +rainwater = IfcDistributionSystemEnum.RAINWATER +refrigeration = IfcDistributionSystemEnum.REFRIGERATION +return_circuit = IfcDistributionSystemEnum.RETURN_CIRCUIT +security = IfcDistributionSystemEnum.SECURITY +sewage = IfcDistributionSystemEnum.SEWAGE +signal = IfcDistributionSystemEnum.SIGNAL +stormwater = IfcDistributionSystemEnum.STORMWATER +telephone = IfcDistributionSystemEnum.TELEPHONE +tv = IfcDistributionSystemEnum.TV +vacuum = IfcDistributionSystemEnum.VACUUM +vent = IfcDistributionSystemEnum.VENT +ventilation = IfcDistributionSystemEnum.VENTILATION +wastewater = IfcDistributionSystemEnum.WASTEWATER +watersupply = IfcDistributionSystemEnum.WATERSUPPLY +userdefined = IfcDistributionSystemEnum.USERDEFINED +notdefined = IfcDistributionSystemEnum.NOTDEFINED IfcDocumentConfidentialityEnum = enum_namespace() -confidential = express_getattr(IfcDocumentConfidentialityEnum, 'CONFIDENTIAL', INDETERMINATE) -personal = express_getattr(IfcDocumentConfidentialityEnum, 'PERSONAL', INDETERMINATE) -public = express_getattr(IfcDocumentConfidentialityEnum, 'PUBLIC', INDETERMINATE) -restricted = express_getattr(IfcDocumentConfidentialityEnum, 'RESTRICTED', INDETERMINATE) -userdefined = express_getattr(IfcDocumentConfidentialityEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDocumentConfidentialityEnum, 'NOTDEFINED', INDETERMINATE) +confidential = IfcDocumentConfidentialityEnum.CONFIDENTIAL +personal = IfcDocumentConfidentialityEnum.PERSONAL +public = IfcDocumentConfidentialityEnum.PUBLIC +restricted = IfcDocumentConfidentialityEnum.RESTRICTED +userdefined = IfcDocumentConfidentialityEnum.USERDEFINED +notdefined = IfcDocumentConfidentialityEnum.NOTDEFINED IfcDocumentStatusEnum = enum_namespace() -draft = express_getattr(IfcDocumentStatusEnum, 'DRAFT', INDETERMINATE) -final = express_getattr(IfcDocumentStatusEnum, 'FINAL', INDETERMINATE) -finaldraft = express_getattr(IfcDocumentStatusEnum, 'FINALDRAFT', INDETERMINATE) -revision = express_getattr(IfcDocumentStatusEnum, 'REVISION', INDETERMINATE) -notdefined = express_getattr(IfcDocumentStatusEnum, 'NOTDEFINED', INDETERMINATE) +draft = IfcDocumentStatusEnum.DRAFT +final = IfcDocumentStatusEnum.FINAL +finaldraft = IfcDocumentStatusEnum.FINALDRAFT +revision = IfcDocumentStatusEnum.REVISION +notdefined = IfcDocumentStatusEnum.NOTDEFINED IfcDoorPanelOperationEnum = enum_namespace() -double_acting = express_getattr(IfcDoorPanelOperationEnum, 'DOUBLE_ACTING', INDETERMINATE) -fixedpanel = express_getattr(IfcDoorPanelOperationEnum, 'FIXEDPANEL', INDETERMINATE) -folding = express_getattr(IfcDoorPanelOperationEnum, 'FOLDING', INDETERMINATE) -revolving = express_getattr(IfcDoorPanelOperationEnum, 'REVOLVING', INDETERMINATE) -rollingup = express_getattr(IfcDoorPanelOperationEnum, 'ROLLINGUP', INDETERMINATE) -sliding = express_getattr(IfcDoorPanelOperationEnum, 'SLIDING', INDETERMINATE) -swinging = express_getattr(IfcDoorPanelOperationEnum, 'SWINGING', INDETERMINATE) -userdefined = express_getattr(IfcDoorPanelOperationEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDoorPanelOperationEnum, 'NOTDEFINED', INDETERMINATE) +double_acting = IfcDoorPanelOperationEnum.DOUBLE_ACTING +fixedpanel = IfcDoorPanelOperationEnum.FIXEDPANEL +folding = IfcDoorPanelOperationEnum.FOLDING +revolving = IfcDoorPanelOperationEnum.REVOLVING +rollingup = IfcDoorPanelOperationEnum.ROLLINGUP +sliding = IfcDoorPanelOperationEnum.SLIDING +swinging = IfcDoorPanelOperationEnum.SWINGING +userdefined = IfcDoorPanelOperationEnum.USERDEFINED +notdefined = IfcDoorPanelOperationEnum.NOTDEFINED IfcDoorPanelPositionEnum = enum_namespace() -left = express_getattr(IfcDoorPanelPositionEnum, 'LEFT', INDETERMINATE) -middle = express_getattr(IfcDoorPanelPositionEnum, 'MIDDLE', INDETERMINATE) -right = express_getattr(IfcDoorPanelPositionEnum, 'RIGHT', INDETERMINATE) -notdefined = express_getattr(IfcDoorPanelPositionEnum, 'NOTDEFINED', INDETERMINATE) +left = IfcDoorPanelPositionEnum.LEFT +middle = IfcDoorPanelPositionEnum.MIDDLE +right = IfcDoorPanelPositionEnum.RIGHT +notdefined = IfcDoorPanelPositionEnum.NOTDEFINED IfcDoorTypeEnum = enum_namespace() -boom_barrier = express_getattr(IfcDoorTypeEnum, 'BOOM_BARRIER', INDETERMINATE) -door = express_getattr(IfcDoorTypeEnum, 'DOOR', INDETERMINATE) -gate = express_getattr(IfcDoorTypeEnum, 'GATE', INDETERMINATE) -trapdoor = express_getattr(IfcDoorTypeEnum, 'TRAPDOOR', INDETERMINATE) -turnstile = express_getattr(IfcDoorTypeEnum, 'TURNSTILE', INDETERMINATE) -userdefined = express_getattr(IfcDoorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDoorTypeEnum, 'NOTDEFINED', INDETERMINATE) +boom_barrier = IfcDoorTypeEnum.BOOM_BARRIER +door = IfcDoorTypeEnum.DOOR +gate = IfcDoorTypeEnum.GATE +trapdoor = IfcDoorTypeEnum.TRAPDOOR +turnstile = IfcDoorTypeEnum.TURNSTILE +userdefined = IfcDoorTypeEnum.USERDEFINED +notdefined = IfcDoorTypeEnum.NOTDEFINED IfcDoorTypeOperationEnum = enum_namespace() -double_door_double_swing = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_DOOR_DOUBLE_SWING', INDETERMINATE) -double_door_folding = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_DOOR_FOLDING', INDETERMINATE) -double_door_lifting_vertical = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_DOOR_LIFTING_VERTICAL', INDETERMINATE) -double_door_single_swing = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_DOOR_SINGLE_SWING', INDETERMINATE) -double_door_single_swing_opposite_left = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_LEFT', INDETERMINATE) -double_door_single_swing_opposite_right = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_RIGHT', INDETERMINATE) -double_door_sliding = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_DOOR_SLIDING', INDETERMINATE) -double_swing_left = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_SWING_LEFT', INDETERMINATE) -double_swing_right = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_SWING_RIGHT', INDETERMINATE) -folding_to_left = express_getattr(IfcDoorTypeOperationEnum, 'FOLDING_TO_LEFT', INDETERMINATE) -folding_to_right = express_getattr(IfcDoorTypeOperationEnum, 'FOLDING_TO_RIGHT', INDETERMINATE) -lifting_horizontal = express_getattr(IfcDoorTypeOperationEnum, 'LIFTING_HORIZONTAL', INDETERMINATE) -lifting_vertical_left = express_getattr(IfcDoorTypeOperationEnum, 'LIFTING_VERTICAL_LEFT', INDETERMINATE) -lifting_vertical_right = express_getattr(IfcDoorTypeOperationEnum, 'LIFTING_VERTICAL_RIGHT', INDETERMINATE) -revolving = express_getattr(IfcDoorTypeOperationEnum, 'REVOLVING', INDETERMINATE) -revolving_vertical = express_getattr(IfcDoorTypeOperationEnum, 'REVOLVING_VERTICAL', INDETERMINATE) -rollingup = express_getattr(IfcDoorTypeOperationEnum, 'ROLLINGUP', INDETERMINATE) -single_swing_left = express_getattr(IfcDoorTypeOperationEnum, 'SINGLE_SWING_LEFT', INDETERMINATE) -single_swing_right = express_getattr(IfcDoorTypeOperationEnum, 'SINGLE_SWING_RIGHT', INDETERMINATE) -sliding_to_left = express_getattr(IfcDoorTypeOperationEnum, 'SLIDING_TO_LEFT', INDETERMINATE) -sliding_to_right = express_getattr(IfcDoorTypeOperationEnum, 'SLIDING_TO_RIGHT', INDETERMINATE) -swing_fixed_left = express_getattr(IfcDoorTypeOperationEnum, 'SWING_FIXED_LEFT', INDETERMINATE) -swing_fixed_right = express_getattr(IfcDoorTypeOperationEnum, 'SWING_FIXED_RIGHT', INDETERMINATE) -userdefined = express_getattr(IfcDoorTypeOperationEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDoorTypeOperationEnum, 'NOTDEFINED', INDETERMINATE) +double_door_double_swing = IfcDoorTypeOperationEnum.DOUBLE_DOOR_DOUBLE_SWING +double_door_folding = IfcDoorTypeOperationEnum.DOUBLE_DOOR_FOLDING +double_door_lifting_vertical = IfcDoorTypeOperationEnum.DOUBLE_DOOR_LIFTING_VERTICAL +double_door_single_swing = IfcDoorTypeOperationEnum.DOUBLE_DOOR_SINGLE_SWING +double_door_single_swing_opposite_left = IfcDoorTypeOperationEnum.DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_LEFT +double_door_single_swing_opposite_right = IfcDoorTypeOperationEnum.DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_RIGHT +double_door_sliding = IfcDoorTypeOperationEnum.DOUBLE_DOOR_SLIDING +double_swing_left = IfcDoorTypeOperationEnum.DOUBLE_SWING_LEFT +double_swing_right = IfcDoorTypeOperationEnum.DOUBLE_SWING_RIGHT +folding_to_left = IfcDoorTypeOperationEnum.FOLDING_TO_LEFT +folding_to_right = IfcDoorTypeOperationEnum.FOLDING_TO_RIGHT +lifting_horizontal = IfcDoorTypeOperationEnum.LIFTING_HORIZONTAL +lifting_vertical_left = IfcDoorTypeOperationEnum.LIFTING_VERTICAL_LEFT +lifting_vertical_right = IfcDoorTypeOperationEnum.LIFTING_VERTICAL_RIGHT +revolving = IfcDoorTypeOperationEnum.REVOLVING +revolving_vertical = IfcDoorTypeOperationEnum.REVOLVING_VERTICAL +rollingup = IfcDoorTypeOperationEnum.ROLLINGUP +single_swing_left = IfcDoorTypeOperationEnum.SINGLE_SWING_LEFT +single_swing_right = IfcDoorTypeOperationEnum.SINGLE_SWING_RIGHT +sliding_to_left = IfcDoorTypeOperationEnum.SLIDING_TO_LEFT +sliding_to_right = IfcDoorTypeOperationEnum.SLIDING_TO_RIGHT +swing_fixed_left = IfcDoorTypeOperationEnum.SWING_FIXED_LEFT +swing_fixed_right = IfcDoorTypeOperationEnum.SWING_FIXED_RIGHT +userdefined = IfcDoorTypeOperationEnum.USERDEFINED +notdefined = IfcDoorTypeOperationEnum.NOTDEFINED IfcDuctFittingTypeEnum = enum_namespace() -bend = express_getattr(IfcDuctFittingTypeEnum, 'BEND', INDETERMINATE) -connector = express_getattr(IfcDuctFittingTypeEnum, 'CONNECTOR', INDETERMINATE) -entry = express_getattr(IfcDuctFittingTypeEnum, 'ENTRY', INDETERMINATE) -exit = express_getattr(IfcDuctFittingTypeEnum, 'EXIT', INDETERMINATE) -junction = express_getattr(IfcDuctFittingTypeEnum, 'JUNCTION', INDETERMINATE) -obstruction = express_getattr(IfcDuctFittingTypeEnum, 'OBSTRUCTION', INDETERMINATE) -transition = express_getattr(IfcDuctFittingTypeEnum, 'TRANSITION', INDETERMINATE) -userdefined = express_getattr(IfcDuctFittingTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDuctFittingTypeEnum, 'NOTDEFINED', INDETERMINATE) +bend = IfcDuctFittingTypeEnum.BEND +connector = IfcDuctFittingTypeEnum.CONNECTOR +entry = IfcDuctFittingTypeEnum.ENTRY +exit = IfcDuctFittingTypeEnum.EXIT +junction = IfcDuctFittingTypeEnum.JUNCTION +obstruction = IfcDuctFittingTypeEnum.OBSTRUCTION +transition = IfcDuctFittingTypeEnum.TRANSITION +userdefined = IfcDuctFittingTypeEnum.USERDEFINED +notdefined = IfcDuctFittingTypeEnum.NOTDEFINED IfcDuctSegmentTypeEnum = enum_namespace() -flexiblesegment = express_getattr(IfcDuctSegmentTypeEnum, 'FLEXIBLESEGMENT', INDETERMINATE) -rigidsegment = express_getattr(IfcDuctSegmentTypeEnum, 'RIGIDSEGMENT', INDETERMINATE) -userdefined = express_getattr(IfcDuctSegmentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDuctSegmentTypeEnum, 'NOTDEFINED', INDETERMINATE) +flexiblesegment = IfcDuctSegmentTypeEnum.FLEXIBLESEGMENT +rigidsegment = IfcDuctSegmentTypeEnum.RIGIDSEGMENT +userdefined = IfcDuctSegmentTypeEnum.USERDEFINED +notdefined = IfcDuctSegmentTypeEnum.NOTDEFINED IfcDuctSilencerTypeEnum = enum_namespace() -flatoval = express_getattr(IfcDuctSilencerTypeEnum, 'FLATOVAL', INDETERMINATE) -rectangular = express_getattr(IfcDuctSilencerTypeEnum, 'RECTANGULAR', INDETERMINATE) -round = express_getattr(IfcDuctSilencerTypeEnum, 'ROUND', INDETERMINATE) -userdefined = express_getattr(IfcDuctSilencerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDuctSilencerTypeEnum, 'NOTDEFINED', INDETERMINATE) +flatoval = IfcDuctSilencerTypeEnum.FLATOVAL +rectangular = IfcDuctSilencerTypeEnum.RECTANGULAR +round = IfcDuctSilencerTypeEnum.ROUND +userdefined = IfcDuctSilencerTypeEnum.USERDEFINED +notdefined = IfcDuctSilencerTypeEnum.NOTDEFINED IfcEarthworksCutTypeEnum = enum_namespace() -base_excavation = express_getattr(IfcEarthworksCutTypeEnum, 'BASE_EXCAVATION', INDETERMINATE) -cut = express_getattr(IfcEarthworksCutTypeEnum, 'CUT', INDETERMINATE) -dredging = express_getattr(IfcEarthworksCutTypeEnum, 'DREDGING', INDETERMINATE) -excavation = express_getattr(IfcEarthworksCutTypeEnum, 'EXCAVATION', INDETERMINATE) -overexcavation = express_getattr(IfcEarthworksCutTypeEnum, 'OVEREXCAVATION', INDETERMINATE) -pavementmilling = express_getattr(IfcEarthworksCutTypeEnum, 'PAVEMENTMILLING', INDETERMINATE) -stepexcavation = express_getattr(IfcEarthworksCutTypeEnum, 'STEPEXCAVATION', INDETERMINATE) -topsoilremoval = express_getattr(IfcEarthworksCutTypeEnum, 'TOPSOILREMOVAL', INDETERMINATE) -trench = express_getattr(IfcEarthworksCutTypeEnum, 'TRENCH', INDETERMINATE) -userdefined = express_getattr(IfcEarthworksCutTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcEarthworksCutTypeEnum, 'NOTDEFINED', INDETERMINATE) +base_excavation = IfcEarthworksCutTypeEnum.BASE_EXCAVATION +cut = IfcEarthworksCutTypeEnum.CUT +dredging = IfcEarthworksCutTypeEnum.DREDGING +excavation = IfcEarthworksCutTypeEnum.EXCAVATION +overexcavation = IfcEarthworksCutTypeEnum.OVEREXCAVATION +pavementmilling = IfcEarthworksCutTypeEnum.PAVEMENTMILLING +stepexcavation = IfcEarthworksCutTypeEnum.STEPEXCAVATION +topsoilremoval = IfcEarthworksCutTypeEnum.TOPSOILREMOVAL +trench = IfcEarthworksCutTypeEnum.TRENCH +userdefined = IfcEarthworksCutTypeEnum.USERDEFINED +notdefined = IfcEarthworksCutTypeEnum.NOTDEFINED IfcEarthworksFillTypeEnum = enum_namespace() -backfill = express_getattr(IfcEarthworksFillTypeEnum, 'BACKFILL', INDETERMINATE) -counterweight = express_getattr(IfcEarthworksFillTypeEnum, 'COUNTERWEIGHT', INDETERMINATE) -embankment = express_getattr(IfcEarthworksFillTypeEnum, 'EMBANKMENT', INDETERMINATE) -slopefill = express_getattr(IfcEarthworksFillTypeEnum, 'SLOPEFILL', INDETERMINATE) -subgrade = express_getattr(IfcEarthworksFillTypeEnum, 'SUBGRADE', INDETERMINATE) -subgradebed = express_getattr(IfcEarthworksFillTypeEnum, 'SUBGRADEBED', INDETERMINATE) -transitionsection = express_getattr(IfcEarthworksFillTypeEnum, 'TRANSITIONSECTION', INDETERMINATE) -userdefined = express_getattr(IfcEarthworksFillTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcEarthworksFillTypeEnum, 'NOTDEFINED', INDETERMINATE) +backfill = IfcEarthworksFillTypeEnum.BACKFILL +counterweight = IfcEarthworksFillTypeEnum.COUNTERWEIGHT +embankment = IfcEarthworksFillTypeEnum.EMBANKMENT +slopefill = IfcEarthworksFillTypeEnum.SLOPEFILL +subgrade = IfcEarthworksFillTypeEnum.SUBGRADE +subgradebed = IfcEarthworksFillTypeEnum.SUBGRADEBED +transitionsection = IfcEarthworksFillTypeEnum.TRANSITIONSECTION +userdefined = IfcEarthworksFillTypeEnum.USERDEFINED +notdefined = IfcEarthworksFillTypeEnum.NOTDEFINED IfcElectricApplianceTypeEnum = enum_namespace() -dishwasher = express_getattr(IfcElectricApplianceTypeEnum, 'DISHWASHER', INDETERMINATE) -electriccooker = express_getattr(IfcElectricApplianceTypeEnum, 'ELECTRICCOOKER', INDETERMINATE) -freestandingelectricheater = express_getattr(IfcElectricApplianceTypeEnum, 'FREESTANDINGELECTRICHEATER', INDETERMINATE) -freestandingfan = express_getattr(IfcElectricApplianceTypeEnum, 'FREESTANDINGFAN', INDETERMINATE) -freestandingwatercooler = express_getattr(IfcElectricApplianceTypeEnum, 'FREESTANDINGWATERCOOLER', INDETERMINATE) -freestandingwaterheater = express_getattr(IfcElectricApplianceTypeEnum, 'FREESTANDINGWATERHEATER', INDETERMINATE) -freezer = express_getattr(IfcElectricApplianceTypeEnum, 'FREEZER', INDETERMINATE) -fridge_freezer = express_getattr(IfcElectricApplianceTypeEnum, 'FRIDGE_FREEZER', INDETERMINATE) -handdryer = express_getattr(IfcElectricApplianceTypeEnum, 'HANDDRYER', INDETERMINATE) -kitchenmachine = express_getattr(IfcElectricApplianceTypeEnum, 'KITCHENMACHINE', INDETERMINATE) -microwave = express_getattr(IfcElectricApplianceTypeEnum, 'MICROWAVE', INDETERMINATE) -photocopier = express_getattr(IfcElectricApplianceTypeEnum, 'PHOTOCOPIER', INDETERMINATE) -refrigerator = express_getattr(IfcElectricApplianceTypeEnum, 'REFRIGERATOR', INDETERMINATE) -tumbledryer = express_getattr(IfcElectricApplianceTypeEnum, 'TUMBLEDRYER', INDETERMINATE) -vendingmachine = express_getattr(IfcElectricApplianceTypeEnum, 'VENDINGMACHINE', INDETERMINATE) -washingmachine = express_getattr(IfcElectricApplianceTypeEnum, 'WASHINGMACHINE', INDETERMINATE) -userdefined = express_getattr(IfcElectricApplianceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcElectricApplianceTypeEnum, 'NOTDEFINED', INDETERMINATE) +dishwasher = IfcElectricApplianceTypeEnum.DISHWASHER +electriccooker = IfcElectricApplianceTypeEnum.ELECTRICCOOKER +freestandingelectricheater = IfcElectricApplianceTypeEnum.FREESTANDINGELECTRICHEATER +freestandingfan = IfcElectricApplianceTypeEnum.FREESTANDINGFAN +freestandingwatercooler = IfcElectricApplianceTypeEnum.FREESTANDINGWATERCOOLER +freestandingwaterheater = IfcElectricApplianceTypeEnum.FREESTANDINGWATERHEATER +freezer = IfcElectricApplianceTypeEnum.FREEZER +fridge_freezer = IfcElectricApplianceTypeEnum.FRIDGE_FREEZER +handdryer = IfcElectricApplianceTypeEnum.HANDDRYER +kitchenmachine = IfcElectricApplianceTypeEnum.KITCHENMACHINE +microwave = IfcElectricApplianceTypeEnum.MICROWAVE +photocopier = IfcElectricApplianceTypeEnum.PHOTOCOPIER +refrigerator = IfcElectricApplianceTypeEnum.REFRIGERATOR +tumbledryer = IfcElectricApplianceTypeEnum.TUMBLEDRYER +vendingmachine = IfcElectricApplianceTypeEnum.VENDINGMACHINE +washingmachine = IfcElectricApplianceTypeEnum.WASHINGMACHINE +userdefined = IfcElectricApplianceTypeEnum.USERDEFINED +notdefined = IfcElectricApplianceTypeEnum.NOTDEFINED IfcElectricDistributionBoardTypeEnum = enum_namespace() -consumerunit = express_getattr(IfcElectricDistributionBoardTypeEnum, 'CONSUMERUNIT', INDETERMINATE) -distributionboard = express_getattr(IfcElectricDistributionBoardTypeEnum, 'DISTRIBUTIONBOARD', INDETERMINATE) -motorcontrolcentre = express_getattr(IfcElectricDistributionBoardTypeEnum, 'MOTORCONTROLCENTRE', INDETERMINATE) -switchboard = express_getattr(IfcElectricDistributionBoardTypeEnum, 'SWITCHBOARD', INDETERMINATE) -userdefined = express_getattr(IfcElectricDistributionBoardTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcElectricDistributionBoardTypeEnum, 'NOTDEFINED', INDETERMINATE) +consumerunit = IfcElectricDistributionBoardTypeEnum.CONSUMERUNIT +distributionboard = IfcElectricDistributionBoardTypeEnum.DISTRIBUTIONBOARD +motorcontrolcentre = IfcElectricDistributionBoardTypeEnum.MOTORCONTROLCENTRE +switchboard = IfcElectricDistributionBoardTypeEnum.SWITCHBOARD +userdefined = IfcElectricDistributionBoardTypeEnum.USERDEFINED +notdefined = IfcElectricDistributionBoardTypeEnum.NOTDEFINED IfcElectricFlowStorageDeviceTypeEnum = enum_namespace() -battery = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'BATTERY', INDETERMINATE) -capacitor = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'CAPACITOR', INDETERMINATE) -capacitorbank = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'CAPACITORBANK', INDETERMINATE) -compensator = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'COMPENSATOR', INDETERMINATE) -harmonicfilter = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'HARMONICFILTER', INDETERMINATE) -inductor = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'INDUCTOR', INDETERMINATE) -inductorbank = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'INDUCTORBANK', INDETERMINATE) -recharger = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'RECHARGER', INDETERMINATE) -ups = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'UPS', INDETERMINATE) -userdefined = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'NOTDEFINED', INDETERMINATE) +battery = IfcElectricFlowStorageDeviceTypeEnum.BATTERY +capacitor = IfcElectricFlowStorageDeviceTypeEnum.CAPACITOR +capacitorbank = IfcElectricFlowStorageDeviceTypeEnum.CAPACITORBANK +compensator = IfcElectricFlowStorageDeviceTypeEnum.COMPENSATOR +harmonicfilter = IfcElectricFlowStorageDeviceTypeEnum.HARMONICFILTER +inductor = IfcElectricFlowStorageDeviceTypeEnum.INDUCTOR +inductorbank = IfcElectricFlowStorageDeviceTypeEnum.INDUCTORBANK +recharger = IfcElectricFlowStorageDeviceTypeEnum.RECHARGER +ups = IfcElectricFlowStorageDeviceTypeEnum.UPS +userdefined = IfcElectricFlowStorageDeviceTypeEnum.USERDEFINED +notdefined = IfcElectricFlowStorageDeviceTypeEnum.NOTDEFINED IfcElectricFlowTreatmentDeviceTypeEnum = enum_namespace() -electronicfilter = express_getattr(IfcElectricFlowTreatmentDeviceTypeEnum, 'ELECTRONICFILTER', INDETERMINATE) -userdefined = express_getattr(IfcElectricFlowTreatmentDeviceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcElectricFlowTreatmentDeviceTypeEnum, 'NOTDEFINED', INDETERMINATE) +electronicfilter = IfcElectricFlowTreatmentDeviceTypeEnum.ELECTRONICFILTER +userdefined = IfcElectricFlowTreatmentDeviceTypeEnum.USERDEFINED +notdefined = IfcElectricFlowTreatmentDeviceTypeEnum.NOTDEFINED IfcElectricGeneratorTypeEnum = enum_namespace() -chp = express_getattr(IfcElectricGeneratorTypeEnum, 'CHP', INDETERMINATE) -enginegenerator = express_getattr(IfcElectricGeneratorTypeEnum, 'ENGINEGENERATOR', INDETERMINATE) -standalone = express_getattr(IfcElectricGeneratorTypeEnum, 'STANDALONE', INDETERMINATE) -userdefined = express_getattr(IfcElectricGeneratorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcElectricGeneratorTypeEnum, 'NOTDEFINED', INDETERMINATE) +chp = IfcElectricGeneratorTypeEnum.CHP +enginegenerator = IfcElectricGeneratorTypeEnum.ENGINEGENERATOR +standalone = IfcElectricGeneratorTypeEnum.STANDALONE +userdefined = IfcElectricGeneratorTypeEnum.USERDEFINED +notdefined = IfcElectricGeneratorTypeEnum.NOTDEFINED IfcElectricMotorTypeEnum = enum_namespace() -dc = express_getattr(IfcElectricMotorTypeEnum, 'DC', INDETERMINATE) -induction = express_getattr(IfcElectricMotorTypeEnum, 'INDUCTION', INDETERMINATE) -polyphase = express_getattr(IfcElectricMotorTypeEnum, 'POLYPHASE', INDETERMINATE) -reluctancesynchronous = express_getattr(IfcElectricMotorTypeEnum, 'RELUCTANCESYNCHRONOUS', INDETERMINATE) -synchronous = express_getattr(IfcElectricMotorTypeEnum, 'SYNCHRONOUS', INDETERMINATE) -userdefined = express_getattr(IfcElectricMotorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcElectricMotorTypeEnum, 'NOTDEFINED', INDETERMINATE) +dc = IfcElectricMotorTypeEnum.DC +induction = IfcElectricMotorTypeEnum.INDUCTION +polyphase = IfcElectricMotorTypeEnum.POLYPHASE +reluctancesynchronous = IfcElectricMotorTypeEnum.RELUCTANCESYNCHRONOUS +synchronous = IfcElectricMotorTypeEnum.SYNCHRONOUS +userdefined = IfcElectricMotorTypeEnum.USERDEFINED +notdefined = IfcElectricMotorTypeEnum.NOTDEFINED IfcElectricTimeControlTypeEnum = enum_namespace() -relay = express_getattr(IfcElectricTimeControlTypeEnum, 'RELAY', INDETERMINATE) -timeclock = express_getattr(IfcElectricTimeControlTypeEnum, 'TIMECLOCK', INDETERMINATE) -timedelay = express_getattr(IfcElectricTimeControlTypeEnum, 'TIMEDELAY', INDETERMINATE) -userdefined = express_getattr(IfcElectricTimeControlTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcElectricTimeControlTypeEnum, 'NOTDEFINED', INDETERMINATE) +relay = IfcElectricTimeControlTypeEnum.RELAY +timeclock = IfcElectricTimeControlTypeEnum.TIMECLOCK +timedelay = IfcElectricTimeControlTypeEnum.TIMEDELAY +userdefined = IfcElectricTimeControlTypeEnum.USERDEFINED +notdefined = IfcElectricTimeControlTypeEnum.NOTDEFINED IfcElementAssemblyTypeEnum = enum_namespace() -abutment = express_getattr(IfcElementAssemblyTypeEnum, 'ABUTMENT', INDETERMINATE) -accessory_assembly = express_getattr(IfcElementAssemblyTypeEnum, 'ACCESSORY_ASSEMBLY', INDETERMINATE) -arch = express_getattr(IfcElementAssemblyTypeEnum, 'ARCH', INDETERMINATE) -beam_grid = express_getattr(IfcElementAssemblyTypeEnum, 'BEAM_GRID', INDETERMINATE) -braced_frame = express_getattr(IfcElementAssemblyTypeEnum, 'BRACED_FRAME', INDETERMINATE) -cross_bracing = express_getattr(IfcElementAssemblyTypeEnum, 'CROSS_BRACING', INDETERMINATE) -deck = express_getattr(IfcElementAssemblyTypeEnum, 'DECK', INDETERMINATE) -dilatationpanel = express_getattr(IfcElementAssemblyTypeEnum, 'DILATATIONPANEL', INDETERMINATE) -entranceworks = express_getattr(IfcElementAssemblyTypeEnum, 'ENTRANCEWORKS', INDETERMINATE) -girder = express_getattr(IfcElementAssemblyTypeEnum, 'GIRDER', INDETERMINATE) -grid = express_getattr(IfcElementAssemblyTypeEnum, 'GRID', INDETERMINATE) -mast = express_getattr(IfcElementAssemblyTypeEnum, 'MAST', INDETERMINATE) -pier = express_getattr(IfcElementAssemblyTypeEnum, 'PIER', INDETERMINATE) -pylon = express_getattr(IfcElementAssemblyTypeEnum, 'PYLON', INDETERMINATE) -rail_mechanical_equipment_assembly = express_getattr(IfcElementAssemblyTypeEnum, 'RAIL_MECHANICAL_EQUIPMENT_ASSEMBLY', INDETERMINATE) -reinforcement_unit = express_getattr(IfcElementAssemblyTypeEnum, 'REINFORCEMENT_UNIT', INDETERMINATE) -rigid_frame = express_getattr(IfcElementAssemblyTypeEnum, 'RIGID_FRAME', INDETERMINATE) -shelter = express_getattr(IfcElementAssemblyTypeEnum, 'SHELTER', INDETERMINATE) -signalassembly = express_getattr(IfcElementAssemblyTypeEnum, 'SIGNALASSEMBLY', INDETERMINATE) -slab_field = express_getattr(IfcElementAssemblyTypeEnum, 'SLAB_FIELD', INDETERMINATE) -sumpbuster = express_getattr(IfcElementAssemblyTypeEnum, 'SUMPBUSTER', INDETERMINATE) -supportingassembly = express_getattr(IfcElementAssemblyTypeEnum, 'SUPPORTINGASSEMBLY', INDETERMINATE) -suspensionassembly = express_getattr(IfcElementAssemblyTypeEnum, 'SUSPENSIONASSEMBLY', INDETERMINATE) -trackpanel = express_getattr(IfcElementAssemblyTypeEnum, 'TRACKPANEL', INDETERMINATE) -traction_switching_assembly = express_getattr(IfcElementAssemblyTypeEnum, 'TRACTION_SWITCHING_ASSEMBLY', INDETERMINATE) -traffic_calming_device = express_getattr(IfcElementAssemblyTypeEnum, 'TRAFFIC_CALMING_DEVICE', INDETERMINATE) -truss = express_getattr(IfcElementAssemblyTypeEnum, 'TRUSS', INDETERMINATE) -turnoutpanel = express_getattr(IfcElementAssemblyTypeEnum, 'TURNOUTPANEL', INDETERMINATE) -userdefined = express_getattr(IfcElementAssemblyTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcElementAssemblyTypeEnum, 'NOTDEFINED', INDETERMINATE) +abutment = IfcElementAssemblyTypeEnum.ABUTMENT +accessory_assembly = IfcElementAssemblyTypeEnum.ACCESSORY_ASSEMBLY +arch = IfcElementAssemblyTypeEnum.ARCH +beam_grid = IfcElementAssemblyTypeEnum.BEAM_GRID +braced_frame = IfcElementAssemblyTypeEnum.BRACED_FRAME +cross_bracing = IfcElementAssemblyTypeEnum.CROSS_BRACING +deck = IfcElementAssemblyTypeEnum.DECK +dilatationpanel = IfcElementAssemblyTypeEnum.DILATATIONPANEL +entranceworks = IfcElementAssemblyTypeEnum.ENTRANCEWORKS +girder = IfcElementAssemblyTypeEnum.GIRDER +grid = IfcElementAssemblyTypeEnum.GRID +mast = IfcElementAssemblyTypeEnum.MAST +pier = IfcElementAssemblyTypeEnum.PIER +pylon = IfcElementAssemblyTypeEnum.PYLON +rail_mechanical_equipment_assembly = IfcElementAssemblyTypeEnum.RAIL_MECHANICAL_EQUIPMENT_ASSEMBLY +reinforcement_unit = IfcElementAssemblyTypeEnum.REINFORCEMENT_UNIT +rigid_frame = IfcElementAssemblyTypeEnum.RIGID_FRAME +shelter = IfcElementAssemblyTypeEnum.SHELTER +signalassembly = IfcElementAssemblyTypeEnum.SIGNALASSEMBLY +slab_field = IfcElementAssemblyTypeEnum.SLAB_FIELD +sumpbuster = IfcElementAssemblyTypeEnum.SUMPBUSTER +supportingassembly = IfcElementAssemblyTypeEnum.SUPPORTINGASSEMBLY +suspensionassembly = IfcElementAssemblyTypeEnum.SUSPENSIONASSEMBLY +trackpanel = IfcElementAssemblyTypeEnum.TRACKPANEL +traction_switching_assembly = IfcElementAssemblyTypeEnum.TRACTION_SWITCHING_ASSEMBLY +traffic_calming_device = IfcElementAssemblyTypeEnum.TRAFFIC_CALMING_DEVICE +truss = IfcElementAssemblyTypeEnum.TRUSS +turnoutpanel = IfcElementAssemblyTypeEnum.TURNOUTPANEL +userdefined = IfcElementAssemblyTypeEnum.USERDEFINED +notdefined = IfcElementAssemblyTypeEnum.NOTDEFINED IfcElementCompositionEnum = enum_namespace() -complex = express_getattr(IfcElementCompositionEnum, 'COMPLEX', INDETERMINATE) -element = express_getattr(IfcElementCompositionEnum, 'ELEMENT', INDETERMINATE) -partial = express_getattr(IfcElementCompositionEnum, 'PARTIAL', INDETERMINATE) +complex = IfcElementCompositionEnum.COMPLEX +element = IfcElementCompositionEnum.ELEMENT +partial = IfcElementCompositionEnum.PARTIAL IfcEngineTypeEnum = enum_namespace() -externalcombustion = express_getattr(IfcEngineTypeEnum, 'EXTERNALCOMBUSTION', INDETERMINATE) -internalcombustion = express_getattr(IfcEngineTypeEnum, 'INTERNALCOMBUSTION', INDETERMINATE) -userdefined = express_getattr(IfcEngineTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcEngineTypeEnum, 'NOTDEFINED', INDETERMINATE) +externalcombustion = IfcEngineTypeEnum.EXTERNALCOMBUSTION +internalcombustion = IfcEngineTypeEnum.INTERNALCOMBUSTION +userdefined = IfcEngineTypeEnum.USERDEFINED +notdefined = IfcEngineTypeEnum.NOTDEFINED IfcEvaporativeCoolerTypeEnum = enum_namespace() -directevaporativeairwasher = express_getattr(IfcEvaporativeCoolerTypeEnum, 'DIRECTEVAPORATIVEAIRWASHER', INDETERMINATE) -directevaporativepackagedrotaryaircooler = express_getattr(IfcEvaporativeCoolerTypeEnum, 'DIRECTEVAPORATIVEPACKAGEDROTARYAIRCOOLER', INDETERMINATE) -directevaporativerandommediaaircooler = express_getattr(IfcEvaporativeCoolerTypeEnum, 'DIRECTEVAPORATIVERANDOMMEDIAAIRCOOLER', INDETERMINATE) -directevaporativerigidmediaaircooler = express_getattr(IfcEvaporativeCoolerTypeEnum, 'DIRECTEVAPORATIVERIGIDMEDIAAIRCOOLER', INDETERMINATE) -directevaporativeslingerspackagedaircooler = express_getattr(IfcEvaporativeCoolerTypeEnum, 'DIRECTEVAPORATIVESLINGERSPACKAGEDAIRCOOLER', INDETERMINATE) -indirectdirectcombination = express_getattr(IfcEvaporativeCoolerTypeEnum, 'INDIRECTDIRECTCOMBINATION', INDETERMINATE) -indirectevaporativecoolingtowerorcoilcooler = express_getattr(IfcEvaporativeCoolerTypeEnum, 'INDIRECTEVAPORATIVECOOLINGTOWERORCOILCOOLER', INDETERMINATE) -indirectevaporativepackageaircooler = express_getattr(IfcEvaporativeCoolerTypeEnum, 'INDIRECTEVAPORATIVEPACKAGEAIRCOOLER', INDETERMINATE) -indirectevaporativewetcoil = express_getattr(IfcEvaporativeCoolerTypeEnum, 'INDIRECTEVAPORATIVEWETCOIL', INDETERMINATE) -userdefined = express_getattr(IfcEvaporativeCoolerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcEvaporativeCoolerTypeEnum, 'NOTDEFINED', INDETERMINATE) +directevaporativeairwasher = IfcEvaporativeCoolerTypeEnum.DIRECTEVAPORATIVEAIRWASHER +directevaporativepackagedrotaryaircooler = IfcEvaporativeCoolerTypeEnum.DIRECTEVAPORATIVEPACKAGEDROTARYAIRCOOLER +directevaporativerandommediaaircooler = IfcEvaporativeCoolerTypeEnum.DIRECTEVAPORATIVERANDOMMEDIAAIRCOOLER +directevaporativerigidmediaaircooler = IfcEvaporativeCoolerTypeEnum.DIRECTEVAPORATIVERIGIDMEDIAAIRCOOLER +directevaporativeslingerspackagedaircooler = IfcEvaporativeCoolerTypeEnum.DIRECTEVAPORATIVESLINGERSPACKAGEDAIRCOOLER +indirectdirectcombination = IfcEvaporativeCoolerTypeEnum.INDIRECTDIRECTCOMBINATION +indirectevaporativecoolingtowerorcoilcooler = IfcEvaporativeCoolerTypeEnum.INDIRECTEVAPORATIVECOOLINGTOWERORCOILCOOLER +indirectevaporativepackageaircooler = IfcEvaporativeCoolerTypeEnum.INDIRECTEVAPORATIVEPACKAGEAIRCOOLER +indirectevaporativewetcoil = IfcEvaporativeCoolerTypeEnum.INDIRECTEVAPORATIVEWETCOIL +userdefined = IfcEvaporativeCoolerTypeEnum.USERDEFINED +notdefined = IfcEvaporativeCoolerTypeEnum.NOTDEFINED IfcEvaporatorTypeEnum = enum_namespace() -directexpansion = express_getattr(IfcEvaporatorTypeEnum, 'DIRECTEXPANSION', INDETERMINATE) -directexpansionbrazedplate = express_getattr(IfcEvaporatorTypeEnum, 'DIRECTEXPANSIONBRAZEDPLATE', INDETERMINATE) -directexpansionshellandtube = express_getattr(IfcEvaporatorTypeEnum, 'DIRECTEXPANSIONSHELLANDTUBE', INDETERMINATE) -directexpansiontubeintube = express_getattr(IfcEvaporatorTypeEnum, 'DIRECTEXPANSIONTUBEINTUBE', INDETERMINATE) -floodedshellandtube = express_getattr(IfcEvaporatorTypeEnum, 'FLOODEDSHELLANDTUBE', INDETERMINATE) -shellandcoil = express_getattr(IfcEvaporatorTypeEnum, 'SHELLANDCOIL', INDETERMINATE) -userdefined = express_getattr(IfcEvaporatorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcEvaporatorTypeEnum, 'NOTDEFINED', INDETERMINATE) +directexpansion = IfcEvaporatorTypeEnum.DIRECTEXPANSION +directexpansionbrazedplate = IfcEvaporatorTypeEnum.DIRECTEXPANSIONBRAZEDPLATE +directexpansionshellandtube = IfcEvaporatorTypeEnum.DIRECTEXPANSIONSHELLANDTUBE +directexpansiontubeintube = IfcEvaporatorTypeEnum.DIRECTEXPANSIONTUBEINTUBE +floodedshellandtube = IfcEvaporatorTypeEnum.FLOODEDSHELLANDTUBE +shellandcoil = IfcEvaporatorTypeEnum.SHELLANDCOIL +userdefined = IfcEvaporatorTypeEnum.USERDEFINED +notdefined = IfcEvaporatorTypeEnum.NOTDEFINED IfcEventTriggerTypeEnum = enum_namespace() -eventcomplex = express_getattr(IfcEventTriggerTypeEnum, 'EVENTCOMPLEX', INDETERMINATE) -eventmessage = express_getattr(IfcEventTriggerTypeEnum, 'EVENTMESSAGE', INDETERMINATE) -eventrule = express_getattr(IfcEventTriggerTypeEnum, 'EVENTRULE', INDETERMINATE) -eventtime = express_getattr(IfcEventTriggerTypeEnum, 'EVENTTIME', INDETERMINATE) -userdefined = express_getattr(IfcEventTriggerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcEventTriggerTypeEnum, 'NOTDEFINED', INDETERMINATE) +eventcomplex = IfcEventTriggerTypeEnum.EVENTCOMPLEX +eventmessage = IfcEventTriggerTypeEnum.EVENTMESSAGE +eventrule = IfcEventTriggerTypeEnum.EVENTRULE +eventtime = IfcEventTriggerTypeEnum.EVENTTIME +userdefined = IfcEventTriggerTypeEnum.USERDEFINED +notdefined = IfcEventTriggerTypeEnum.NOTDEFINED IfcEventTypeEnum = enum_namespace() -endevent = express_getattr(IfcEventTypeEnum, 'ENDEVENT', INDETERMINATE) -intermediateevent = express_getattr(IfcEventTypeEnum, 'INTERMEDIATEEVENT', INDETERMINATE) -startevent = express_getattr(IfcEventTypeEnum, 'STARTEVENT', INDETERMINATE) -userdefined = express_getattr(IfcEventTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcEventTypeEnum, 'NOTDEFINED', INDETERMINATE) +endevent = IfcEventTypeEnum.ENDEVENT +intermediateevent = IfcEventTypeEnum.INTERMEDIATEEVENT +startevent = IfcEventTypeEnum.STARTEVENT +userdefined = IfcEventTypeEnum.USERDEFINED +notdefined = IfcEventTypeEnum.NOTDEFINED IfcExternalSpatialElementTypeEnum = enum_namespace() -external = express_getattr(IfcExternalSpatialElementTypeEnum, 'EXTERNAL', INDETERMINATE) -external_earth = express_getattr(IfcExternalSpatialElementTypeEnum, 'EXTERNAL_EARTH', INDETERMINATE) -external_fire = express_getattr(IfcExternalSpatialElementTypeEnum, 'EXTERNAL_FIRE', INDETERMINATE) -external_water = express_getattr(IfcExternalSpatialElementTypeEnum, 'EXTERNAL_WATER', INDETERMINATE) -userdefined = express_getattr(IfcExternalSpatialElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcExternalSpatialElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +external = IfcExternalSpatialElementTypeEnum.EXTERNAL +external_earth = IfcExternalSpatialElementTypeEnum.EXTERNAL_EARTH +external_fire = IfcExternalSpatialElementTypeEnum.EXTERNAL_FIRE +external_water = IfcExternalSpatialElementTypeEnum.EXTERNAL_WATER +userdefined = IfcExternalSpatialElementTypeEnum.USERDEFINED +notdefined = IfcExternalSpatialElementTypeEnum.NOTDEFINED IfcFacilityPartCommonTypeEnum = enum_namespace() -aboveground = express_getattr(IfcFacilityPartCommonTypeEnum, 'ABOVEGROUND', INDETERMINATE) -belowground = express_getattr(IfcFacilityPartCommonTypeEnum, 'BELOWGROUND', INDETERMINATE) -junction = express_getattr(IfcFacilityPartCommonTypeEnum, 'JUNCTION', INDETERMINATE) -levelcrossing = express_getattr(IfcFacilityPartCommonTypeEnum, 'LEVELCROSSING', INDETERMINATE) -segment = express_getattr(IfcFacilityPartCommonTypeEnum, 'SEGMENT', INDETERMINATE) -substructure = express_getattr(IfcFacilityPartCommonTypeEnum, 'SUBSTRUCTURE', INDETERMINATE) -superstructure = express_getattr(IfcFacilityPartCommonTypeEnum, 'SUPERSTRUCTURE', INDETERMINATE) -terminal = express_getattr(IfcFacilityPartCommonTypeEnum, 'TERMINAL', INDETERMINATE) -userdefined = express_getattr(IfcFacilityPartCommonTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFacilityPartCommonTypeEnum, 'NOTDEFINED', INDETERMINATE) +aboveground = IfcFacilityPartCommonTypeEnum.ABOVEGROUND +belowground = IfcFacilityPartCommonTypeEnum.BELOWGROUND +junction = IfcFacilityPartCommonTypeEnum.JUNCTION +levelcrossing = IfcFacilityPartCommonTypeEnum.LEVELCROSSING +segment = IfcFacilityPartCommonTypeEnum.SEGMENT +substructure = IfcFacilityPartCommonTypeEnum.SUBSTRUCTURE +superstructure = IfcFacilityPartCommonTypeEnum.SUPERSTRUCTURE +terminal = IfcFacilityPartCommonTypeEnum.TERMINAL +userdefined = IfcFacilityPartCommonTypeEnum.USERDEFINED +notdefined = IfcFacilityPartCommonTypeEnum.NOTDEFINED IfcFacilityUsageEnum = enum_namespace() -lateral = express_getattr(IfcFacilityUsageEnum, 'LATERAL', INDETERMINATE) -longitudinal = express_getattr(IfcFacilityUsageEnum, 'LONGITUDINAL', INDETERMINATE) -region = express_getattr(IfcFacilityUsageEnum, 'REGION', INDETERMINATE) -vertical = express_getattr(IfcFacilityUsageEnum, 'VERTICAL', INDETERMINATE) -userdefined = express_getattr(IfcFacilityUsageEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFacilityUsageEnum, 'NOTDEFINED', INDETERMINATE) +lateral = IfcFacilityUsageEnum.LATERAL +longitudinal = IfcFacilityUsageEnum.LONGITUDINAL +region = IfcFacilityUsageEnum.REGION +vertical = IfcFacilityUsageEnum.VERTICAL +userdefined = IfcFacilityUsageEnum.USERDEFINED +notdefined = IfcFacilityUsageEnum.NOTDEFINED IfcFanTypeEnum = enum_namespace() -centrifugalairfoil = express_getattr(IfcFanTypeEnum, 'CENTRIFUGALAIRFOIL', INDETERMINATE) -centrifugalbackwardinclinedcurved = express_getattr(IfcFanTypeEnum, 'CENTRIFUGALBACKWARDINCLINEDCURVED', INDETERMINATE) -centrifugalforwardcurved = express_getattr(IfcFanTypeEnum, 'CENTRIFUGALFORWARDCURVED', INDETERMINATE) -centrifugalradial = express_getattr(IfcFanTypeEnum, 'CENTRIFUGALRADIAL', INDETERMINATE) -propelloraxial = express_getattr(IfcFanTypeEnum, 'PROPELLORAXIAL', INDETERMINATE) -tubeaxial = express_getattr(IfcFanTypeEnum, 'TUBEAXIAL', INDETERMINATE) -vaneaxial = express_getattr(IfcFanTypeEnum, 'VANEAXIAL', INDETERMINATE) -userdefined = express_getattr(IfcFanTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFanTypeEnum, 'NOTDEFINED', INDETERMINATE) +centrifugalairfoil = IfcFanTypeEnum.CENTRIFUGALAIRFOIL +centrifugalbackwardinclinedcurved = IfcFanTypeEnum.CENTRIFUGALBACKWARDINCLINEDCURVED +centrifugalforwardcurved = IfcFanTypeEnum.CENTRIFUGALFORWARDCURVED +centrifugalradial = IfcFanTypeEnum.CENTRIFUGALRADIAL +propelloraxial = IfcFanTypeEnum.PROPELLORAXIAL +tubeaxial = IfcFanTypeEnum.TUBEAXIAL +vaneaxial = IfcFanTypeEnum.VANEAXIAL +userdefined = IfcFanTypeEnum.USERDEFINED +notdefined = IfcFanTypeEnum.NOTDEFINED IfcFastenerTypeEnum = enum_namespace() -glue = express_getattr(IfcFastenerTypeEnum, 'GLUE', INDETERMINATE) -mortar = express_getattr(IfcFastenerTypeEnum, 'MORTAR', INDETERMINATE) -weld = express_getattr(IfcFastenerTypeEnum, 'WELD', INDETERMINATE) -userdefined = express_getattr(IfcFastenerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFastenerTypeEnum, 'NOTDEFINED', INDETERMINATE) +glue = IfcFastenerTypeEnum.GLUE +mortar = IfcFastenerTypeEnum.MORTAR +weld = IfcFastenerTypeEnum.WELD +userdefined = IfcFastenerTypeEnum.USERDEFINED +notdefined = IfcFastenerTypeEnum.NOTDEFINED IfcFilterTypeEnum = enum_namespace() -airparticlefilter = express_getattr(IfcFilterTypeEnum, 'AIRPARTICLEFILTER', INDETERMINATE) -compressedairfilter = express_getattr(IfcFilterTypeEnum, 'COMPRESSEDAIRFILTER', INDETERMINATE) -odorfilter = express_getattr(IfcFilterTypeEnum, 'ODORFILTER', INDETERMINATE) -oilfilter = express_getattr(IfcFilterTypeEnum, 'OILFILTER', INDETERMINATE) -strainer = express_getattr(IfcFilterTypeEnum, 'STRAINER', INDETERMINATE) -waterfilter = express_getattr(IfcFilterTypeEnum, 'WATERFILTER', INDETERMINATE) -userdefined = express_getattr(IfcFilterTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFilterTypeEnum, 'NOTDEFINED', INDETERMINATE) +airparticlefilter = IfcFilterTypeEnum.AIRPARTICLEFILTER +compressedairfilter = IfcFilterTypeEnum.COMPRESSEDAIRFILTER +odorfilter = IfcFilterTypeEnum.ODORFILTER +oilfilter = IfcFilterTypeEnum.OILFILTER +strainer = IfcFilterTypeEnum.STRAINER +waterfilter = IfcFilterTypeEnum.WATERFILTER +userdefined = IfcFilterTypeEnum.USERDEFINED +notdefined = IfcFilterTypeEnum.NOTDEFINED IfcFireSuppressionTerminalTypeEnum = enum_namespace() -breechinginlet = express_getattr(IfcFireSuppressionTerminalTypeEnum, 'BREECHINGINLET', INDETERMINATE) -firehydrant = express_getattr(IfcFireSuppressionTerminalTypeEnum, 'FIREHYDRANT', INDETERMINATE) -firemonitor = express_getattr(IfcFireSuppressionTerminalTypeEnum, 'FIREMONITOR', INDETERMINATE) -hosereel = express_getattr(IfcFireSuppressionTerminalTypeEnum, 'HOSEREEL', INDETERMINATE) -sprinkler = express_getattr(IfcFireSuppressionTerminalTypeEnum, 'SPRINKLER', INDETERMINATE) -sprinklerdeflector = express_getattr(IfcFireSuppressionTerminalTypeEnum, 'SPRINKLERDEFLECTOR', INDETERMINATE) -userdefined = express_getattr(IfcFireSuppressionTerminalTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFireSuppressionTerminalTypeEnum, 'NOTDEFINED', INDETERMINATE) +breechinginlet = IfcFireSuppressionTerminalTypeEnum.BREECHINGINLET +firehydrant = IfcFireSuppressionTerminalTypeEnum.FIREHYDRANT +firemonitor = IfcFireSuppressionTerminalTypeEnum.FIREMONITOR +hosereel = IfcFireSuppressionTerminalTypeEnum.HOSEREEL +sprinkler = IfcFireSuppressionTerminalTypeEnum.SPRINKLER +sprinklerdeflector = IfcFireSuppressionTerminalTypeEnum.SPRINKLERDEFLECTOR +userdefined = IfcFireSuppressionTerminalTypeEnum.USERDEFINED +notdefined = IfcFireSuppressionTerminalTypeEnum.NOTDEFINED IfcFlowDirectionEnum = enum_namespace() -sink = express_getattr(IfcFlowDirectionEnum, 'SINK', INDETERMINATE) -source = express_getattr(IfcFlowDirectionEnum, 'SOURCE', INDETERMINATE) -sourceandsink = express_getattr(IfcFlowDirectionEnum, 'SOURCEANDSINK', INDETERMINATE) -notdefined = express_getattr(IfcFlowDirectionEnum, 'NOTDEFINED', INDETERMINATE) +sink = IfcFlowDirectionEnum.SINK +source = IfcFlowDirectionEnum.SOURCE +sourceandsink = IfcFlowDirectionEnum.SOURCEANDSINK +notdefined = IfcFlowDirectionEnum.NOTDEFINED IfcFlowInstrumentTypeEnum = enum_namespace() -ammeter = express_getattr(IfcFlowInstrumentTypeEnum, 'AMMETER', INDETERMINATE) -combined = express_getattr(IfcFlowInstrumentTypeEnum, 'COMBINED', INDETERMINATE) -frequencymeter = express_getattr(IfcFlowInstrumentTypeEnum, 'FREQUENCYMETER', INDETERMINATE) -phaseanglemeter = express_getattr(IfcFlowInstrumentTypeEnum, 'PHASEANGLEMETER', INDETERMINATE) -powerfactormeter = express_getattr(IfcFlowInstrumentTypeEnum, 'POWERFACTORMETER', INDETERMINATE) -pressuregauge = express_getattr(IfcFlowInstrumentTypeEnum, 'PRESSUREGAUGE', INDETERMINATE) -thermometer = express_getattr(IfcFlowInstrumentTypeEnum, 'THERMOMETER', INDETERMINATE) -voltmeter = express_getattr(IfcFlowInstrumentTypeEnum, 'VOLTMETER', INDETERMINATE) -voltmeter_peak = express_getattr(IfcFlowInstrumentTypeEnum, 'VOLTMETER_PEAK', INDETERMINATE) -voltmeter_rms = express_getattr(IfcFlowInstrumentTypeEnum, 'VOLTMETER_RMS', INDETERMINATE) -userdefined = express_getattr(IfcFlowInstrumentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFlowInstrumentTypeEnum, 'NOTDEFINED', INDETERMINATE) +ammeter = IfcFlowInstrumentTypeEnum.AMMETER +combined = IfcFlowInstrumentTypeEnum.COMBINED +frequencymeter = IfcFlowInstrumentTypeEnum.FREQUENCYMETER +phaseanglemeter = IfcFlowInstrumentTypeEnum.PHASEANGLEMETER +powerfactormeter = IfcFlowInstrumentTypeEnum.POWERFACTORMETER +pressuregauge = IfcFlowInstrumentTypeEnum.PRESSUREGAUGE +thermometer = IfcFlowInstrumentTypeEnum.THERMOMETER +voltmeter = IfcFlowInstrumentTypeEnum.VOLTMETER +voltmeter_peak = IfcFlowInstrumentTypeEnum.VOLTMETER_PEAK +voltmeter_rms = IfcFlowInstrumentTypeEnum.VOLTMETER_RMS +userdefined = IfcFlowInstrumentTypeEnum.USERDEFINED +notdefined = IfcFlowInstrumentTypeEnum.NOTDEFINED IfcFlowMeterTypeEnum = enum_namespace() -energymeter = express_getattr(IfcFlowMeterTypeEnum, 'ENERGYMETER', INDETERMINATE) -gasmeter = express_getattr(IfcFlowMeterTypeEnum, 'GASMETER', INDETERMINATE) -oilmeter = express_getattr(IfcFlowMeterTypeEnum, 'OILMETER', INDETERMINATE) -watermeter = express_getattr(IfcFlowMeterTypeEnum, 'WATERMETER', INDETERMINATE) -userdefined = express_getattr(IfcFlowMeterTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFlowMeterTypeEnum, 'NOTDEFINED', INDETERMINATE) +energymeter = IfcFlowMeterTypeEnum.ENERGYMETER +gasmeter = IfcFlowMeterTypeEnum.GASMETER +oilmeter = IfcFlowMeterTypeEnum.OILMETER +watermeter = IfcFlowMeterTypeEnum.WATERMETER +userdefined = IfcFlowMeterTypeEnum.USERDEFINED +notdefined = IfcFlowMeterTypeEnum.NOTDEFINED IfcFootingTypeEnum = enum_namespace() -caisson_foundation = express_getattr(IfcFootingTypeEnum, 'CAISSON_FOUNDATION', INDETERMINATE) -footing_beam = express_getattr(IfcFootingTypeEnum, 'FOOTING_BEAM', INDETERMINATE) -pad_footing = express_getattr(IfcFootingTypeEnum, 'PAD_FOOTING', INDETERMINATE) -pile_cap = express_getattr(IfcFootingTypeEnum, 'PILE_CAP', INDETERMINATE) -strip_footing = express_getattr(IfcFootingTypeEnum, 'STRIP_FOOTING', INDETERMINATE) -userdefined = express_getattr(IfcFootingTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFootingTypeEnum, 'NOTDEFINED', INDETERMINATE) +caisson_foundation = IfcFootingTypeEnum.CAISSON_FOUNDATION +footing_beam = IfcFootingTypeEnum.FOOTING_BEAM +pad_footing = IfcFootingTypeEnum.PAD_FOOTING +pile_cap = IfcFootingTypeEnum.PILE_CAP +strip_footing = IfcFootingTypeEnum.STRIP_FOOTING +userdefined = IfcFootingTypeEnum.USERDEFINED +notdefined = IfcFootingTypeEnum.NOTDEFINED IfcFurnitureTypeEnum = enum_namespace() -bed = express_getattr(IfcFurnitureTypeEnum, 'BED', INDETERMINATE) -chair = express_getattr(IfcFurnitureTypeEnum, 'CHAIR', INDETERMINATE) -desk = express_getattr(IfcFurnitureTypeEnum, 'DESK', INDETERMINATE) -filecabinet = express_getattr(IfcFurnitureTypeEnum, 'FILECABINET', INDETERMINATE) -shelf = express_getattr(IfcFurnitureTypeEnum, 'SHELF', INDETERMINATE) -sofa = express_getattr(IfcFurnitureTypeEnum, 'SOFA', INDETERMINATE) -table = express_getattr(IfcFurnitureTypeEnum, 'TABLE', INDETERMINATE) -technicalcabinet = express_getattr(IfcFurnitureTypeEnum, 'TECHNICALCABINET', INDETERMINATE) -userdefined = express_getattr(IfcFurnitureTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFurnitureTypeEnum, 'NOTDEFINED', INDETERMINATE) +bed = IfcFurnitureTypeEnum.BED +chair = IfcFurnitureTypeEnum.CHAIR +desk = IfcFurnitureTypeEnum.DESK +filecabinet = IfcFurnitureTypeEnum.FILECABINET +shelf = IfcFurnitureTypeEnum.SHELF +sofa = IfcFurnitureTypeEnum.SOFA +table = IfcFurnitureTypeEnum.TABLE +technicalcabinet = IfcFurnitureTypeEnum.TECHNICALCABINET +userdefined = IfcFurnitureTypeEnum.USERDEFINED +notdefined = IfcFurnitureTypeEnum.NOTDEFINED IfcGeographicElementTypeEnum = enum_namespace() -soil_boring_point = express_getattr(IfcGeographicElementTypeEnum, 'SOIL_BORING_POINT', INDETERMINATE) -terrain = express_getattr(IfcGeographicElementTypeEnum, 'TERRAIN', INDETERMINATE) -vegetation = express_getattr(IfcGeographicElementTypeEnum, 'VEGETATION', INDETERMINATE) -userdefined = express_getattr(IfcGeographicElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcGeographicElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +soil_boring_point = IfcGeographicElementTypeEnum.SOIL_BORING_POINT +terrain = IfcGeographicElementTypeEnum.TERRAIN +vegetation = IfcGeographicElementTypeEnum.VEGETATION +userdefined = IfcGeographicElementTypeEnum.USERDEFINED +notdefined = IfcGeographicElementTypeEnum.NOTDEFINED IfcGeometricProjectionEnum = enum_namespace() -elevation_view = express_getattr(IfcGeometricProjectionEnum, 'ELEVATION_VIEW', INDETERMINATE) -graph_view = express_getattr(IfcGeometricProjectionEnum, 'GRAPH_VIEW', INDETERMINATE) -model_view = express_getattr(IfcGeometricProjectionEnum, 'MODEL_VIEW', INDETERMINATE) -plan_view = express_getattr(IfcGeometricProjectionEnum, 'PLAN_VIEW', INDETERMINATE) -reflected_plan_view = express_getattr(IfcGeometricProjectionEnum, 'REFLECTED_PLAN_VIEW', INDETERMINATE) -section_view = express_getattr(IfcGeometricProjectionEnum, 'SECTION_VIEW', INDETERMINATE) -sketch_view = express_getattr(IfcGeometricProjectionEnum, 'SKETCH_VIEW', INDETERMINATE) -userdefined = express_getattr(IfcGeometricProjectionEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcGeometricProjectionEnum, 'NOTDEFINED', INDETERMINATE) +elevation_view = IfcGeometricProjectionEnum.ELEVATION_VIEW +graph_view = IfcGeometricProjectionEnum.GRAPH_VIEW +model_view = IfcGeometricProjectionEnum.MODEL_VIEW +plan_view = IfcGeometricProjectionEnum.PLAN_VIEW +reflected_plan_view = IfcGeometricProjectionEnum.REFLECTED_PLAN_VIEW +section_view = IfcGeometricProjectionEnum.SECTION_VIEW +sketch_view = IfcGeometricProjectionEnum.SKETCH_VIEW +userdefined = IfcGeometricProjectionEnum.USERDEFINED +notdefined = IfcGeometricProjectionEnum.NOTDEFINED IfcGeotechnicalStratumTypeEnum = enum_namespace() -solid = express_getattr(IfcGeotechnicalStratumTypeEnum, 'SOLID', INDETERMINATE) -void = express_getattr(IfcGeotechnicalStratumTypeEnum, 'VOID', INDETERMINATE) -water = express_getattr(IfcGeotechnicalStratumTypeEnum, 'WATER', INDETERMINATE) -userdefined = express_getattr(IfcGeotechnicalStratumTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcGeotechnicalStratumTypeEnum, 'NOTDEFINED', INDETERMINATE) +solid = IfcGeotechnicalStratumTypeEnum.SOLID +void = IfcGeotechnicalStratumTypeEnum.VOID +water = IfcGeotechnicalStratumTypeEnum.WATER +userdefined = IfcGeotechnicalStratumTypeEnum.USERDEFINED +notdefined = IfcGeotechnicalStratumTypeEnum.NOTDEFINED IfcGlobalOrLocalEnum = enum_namespace() -global_coords = express_getattr(IfcGlobalOrLocalEnum, 'GLOBAL_COORDS', INDETERMINATE) -local_coords = express_getattr(IfcGlobalOrLocalEnum, 'LOCAL_COORDS', INDETERMINATE) +global_coords = IfcGlobalOrLocalEnum.GLOBAL_COORDS +local_coords = IfcGlobalOrLocalEnum.LOCAL_COORDS IfcGridTypeEnum = enum_namespace() -irregular = express_getattr(IfcGridTypeEnum, 'IRREGULAR', INDETERMINATE) -radial = express_getattr(IfcGridTypeEnum, 'RADIAL', INDETERMINATE) -rectangular = express_getattr(IfcGridTypeEnum, 'RECTANGULAR', INDETERMINATE) -triangular = express_getattr(IfcGridTypeEnum, 'TRIANGULAR', INDETERMINATE) -userdefined = express_getattr(IfcGridTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcGridTypeEnum, 'NOTDEFINED', INDETERMINATE) +irregular = IfcGridTypeEnum.IRREGULAR +radial = IfcGridTypeEnum.RADIAL +rectangular = IfcGridTypeEnum.RECTANGULAR +triangular = IfcGridTypeEnum.TRIANGULAR +userdefined = IfcGridTypeEnum.USERDEFINED +notdefined = IfcGridTypeEnum.NOTDEFINED IfcHeatExchangerTypeEnum = enum_namespace() -plate = express_getattr(IfcHeatExchangerTypeEnum, 'PLATE', INDETERMINATE) -shellandtube = express_getattr(IfcHeatExchangerTypeEnum, 'SHELLANDTUBE', INDETERMINATE) -turnoutheating = express_getattr(IfcHeatExchangerTypeEnum, 'TURNOUTHEATING', INDETERMINATE) -userdefined = express_getattr(IfcHeatExchangerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcHeatExchangerTypeEnum, 'NOTDEFINED', INDETERMINATE) +plate = IfcHeatExchangerTypeEnum.PLATE +shellandtube = IfcHeatExchangerTypeEnum.SHELLANDTUBE +turnoutheating = IfcHeatExchangerTypeEnum.TURNOUTHEATING +userdefined = IfcHeatExchangerTypeEnum.USERDEFINED +notdefined = IfcHeatExchangerTypeEnum.NOTDEFINED IfcHumidifierTypeEnum = enum_namespace() -adiabaticairwasher = express_getattr(IfcHumidifierTypeEnum, 'ADIABATICAIRWASHER', INDETERMINATE) -adiabaticatomizing = express_getattr(IfcHumidifierTypeEnum, 'ADIABATICATOMIZING', INDETERMINATE) -adiabaticcompressedairnozzle = express_getattr(IfcHumidifierTypeEnum, 'ADIABATICCOMPRESSEDAIRNOZZLE', INDETERMINATE) -adiabaticpan = express_getattr(IfcHumidifierTypeEnum, 'ADIABATICPAN', INDETERMINATE) -adiabaticrigidmedia = express_getattr(IfcHumidifierTypeEnum, 'ADIABATICRIGIDMEDIA', INDETERMINATE) -adiabaticultrasonic = express_getattr(IfcHumidifierTypeEnum, 'ADIABATICULTRASONIC', INDETERMINATE) -adiabaticwettedelement = express_getattr(IfcHumidifierTypeEnum, 'ADIABATICWETTEDELEMENT', INDETERMINATE) -assistedbutane = express_getattr(IfcHumidifierTypeEnum, 'ASSISTEDBUTANE', INDETERMINATE) -assistedelectric = express_getattr(IfcHumidifierTypeEnum, 'ASSISTEDELECTRIC', INDETERMINATE) -assistednaturalgas = express_getattr(IfcHumidifierTypeEnum, 'ASSISTEDNATURALGAS', INDETERMINATE) -assistedpropane = express_getattr(IfcHumidifierTypeEnum, 'ASSISTEDPROPANE', INDETERMINATE) -assistedsteam = express_getattr(IfcHumidifierTypeEnum, 'ASSISTEDSTEAM', INDETERMINATE) -steaminjection = express_getattr(IfcHumidifierTypeEnum, 'STEAMINJECTION', INDETERMINATE) -userdefined = express_getattr(IfcHumidifierTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcHumidifierTypeEnum, 'NOTDEFINED', INDETERMINATE) +adiabaticairwasher = IfcHumidifierTypeEnum.ADIABATICAIRWASHER +adiabaticatomizing = IfcHumidifierTypeEnum.ADIABATICATOMIZING +adiabaticcompressedairnozzle = IfcHumidifierTypeEnum.ADIABATICCOMPRESSEDAIRNOZZLE +adiabaticpan = IfcHumidifierTypeEnum.ADIABATICPAN +adiabaticrigidmedia = IfcHumidifierTypeEnum.ADIABATICRIGIDMEDIA +adiabaticultrasonic = IfcHumidifierTypeEnum.ADIABATICULTRASONIC +adiabaticwettedelement = IfcHumidifierTypeEnum.ADIABATICWETTEDELEMENT +assistedbutane = IfcHumidifierTypeEnum.ASSISTEDBUTANE +assistedelectric = IfcHumidifierTypeEnum.ASSISTEDELECTRIC +assistednaturalgas = IfcHumidifierTypeEnum.ASSISTEDNATURALGAS +assistedpropane = IfcHumidifierTypeEnum.ASSISTEDPROPANE +assistedsteam = IfcHumidifierTypeEnum.ASSISTEDSTEAM +steaminjection = IfcHumidifierTypeEnum.STEAMINJECTION +userdefined = IfcHumidifierTypeEnum.USERDEFINED +notdefined = IfcHumidifierTypeEnum.NOTDEFINED IfcImpactProtectionDeviceTypeEnum = enum_namespace() -bumper = express_getattr(IfcImpactProtectionDeviceTypeEnum, 'BUMPER', INDETERMINATE) -crashcushion = express_getattr(IfcImpactProtectionDeviceTypeEnum, 'CRASHCUSHION', INDETERMINATE) -dampingsystem = express_getattr(IfcImpactProtectionDeviceTypeEnum, 'DAMPINGSYSTEM', INDETERMINATE) -fender = express_getattr(IfcImpactProtectionDeviceTypeEnum, 'FENDER', INDETERMINATE) -userdefined = express_getattr(IfcImpactProtectionDeviceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcImpactProtectionDeviceTypeEnum, 'NOTDEFINED', INDETERMINATE) +bumper = IfcImpactProtectionDeviceTypeEnum.BUMPER +crashcushion = IfcImpactProtectionDeviceTypeEnum.CRASHCUSHION +dampingsystem = IfcImpactProtectionDeviceTypeEnum.DAMPINGSYSTEM +fender = IfcImpactProtectionDeviceTypeEnum.FENDER +userdefined = IfcImpactProtectionDeviceTypeEnum.USERDEFINED +notdefined = IfcImpactProtectionDeviceTypeEnum.NOTDEFINED IfcInterceptorTypeEnum = enum_namespace() -cyclonic = express_getattr(IfcInterceptorTypeEnum, 'CYCLONIC', INDETERMINATE) -grease = express_getattr(IfcInterceptorTypeEnum, 'GREASE', INDETERMINATE) -oil = express_getattr(IfcInterceptorTypeEnum, 'OIL', INDETERMINATE) -petrol = express_getattr(IfcInterceptorTypeEnum, 'PETROL', INDETERMINATE) -userdefined = express_getattr(IfcInterceptorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcInterceptorTypeEnum, 'NOTDEFINED', INDETERMINATE) +cyclonic = IfcInterceptorTypeEnum.CYCLONIC +grease = IfcInterceptorTypeEnum.GREASE +oil = IfcInterceptorTypeEnum.OIL +petrol = IfcInterceptorTypeEnum.PETROL +userdefined = IfcInterceptorTypeEnum.USERDEFINED +notdefined = IfcInterceptorTypeEnum.NOTDEFINED IfcInternalOrExternalEnum = enum_namespace() -external = express_getattr(IfcInternalOrExternalEnum, 'EXTERNAL', INDETERMINATE) -external_earth = express_getattr(IfcInternalOrExternalEnum, 'EXTERNAL_EARTH', INDETERMINATE) -external_fire = express_getattr(IfcInternalOrExternalEnum, 'EXTERNAL_FIRE', INDETERMINATE) -external_water = express_getattr(IfcInternalOrExternalEnum, 'EXTERNAL_WATER', INDETERMINATE) -internal = express_getattr(IfcInternalOrExternalEnum, 'INTERNAL', INDETERMINATE) -notdefined = express_getattr(IfcInternalOrExternalEnum, 'NOTDEFINED', INDETERMINATE) +external = IfcInternalOrExternalEnum.EXTERNAL +external_earth = IfcInternalOrExternalEnum.EXTERNAL_EARTH +external_fire = IfcInternalOrExternalEnum.EXTERNAL_FIRE +external_water = IfcInternalOrExternalEnum.EXTERNAL_WATER +internal = IfcInternalOrExternalEnum.INTERNAL +notdefined = IfcInternalOrExternalEnum.NOTDEFINED IfcInventoryTypeEnum = enum_namespace() -assetinventory = express_getattr(IfcInventoryTypeEnum, 'ASSETINVENTORY', INDETERMINATE) -furnitureinventory = express_getattr(IfcInventoryTypeEnum, 'FURNITUREINVENTORY', INDETERMINATE) -spaceinventory = express_getattr(IfcInventoryTypeEnum, 'SPACEINVENTORY', INDETERMINATE) -userdefined = express_getattr(IfcInventoryTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcInventoryTypeEnum, 'NOTDEFINED', INDETERMINATE) +assetinventory = IfcInventoryTypeEnum.ASSETINVENTORY +furnitureinventory = IfcInventoryTypeEnum.FURNITUREINVENTORY +spaceinventory = IfcInventoryTypeEnum.SPACEINVENTORY +userdefined = IfcInventoryTypeEnum.USERDEFINED +notdefined = IfcInventoryTypeEnum.NOTDEFINED IfcJunctionBoxTypeEnum = enum_namespace() -data = express_getattr(IfcJunctionBoxTypeEnum, 'DATA', INDETERMINATE) -power = express_getattr(IfcJunctionBoxTypeEnum, 'POWER', INDETERMINATE) -userdefined = express_getattr(IfcJunctionBoxTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcJunctionBoxTypeEnum, 'NOTDEFINED', INDETERMINATE) +data = IfcJunctionBoxTypeEnum.DATA +power = IfcJunctionBoxTypeEnum.POWER +userdefined = IfcJunctionBoxTypeEnum.USERDEFINED +notdefined = IfcJunctionBoxTypeEnum.NOTDEFINED IfcKerbTypeEnum = enum_namespace() -userdefined = express_getattr(IfcKerbTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcKerbTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcKerbTypeEnum.USERDEFINED +notdefined = IfcKerbTypeEnum.NOTDEFINED IfcKnotType = enum_namespace() -piecewise_bezier_knots = express_getattr(IfcKnotType, 'PIECEWISE_BEZIER_KNOTS', INDETERMINATE) -quasi_uniform_knots = express_getattr(IfcKnotType, 'QUASI_UNIFORM_KNOTS', INDETERMINATE) -uniform_knots = express_getattr(IfcKnotType, 'UNIFORM_KNOTS', INDETERMINATE) -unspecified = express_getattr(IfcKnotType, 'UNSPECIFIED', INDETERMINATE) +piecewise_bezier_knots = IfcKnotType.PIECEWISE_BEZIER_KNOTS +quasi_uniform_knots = IfcKnotType.QUASI_UNIFORM_KNOTS +uniform_knots = IfcKnotType.UNIFORM_KNOTS +unspecified = IfcKnotType.UNSPECIFIED IfcLaborResourceTypeEnum = enum_namespace() -administration = express_getattr(IfcLaborResourceTypeEnum, 'ADMINISTRATION', INDETERMINATE) -carpentry = express_getattr(IfcLaborResourceTypeEnum, 'CARPENTRY', INDETERMINATE) -cleaning = express_getattr(IfcLaborResourceTypeEnum, 'CLEANING', INDETERMINATE) -concrete = express_getattr(IfcLaborResourceTypeEnum, 'CONCRETE', INDETERMINATE) -drywall = express_getattr(IfcLaborResourceTypeEnum, 'DRYWALL', INDETERMINATE) -electric = express_getattr(IfcLaborResourceTypeEnum, 'ELECTRIC', INDETERMINATE) -finishing = express_getattr(IfcLaborResourceTypeEnum, 'FINISHING', INDETERMINATE) -flooring = express_getattr(IfcLaborResourceTypeEnum, 'FLOORING', INDETERMINATE) -general = express_getattr(IfcLaborResourceTypeEnum, 'GENERAL', INDETERMINATE) -hvac = express_getattr(IfcLaborResourceTypeEnum, 'HVAC', INDETERMINATE) -landscaping = express_getattr(IfcLaborResourceTypeEnum, 'LANDSCAPING', INDETERMINATE) -masonry = express_getattr(IfcLaborResourceTypeEnum, 'MASONRY', INDETERMINATE) -painting = express_getattr(IfcLaborResourceTypeEnum, 'PAINTING', INDETERMINATE) -paving = express_getattr(IfcLaborResourceTypeEnum, 'PAVING', INDETERMINATE) -plumbing = express_getattr(IfcLaborResourceTypeEnum, 'PLUMBING', INDETERMINATE) -roofing = express_getattr(IfcLaborResourceTypeEnum, 'ROOFING', INDETERMINATE) -sitegrading = express_getattr(IfcLaborResourceTypeEnum, 'SITEGRADING', INDETERMINATE) -steelwork = express_getattr(IfcLaborResourceTypeEnum, 'STEELWORK', INDETERMINATE) -surveying = express_getattr(IfcLaborResourceTypeEnum, 'SURVEYING', INDETERMINATE) -userdefined = express_getattr(IfcLaborResourceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcLaborResourceTypeEnum, 'NOTDEFINED', INDETERMINATE) +administration = IfcLaborResourceTypeEnum.ADMINISTRATION +carpentry = IfcLaborResourceTypeEnum.CARPENTRY +cleaning = IfcLaborResourceTypeEnum.CLEANING +concrete = IfcLaborResourceTypeEnum.CONCRETE +drywall = IfcLaborResourceTypeEnum.DRYWALL +electric = IfcLaborResourceTypeEnum.ELECTRIC +finishing = IfcLaborResourceTypeEnum.FINISHING +flooring = IfcLaborResourceTypeEnum.FLOORING +general = IfcLaborResourceTypeEnum.GENERAL +hvac = IfcLaborResourceTypeEnum.HVAC +landscaping = IfcLaborResourceTypeEnum.LANDSCAPING +masonry = IfcLaborResourceTypeEnum.MASONRY +painting = IfcLaborResourceTypeEnum.PAINTING +paving = IfcLaborResourceTypeEnum.PAVING +plumbing = IfcLaborResourceTypeEnum.PLUMBING +roofing = IfcLaborResourceTypeEnum.ROOFING +sitegrading = IfcLaborResourceTypeEnum.SITEGRADING +steelwork = IfcLaborResourceTypeEnum.STEELWORK +surveying = IfcLaborResourceTypeEnum.SURVEYING +userdefined = IfcLaborResourceTypeEnum.USERDEFINED +notdefined = IfcLaborResourceTypeEnum.NOTDEFINED IfcLampTypeEnum = enum_namespace() -compactfluorescent = express_getattr(IfcLampTypeEnum, 'COMPACTFLUORESCENT', INDETERMINATE) -fluorescent = express_getattr(IfcLampTypeEnum, 'FLUORESCENT', INDETERMINATE) -halogen = express_getattr(IfcLampTypeEnum, 'HALOGEN', INDETERMINATE) -highpressuremercury = express_getattr(IfcLampTypeEnum, 'HIGHPRESSUREMERCURY', INDETERMINATE) -highpressuresodium = express_getattr(IfcLampTypeEnum, 'HIGHPRESSURESODIUM', INDETERMINATE) -led = express_getattr(IfcLampTypeEnum, 'LED', INDETERMINATE) -metalhalide = express_getattr(IfcLampTypeEnum, 'METALHALIDE', INDETERMINATE) -oled = express_getattr(IfcLampTypeEnum, 'OLED', INDETERMINATE) -tungstenfilament = express_getattr(IfcLampTypeEnum, 'TUNGSTENFILAMENT', INDETERMINATE) -userdefined = express_getattr(IfcLampTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcLampTypeEnum, 'NOTDEFINED', INDETERMINATE) +compactfluorescent = IfcLampTypeEnum.COMPACTFLUORESCENT +fluorescent = IfcLampTypeEnum.FLUORESCENT +halogen = IfcLampTypeEnum.HALOGEN +highpressuremercury = IfcLampTypeEnum.HIGHPRESSUREMERCURY +highpressuresodium = IfcLampTypeEnum.HIGHPRESSURESODIUM +led = IfcLampTypeEnum.LED +metalhalide = IfcLampTypeEnum.METALHALIDE +oled = IfcLampTypeEnum.OLED +tungstenfilament = IfcLampTypeEnum.TUNGSTENFILAMENT +userdefined = IfcLampTypeEnum.USERDEFINED +notdefined = IfcLampTypeEnum.NOTDEFINED IfcLayerSetDirectionEnum = enum_namespace() -axis1 = express_getattr(IfcLayerSetDirectionEnum, 'AXIS1', INDETERMINATE) -axis2 = express_getattr(IfcLayerSetDirectionEnum, 'AXIS2', INDETERMINATE) -axis3 = express_getattr(IfcLayerSetDirectionEnum, 'AXIS3', INDETERMINATE) +axis1 = IfcLayerSetDirectionEnum.AXIS1 +axis2 = IfcLayerSetDirectionEnum.AXIS2 +axis3 = IfcLayerSetDirectionEnum.AXIS3 IfcLightDistributionCurveEnum = enum_namespace() -type_a = express_getattr(IfcLightDistributionCurveEnum, 'TYPE_A', INDETERMINATE) -type_b = express_getattr(IfcLightDistributionCurveEnum, 'TYPE_B', INDETERMINATE) -type_c = express_getattr(IfcLightDistributionCurveEnum, 'TYPE_C', INDETERMINATE) -notdefined = express_getattr(IfcLightDistributionCurveEnum, 'NOTDEFINED', INDETERMINATE) +type_a = IfcLightDistributionCurveEnum.TYPE_A +type_b = IfcLightDistributionCurveEnum.TYPE_B +type_c = IfcLightDistributionCurveEnum.TYPE_C +notdefined = IfcLightDistributionCurveEnum.NOTDEFINED IfcLightEmissionSourceEnum = enum_namespace() -compactfluorescent = express_getattr(IfcLightEmissionSourceEnum, 'COMPACTFLUORESCENT', INDETERMINATE) -fluorescent = express_getattr(IfcLightEmissionSourceEnum, 'FLUORESCENT', INDETERMINATE) -highpressuremercury = express_getattr(IfcLightEmissionSourceEnum, 'HIGHPRESSUREMERCURY', INDETERMINATE) -highpressuresodium = express_getattr(IfcLightEmissionSourceEnum, 'HIGHPRESSURESODIUM', INDETERMINATE) -lightemittingdiode = express_getattr(IfcLightEmissionSourceEnum, 'LIGHTEMITTINGDIODE', INDETERMINATE) -lowpressuresodium = express_getattr(IfcLightEmissionSourceEnum, 'LOWPRESSURESODIUM', INDETERMINATE) -lowvoltagehalogen = express_getattr(IfcLightEmissionSourceEnum, 'LOWVOLTAGEHALOGEN', INDETERMINATE) -mainvoltagehalogen = express_getattr(IfcLightEmissionSourceEnum, 'MAINVOLTAGEHALOGEN', INDETERMINATE) -metalhalide = express_getattr(IfcLightEmissionSourceEnum, 'METALHALIDE', INDETERMINATE) -tungstenfilament = express_getattr(IfcLightEmissionSourceEnum, 'TUNGSTENFILAMENT', INDETERMINATE) -notdefined = express_getattr(IfcLightEmissionSourceEnum, 'NOTDEFINED', INDETERMINATE) +compactfluorescent = IfcLightEmissionSourceEnum.COMPACTFLUORESCENT +fluorescent = IfcLightEmissionSourceEnum.FLUORESCENT +highpressuremercury = IfcLightEmissionSourceEnum.HIGHPRESSUREMERCURY +highpressuresodium = IfcLightEmissionSourceEnum.HIGHPRESSURESODIUM +lightemittingdiode = IfcLightEmissionSourceEnum.LIGHTEMITTINGDIODE +lowpressuresodium = IfcLightEmissionSourceEnum.LOWPRESSURESODIUM +lowvoltagehalogen = IfcLightEmissionSourceEnum.LOWVOLTAGEHALOGEN +mainvoltagehalogen = IfcLightEmissionSourceEnum.MAINVOLTAGEHALOGEN +metalhalide = IfcLightEmissionSourceEnum.METALHALIDE +tungstenfilament = IfcLightEmissionSourceEnum.TUNGSTENFILAMENT +notdefined = IfcLightEmissionSourceEnum.NOTDEFINED IfcLightFixtureTypeEnum = enum_namespace() -directionsource = express_getattr(IfcLightFixtureTypeEnum, 'DIRECTIONSOURCE', INDETERMINATE) -pointsource = express_getattr(IfcLightFixtureTypeEnum, 'POINTSOURCE', INDETERMINATE) -securitylighting = express_getattr(IfcLightFixtureTypeEnum, 'SECURITYLIGHTING', INDETERMINATE) -userdefined = express_getattr(IfcLightFixtureTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcLightFixtureTypeEnum, 'NOTDEFINED', INDETERMINATE) +directionsource = IfcLightFixtureTypeEnum.DIRECTIONSOURCE +pointsource = IfcLightFixtureTypeEnum.POINTSOURCE +securitylighting = IfcLightFixtureTypeEnum.SECURITYLIGHTING +userdefined = IfcLightFixtureTypeEnum.USERDEFINED +notdefined = IfcLightFixtureTypeEnum.NOTDEFINED IfcLiquidTerminalTypeEnum = enum_namespace() -hosereel = express_getattr(IfcLiquidTerminalTypeEnum, 'HOSEREEL', INDETERMINATE) -loadingarm = express_getattr(IfcLiquidTerminalTypeEnum, 'LOADINGARM', INDETERMINATE) -userdefined = express_getattr(IfcLiquidTerminalTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcLiquidTerminalTypeEnum, 'NOTDEFINED', INDETERMINATE) +hosereel = IfcLiquidTerminalTypeEnum.HOSEREEL +loadingarm = IfcLiquidTerminalTypeEnum.LOADINGARM +userdefined = IfcLiquidTerminalTypeEnum.USERDEFINED +notdefined = IfcLiquidTerminalTypeEnum.NOTDEFINED IfcLoadGroupTypeEnum = enum_namespace() -load_case = express_getattr(IfcLoadGroupTypeEnum, 'LOAD_CASE', INDETERMINATE) -load_combination = express_getattr(IfcLoadGroupTypeEnum, 'LOAD_COMBINATION', INDETERMINATE) -load_group = express_getattr(IfcLoadGroupTypeEnum, 'LOAD_GROUP', INDETERMINATE) -userdefined = express_getattr(IfcLoadGroupTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcLoadGroupTypeEnum, 'NOTDEFINED', INDETERMINATE) +load_case = IfcLoadGroupTypeEnum.LOAD_CASE +load_combination = IfcLoadGroupTypeEnum.LOAD_COMBINATION +load_group = IfcLoadGroupTypeEnum.LOAD_GROUP +userdefined = IfcLoadGroupTypeEnum.USERDEFINED +notdefined = IfcLoadGroupTypeEnum.NOTDEFINED IfcLogicalOperatorEnum = enum_namespace() -logicaland = express_getattr(IfcLogicalOperatorEnum, 'LOGICALAND', INDETERMINATE) -logicalnotand = express_getattr(IfcLogicalOperatorEnum, 'LOGICALNOTAND', INDETERMINATE) -logicalnotor = express_getattr(IfcLogicalOperatorEnum, 'LOGICALNOTOR', INDETERMINATE) -logicalor = express_getattr(IfcLogicalOperatorEnum, 'LOGICALOR', INDETERMINATE) -logicalxor = express_getattr(IfcLogicalOperatorEnum, 'LOGICALXOR', INDETERMINATE) +logicaland = IfcLogicalOperatorEnum.LOGICALAND +logicalnotand = IfcLogicalOperatorEnum.LOGICALNOTAND +logicalnotor = IfcLogicalOperatorEnum.LOGICALNOTOR +logicalor = IfcLogicalOperatorEnum.LOGICALOR +logicalxor = IfcLogicalOperatorEnum.LOGICALXOR IfcMarineFacilityTypeEnum = enum_namespace() -barrierbeach = express_getattr(IfcMarineFacilityTypeEnum, 'BARRIERBEACH', INDETERMINATE) -breakwater = express_getattr(IfcMarineFacilityTypeEnum, 'BREAKWATER', INDETERMINATE) -canal = express_getattr(IfcMarineFacilityTypeEnum, 'CANAL', INDETERMINATE) -drydock = express_getattr(IfcMarineFacilityTypeEnum, 'DRYDOCK', INDETERMINATE) -floatingdock = express_getattr(IfcMarineFacilityTypeEnum, 'FLOATINGDOCK', INDETERMINATE) -hydrolift = express_getattr(IfcMarineFacilityTypeEnum, 'HYDROLIFT', INDETERMINATE) -jetty = express_getattr(IfcMarineFacilityTypeEnum, 'JETTY', INDETERMINATE) -launchrecovery = express_getattr(IfcMarineFacilityTypeEnum, 'LAUNCHRECOVERY', INDETERMINATE) -marinedefence = express_getattr(IfcMarineFacilityTypeEnum, 'MARINEDEFENCE', INDETERMINATE) -navigationalchannel = express_getattr(IfcMarineFacilityTypeEnum, 'NAVIGATIONALCHANNEL', INDETERMINATE) -port = express_getattr(IfcMarineFacilityTypeEnum, 'PORT', INDETERMINATE) -quay = express_getattr(IfcMarineFacilityTypeEnum, 'QUAY', INDETERMINATE) -revetment = express_getattr(IfcMarineFacilityTypeEnum, 'REVETMENT', INDETERMINATE) -shiplift = express_getattr(IfcMarineFacilityTypeEnum, 'SHIPLIFT', INDETERMINATE) -shiplock = express_getattr(IfcMarineFacilityTypeEnum, 'SHIPLOCK', INDETERMINATE) -shipyard = express_getattr(IfcMarineFacilityTypeEnum, 'SHIPYARD', INDETERMINATE) -slipway = express_getattr(IfcMarineFacilityTypeEnum, 'SLIPWAY', INDETERMINATE) -waterway = express_getattr(IfcMarineFacilityTypeEnum, 'WATERWAY', INDETERMINATE) -waterwayshiplift = express_getattr(IfcMarineFacilityTypeEnum, 'WATERWAYSHIPLIFT', INDETERMINATE) -userdefined = express_getattr(IfcMarineFacilityTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcMarineFacilityTypeEnum, 'NOTDEFINED', INDETERMINATE) +barrierbeach = IfcMarineFacilityTypeEnum.BARRIERBEACH +breakwater = IfcMarineFacilityTypeEnum.BREAKWATER +canal = IfcMarineFacilityTypeEnum.CANAL +drydock = IfcMarineFacilityTypeEnum.DRYDOCK +floatingdock = IfcMarineFacilityTypeEnum.FLOATINGDOCK +hydrolift = IfcMarineFacilityTypeEnum.HYDROLIFT +jetty = IfcMarineFacilityTypeEnum.JETTY +launchrecovery = IfcMarineFacilityTypeEnum.LAUNCHRECOVERY +marinedefence = IfcMarineFacilityTypeEnum.MARINEDEFENCE +navigationalchannel = IfcMarineFacilityTypeEnum.NAVIGATIONALCHANNEL +port = IfcMarineFacilityTypeEnum.PORT +quay = IfcMarineFacilityTypeEnum.QUAY +revetment = IfcMarineFacilityTypeEnum.REVETMENT +shiplift = IfcMarineFacilityTypeEnum.SHIPLIFT +shiplock = IfcMarineFacilityTypeEnum.SHIPLOCK +shipyard = IfcMarineFacilityTypeEnum.SHIPYARD +slipway = IfcMarineFacilityTypeEnum.SLIPWAY +waterway = IfcMarineFacilityTypeEnum.WATERWAY +waterwayshiplift = IfcMarineFacilityTypeEnum.WATERWAYSHIPLIFT +userdefined = IfcMarineFacilityTypeEnum.USERDEFINED +notdefined = IfcMarineFacilityTypeEnum.NOTDEFINED IfcMarinePartTypeEnum = enum_namespace() -abovewaterline = express_getattr(IfcMarinePartTypeEnum, 'ABOVEWATERLINE', INDETERMINATE) -anchorage = express_getattr(IfcMarinePartTypeEnum, 'ANCHORAGE', INDETERMINATE) -approachchannel = express_getattr(IfcMarinePartTypeEnum, 'APPROACHCHANNEL', INDETERMINATE) -belowwaterline = express_getattr(IfcMarinePartTypeEnum, 'BELOWWATERLINE', INDETERMINATE) -berthingstructure = express_getattr(IfcMarinePartTypeEnum, 'BERTHINGSTRUCTURE', INDETERMINATE) -chamber = express_getattr(IfcMarinePartTypeEnum, 'CHAMBER', INDETERMINATE) -cill_level = express_getattr(IfcMarinePartTypeEnum, 'CILL_LEVEL', INDETERMINATE) -copelevel = express_getattr(IfcMarinePartTypeEnum, 'COPELEVEL', INDETERMINATE) -core = express_getattr(IfcMarinePartTypeEnum, 'CORE', INDETERMINATE) -crest = express_getattr(IfcMarinePartTypeEnum, 'CREST', INDETERMINATE) -gatehead = express_getattr(IfcMarinePartTypeEnum, 'GATEHEAD', INDETERMINATE) -gudingstructure = express_getattr(IfcMarinePartTypeEnum, 'GUDINGSTRUCTURE', INDETERMINATE) -highwaterline = express_getattr(IfcMarinePartTypeEnum, 'HIGHWATERLINE', INDETERMINATE) -landfield = express_getattr(IfcMarinePartTypeEnum, 'LANDFIELD', INDETERMINATE) -leewardside = express_getattr(IfcMarinePartTypeEnum, 'LEEWARDSIDE', INDETERMINATE) -lowwaterline = express_getattr(IfcMarinePartTypeEnum, 'LOWWATERLINE', INDETERMINATE) -manufacturing = express_getattr(IfcMarinePartTypeEnum, 'MANUFACTURING', INDETERMINATE) -navigationalarea = express_getattr(IfcMarinePartTypeEnum, 'NAVIGATIONALAREA', INDETERMINATE) -protection = express_getattr(IfcMarinePartTypeEnum, 'PROTECTION', INDETERMINATE) -shiptransfer = express_getattr(IfcMarinePartTypeEnum, 'SHIPTRANSFER', INDETERMINATE) -storagearea = express_getattr(IfcMarinePartTypeEnum, 'STORAGEAREA', INDETERMINATE) -vehicleservicing = express_getattr(IfcMarinePartTypeEnum, 'VEHICLESERVICING', INDETERMINATE) -waterfield = express_getattr(IfcMarinePartTypeEnum, 'WATERFIELD', INDETERMINATE) -weatherside = express_getattr(IfcMarinePartTypeEnum, 'WEATHERSIDE', INDETERMINATE) -userdefined = express_getattr(IfcMarinePartTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcMarinePartTypeEnum, 'NOTDEFINED', INDETERMINATE) +abovewaterline = IfcMarinePartTypeEnum.ABOVEWATERLINE +anchorage = IfcMarinePartTypeEnum.ANCHORAGE +approachchannel = IfcMarinePartTypeEnum.APPROACHCHANNEL +belowwaterline = IfcMarinePartTypeEnum.BELOWWATERLINE +berthingstructure = IfcMarinePartTypeEnum.BERTHINGSTRUCTURE +chamber = IfcMarinePartTypeEnum.CHAMBER +cill_level = IfcMarinePartTypeEnum.CILL_LEVEL +copelevel = IfcMarinePartTypeEnum.COPELEVEL +core = IfcMarinePartTypeEnum.CORE +crest = IfcMarinePartTypeEnum.CREST +gatehead = IfcMarinePartTypeEnum.GATEHEAD +gudingstructure = IfcMarinePartTypeEnum.GUDINGSTRUCTURE +highwaterline = IfcMarinePartTypeEnum.HIGHWATERLINE +landfield = IfcMarinePartTypeEnum.LANDFIELD +leewardside = IfcMarinePartTypeEnum.LEEWARDSIDE +lowwaterline = IfcMarinePartTypeEnum.LOWWATERLINE +manufacturing = IfcMarinePartTypeEnum.MANUFACTURING +navigationalarea = IfcMarinePartTypeEnum.NAVIGATIONALAREA +protection = IfcMarinePartTypeEnum.PROTECTION +shiptransfer = IfcMarinePartTypeEnum.SHIPTRANSFER +storagearea = IfcMarinePartTypeEnum.STORAGEAREA +vehicleservicing = IfcMarinePartTypeEnum.VEHICLESERVICING +waterfield = IfcMarinePartTypeEnum.WATERFIELD +weatherside = IfcMarinePartTypeEnum.WEATHERSIDE +userdefined = IfcMarinePartTypeEnum.USERDEFINED +notdefined = IfcMarinePartTypeEnum.NOTDEFINED IfcMechanicalFastenerTypeEnum = enum_namespace() -anchorbolt = express_getattr(IfcMechanicalFastenerTypeEnum, 'ANCHORBOLT', INDETERMINATE) -bolt = express_getattr(IfcMechanicalFastenerTypeEnum, 'BOLT', INDETERMINATE) -chain = express_getattr(IfcMechanicalFastenerTypeEnum, 'CHAIN', INDETERMINATE) -coupler = express_getattr(IfcMechanicalFastenerTypeEnum, 'COUPLER', INDETERMINATE) -dowel = express_getattr(IfcMechanicalFastenerTypeEnum, 'DOWEL', INDETERMINATE) -nail = express_getattr(IfcMechanicalFastenerTypeEnum, 'NAIL', INDETERMINATE) -nailplate = express_getattr(IfcMechanicalFastenerTypeEnum, 'NAILPLATE', INDETERMINATE) -railfastening = express_getattr(IfcMechanicalFastenerTypeEnum, 'RAILFASTENING', INDETERMINATE) -railjoint = express_getattr(IfcMechanicalFastenerTypeEnum, 'RAILJOINT', INDETERMINATE) -rivet = express_getattr(IfcMechanicalFastenerTypeEnum, 'RIVET', INDETERMINATE) -rope = express_getattr(IfcMechanicalFastenerTypeEnum, 'ROPE', INDETERMINATE) -screw = express_getattr(IfcMechanicalFastenerTypeEnum, 'SCREW', INDETERMINATE) -shearconnector = express_getattr(IfcMechanicalFastenerTypeEnum, 'SHEARCONNECTOR', INDETERMINATE) -staple = express_getattr(IfcMechanicalFastenerTypeEnum, 'STAPLE', INDETERMINATE) -studshearconnector = express_getattr(IfcMechanicalFastenerTypeEnum, 'STUDSHEARCONNECTOR', INDETERMINATE) -userdefined = express_getattr(IfcMechanicalFastenerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcMechanicalFastenerTypeEnum, 'NOTDEFINED', INDETERMINATE) +anchorbolt = IfcMechanicalFastenerTypeEnum.ANCHORBOLT +bolt = IfcMechanicalFastenerTypeEnum.BOLT +chain = IfcMechanicalFastenerTypeEnum.CHAIN +coupler = IfcMechanicalFastenerTypeEnum.COUPLER +dowel = IfcMechanicalFastenerTypeEnum.DOWEL +nail = IfcMechanicalFastenerTypeEnum.NAIL +nailplate = IfcMechanicalFastenerTypeEnum.NAILPLATE +railfastening = IfcMechanicalFastenerTypeEnum.RAILFASTENING +railjoint = IfcMechanicalFastenerTypeEnum.RAILJOINT +rivet = IfcMechanicalFastenerTypeEnum.RIVET +rope = IfcMechanicalFastenerTypeEnum.ROPE +screw = IfcMechanicalFastenerTypeEnum.SCREW +shearconnector = IfcMechanicalFastenerTypeEnum.SHEARCONNECTOR +staple = IfcMechanicalFastenerTypeEnum.STAPLE +studshearconnector = IfcMechanicalFastenerTypeEnum.STUDSHEARCONNECTOR +userdefined = IfcMechanicalFastenerTypeEnum.USERDEFINED +notdefined = IfcMechanicalFastenerTypeEnum.NOTDEFINED IfcMedicalDeviceTypeEnum = enum_namespace() -airstation = express_getattr(IfcMedicalDeviceTypeEnum, 'AIRSTATION', INDETERMINATE) -feedairunit = express_getattr(IfcMedicalDeviceTypeEnum, 'FEEDAIRUNIT', INDETERMINATE) -oxygengenerator = express_getattr(IfcMedicalDeviceTypeEnum, 'OXYGENGENERATOR', INDETERMINATE) -oxygenplant = express_getattr(IfcMedicalDeviceTypeEnum, 'OXYGENPLANT', INDETERMINATE) -vacuumstation = express_getattr(IfcMedicalDeviceTypeEnum, 'VACUUMSTATION', INDETERMINATE) -userdefined = express_getattr(IfcMedicalDeviceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcMedicalDeviceTypeEnum, 'NOTDEFINED', INDETERMINATE) +airstation = IfcMedicalDeviceTypeEnum.AIRSTATION +feedairunit = IfcMedicalDeviceTypeEnum.FEEDAIRUNIT +oxygengenerator = IfcMedicalDeviceTypeEnum.OXYGENGENERATOR +oxygenplant = IfcMedicalDeviceTypeEnum.OXYGENPLANT +vacuumstation = IfcMedicalDeviceTypeEnum.VACUUMSTATION +userdefined = IfcMedicalDeviceTypeEnum.USERDEFINED +notdefined = IfcMedicalDeviceTypeEnum.NOTDEFINED IfcMemberTypeEnum = enum_namespace() -arch_segment = express_getattr(IfcMemberTypeEnum, 'ARCH_SEGMENT', INDETERMINATE) -brace = express_getattr(IfcMemberTypeEnum, 'BRACE', INDETERMINATE) -chord = express_getattr(IfcMemberTypeEnum, 'CHORD', INDETERMINATE) -collar = express_getattr(IfcMemberTypeEnum, 'COLLAR', INDETERMINATE) -member = express_getattr(IfcMemberTypeEnum, 'MEMBER', INDETERMINATE) -mullion = express_getattr(IfcMemberTypeEnum, 'MULLION', INDETERMINATE) -plate = express_getattr(IfcMemberTypeEnum, 'PLATE', INDETERMINATE) -post = express_getattr(IfcMemberTypeEnum, 'POST', INDETERMINATE) -purlin = express_getattr(IfcMemberTypeEnum, 'PURLIN', INDETERMINATE) -rafter = express_getattr(IfcMemberTypeEnum, 'RAFTER', INDETERMINATE) -stay_cable = express_getattr(IfcMemberTypeEnum, 'STAY_CABLE', INDETERMINATE) -stiffening_rib = express_getattr(IfcMemberTypeEnum, 'STIFFENING_RIB', INDETERMINATE) -stringer = express_getattr(IfcMemberTypeEnum, 'STRINGER', INDETERMINATE) -structuralcable = express_getattr(IfcMemberTypeEnum, 'STRUCTURALCABLE', INDETERMINATE) -strut = express_getattr(IfcMemberTypeEnum, 'STRUT', INDETERMINATE) -stud = express_getattr(IfcMemberTypeEnum, 'STUD', INDETERMINATE) -suspender = express_getattr(IfcMemberTypeEnum, 'SUSPENDER', INDETERMINATE) -suspension_cable = express_getattr(IfcMemberTypeEnum, 'SUSPENSION_CABLE', INDETERMINATE) -tiebar = express_getattr(IfcMemberTypeEnum, 'TIEBAR', INDETERMINATE) -userdefined = express_getattr(IfcMemberTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcMemberTypeEnum, 'NOTDEFINED', INDETERMINATE) +arch_segment = IfcMemberTypeEnum.ARCH_SEGMENT +brace = IfcMemberTypeEnum.BRACE +chord = IfcMemberTypeEnum.CHORD +collar = IfcMemberTypeEnum.COLLAR +member = IfcMemberTypeEnum.MEMBER +mullion = IfcMemberTypeEnum.MULLION +plate = IfcMemberTypeEnum.PLATE +post = IfcMemberTypeEnum.POST +purlin = IfcMemberTypeEnum.PURLIN +rafter = IfcMemberTypeEnum.RAFTER +stay_cable = IfcMemberTypeEnum.STAY_CABLE +stiffening_rib = IfcMemberTypeEnum.STIFFENING_RIB +stringer = IfcMemberTypeEnum.STRINGER +structuralcable = IfcMemberTypeEnum.STRUCTURALCABLE +strut = IfcMemberTypeEnum.STRUT +stud = IfcMemberTypeEnum.STUD +suspender = IfcMemberTypeEnum.SUSPENDER +suspension_cable = IfcMemberTypeEnum.SUSPENSION_CABLE +tiebar = IfcMemberTypeEnum.TIEBAR +userdefined = IfcMemberTypeEnum.USERDEFINED +notdefined = IfcMemberTypeEnum.NOTDEFINED IfcMobileTelecommunicationsApplianceTypeEnum = enum_namespace() -accesspoint = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'ACCESSPOINT', INDETERMINATE) -basebandunit = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'BASEBANDUNIT', INDETERMINATE) -basetransceiverstation = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'BASETRANSCEIVERSTATION', INDETERMINATE) -e_utran_node_b = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'E_UTRAN_NODE_B', INDETERMINATE) -gateway_gprs_support_node = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'GATEWAY_GPRS_SUPPORT_NODE', INDETERMINATE) -masterunit = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'MASTERUNIT', INDETERMINATE) -mobileswitchingcenter = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'MOBILESWITCHINGCENTER', INDETERMINATE) -mscserver = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'MSCSERVER', INDETERMINATE) -packetcontrolunit = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'PACKETCONTROLUNIT', INDETERMINATE) -remoteradiounit = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'REMOTERADIOUNIT', INDETERMINATE) -remoteunit = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'REMOTEUNIT', INDETERMINATE) -service_gprs_support_node = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'SERVICE_GPRS_SUPPORT_NODE', INDETERMINATE) -subscriberserver = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'SUBSCRIBERSERVER', INDETERMINATE) -userdefined = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'NOTDEFINED', INDETERMINATE) +accesspoint = IfcMobileTelecommunicationsApplianceTypeEnum.ACCESSPOINT +basebandunit = IfcMobileTelecommunicationsApplianceTypeEnum.BASEBANDUNIT +basetransceiverstation = IfcMobileTelecommunicationsApplianceTypeEnum.BASETRANSCEIVERSTATION +e_utran_node_b = IfcMobileTelecommunicationsApplianceTypeEnum.E_UTRAN_NODE_B +gateway_gprs_support_node = IfcMobileTelecommunicationsApplianceTypeEnum.GATEWAY_GPRS_SUPPORT_NODE +masterunit = IfcMobileTelecommunicationsApplianceTypeEnum.MASTERUNIT +mobileswitchingcenter = IfcMobileTelecommunicationsApplianceTypeEnum.MOBILESWITCHINGCENTER +mscserver = IfcMobileTelecommunicationsApplianceTypeEnum.MSCSERVER +packetcontrolunit = IfcMobileTelecommunicationsApplianceTypeEnum.PACKETCONTROLUNIT +remoteradiounit = IfcMobileTelecommunicationsApplianceTypeEnum.REMOTERADIOUNIT +remoteunit = IfcMobileTelecommunicationsApplianceTypeEnum.REMOTEUNIT +service_gprs_support_node = IfcMobileTelecommunicationsApplianceTypeEnum.SERVICE_GPRS_SUPPORT_NODE +subscriberserver = IfcMobileTelecommunicationsApplianceTypeEnum.SUBSCRIBERSERVER +userdefined = IfcMobileTelecommunicationsApplianceTypeEnum.USERDEFINED +notdefined = IfcMobileTelecommunicationsApplianceTypeEnum.NOTDEFINED IfcMooringDeviceTypeEnum = enum_namespace() -bollard = express_getattr(IfcMooringDeviceTypeEnum, 'BOLLARD', INDETERMINATE) -linetensioner = express_getattr(IfcMooringDeviceTypeEnum, 'LINETENSIONER', INDETERMINATE) -magneticdevice = express_getattr(IfcMooringDeviceTypeEnum, 'MAGNETICDEVICE', INDETERMINATE) -mooringhooks = express_getattr(IfcMooringDeviceTypeEnum, 'MOORINGHOOKS', INDETERMINATE) -vacuumdevice = express_getattr(IfcMooringDeviceTypeEnum, 'VACUUMDEVICE', INDETERMINATE) -userdefined = express_getattr(IfcMooringDeviceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcMooringDeviceTypeEnum, 'NOTDEFINED', INDETERMINATE) +bollard = IfcMooringDeviceTypeEnum.BOLLARD +linetensioner = IfcMooringDeviceTypeEnum.LINETENSIONER +magneticdevice = IfcMooringDeviceTypeEnum.MAGNETICDEVICE +mooringhooks = IfcMooringDeviceTypeEnum.MOORINGHOOKS +vacuumdevice = IfcMooringDeviceTypeEnum.VACUUMDEVICE +userdefined = IfcMooringDeviceTypeEnum.USERDEFINED +notdefined = IfcMooringDeviceTypeEnum.NOTDEFINED IfcMotorConnectionTypeEnum = enum_namespace() -beltdrive = express_getattr(IfcMotorConnectionTypeEnum, 'BELTDRIVE', INDETERMINATE) -coupling = express_getattr(IfcMotorConnectionTypeEnum, 'COUPLING', INDETERMINATE) -directdrive = express_getattr(IfcMotorConnectionTypeEnum, 'DIRECTDRIVE', INDETERMINATE) -userdefined = express_getattr(IfcMotorConnectionTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcMotorConnectionTypeEnum, 'NOTDEFINED', INDETERMINATE) +beltdrive = IfcMotorConnectionTypeEnum.BELTDRIVE +coupling = IfcMotorConnectionTypeEnum.COUPLING +directdrive = IfcMotorConnectionTypeEnum.DIRECTDRIVE +userdefined = IfcMotorConnectionTypeEnum.USERDEFINED +notdefined = IfcMotorConnectionTypeEnum.NOTDEFINED IfcNavigationElementTypeEnum = enum_namespace() -beacon = express_getattr(IfcNavigationElementTypeEnum, 'BEACON', INDETERMINATE) -buoy = express_getattr(IfcNavigationElementTypeEnum, 'BUOY', INDETERMINATE) -userdefined = express_getattr(IfcNavigationElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcNavigationElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +beacon = IfcNavigationElementTypeEnum.BEACON +buoy = IfcNavigationElementTypeEnum.BUOY +userdefined = IfcNavigationElementTypeEnum.USERDEFINED +notdefined = IfcNavigationElementTypeEnum.NOTDEFINED IfcObjectiveEnum = enum_namespace() -codecompliance = express_getattr(IfcObjectiveEnum, 'CODECOMPLIANCE', INDETERMINATE) -codewaiver = express_getattr(IfcObjectiveEnum, 'CODEWAIVER', INDETERMINATE) -designintent = express_getattr(IfcObjectiveEnum, 'DESIGNINTENT', INDETERMINATE) -external = express_getattr(IfcObjectiveEnum, 'EXTERNAL', INDETERMINATE) -healthandsafety = express_getattr(IfcObjectiveEnum, 'HEALTHANDSAFETY', INDETERMINATE) -mergeconflict = express_getattr(IfcObjectiveEnum, 'MERGECONFLICT', INDETERMINATE) -modelview = express_getattr(IfcObjectiveEnum, 'MODELVIEW', INDETERMINATE) -parameter = express_getattr(IfcObjectiveEnum, 'PARAMETER', INDETERMINATE) -requirement = express_getattr(IfcObjectiveEnum, 'REQUIREMENT', INDETERMINATE) -specification = express_getattr(IfcObjectiveEnum, 'SPECIFICATION', INDETERMINATE) -triggercondition = express_getattr(IfcObjectiveEnum, 'TRIGGERCONDITION', INDETERMINATE) -userdefined = express_getattr(IfcObjectiveEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcObjectiveEnum, 'NOTDEFINED', INDETERMINATE) +codecompliance = IfcObjectiveEnum.CODECOMPLIANCE +codewaiver = IfcObjectiveEnum.CODEWAIVER +designintent = IfcObjectiveEnum.DESIGNINTENT +external = IfcObjectiveEnum.EXTERNAL +healthandsafety = IfcObjectiveEnum.HEALTHANDSAFETY +mergeconflict = IfcObjectiveEnum.MERGECONFLICT +modelview = IfcObjectiveEnum.MODELVIEW +parameter = IfcObjectiveEnum.PARAMETER +requirement = IfcObjectiveEnum.REQUIREMENT +specification = IfcObjectiveEnum.SPECIFICATION +triggercondition = IfcObjectiveEnum.TRIGGERCONDITION +userdefined = IfcObjectiveEnum.USERDEFINED +notdefined = IfcObjectiveEnum.NOTDEFINED IfcOccupantTypeEnum = enum_namespace() -assignee = express_getattr(IfcOccupantTypeEnum, 'ASSIGNEE', INDETERMINATE) -assignor = express_getattr(IfcOccupantTypeEnum, 'ASSIGNOR', INDETERMINATE) -lessee = express_getattr(IfcOccupantTypeEnum, 'LESSEE', INDETERMINATE) -lessor = express_getattr(IfcOccupantTypeEnum, 'LESSOR', INDETERMINATE) -lettingagent = express_getattr(IfcOccupantTypeEnum, 'LETTINGAGENT', INDETERMINATE) -owner = express_getattr(IfcOccupantTypeEnum, 'OWNER', INDETERMINATE) -tenant = express_getattr(IfcOccupantTypeEnum, 'TENANT', INDETERMINATE) -userdefined = express_getattr(IfcOccupantTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcOccupantTypeEnum, 'NOTDEFINED', INDETERMINATE) +assignee = IfcOccupantTypeEnum.ASSIGNEE +assignor = IfcOccupantTypeEnum.ASSIGNOR +lessee = IfcOccupantTypeEnum.LESSEE +lessor = IfcOccupantTypeEnum.LESSOR +lettingagent = IfcOccupantTypeEnum.LETTINGAGENT +owner = IfcOccupantTypeEnum.OWNER +tenant = IfcOccupantTypeEnum.TENANT +userdefined = IfcOccupantTypeEnum.USERDEFINED +notdefined = IfcOccupantTypeEnum.NOTDEFINED IfcOpeningElementTypeEnum = enum_namespace() -opening = express_getattr(IfcOpeningElementTypeEnum, 'OPENING', INDETERMINATE) -recess = express_getattr(IfcOpeningElementTypeEnum, 'RECESS', INDETERMINATE) -userdefined = express_getattr(IfcOpeningElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcOpeningElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +opening = IfcOpeningElementTypeEnum.OPENING +recess = IfcOpeningElementTypeEnum.RECESS +userdefined = IfcOpeningElementTypeEnum.USERDEFINED +notdefined = IfcOpeningElementTypeEnum.NOTDEFINED IfcOutletTypeEnum = enum_namespace() -audiovisualoutlet = express_getattr(IfcOutletTypeEnum, 'AUDIOVISUALOUTLET', INDETERMINATE) -communicationsoutlet = express_getattr(IfcOutletTypeEnum, 'COMMUNICATIONSOUTLET', INDETERMINATE) -dataoutlet = express_getattr(IfcOutletTypeEnum, 'DATAOUTLET', INDETERMINATE) -poweroutlet = express_getattr(IfcOutletTypeEnum, 'POWEROUTLET', INDETERMINATE) -telephoneoutlet = express_getattr(IfcOutletTypeEnum, 'TELEPHONEOUTLET', INDETERMINATE) -userdefined = express_getattr(IfcOutletTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcOutletTypeEnum, 'NOTDEFINED', INDETERMINATE) +audiovisualoutlet = IfcOutletTypeEnum.AUDIOVISUALOUTLET +communicationsoutlet = IfcOutletTypeEnum.COMMUNICATIONSOUTLET +dataoutlet = IfcOutletTypeEnum.DATAOUTLET +poweroutlet = IfcOutletTypeEnum.POWEROUTLET +telephoneoutlet = IfcOutletTypeEnum.TELEPHONEOUTLET +userdefined = IfcOutletTypeEnum.USERDEFINED +notdefined = IfcOutletTypeEnum.NOTDEFINED IfcPavementTypeEnum = enum_namespace() -flexible = express_getattr(IfcPavementTypeEnum, 'FLEXIBLE', INDETERMINATE) -rigid = express_getattr(IfcPavementTypeEnum, 'RIGID', INDETERMINATE) -userdefined = express_getattr(IfcPavementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPavementTypeEnum, 'NOTDEFINED', INDETERMINATE) +flexible = IfcPavementTypeEnum.FLEXIBLE +rigid = IfcPavementTypeEnum.RIGID +userdefined = IfcPavementTypeEnum.USERDEFINED +notdefined = IfcPavementTypeEnum.NOTDEFINED IfcPerformanceHistoryTypeEnum = enum_namespace() -userdefined = express_getattr(IfcPerformanceHistoryTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPerformanceHistoryTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcPerformanceHistoryTypeEnum.USERDEFINED +notdefined = IfcPerformanceHistoryTypeEnum.NOTDEFINED IfcPermeableCoveringOperationEnum = enum_namespace() -grill = express_getattr(IfcPermeableCoveringOperationEnum, 'GRILL', INDETERMINATE) -louver = express_getattr(IfcPermeableCoveringOperationEnum, 'LOUVER', INDETERMINATE) -screen = express_getattr(IfcPermeableCoveringOperationEnum, 'SCREEN', INDETERMINATE) -userdefined = express_getattr(IfcPermeableCoveringOperationEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPermeableCoveringOperationEnum, 'NOTDEFINED', INDETERMINATE) +grill = IfcPermeableCoveringOperationEnum.GRILL +louver = IfcPermeableCoveringOperationEnum.LOUVER +screen = IfcPermeableCoveringOperationEnum.SCREEN +userdefined = IfcPermeableCoveringOperationEnum.USERDEFINED +notdefined = IfcPermeableCoveringOperationEnum.NOTDEFINED IfcPermitTypeEnum = enum_namespace() -access = express_getattr(IfcPermitTypeEnum, 'ACCESS', INDETERMINATE) -building = express_getattr(IfcPermitTypeEnum, 'BUILDING', INDETERMINATE) -work = express_getattr(IfcPermitTypeEnum, 'WORK', INDETERMINATE) -userdefined = express_getattr(IfcPermitTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPermitTypeEnum, 'NOTDEFINED', INDETERMINATE) +access = IfcPermitTypeEnum.ACCESS +building = IfcPermitTypeEnum.BUILDING +work = IfcPermitTypeEnum.WORK +userdefined = IfcPermitTypeEnum.USERDEFINED +notdefined = IfcPermitTypeEnum.NOTDEFINED IfcPhysicalOrVirtualEnum = enum_namespace() -physical = express_getattr(IfcPhysicalOrVirtualEnum, 'PHYSICAL', INDETERMINATE) -virtual = express_getattr(IfcPhysicalOrVirtualEnum, 'VIRTUAL', INDETERMINATE) -notdefined = express_getattr(IfcPhysicalOrVirtualEnum, 'NOTDEFINED', INDETERMINATE) +physical = IfcPhysicalOrVirtualEnum.PHYSICAL +virtual = IfcPhysicalOrVirtualEnum.VIRTUAL +notdefined = IfcPhysicalOrVirtualEnum.NOTDEFINED IfcPileConstructionEnum = enum_namespace() -cast_in_place = express_getattr(IfcPileConstructionEnum, 'CAST_IN_PLACE', INDETERMINATE) -composite = express_getattr(IfcPileConstructionEnum, 'COMPOSITE', INDETERMINATE) -precast_concrete = express_getattr(IfcPileConstructionEnum, 'PRECAST_CONCRETE', INDETERMINATE) -prefab_steel = express_getattr(IfcPileConstructionEnum, 'PREFAB_STEEL', INDETERMINATE) -userdefined = express_getattr(IfcPileConstructionEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPileConstructionEnum, 'NOTDEFINED', INDETERMINATE) +cast_in_place = IfcPileConstructionEnum.CAST_IN_PLACE +composite = IfcPileConstructionEnum.COMPOSITE +precast_concrete = IfcPileConstructionEnum.PRECAST_CONCRETE +prefab_steel = IfcPileConstructionEnum.PREFAB_STEEL +userdefined = IfcPileConstructionEnum.USERDEFINED +notdefined = IfcPileConstructionEnum.NOTDEFINED IfcPileTypeEnum = enum_namespace() -bored = express_getattr(IfcPileTypeEnum, 'BORED', INDETERMINATE) -cohesion = express_getattr(IfcPileTypeEnum, 'COHESION', INDETERMINATE) -driven = express_getattr(IfcPileTypeEnum, 'DRIVEN', INDETERMINATE) -friction = express_getattr(IfcPileTypeEnum, 'FRICTION', INDETERMINATE) -jetgrouting = express_getattr(IfcPileTypeEnum, 'JETGROUTING', INDETERMINATE) -support = express_getattr(IfcPileTypeEnum, 'SUPPORT', INDETERMINATE) -userdefined = express_getattr(IfcPileTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPileTypeEnum, 'NOTDEFINED', INDETERMINATE) +bored = IfcPileTypeEnum.BORED +cohesion = IfcPileTypeEnum.COHESION +driven = IfcPileTypeEnum.DRIVEN +friction = IfcPileTypeEnum.FRICTION +jetgrouting = IfcPileTypeEnum.JETGROUTING +support = IfcPileTypeEnum.SUPPORT +userdefined = IfcPileTypeEnum.USERDEFINED +notdefined = IfcPileTypeEnum.NOTDEFINED IfcPipeFittingTypeEnum = enum_namespace() -bend = express_getattr(IfcPipeFittingTypeEnum, 'BEND', INDETERMINATE) -connector = express_getattr(IfcPipeFittingTypeEnum, 'CONNECTOR', INDETERMINATE) -entry = express_getattr(IfcPipeFittingTypeEnum, 'ENTRY', INDETERMINATE) -exit = express_getattr(IfcPipeFittingTypeEnum, 'EXIT', INDETERMINATE) -junction = express_getattr(IfcPipeFittingTypeEnum, 'JUNCTION', INDETERMINATE) -obstruction = express_getattr(IfcPipeFittingTypeEnum, 'OBSTRUCTION', INDETERMINATE) -transition = express_getattr(IfcPipeFittingTypeEnum, 'TRANSITION', INDETERMINATE) -userdefined = express_getattr(IfcPipeFittingTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPipeFittingTypeEnum, 'NOTDEFINED', INDETERMINATE) +bend = IfcPipeFittingTypeEnum.BEND +connector = IfcPipeFittingTypeEnum.CONNECTOR +entry = IfcPipeFittingTypeEnum.ENTRY +exit = IfcPipeFittingTypeEnum.EXIT +junction = IfcPipeFittingTypeEnum.JUNCTION +obstruction = IfcPipeFittingTypeEnum.OBSTRUCTION +transition = IfcPipeFittingTypeEnum.TRANSITION +userdefined = IfcPipeFittingTypeEnum.USERDEFINED +notdefined = IfcPipeFittingTypeEnum.NOTDEFINED IfcPipeSegmentTypeEnum = enum_namespace() -culvert = express_getattr(IfcPipeSegmentTypeEnum, 'CULVERT', INDETERMINATE) -flexiblesegment = express_getattr(IfcPipeSegmentTypeEnum, 'FLEXIBLESEGMENT', INDETERMINATE) -gutter = express_getattr(IfcPipeSegmentTypeEnum, 'GUTTER', INDETERMINATE) -rigidsegment = express_getattr(IfcPipeSegmentTypeEnum, 'RIGIDSEGMENT', INDETERMINATE) -spool = express_getattr(IfcPipeSegmentTypeEnum, 'SPOOL', INDETERMINATE) -userdefined = express_getattr(IfcPipeSegmentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPipeSegmentTypeEnum, 'NOTDEFINED', INDETERMINATE) +culvert = IfcPipeSegmentTypeEnum.CULVERT +flexiblesegment = IfcPipeSegmentTypeEnum.FLEXIBLESEGMENT +gutter = IfcPipeSegmentTypeEnum.GUTTER +rigidsegment = IfcPipeSegmentTypeEnum.RIGIDSEGMENT +spool = IfcPipeSegmentTypeEnum.SPOOL +userdefined = IfcPipeSegmentTypeEnum.USERDEFINED +notdefined = IfcPipeSegmentTypeEnum.NOTDEFINED IfcPlateTypeEnum = enum_namespace() -base_plate = express_getattr(IfcPlateTypeEnum, 'BASE_PLATE', INDETERMINATE) -cover_plate = express_getattr(IfcPlateTypeEnum, 'COVER_PLATE', INDETERMINATE) -curtain_panel = express_getattr(IfcPlateTypeEnum, 'CURTAIN_PANEL', INDETERMINATE) -flange_plate = express_getattr(IfcPlateTypeEnum, 'FLANGE_PLATE', INDETERMINATE) -gusset_plate = express_getattr(IfcPlateTypeEnum, 'GUSSET_PLATE', INDETERMINATE) -sheet = express_getattr(IfcPlateTypeEnum, 'SHEET', INDETERMINATE) -splice_plate = express_getattr(IfcPlateTypeEnum, 'SPLICE_PLATE', INDETERMINATE) -stiffener_plate = express_getattr(IfcPlateTypeEnum, 'STIFFENER_PLATE', INDETERMINATE) -web_plate = express_getattr(IfcPlateTypeEnum, 'WEB_PLATE', INDETERMINATE) -userdefined = express_getattr(IfcPlateTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPlateTypeEnum, 'NOTDEFINED', INDETERMINATE) +base_plate = IfcPlateTypeEnum.BASE_PLATE +cover_plate = IfcPlateTypeEnum.COVER_PLATE +curtain_panel = IfcPlateTypeEnum.CURTAIN_PANEL +flange_plate = IfcPlateTypeEnum.FLANGE_PLATE +gusset_plate = IfcPlateTypeEnum.GUSSET_PLATE +sheet = IfcPlateTypeEnum.SHEET +splice_plate = IfcPlateTypeEnum.SPLICE_PLATE +stiffener_plate = IfcPlateTypeEnum.STIFFENER_PLATE +web_plate = IfcPlateTypeEnum.WEB_PLATE +userdefined = IfcPlateTypeEnum.USERDEFINED +notdefined = IfcPlateTypeEnum.NOTDEFINED IfcPreferredSurfaceCurveRepresentation = enum_namespace() -curve3d = express_getattr(IfcPreferredSurfaceCurveRepresentation, 'CURVE3D', INDETERMINATE) -pcurve_s1 = express_getattr(IfcPreferredSurfaceCurveRepresentation, 'PCURVE_S1', INDETERMINATE) -pcurve_s2 = express_getattr(IfcPreferredSurfaceCurveRepresentation, 'PCURVE_S2', INDETERMINATE) +curve3d = IfcPreferredSurfaceCurveRepresentation.CURVE3D +pcurve_s1 = IfcPreferredSurfaceCurveRepresentation.PCURVE_S1 +pcurve_s2 = IfcPreferredSurfaceCurveRepresentation.PCURVE_S2 IfcProcedureTypeEnum = enum_namespace() -advice_caution = express_getattr(IfcProcedureTypeEnum, 'ADVICE_CAUTION', INDETERMINATE) -advice_note = express_getattr(IfcProcedureTypeEnum, 'ADVICE_NOTE', INDETERMINATE) -advice_warning = express_getattr(IfcProcedureTypeEnum, 'ADVICE_WARNING', INDETERMINATE) -calibration = express_getattr(IfcProcedureTypeEnum, 'CALIBRATION', INDETERMINATE) -diagnostic = express_getattr(IfcProcedureTypeEnum, 'DIAGNOSTIC', INDETERMINATE) -shutdown = express_getattr(IfcProcedureTypeEnum, 'SHUTDOWN', INDETERMINATE) -startup = express_getattr(IfcProcedureTypeEnum, 'STARTUP', INDETERMINATE) -userdefined = express_getattr(IfcProcedureTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcProcedureTypeEnum, 'NOTDEFINED', INDETERMINATE) +advice_caution = IfcProcedureTypeEnum.ADVICE_CAUTION +advice_note = IfcProcedureTypeEnum.ADVICE_NOTE +advice_warning = IfcProcedureTypeEnum.ADVICE_WARNING +calibration = IfcProcedureTypeEnum.CALIBRATION +diagnostic = IfcProcedureTypeEnum.DIAGNOSTIC +shutdown = IfcProcedureTypeEnum.SHUTDOWN +startup = IfcProcedureTypeEnum.STARTUP +userdefined = IfcProcedureTypeEnum.USERDEFINED +notdefined = IfcProcedureTypeEnum.NOTDEFINED IfcProfileTypeEnum = enum_namespace() -area = express_getattr(IfcProfileTypeEnum, 'AREA', INDETERMINATE) -curve = express_getattr(IfcProfileTypeEnum, 'CURVE', INDETERMINATE) +area = IfcProfileTypeEnum.AREA +curve = IfcProfileTypeEnum.CURVE IfcProjectOrderTypeEnum = enum_namespace() -changeorder = express_getattr(IfcProjectOrderTypeEnum, 'CHANGEORDER', INDETERMINATE) -maintenanceworkorder = express_getattr(IfcProjectOrderTypeEnum, 'MAINTENANCEWORKORDER', INDETERMINATE) -moveorder = express_getattr(IfcProjectOrderTypeEnum, 'MOVEORDER', INDETERMINATE) -purchaseorder = express_getattr(IfcProjectOrderTypeEnum, 'PURCHASEORDER', INDETERMINATE) -workorder = express_getattr(IfcProjectOrderTypeEnum, 'WORKORDER', INDETERMINATE) -userdefined = express_getattr(IfcProjectOrderTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcProjectOrderTypeEnum, 'NOTDEFINED', INDETERMINATE) +changeorder = IfcProjectOrderTypeEnum.CHANGEORDER +maintenanceworkorder = IfcProjectOrderTypeEnum.MAINTENANCEWORKORDER +moveorder = IfcProjectOrderTypeEnum.MOVEORDER +purchaseorder = IfcProjectOrderTypeEnum.PURCHASEORDER +workorder = IfcProjectOrderTypeEnum.WORKORDER +userdefined = IfcProjectOrderTypeEnum.USERDEFINED +notdefined = IfcProjectOrderTypeEnum.NOTDEFINED IfcProjectedOrTrueLengthEnum = enum_namespace() -projected_length = express_getattr(IfcProjectedOrTrueLengthEnum, 'PROJECTED_LENGTH', INDETERMINATE) -true_length = express_getattr(IfcProjectedOrTrueLengthEnum, 'TRUE_LENGTH', INDETERMINATE) +projected_length = IfcProjectedOrTrueLengthEnum.PROJECTED_LENGTH +true_length = IfcProjectedOrTrueLengthEnum.TRUE_LENGTH IfcProjectionElementTypeEnum = enum_namespace() -blister = express_getattr(IfcProjectionElementTypeEnum, 'BLISTER', INDETERMINATE) -deviator = express_getattr(IfcProjectionElementTypeEnum, 'DEVIATOR', INDETERMINATE) -userdefined = express_getattr(IfcProjectionElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcProjectionElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +blister = IfcProjectionElementTypeEnum.BLISTER +deviator = IfcProjectionElementTypeEnum.DEVIATOR +userdefined = IfcProjectionElementTypeEnum.USERDEFINED +notdefined = IfcProjectionElementTypeEnum.NOTDEFINED IfcPropertySetTemplateTypeEnum = enum_namespace() -pset_materialdriven = express_getattr(IfcPropertySetTemplateTypeEnum, 'PSET_MATERIALDRIVEN', INDETERMINATE) -pset_occurrencedriven = express_getattr(IfcPropertySetTemplateTypeEnum, 'PSET_OCCURRENCEDRIVEN', INDETERMINATE) -pset_performancedriven = express_getattr(IfcPropertySetTemplateTypeEnum, 'PSET_PERFORMANCEDRIVEN', INDETERMINATE) -pset_profiledriven = express_getattr(IfcPropertySetTemplateTypeEnum, 'PSET_PROFILEDRIVEN', INDETERMINATE) -pset_typedrivenonly = express_getattr(IfcPropertySetTemplateTypeEnum, 'PSET_TYPEDRIVENONLY', INDETERMINATE) -pset_typedrivenoverride = express_getattr(IfcPropertySetTemplateTypeEnum, 'PSET_TYPEDRIVENOVERRIDE', INDETERMINATE) -qto_occurrencedriven = express_getattr(IfcPropertySetTemplateTypeEnum, 'QTO_OCCURRENCEDRIVEN', INDETERMINATE) -qto_typedrivenonly = express_getattr(IfcPropertySetTemplateTypeEnum, 'QTO_TYPEDRIVENONLY', INDETERMINATE) -qto_typedrivenoverride = express_getattr(IfcPropertySetTemplateTypeEnum, 'QTO_TYPEDRIVENOVERRIDE', INDETERMINATE) -notdefined = express_getattr(IfcPropertySetTemplateTypeEnum, 'NOTDEFINED', INDETERMINATE) +pset_materialdriven = IfcPropertySetTemplateTypeEnum.PSET_MATERIALDRIVEN +pset_occurrencedriven = IfcPropertySetTemplateTypeEnum.PSET_OCCURRENCEDRIVEN +pset_performancedriven = IfcPropertySetTemplateTypeEnum.PSET_PERFORMANCEDRIVEN +pset_profiledriven = IfcPropertySetTemplateTypeEnum.PSET_PROFILEDRIVEN +pset_typedrivenonly = IfcPropertySetTemplateTypeEnum.PSET_TYPEDRIVENONLY +pset_typedrivenoverride = IfcPropertySetTemplateTypeEnum.PSET_TYPEDRIVENOVERRIDE +qto_occurrencedriven = IfcPropertySetTemplateTypeEnum.QTO_OCCURRENCEDRIVEN +qto_typedrivenonly = IfcPropertySetTemplateTypeEnum.QTO_TYPEDRIVENONLY +qto_typedrivenoverride = IfcPropertySetTemplateTypeEnum.QTO_TYPEDRIVENOVERRIDE +notdefined = IfcPropertySetTemplateTypeEnum.NOTDEFINED IfcProtectiveDeviceTrippingUnitTypeEnum = enum_namespace() -electromagnetic = express_getattr(IfcProtectiveDeviceTrippingUnitTypeEnum, 'ELECTROMAGNETIC', INDETERMINATE) -electronic = express_getattr(IfcProtectiveDeviceTrippingUnitTypeEnum, 'ELECTRONIC', INDETERMINATE) -residualcurrent = express_getattr(IfcProtectiveDeviceTrippingUnitTypeEnum, 'RESIDUALCURRENT', INDETERMINATE) -thermal = express_getattr(IfcProtectiveDeviceTrippingUnitTypeEnum, 'THERMAL', INDETERMINATE) -userdefined = express_getattr(IfcProtectiveDeviceTrippingUnitTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcProtectiveDeviceTrippingUnitTypeEnum, 'NOTDEFINED', INDETERMINATE) +electromagnetic = IfcProtectiveDeviceTrippingUnitTypeEnum.ELECTROMAGNETIC +electronic = IfcProtectiveDeviceTrippingUnitTypeEnum.ELECTRONIC +residualcurrent = IfcProtectiveDeviceTrippingUnitTypeEnum.RESIDUALCURRENT +thermal = IfcProtectiveDeviceTrippingUnitTypeEnum.THERMAL +userdefined = IfcProtectiveDeviceTrippingUnitTypeEnum.USERDEFINED +notdefined = IfcProtectiveDeviceTrippingUnitTypeEnum.NOTDEFINED IfcProtectiveDeviceTypeEnum = enum_namespace() -anti_arcing_device = express_getattr(IfcProtectiveDeviceTypeEnum, 'ANTI_ARCING_DEVICE', INDETERMINATE) -circuitbreaker = express_getattr(IfcProtectiveDeviceTypeEnum, 'CIRCUITBREAKER', INDETERMINATE) -earthingswitch = express_getattr(IfcProtectiveDeviceTypeEnum, 'EARTHINGSWITCH', INDETERMINATE) -earthleakagecircuitbreaker = express_getattr(IfcProtectiveDeviceTypeEnum, 'EARTHLEAKAGECIRCUITBREAKER', INDETERMINATE) -fusedisconnector = express_getattr(IfcProtectiveDeviceTypeEnum, 'FUSEDISCONNECTOR', INDETERMINATE) -residualcurrentcircuitbreaker = express_getattr(IfcProtectiveDeviceTypeEnum, 'RESIDUALCURRENTCIRCUITBREAKER', INDETERMINATE) -residualcurrentswitch = express_getattr(IfcProtectiveDeviceTypeEnum, 'RESIDUALCURRENTSWITCH', INDETERMINATE) -sparkgap = express_getattr(IfcProtectiveDeviceTypeEnum, 'SPARKGAP', INDETERMINATE) -varistor = express_getattr(IfcProtectiveDeviceTypeEnum, 'VARISTOR', INDETERMINATE) -voltagelimiter = express_getattr(IfcProtectiveDeviceTypeEnum, 'VOLTAGELIMITER', INDETERMINATE) -userdefined = express_getattr(IfcProtectiveDeviceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcProtectiveDeviceTypeEnum, 'NOTDEFINED', INDETERMINATE) +anti_arcing_device = IfcProtectiveDeviceTypeEnum.ANTI_ARCING_DEVICE +circuitbreaker = IfcProtectiveDeviceTypeEnum.CIRCUITBREAKER +earthingswitch = IfcProtectiveDeviceTypeEnum.EARTHINGSWITCH +earthleakagecircuitbreaker = IfcProtectiveDeviceTypeEnum.EARTHLEAKAGECIRCUITBREAKER +fusedisconnector = IfcProtectiveDeviceTypeEnum.FUSEDISCONNECTOR +residualcurrentcircuitbreaker = IfcProtectiveDeviceTypeEnum.RESIDUALCURRENTCIRCUITBREAKER +residualcurrentswitch = IfcProtectiveDeviceTypeEnum.RESIDUALCURRENTSWITCH +sparkgap = IfcProtectiveDeviceTypeEnum.SPARKGAP +varistor = IfcProtectiveDeviceTypeEnum.VARISTOR +voltagelimiter = IfcProtectiveDeviceTypeEnum.VOLTAGELIMITER +userdefined = IfcProtectiveDeviceTypeEnum.USERDEFINED +notdefined = IfcProtectiveDeviceTypeEnum.NOTDEFINED IfcPumpTypeEnum = enum_namespace() -circulator = express_getattr(IfcPumpTypeEnum, 'CIRCULATOR', INDETERMINATE) -endsuction = express_getattr(IfcPumpTypeEnum, 'ENDSUCTION', INDETERMINATE) -splitcase = express_getattr(IfcPumpTypeEnum, 'SPLITCASE', INDETERMINATE) -submersiblepump = express_getattr(IfcPumpTypeEnum, 'SUBMERSIBLEPUMP', INDETERMINATE) -sumppump = express_getattr(IfcPumpTypeEnum, 'SUMPPUMP', INDETERMINATE) -verticalinline = express_getattr(IfcPumpTypeEnum, 'VERTICALINLINE', INDETERMINATE) -verticalturbine = express_getattr(IfcPumpTypeEnum, 'VERTICALTURBINE', INDETERMINATE) -userdefined = express_getattr(IfcPumpTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPumpTypeEnum, 'NOTDEFINED', INDETERMINATE) +circulator = IfcPumpTypeEnum.CIRCULATOR +endsuction = IfcPumpTypeEnum.ENDSUCTION +splitcase = IfcPumpTypeEnum.SPLITCASE +submersiblepump = IfcPumpTypeEnum.SUBMERSIBLEPUMP +sumppump = IfcPumpTypeEnum.SUMPPUMP +verticalinline = IfcPumpTypeEnum.VERTICALINLINE +verticalturbine = IfcPumpTypeEnum.VERTICALTURBINE +userdefined = IfcPumpTypeEnum.USERDEFINED +notdefined = IfcPumpTypeEnum.NOTDEFINED IfcRailTypeEnum = enum_namespace() -blade = express_getattr(IfcRailTypeEnum, 'BLADE', INDETERMINATE) -checkrail = express_getattr(IfcRailTypeEnum, 'CHECKRAIL', INDETERMINATE) -guardrail = express_getattr(IfcRailTypeEnum, 'GUARDRAIL', INDETERMINATE) -rackrail = express_getattr(IfcRailTypeEnum, 'RACKRAIL', INDETERMINATE) -rail = express_getattr(IfcRailTypeEnum, 'RAIL', INDETERMINATE) -stockrail = express_getattr(IfcRailTypeEnum, 'STOCKRAIL', INDETERMINATE) -userdefined = express_getattr(IfcRailTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcRailTypeEnum, 'NOTDEFINED', INDETERMINATE) +blade = IfcRailTypeEnum.BLADE +checkrail = IfcRailTypeEnum.CHECKRAIL +guardrail = IfcRailTypeEnum.GUARDRAIL +rackrail = IfcRailTypeEnum.RACKRAIL +rail = IfcRailTypeEnum.RAIL +stockrail = IfcRailTypeEnum.STOCKRAIL +userdefined = IfcRailTypeEnum.USERDEFINED +notdefined = IfcRailTypeEnum.NOTDEFINED IfcRailingTypeEnum = enum_namespace() -balustrade = express_getattr(IfcRailingTypeEnum, 'BALUSTRADE', INDETERMINATE) -fence = express_getattr(IfcRailingTypeEnum, 'FENCE', INDETERMINATE) -guardrail = express_getattr(IfcRailingTypeEnum, 'GUARDRAIL', INDETERMINATE) -handrail = express_getattr(IfcRailingTypeEnum, 'HANDRAIL', INDETERMINATE) -userdefined = express_getattr(IfcRailingTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcRailingTypeEnum, 'NOTDEFINED', INDETERMINATE) +balustrade = IfcRailingTypeEnum.BALUSTRADE +fence = IfcRailingTypeEnum.FENCE +guardrail = IfcRailingTypeEnum.GUARDRAIL +handrail = IfcRailingTypeEnum.HANDRAIL +userdefined = IfcRailingTypeEnum.USERDEFINED +notdefined = IfcRailingTypeEnum.NOTDEFINED IfcRailwayPartTypeEnum = enum_namespace() -abovetrack = express_getattr(IfcRailwayPartTypeEnum, 'ABOVETRACK', INDETERMINATE) -dilationtrack = express_getattr(IfcRailwayPartTypeEnum, 'DILATIONTRACK', INDETERMINATE) -lineside = express_getattr(IfcRailwayPartTypeEnum, 'LINESIDE', INDETERMINATE) -linesidepart = express_getattr(IfcRailwayPartTypeEnum, 'LINESIDEPART', INDETERMINATE) -plaintrack = express_getattr(IfcRailwayPartTypeEnum, 'PLAINTRACK', INDETERMINATE) -substructure = express_getattr(IfcRailwayPartTypeEnum, 'SUBSTRUCTURE', INDETERMINATE) -track = express_getattr(IfcRailwayPartTypeEnum, 'TRACK', INDETERMINATE) -trackpart = express_getattr(IfcRailwayPartTypeEnum, 'TRACKPART', INDETERMINATE) -turnouttrack = express_getattr(IfcRailwayPartTypeEnum, 'TURNOUTTRACK', INDETERMINATE) -userdefined = express_getattr(IfcRailwayPartTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcRailwayPartTypeEnum, 'NOTDEFINED', INDETERMINATE) +abovetrack = IfcRailwayPartTypeEnum.ABOVETRACK +dilationtrack = IfcRailwayPartTypeEnum.DILATIONTRACK +lineside = IfcRailwayPartTypeEnum.LINESIDE +linesidepart = IfcRailwayPartTypeEnum.LINESIDEPART +plaintrack = IfcRailwayPartTypeEnum.PLAINTRACK +substructure = IfcRailwayPartTypeEnum.SUBSTRUCTURE +track = IfcRailwayPartTypeEnum.TRACK +trackpart = IfcRailwayPartTypeEnum.TRACKPART +turnouttrack = IfcRailwayPartTypeEnum.TURNOUTTRACK +userdefined = IfcRailwayPartTypeEnum.USERDEFINED +notdefined = IfcRailwayPartTypeEnum.NOTDEFINED IfcRailwayTypeEnum = enum_namespace() -userdefined = express_getattr(IfcRailwayTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcRailwayTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcRailwayTypeEnum.USERDEFINED +notdefined = IfcRailwayTypeEnum.NOTDEFINED IfcRampFlightTypeEnum = enum_namespace() -spiral = express_getattr(IfcRampFlightTypeEnum, 'SPIRAL', INDETERMINATE) -straight = express_getattr(IfcRampFlightTypeEnum, 'STRAIGHT', INDETERMINATE) -userdefined = express_getattr(IfcRampFlightTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcRampFlightTypeEnum, 'NOTDEFINED', INDETERMINATE) +spiral = IfcRampFlightTypeEnum.SPIRAL +straight = IfcRampFlightTypeEnum.STRAIGHT +userdefined = IfcRampFlightTypeEnum.USERDEFINED +notdefined = IfcRampFlightTypeEnum.NOTDEFINED IfcRampTypeEnum = enum_namespace() -half_turn_ramp = express_getattr(IfcRampTypeEnum, 'HALF_TURN_RAMP', INDETERMINATE) -quarter_turn_ramp = express_getattr(IfcRampTypeEnum, 'QUARTER_TURN_RAMP', INDETERMINATE) -spiral_ramp = express_getattr(IfcRampTypeEnum, 'SPIRAL_RAMP', INDETERMINATE) -straight_run_ramp = express_getattr(IfcRampTypeEnum, 'STRAIGHT_RUN_RAMP', INDETERMINATE) -two_quarter_turn_ramp = express_getattr(IfcRampTypeEnum, 'TWO_QUARTER_TURN_RAMP', INDETERMINATE) -two_straight_run_ramp = express_getattr(IfcRampTypeEnum, 'TWO_STRAIGHT_RUN_RAMP', INDETERMINATE) -userdefined = express_getattr(IfcRampTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcRampTypeEnum, 'NOTDEFINED', INDETERMINATE) +half_turn_ramp = IfcRampTypeEnum.HALF_TURN_RAMP +quarter_turn_ramp = IfcRampTypeEnum.QUARTER_TURN_RAMP +spiral_ramp = IfcRampTypeEnum.SPIRAL_RAMP +straight_run_ramp = IfcRampTypeEnum.STRAIGHT_RUN_RAMP +two_quarter_turn_ramp = IfcRampTypeEnum.TWO_QUARTER_TURN_RAMP +two_straight_run_ramp = IfcRampTypeEnum.TWO_STRAIGHT_RUN_RAMP +userdefined = IfcRampTypeEnum.USERDEFINED +notdefined = IfcRampTypeEnum.NOTDEFINED IfcRecurrenceTypeEnum = enum_namespace() -by_day_count = express_getattr(IfcRecurrenceTypeEnum, 'BY_DAY_COUNT', INDETERMINATE) -by_weekday_count = express_getattr(IfcRecurrenceTypeEnum, 'BY_WEEKDAY_COUNT', INDETERMINATE) -daily = express_getattr(IfcRecurrenceTypeEnum, 'DAILY', INDETERMINATE) -monthly_by_day_of_month = express_getattr(IfcRecurrenceTypeEnum, 'MONTHLY_BY_DAY_OF_MONTH', INDETERMINATE) -monthly_by_position = express_getattr(IfcRecurrenceTypeEnum, 'MONTHLY_BY_POSITION', INDETERMINATE) -weekly = express_getattr(IfcRecurrenceTypeEnum, 'WEEKLY', INDETERMINATE) -yearly_by_day_of_month = express_getattr(IfcRecurrenceTypeEnum, 'YEARLY_BY_DAY_OF_MONTH', INDETERMINATE) -yearly_by_position = express_getattr(IfcRecurrenceTypeEnum, 'YEARLY_BY_POSITION', INDETERMINATE) +by_day_count = IfcRecurrenceTypeEnum.BY_DAY_COUNT +by_weekday_count = IfcRecurrenceTypeEnum.BY_WEEKDAY_COUNT +daily = IfcRecurrenceTypeEnum.DAILY +monthly_by_day_of_month = IfcRecurrenceTypeEnum.MONTHLY_BY_DAY_OF_MONTH +monthly_by_position = IfcRecurrenceTypeEnum.MONTHLY_BY_POSITION +weekly = IfcRecurrenceTypeEnum.WEEKLY +yearly_by_day_of_month = IfcRecurrenceTypeEnum.YEARLY_BY_DAY_OF_MONTH +yearly_by_position = IfcRecurrenceTypeEnum.YEARLY_BY_POSITION IfcReferentTypeEnum = enum_namespace() -boundary = express_getattr(IfcReferentTypeEnum, 'BOUNDARY', INDETERMINATE) -intersection = express_getattr(IfcReferentTypeEnum, 'INTERSECTION', INDETERMINATE) -kilopoint = express_getattr(IfcReferentTypeEnum, 'KILOPOINT', INDETERMINATE) -landmark = express_getattr(IfcReferentTypeEnum, 'LANDMARK', INDETERMINATE) -milepoint = express_getattr(IfcReferentTypeEnum, 'MILEPOINT', INDETERMINATE) -position = express_getattr(IfcReferentTypeEnum, 'POSITION', INDETERMINATE) -referencemarker = express_getattr(IfcReferentTypeEnum, 'REFERENCEMARKER', INDETERMINATE) -station = express_getattr(IfcReferentTypeEnum, 'STATION', INDETERMINATE) -superelevationevent = express_getattr(IfcReferentTypeEnum, 'SUPERELEVATIONEVENT', INDETERMINATE) -widthevent = express_getattr(IfcReferentTypeEnum, 'WIDTHEVENT', INDETERMINATE) -userdefined = express_getattr(IfcReferentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcReferentTypeEnum, 'NOTDEFINED', INDETERMINATE) +boundary = IfcReferentTypeEnum.BOUNDARY +intersection = IfcReferentTypeEnum.INTERSECTION +kilopoint = IfcReferentTypeEnum.KILOPOINT +landmark = IfcReferentTypeEnum.LANDMARK +milepoint = IfcReferentTypeEnum.MILEPOINT +position = IfcReferentTypeEnum.POSITION +referencemarker = IfcReferentTypeEnum.REFERENCEMARKER +station = IfcReferentTypeEnum.STATION +superelevationevent = IfcReferentTypeEnum.SUPERELEVATIONEVENT +widthevent = IfcReferentTypeEnum.WIDTHEVENT +userdefined = IfcReferentTypeEnum.USERDEFINED +notdefined = IfcReferentTypeEnum.NOTDEFINED IfcReflectanceMethodEnum = enum_namespace() -blinn = express_getattr(IfcReflectanceMethodEnum, 'BLINN', INDETERMINATE) -flat = express_getattr(IfcReflectanceMethodEnum, 'FLAT', INDETERMINATE) -glass = express_getattr(IfcReflectanceMethodEnum, 'GLASS', INDETERMINATE) -matt = express_getattr(IfcReflectanceMethodEnum, 'MATT', INDETERMINATE) -metal = express_getattr(IfcReflectanceMethodEnum, 'METAL', INDETERMINATE) -mirror = express_getattr(IfcReflectanceMethodEnum, 'MIRROR', INDETERMINATE) -phong = express_getattr(IfcReflectanceMethodEnum, 'PHONG', INDETERMINATE) -physical = express_getattr(IfcReflectanceMethodEnum, 'PHYSICAL', INDETERMINATE) -plastic = express_getattr(IfcReflectanceMethodEnum, 'PLASTIC', INDETERMINATE) -strauss = express_getattr(IfcReflectanceMethodEnum, 'STRAUSS', INDETERMINATE) -notdefined = express_getattr(IfcReflectanceMethodEnum, 'NOTDEFINED', INDETERMINATE) +blinn = IfcReflectanceMethodEnum.BLINN +flat = IfcReflectanceMethodEnum.FLAT +glass = IfcReflectanceMethodEnum.GLASS +matt = IfcReflectanceMethodEnum.MATT +metal = IfcReflectanceMethodEnum.METAL +mirror = IfcReflectanceMethodEnum.MIRROR +phong = IfcReflectanceMethodEnum.PHONG +physical = IfcReflectanceMethodEnum.PHYSICAL +plastic = IfcReflectanceMethodEnum.PLASTIC +strauss = IfcReflectanceMethodEnum.STRAUSS +notdefined = IfcReflectanceMethodEnum.NOTDEFINED IfcReinforcedSoilTypeEnum = enum_namespace() -dynamicallycompacted = express_getattr(IfcReinforcedSoilTypeEnum, 'DYNAMICALLYCOMPACTED', INDETERMINATE) -grouted = express_getattr(IfcReinforcedSoilTypeEnum, 'GROUTED', INDETERMINATE) -replaced = express_getattr(IfcReinforcedSoilTypeEnum, 'REPLACED', INDETERMINATE) -rollercompacted = express_getattr(IfcReinforcedSoilTypeEnum, 'ROLLERCOMPACTED', INDETERMINATE) -surchargepreloaded = express_getattr(IfcReinforcedSoilTypeEnum, 'SURCHARGEPRELOADED', INDETERMINATE) -verticallydrained = express_getattr(IfcReinforcedSoilTypeEnum, 'VERTICALLYDRAINED', INDETERMINATE) -userdefined = express_getattr(IfcReinforcedSoilTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcReinforcedSoilTypeEnum, 'NOTDEFINED', INDETERMINATE) +dynamicallycompacted = IfcReinforcedSoilTypeEnum.DYNAMICALLYCOMPACTED +grouted = IfcReinforcedSoilTypeEnum.GROUTED +replaced = IfcReinforcedSoilTypeEnum.REPLACED +rollercompacted = IfcReinforcedSoilTypeEnum.ROLLERCOMPACTED +surchargepreloaded = IfcReinforcedSoilTypeEnum.SURCHARGEPRELOADED +verticallydrained = IfcReinforcedSoilTypeEnum.VERTICALLYDRAINED +userdefined = IfcReinforcedSoilTypeEnum.USERDEFINED +notdefined = IfcReinforcedSoilTypeEnum.NOTDEFINED IfcReinforcingBarRoleEnum = enum_namespace() -anchoring = express_getattr(IfcReinforcingBarRoleEnum, 'ANCHORING', INDETERMINATE) -edge = express_getattr(IfcReinforcingBarRoleEnum, 'EDGE', INDETERMINATE) -ligature = express_getattr(IfcReinforcingBarRoleEnum, 'LIGATURE', INDETERMINATE) -main = express_getattr(IfcReinforcingBarRoleEnum, 'MAIN', INDETERMINATE) -punching = express_getattr(IfcReinforcingBarRoleEnum, 'PUNCHING', INDETERMINATE) -ring = express_getattr(IfcReinforcingBarRoleEnum, 'RING', INDETERMINATE) -shear = express_getattr(IfcReinforcingBarRoleEnum, 'SHEAR', INDETERMINATE) -stud = express_getattr(IfcReinforcingBarRoleEnum, 'STUD', INDETERMINATE) -userdefined = express_getattr(IfcReinforcingBarRoleEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcReinforcingBarRoleEnum, 'NOTDEFINED', INDETERMINATE) +anchoring = IfcReinforcingBarRoleEnum.ANCHORING +edge = IfcReinforcingBarRoleEnum.EDGE +ligature = IfcReinforcingBarRoleEnum.LIGATURE +main = IfcReinforcingBarRoleEnum.MAIN +punching = IfcReinforcingBarRoleEnum.PUNCHING +ring = IfcReinforcingBarRoleEnum.RING +shear = IfcReinforcingBarRoleEnum.SHEAR +stud = IfcReinforcingBarRoleEnum.STUD +userdefined = IfcReinforcingBarRoleEnum.USERDEFINED +notdefined = IfcReinforcingBarRoleEnum.NOTDEFINED IfcReinforcingBarSurfaceEnum = enum_namespace() -plain = express_getattr(IfcReinforcingBarSurfaceEnum, 'PLAIN', INDETERMINATE) -textured = express_getattr(IfcReinforcingBarSurfaceEnum, 'TEXTURED', INDETERMINATE) +plain = IfcReinforcingBarSurfaceEnum.PLAIN +textured = IfcReinforcingBarSurfaceEnum.TEXTURED IfcReinforcingBarTypeEnum = enum_namespace() -anchoring = express_getattr(IfcReinforcingBarTypeEnum, 'ANCHORING', INDETERMINATE) -edge = express_getattr(IfcReinforcingBarTypeEnum, 'EDGE', INDETERMINATE) -ligature = express_getattr(IfcReinforcingBarTypeEnum, 'LIGATURE', INDETERMINATE) -main = express_getattr(IfcReinforcingBarTypeEnum, 'MAIN', INDETERMINATE) -punching = express_getattr(IfcReinforcingBarTypeEnum, 'PUNCHING', INDETERMINATE) -ring = express_getattr(IfcReinforcingBarTypeEnum, 'RING', INDETERMINATE) -shear = express_getattr(IfcReinforcingBarTypeEnum, 'SHEAR', INDETERMINATE) -spacebar = express_getattr(IfcReinforcingBarTypeEnum, 'SPACEBAR', INDETERMINATE) -stud = express_getattr(IfcReinforcingBarTypeEnum, 'STUD', INDETERMINATE) -userdefined = express_getattr(IfcReinforcingBarTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcReinforcingBarTypeEnum, 'NOTDEFINED', INDETERMINATE) +anchoring = IfcReinforcingBarTypeEnum.ANCHORING +edge = IfcReinforcingBarTypeEnum.EDGE +ligature = IfcReinforcingBarTypeEnum.LIGATURE +main = IfcReinforcingBarTypeEnum.MAIN +punching = IfcReinforcingBarTypeEnum.PUNCHING +ring = IfcReinforcingBarTypeEnum.RING +shear = IfcReinforcingBarTypeEnum.SHEAR +spacebar = IfcReinforcingBarTypeEnum.SPACEBAR +stud = IfcReinforcingBarTypeEnum.STUD +userdefined = IfcReinforcingBarTypeEnum.USERDEFINED +notdefined = IfcReinforcingBarTypeEnum.NOTDEFINED IfcReinforcingMeshTypeEnum = enum_namespace() -userdefined = express_getattr(IfcReinforcingMeshTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcReinforcingMeshTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcReinforcingMeshTypeEnum.USERDEFINED +notdefined = IfcReinforcingMeshTypeEnum.NOTDEFINED IfcRoadPartTypeEnum = enum_namespace() -bicyclecrossing = express_getattr(IfcRoadPartTypeEnum, 'BICYCLECROSSING', INDETERMINATE) -bus_stop = express_getattr(IfcRoadPartTypeEnum, 'BUS_STOP', INDETERMINATE) -carriageway = express_getattr(IfcRoadPartTypeEnum, 'CARRIAGEWAY', INDETERMINATE) -centralisland = express_getattr(IfcRoadPartTypeEnum, 'CENTRALISLAND', INDETERMINATE) -centralreserve = express_getattr(IfcRoadPartTypeEnum, 'CENTRALRESERVE', INDETERMINATE) -hardshoulder = express_getattr(IfcRoadPartTypeEnum, 'HARDSHOULDER', INDETERMINATE) -intersection = express_getattr(IfcRoadPartTypeEnum, 'INTERSECTION', INDETERMINATE) -layby = express_getattr(IfcRoadPartTypeEnum, 'LAYBY', INDETERMINATE) -parkingbay = express_getattr(IfcRoadPartTypeEnum, 'PARKINGBAY', INDETERMINATE) -passingbay = express_getattr(IfcRoadPartTypeEnum, 'PASSINGBAY', INDETERMINATE) -pedestrian_crossing = express_getattr(IfcRoadPartTypeEnum, 'PEDESTRIAN_CROSSING', INDETERMINATE) -railwaycrossing = express_getattr(IfcRoadPartTypeEnum, 'RAILWAYCROSSING', INDETERMINATE) -refugeisland = express_getattr(IfcRoadPartTypeEnum, 'REFUGEISLAND', INDETERMINATE) -roadsegment = express_getattr(IfcRoadPartTypeEnum, 'ROADSEGMENT', INDETERMINATE) -roadside = express_getattr(IfcRoadPartTypeEnum, 'ROADSIDE', INDETERMINATE) -roadsidepart = express_getattr(IfcRoadPartTypeEnum, 'ROADSIDEPART', INDETERMINATE) -roadwayplateau = express_getattr(IfcRoadPartTypeEnum, 'ROADWAYPLATEAU', INDETERMINATE) -roundabout = express_getattr(IfcRoadPartTypeEnum, 'ROUNDABOUT', INDETERMINATE) -shoulder = express_getattr(IfcRoadPartTypeEnum, 'SHOULDER', INDETERMINATE) -sidewalk = express_getattr(IfcRoadPartTypeEnum, 'SIDEWALK', INDETERMINATE) -softshoulder = express_getattr(IfcRoadPartTypeEnum, 'SOFTSHOULDER', INDETERMINATE) -tollplaza = express_getattr(IfcRoadPartTypeEnum, 'TOLLPLAZA', INDETERMINATE) -trafficisland = express_getattr(IfcRoadPartTypeEnum, 'TRAFFICISLAND', INDETERMINATE) -trafficlane = express_getattr(IfcRoadPartTypeEnum, 'TRAFFICLANE', INDETERMINATE) -userdefined = express_getattr(IfcRoadPartTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcRoadPartTypeEnum, 'NOTDEFINED', INDETERMINATE) +bicyclecrossing = IfcRoadPartTypeEnum.BICYCLECROSSING +bus_stop = IfcRoadPartTypeEnum.BUS_STOP +carriageway = IfcRoadPartTypeEnum.CARRIAGEWAY +centralisland = IfcRoadPartTypeEnum.CENTRALISLAND +centralreserve = IfcRoadPartTypeEnum.CENTRALRESERVE +hardshoulder = IfcRoadPartTypeEnum.HARDSHOULDER +intersection = IfcRoadPartTypeEnum.INTERSECTION +layby = IfcRoadPartTypeEnum.LAYBY +parkingbay = IfcRoadPartTypeEnum.PARKINGBAY +passingbay = IfcRoadPartTypeEnum.PASSINGBAY +pedestrian_crossing = IfcRoadPartTypeEnum.PEDESTRIAN_CROSSING +railwaycrossing = IfcRoadPartTypeEnum.RAILWAYCROSSING +refugeisland = IfcRoadPartTypeEnum.REFUGEISLAND +roadsegment = IfcRoadPartTypeEnum.ROADSEGMENT +roadside = IfcRoadPartTypeEnum.ROADSIDE +roadsidepart = IfcRoadPartTypeEnum.ROADSIDEPART +roadwayplateau = IfcRoadPartTypeEnum.ROADWAYPLATEAU +roundabout = IfcRoadPartTypeEnum.ROUNDABOUT +shoulder = IfcRoadPartTypeEnum.SHOULDER +sidewalk = IfcRoadPartTypeEnum.SIDEWALK +softshoulder = IfcRoadPartTypeEnum.SOFTSHOULDER +tollplaza = IfcRoadPartTypeEnum.TOLLPLAZA +trafficisland = IfcRoadPartTypeEnum.TRAFFICISLAND +trafficlane = IfcRoadPartTypeEnum.TRAFFICLANE +userdefined = IfcRoadPartTypeEnum.USERDEFINED +notdefined = IfcRoadPartTypeEnum.NOTDEFINED IfcRoadTypeEnum = enum_namespace() -userdefined = express_getattr(IfcRoadTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcRoadTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcRoadTypeEnum.USERDEFINED +notdefined = IfcRoadTypeEnum.NOTDEFINED IfcRoleEnum = enum_namespace() -architect = express_getattr(IfcRoleEnum, 'ARCHITECT', INDETERMINATE) -buildingoperator = express_getattr(IfcRoleEnum, 'BUILDINGOPERATOR', INDETERMINATE) -buildingowner = express_getattr(IfcRoleEnum, 'BUILDINGOWNER', INDETERMINATE) -civilengineer = express_getattr(IfcRoleEnum, 'CIVILENGINEER', INDETERMINATE) -client = express_getattr(IfcRoleEnum, 'CLIENT', INDETERMINATE) -commissioningengineer = express_getattr(IfcRoleEnum, 'COMMISSIONINGENGINEER', INDETERMINATE) -constructionmanager = express_getattr(IfcRoleEnum, 'CONSTRUCTIONMANAGER', INDETERMINATE) -consultant = express_getattr(IfcRoleEnum, 'CONSULTANT', INDETERMINATE) -contractor = express_getattr(IfcRoleEnum, 'CONTRACTOR', INDETERMINATE) -costengineer = express_getattr(IfcRoleEnum, 'COSTENGINEER', INDETERMINATE) -electricalengineer = express_getattr(IfcRoleEnum, 'ELECTRICALENGINEER', INDETERMINATE) -engineer = express_getattr(IfcRoleEnum, 'ENGINEER', INDETERMINATE) -facilitiesmanager = express_getattr(IfcRoleEnum, 'FACILITIESMANAGER', INDETERMINATE) -fieldconstructionmanager = express_getattr(IfcRoleEnum, 'FIELDCONSTRUCTIONMANAGER', INDETERMINATE) -manufacturer = express_getattr(IfcRoleEnum, 'MANUFACTURER', INDETERMINATE) -mechanicalengineer = express_getattr(IfcRoleEnum, 'MECHANICALENGINEER', INDETERMINATE) -owner = express_getattr(IfcRoleEnum, 'OWNER', INDETERMINATE) -projectmanager = express_getattr(IfcRoleEnum, 'PROJECTMANAGER', INDETERMINATE) -reseller = express_getattr(IfcRoleEnum, 'RESELLER', INDETERMINATE) -structuralengineer = express_getattr(IfcRoleEnum, 'STRUCTURALENGINEER', INDETERMINATE) -subcontractor = express_getattr(IfcRoleEnum, 'SUBCONTRACTOR', INDETERMINATE) -supplier = express_getattr(IfcRoleEnum, 'SUPPLIER', INDETERMINATE) -userdefined = express_getattr(IfcRoleEnum, 'USERDEFINED', INDETERMINATE) +architect = IfcRoleEnum.ARCHITECT +buildingoperator = IfcRoleEnum.BUILDINGOPERATOR +buildingowner = IfcRoleEnum.BUILDINGOWNER +civilengineer = IfcRoleEnum.CIVILENGINEER +client = IfcRoleEnum.CLIENT +commissioningengineer = IfcRoleEnum.COMMISSIONINGENGINEER +constructionmanager = IfcRoleEnum.CONSTRUCTIONMANAGER +consultant = IfcRoleEnum.CONSULTANT +contractor = IfcRoleEnum.CONTRACTOR +costengineer = IfcRoleEnum.COSTENGINEER +electricalengineer = IfcRoleEnum.ELECTRICALENGINEER +engineer = IfcRoleEnum.ENGINEER +facilitiesmanager = IfcRoleEnum.FACILITIESMANAGER +fieldconstructionmanager = IfcRoleEnum.FIELDCONSTRUCTIONMANAGER +manufacturer = IfcRoleEnum.MANUFACTURER +mechanicalengineer = IfcRoleEnum.MECHANICALENGINEER +owner = IfcRoleEnum.OWNER +projectmanager = IfcRoleEnum.PROJECTMANAGER +reseller = IfcRoleEnum.RESELLER +structuralengineer = IfcRoleEnum.STRUCTURALENGINEER +subcontractor = IfcRoleEnum.SUBCONTRACTOR +supplier = IfcRoleEnum.SUPPLIER +userdefined = IfcRoleEnum.USERDEFINED IfcRoofTypeEnum = enum_namespace() -barrel_roof = express_getattr(IfcRoofTypeEnum, 'BARREL_ROOF', INDETERMINATE) -butterfly_roof = express_getattr(IfcRoofTypeEnum, 'BUTTERFLY_ROOF', INDETERMINATE) -dome_roof = express_getattr(IfcRoofTypeEnum, 'DOME_ROOF', INDETERMINATE) -flat_roof = express_getattr(IfcRoofTypeEnum, 'FLAT_ROOF', INDETERMINATE) -freeform = express_getattr(IfcRoofTypeEnum, 'FREEFORM', INDETERMINATE) -gable_roof = express_getattr(IfcRoofTypeEnum, 'GABLE_ROOF', INDETERMINATE) -gambrel_roof = express_getattr(IfcRoofTypeEnum, 'GAMBREL_ROOF', INDETERMINATE) -hipped_gable_roof = express_getattr(IfcRoofTypeEnum, 'HIPPED_GABLE_ROOF', INDETERMINATE) -hip_roof = express_getattr(IfcRoofTypeEnum, 'HIP_ROOF', INDETERMINATE) -mansard_roof = express_getattr(IfcRoofTypeEnum, 'MANSARD_ROOF', INDETERMINATE) -pavilion_roof = express_getattr(IfcRoofTypeEnum, 'PAVILION_ROOF', INDETERMINATE) -rainbow_roof = express_getattr(IfcRoofTypeEnum, 'RAINBOW_ROOF', INDETERMINATE) -shed_roof = express_getattr(IfcRoofTypeEnum, 'SHED_ROOF', INDETERMINATE) -userdefined = express_getattr(IfcRoofTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcRoofTypeEnum, 'NOTDEFINED', INDETERMINATE) +barrel_roof = IfcRoofTypeEnum.BARREL_ROOF +butterfly_roof = IfcRoofTypeEnum.BUTTERFLY_ROOF +dome_roof = IfcRoofTypeEnum.DOME_ROOF +flat_roof = IfcRoofTypeEnum.FLAT_ROOF +freeform = IfcRoofTypeEnum.FREEFORM +gable_roof = IfcRoofTypeEnum.GABLE_ROOF +gambrel_roof = IfcRoofTypeEnum.GAMBREL_ROOF +hipped_gable_roof = IfcRoofTypeEnum.HIPPED_GABLE_ROOF +hip_roof = IfcRoofTypeEnum.HIP_ROOF +mansard_roof = IfcRoofTypeEnum.MANSARD_ROOF +pavilion_roof = IfcRoofTypeEnum.PAVILION_ROOF +rainbow_roof = IfcRoofTypeEnum.RAINBOW_ROOF +shed_roof = IfcRoofTypeEnum.SHED_ROOF +userdefined = IfcRoofTypeEnum.USERDEFINED +notdefined = IfcRoofTypeEnum.NOTDEFINED IfcSIPrefix = enum_namespace() -atto = express_getattr(IfcSIPrefix, 'ATTO', INDETERMINATE) -centi = express_getattr(IfcSIPrefix, 'CENTI', INDETERMINATE) -deca = express_getattr(IfcSIPrefix, 'DECA', INDETERMINATE) -deci = express_getattr(IfcSIPrefix, 'DECI', INDETERMINATE) -exa = express_getattr(IfcSIPrefix, 'EXA', INDETERMINATE) -femto = express_getattr(IfcSIPrefix, 'FEMTO', INDETERMINATE) -giga = express_getattr(IfcSIPrefix, 'GIGA', INDETERMINATE) -hecto = express_getattr(IfcSIPrefix, 'HECTO', INDETERMINATE) -kilo = express_getattr(IfcSIPrefix, 'KILO', INDETERMINATE) -mega = express_getattr(IfcSIPrefix, 'MEGA', INDETERMINATE) -micro = express_getattr(IfcSIPrefix, 'MICRO', INDETERMINATE) -milli = express_getattr(IfcSIPrefix, 'MILLI', INDETERMINATE) -nano = express_getattr(IfcSIPrefix, 'NANO', INDETERMINATE) -peta = express_getattr(IfcSIPrefix, 'PETA', INDETERMINATE) -pico = express_getattr(IfcSIPrefix, 'PICO', INDETERMINATE) -tera = express_getattr(IfcSIPrefix, 'TERA', INDETERMINATE) +atto = IfcSIPrefix.ATTO +centi = IfcSIPrefix.CENTI +deca = IfcSIPrefix.DECA +deci = IfcSIPrefix.DECI +exa = IfcSIPrefix.EXA +femto = IfcSIPrefix.FEMTO +giga = IfcSIPrefix.GIGA +hecto = IfcSIPrefix.HECTO +kilo = IfcSIPrefix.KILO +mega = IfcSIPrefix.MEGA +micro = IfcSIPrefix.MICRO +milli = IfcSIPrefix.MILLI +nano = IfcSIPrefix.NANO +peta = IfcSIPrefix.PETA +pico = IfcSIPrefix.PICO +tera = IfcSIPrefix.TERA IfcSIUnitName = enum_namespace() -ampere = express_getattr(IfcSIUnitName, 'AMPERE', INDETERMINATE) -becquerel = express_getattr(IfcSIUnitName, 'BECQUEREL', INDETERMINATE) -candela = express_getattr(IfcSIUnitName, 'CANDELA', INDETERMINATE) -coulomb = express_getattr(IfcSIUnitName, 'COULOMB', INDETERMINATE) -cubic_metre = express_getattr(IfcSIUnitName, 'CUBIC_METRE', INDETERMINATE) -degree_celsius = express_getattr(IfcSIUnitName, 'DEGREE_CELSIUS', INDETERMINATE) -farad = express_getattr(IfcSIUnitName, 'FARAD', INDETERMINATE) -gram = express_getattr(IfcSIUnitName, 'GRAM', INDETERMINATE) -gray = express_getattr(IfcSIUnitName, 'GRAY', INDETERMINATE) -henry = express_getattr(IfcSIUnitName, 'HENRY', INDETERMINATE) -hertz = express_getattr(IfcSIUnitName, 'HERTZ', INDETERMINATE) -joule = express_getattr(IfcSIUnitName, 'JOULE', INDETERMINATE) -kelvin = express_getattr(IfcSIUnitName, 'KELVIN', INDETERMINATE) -lumen = express_getattr(IfcSIUnitName, 'LUMEN', INDETERMINATE) -lux = express_getattr(IfcSIUnitName, 'LUX', INDETERMINATE) -metre = express_getattr(IfcSIUnitName, 'METRE', INDETERMINATE) -mole = express_getattr(IfcSIUnitName, 'MOLE', INDETERMINATE) -newton = express_getattr(IfcSIUnitName, 'NEWTON', INDETERMINATE) -ohm = express_getattr(IfcSIUnitName, 'OHM', INDETERMINATE) -pascal = express_getattr(IfcSIUnitName, 'PASCAL', INDETERMINATE) -radian = express_getattr(IfcSIUnitName, 'RADIAN', INDETERMINATE) -second = express_getattr(IfcSIUnitName, 'SECOND', INDETERMINATE) -siemens = express_getattr(IfcSIUnitName, 'SIEMENS', INDETERMINATE) -sievert = express_getattr(IfcSIUnitName, 'SIEVERT', INDETERMINATE) -square_metre = express_getattr(IfcSIUnitName, 'SQUARE_METRE', INDETERMINATE) -steradian = express_getattr(IfcSIUnitName, 'STERADIAN', INDETERMINATE) -tesla = express_getattr(IfcSIUnitName, 'TESLA', INDETERMINATE) -volt = express_getattr(IfcSIUnitName, 'VOLT', INDETERMINATE) -watt = express_getattr(IfcSIUnitName, 'WATT', INDETERMINATE) -weber = express_getattr(IfcSIUnitName, 'WEBER', INDETERMINATE) +ampere = IfcSIUnitName.AMPERE +becquerel = IfcSIUnitName.BECQUEREL +candela = IfcSIUnitName.CANDELA +coulomb = IfcSIUnitName.COULOMB +cubic_metre = IfcSIUnitName.CUBIC_METRE +degree_celsius = IfcSIUnitName.DEGREE_CELSIUS +farad = IfcSIUnitName.FARAD +gram = IfcSIUnitName.GRAM +gray = IfcSIUnitName.GRAY +henry = IfcSIUnitName.HENRY +hertz = IfcSIUnitName.HERTZ +joule = IfcSIUnitName.JOULE +kelvin = IfcSIUnitName.KELVIN +lumen = IfcSIUnitName.LUMEN +lux = IfcSIUnitName.LUX +metre = IfcSIUnitName.METRE +mole = IfcSIUnitName.MOLE +newton = IfcSIUnitName.NEWTON +ohm = IfcSIUnitName.OHM +pascal = IfcSIUnitName.PASCAL +radian = IfcSIUnitName.RADIAN +second = IfcSIUnitName.SECOND +siemens = IfcSIUnitName.SIEMENS +sievert = IfcSIUnitName.SIEVERT +square_metre = IfcSIUnitName.SQUARE_METRE +steradian = IfcSIUnitName.STERADIAN +tesla = IfcSIUnitName.TESLA +volt = IfcSIUnitName.VOLT +watt = IfcSIUnitName.WATT +weber = IfcSIUnitName.WEBER IfcSanitaryTerminalTypeEnum = enum_namespace() -bath = express_getattr(IfcSanitaryTerminalTypeEnum, 'BATH', INDETERMINATE) -bidet = express_getattr(IfcSanitaryTerminalTypeEnum, 'BIDET', INDETERMINATE) -cistern = express_getattr(IfcSanitaryTerminalTypeEnum, 'CISTERN', INDETERMINATE) -sanitaryfountain = express_getattr(IfcSanitaryTerminalTypeEnum, 'SANITARYFOUNTAIN', INDETERMINATE) -shower = express_getattr(IfcSanitaryTerminalTypeEnum, 'SHOWER', INDETERMINATE) -sink = express_getattr(IfcSanitaryTerminalTypeEnum, 'SINK', INDETERMINATE) -toiletpan = express_getattr(IfcSanitaryTerminalTypeEnum, 'TOILETPAN', INDETERMINATE) -urinal = express_getattr(IfcSanitaryTerminalTypeEnum, 'URINAL', INDETERMINATE) -washhandbasin = express_getattr(IfcSanitaryTerminalTypeEnum, 'WASHHANDBASIN', INDETERMINATE) -wcseat = express_getattr(IfcSanitaryTerminalTypeEnum, 'WCSEAT', INDETERMINATE) -userdefined = express_getattr(IfcSanitaryTerminalTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSanitaryTerminalTypeEnum, 'NOTDEFINED', INDETERMINATE) +bath = IfcSanitaryTerminalTypeEnum.BATH +bidet = IfcSanitaryTerminalTypeEnum.BIDET +cistern = IfcSanitaryTerminalTypeEnum.CISTERN +sanitaryfountain = IfcSanitaryTerminalTypeEnum.SANITARYFOUNTAIN +shower = IfcSanitaryTerminalTypeEnum.SHOWER +sink = IfcSanitaryTerminalTypeEnum.SINK +toiletpan = IfcSanitaryTerminalTypeEnum.TOILETPAN +urinal = IfcSanitaryTerminalTypeEnum.URINAL +washhandbasin = IfcSanitaryTerminalTypeEnum.WASHHANDBASIN +wcseat = IfcSanitaryTerminalTypeEnum.WCSEAT +userdefined = IfcSanitaryTerminalTypeEnum.USERDEFINED +notdefined = IfcSanitaryTerminalTypeEnum.NOTDEFINED IfcSectionTypeEnum = enum_namespace() -tapered = express_getattr(IfcSectionTypeEnum, 'TAPERED', INDETERMINATE) -uniform = express_getattr(IfcSectionTypeEnum, 'UNIFORM', INDETERMINATE) +tapered = IfcSectionTypeEnum.TAPERED +uniform = IfcSectionTypeEnum.UNIFORM IfcSensorTypeEnum = enum_namespace() -co2sensor = express_getattr(IfcSensorTypeEnum, 'CO2SENSOR', INDETERMINATE) -conductancesensor = express_getattr(IfcSensorTypeEnum, 'CONDUCTANCESENSOR', INDETERMINATE) -contactsensor = express_getattr(IfcSensorTypeEnum, 'CONTACTSENSOR', INDETERMINATE) -cosensor = express_getattr(IfcSensorTypeEnum, 'COSENSOR', INDETERMINATE) -earthquakesensor = express_getattr(IfcSensorTypeEnum, 'EARTHQUAKESENSOR', INDETERMINATE) -firesensor = express_getattr(IfcSensorTypeEnum, 'FIRESENSOR', INDETERMINATE) -flowsensor = express_getattr(IfcSensorTypeEnum, 'FLOWSENSOR', INDETERMINATE) -foreignobjectdetectionsensor = express_getattr(IfcSensorTypeEnum, 'FOREIGNOBJECTDETECTIONSENSOR', INDETERMINATE) -frostsensor = express_getattr(IfcSensorTypeEnum, 'FROSTSENSOR', INDETERMINATE) -gassensor = express_getattr(IfcSensorTypeEnum, 'GASSENSOR', INDETERMINATE) -heatsensor = express_getattr(IfcSensorTypeEnum, 'HEATSENSOR', INDETERMINATE) -humiditysensor = express_getattr(IfcSensorTypeEnum, 'HUMIDITYSENSOR', INDETERMINATE) -identifiersensor = express_getattr(IfcSensorTypeEnum, 'IDENTIFIERSENSOR', INDETERMINATE) -ionconcentrationsensor = express_getattr(IfcSensorTypeEnum, 'IONCONCENTRATIONSENSOR', INDETERMINATE) -levelsensor = express_getattr(IfcSensorTypeEnum, 'LEVELSENSOR', INDETERMINATE) -lightsensor = express_getattr(IfcSensorTypeEnum, 'LIGHTSENSOR', INDETERMINATE) -moisturesensor = express_getattr(IfcSensorTypeEnum, 'MOISTURESENSOR', INDETERMINATE) -movementsensor = express_getattr(IfcSensorTypeEnum, 'MOVEMENTSENSOR', INDETERMINATE) -obstaclesensor = express_getattr(IfcSensorTypeEnum, 'OBSTACLESENSOR', INDETERMINATE) -phsensor = express_getattr(IfcSensorTypeEnum, 'PHSENSOR', INDETERMINATE) -pressuresensor = express_getattr(IfcSensorTypeEnum, 'PRESSURESENSOR', INDETERMINATE) -radiationsensor = express_getattr(IfcSensorTypeEnum, 'RADIATIONSENSOR', INDETERMINATE) -radioactivitysensor = express_getattr(IfcSensorTypeEnum, 'RADIOACTIVITYSENSOR', INDETERMINATE) -rainsensor = express_getattr(IfcSensorTypeEnum, 'RAINSENSOR', INDETERMINATE) -smokesensor = express_getattr(IfcSensorTypeEnum, 'SMOKESENSOR', INDETERMINATE) -snowdepthsensor = express_getattr(IfcSensorTypeEnum, 'SNOWDEPTHSENSOR', INDETERMINATE) -soundsensor = express_getattr(IfcSensorTypeEnum, 'SOUNDSENSOR', INDETERMINATE) -temperaturesensor = express_getattr(IfcSensorTypeEnum, 'TEMPERATURESENSOR', INDETERMINATE) -trainsensor = express_getattr(IfcSensorTypeEnum, 'TRAINSENSOR', INDETERMINATE) -turnoutclosuresensor = express_getattr(IfcSensorTypeEnum, 'TURNOUTCLOSURESENSOR', INDETERMINATE) -wheelsensor = express_getattr(IfcSensorTypeEnum, 'WHEELSENSOR', INDETERMINATE) -windsensor = express_getattr(IfcSensorTypeEnum, 'WINDSENSOR', INDETERMINATE) -userdefined = express_getattr(IfcSensorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSensorTypeEnum, 'NOTDEFINED', INDETERMINATE) +co2sensor = IfcSensorTypeEnum.CO2SENSOR +conductancesensor = IfcSensorTypeEnum.CONDUCTANCESENSOR +contactsensor = IfcSensorTypeEnum.CONTACTSENSOR +cosensor = IfcSensorTypeEnum.COSENSOR +earthquakesensor = IfcSensorTypeEnum.EARTHQUAKESENSOR +firesensor = IfcSensorTypeEnum.FIRESENSOR +flowsensor = IfcSensorTypeEnum.FLOWSENSOR +foreignobjectdetectionsensor = IfcSensorTypeEnum.FOREIGNOBJECTDETECTIONSENSOR +frostsensor = IfcSensorTypeEnum.FROSTSENSOR +gassensor = IfcSensorTypeEnum.GASSENSOR +heatsensor = IfcSensorTypeEnum.HEATSENSOR +humiditysensor = IfcSensorTypeEnum.HUMIDITYSENSOR +identifiersensor = IfcSensorTypeEnum.IDENTIFIERSENSOR +ionconcentrationsensor = IfcSensorTypeEnum.IONCONCENTRATIONSENSOR +levelsensor = IfcSensorTypeEnum.LEVELSENSOR +lightsensor = IfcSensorTypeEnum.LIGHTSENSOR +moisturesensor = IfcSensorTypeEnum.MOISTURESENSOR +movementsensor = IfcSensorTypeEnum.MOVEMENTSENSOR +obstaclesensor = IfcSensorTypeEnum.OBSTACLESENSOR +phsensor = IfcSensorTypeEnum.PHSENSOR +pressuresensor = IfcSensorTypeEnum.PRESSURESENSOR +radiationsensor = IfcSensorTypeEnum.RADIATIONSENSOR +radioactivitysensor = IfcSensorTypeEnum.RADIOACTIVITYSENSOR +rainsensor = IfcSensorTypeEnum.RAINSENSOR +smokesensor = IfcSensorTypeEnum.SMOKESENSOR +snowdepthsensor = IfcSensorTypeEnum.SNOWDEPTHSENSOR +soundsensor = IfcSensorTypeEnum.SOUNDSENSOR +temperaturesensor = IfcSensorTypeEnum.TEMPERATURESENSOR +trainsensor = IfcSensorTypeEnum.TRAINSENSOR +turnoutclosuresensor = IfcSensorTypeEnum.TURNOUTCLOSURESENSOR +wheelsensor = IfcSensorTypeEnum.WHEELSENSOR +windsensor = IfcSensorTypeEnum.WINDSENSOR +userdefined = IfcSensorTypeEnum.USERDEFINED +notdefined = IfcSensorTypeEnum.NOTDEFINED IfcSequenceEnum = enum_namespace() -finish_finish = express_getattr(IfcSequenceEnum, 'FINISH_FINISH', INDETERMINATE) -finish_start = express_getattr(IfcSequenceEnum, 'FINISH_START', INDETERMINATE) -start_finish = express_getattr(IfcSequenceEnum, 'START_FINISH', INDETERMINATE) -start_start = express_getattr(IfcSequenceEnum, 'START_START', INDETERMINATE) -userdefined = express_getattr(IfcSequenceEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSequenceEnum, 'NOTDEFINED', INDETERMINATE) +finish_finish = IfcSequenceEnum.FINISH_FINISH +finish_start = IfcSequenceEnum.FINISH_START +start_finish = IfcSequenceEnum.START_FINISH +start_start = IfcSequenceEnum.START_START +userdefined = IfcSequenceEnum.USERDEFINED +notdefined = IfcSequenceEnum.NOTDEFINED IfcShadingDeviceTypeEnum = enum_namespace() -awning = express_getattr(IfcShadingDeviceTypeEnum, 'AWNING', INDETERMINATE) -jalousie = express_getattr(IfcShadingDeviceTypeEnum, 'JALOUSIE', INDETERMINATE) -shutter = express_getattr(IfcShadingDeviceTypeEnum, 'SHUTTER', INDETERMINATE) -userdefined = express_getattr(IfcShadingDeviceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcShadingDeviceTypeEnum, 'NOTDEFINED', INDETERMINATE) +awning = IfcShadingDeviceTypeEnum.AWNING +jalousie = IfcShadingDeviceTypeEnum.JALOUSIE +shutter = IfcShadingDeviceTypeEnum.SHUTTER +userdefined = IfcShadingDeviceTypeEnum.USERDEFINED +notdefined = IfcShadingDeviceTypeEnum.NOTDEFINED IfcSignTypeEnum = enum_namespace() -marker = express_getattr(IfcSignTypeEnum, 'MARKER', INDETERMINATE) -mirror = express_getattr(IfcSignTypeEnum, 'MIRROR', INDETERMINATE) -pictoral = express_getattr(IfcSignTypeEnum, 'PICTORAL', INDETERMINATE) -userdefined = express_getattr(IfcSignTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSignTypeEnum, 'NOTDEFINED', INDETERMINATE) +marker = IfcSignTypeEnum.MARKER +mirror = IfcSignTypeEnum.MIRROR +pictoral = IfcSignTypeEnum.PICTORAL +userdefined = IfcSignTypeEnum.USERDEFINED +notdefined = IfcSignTypeEnum.NOTDEFINED IfcSignalTypeEnum = enum_namespace() -audio = express_getattr(IfcSignalTypeEnum, 'AUDIO', INDETERMINATE) -mixed = express_getattr(IfcSignalTypeEnum, 'MIXED', INDETERMINATE) -visual = express_getattr(IfcSignalTypeEnum, 'VISUAL', INDETERMINATE) -userdefined = express_getattr(IfcSignalTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSignalTypeEnum, 'NOTDEFINED', INDETERMINATE) +audio = IfcSignalTypeEnum.AUDIO +mixed = IfcSignalTypeEnum.MIXED +visual = IfcSignalTypeEnum.VISUAL +userdefined = IfcSignalTypeEnum.USERDEFINED +notdefined = IfcSignalTypeEnum.NOTDEFINED IfcSimplePropertyTemplateTypeEnum = enum_namespace() -p_boundedvalue = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'P_BOUNDEDVALUE', INDETERMINATE) -p_enumeratedvalue = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'P_ENUMERATEDVALUE', INDETERMINATE) -p_listvalue = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'P_LISTVALUE', INDETERMINATE) -p_referencevalue = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'P_REFERENCEVALUE', INDETERMINATE) -p_singlevalue = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'P_SINGLEVALUE', INDETERMINATE) -p_tablevalue = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'P_TABLEVALUE', INDETERMINATE) -q_area = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'Q_AREA', INDETERMINATE) -q_count = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'Q_COUNT', INDETERMINATE) -q_length = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'Q_LENGTH', INDETERMINATE) -q_number = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'Q_NUMBER', INDETERMINATE) -q_time = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'Q_TIME', INDETERMINATE) -q_volume = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'Q_VOLUME', INDETERMINATE) -q_weight = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'Q_WEIGHT', INDETERMINATE) +p_boundedvalue = IfcSimplePropertyTemplateTypeEnum.P_BOUNDEDVALUE +p_enumeratedvalue = IfcSimplePropertyTemplateTypeEnum.P_ENUMERATEDVALUE +p_listvalue = IfcSimplePropertyTemplateTypeEnum.P_LISTVALUE +p_referencevalue = IfcSimplePropertyTemplateTypeEnum.P_REFERENCEVALUE +p_singlevalue = IfcSimplePropertyTemplateTypeEnum.P_SINGLEVALUE +p_tablevalue = IfcSimplePropertyTemplateTypeEnum.P_TABLEVALUE +q_area = IfcSimplePropertyTemplateTypeEnum.Q_AREA +q_count = IfcSimplePropertyTemplateTypeEnum.Q_COUNT +q_length = IfcSimplePropertyTemplateTypeEnum.Q_LENGTH +q_number = IfcSimplePropertyTemplateTypeEnum.Q_NUMBER +q_time = IfcSimplePropertyTemplateTypeEnum.Q_TIME +q_volume = IfcSimplePropertyTemplateTypeEnum.Q_VOLUME +q_weight = IfcSimplePropertyTemplateTypeEnum.Q_WEIGHT IfcSlabTypeEnum = enum_namespace() -approach_slab = express_getattr(IfcSlabTypeEnum, 'APPROACH_SLAB', INDETERMINATE) -baseslab = express_getattr(IfcSlabTypeEnum, 'BASESLAB', INDETERMINATE) -floor = express_getattr(IfcSlabTypeEnum, 'FLOOR', INDETERMINATE) -landing = express_getattr(IfcSlabTypeEnum, 'LANDING', INDETERMINATE) -paving = express_getattr(IfcSlabTypeEnum, 'PAVING', INDETERMINATE) -roof = express_getattr(IfcSlabTypeEnum, 'ROOF', INDETERMINATE) -sidewalk = express_getattr(IfcSlabTypeEnum, 'SIDEWALK', INDETERMINATE) -trackslab = express_getattr(IfcSlabTypeEnum, 'TRACKSLAB', INDETERMINATE) -wearing = express_getattr(IfcSlabTypeEnum, 'WEARING', INDETERMINATE) -userdefined = express_getattr(IfcSlabTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSlabTypeEnum, 'NOTDEFINED', INDETERMINATE) +approach_slab = IfcSlabTypeEnum.APPROACH_SLAB +baseslab = IfcSlabTypeEnum.BASESLAB +floor = IfcSlabTypeEnum.FLOOR +landing = IfcSlabTypeEnum.LANDING +paving = IfcSlabTypeEnum.PAVING +roof = IfcSlabTypeEnum.ROOF +sidewalk = IfcSlabTypeEnum.SIDEWALK +trackslab = IfcSlabTypeEnum.TRACKSLAB +wearing = IfcSlabTypeEnum.WEARING +userdefined = IfcSlabTypeEnum.USERDEFINED +notdefined = IfcSlabTypeEnum.NOTDEFINED IfcSolarDeviceTypeEnum = enum_namespace() -solarcollector = express_getattr(IfcSolarDeviceTypeEnum, 'SOLARCOLLECTOR', INDETERMINATE) -solarpanel = express_getattr(IfcSolarDeviceTypeEnum, 'SOLARPANEL', INDETERMINATE) -userdefined = express_getattr(IfcSolarDeviceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSolarDeviceTypeEnum, 'NOTDEFINED', INDETERMINATE) +solarcollector = IfcSolarDeviceTypeEnum.SOLARCOLLECTOR +solarpanel = IfcSolarDeviceTypeEnum.SOLARPANEL +userdefined = IfcSolarDeviceTypeEnum.USERDEFINED +notdefined = IfcSolarDeviceTypeEnum.NOTDEFINED IfcSpaceHeaterTypeEnum = enum_namespace() -convector = express_getattr(IfcSpaceHeaterTypeEnum, 'CONVECTOR', INDETERMINATE) -radiator = express_getattr(IfcSpaceHeaterTypeEnum, 'RADIATOR', INDETERMINATE) -userdefined = express_getattr(IfcSpaceHeaterTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSpaceHeaterTypeEnum, 'NOTDEFINED', INDETERMINATE) +convector = IfcSpaceHeaterTypeEnum.CONVECTOR +radiator = IfcSpaceHeaterTypeEnum.RADIATOR +userdefined = IfcSpaceHeaterTypeEnum.USERDEFINED +notdefined = IfcSpaceHeaterTypeEnum.NOTDEFINED IfcSpaceTypeEnum = enum_namespace() -berth = express_getattr(IfcSpaceTypeEnum, 'BERTH', INDETERMINATE) -external = express_getattr(IfcSpaceTypeEnum, 'EXTERNAL', INDETERMINATE) -gfa = express_getattr(IfcSpaceTypeEnum, 'GFA', INDETERMINATE) -internal = express_getattr(IfcSpaceTypeEnum, 'INTERNAL', INDETERMINATE) -parking = express_getattr(IfcSpaceTypeEnum, 'PARKING', INDETERMINATE) -space = express_getattr(IfcSpaceTypeEnum, 'SPACE', INDETERMINATE) -userdefined = express_getattr(IfcSpaceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSpaceTypeEnum, 'NOTDEFINED', INDETERMINATE) +berth = IfcSpaceTypeEnum.BERTH +external = IfcSpaceTypeEnum.EXTERNAL +gfa = IfcSpaceTypeEnum.GFA +internal = IfcSpaceTypeEnum.INTERNAL +parking = IfcSpaceTypeEnum.PARKING +space = IfcSpaceTypeEnum.SPACE +userdefined = IfcSpaceTypeEnum.USERDEFINED +notdefined = IfcSpaceTypeEnum.NOTDEFINED IfcSpatialZoneTypeEnum = enum_namespace() -construction = express_getattr(IfcSpatialZoneTypeEnum, 'CONSTRUCTION', INDETERMINATE) -firesafety = express_getattr(IfcSpatialZoneTypeEnum, 'FIRESAFETY', INDETERMINATE) -interference = express_getattr(IfcSpatialZoneTypeEnum, 'INTERFERENCE', INDETERMINATE) -lighting = express_getattr(IfcSpatialZoneTypeEnum, 'LIGHTING', INDETERMINATE) -occupancy = express_getattr(IfcSpatialZoneTypeEnum, 'OCCUPANCY', INDETERMINATE) -reservation = express_getattr(IfcSpatialZoneTypeEnum, 'RESERVATION', INDETERMINATE) -security = express_getattr(IfcSpatialZoneTypeEnum, 'SECURITY', INDETERMINATE) -thermal = express_getattr(IfcSpatialZoneTypeEnum, 'THERMAL', INDETERMINATE) -transport = express_getattr(IfcSpatialZoneTypeEnum, 'TRANSPORT', INDETERMINATE) -ventilation = express_getattr(IfcSpatialZoneTypeEnum, 'VENTILATION', INDETERMINATE) -userdefined = express_getattr(IfcSpatialZoneTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSpatialZoneTypeEnum, 'NOTDEFINED', INDETERMINATE) +construction = IfcSpatialZoneTypeEnum.CONSTRUCTION +firesafety = IfcSpatialZoneTypeEnum.FIRESAFETY +interference = IfcSpatialZoneTypeEnum.INTERFERENCE +lighting = IfcSpatialZoneTypeEnum.LIGHTING +occupancy = IfcSpatialZoneTypeEnum.OCCUPANCY +reservation = IfcSpatialZoneTypeEnum.RESERVATION +security = IfcSpatialZoneTypeEnum.SECURITY +thermal = IfcSpatialZoneTypeEnum.THERMAL +transport = IfcSpatialZoneTypeEnum.TRANSPORT +ventilation = IfcSpatialZoneTypeEnum.VENTILATION +userdefined = IfcSpatialZoneTypeEnum.USERDEFINED +notdefined = IfcSpatialZoneTypeEnum.NOTDEFINED IfcStackTerminalTypeEnum = enum_namespace() -birdcage = express_getattr(IfcStackTerminalTypeEnum, 'BIRDCAGE', INDETERMINATE) -cowl = express_getattr(IfcStackTerminalTypeEnum, 'COWL', INDETERMINATE) -rainwaterhopper = express_getattr(IfcStackTerminalTypeEnum, 'RAINWATERHOPPER', INDETERMINATE) -userdefined = express_getattr(IfcStackTerminalTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcStackTerminalTypeEnum, 'NOTDEFINED', INDETERMINATE) +birdcage = IfcStackTerminalTypeEnum.BIRDCAGE +cowl = IfcStackTerminalTypeEnum.COWL +rainwaterhopper = IfcStackTerminalTypeEnum.RAINWATERHOPPER +userdefined = IfcStackTerminalTypeEnum.USERDEFINED +notdefined = IfcStackTerminalTypeEnum.NOTDEFINED IfcStairFlightTypeEnum = enum_namespace() -curved = express_getattr(IfcStairFlightTypeEnum, 'CURVED', INDETERMINATE) -freeform = express_getattr(IfcStairFlightTypeEnum, 'FREEFORM', INDETERMINATE) -spiral = express_getattr(IfcStairFlightTypeEnum, 'SPIRAL', INDETERMINATE) -straight = express_getattr(IfcStairFlightTypeEnum, 'STRAIGHT', INDETERMINATE) -winder = express_getattr(IfcStairFlightTypeEnum, 'WINDER', INDETERMINATE) -userdefined = express_getattr(IfcStairFlightTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcStairFlightTypeEnum, 'NOTDEFINED', INDETERMINATE) +curved = IfcStairFlightTypeEnum.CURVED +freeform = IfcStairFlightTypeEnum.FREEFORM +spiral = IfcStairFlightTypeEnum.SPIRAL +straight = IfcStairFlightTypeEnum.STRAIGHT +winder = IfcStairFlightTypeEnum.WINDER +userdefined = IfcStairFlightTypeEnum.USERDEFINED +notdefined = IfcStairFlightTypeEnum.NOTDEFINED IfcStairTypeEnum = enum_namespace() -curved_run_stair = express_getattr(IfcStairTypeEnum, 'CURVED_RUN_STAIR', INDETERMINATE) -double_return_stair = express_getattr(IfcStairTypeEnum, 'DOUBLE_RETURN_STAIR', INDETERMINATE) -half_turn_stair = express_getattr(IfcStairTypeEnum, 'HALF_TURN_STAIR', INDETERMINATE) -half_winding_stair = express_getattr(IfcStairTypeEnum, 'HALF_WINDING_STAIR', INDETERMINATE) -ladder = express_getattr(IfcStairTypeEnum, 'LADDER', INDETERMINATE) -quarter_turn_stair = express_getattr(IfcStairTypeEnum, 'QUARTER_TURN_STAIR', INDETERMINATE) -quarter_winding_stair = express_getattr(IfcStairTypeEnum, 'QUARTER_WINDING_STAIR', INDETERMINATE) -spiral_stair = express_getattr(IfcStairTypeEnum, 'SPIRAL_STAIR', INDETERMINATE) -straight_run_stair = express_getattr(IfcStairTypeEnum, 'STRAIGHT_RUN_STAIR', INDETERMINATE) -three_quarter_turn_stair = express_getattr(IfcStairTypeEnum, 'THREE_QUARTER_TURN_STAIR', INDETERMINATE) -three_quarter_winding_stair = express_getattr(IfcStairTypeEnum, 'THREE_QUARTER_WINDING_STAIR', INDETERMINATE) -two_curved_run_stair = express_getattr(IfcStairTypeEnum, 'TWO_CURVED_RUN_STAIR', INDETERMINATE) -two_quarter_turn_stair = express_getattr(IfcStairTypeEnum, 'TWO_QUARTER_TURN_STAIR', INDETERMINATE) -two_quarter_winding_stair = express_getattr(IfcStairTypeEnum, 'TWO_QUARTER_WINDING_STAIR', INDETERMINATE) -two_straight_run_stair = express_getattr(IfcStairTypeEnum, 'TWO_STRAIGHT_RUN_STAIR', INDETERMINATE) -userdefined = express_getattr(IfcStairTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcStairTypeEnum, 'NOTDEFINED', INDETERMINATE) +curved_run_stair = IfcStairTypeEnum.CURVED_RUN_STAIR +double_return_stair = IfcStairTypeEnum.DOUBLE_RETURN_STAIR +half_turn_stair = IfcStairTypeEnum.HALF_TURN_STAIR +half_winding_stair = IfcStairTypeEnum.HALF_WINDING_STAIR +ladder = IfcStairTypeEnum.LADDER +quarter_turn_stair = IfcStairTypeEnum.QUARTER_TURN_STAIR +quarter_winding_stair = IfcStairTypeEnum.QUARTER_WINDING_STAIR +spiral_stair = IfcStairTypeEnum.SPIRAL_STAIR +straight_run_stair = IfcStairTypeEnum.STRAIGHT_RUN_STAIR +three_quarter_turn_stair = IfcStairTypeEnum.THREE_QUARTER_TURN_STAIR +three_quarter_winding_stair = IfcStairTypeEnum.THREE_QUARTER_WINDING_STAIR +two_curved_run_stair = IfcStairTypeEnum.TWO_CURVED_RUN_STAIR +two_quarter_turn_stair = IfcStairTypeEnum.TWO_QUARTER_TURN_STAIR +two_quarter_winding_stair = IfcStairTypeEnum.TWO_QUARTER_WINDING_STAIR +two_straight_run_stair = IfcStairTypeEnum.TWO_STRAIGHT_RUN_STAIR +userdefined = IfcStairTypeEnum.USERDEFINED +notdefined = IfcStairTypeEnum.NOTDEFINED IfcStateEnum = enum_namespace() -locked = express_getattr(IfcStateEnum, 'LOCKED', INDETERMINATE) -readonly = express_getattr(IfcStateEnum, 'READONLY', INDETERMINATE) -readonlylocked = express_getattr(IfcStateEnum, 'READONLYLOCKED', INDETERMINATE) -readwrite = express_getattr(IfcStateEnum, 'READWRITE', INDETERMINATE) -readwritelocked = express_getattr(IfcStateEnum, 'READWRITELOCKED', INDETERMINATE) +locked = IfcStateEnum.LOCKED +readonly = IfcStateEnum.READONLY +readonlylocked = IfcStateEnum.READONLYLOCKED +readwrite = IfcStateEnum.READWRITE +readwritelocked = IfcStateEnum.READWRITELOCKED IfcStructuralCurveActivityTypeEnum = enum_namespace() -const = express_getattr(IfcStructuralCurveActivityTypeEnum, 'CONST', INDETERMINATE) -discrete = express_getattr(IfcStructuralCurveActivityTypeEnum, 'DISCRETE', INDETERMINATE) -equidistant = express_getattr(IfcStructuralCurveActivityTypeEnum, 'EQUIDISTANT', INDETERMINATE) -linear = express_getattr(IfcStructuralCurveActivityTypeEnum, 'LINEAR', INDETERMINATE) -parabola = express_getattr(IfcStructuralCurveActivityTypeEnum, 'PARABOLA', INDETERMINATE) -polygonal = express_getattr(IfcStructuralCurveActivityTypeEnum, 'POLYGONAL', INDETERMINATE) -sinus = express_getattr(IfcStructuralCurveActivityTypeEnum, 'SINUS', INDETERMINATE) -userdefined = express_getattr(IfcStructuralCurveActivityTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcStructuralCurveActivityTypeEnum, 'NOTDEFINED', INDETERMINATE) +const = IfcStructuralCurveActivityTypeEnum.CONST +discrete = IfcStructuralCurveActivityTypeEnum.DISCRETE +equidistant = IfcStructuralCurveActivityTypeEnum.EQUIDISTANT +linear = IfcStructuralCurveActivityTypeEnum.LINEAR +parabola = IfcStructuralCurveActivityTypeEnum.PARABOLA +polygonal = IfcStructuralCurveActivityTypeEnum.POLYGONAL +sinus = IfcStructuralCurveActivityTypeEnum.SINUS +userdefined = IfcStructuralCurveActivityTypeEnum.USERDEFINED +notdefined = IfcStructuralCurveActivityTypeEnum.NOTDEFINED IfcStructuralCurveMemberTypeEnum = enum_namespace() -cable = express_getattr(IfcStructuralCurveMemberTypeEnum, 'CABLE', INDETERMINATE) -compression_member = express_getattr(IfcStructuralCurveMemberTypeEnum, 'COMPRESSION_MEMBER', INDETERMINATE) -pin_joined_member = express_getattr(IfcStructuralCurveMemberTypeEnum, 'PIN_JOINED_MEMBER', INDETERMINATE) -rigid_joined_member = express_getattr(IfcStructuralCurveMemberTypeEnum, 'RIGID_JOINED_MEMBER', INDETERMINATE) -tension_member = express_getattr(IfcStructuralCurveMemberTypeEnum, 'TENSION_MEMBER', INDETERMINATE) -userdefined = express_getattr(IfcStructuralCurveMemberTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcStructuralCurveMemberTypeEnum, 'NOTDEFINED', INDETERMINATE) +cable = IfcStructuralCurveMemberTypeEnum.CABLE +compression_member = IfcStructuralCurveMemberTypeEnum.COMPRESSION_MEMBER +pin_joined_member = IfcStructuralCurveMemberTypeEnum.PIN_JOINED_MEMBER +rigid_joined_member = IfcStructuralCurveMemberTypeEnum.RIGID_JOINED_MEMBER +tension_member = IfcStructuralCurveMemberTypeEnum.TENSION_MEMBER +userdefined = IfcStructuralCurveMemberTypeEnum.USERDEFINED +notdefined = IfcStructuralCurveMemberTypeEnum.NOTDEFINED IfcStructuralSurfaceActivityTypeEnum = enum_namespace() -bilinear = express_getattr(IfcStructuralSurfaceActivityTypeEnum, 'BILINEAR', INDETERMINATE) -const = express_getattr(IfcStructuralSurfaceActivityTypeEnum, 'CONST', INDETERMINATE) -discrete = express_getattr(IfcStructuralSurfaceActivityTypeEnum, 'DISCRETE', INDETERMINATE) -isocontour = express_getattr(IfcStructuralSurfaceActivityTypeEnum, 'ISOCONTOUR', INDETERMINATE) -userdefined = express_getattr(IfcStructuralSurfaceActivityTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcStructuralSurfaceActivityTypeEnum, 'NOTDEFINED', INDETERMINATE) +bilinear = IfcStructuralSurfaceActivityTypeEnum.BILINEAR +const = IfcStructuralSurfaceActivityTypeEnum.CONST +discrete = IfcStructuralSurfaceActivityTypeEnum.DISCRETE +isocontour = IfcStructuralSurfaceActivityTypeEnum.ISOCONTOUR +userdefined = IfcStructuralSurfaceActivityTypeEnum.USERDEFINED +notdefined = IfcStructuralSurfaceActivityTypeEnum.NOTDEFINED IfcStructuralSurfaceMemberTypeEnum = enum_namespace() -bending_element = express_getattr(IfcStructuralSurfaceMemberTypeEnum, 'BENDING_ELEMENT', INDETERMINATE) -membrane_element = express_getattr(IfcStructuralSurfaceMemberTypeEnum, 'MEMBRANE_ELEMENT', INDETERMINATE) -shell = express_getattr(IfcStructuralSurfaceMemberTypeEnum, 'SHELL', INDETERMINATE) -userdefined = express_getattr(IfcStructuralSurfaceMemberTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcStructuralSurfaceMemberTypeEnum, 'NOTDEFINED', INDETERMINATE) +bending_element = IfcStructuralSurfaceMemberTypeEnum.BENDING_ELEMENT +membrane_element = IfcStructuralSurfaceMemberTypeEnum.MEMBRANE_ELEMENT +shell = IfcStructuralSurfaceMemberTypeEnum.SHELL +userdefined = IfcStructuralSurfaceMemberTypeEnum.USERDEFINED +notdefined = IfcStructuralSurfaceMemberTypeEnum.NOTDEFINED IfcSubContractResourceTypeEnum = enum_namespace() -purchase = express_getattr(IfcSubContractResourceTypeEnum, 'PURCHASE', INDETERMINATE) -work = express_getattr(IfcSubContractResourceTypeEnum, 'WORK', INDETERMINATE) -userdefined = express_getattr(IfcSubContractResourceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSubContractResourceTypeEnum, 'NOTDEFINED', INDETERMINATE) +purchase = IfcSubContractResourceTypeEnum.PURCHASE +work = IfcSubContractResourceTypeEnum.WORK +userdefined = IfcSubContractResourceTypeEnum.USERDEFINED +notdefined = IfcSubContractResourceTypeEnum.NOTDEFINED IfcSurfaceFeatureTypeEnum = enum_namespace() -defect = express_getattr(IfcSurfaceFeatureTypeEnum, 'DEFECT', INDETERMINATE) -hatchmarking = express_getattr(IfcSurfaceFeatureTypeEnum, 'HATCHMARKING', INDETERMINATE) -linemarking = express_getattr(IfcSurfaceFeatureTypeEnum, 'LINEMARKING', INDETERMINATE) -mark = express_getattr(IfcSurfaceFeatureTypeEnum, 'MARK', INDETERMINATE) -nonskidsurfacing = express_getattr(IfcSurfaceFeatureTypeEnum, 'NONSKIDSURFACING', INDETERMINATE) -pavementsurfacemarking = express_getattr(IfcSurfaceFeatureTypeEnum, 'PAVEMENTSURFACEMARKING', INDETERMINATE) -rumblestrip = express_getattr(IfcSurfaceFeatureTypeEnum, 'RUMBLESTRIP', INDETERMINATE) -symbolmarking = express_getattr(IfcSurfaceFeatureTypeEnum, 'SYMBOLMARKING', INDETERMINATE) -tag = express_getattr(IfcSurfaceFeatureTypeEnum, 'TAG', INDETERMINATE) -transverserumblestrip = express_getattr(IfcSurfaceFeatureTypeEnum, 'TRANSVERSERUMBLESTRIP', INDETERMINATE) -treatment = express_getattr(IfcSurfaceFeatureTypeEnum, 'TREATMENT', INDETERMINATE) -userdefined = express_getattr(IfcSurfaceFeatureTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSurfaceFeatureTypeEnum, 'NOTDEFINED', INDETERMINATE) +defect = IfcSurfaceFeatureTypeEnum.DEFECT +hatchmarking = IfcSurfaceFeatureTypeEnum.HATCHMARKING +linemarking = IfcSurfaceFeatureTypeEnum.LINEMARKING +mark = IfcSurfaceFeatureTypeEnum.MARK +nonskidsurfacing = IfcSurfaceFeatureTypeEnum.NONSKIDSURFACING +pavementsurfacemarking = IfcSurfaceFeatureTypeEnum.PAVEMENTSURFACEMARKING +rumblestrip = IfcSurfaceFeatureTypeEnum.RUMBLESTRIP +symbolmarking = IfcSurfaceFeatureTypeEnum.SYMBOLMARKING +tag = IfcSurfaceFeatureTypeEnum.TAG +transverserumblestrip = IfcSurfaceFeatureTypeEnum.TRANSVERSERUMBLESTRIP +treatment = IfcSurfaceFeatureTypeEnum.TREATMENT +userdefined = IfcSurfaceFeatureTypeEnum.USERDEFINED +notdefined = IfcSurfaceFeatureTypeEnum.NOTDEFINED IfcSurfaceSide = enum_namespace() -both = express_getattr(IfcSurfaceSide, 'BOTH', INDETERMINATE) -negative = express_getattr(IfcSurfaceSide, 'NEGATIVE', INDETERMINATE) -positive = express_getattr(IfcSurfaceSide, 'POSITIVE', INDETERMINATE) +both = IfcSurfaceSide.BOTH +negative = IfcSurfaceSide.NEGATIVE +positive = IfcSurfaceSide.POSITIVE IfcSwitchingDeviceTypeEnum = enum_namespace() -contactor = express_getattr(IfcSwitchingDeviceTypeEnum, 'CONTACTOR', INDETERMINATE) -dimmerswitch = express_getattr(IfcSwitchingDeviceTypeEnum, 'DIMMERSWITCH', INDETERMINATE) -emergencystop = express_getattr(IfcSwitchingDeviceTypeEnum, 'EMERGENCYSTOP', INDETERMINATE) -keypad = express_getattr(IfcSwitchingDeviceTypeEnum, 'KEYPAD', INDETERMINATE) -momentaryswitch = express_getattr(IfcSwitchingDeviceTypeEnum, 'MOMENTARYSWITCH', INDETERMINATE) -relay = express_getattr(IfcSwitchingDeviceTypeEnum, 'RELAY', INDETERMINATE) -selectorswitch = express_getattr(IfcSwitchingDeviceTypeEnum, 'SELECTORSWITCH', INDETERMINATE) -starter = express_getattr(IfcSwitchingDeviceTypeEnum, 'STARTER', INDETERMINATE) -start_and_stop_equipment = express_getattr(IfcSwitchingDeviceTypeEnum, 'START_AND_STOP_EQUIPMENT', INDETERMINATE) -switchdisconnector = express_getattr(IfcSwitchingDeviceTypeEnum, 'SWITCHDISCONNECTOR', INDETERMINATE) -toggleswitch = express_getattr(IfcSwitchingDeviceTypeEnum, 'TOGGLESWITCH', INDETERMINATE) -userdefined = express_getattr(IfcSwitchingDeviceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSwitchingDeviceTypeEnum, 'NOTDEFINED', INDETERMINATE) +contactor = IfcSwitchingDeviceTypeEnum.CONTACTOR +dimmerswitch = IfcSwitchingDeviceTypeEnum.DIMMERSWITCH +emergencystop = IfcSwitchingDeviceTypeEnum.EMERGENCYSTOP +keypad = IfcSwitchingDeviceTypeEnum.KEYPAD +momentaryswitch = IfcSwitchingDeviceTypeEnum.MOMENTARYSWITCH +relay = IfcSwitchingDeviceTypeEnum.RELAY +selectorswitch = IfcSwitchingDeviceTypeEnum.SELECTORSWITCH +starter = IfcSwitchingDeviceTypeEnum.STARTER +start_and_stop_equipment = IfcSwitchingDeviceTypeEnum.START_AND_STOP_EQUIPMENT +switchdisconnector = IfcSwitchingDeviceTypeEnum.SWITCHDISCONNECTOR +toggleswitch = IfcSwitchingDeviceTypeEnum.TOGGLESWITCH +userdefined = IfcSwitchingDeviceTypeEnum.USERDEFINED +notdefined = IfcSwitchingDeviceTypeEnum.NOTDEFINED IfcSystemFurnitureElementTypeEnum = enum_namespace() -panel = express_getattr(IfcSystemFurnitureElementTypeEnum, 'PANEL', INDETERMINATE) -subrack = express_getattr(IfcSystemFurnitureElementTypeEnum, 'SUBRACK', INDETERMINATE) -worksurface = express_getattr(IfcSystemFurnitureElementTypeEnum, 'WORKSURFACE', INDETERMINATE) -userdefined = express_getattr(IfcSystemFurnitureElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSystemFurnitureElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +panel = IfcSystemFurnitureElementTypeEnum.PANEL +subrack = IfcSystemFurnitureElementTypeEnum.SUBRACK +worksurface = IfcSystemFurnitureElementTypeEnum.WORKSURFACE +userdefined = IfcSystemFurnitureElementTypeEnum.USERDEFINED +notdefined = IfcSystemFurnitureElementTypeEnum.NOTDEFINED IfcTankTypeEnum = enum_namespace() -basin = express_getattr(IfcTankTypeEnum, 'BASIN', INDETERMINATE) -breakpressure = express_getattr(IfcTankTypeEnum, 'BREAKPRESSURE', INDETERMINATE) -expansion = express_getattr(IfcTankTypeEnum, 'EXPANSION', INDETERMINATE) -feedandexpansion = express_getattr(IfcTankTypeEnum, 'FEEDANDEXPANSION', INDETERMINATE) -oilretentiontray = express_getattr(IfcTankTypeEnum, 'OILRETENTIONTRAY', INDETERMINATE) -pressurevessel = express_getattr(IfcTankTypeEnum, 'PRESSUREVESSEL', INDETERMINATE) -storage = express_getattr(IfcTankTypeEnum, 'STORAGE', INDETERMINATE) -vessel = express_getattr(IfcTankTypeEnum, 'VESSEL', INDETERMINATE) -userdefined = express_getattr(IfcTankTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTankTypeEnum, 'NOTDEFINED', INDETERMINATE) +basin = IfcTankTypeEnum.BASIN +breakpressure = IfcTankTypeEnum.BREAKPRESSURE +expansion = IfcTankTypeEnum.EXPANSION +feedandexpansion = IfcTankTypeEnum.FEEDANDEXPANSION +oilretentiontray = IfcTankTypeEnum.OILRETENTIONTRAY +pressurevessel = IfcTankTypeEnum.PRESSUREVESSEL +storage = IfcTankTypeEnum.STORAGE +vessel = IfcTankTypeEnum.VESSEL +userdefined = IfcTankTypeEnum.USERDEFINED +notdefined = IfcTankTypeEnum.NOTDEFINED IfcTaskDurationEnum = enum_namespace() -elapsedtime = express_getattr(IfcTaskDurationEnum, 'ELAPSEDTIME', INDETERMINATE) -worktime = express_getattr(IfcTaskDurationEnum, 'WORKTIME', INDETERMINATE) -notdefined = express_getattr(IfcTaskDurationEnum, 'NOTDEFINED', INDETERMINATE) +elapsedtime = IfcTaskDurationEnum.ELAPSEDTIME +worktime = IfcTaskDurationEnum.WORKTIME +notdefined = IfcTaskDurationEnum.NOTDEFINED IfcTaskTypeEnum = enum_namespace() -adjustment = express_getattr(IfcTaskTypeEnum, 'ADJUSTMENT', INDETERMINATE) -attendance = express_getattr(IfcTaskTypeEnum, 'ATTENDANCE', INDETERMINATE) -calibration = express_getattr(IfcTaskTypeEnum, 'CALIBRATION', INDETERMINATE) -construction = express_getattr(IfcTaskTypeEnum, 'CONSTRUCTION', INDETERMINATE) -demolition = express_getattr(IfcTaskTypeEnum, 'DEMOLITION', INDETERMINATE) -dismantle = express_getattr(IfcTaskTypeEnum, 'DISMANTLE', INDETERMINATE) -disposal = express_getattr(IfcTaskTypeEnum, 'DISPOSAL', INDETERMINATE) -emergency = express_getattr(IfcTaskTypeEnum, 'EMERGENCY', INDETERMINATE) -inspection = express_getattr(IfcTaskTypeEnum, 'INSPECTION', INDETERMINATE) -installation = express_getattr(IfcTaskTypeEnum, 'INSTALLATION', INDETERMINATE) -logistic = express_getattr(IfcTaskTypeEnum, 'LOGISTIC', INDETERMINATE) -maintenance = express_getattr(IfcTaskTypeEnum, 'MAINTENANCE', INDETERMINATE) -move = express_getattr(IfcTaskTypeEnum, 'MOVE', INDETERMINATE) -operation = express_getattr(IfcTaskTypeEnum, 'OPERATION', INDETERMINATE) -removal = express_getattr(IfcTaskTypeEnum, 'REMOVAL', INDETERMINATE) -renovation = express_getattr(IfcTaskTypeEnum, 'RENOVATION', INDETERMINATE) -safety = express_getattr(IfcTaskTypeEnum, 'SAFETY', INDETERMINATE) -shutdown = express_getattr(IfcTaskTypeEnum, 'SHUTDOWN', INDETERMINATE) -startup = express_getattr(IfcTaskTypeEnum, 'STARTUP', INDETERMINATE) -testing = express_getattr(IfcTaskTypeEnum, 'TESTING', INDETERMINATE) -troubleshooting = express_getattr(IfcTaskTypeEnum, 'TROUBLESHOOTING', INDETERMINATE) -userdefined = express_getattr(IfcTaskTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTaskTypeEnum, 'NOTDEFINED', INDETERMINATE) +adjustment = IfcTaskTypeEnum.ADJUSTMENT +attendance = IfcTaskTypeEnum.ATTENDANCE +calibration = IfcTaskTypeEnum.CALIBRATION +construction = IfcTaskTypeEnum.CONSTRUCTION +demolition = IfcTaskTypeEnum.DEMOLITION +dismantle = IfcTaskTypeEnum.DISMANTLE +disposal = IfcTaskTypeEnum.DISPOSAL +emergency = IfcTaskTypeEnum.EMERGENCY +inspection = IfcTaskTypeEnum.INSPECTION +installation = IfcTaskTypeEnum.INSTALLATION +logistic = IfcTaskTypeEnum.LOGISTIC +maintenance = IfcTaskTypeEnum.MAINTENANCE +move = IfcTaskTypeEnum.MOVE +operation = IfcTaskTypeEnum.OPERATION +removal = IfcTaskTypeEnum.REMOVAL +renovation = IfcTaskTypeEnum.RENOVATION +safety = IfcTaskTypeEnum.SAFETY +shutdown = IfcTaskTypeEnum.SHUTDOWN +startup = IfcTaskTypeEnum.STARTUP +testing = IfcTaskTypeEnum.TESTING +troubleshooting = IfcTaskTypeEnum.TROUBLESHOOTING +userdefined = IfcTaskTypeEnum.USERDEFINED +notdefined = IfcTaskTypeEnum.NOTDEFINED IfcTendonAnchorTypeEnum = enum_namespace() -coupler = express_getattr(IfcTendonAnchorTypeEnum, 'COUPLER', INDETERMINATE) -fixed_end = express_getattr(IfcTendonAnchorTypeEnum, 'FIXED_END', INDETERMINATE) -tensioning_end = express_getattr(IfcTendonAnchorTypeEnum, 'TENSIONING_END', INDETERMINATE) -userdefined = express_getattr(IfcTendonAnchorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTendonAnchorTypeEnum, 'NOTDEFINED', INDETERMINATE) +coupler = IfcTendonAnchorTypeEnum.COUPLER +fixed_end = IfcTendonAnchorTypeEnum.FIXED_END +tensioning_end = IfcTendonAnchorTypeEnum.TENSIONING_END +userdefined = IfcTendonAnchorTypeEnum.USERDEFINED +notdefined = IfcTendonAnchorTypeEnum.NOTDEFINED IfcTendonConduitTypeEnum = enum_namespace() -coupler = express_getattr(IfcTendonConduitTypeEnum, 'COUPLER', INDETERMINATE) -diabolo = express_getattr(IfcTendonConduitTypeEnum, 'DIABOLO', INDETERMINATE) -duct = express_getattr(IfcTendonConduitTypeEnum, 'DUCT', INDETERMINATE) -grouting_duct = express_getattr(IfcTendonConduitTypeEnum, 'GROUTING_DUCT', INDETERMINATE) -trumpet = express_getattr(IfcTendonConduitTypeEnum, 'TRUMPET', INDETERMINATE) -userdefined = express_getattr(IfcTendonConduitTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTendonConduitTypeEnum, 'NOTDEFINED', INDETERMINATE) +coupler = IfcTendonConduitTypeEnum.COUPLER +diabolo = IfcTendonConduitTypeEnum.DIABOLO +duct = IfcTendonConduitTypeEnum.DUCT +grouting_duct = IfcTendonConduitTypeEnum.GROUTING_DUCT +trumpet = IfcTendonConduitTypeEnum.TRUMPET +userdefined = IfcTendonConduitTypeEnum.USERDEFINED +notdefined = IfcTendonConduitTypeEnum.NOTDEFINED IfcTendonTypeEnum = enum_namespace() -bar = express_getattr(IfcTendonTypeEnum, 'BAR', INDETERMINATE) -coated = express_getattr(IfcTendonTypeEnum, 'COATED', INDETERMINATE) -strand = express_getattr(IfcTendonTypeEnum, 'STRAND', INDETERMINATE) -wire = express_getattr(IfcTendonTypeEnum, 'WIRE', INDETERMINATE) -userdefined = express_getattr(IfcTendonTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTendonTypeEnum, 'NOTDEFINED', INDETERMINATE) +bar = IfcTendonTypeEnum.BAR +coated = IfcTendonTypeEnum.COATED +strand = IfcTendonTypeEnum.STRAND +wire = IfcTendonTypeEnum.WIRE +userdefined = IfcTendonTypeEnum.USERDEFINED +notdefined = IfcTendonTypeEnum.NOTDEFINED IfcTextPath = enum_namespace() -down = express_getattr(IfcTextPath, 'DOWN', INDETERMINATE) -left = express_getattr(IfcTextPath, 'LEFT', INDETERMINATE) -right = express_getattr(IfcTextPath, 'RIGHT', INDETERMINATE) -up = express_getattr(IfcTextPath, 'UP', INDETERMINATE) +down = IfcTextPath.DOWN +left = IfcTextPath.LEFT +right = IfcTextPath.RIGHT +up = IfcTextPath.UP IfcTimeSeriesDataTypeEnum = enum_namespace() -continuous = express_getattr(IfcTimeSeriesDataTypeEnum, 'CONTINUOUS', INDETERMINATE) -discrete = express_getattr(IfcTimeSeriesDataTypeEnum, 'DISCRETE', INDETERMINATE) -discretebinary = express_getattr(IfcTimeSeriesDataTypeEnum, 'DISCRETEBINARY', INDETERMINATE) -piecewisebinary = express_getattr(IfcTimeSeriesDataTypeEnum, 'PIECEWISEBINARY', INDETERMINATE) -piecewiseconstant = express_getattr(IfcTimeSeriesDataTypeEnum, 'PIECEWISECONSTANT', INDETERMINATE) -piecewisecontinuous = express_getattr(IfcTimeSeriesDataTypeEnum, 'PIECEWISECONTINUOUS', INDETERMINATE) -notdefined = express_getattr(IfcTimeSeriesDataTypeEnum, 'NOTDEFINED', INDETERMINATE) +continuous = IfcTimeSeriesDataTypeEnum.CONTINUOUS +discrete = IfcTimeSeriesDataTypeEnum.DISCRETE +discretebinary = IfcTimeSeriesDataTypeEnum.DISCRETEBINARY +piecewisebinary = IfcTimeSeriesDataTypeEnum.PIECEWISEBINARY +piecewiseconstant = IfcTimeSeriesDataTypeEnum.PIECEWISECONSTANT +piecewisecontinuous = IfcTimeSeriesDataTypeEnum.PIECEWISECONTINUOUS +notdefined = IfcTimeSeriesDataTypeEnum.NOTDEFINED IfcTrackElementTypeEnum = enum_namespace() -blockingdevice = express_getattr(IfcTrackElementTypeEnum, 'BLOCKINGDEVICE', INDETERMINATE) -derailer = express_getattr(IfcTrackElementTypeEnum, 'DERAILER', INDETERMINATE) -frog = express_getattr(IfcTrackElementTypeEnum, 'FROG', INDETERMINATE) -half_set_of_blades = express_getattr(IfcTrackElementTypeEnum, 'HALF_SET_OF_BLADES', INDETERMINATE) -sleeper = express_getattr(IfcTrackElementTypeEnum, 'SLEEPER', INDETERMINATE) -speedregulator = express_getattr(IfcTrackElementTypeEnum, 'SPEEDREGULATOR', INDETERMINATE) -trackendofalignment = express_getattr(IfcTrackElementTypeEnum, 'TRACKENDOFALIGNMENT', INDETERMINATE) -vehiclestop = express_getattr(IfcTrackElementTypeEnum, 'VEHICLESTOP', INDETERMINATE) -userdefined = express_getattr(IfcTrackElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTrackElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +blockingdevice = IfcTrackElementTypeEnum.BLOCKINGDEVICE +derailer = IfcTrackElementTypeEnum.DERAILER +frog = IfcTrackElementTypeEnum.FROG +half_set_of_blades = IfcTrackElementTypeEnum.HALF_SET_OF_BLADES +sleeper = IfcTrackElementTypeEnum.SLEEPER +speedregulator = IfcTrackElementTypeEnum.SPEEDREGULATOR +trackendofalignment = IfcTrackElementTypeEnum.TRACKENDOFALIGNMENT +vehiclestop = IfcTrackElementTypeEnum.VEHICLESTOP +userdefined = IfcTrackElementTypeEnum.USERDEFINED +notdefined = IfcTrackElementTypeEnum.NOTDEFINED IfcTransformerTypeEnum = enum_namespace() -chopper = express_getattr(IfcTransformerTypeEnum, 'CHOPPER', INDETERMINATE) -combined = express_getattr(IfcTransformerTypeEnum, 'COMBINED', INDETERMINATE) -current = express_getattr(IfcTransformerTypeEnum, 'CURRENT', INDETERMINATE) -frequency = express_getattr(IfcTransformerTypeEnum, 'FREQUENCY', INDETERMINATE) -inverter = express_getattr(IfcTransformerTypeEnum, 'INVERTER', INDETERMINATE) -rectifier = express_getattr(IfcTransformerTypeEnum, 'RECTIFIER', INDETERMINATE) -voltage = express_getattr(IfcTransformerTypeEnum, 'VOLTAGE', INDETERMINATE) -userdefined = express_getattr(IfcTransformerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTransformerTypeEnum, 'NOTDEFINED', INDETERMINATE) +chopper = IfcTransformerTypeEnum.CHOPPER +combined = IfcTransformerTypeEnum.COMBINED +current = IfcTransformerTypeEnum.CURRENT +frequency = IfcTransformerTypeEnum.FREQUENCY +inverter = IfcTransformerTypeEnum.INVERTER +rectifier = IfcTransformerTypeEnum.RECTIFIER +voltage = IfcTransformerTypeEnum.VOLTAGE +userdefined = IfcTransformerTypeEnum.USERDEFINED +notdefined = IfcTransformerTypeEnum.NOTDEFINED IfcTransitionCode = enum_namespace() -continuous = express_getattr(IfcTransitionCode, 'CONTINUOUS', INDETERMINATE) -contsamegradient = express_getattr(IfcTransitionCode, 'CONTSAMEGRADIENT', INDETERMINATE) -contsamegradientsamecurvature = express_getattr(IfcTransitionCode, 'CONTSAMEGRADIENTSAMECURVATURE', INDETERMINATE) -discontinuous = express_getattr(IfcTransitionCode, 'DISCONTINUOUS', INDETERMINATE) +continuous = IfcTransitionCode.CONTINUOUS +contsamegradient = IfcTransitionCode.CONTSAMEGRADIENT +contsamegradientsamecurvature = IfcTransitionCode.CONTSAMEGRADIENTSAMECURVATURE +discontinuous = IfcTransitionCode.DISCONTINUOUS IfcTransportElementTypeEnum = enum_namespace() -craneway = express_getattr(IfcTransportElementTypeEnum, 'CRANEWAY', INDETERMINATE) -elevator = express_getattr(IfcTransportElementTypeEnum, 'ELEVATOR', INDETERMINATE) -escalator = express_getattr(IfcTransportElementTypeEnum, 'ESCALATOR', INDETERMINATE) -haulinggear = express_getattr(IfcTransportElementTypeEnum, 'HAULINGGEAR', INDETERMINATE) -liftinggear = express_getattr(IfcTransportElementTypeEnum, 'LIFTINGGEAR', INDETERMINATE) -movingwalkway = express_getattr(IfcTransportElementTypeEnum, 'MOVINGWALKWAY', INDETERMINATE) -userdefined = express_getattr(IfcTransportElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTransportElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +craneway = IfcTransportElementTypeEnum.CRANEWAY +elevator = IfcTransportElementTypeEnum.ELEVATOR +escalator = IfcTransportElementTypeEnum.ESCALATOR +haulinggear = IfcTransportElementTypeEnum.HAULINGGEAR +liftinggear = IfcTransportElementTypeEnum.LIFTINGGEAR +movingwalkway = IfcTransportElementTypeEnum.MOVINGWALKWAY +userdefined = IfcTransportElementTypeEnum.USERDEFINED +notdefined = IfcTransportElementTypeEnum.NOTDEFINED IfcTrimmingPreference = enum_namespace() -cartesian = express_getattr(IfcTrimmingPreference, 'CARTESIAN', INDETERMINATE) -parameter = express_getattr(IfcTrimmingPreference, 'PARAMETER', INDETERMINATE) -unspecified = express_getattr(IfcTrimmingPreference, 'UNSPECIFIED', INDETERMINATE) +cartesian = IfcTrimmingPreference.CARTESIAN +parameter = IfcTrimmingPreference.PARAMETER +unspecified = IfcTrimmingPreference.UNSPECIFIED IfcTubeBundleTypeEnum = enum_namespace() -finned = express_getattr(IfcTubeBundleTypeEnum, 'FINNED', INDETERMINATE) -userdefined = express_getattr(IfcTubeBundleTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTubeBundleTypeEnum, 'NOTDEFINED', INDETERMINATE) +finned = IfcTubeBundleTypeEnum.FINNED +userdefined = IfcTubeBundleTypeEnum.USERDEFINED +notdefined = IfcTubeBundleTypeEnum.NOTDEFINED IfcUnitEnum = enum_namespace() -absorbeddoseunit = express_getattr(IfcUnitEnum, 'ABSORBEDDOSEUNIT', INDETERMINATE) -amountofsubstanceunit = express_getattr(IfcUnitEnum, 'AMOUNTOFSUBSTANCEUNIT', INDETERMINATE) -areaunit = express_getattr(IfcUnitEnum, 'AREAUNIT', INDETERMINATE) -doseequivalentunit = express_getattr(IfcUnitEnum, 'DOSEEQUIVALENTUNIT', INDETERMINATE) -electriccapacitanceunit = express_getattr(IfcUnitEnum, 'ELECTRICCAPACITANCEUNIT', INDETERMINATE) -electricchargeunit = express_getattr(IfcUnitEnum, 'ELECTRICCHARGEUNIT', INDETERMINATE) -electricconductanceunit = express_getattr(IfcUnitEnum, 'ELECTRICCONDUCTANCEUNIT', INDETERMINATE) -electriccurrentunit = express_getattr(IfcUnitEnum, 'ELECTRICCURRENTUNIT', INDETERMINATE) -electricresistanceunit = express_getattr(IfcUnitEnum, 'ELECTRICRESISTANCEUNIT', INDETERMINATE) -electricvoltageunit = express_getattr(IfcUnitEnum, 'ELECTRICVOLTAGEUNIT', INDETERMINATE) -energyunit = express_getattr(IfcUnitEnum, 'ENERGYUNIT', INDETERMINATE) -forceunit = express_getattr(IfcUnitEnum, 'FORCEUNIT', INDETERMINATE) -frequencyunit = express_getattr(IfcUnitEnum, 'FREQUENCYUNIT', INDETERMINATE) -illuminanceunit = express_getattr(IfcUnitEnum, 'ILLUMINANCEUNIT', INDETERMINATE) -inductanceunit = express_getattr(IfcUnitEnum, 'INDUCTANCEUNIT', INDETERMINATE) -lengthunit = express_getattr(IfcUnitEnum, 'LENGTHUNIT', INDETERMINATE) -luminousfluxunit = express_getattr(IfcUnitEnum, 'LUMINOUSFLUXUNIT', INDETERMINATE) -luminousintensityunit = express_getattr(IfcUnitEnum, 'LUMINOUSINTENSITYUNIT', INDETERMINATE) -magneticfluxdensityunit = express_getattr(IfcUnitEnum, 'MAGNETICFLUXDENSITYUNIT', INDETERMINATE) -magneticfluxunit = express_getattr(IfcUnitEnum, 'MAGNETICFLUXUNIT', INDETERMINATE) -massunit = express_getattr(IfcUnitEnum, 'MASSUNIT', INDETERMINATE) -planeangleunit = express_getattr(IfcUnitEnum, 'PLANEANGLEUNIT', INDETERMINATE) -powerunit = express_getattr(IfcUnitEnum, 'POWERUNIT', INDETERMINATE) -pressureunit = express_getattr(IfcUnitEnum, 'PRESSUREUNIT', INDETERMINATE) -radioactivityunit = express_getattr(IfcUnitEnum, 'RADIOACTIVITYUNIT', INDETERMINATE) -solidangleunit = express_getattr(IfcUnitEnum, 'SOLIDANGLEUNIT', INDETERMINATE) -thermodynamictemperatureunit = express_getattr(IfcUnitEnum, 'THERMODYNAMICTEMPERATUREUNIT', INDETERMINATE) -timeunit = express_getattr(IfcUnitEnum, 'TIMEUNIT', INDETERMINATE) -volumeunit = express_getattr(IfcUnitEnum, 'VOLUMEUNIT', INDETERMINATE) -userdefined = express_getattr(IfcUnitEnum, 'USERDEFINED', INDETERMINATE) +absorbeddoseunit = IfcUnitEnum.ABSORBEDDOSEUNIT +amountofsubstanceunit = IfcUnitEnum.AMOUNTOFSUBSTANCEUNIT +areaunit = IfcUnitEnum.AREAUNIT +doseequivalentunit = IfcUnitEnum.DOSEEQUIVALENTUNIT +electriccapacitanceunit = IfcUnitEnum.ELECTRICCAPACITANCEUNIT +electricchargeunit = IfcUnitEnum.ELECTRICCHARGEUNIT +electricconductanceunit = IfcUnitEnum.ELECTRICCONDUCTANCEUNIT +electriccurrentunit = IfcUnitEnum.ELECTRICCURRENTUNIT +electricresistanceunit = IfcUnitEnum.ELECTRICRESISTANCEUNIT +electricvoltageunit = IfcUnitEnum.ELECTRICVOLTAGEUNIT +energyunit = IfcUnitEnum.ENERGYUNIT +forceunit = IfcUnitEnum.FORCEUNIT +frequencyunit = IfcUnitEnum.FREQUENCYUNIT +illuminanceunit = IfcUnitEnum.ILLUMINANCEUNIT +inductanceunit = IfcUnitEnum.INDUCTANCEUNIT +lengthunit = IfcUnitEnum.LENGTHUNIT +luminousfluxunit = IfcUnitEnum.LUMINOUSFLUXUNIT +luminousintensityunit = IfcUnitEnum.LUMINOUSINTENSITYUNIT +magneticfluxdensityunit = IfcUnitEnum.MAGNETICFLUXDENSITYUNIT +magneticfluxunit = IfcUnitEnum.MAGNETICFLUXUNIT +massunit = IfcUnitEnum.MASSUNIT +planeangleunit = IfcUnitEnum.PLANEANGLEUNIT +powerunit = IfcUnitEnum.POWERUNIT +pressureunit = IfcUnitEnum.PRESSUREUNIT +radioactivityunit = IfcUnitEnum.RADIOACTIVITYUNIT +solidangleunit = IfcUnitEnum.SOLIDANGLEUNIT +thermodynamictemperatureunit = IfcUnitEnum.THERMODYNAMICTEMPERATUREUNIT +timeunit = IfcUnitEnum.TIMEUNIT +volumeunit = IfcUnitEnum.VOLUMEUNIT +userdefined = IfcUnitEnum.USERDEFINED IfcUnitaryControlElementTypeEnum = enum_namespace() -alarmpanel = express_getattr(IfcUnitaryControlElementTypeEnum, 'ALARMPANEL', INDETERMINATE) -basestationcontroller = express_getattr(IfcUnitaryControlElementTypeEnum, 'BASESTATIONCONTROLLER', INDETERMINATE) -combined = express_getattr(IfcUnitaryControlElementTypeEnum, 'COMBINED', INDETERMINATE) -controlpanel = express_getattr(IfcUnitaryControlElementTypeEnum, 'CONTROLPANEL', INDETERMINATE) -gasdetectionpanel = express_getattr(IfcUnitaryControlElementTypeEnum, 'GASDETECTIONPANEL', INDETERMINATE) -humidistat = express_getattr(IfcUnitaryControlElementTypeEnum, 'HUMIDISTAT', INDETERMINATE) -indicatorpanel = express_getattr(IfcUnitaryControlElementTypeEnum, 'INDICATORPANEL', INDETERMINATE) -mimicpanel = express_getattr(IfcUnitaryControlElementTypeEnum, 'MIMICPANEL', INDETERMINATE) -thermostat = express_getattr(IfcUnitaryControlElementTypeEnum, 'THERMOSTAT', INDETERMINATE) -weatherstation = express_getattr(IfcUnitaryControlElementTypeEnum, 'WEATHERSTATION', INDETERMINATE) -userdefined = express_getattr(IfcUnitaryControlElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcUnitaryControlElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +alarmpanel = IfcUnitaryControlElementTypeEnum.ALARMPANEL +basestationcontroller = IfcUnitaryControlElementTypeEnum.BASESTATIONCONTROLLER +combined = IfcUnitaryControlElementTypeEnum.COMBINED +controlpanel = IfcUnitaryControlElementTypeEnum.CONTROLPANEL +gasdetectionpanel = IfcUnitaryControlElementTypeEnum.GASDETECTIONPANEL +humidistat = IfcUnitaryControlElementTypeEnum.HUMIDISTAT +indicatorpanel = IfcUnitaryControlElementTypeEnum.INDICATORPANEL +mimicpanel = IfcUnitaryControlElementTypeEnum.MIMICPANEL +thermostat = IfcUnitaryControlElementTypeEnum.THERMOSTAT +weatherstation = IfcUnitaryControlElementTypeEnum.WEATHERSTATION +userdefined = IfcUnitaryControlElementTypeEnum.USERDEFINED +notdefined = IfcUnitaryControlElementTypeEnum.NOTDEFINED IfcUnitaryEquipmentTypeEnum = enum_namespace() -airconditioningunit = express_getattr(IfcUnitaryEquipmentTypeEnum, 'AIRCONDITIONINGUNIT', INDETERMINATE) -airhandler = express_getattr(IfcUnitaryEquipmentTypeEnum, 'AIRHANDLER', INDETERMINATE) -dehumidifier = express_getattr(IfcUnitaryEquipmentTypeEnum, 'DEHUMIDIFIER', INDETERMINATE) -rooftopunit = express_getattr(IfcUnitaryEquipmentTypeEnum, 'ROOFTOPUNIT', INDETERMINATE) -splitsystem = express_getattr(IfcUnitaryEquipmentTypeEnum, 'SPLITSYSTEM', INDETERMINATE) -userdefined = express_getattr(IfcUnitaryEquipmentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcUnitaryEquipmentTypeEnum, 'NOTDEFINED', INDETERMINATE) +airconditioningunit = IfcUnitaryEquipmentTypeEnum.AIRCONDITIONINGUNIT +airhandler = IfcUnitaryEquipmentTypeEnum.AIRHANDLER +dehumidifier = IfcUnitaryEquipmentTypeEnum.DEHUMIDIFIER +rooftopunit = IfcUnitaryEquipmentTypeEnum.ROOFTOPUNIT +splitsystem = IfcUnitaryEquipmentTypeEnum.SPLITSYSTEM +userdefined = IfcUnitaryEquipmentTypeEnum.USERDEFINED +notdefined = IfcUnitaryEquipmentTypeEnum.NOTDEFINED IfcValveTypeEnum = enum_namespace() -airrelease = express_getattr(IfcValveTypeEnum, 'AIRRELEASE', INDETERMINATE) -antivacuum = express_getattr(IfcValveTypeEnum, 'ANTIVACUUM', INDETERMINATE) -changeover = express_getattr(IfcValveTypeEnum, 'CHANGEOVER', INDETERMINATE) -check = express_getattr(IfcValveTypeEnum, 'CHECK', INDETERMINATE) -commissioning = express_getattr(IfcValveTypeEnum, 'COMMISSIONING', INDETERMINATE) -diverting = express_getattr(IfcValveTypeEnum, 'DIVERTING', INDETERMINATE) -doublecheck = express_getattr(IfcValveTypeEnum, 'DOUBLECHECK', INDETERMINATE) -doubleregulating = express_getattr(IfcValveTypeEnum, 'DOUBLEREGULATING', INDETERMINATE) -drawoffcock = express_getattr(IfcValveTypeEnum, 'DRAWOFFCOCK', INDETERMINATE) -faucet = express_getattr(IfcValveTypeEnum, 'FAUCET', INDETERMINATE) -flushing = express_getattr(IfcValveTypeEnum, 'FLUSHING', INDETERMINATE) -gascock = express_getattr(IfcValveTypeEnum, 'GASCOCK', INDETERMINATE) -gastap = express_getattr(IfcValveTypeEnum, 'GASTAP', INDETERMINATE) -isolating = express_getattr(IfcValveTypeEnum, 'ISOLATING', INDETERMINATE) -mixing = express_getattr(IfcValveTypeEnum, 'MIXING', INDETERMINATE) -pressurereducing = express_getattr(IfcValveTypeEnum, 'PRESSUREREDUCING', INDETERMINATE) -pressurerelief = express_getattr(IfcValveTypeEnum, 'PRESSURERELIEF', INDETERMINATE) -regulating = express_getattr(IfcValveTypeEnum, 'REGULATING', INDETERMINATE) -safetycutoff = express_getattr(IfcValveTypeEnum, 'SAFETYCUTOFF', INDETERMINATE) -steamtrap = express_getattr(IfcValveTypeEnum, 'STEAMTRAP', INDETERMINATE) -stopcock = express_getattr(IfcValveTypeEnum, 'STOPCOCK', INDETERMINATE) -userdefined = express_getattr(IfcValveTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcValveTypeEnum, 'NOTDEFINED', INDETERMINATE) +airrelease = IfcValveTypeEnum.AIRRELEASE +antivacuum = IfcValveTypeEnum.ANTIVACUUM +changeover = IfcValveTypeEnum.CHANGEOVER +check = IfcValveTypeEnum.CHECK +commissioning = IfcValveTypeEnum.COMMISSIONING +diverting = IfcValveTypeEnum.DIVERTING +doublecheck = IfcValveTypeEnum.DOUBLECHECK +doubleregulating = IfcValveTypeEnum.DOUBLEREGULATING +drawoffcock = IfcValveTypeEnum.DRAWOFFCOCK +faucet = IfcValveTypeEnum.FAUCET +flushing = IfcValveTypeEnum.FLUSHING +gascock = IfcValveTypeEnum.GASCOCK +gastap = IfcValveTypeEnum.GASTAP +isolating = IfcValveTypeEnum.ISOLATING +mixing = IfcValveTypeEnum.MIXING +pressurereducing = IfcValveTypeEnum.PRESSUREREDUCING +pressurerelief = IfcValveTypeEnum.PRESSURERELIEF +regulating = IfcValveTypeEnum.REGULATING +safetycutoff = IfcValveTypeEnum.SAFETYCUTOFF +steamtrap = IfcValveTypeEnum.STEAMTRAP +stopcock = IfcValveTypeEnum.STOPCOCK +userdefined = IfcValveTypeEnum.USERDEFINED +notdefined = IfcValveTypeEnum.NOTDEFINED IfcVehicleTypeEnum = enum_namespace() -cargo = express_getattr(IfcVehicleTypeEnum, 'CARGO', INDETERMINATE) -rollingstock = express_getattr(IfcVehicleTypeEnum, 'ROLLINGSTOCK', INDETERMINATE) -vehicle = express_getattr(IfcVehicleTypeEnum, 'VEHICLE', INDETERMINATE) -vehicleair = express_getattr(IfcVehicleTypeEnum, 'VEHICLEAIR', INDETERMINATE) -vehiclemarine = express_getattr(IfcVehicleTypeEnum, 'VEHICLEMARINE', INDETERMINATE) -vehicletracked = express_getattr(IfcVehicleTypeEnum, 'VEHICLETRACKED', INDETERMINATE) -vehiclewheeled = express_getattr(IfcVehicleTypeEnum, 'VEHICLEWHEELED', INDETERMINATE) -userdefined = express_getattr(IfcVehicleTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcVehicleTypeEnum, 'NOTDEFINED', INDETERMINATE) +cargo = IfcVehicleTypeEnum.CARGO +rollingstock = IfcVehicleTypeEnum.ROLLINGSTOCK +vehicle = IfcVehicleTypeEnum.VEHICLE +vehicleair = IfcVehicleTypeEnum.VEHICLEAIR +vehiclemarine = IfcVehicleTypeEnum.VEHICLEMARINE +vehicletracked = IfcVehicleTypeEnum.VEHICLETRACKED +vehiclewheeled = IfcVehicleTypeEnum.VEHICLEWHEELED +userdefined = IfcVehicleTypeEnum.USERDEFINED +notdefined = IfcVehicleTypeEnum.NOTDEFINED IfcVibrationDamperTypeEnum = enum_namespace() -axial_yield = express_getattr(IfcVibrationDamperTypeEnum, 'AXIAL_YIELD', INDETERMINATE) -bending_yield = express_getattr(IfcVibrationDamperTypeEnum, 'BENDING_YIELD', INDETERMINATE) -friction = express_getattr(IfcVibrationDamperTypeEnum, 'FRICTION', INDETERMINATE) -rubber = express_getattr(IfcVibrationDamperTypeEnum, 'RUBBER', INDETERMINATE) -shear_yield = express_getattr(IfcVibrationDamperTypeEnum, 'SHEAR_YIELD', INDETERMINATE) -viscous = express_getattr(IfcVibrationDamperTypeEnum, 'VISCOUS', INDETERMINATE) -userdefined = express_getattr(IfcVibrationDamperTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcVibrationDamperTypeEnum, 'NOTDEFINED', INDETERMINATE) +axial_yield = IfcVibrationDamperTypeEnum.AXIAL_YIELD +bending_yield = IfcVibrationDamperTypeEnum.BENDING_YIELD +friction = IfcVibrationDamperTypeEnum.FRICTION +rubber = IfcVibrationDamperTypeEnum.RUBBER +shear_yield = IfcVibrationDamperTypeEnum.SHEAR_YIELD +viscous = IfcVibrationDamperTypeEnum.VISCOUS +userdefined = IfcVibrationDamperTypeEnum.USERDEFINED +notdefined = IfcVibrationDamperTypeEnum.NOTDEFINED IfcVibrationIsolatorTypeEnum = enum_namespace() -base = express_getattr(IfcVibrationIsolatorTypeEnum, 'BASE', INDETERMINATE) -compression = express_getattr(IfcVibrationIsolatorTypeEnum, 'COMPRESSION', INDETERMINATE) -spring = express_getattr(IfcVibrationIsolatorTypeEnum, 'SPRING', INDETERMINATE) -userdefined = express_getattr(IfcVibrationIsolatorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcVibrationIsolatorTypeEnum, 'NOTDEFINED', INDETERMINATE) +base = IfcVibrationIsolatorTypeEnum.BASE +compression = IfcVibrationIsolatorTypeEnum.COMPRESSION +spring = IfcVibrationIsolatorTypeEnum.SPRING +userdefined = IfcVibrationIsolatorTypeEnum.USERDEFINED +notdefined = IfcVibrationIsolatorTypeEnum.NOTDEFINED IfcVirtualElementTypeEnum = enum_namespace() -boundary = express_getattr(IfcVirtualElementTypeEnum, 'BOUNDARY', INDETERMINATE) -clearance = express_getattr(IfcVirtualElementTypeEnum, 'CLEARANCE', INDETERMINATE) -provisionforvoid = express_getattr(IfcVirtualElementTypeEnum, 'PROVISIONFORVOID', INDETERMINATE) -userdefined = express_getattr(IfcVirtualElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcVirtualElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +boundary = IfcVirtualElementTypeEnum.BOUNDARY +clearance = IfcVirtualElementTypeEnum.CLEARANCE +provisionforvoid = IfcVirtualElementTypeEnum.PROVISIONFORVOID +userdefined = IfcVirtualElementTypeEnum.USERDEFINED +notdefined = IfcVirtualElementTypeEnum.NOTDEFINED IfcVoidingFeatureTypeEnum = enum_namespace() -chamfer = express_getattr(IfcVoidingFeatureTypeEnum, 'CHAMFER', INDETERMINATE) -cutout = express_getattr(IfcVoidingFeatureTypeEnum, 'CUTOUT', INDETERMINATE) -edge = express_getattr(IfcVoidingFeatureTypeEnum, 'EDGE', INDETERMINATE) -hole = express_getattr(IfcVoidingFeatureTypeEnum, 'HOLE', INDETERMINATE) -miter = express_getattr(IfcVoidingFeatureTypeEnum, 'MITER', INDETERMINATE) -notch = express_getattr(IfcVoidingFeatureTypeEnum, 'NOTCH', INDETERMINATE) -userdefined = express_getattr(IfcVoidingFeatureTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcVoidingFeatureTypeEnum, 'NOTDEFINED', INDETERMINATE) +chamfer = IfcVoidingFeatureTypeEnum.CHAMFER +cutout = IfcVoidingFeatureTypeEnum.CUTOUT +edge = IfcVoidingFeatureTypeEnum.EDGE +hole = IfcVoidingFeatureTypeEnum.HOLE +miter = IfcVoidingFeatureTypeEnum.MITER +notch = IfcVoidingFeatureTypeEnum.NOTCH +userdefined = IfcVoidingFeatureTypeEnum.USERDEFINED +notdefined = IfcVoidingFeatureTypeEnum.NOTDEFINED IfcWallTypeEnum = enum_namespace() -elementedwall = express_getattr(IfcWallTypeEnum, 'ELEMENTEDWALL', INDETERMINATE) -movable = express_getattr(IfcWallTypeEnum, 'MOVABLE', INDETERMINATE) -parapet = express_getattr(IfcWallTypeEnum, 'PARAPET', INDETERMINATE) -partitioning = express_getattr(IfcWallTypeEnum, 'PARTITIONING', INDETERMINATE) -plumbingwall = express_getattr(IfcWallTypeEnum, 'PLUMBINGWALL', INDETERMINATE) -polygonal = express_getattr(IfcWallTypeEnum, 'POLYGONAL', INDETERMINATE) -retainingwall = express_getattr(IfcWallTypeEnum, 'RETAININGWALL', INDETERMINATE) -shear = express_getattr(IfcWallTypeEnum, 'SHEAR', INDETERMINATE) -solidwall = express_getattr(IfcWallTypeEnum, 'SOLIDWALL', INDETERMINATE) -standard = express_getattr(IfcWallTypeEnum, 'STANDARD', INDETERMINATE) -wavewall = express_getattr(IfcWallTypeEnum, 'WAVEWALL', INDETERMINATE) -userdefined = express_getattr(IfcWallTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcWallTypeEnum, 'NOTDEFINED', INDETERMINATE) +elementedwall = IfcWallTypeEnum.ELEMENTEDWALL +movable = IfcWallTypeEnum.MOVABLE +parapet = IfcWallTypeEnum.PARAPET +partitioning = IfcWallTypeEnum.PARTITIONING +plumbingwall = IfcWallTypeEnum.PLUMBINGWALL +polygonal = IfcWallTypeEnum.POLYGONAL +retainingwall = IfcWallTypeEnum.RETAININGWALL +shear = IfcWallTypeEnum.SHEAR +solidwall = IfcWallTypeEnum.SOLIDWALL +standard = IfcWallTypeEnum.STANDARD +wavewall = IfcWallTypeEnum.WAVEWALL +userdefined = IfcWallTypeEnum.USERDEFINED +notdefined = IfcWallTypeEnum.NOTDEFINED IfcWasteTerminalTypeEnum = enum_namespace() -floortrap = express_getattr(IfcWasteTerminalTypeEnum, 'FLOORTRAP', INDETERMINATE) -floorwaste = express_getattr(IfcWasteTerminalTypeEnum, 'FLOORWASTE', INDETERMINATE) -gullysump = express_getattr(IfcWasteTerminalTypeEnum, 'GULLYSUMP', INDETERMINATE) -gullytrap = express_getattr(IfcWasteTerminalTypeEnum, 'GULLYTRAP', INDETERMINATE) -roofdrain = express_getattr(IfcWasteTerminalTypeEnum, 'ROOFDRAIN', INDETERMINATE) -wastedisposalunit = express_getattr(IfcWasteTerminalTypeEnum, 'WASTEDISPOSALUNIT', INDETERMINATE) -wastetrap = express_getattr(IfcWasteTerminalTypeEnum, 'WASTETRAP', INDETERMINATE) -userdefined = express_getattr(IfcWasteTerminalTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcWasteTerminalTypeEnum, 'NOTDEFINED', INDETERMINATE) +floortrap = IfcWasteTerminalTypeEnum.FLOORTRAP +floorwaste = IfcWasteTerminalTypeEnum.FLOORWASTE +gullysump = IfcWasteTerminalTypeEnum.GULLYSUMP +gullytrap = IfcWasteTerminalTypeEnum.GULLYTRAP +roofdrain = IfcWasteTerminalTypeEnum.ROOFDRAIN +wastedisposalunit = IfcWasteTerminalTypeEnum.WASTEDISPOSALUNIT +wastetrap = IfcWasteTerminalTypeEnum.WASTETRAP +userdefined = IfcWasteTerminalTypeEnum.USERDEFINED +notdefined = IfcWasteTerminalTypeEnum.NOTDEFINED IfcWindowPanelOperationEnum = enum_namespace() -bottomhung = express_getattr(IfcWindowPanelOperationEnum, 'BOTTOMHUNG', INDETERMINATE) -fixedcasement = express_getattr(IfcWindowPanelOperationEnum, 'FIXEDCASEMENT', INDETERMINATE) -otheroperation = express_getattr(IfcWindowPanelOperationEnum, 'OTHEROPERATION', INDETERMINATE) -pivothorizontal = express_getattr(IfcWindowPanelOperationEnum, 'PIVOTHORIZONTAL', INDETERMINATE) -pivotvertical = express_getattr(IfcWindowPanelOperationEnum, 'PIVOTVERTICAL', INDETERMINATE) -removablecasement = express_getattr(IfcWindowPanelOperationEnum, 'REMOVABLECASEMENT', INDETERMINATE) -sidehunglefthand = express_getattr(IfcWindowPanelOperationEnum, 'SIDEHUNGLEFTHAND', INDETERMINATE) -sidehungrighthand = express_getattr(IfcWindowPanelOperationEnum, 'SIDEHUNGRIGHTHAND', INDETERMINATE) -slidinghorizontal = express_getattr(IfcWindowPanelOperationEnum, 'SLIDINGHORIZONTAL', INDETERMINATE) -slidingvertical = express_getattr(IfcWindowPanelOperationEnum, 'SLIDINGVERTICAL', INDETERMINATE) -tiltandturnlefthand = express_getattr(IfcWindowPanelOperationEnum, 'TILTANDTURNLEFTHAND', INDETERMINATE) -tiltandturnrighthand = express_getattr(IfcWindowPanelOperationEnum, 'TILTANDTURNRIGHTHAND', INDETERMINATE) -tophung = express_getattr(IfcWindowPanelOperationEnum, 'TOPHUNG', INDETERMINATE) -notdefined = express_getattr(IfcWindowPanelOperationEnum, 'NOTDEFINED', INDETERMINATE) +bottomhung = IfcWindowPanelOperationEnum.BOTTOMHUNG +fixedcasement = IfcWindowPanelOperationEnum.FIXEDCASEMENT +otheroperation = IfcWindowPanelOperationEnum.OTHEROPERATION +pivothorizontal = IfcWindowPanelOperationEnum.PIVOTHORIZONTAL +pivotvertical = IfcWindowPanelOperationEnum.PIVOTVERTICAL +removablecasement = IfcWindowPanelOperationEnum.REMOVABLECASEMENT +sidehunglefthand = IfcWindowPanelOperationEnum.SIDEHUNGLEFTHAND +sidehungrighthand = IfcWindowPanelOperationEnum.SIDEHUNGRIGHTHAND +slidinghorizontal = IfcWindowPanelOperationEnum.SLIDINGHORIZONTAL +slidingvertical = IfcWindowPanelOperationEnum.SLIDINGVERTICAL +tiltandturnlefthand = IfcWindowPanelOperationEnum.TILTANDTURNLEFTHAND +tiltandturnrighthand = IfcWindowPanelOperationEnum.TILTANDTURNRIGHTHAND +tophung = IfcWindowPanelOperationEnum.TOPHUNG +notdefined = IfcWindowPanelOperationEnum.NOTDEFINED IfcWindowPanelPositionEnum = enum_namespace() -bottom = express_getattr(IfcWindowPanelPositionEnum, 'BOTTOM', INDETERMINATE) -left = express_getattr(IfcWindowPanelPositionEnum, 'LEFT', INDETERMINATE) -middle = express_getattr(IfcWindowPanelPositionEnum, 'MIDDLE', INDETERMINATE) -right = express_getattr(IfcWindowPanelPositionEnum, 'RIGHT', INDETERMINATE) -top = express_getattr(IfcWindowPanelPositionEnum, 'TOP', INDETERMINATE) -notdefined = express_getattr(IfcWindowPanelPositionEnum, 'NOTDEFINED', INDETERMINATE) +bottom = IfcWindowPanelPositionEnum.BOTTOM +left = IfcWindowPanelPositionEnum.LEFT +middle = IfcWindowPanelPositionEnum.MIDDLE +right = IfcWindowPanelPositionEnum.RIGHT +top = IfcWindowPanelPositionEnum.TOP +notdefined = IfcWindowPanelPositionEnum.NOTDEFINED IfcWindowTypeEnum = enum_namespace() -lightdome = express_getattr(IfcWindowTypeEnum, 'LIGHTDOME', INDETERMINATE) -skylight = express_getattr(IfcWindowTypeEnum, 'SKYLIGHT', INDETERMINATE) -window = express_getattr(IfcWindowTypeEnum, 'WINDOW', INDETERMINATE) -userdefined = express_getattr(IfcWindowTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcWindowTypeEnum, 'NOTDEFINED', INDETERMINATE) +lightdome = IfcWindowTypeEnum.LIGHTDOME +skylight = IfcWindowTypeEnum.SKYLIGHT +window = IfcWindowTypeEnum.WINDOW +userdefined = IfcWindowTypeEnum.USERDEFINED +notdefined = IfcWindowTypeEnum.NOTDEFINED IfcWindowTypePartitioningEnum = enum_namespace() -double_panel_horizontal = express_getattr(IfcWindowTypePartitioningEnum, 'DOUBLE_PANEL_HORIZONTAL', INDETERMINATE) -double_panel_vertical = express_getattr(IfcWindowTypePartitioningEnum, 'DOUBLE_PANEL_VERTICAL', INDETERMINATE) -single_panel = express_getattr(IfcWindowTypePartitioningEnum, 'SINGLE_PANEL', INDETERMINATE) -triple_panel_bottom = express_getattr(IfcWindowTypePartitioningEnum, 'TRIPLE_PANEL_BOTTOM', INDETERMINATE) -triple_panel_horizontal = express_getattr(IfcWindowTypePartitioningEnum, 'TRIPLE_PANEL_HORIZONTAL', INDETERMINATE) -triple_panel_left = express_getattr(IfcWindowTypePartitioningEnum, 'TRIPLE_PANEL_LEFT', INDETERMINATE) -triple_panel_right = express_getattr(IfcWindowTypePartitioningEnum, 'TRIPLE_PANEL_RIGHT', INDETERMINATE) -triple_panel_top = express_getattr(IfcWindowTypePartitioningEnum, 'TRIPLE_PANEL_TOP', INDETERMINATE) -triple_panel_vertical = express_getattr(IfcWindowTypePartitioningEnum, 'TRIPLE_PANEL_VERTICAL', INDETERMINATE) -userdefined = express_getattr(IfcWindowTypePartitioningEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcWindowTypePartitioningEnum, 'NOTDEFINED', INDETERMINATE) +double_panel_horizontal = IfcWindowTypePartitioningEnum.DOUBLE_PANEL_HORIZONTAL +double_panel_vertical = IfcWindowTypePartitioningEnum.DOUBLE_PANEL_VERTICAL +single_panel = IfcWindowTypePartitioningEnum.SINGLE_PANEL +triple_panel_bottom = IfcWindowTypePartitioningEnum.TRIPLE_PANEL_BOTTOM +triple_panel_horizontal = IfcWindowTypePartitioningEnum.TRIPLE_PANEL_HORIZONTAL +triple_panel_left = IfcWindowTypePartitioningEnum.TRIPLE_PANEL_LEFT +triple_panel_right = IfcWindowTypePartitioningEnum.TRIPLE_PANEL_RIGHT +triple_panel_top = IfcWindowTypePartitioningEnum.TRIPLE_PANEL_TOP +triple_panel_vertical = IfcWindowTypePartitioningEnum.TRIPLE_PANEL_VERTICAL +userdefined = IfcWindowTypePartitioningEnum.USERDEFINED +notdefined = IfcWindowTypePartitioningEnum.NOTDEFINED IfcWorkCalendarTypeEnum = enum_namespace() -firstshift = express_getattr(IfcWorkCalendarTypeEnum, 'FIRSTSHIFT', INDETERMINATE) -secondshift = express_getattr(IfcWorkCalendarTypeEnum, 'SECONDSHIFT', INDETERMINATE) -thirdshift = express_getattr(IfcWorkCalendarTypeEnum, 'THIRDSHIFT', INDETERMINATE) -userdefined = express_getattr(IfcWorkCalendarTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcWorkCalendarTypeEnum, 'NOTDEFINED', INDETERMINATE) +firstshift = IfcWorkCalendarTypeEnum.FIRSTSHIFT +secondshift = IfcWorkCalendarTypeEnum.SECONDSHIFT +thirdshift = IfcWorkCalendarTypeEnum.THIRDSHIFT +userdefined = IfcWorkCalendarTypeEnum.USERDEFINED +notdefined = IfcWorkCalendarTypeEnum.NOTDEFINED IfcWorkPlanTypeEnum = enum_namespace() -actual = express_getattr(IfcWorkPlanTypeEnum, 'ACTUAL', INDETERMINATE) -baseline = express_getattr(IfcWorkPlanTypeEnum, 'BASELINE', INDETERMINATE) -planned = express_getattr(IfcWorkPlanTypeEnum, 'PLANNED', INDETERMINATE) -userdefined = express_getattr(IfcWorkPlanTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcWorkPlanTypeEnum, 'NOTDEFINED', INDETERMINATE) +actual = IfcWorkPlanTypeEnum.ACTUAL +baseline = IfcWorkPlanTypeEnum.BASELINE +planned = IfcWorkPlanTypeEnum.PLANNED +userdefined = IfcWorkPlanTypeEnum.USERDEFINED +notdefined = IfcWorkPlanTypeEnum.NOTDEFINED IfcWorkScheduleTypeEnum = enum_namespace() -actual = express_getattr(IfcWorkScheduleTypeEnum, 'ACTUAL', INDETERMINATE) -baseline = express_getattr(IfcWorkScheduleTypeEnum, 'BASELINE', INDETERMINATE) -planned = express_getattr(IfcWorkScheduleTypeEnum, 'PLANNED', INDETERMINATE) -userdefined = express_getattr(IfcWorkScheduleTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcWorkScheduleTypeEnum, 'NOTDEFINED', INDETERMINATE) +actual = IfcWorkScheduleTypeEnum.ACTUAL +baseline = IfcWorkScheduleTypeEnum.BASELINE +planned = IfcWorkScheduleTypeEnum.PLANNED +userdefined = IfcWorkScheduleTypeEnum.USERDEFINED +notdefined = IfcWorkScheduleTypeEnum.NOTDEFINED def IfcActionRequest(*args, **kwargs): return ifcopenshell.create_entity('IfcActionRequest', 'IFC4X3_ADD2', *args, **kwargs) diff --git a/src/ifcopenshell-python/ifcopenshell/express/rules/IFC4X3_RC1.py b/src/ifcopenshell-python/ifcopenshell/express/rules/IFC4X3_RC1.py index 13e34ec4f8f..ee645919aac 100644 --- a/src/ifcopenshell-python/ifcopenshell/express/rules/IFC4X3_RC1.py +++ b/src/ifcopenshell-python/ifcopenshell/express/rules/IFC4X3_RC1.py @@ -1,5 +1,8 @@ import ifcopenshell +def is_indeterminate(v): + return v is None or type(v).__name__ == 'indeterminate_type' + def exists(v): if callable(v): try: @@ -7,10 +10,10 @@ def exists(v): except IndexError as e: return False else: - return v is not None + return not is_indeterminate(v) def nvl(v, default): - return v if v is not None else default + return v if not is_indeterminate(v) else default def is_entity(inst): if isinstance(inst, ifcopenshell.entity_instance): @@ -22,13 +25,13 @@ def is_entity(inst): def express_len(v): if isinstance(v, ifcopenshell.entity_instance) and (not is_entity(v)): v = v[0] - elif v is None or v is INDETERMINATE: + elif is_indeterminate(v): return INDETERMINATE return len(v) old_range = range def range(*args): - if INDETERMINATE in args: + if any(map(is_indeterminate, args)): return yield from old_range(*args) sizeof = express_len @@ -149,2337 +152,2337 @@ class enum_namespace: def __getattr__(self, k): return express_getattr(k, 'upper', INDETERMINATE)() IfcActionRequestTypeEnum = enum_namespace() -email = express_getattr(IfcActionRequestTypeEnum, 'EMAIL', INDETERMINATE) -fax = express_getattr(IfcActionRequestTypeEnum, 'FAX', INDETERMINATE) -phone = express_getattr(IfcActionRequestTypeEnum, 'PHONE', INDETERMINATE) -post = express_getattr(IfcActionRequestTypeEnum, 'POST', INDETERMINATE) -verbal = express_getattr(IfcActionRequestTypeEnum, 'VERBAL', INDETERMINATE) -userdefined = express_getattr(IfcActionRequestTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcActionRequestTypeEnum, 'NOTDEFINED', INDETERMINATE) +email = IfcActionRequestTypeEnum.EMAIL +fax = IfcActionRequestTypeEnum.FAX +phone = IfcActionRequestTypeEnum.PHONE +post = IfcActionRequestTypeEnum.POST +verbal = IfcActionRequestTypeEnum.VERBAL +userdefined = IfcActionRequestTypeEnum.USERDEFINED +notdefined = IfcActionRequestTypeEnum.NOTDEFINED IfcActionSourceTypeEnum = enum_namespace() -dead_load_g = express_getattr(IfcActionSourceTypeEnum, 'DEAD_LOAD_G', INDETERMINATE) -completion_g1 = express_getattr(IfcActionSourceTypeEnum, 'COMPLETION_G1', INDETERMINATE) -live_load_q = express_getattr(IfcActionSourceTypeEnum, 'LIVE_LOAD_Q', INDETERMINATE) -snow_s = express_getattr(IfcActionSourceTypeEnum, 'SNOW_S', INDETERMINATE) -wind_w = express_getattr(IfcActionSourceTypeEnum, 'WIND_W', INDETERMINATE) -prestressing_p = express_getattr(IfcActionSourceTypeEnum, 'PRESTRESSING_P', INDETERMINATE) -settlement_u = express_getattr(IfcActionSourceTypeEnum, 'SETTLEMENT_U', INDETERMINATE) -temperature_t = express_getattr(IfcActionSourceTypeEnum, 'TEMPERATURE_T', INDETERMINATE) -earthquake_e = express_getattr(IfcActionSourceTypeEnum, 'EARTHQUAKE_E', INDETERMINATE) -fire = express_getattr(IfcActionSourceTypeEnum, 'FIRE', INDETERMINATE) -impulse = express_getattr(IfcActionSourceTypeEnum, 'IMPULSE', INDETERMINATE) -impact = express_getattr(IfcActionSourceTypeEnum, 'IMPACT', INDETERMINATE) -transport = express_getattr(IfcActionSourceTypeEnum, 'TRANSPORT', INDETERMINATE) -erection = express_getattr(IfcActionSourceTypeEnum, 'ERECTION', INDETERMINATE) -propping = express_getattr(IfcActionSourceTypeEnum, 'PROPPING', INDETERMINATE) -system_imperfection = express_getattr(IfcActionSourceTypeEnum, 'SYSTEM_IMPERFECTION', INDETERMINATE) -shrinkage = express_getattr(IfcActionSourceTypeEnum, 'SHRINKAGE', INDETERMINATE) -creep = express_getattr(IfcActionSourceTypeEnum, 'CREEP', INDETERMINATE) -lack_of_fit = express_getattr(IfcActionSourceTypeEnum, 'LACK_OF_FIT', INDETERMINATE) -buoyancy = express_getattr(IfcActionSourceTypeEnum, 'BUOYANCY', INDETERMINATE) -ice = express_getattr(IfcActionSourceTypeEnum, 'ICE', INDETERMINATE) -current = express_getattr(IfcActionSourceTypeEnum, 'CURRENT', INDETERMINATE) -wave = express_getattr(IfcActionSourceTypeEnum, 'WAVE', INDETERMINATE) -rain = express_getattr(IfcActionSourceTypeEnum, 'RAIN', INDETERMINATE) -brakes = express_getattr(IfcActionSourceTypeEnum, 'BRAKES', INDETERMINATE) -userdefined = express_getattr(IfcActionSourceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcActionSourceTypeEnum, 'NOTDEFINED', INDETERMINATE) +dead_load_g = IfcActionSourceTypeEnum.DEAD_LOAD_G +completion_g1 = IfcActionSourceTypeEnum.COMPLETION_G1 +live_load_q = IfcActionSourceTypeEnum.LIVE_LOAD_Q +snow_s = IfcActionSourceTypeEnum.SNOW_S +wind_w = IfcActionSourceTypeEnum.WIND_W +prestressing_p = IfcActionSourceTypeEnum.PRESTRESSING_P +settlement_u = IfcActionSourceTypeEnum.SETTLEMENT_U +temperature_t = IfcActionSourceTypeEnum.TEMPERATURE_T +earthquake_e = IfcActionSourceTypeEnum.EARTHQUAKE_E +fire = IfcActionSourceTypeEnum.FIRE +impulse = IfcActionSourceTypeEnum.IMPULSE +impact = IfcActionSourceTypeEnum.IMPACT +transport = IfcActionSourceTypeEnum.TRANSPORT +erection = IfcActionSourceTypeEnum.ERECTION +propping = IfcActionSourceTypeEnum.PROPPING +system_imperfection = IfcActionSourceTypeEnum.SYSTEM_IMPERFECTION +shrinkage = IfcActionSourceTypeEnum.SHRINKAGE +creep = IfcActionSourceTypeEnum.CREEP +lack_of_fit = IfcActionSourceTypeEnum.LACK_OF_FIT +buoyancy = IfcActionSourceTypeEnum.BUOYANCY +ice = IfcActionSourceTypeEnum.ICE +current = IfcActionSourceTypeEnum.CURRENT +wave = IfcActionSourceTypeEnum.WAVE +rain = IfcActionSourceTypeEnum.RAIN +brakes = IfcActionSourceTypeEnum.BRAKES +userdefined = IfcActionSourceTypeEnum.USERDEFINED +notdefined = IfcActionSourceTypeEnum.NOTDEFINED IfcActionTypeEnum = enum_namespace() -permanent_g = express_getattr(IfcActionTypeEnum, 'PERMANENT_G', INDETERMINATE) -variable_q = express_getattr(IfcActionTypeEnum, 'VARIABLE_Q', INDETERMINATE) -extraordinary_a = express_getattr(IfcActionTypeEnum, 'EXTRAORDINARY_A', INDETERMINATE) -userdefined = express_getattr(IfcActionTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcActionTypeEnum, 'NOTDEFINED', INDETERMINATE) +permanent_g = IfcActionTypeEnum.PERMANENT_G +variable_q = IfcActionTypeEnum.VARIABLE_Q +extraordinary_a = IfcActionTypeEnum.EXTRAORDINARY_A +userdefined = IfcActionTypeEnum.USERDEFINED +notdefined = IfcActionTypeEnum.NOTDEFINED IfcActuatorTypeEnum = enum_namespace() -electricactuator = express_getattr(IfcActuatorTypeEnum, 'ELECTRICACTUATOR', INDETERMINATE) -handoperatedactuator = express_getattr(IfcActuatorTypeEnum, 'HANDOPERATEDACTUATOR', INDETERMINATE) -hydraulicactuator = express_getattr(IfcActuatorTypeEnum, 'HYDRAULICACTUATOR', INDETERMINATE) -pneumaticactuator = express_getattr(IfcActuatorTypeEnum, 'PNEUMATICACTUATOR', INDETERMINATE) -thermostaticactuator = express_getattr(IfcActuatorTypeEnum, 'THERMOSTATICACTUATOR', INDETERMINATE) -userdefined = express_getattr(IfcActuatorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcActuatorTypeEnum, 'NOTDEFINED', INDETERMINATE) +electricactuator = IfcActuatorTypeEnum.ELECTRICACTUATOR +handoperatedactuator = IfcActuatorTypeEnum.HANDOPERATEDACTUATOR +hydraulicactuator = IfcActuatorTypeEnum.HYDRAULICACTUATOR +pneumaticactuator = IfcActuatorTypeEnum.PNEUMATICACTUATOR +thermostaticactuator = IfcActuatorTypeEnum.THERMOSTATICACTUATOR +userdefined = IfcActuatorTypeEnum.USERDEFINED +notdefined = IfcActuatorTypeEnum.NOTDEFINED IfcAddressTypeEnum = enum_namespace() -office = express_getattr(IfcAddressTypeEnum, 'OFFICE', INDETERMINATE) -site = express_getattr(IfcAddressTypeEnum, 'SITE', INDETERMINATE) -home = express_getattr(IfcAddressTypeEnum, 'HOME', INDETERMINATE) -distributionpoint = express_getattr(IfcAddressTypeEnum, 'DISTRIBUTIONPOINT', INDETERMINATE) -userdefined = express_getattr(IfcAddressTypeEnum, 'USERDEFINED', INDETERMINATE) +office = IfcAddressTypeEnum.OFFICE +site = IfcAddressTypeEnum.SITE +home = IfcAddressTypeEnum.HOME +distributionpoint = IfcAddressTypeEnum.DISTRIBUTIONPOINT +userdefined = IfcAddressTypeEnum.USERDEFINED IfcAirTerminalBoxTypeEnum = enum_namespace() -constantflow = express_getattr(IfcAirTerminalBoxTypeEnum, 'CONSTANTFLOW', INDETERMINATE) -variableflowpressuredependant = express_getattr(IfcAirTerminalBoxTypeEnum, 'VARIABLEFLOWPRESSUREDEPENDANT', INDETERMINATE) -variableflowpressureindependant = express_getattr(IfcAirTerminalBoxTypeEnum, 'VARIABLEFLOWPRESSUREINDEPENDANT', INDETERMINATE) -userdefined = express_getattr(IfcAirTerminalBoxTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAirTerminalBoxTypeEnum, 'NOTDEFINED', INDETERMINATE) +constantflow = IfcAirTerminalBoxTypeEnum.CONSTANTFLOW +variableflowpressuredependant = IfcAirTerminalBoxTypeEnum.VARIABLEFLOWPRESSUREDEPENDANT +variableflowpressureindependant = IfcAirTerminalBoxTypeEnum.VARIABLEFLOWPRESSUREINDEPENDANT +userdefined = IfcAirTerminalBoxTypeEnum.USERDEFINED +notdefined = IfcAirTerminalBoxTypeEnum.NOTDEFINED IfcAirTerminalTypeEnum = enum_namespace() -diffuser = express_getattr(IfcAirTerminalTypeEnum, 'DIFFUSER', INDETERMINATE) -grille = express_getattr(IfcAirTerminalTypeEnum, 'GRILLE', INDETERMINATE) -louvre = express_getattr(IfcAirTerminalTypeEnum, 'LOUVRE', INDETERMINATE) -register = express_getattr(IfcAirTerminalTypeEnum, 'REGISTER', INDETERMINATE) -userdefined = express_getattr(IfcAirTerminalTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAirTerminalTypeEnum, 'NOTDEFINED', INDETERMINATE) +diffuser = IfcAirTerminalTypeEnum.DIFFUSER +grille = IfcAirTerminalTypeEnum.GRILLE +louvre = IfcAirTerminalTypeEnum.LOUVRE +register = IfcAirTerminalTypeEnum.REGISTER +userdefined = IfcAirTerminalTypeEnum.USERDEFINED +notdefined = IfcAirTerminalTypeEnum.NOTDEFINED IfcAirToAirHeatRecoveryTypeEnum = enum_namespace() -fixedplatecounterflowexchanger = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'FIXEDPLATECOUNTERFLOWEXCHANGER', INDETERMINATE) -fixedplatecrossflowexchanger = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'FIXEDPLATECROSSFLOWEXCHANGER', INDETERMINATE) -fixedplateparallelflowexchanger = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'FIXEDPLATEPARALLELFLOWEXCHANGER', INDETERMINATE) -rotarywheel = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'ROTARYWHEEL', INDETERMINATE) -runaroundcoilloop = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'RUNAROUNDCOILLOOP', INDETERMINATE) -heatpipe = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'HEATPIPE', INDETERMINATE) -twintowerenthalpyrecoveryloops = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'TWINTOWERENTHALPYRECOVERYLOOPS', INDETERMINATE) -thermosiphonsealedtubeheatexchangers = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'THERMOSIPHONSEALEDTUBEHEATEXCHANGERS', INDETERMINATE) -thermosiphoncoiltypeheatexchangers = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'THERMOSIPHONCOILTYPEHEATEXCHANGERS', INDETERMINATE) -userdefined = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'NOTDEFINED', INDETERMINATE) +fixedplatecounterflowexchanger = IfcAirToAirHeatRecoveryTypeEnum.FIXEDPLATECOUNTERFLOWEXCHANGER +fixedplatecrossflowexchanger = IfcAirToAirHeatRecoveryTypeEnum.FIXEDPLATECROSSFLOWEXCHANGER +fixedplateparallelflowexchanger = IfcAirToAirHeatRecoveryTypeEnum.FIXEDPLATEPARALLELFLOWEXCHANGER +rotarywheel = IfcAirToAirHeatRecoveryTypeEnum.ROTARYWHEEL +runaroundcoilloop = IfcAirToAirHeatRecoveryTypeEnum.RUNAROUNDCOILLOOP +heatpipe = IfcAirToAirHeatRecoveryTypeEnum.HEATPIPE +twintowerenthalpyrecoveryloops = IfcAirToAirHeatRecoveryTypeEnum.TWINTOWERENTHALPYRECOVERYLOOPS +thermosiphonsealedtubeheatexchangers = IfcAirToAirHeatRecoveryTypeEnum.THERMOSIPHONSEALEDTUBEHEATEXCHANGERS +thermosiphoncoiltypeheatexchangers = IfcAirToAirHeatRecoveryTypeEnum.THERMOSIPHONCOILTYPEHEATEXCHANGERS +userdefined = IfcAirToAirHeatRecoveryTypeEnum.USERDEFINED +notdefined = IfcAirToAirHeatRecoveryTypeEnum.NOTDEFINED IfcAlarmTypeEnum = enum_namespace() -bell = express_getattr(IfcAlarmTypeEnum, 'BELL', INDETERMINATE) -breakglassbutton = express_getattr(IfcAlarmTypeEnum, 'BREAKGLASSBUTTON', INDETERMINATE) -light = express_getattr(IfcAlarmTypeEnum, 'LIGHT', INDETERMINATE) -manualpullbox = express_getattr(IfcAlarmTypeEnum, 'MANUALPULLBOX', INDETERMINATE) -siren = express_getattr(IfcAlarmTypeEnum, 'SIREN', INDETERMINATE) -whistle = express_getattr(IfcAlarmTypeEnum, 'WHISTLE', INDETERMINATE) -railwaycrocodile = express_getattr(IfcAlarmTypeEnum, 'RAILWAYCROCODILE', INDETERMINATE) -railwaydetonator = express_getattr(IfcAlarmTypeEnum, 'RAILWAYDETONATOR', INDETERMINATE) -userdefined = express_getattr(IfcAlarmTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAlarmTypeEnum, 'NOTDEFINED', INDETERMINATE) +bell = IfcAlarmTypeEnum.BELL +breakglassbutton = IfcAlarmTypeEnum.BREAKGLASSBUTTON +light = IfcAlarmTypeEnum.LIGHT +manualpullbox = IfcAlarmTypeEnum.MANUALPULLBOX +siren = IfcAlarmTypeEnum.SIREN +whistle = IfcAlarmTypeEnum.WHISTLE +railwaycrocodile = IfcAlarmTypeEnum.RAILWAYCROCODILE +railwaydetonator = IfcAlarmTypeEnum.RAILWAYDETONATOR +userdefined = IfcAlarmTypeEnum.USERDEFINED +notdefined = IfcAlarmTypeEnum.NOTDEFINED IfcAlignmentTypeEnum = enum_namespace() -userdefined = express_getattr(IfcAlignmentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAlignmentTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcAlignmentTypeEnum.USERDEFINED +notdefined = IfcAlignmentTypeEnum.NOTDEFINED IfcAnalysisModelTypeEnum = enum_namespace() -in_plane_loading_2d = express_getattr(IfcAnalysisModelTypeEnum, 'IN_PLANE_LOADING_2D', INDETERMINATE) -out_plane_loading_2d = express_getattr(IfcAnalysisModelTypeEnum, 'OUT_PLANE_LOADING_2D', INDETERMINATE) -loading_3d = express_getattr(IfcAnalysisModelTypeEnum, 'LOADING_3D', INDETERMINATE) -userdefined = express_getattr(IfcAnalysisModelTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAnalysisModelTypeEnum, 'NOTDEFINED', INDETERMINATE) +in_plane_loading_2d = IfcAnalysisModelTypeEnum.IN_PLANE_LOADING_2D +out_plane_loading_2d = IfcAnalysisModelTypeEnum.OUT_PLANE_LOADING_2D +loading_3d = IfcAnalysisModelTypeEnum.LOADING_3D +userdefined = IfcAnalysisModelTypeEnum.USERDEFINED +notdefined = IfcAnalysisModelTypeEnum.NOTDEFINED IfcAnalysisTheoryTypeEnum = enum_namespace() -first_order_theory = express_getattr(IfcAnalysisTheoryTypeEnum, 'FIRST_ORDER_THEORY', INDETERMINATE) -second_order_theory = express_getattr(IfcAnalysisTheoryTypeEnum, 'SECOND_ORDER_THEORY', INDETERMINATE) -third_order_theory = express_getattr(IfcAnalysisTheoryTypeEnum, 'THIRD_ORDER_THEORY', INDETERMINATE) -full_nonlinear_theory = express_getattr(IfcAnalysisTheoryTypeEnum, 'FULL_NONLINEAR_THEORY', INDETERMINATE) -userdefined = express_getattr(IfcAnalysisTheoryTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAnalysisTheoryTypeEnum, 'NOTDEFINED', INDETERMINATE) +first_order_theory = IfcAnalysisTheoryTypeEnum.FIRST_ORDER_THEORY +second_order_theory = IfcAnalysisTheoryTypeEnum.SECOND_ORDER_THEORY +third_order_theory = IfcAnalysisTheoryTypeEnum.THIRD_ORDER_THEORY +full_nonlinear_theory = IfcAnalysisTheoryTypeEnum.FULL_NONLINEAR_THEORY +userdefined = IfcAnalysisTheoryTypeEnum.USERDEFINED +notdefined = IfcAnalysisTheoryTypeEnum.NOTDEFINED IfcAnnotationTypeEnum = enum_namespace() -assumedpoint = express_getattr(IfcAnnotationTypeEnum, 'ASSUMEDPOINT', INDETERMINATE) -asbuiltarea = express_getattr(IfcAnnotationTypeEnum, 'ASBUILTAREA', INDETERMINATE) -asbuiltline = express_getattr(IfcAnnotationTypeEnum, 'ASBUILTLINE', INDETERMINATE) -non_physical_signal = express_getattr(IfcAnnotationTypeEnum, 'NON_PHYSICAL_SIGNAL', INDETERMINATE) -assumedline = express_getattr(IfcAnnotationTypeEnum, 'ASSUMEDLINE', INDETERMINATE) -widthevent = express_getattr(IfcAnnotationTypeEnum, 'WIDTHEVENT', INDETERMINATE) -assumedarea = express_getattr(IfcAnnotationTypeEnum, 'ASSUMEDAREA', INDETERMINATE) -superelevationevent = express_getattr(IfcAnnotationTypeEnum, 'SUPERELEVATIONEVENT', INDETERMINATE) -asbuiltpoint = express_getattr(IfcAnnotationTypeEnum, 'ASBUILTPOINT', INDETERMINATE) -userdefined = express_getattr(IfcAnnotationTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAnnotationTypeEnum, 'NOTDEFINED', INDETERMINATE) +assumedpoint = IfcAnnotationTypeEnum.ASSUMEDPOINT +asbuiltarea = IfcAnnotationTypeEnum.ASBUILTAREA +asbuiltline = IfcAnnotationTypeEnum.ASBUILTLINE +non_physical_signal = IfcAnnotationTypeEnum.NON_PHYSICAL_SIGNAL +assumedline = IfcAnnotationTypeEnum.ASSUMEDLINE +widthevent = IfcAnnotationTypeEnum.WIDTHEVENT +assumedarea = IfcAnnotationTypeEnum.ASSUMEDAREA +superelevationevent = IfcAnnotationTypeEnum.SUPERELEVATIONEVENT +asbuiltpoint = IfcAnnotationTypeEnum.ASBUILTPOINT +userdefined = IfcAnnotationTypeEnum.USERDEFINED +notdefined = IfcAnnotationTypeEnum.NOTDEFINED IfcArithmeticOperatorEnum = enum_namespace() -add = express_getattr(IfcArithmeticOperatorEnum, 'ADD', INDETERMINATE) -divide = express_getattr(IfcArithmeticOperatorEnum, 'DIVIDE', INDETERMINATE) -multiply = express_getattr(IfcArithmeticOperatorEnum, 'MULTIPLY', INDETERMINATE) -subtract = express_getattr(IfcArithmeticOperatorEnum, 'SUBTRACT', INDETERMINATE) +add = IfcArithmeticOperatorEnum.ADD +divide = IfcArithmeticOperatorEnum.DIVIDE +multiply = IfcArithmeticOperatorEnum.MULTIPLY +subtract = IfcArithmeticOperatorEnum.SUBTRACT IfcAssemblyPlaceEnum = enum_namespace() -site = express_getattr(IfcAssemblyPlaceEnum, 'SITE', INDETERMINATE) -factory = express_getattr(IfcAssemblyPlaceEnum, 'FACTORY', INDETERMINATE) -notdefined = express_getattr(IfcAssemblyPlaceEnum, 'NOTDEFINED', INDETERMINATE) +site = IfcAssemblyPlaceEnum.SITE +factory = IfcAssemblyPlaceEnum.FACTORY +notdefined = IfcAssemblyPlaceEnum.NOTDEFINED IfcAudioVisualApplianceTypeEnum = enum_namespace() -amplifier = express_getattr(IfcAudioVisualApplianceTypeEnum, 'AMPLIFIER', INDETERMINATE) -camera = express_getattr(IfcAudioVisualApplianceTypeEnum, 'CAMERA', INDETERMINATE) -display = express_getattr(IfcAudioVisualApplianceTypeEnum, 'DISPLAY', INDETERMINATE) -microphone = express_getattr(IfcAudioVisualApplianceTypeEnum, 'MICROPHONE', INDETERMINATE) -player = express_getattr(IfcAudioVisualApplianceTypeEnum, 'PLAYER', INDETERMINATE) -projector = express_getattr(IfcAudioVisualApplianceTypeEnum, 'PROJECTOR', INDETERMINATE) -receiver = express_getattr(IfcAudioVisualApplianceTypeEnum, 'RECEIVER', INDETERMINATE) -speaker = express_getattr(IfcAudioVisualApplianceTypeEnum, 'SPEAKER', INDETERMINATE) -switcher = express_getattr(IfcAudioVisualApplianceTypeEnum, 'SWITCHER', INDETERMINATE) -telephone = express_getattr(IfcAudioVisualApplianceTypeEnum, 'TELEPHONE', INDETERMINATE) -tuner = express_getattr(IfcAudioVisualApplianceTypeEnum, 'TUNER', INDETERMINATE) -railway_communication_terminal = express_getattr(IfcAudioVisualApplianceTypeEnum, 'RAILWAY_COMMUNICATION_TERMINAL', INDETERMINATE) -userdefined = express_getattr(IfcAudioVisualApplianceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAudioVisualApplianceTypeEnum, 'NOTDEFINED', INDETERMINATE) +amplifier = IfcAudioVisualApplianceTypeEnum.AMPLIFIER +camera = IfcAudioVisualApplianceTypeEnum.CAMERA +display = IfcAudioVisualApplianceTypeEnum.DISPLAY +microphone = IfcAudioVisualApplianceTypeEnum.MICROPHONE +player = IfcAudioVisualApplianceTypeEnum.PLAYER +projector = IfcAudioVisualApplianceTypeEnum.PROJECTOR +receiver = IfcAudioVisualApplianceTypeEnum.RECEIVER +speaker = IfcAudioVisualApplianceTypeEnum.SPEAKER +switcher = IfcAudioVisualApplianceTypeEnum.SWITCHER +telephone = IfcAudioVisualApplianceTypeEnum.TELEPHONE +tuner = IfcAudioVisualApplianceTypeEnum.TUNER +railway_communication_terminal = IfcAudioVisualApplianceTypeEnum.RAILWAY_COMMUNICATION_TERMINAL +userdefined = IfcAudioVisualApplianceTypeEnum.USERDEFINED +notdefined = IfcAudioVisualApplianceTypeEnum.NOTDEFINED IfcBSplineCurveForm = enum_namespace() -polyline_form = express_getattr(IfcBSplineCurveForm, 'POLYLINE_FORM', INDETERMINATE) -circular_arc = express_getattr(IfcBSplineCurveForm, 'CIRCULAR_ARC', INDETERMINATE) -elliptic_arc = express_getattr(IfcBSplineCurveForm, 'ELLIPTIC_ARC', INDETERMINATE) -parabolic_arc = express_getattr(IfcBSplineCurveForm, 'PARABOLIC_ARC', INDETERMINATE) -hyperbolic_arc = express_getattr(IfcBSplineCurveForm, 'HYPERBOLIC_ARC', INDETERMINATE) -unspecified = express_getattr(IfcBSplineCurveForm, 'UNSPECIFIED', INDETERMINATE) +polyline_form = IfcBSplineCurveForm.POLYLINE_FORM +circular_arc = IfcBSplineCurveForm.CIRCULAR_ARC +elliptic_arc = IfcBSplineCurveForm.ELLIPTIC_ARC +parabolic_arc = IfcBSplineCurveForm.PARABOLIC_ARC +hyperbolic_arc = IfcBSplineCurveForm.HYPERBOLIC_ARC +unspecified = IfcBSplineCurveForm.UNSPECIFIED IfcBSplineSurfaceForm = enum_namespace() -plane_surf = express_getattr(IfcBSplineSurfaceForm, 'PLANE_SURF', INDETERMINATE) -cylindrical_surf = express_getattr(IfcBSplineSurfaceForm, 'CYLINDRICAL_SURF', INDETERMINATE) -conical_surf = express_getattr(IfcBSplineSurfaceForm, 'CONICAL_SURF', INDETERMINATE) -spherical_surf = express_getattr(IfcBSplineSurfaceForm, 'SPHERICAL_SURF', INDETERMINATE) -toroidal_surf = express_getattr(IfcBSplineSurfaceForm, 'TOROIDAL_SURF', INDETERMINATE) -surf_of_revolution = express_getattr(IfcBSplineSurfaceForm, 'SURF_OF_REVOLUTION', INDETERMINATE) -ruled_surf = express_getattr(IfcBSplineSurfaceForm, 'RULED_SURF', INDETERMINATE) -generalised_cone = express_getattr(IfcBSplineSurfaceForm, 'GENERALISED_CONE', INDETERMINATE) -quadric_surf = express_getattr(IfcBSplineSurfaceForm, 'QUADRIC_SURF', INDETERMINATE) -surf_of_linear_extrusion = express_getattr(IfcBSplineSurfaceForm, 'SURF_OF_LINEAR_EXTRUSION', INDETERMINATE) -unspecified = express_getattr(IfcBSplineSurfaceForm, 'UNSPECIFIED', INDETERMINATE) +plane_surf = IfcBSplineSurfaceForm.PLANE_SURF +cylindrical_surf = IfcBSplineSurfaceForm.CYLINDRICAL_SURF +conical_surf = IfcBSplineSurfaceForm.CONICAL_SURF +spherical_surf = IfcBSplineSurfaceForm.SPHERICAL_SURF +toroidal_surf = IfcBSplineSurfaceForm.TOROIDAL_SURF +surf_of_revolution = IfcBSplineSurfaceForm.SURF_OF_REVOLUTION +ruled_surf = IfcBSplineSurfaceForm.RULED_SURF +generalised_cone = IfcBSplineSurfaceForm.GENERALISED_CONE +quadric_surf = IfcBSplineSurfaceForm.QUADRIC_SURF +surf_of_linear_extrusion = IfcBSplineSurfaceForm.SURF_OF_LINEAR_EXTRUSION +unspecified = IfcBSplineSurfaceForm.UNSPECIFIED IfcBeamTypeEnum = enum_namespace() -beam = express_getattr(IfcBeamTypeEnum, 'BEAM', INDETERMINATE) -joist = express_getattr(IfcBeamTypeEnum, 'JOIST', INDETERMINATE) -hollowcore = express_getattr(IfcBeamTypeEnum, 'HOLLOWCORE', INDETERMINATE) -lintel = express_getattr(IfcBeamTypeEnum, 'LINTEL', INDETERMINATE) -spandrel = express_getattr(IfcBeamTypeEnum, 'SPANDREL', INDETERMINATE) -t_beam = express_getattr(IfcBeamTypeEnum, 'T_BEAM', INDETERMINATE) -girder_segment = express_getattr(IfcBeamTypeEnum, 'GIRDER_SEGMENT', INDETERMINATE) -diaphragm = express_getattr(IfcBeamTypeEnum, 'DIAPHRAGM', INDETERMINATE) -piercap = express_getattr(IfcBeamTypeEnum, 'PIERCAP', INDETERMINATE) -hatstone = express_getattr(IfcBeamTypeEnum, 'HATSTONE', INDETERMINATE) -cornice = express_getattr(IfcBeamTypeEnum, 'CORNICE', INDETERMINATE) -edgebeam = express_getattr(IfcBeamTypeEnum, 'EDGEBEAM', INDETERMINATE) -userdefined = express_getattr(IfcBeamTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBeamTypeEnum, 'NOTDEFINED', INDETERMINATE) +beam = IfcBeamTypeEnum.BEAM +joist = IfcBeamTypeEnum.JOIST +hollowcore = IfcBeamTypeEnum.HOLLOWCORE +lintel = IfcBeamTypeEnum.LINTEL +spandrel = IfcBeamTypeEnum.SPANDREL +t_beam = IfcBeamTypeEnum.T_BEAM +girder_segment = IfcBeamTypeEnum.GIRDER_SEGMENT +diaphragm = IfcBeamTypeEnum.DIAPHRAGM +piercap = IfcBeamTypeEnum.PIERCAP +hatstone = IfcBeamTypeEnum.HATSTONE +cornice = IfcBeamTypeEnum.CORNICE +edgebeam = IfcBeamTypeEnum.EDGEBEAM +userdefined = IfcBeamTypeEnum.USERDEFINED +notdefined = IfcBeamTypeEnum.NOTDEFINED IfcBearingTypeDisplacementEnum = enum_namespace() -fixed_movement = express_getattr(IfcBearingTypeDisplacementEnum, 'FIXED_MOVEMENT', INDETERMINATE) -guided_longitudinal = express_getattr(IfcBearingTypeDisplacementEnum, 'GUIDED_LONGITUDINAL', INDETERMINATE) -guided_transversal = express_getattr(IfcBearingTypeDisplacementEnum, 'GUIDED_TRANSVERSAL', INDETERMINATE) -free_movement = express_getattr(IfcBearingTypeDisplacementEnum, 'FREE_MOVEMENT', INDETERMINATE) -notdefined = express_getattr(IfcBearingTypeDisplacementEnum, 'NOTDEFINED', INDETERMINATE) +fixed_movement = IfcBearingTypeDisplacementEnum.FIXED_MOVEMENT +guided_longitudinal = IfcBearingTypeDisplacementEnum.GUIDED_LONGITUDINAL +guided_transversal = IfcBearingTypeDisplacementEnum.GUIDED_TRANSVERSAL +free_movement = IfcBearingTypeDisplacementEnum.FREE_MOVEMENT +notdefined = IfcBearingTypeDisplacementEnum.NOTDEFINED IfcBearingTypeEnum = enum_namespace() -cylindrical = express_getattr(IfcBearingTypeEnum, 'CYLINDRICAL', INDETERMINATE) -spherical = express_getattr(IfcBearingTypeEnum, 'SPHERICAL', INDETERMINATE) -elastomeric = express_getattr(IfcBearingTypeEnum, 'ELASTOMERIC', INDETERMINATE) -pot = express_getattr(IfcBearingTypeEnum, 'POT', INDETERMINATE) -guide = express_getattr(IfcBearingTypeEnum, 'GUIDE', INDETERMINATE) -rocker = express_getattr(IfcBearingTypeEnum, 'ROCKER', INDETERMINATE) -roller = express_getattr(IfcBearingTypeEnum, 'ROLLER', INDETERMINATE) -disk = express_getattr(IfcBearingTypeEnum, 'DISK', INDETERMINATE) -userdefined = express_getattr(IfcBearingTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBearingTypeEnum, 'NOTDEFINED', INDETERMINATE) +cylindrical = IfcBearingTypeEnum.CYLINDRICAL +spherical = IfcBearingTypeEnum.SPHERICAL +elastomeric = IfcBearingTypeEnum.ELASTOMERIC +pot = IfcBearingTypeEnum.POT +guide = IfcBearingTypeEnum.GUIDE +rocker = IfcBearingTypeEnum.ROCKER +roller = IfcBearingTypeEnum.ROLLER +disk = IfcBearingTypeEnum.DISK +userdefined = IfcBearingTypeEnum.USERDEFINED +notdefined = IfcBearingTypeEnum.NOTDEFINED IfcBenchmarkEnum = enum_namespace() -greaterthan = express_getattr(IfcBenchmarkEnum, 'GREATERTHAN', INDETERMINATE) -greaterthanorequalto = express_getattr(IfcBenchmarkEnum, 'GREATERTHANOREQUALTO', INDETERMINATE) -lessthan = express_getattr(IfcBenchmarkEnum, 'LESSTHAN', INDETERMINATE) -lessthanorequalto = express_getattr(IfcBenchmarkEnum, 'LESSTHANOREQUALTO', INDETERMINATE) -equalto = express_getattr(IfcBenchmarkEnum, 'EQUALTO', INDETERMINATE) -notequalto = express_getattr(IfcBenchmarkEnum, 'NOTEQUALTO', INDETERMINATE) -includes = express_getattr(IfcBenchmarkEnum, 'INCLUDES', INDETERMINATE) -notincludes = express_getattr(IfcBenchmarkEnum, 'NOTINCLUDES', INDETERMINATE) -includedin = express_getattr(IfcBenchmarkEnum, 'INCLUDEDIN', INDETERMINATE) -notincludedin = express_getattr(IfcBenchmarkEnum, 'NOTINCLUDEDIN', INDETERMINATE) +greaterthan = IfcBenchmarkEnum.GREATERTHAN +greaterthanorequalto = IfcBenchmarkEnum.GREATERTHANOREQUALTO +lessthan = IfcBenchmarkEnum.LESSTHAN +lessthanorequalto = IfcBenchmarkEnum.LESSTHANOREQUALTO +equalto = IfcBenchmarkEnum.EQUALTO +notequalto = IfcBenchmarkEnum.NOTEQUALTO +includes = IfcBenchmarkEnum.INCLUDES +notincludes = IfcBenchmarkEnum.NOTINCLUDES +includedin = IfcBenchmarkEnum.INCLUDEDIN +notincludedin = IfcBenchmarkEnum.NOTINCLUDEDIN IfcBoilerTypeEnum = enum_namespace() -water = express_getattr(IfcBoilerTypeEnum, 'WATER', INDETERMINATE) -steam = express_getattr(IfcBoilerTypeEnum, 'STEAM', INDETERMINATE) -userdefined = express_getattr(IfcBoilerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBoilerTypeEnum, 'NOTDEFINED', INDETERMINATE) +water = IfcBoilerTypeEnum.WATER +steam = IfcBoilerTypeEnum.STEAM +userdefined = IfcBoilerTypeEnum.USERDEFINED +notdefined = IfcBoilerTypeEnum.NOTDEFINED IfcBooleanOperator = enum_namespace() -union = express_getattr(IfcBooleanOperator, 'UNION', INDETERMINATE) -intersection = express_getattr(IfcBooleanOperator, 'INTERSECTION', INDETERMINATE) -difference = express_getattr(IfcBooleanOperator, 'DIFFERENCE', INDETERMINATE) +union = IfcBooleanOperator.UNION +intersection = IfcBooleanOperator.INTERSECTION +difference = IfcBooleanOperator.DIFFERENCE IfcBridgePartTypeEnum = enum_namespace() -abutment = express_getattr(IfcBridgePartTypeEnum, 'ABUTMENT', INDETERMINATE) -deck = express_getattr(IfcBridgePartTypeEnum, 'DECK', INDETERMINATE) -deck_segment = express_getattr(IfcBridgePartTypeEnum, 'DECK_SEGMENT', INDETERMINATE) -foundation = express_getattr(IfcBridgePartTypeEnum, 'FOUNDATION', INDETERMINATE) -pier = express_getattr(IfcBridgePartTypeEnum, 'PIER', INDETERMINATE) -pier_segment = express_getattr(IfcBridgePartTypeEnum, 'PIER_SEGMENT', INDETERMINATE) -pylon = express_getattr(IfcBridgePartTypeEnum, 'PYLON', INDETERMINATE) -substructure = express_getattr(IfcBridgePartTypeEnum, 'SUBSTRUCTURE', INDETERMINATE) -superstructure = express_getattr(IfcBridgePartTypeEnum, 'SUPERSTRUCTURE', INDETERMINATE) -surfacestructure = express_getattr(IfcBridgePartTypeEnum, 'SURFACESTRUCTURE', INDETERMINATE) -userdefined = express_getattr(IfcBridgePartTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBridgePartTypeEnum, 'NOTDEFINED', INDETERMINATE) +abutment = IfcBridgePartTypeEnum.ABUTMENT +deck = IfcBridgePartTypeEnum.DECK +deck_segment = IfcBridgePartTypeEnum.DECK_SEGMENT +foundation = IfcBridgePartTypeEnum.FOUNDATION +pier = IfcBridgePartTypeEnum.PIER +pier_segment = IfcBridgePartTypeEnum.PIER_SEGMENT +pylon = IfcBridgePartTypeEnum.PYLON +substructure = IfcBridgePartTypeEnum.SUBSTRUCTURE +superstructure = IfcBridgePartTypeEnum.SUPERSTRUCTURE +surfacestructure = IfcBridgePartTypeEnum.SURFACESTRUCTURE +userdefined = IfcBridgePartTypeEnum.USERDEFINED +notdefined = IfcBridgePartTypeEnum.NOTDEFINED IfcBridgeTypeEnum = enum_namespace() -arched = express_getattr(IfcBridgeTypeEnum, 'ARCHED', INDETERMINATE) -cable_stayed = express_getattr(IfcBridgeTypeEnum, 'CABLE_STAYED', INDETERMINATE) -cantilever = express_getattr(IfcBridgeTypeEnum, 'CANTILEVER', INDETERMINATE) -culvert = express_getattr(IfcBridgeTypeEnum, 'CULVERT', INDETERMINATE) -framework = express_getattr(IfcBridgeTypeEnum, 'FRAMEWORK', INDETERMINATE) -girder = express_getattr(IfcBridgeTypeEnum, 'GIRDER', INDETERMINATE) -suspension = express_getattr(IfcBridgeTypeEnum, 'SUSPENSION', INDETERMINATE) -truss = express_getattr(IfcBridgeTypeEnum, 'TRUSS', INDETERMINATE) -userdefined = express_getattr(IfcBridgeTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBridgeTypeEnum, 'NOTDEFINED', INDETERMINATE) +arched = IfcBridgeTypeEnum.ARCHED +cable_stayed = IfcBridgeTypeEnum.CABLE_STAYED +cantilever = IfcBridgeTypeEnum.CANTILEVER +culvert = IfcBridgeTypeEnum.CULVERT +framework = IfcBridgeTypeEnum.FRAMEWORK +girder = IfcBridgeTypeEnum.GIRDER +suspension = IfcBridgeTypeEnum.SUSPENSION +truss = IfcBridgeTypeEnum.TRUSS +userdefined = IfcBridgeTypeEnum.USERDEFINED +notdefined = IfcBridgeTypeEnum.NOTDEFINED IfcBuildingElementPartTypeEnum = enum_namespace() -insulation = express_getattr(IfcBuildingElementPartTypeEnum, 'INSULATION', INDETERMINATE) -precastpanel = express_getattr(IfcBuildingElementPartTypeEnum, 'PRECASTPANEL', INDETERMINATE) -apron = express_getattr(IfcBuildingElementPartTypeEnum, 'APRON', INDETERMINATE) -armourunit = express_getattr(IfcBuildingElementPartTypeEnum, 'ARMOURUNIT', INDETERMINATE) -safetycage = express_getattr(IfcBuildingElementPartTypeEnum, 'SAFETYCAGE', INDETERMINATE) -userdefined = express_getattr(IfcBuildingElementPartTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBuildingElementPartTypeEnum, 'NOTDEFINED', INDETERMINATE) +insulation = IfcBuildingElementPartTypeEnum.INSULATION +precastpanel = IfcBuildingElementPartTypeEnum.PRECASTPANEL +apron = IfcBuildingElementPartTypeEnum.APRON +armourunit = IfcBuildingElementPartTypeEnum.ARMOURUNIT +safetycage = IfcBuildingElementPartTypeEnum.SAFETYCAGE +userdefined = IfcBuildingElementPartTypeEnum.USERDEFINED +notdefined = IfcBuildingElementPartTypeEnum.NOTDEFINED IfcBuildingElementProxyTypeEnum = enum_namespace() -complex = express_getattr(IfcBuildingElementProxyTypeEnum, 'COMPLEX', INDETERMINATE) -element = express_getattr(IfcBuildingElementProxyTypeEnum, 'ELEMENT', INDETERMINATE) -partial = express_getattr(IfcBuildingElementProxyTypeEnum, 'PARTIAL', INDETERMINATE) -provisionforvoid = express_getattr(IfcBuildingElementProxyTypeEnum, 'PROVISIONFORVOID', INDETERMINATE) -provisionforspace = express_getattr(IfcBuildingElementProxyTypeEnum, 'PROVISIONFORSPACE', INDETERMINATE) -userdefined = express_getattr(IfcBuildingElementProxyTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBuildingElementProxyTypeEnum, 'NOTDEFINED', INDETERMINATE) +complex = IfcBuildingElementProxyTypeEnum.COMPLEX +element = IfcBuildingElementProxyTypeEnum.ELEMENT +partial = IfcBuildingElementProxyTypeEnum.PARTIAL +provisionforvoid = IfcBuildingElementProxyTypeEnum.PROVISIONFORVOID +provisionforspace = IfcBuildingElementProxyTypeEnum.PROVISIONFORSPACE +userdefined = IfcBuildingElementProxyTypeEnum.USERDEFINED +notdefined = IfcBuildingElementProxyTypeEnum.NOTDEFINED IfcBuildingSystemTypeEnum = enum_namespace() -fenestration = express_getattr(IfcBuildingSystemTypeEnum, 'FENESTRATION', INDETERMINATE) -foundation = express_getattr(IfcBuildingSystemTypeEnum, 'FOUNDATION', INDETERMINATE) -loadbearing = express_getattr(IfcBuildingSystemTypeEnum, 'LOADBEARING', INDETERMINATE) -outershell = express_getattr(IfcBuildingSystemTypeEnum, 'OUTERSHELL', INDETERMINATE) -shading = express_getattr(IfcBuildingSystemTypeEnum, 'SHADING', INDETERMINATE) -transport = express_getattr(IfcBuildingSystemTypeEnum, 'TRANSPORT', INDETERMINATE) -reinforcing = express_getattr(IfcBuildingSystemTypeEnum, 'REINFORCING', INDETERMINATE) -prestressing = express_getattr(IfcBuildingSystemTypeEnum, 'PRESTRESSING', INDETERMINATE) -erosionprevention = express_getattr(IfcBuildingSystemTypeEnum, 'EROSIONPREVENTION', INDETERMINATE) -userdefined = express_getattr(IfcBuildingSystemTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBuildingSystemTypeEnum, 'NOTDEFINED', INDETERMINATE) +fenestration = IfcBuildingSystemTypeEnum.FENESTRATION +foundation = IfcBuildingSystemTypeEnum.FOUNDATION +loadbearing = IfcBuildingSystemTypeEnum.LOADBEARING +outershell = IfcBuildingSystemTypeEnum.OUTERSHELL +shading = IfcBuildingSystemTypeEnum.SHADING +transport = IfcBuildingSystemTypeEnum.TRANSPORT +reinforcing = IfcBuildingSystemTypeEnum.REINFORCING +prestressing = IfcBuildingSystemTypeEnum.PRESTRESSING +erosionprevention = IfcBuildingSystemTypeEnum.EROSIONPREVENTION +userdefined = IfcBuildingSystemTypeEnum.USERDEFINED +notdefined = IfcBuildingSystemTypeEnum.NOTDEFINED IfcBuiltSystemTypeEnum = enum_namespace() -reinforcing = express_getattr(IfcBuiltSystemTypeEnum, 'REINFORCING', INDETERMINATE) -mooring = express_getattr(IfcBuiltSystemTypeEnum, 'MOORING', INDETERMINATE) -outershell = express_getattr(IfcBuiltSystemTypeEnum, 'OUTERSHELL', INDETERMINATE) -trackcircuit = express_getattr(IfcBuiltSystemTypeEnum, 'TRACKCIRCUIT', INDETERMINATE) -erosionprevention = express_getattr(IfcBuiltSystemTypeEnum, 'EROSIONPREVENTION', INDETERMINATE) -foundation = express_getattr(IfcBuiltSystemTypeEnum, 'FOUNDATION', INDETERMINATE) -loadbearing = express_getattr(IfcBuiltSystemTypeEnum, 'LOADBEARING', INDETERMINATE) -shading = express_getattr(IfcBuiltSystemTypeEnum, 'SHADING', INDETERMINATE) -fenestration = express_getattr(IfcBuiltSystemTypeEnum, 'FENESTRATION', INDETERMINATE) -mooringsystem = express_getattr(IfcBuiltSystemTypeEnum, 'MOORINGSYSTEM', INDETERMINATE) -transport = express_getattr(IfcBuiltSystemTypeEnum, 'TRANSPORT', INDETERMINATE) -prestressing = express_getattr(IfcBuiltSystemTypeEnum, 'PRESTRESSING', INDETERMINATE) -userdefined = express_getattr(IfcBuiltSystemTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBuiltSystemTypeEnum, 'NOTDEFINED', INDETERMINATE) +reinforcing = IfcBuiltSystemTypeEnum.REINFORCING +mooring = IfcBuiltSystemTypeEnum.MOORING +outershell = IfcBuiltSystemTypeEnum.OUTERSHELL +trackcircuit = IfcBuiltSystemTypeEnum.TRACKCIRCUIT +erosionprevention = IfcBuiltSystemTypeEnum.EROSIONPREVENTION +foundation = IfcBuiltSystemTypeEnum.FOUNDATION +loadbearing = IfcBuiltSystemTypeEnum.LOADBEARING +shading = IfcBuiltSystemTypeEnum.SHADING +fenestration = IfcBuiltSystemTypeEnum.FENESTRATION +mooringsystem = IfcBuiltSystemTypeEnum.MOORINGSYSTEM +transport = IfcBuiltSystemTypeEnum.TRANSPORT +prestressing = IfcBuiltSystemTypeEnum.PRESTRESSING +userdefined = IfcBuiltSystemTypeEnum.USERDEFINED +notdefined = IfcBuiltSystemTypeEnum.NOTDEFINED IfcBurnerTypeEnum = enum_namespace() -userdefined = express_getattr(IfcBurnerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBurnerTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcBurnerTypeEnum.USERDEFINED +notdefined = IfcBurnerTypeEnum.NOTDEFINED IfcCableCarrierFittingTypeEnum = enum_namespace() -bend = express_getattr(IfcCableCarrierFittingTypeEnum, 'BEND', INDETERMINATE) -cross = express_getattr(IfcCableCarrierFittingTypeEnum, 'CROSS', INDETERMINATE) -reducer = express_getattr(IfcCableCarrierFittingTypeEnum, 'REDUCER', INDETERMINATE) -tee = express_getattr(IfcCableCarrierFittingTypeEnum, 'TEE', INDETERMINATE) -userdefined = express_getattr(IfcCableCarrierFittingTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCableCarrierFittingTypeEnum, 'NOTDEFINED', INDETERMINATE) +bend = IfcCableCarrierFittingTypeEnum.BEND +cross = IfcCableCarrierFittingTypeEnum.CROSS +reducer = IfcCableCarrierFittingTypeEnum.REDUCER +tee = IfcCableCarrierFittingTypeEnum.TEE +userdefined = IfcCableCarrierFittingTypeEnum.USERDEFINED +notdefined = IfcCableCarrierFittingTypeEnum.NOTDEFINED IfcCableCarrierSegmentTypeEnum = enum_namespace() -cableladdersegment = express_getattr(IfcCableCarrierSegmentTypeEnum, 'CABLELADDERSEGMENT', INDETERMINATE) -cabletraysegment = express_getattr(IfcCableCarrierSegmentTypeEnum, 'CABLETRAYSEGMENT', INDETERMINATE) -cabletrunkingsegment = express_getattr(IfcCableCarrierSegmentTypeEnum, 'CABLETRUNKINGSEGMENT', INDETERMINATE) -conduitsegment = express_getattr(IfcCableCarrierSegmentTypeEnum, 'CONDUITSEGMENT', INDETERMINATE) -cablebracket = express_getattr(IfcCableCarrierSegmentTypeEnum, 'CABLEBRACKET', INDETERMINATE) -catenarywire = express_getattr(IfcCableCarrierSegmentTypeEnum, 'CATENARYWIRE', INDETERMINATE) -dropper = express_getattr(IfcCableCarrierSegmentTypeEnum, 'DROPPER', INDETERMINATE) -userdefined = express_getattr(IfcCableCarrierSegmentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCableCarrierSegmentTypeEnum, 'NOTDEFINED', INDETERMINATE) +cableladdersegment = IfcCableCarrierSegmentTypeEnum.CABLELADDERSEGMENT +cabletraysegment = IfcCableCarrierSegmentTypeEnum.CABLETRAYSEGMENT +cabletrunkingsegment = IfcCableCarrierSegmentTypeEnum.CABLETRUNKINGSEGMENT +conduitsegment = IfcCableCarrierSegmentTypeEnum.CONDUITSEGMENT +cablebracket = IfcCableCarrierSegmentTypeEnum.CABLEBRACKET +catenarywire = IfcCableCarrierSegmentTypeEnum.CATENARYWIRE +dropper = IfcCableCarrierSegmentTypeEnum.DROPPER +userdefined = IfcCableCarrierSegmentTypeEnum.USERDEFINED +notdefined = IfcCableCarrierSegmentTypeEnum.NOTDEFINED IfcCableFittingTypeEnum = enum_namespace() -connector = express_getattr(IfcCableFittingTypeEnum, 'CONNECTOR', INDETERMINATE) -entry = express_getattr(IfcCableFittingTypeEnum, 'ENTRY', INDETERMINATE) -exit = express_getattr(IfcCableFittingTypeEnum, 'EXIT', INDETERMINATE) -junction = express_getattr(IfcCableFittingTypeEnum, 'JUNCTION', INDETERMINATE) -transition = express_getattr(IfcCableFittingTypeEnum, 'TRANSITION', INDETERMINATE) -fanout = express_getattr(IfcCableFittingTypeEnum, 'FANOUT', INDETERMINATE) -userdefined = express_getattr(IfcCableFittingTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCableFittingTypeEnum, 'NOTDEFINED', INDETERMINATE) +connector = IfcCableFittingTypeEnum.CONNECTOR +entry = IfcCableFittingTypeEnum.ENTRY +exit = IfcCableFittingTypeEnum.EXIT +junction = IfcCableFittingTypeEnum.JUNCTION +transition = IfcCableFittingTypeEnum.TRANSITION +fanout = IfcCableFittingTypeEnum.FANOUT +userdefined = IfcCableFittingTypeEnum.USERDEFINED +notdefined = IfcCableFittingTypeEnum.NOTDEFINED IfcCableSegmentTypeEnum = enum_namespace() -busbarsegment = express_getattr(IfcCableSegmentTypeEnum, 'BUSBARSEGMENT', INDETERMINATE) -cablesegment = express_getattr(IfcCableSegmentTypeEnum, 'CABLESEGMENT', INDETERMINATE) -conductorsegment = express_getattr(IfcCableSegmentTypeEnum, 'CONDUCTORSEGMENT', INDETERMINATE) -coresegment = express_getattr(IfcCableSegmentTypeEnum, 'CORESEGMENT', INDETERMINATE) -contactwiresegment = express_getattr(IfcCableSegmentTypeEnum, 'CONTACTWIRESEGMENT', INDETERMINATE) -fibersegment = express_getattr(IfcCableSegmentTypeEnum, 'FIBERSEGMENT', INDETERMINATE) -fibertube = express_getattr(IfcCableSegmentTypeEnum, 'FIBERTUBE', INDETERMINATE) -opticalcablesegment = express_getattr(IfcCableSegmentTypeEnum, 'OPTICALCABLESEGMENT', INDETERMINATE) -stitchwire = express_getattr(IfcCableSegmentTypeEnum, 'STITCHWIRE', INDETERMINATE) -wirepairsegment = express_getattr(IfcCableSegmentTypeEnum, 'WIREPAIRSEGMENT', INDETERMINATE) -userdefined = express_getattr(IfcCableSegmentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCableSegmentTypeEnum, 'NOTDEFINED', INDETERMINATE) +busbarsegment = IfcCableSegmentTypeEnum.BUSBARSEGMENT +cablesegment = IfcCableSegmentTypeEnum.CABLESEGMENT +conductorsegment = IfcCableSegmentTypeEnum.CONDUCTORSEGMENT +coresegment = IfcCableSegmentTypeEnum.CORESEGMENT +contactwiresegment = IfcCableSegmentTypeEnum.CONTACTWIRESEGMENT +fibersegment = IfcCableSegmentTypeEnum.FIBERSEGMENT +fibertube = IfcCableSegmentTypeEnum.FIBERTUBE +opticalcablesegment = IfcCableSegmentTypeEnum.OPTICALCABLESEGMENT +stitchwire = IfcCableSegmentTypeEnum.STITCHWIRE +wirepairsegment = IfcCableSegmentTypeEnum.WIREPAIRSEGMENT +userdefined = IfcCableSegmentTypeEnum.USERDEFINED +notdefined = IfcCableSegmentTypeEnum.NOTDEFINED IfcCaissonFoundationTypeEnum = enum_namespace() -well = express_getattr(IfcCaissonFoundationTypeEnum, 'WELL', INDETERMINATE) -caisson = express_getattr(IfcCaissonFoundationTypeEnum, 'CAISSON', INDETERMINATE) -userdefined = express_getattr(IfcCaissonFoundationTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCaissonFoundationTypeEnum, 'NOTDEFINED', INDETERMINATE) +well = IfcCaissonFoundationTypeEnum.WELL +caisson = IfcCaissonFoundationTypeEnum.CAISSON +userdefined = IfcCaissonFoundationTypeEnum.USERDEFINED +notdefined = IfcCaissonFoundationTypeEnum.NOTDEFINED IfcChangeActionEnum = enum_namespace() -nochange = express_getattr(IfcChangeActionEnum, 'NOCHANGE', INDETERMINATE) -modified = express_getattr(IfcChangeActionEnum, 'MODIFIED', INDETERMINATE) -added = express_getattr(IfcChangeActionEnum, 'ADDED', INDETERMINATE) -deleted = express_getattr(IfcChangeActionEnum, 'DELETED', INDETERMINATE) -notdefined = express_getattr(IfcChangeActionEnum, 'NOTDEFINED', INDETERMINATE) +nochange = IfcChangeActionEnum.NOCHANGE +modified = IfcChangeActionEnum.MODIFIED +added = IfcChangeActionEnum.ADDED +deleted = IfcChangeActionEnum.DELETED +notdefined = IfcChangeActionEnum.NOTDEFINED IfcChillerTypeEnum = enum_namespace() -aircooled = express_getattr(IfcChillerTypeEnum, 'AIRCOOLED', INDETERMINATE) -watercooled = express_getattr(IfcChillerTypeEnum, 'WATERCOOLED', INDETERMINATE) -heatrecovery = express_getattr(IfcChillerTypeEnum, 'HEATRECOVERY', INDETERMINATE) -userdefined = express_getattr(IfcChillerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcChillerTypeEnum, 'NOTDEFINED', INDETERMINATE) +aircooled = IfcChillerTypeEnum.AIRCOOLED +watercooled = IfcChillerTypeEnum.WATERCOOLED +heatrecovery = IfcChillerTypeEnum.HEATRECOVERY +userdefined = IfcChillerTypeEnum.USERDEFINED +notdefined = IfcChillerTypeEnum.NOTDEFINED IfcChimneyTypeEnum = enum_namespace() -userdefined = express_getattr(IfcChimneyTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcChimneyTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcChimneyTypeEnum.USERDEFINED +notdefined = IfcChimneyTypeEnum.NOTDEFINED IfcCoilTypeEnum = enum_namespace() -dxcoolingcoil = express_getattr(IfcCoilTypeEnum, 'DXCOOLINGCOIL', INDETERMINATE) -electricheatingcoil = express_getattr(IfcCoilTypeEnum, 'ELECTRICHEATINGCOIL', INDETERMINATE) -gasheatingcoil = express_getattr(IfcCoilTypeEnum, 'GASHEATINGCOIL', INDETERMINATE) -hydroniccoil = express_getattr(IfcCoilTypeEnum, 'HYDRONICCOIL', INDETERMINATE) -steamheatingcoil = express_getattr(IfcCoilTypeEnum, 'STEAMHEATINGCOIL', INDETERMINATE) -watercoolingcoil = express_getattr(IfcCoilTypeEnum, 'WATERCOOLINGCOIL', INDETERMINATE) -waterheatingcoil = express_getattr(IfcCoilTypeEnum, 'WATERHEATINGCOIL', INDETERMINATE) -userdefined = express_getattr(IfcCoilTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCoilTypeEnum, 'NOTDEFINED', INDETERMINATE) +dxcoolingcoil = IfcCoilTypeEnum.DXCOOLINGCOIL +electricheatingcoil = IfcCoilTypeEnum.ELECTRICHEATINGCOIL +gasheatingcoil = IfcCoilTypeEnum.GASHEATINGCOIL +hydroniccoil = IfcCoilTypeEnum.HYDRONICCOIL +steamheatingcoil = IfcCoilTypeEnum.STEAMHEATINGCOIL +watercoolingcoil = IfcCoilTypeEnum.WATERCOOLINGCOIL +waterheatingcoil = IfcCoilTypeEnum.WATERHEATINGCOIL +userdefined = IfcCoilTypeEnum.USERDEFINED +notdefined = IfcCoilTypeEnum.NOTDEFINED IfcColumnTypeEnum = enum_namespace() -column = express_getattr(IfcColumnTypeEnum, 'COLUMN', INDETERMINATE) -pilaster = express_getattr(IfcColumnTypeEnum, 'PILASTER', INDETERMINATE) -pierstem = express_getattr(IfcColumnTypeEnum, 'PIERSTEM', INDETERMINATE) -pierstem_segment = express_getattr(IfcColumnTypeEnum, 'PIERSTEM_SEGMENT', INDETERMINATE) -standcolumn = express_getattr(IfcColumnTypeEnum, 'STANDCOLUMN', INDETERMINATE) -userdefined = express_getattr(IfcColumnTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcColumnTypeEnum, 'NOTDEFINED', INDETERMINATE) +column = IfcColumnTypeEnum.COLUMN +pilaster = IfcColumnTypeEnum.PILASTER +pierstem = IfcColumnTypeEnum.PIERSTEM +pierstem_segment = IfcColumnTypeEnum.PIERSTEM_SEGMENT +standcolumn = IfcColumnTypeEnum.STANDCOLUMN +userdefined = IfcColumnTypeEnum.USERDEFINED +notdefined = IfcColumnTypeEnum.NOTDEFINED IfcCommunicationsApplianceTypeEnum = enum_namespace() -antenna = express_getattr(IfcCommunicationsApplianceTypeEnum, 'ANTENNA', INDETERMINATE) -computer = express_getattr(IfcCommunicationsApplianceTypeEnum, 'COMPUTER', INDETERMINATE) -fax = express_getattr(IfcCommunicationsApplianceTypeEnum, 'FAX', INDETERMINATE) -gateway = express_getattr(IfcCommunicationsApplianceTypeEnum, 'GATEWAY', INDETERMINATE) -modem = express_getattr(IfcCommunicationsApplianceTypeEnum, 'MODEM', INDETERMINATE) -networkappliance = express_getattr(IfcCommunicationsApplianceTypeEnum, 'NETWORKAPPLIANCE', INDETERMINATE) -networkbridge = express_getattr(IfcCommunicationsApplianceTypeEnum, 'NETWORKBRIDGE', INDETERMINATE) -networkhub = express_getattr(IfcCommunicationsApplianceTypeEnum, 'NETWORKHUB', INDETERMINATE) -printer = express_getattr(IfcCommunicationsApplianceTypeEnum, 'PRINTER', INDETERMINATE) -repeater = express_getattr(IfcCommunicationsApplianceTypeEnum, 'REPEATER', INDETERMINATE) -router = express_getattr(IfcCommunicationsApplianceTypeEnum, 'ROUTER', INDETERMINATE) -scanner = express_getattr(IfcCommunicationsApplianceTypeEnum, 'SCANNER', INDETERMINATE) -automaton = express_getattr(IfcCommunicationsApplianceTypeEnum, 'AUTOMATON', INDETERMINATE) -intelligent_peripheral = express_getattr(IfcCommunicationsApplianceTypeEnum, 'INTELLIGENT_PERIPHERAL', INDETERMINATE) -ip_network_equipment = express_getattr(IfcCommunicationsApplianceTypeEnum, 'IP_NETWORK_EQUIPMENT', INDETERMINATE) -optical_network_unit = express_getattr(IfcCommunicationsApplianceTypeEnum, 'OPTICAL_NETWORK_UNIT', INDETERMINATE) -telecommand = express_getattr(IfcCommunicationsApplianceTypeEnum, 'TELECOMMAND', INDETERMINATE) -telephonyexchange = express_getattr(IfcCommunicationsApplianceTypeEnum, 'TELEPHONYEXCHANGE', INDETERMINATE) -transitioncomponent = express_getattr(IfcCommunicationsApplianceTypeEnum, 'TRANSITIONCOMPONENT', INDETERMINATE) -transponder = express_getattr(IfcCommunicationsApplianceTypeEnum, 'TRANSPONDER', INDETERMINATE) -transportequipment = express_getattr(IfcCommunicationsApplianceTypeEnum, 'TRANSPORTEQUIPMENT', INDETERMINATE) -userdefined = express_getattr(IfcCommunicationsApplianceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCommunicationsApplianceTypeEnum, 'NOTDEFINED', INDETERMINATE) +antenna = IfcCommunicationsApplianceTypeEnum.ANTENNA +computer = IfcCommunicationsApplianceTypeEnum.COMPUTER +fax = IfcCommunicationsApplianceTypeEnum.FAX +gateway = IfcCommunicationsApplianceTypeEnum.GATEWAY +modem = IfcCommunicationsApplianceTypeEnum.MODEM +networkappliance = IfcCommunicationsApplianceTypeEnum.NETWORKAPPLIANCE +networkbridge = IfcCommunicationsApplianceTypeEnum.NETWORKBRIDGE +networkhub = IfcCommunicationsApplianceTypeEnum.NETWORKHUB +printer = IfcCommunicationsApplianceTypeEnum.PRINTER +repeater = IfcCommunicationsApplianceTypeEnum.REPEATER +router = IfcCommunicationsApplianceTypeEnum.ROUTER +scanner = IfcCommunicationsApplianceTypeEnum.SCANNER +automaton = IfcCommunicationsApplianceTypeEnum.AUTOMATON +intelligent_peripheral = IfcCommunicationsApplianceTypeEnum.INTELLIGENT_PERIPHERAL +ip_network_equipment = IfcCommunicationsApplianceTypeEnum.IP_NETWORK_EQUIPMENT +optical_network_unit = IfcCommunicationsApplianceTypeEnum.OPTICAL_NETWORK_UNIT +telecommand = IfcCommunicationsApplianceTypeEnum.TELECOMMAND +telephonyexchange = IfcCommunicationsApplianceTypeEnum.TELEPHONYEXCHANGE +transitioncomponent = IfcCommunicationsApplianceTypeEnum.TRANSITIONCOMPONENT +transponder = IfcCommunicationsApplianceTypeEnum.TRANSPONDER +transportequipment = IfcCommunicationsApplianceTypeEnum.TRANSPORTEQUIPMENT +userdefined = IfcCommunicationsApplianceTypeEnum.USERDEFINED +notdefined = IfcCommunicationsApplianceTypeEnum.NOTDEFINED IfcComplexPropertyTemplateTypeEnum = enum_namespace() -p_complex = express_getattr(IfcComplexPropertyTemplateTypeEnum, 'P_COMPLEX', INDETERMINATE) -q_complex = express_getattr(IfcComplexPropertyTemplateTypeEnum, 'Q_COMPLEX', INDETERMINATE) +p_complex = IfcComplexPropertyTemplateTypeEnum.P_COMPLEX +q_complex = IfcComplexPropertyTemplateTypeEnum.Q_COMPLEX IfcCompressorTypeEnum = enum_namespace() -dynamic = express_getattr(IfcCompressorTypeEnum, 'DYNAMIC', INDETERMINATE) -reciprocating = express_getattr(IfcCompressorTypeEnum, 'RECIPROCATING', INDETERMINATE) -rotary = express_getattr(IfcCompressorTypeEnum, 'ROTARY', INDETERMINATE) -scroll = express_getattr(IfcCompressorTypeEnum, 'SCROLL', INDETERMINATE) -trochoidal = express_getattr(IfcCompressorTypeEnum, 'TROCHOIDAL', INDETERMINATE) -singlestage = express_getattr(IfcCompressorTypeEnum, 'SINGLESTAGE', INDETERMINATE) -booster = express_getattr(IfcCompressorTypeEnum, 'BOOSTER', INDETERMINATE) -opentype = express_getattr(IfcCompressorTypeEnum, 'OPENTYPE', INDETERMINATE) -hermetic = express_getattr(IfcCompressorTypeEnum, 'HERMETIC', INDETERMINATE) -semihermetic = express_getattr(IfcCompressorTypeEnum, 'SEMIHERMETIC', INDETERMINATE) -weldedshellhermetic = express_getattr(IfcCompressorTypeEnum, 'WELDEDSHELLHERMETIC', INDETERMINATE) -rollingpiston = express_getattr(IfcCompressorTypeEnum, 'ROLLINGPISTON', INDETERMINATE) -rotaryvane = express_getattr(IfcCompressorTypeEnum, 'ROTARYVANE', INDETERMINATE) -singlescrew = express_getattr(IfcCompressorTypeEnum, 'SINGLESCREW', INDETERMINATE) -twinscrew = express_getattr(IfcCompressorTypeEnum, 'TWINSCREW', INDETERMINATE) -userdefined = express_getattr(IfcCompressorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCompressorTypeEnum, 'NOTDEFINED', INDETERMINATE) +dynamic = IfcCompressorTypeEnum.DYNAMIC +reciprocating = IfcCompressorTypeEnum.RECIPROCATING +rotary = IfcCompressorTypeEnum.ROTARY +scroll = IfcCompressorTypeEnum.SCROLL +trochoidal = IfcCompressorTypeEnum.TROCHOIDAL +singlestage = IfcCompressorTypeEnum.SINGLESTAGE +booster = IfcCompressorTypeEnum.BOOSTER +opentype = IfcCompressorTypeEnum.OPENTYPE +hermetic = IfcCompressorTypeEnum.HERMETIC +semihermetic = IfcCompressorTypeEnum.SEMIHERMETIC +weldedshellhermetic = IfcCompressorTypeEnum.WELDEDSHELLHERMETIC +rollingpiston = IfcCompressorTypeEnum.ROLLINGPISTON +rotaryvane = IfcCompressorTypeEnum.ROTARYVANE +singlescrew = IfcCompressorTypeEnum.SINGLESCREW +twinscrew = IfcCompressorTypeEnum.TWINSCREW +userdefined = IfcCompressorTypeEnum.USERDEFINED +notdefined = IfcCompressorTypeEnum.NOTDEFINED IfcCondenserTypeEnum = enum_namespace() -aircooled = express_getattr(IfcCondenserTypeEnum, 'AIRCOOLED', INDETERMINATE) -evaporativecooled = express_getattr(IfcCondenserTypeEnum, 'EVAPORATIVECOOLED', INDETERMINATE) -watercooled = express_getattr(IfcCondenserTypeEnum, 'WATERCOOLED', INDETERMINATE) -watercooledbrazedplate = express_getattr(IfcCondenserTypeEnum, 'WATERCOOLEDBRAZEDPLATE', INDETERMINATE) -watercooledshellcoil = express_getattr(IfcCondenserTypeEnum, 'WATERCOOLEDSHELLCOIL', INDETERMINATE) -watercooledshelltube = express_getattr(IfcCondenserTypeEnum, 'WATERCOOLEDSHELLTUBE', INDETERMINATE) -watercooledtubeintube = express_getattr(IfcCondenserTypeEnum, 'WATERCOOLEDTUBEINTUBE', INDETERMINATE) -userdefined = express_getattr(IfcCondenserTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCondenserTypeEnum, 'NOTDEFINED', INDETERMINATE) +aircooled = IfcCondenserTypeEnum.AIRCOOLED +evaporativecooled = IfcCondenserTypeEnum.EVAPORATIVECOOLED +watercooled = IfcCondenserTypeEnum.WATERCOOLED +watercooledbrazedplate = IfcCondenserTypeEnum.WATERCOOLEDBRAZEDPLATE +watercooledshellcoil = IfcCondenserTypeEnum.WATERCOOLEDSHELLCOIL +watercooledshelltube = IfcCondenserTypeEnum.WATERCOOLEDSHELLTUBE +watercooledtubeintube = IfcCondenserTypeEnum.WATERCOOLEDTUBEINTUBE +userdefined = IfcCondenserTypeEnum.USERDEFINED +notdefined = IfcCondenserTypeEnum.NOTDEFINED IfcConnectionTypeEnum = enum_namespace() -atpath = express_getattr(IfcConnectionTypeEnum, 'ATPATH', INDETERMINATE) -atstart = express_getattr(IfcConnectionTypeEnum, 'ATSTART', INDETERMINATE) -atend = express_getattr(IfcConnectionTypeEnum, 'ATEND', INDETERMINATE) -notdefined = express_getattr(IfcConnectionTypeEnum, 'NOTDEFINED', INDETERMINATE) +atpath = IfcConnectionTypeEnum.ATPATH +atstart = IfcConnectionTypeEnum.ATSTART +atend = IfcConnectionTypeEnum.ATEND +notdefined = IfcConnectionTypeEnum.NOTDEFINED IfcConstraintEnum = enum_namespace() -hard = express_getattr(IfcConstraintEnum, 'HARD', INDETERMINATE) -soft = express_getattr(IfcConstraintEnum, 'SOFT', INDETERMINATE) -advisory = express_getattr(IfcConstraintEnum, 'ADVISORY', INDETERMINATE) -userdefined = express_getattr(IfcConstraintEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcConstraintEnum, 'NOTDEFINED', INDETERMINATE) +hard = IfcConstraintEnum.HARD +soft = IfcConstraintEnum.SOFT +advisory = IfcConstraintEnum.ADVISORY +userdefined = IfcConstraintEnum.USERDEFINED +notdefined = IfcConstraintEnum.NOTDEFINED IfcConstructionEquipmentResourceTypeEnum = enum_namespace() -demolishing = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'DEMOLISHING', INDETERMINATE) -earthmoving = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'EARTHMOVING', INDETERMINATE) -erecting = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'ERECTING', INDETERMINATE) -heating = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'HEATING', INDETERMINATE) -lighting = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'LIGHTING', INDETERMINATE) -paving = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'PAVING', INDETERMINATE) -pumping = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'PUMPING', INDETERMINATE) -transporting = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'TRANSPORTING', INDETERMINATE) -userdefined = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'NOTDEFINED', INDETERMINATE) +demolishing = IfcConstructionEquipmentResourceTypeEnum.DEMOLISHING +earthmoving = IfcConstructionEquipmentResourceTypeEnum.EARTHMOVING +erecting = IfcConstructionEquipmentResourceTypeEnum.ERECTING +heating = IfcConstructionEquipmentResourceTypeEnum.HEATING +lighting = IfcConstructionEquipmentResourceTypeEnum.LIGHTING +paving = IfcConstructionEquipmentResourceTypeEnum.PAVING +pumping = IfcConstructionEquipmentResourceTypeEnum.PUMPING +transporting = IfcConstructionEquipmentResourceTypeEnum.TRANSPORTING +userdefined = IfcConstructionEquipmentResourceTypeEnum.USERDEFINED +notdefined = IfcConstructionEquipmentResourceTypeEnum.NOTDEFINED IfcConstructionMaterialResourceTypeEnum = enum_namespace() -aggregates = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'AGGREGATES', INDETERMINATE) -concrete = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'CONCRETE', INDETERMINATE) -drywall = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'DRYWALL', INDETERMINATE) -fuel = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'FUEL', INDETERMINATE) -gypsum = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'GYPSUM', INDETERMINATE) -masonry = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'MASONRY', INDETERMINATE) -metal = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'METAL', INDETERMINATE) -plastic = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'PLASTIC', INDETERMINATE) -wood = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'WOOD', INDETERMINATE) -notdefined = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'NOTDEFINED', INDETERMINATE) -userdefined = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'USERDEFINED', INDETERMINATE) +aggregates = IfcConstructionMaterialResourceTypeEnum.AGGREGATES +concrete = IfcConstructionMaterialResourceTypeEnum.CONCRETE +drywall = IfcConstructionMaterialResourceTypeEnum.DRYWALL +fuel = IfcConstructionMaterialResourceTypeEnum.FUEL +gypsum = IfcConstructionMaterialResourceTypeEnum.GYPSUM +masonry = IfcConstructionMaterialResourceTypeEnum.MASONRY +metal = IfcConstructionMaterialResourceTypeEnum.METAL +plastic = IfcConstructionMaterialResourceTypeEnum.PLASTIC +wood = IfcConstructionMaterialResourceTypeEnum.WOOD +notdefined = IfcConstructionMaterialResourceTypeEnum.NOTDEFINED +userdefined = IfcConstructionMaterialResourceTypeEnum.USERDEFINED IfcConstructionProductResourceTypeEnum = enum_namespace() -assembly = express_getattr(IfcConstructionProductResourceTypeEnum, 'ASSEMBLY', INDETERMINATE) -formwork = express_getattr(IfcConstructionProductResourceTypeEnum, 'FORMWORK', INDETERMINATE) -userdefined = express_getattr(IfcConstructionProductResourceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcConstructionProductResourceTypeEnum, 'NOTDEFINED', INDETERMINATE) +assembly = IfcConstructionProductResourceTypeEnum.ASSEMBLY +formwork = IfcConstructionProductResourceTypeEnum.FORMWORK +userdefined = IfcConstructionProductResourceTypeEnum.USERDEFINED +notdefined = IfcConstructionProductResourceTypeEnum.NOTDEFINED IfcControllerTypeEnum = enum_namespace() -floating = express_getattr(IfcControllerTypeEnum, 'FLOATING', INDETERMINATE) -programmable = express_getattr(IfcControllerTypeEnum, 'PROGRAMMABLE', INDETERMINATE) -proportional = express_getattr(IfcControllerTypeEnum, 'PROPORTIONAL', INDETERMINATE) -multiposition = express_getattr(IfcControllerTypeEnum, 'MULTIPOSITION', INDETERMINATE) -twoposition = express_getattr(IfcControllerTypeEnum, 'TWOPOSITION', INDETERMINATE) -userdefined = express_getattr(IfcControllerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcControllerTypeEnum, 'NOTDEFINED', INDETERMINATE) +floating = IfcControllerTypeEnum.FLOATING +programmable = IfcControllerTypeEnum.PROGRAMMABLE +proportional = IfcControllerTypeEnum.PROPORTIONAL +multiposition = IfcControllerTypeEnum.MULTIPOSITION +twoposition = IfcControllerTypeEnum.TWOPOSITION +userdefined = IfcControllerTypeEnum.USERDEFINED +notdefined = IfcControllerTypeEnum.NOTDEFINED IfcConveyorSegmentTypeEnum = enum_namespace() -chuteconveyor = express_getattr(IfcConveyorSegmentTypeEnum, 'CHUTECONVEYOR', INDETERMINATE) -beltconveyor = express_getattr(IfcConveyorSegmentTypeEnum, 'BELTCONVEYOR', INDETERMINATE) -screwconveyor = express_getattr(IfcConveyorSegmentTypeEnum, 'SCREWCONVEYOR', INDETERMINATE) -bucketconveyor = express_getattr(IfcConveyorSegmentTypeEnum, 'BUCKETCONVEYOR', INDETERMINATE) -userdefined = express_getattr(IfcConveyorSegmentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcConveyorSegmentTypeEnum, 'NOTDEFINED', INDETERMINATE) +chuteconveyor = IfcConveyorSegmentTypeEnum.CHUTECONVEYOR +beltconveyor = IfcConveyorSegmentTypeEnum.BELTCONVEYOR +screwconveyor = IfcConveyorSegmentTypeEnum.SCREWCONVEYOR +bucketconveyor = IfcConveyorSegmentTypeEnum.BUCKETCONVEYOR +userdefined = IfcConveyorSegmentTypeEnum.USERDEFINED +notdefined = IfcConveyorSegmentTypeEnum.NOTDEFINED IfcCooledBeamTypeEnum = enum_namespace() -active = express_getattr(IfcCooledBeamTypeEnum, 'ACTIVE', INDETERMINATE) -passive = express_getattr(IfcCooledBeamTypeEnum, 'PASSIVE', INDETERMINATE) -userdefined = express_getattr(IfcCooledBeamTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCooledBeamTypeEnum, 'NOTDEFINED', INDETERMINATE) +active = IfcCooledBeamTypeEnum.ACTIVE +passive = IfcCooledBeamTypeEnum.PASSIVE +userdefined = IfcCooledBeamTypeEnum.USERDEFINED +notdefined = IfcCooledBeamTypeEnum.NOTDEFINED IfcCoolingTowerTypeEnum = enum_namespace() -naturaldraft = express_getattr(IfcCoolingTowerTypeEnum, 'NATURALDRAFT', INDETERMINATE) -mechanicalinduceddraft = express_getattr(IfcCoolingTowerTypeEnum, 'MECHANICALINDUCEDDRAFT', INDETERMINATE) -mechanicalforceddraft = express_getattr(IfcCoolingTowerTypeEnum, 'MECHANICALFORCEDDRAFT', INDETERMINATE) -userdefined = express_getattr(IfcCoolingTowerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCoolingTowerTypeEnum, 'NOTDEFINED', INDETERMINATE) +naturaldraft = IfcCoolingTowerTypeEnum.NATURALDRAFT +mechanicalinduceddraft = IfcCoolingTowerTypeEnum.MECHANICALINDUCEDDRAFT +mechanicalforceddraft = IfcCoolingTowerTypeEnum.MECHANICALFORCEDDRAFT +userdefined = IfcCoolingTowerTypeEnum.USERDEFINED +notdefined = IfcCoolingTowerTypeEnum.NOTDEFINED IfcCostItemTypeEnum = enum_namespace() -userdefined = express_getattr(IfcCostItemTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCostItemTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcCostItemTypeEnum.USERDEFINED +notdefined = IfcCostItemTypeEnum.NOTDEFINED IfcCostScheduleTypeEnum = enum_namespace() -budget = express_getattr(IfcCostScheduleTypeEnum, 'BUDGET', INDETERMINATE) -costplan = express_getattr(IfcCostScheduleTypeEnum, 'COSTPLAN', INDETERMINATE) -estimate = express_getattr(IfcCostScheduleTypeEnum, 'ESTIMATE', INDETERMINATE) -tender = express_getattr(IfcCostScheduleTypeEnum, 'TENDER', INDETERMINATE) -pricedbillofquantities = express_getattr(IfcCostScheduleTypeEnum, 'PRICEDBILLOFQUANTITIES', INDETERMINATE) -unpricedbillofquantities = express_getattr(IfcCostScheduleTypeEnum, 'UNPRICEDBILLOFQUANTITIES', INDETERMINATE) -scheduleofrates = express_getattr(IfcCostScheduleTypeEnum, 'SCHEDULEOFRATES', INDETERMINATE) -userdefined = express_getattr(IfcCostScheduleTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCostScheduleTypeEnum, 'NOTDEFINED', INDETERMINATE) +budget = IfcCostScheduleTypeEnum.BUDGET +costplan = IfcCostScheduleTypeEnum.COSTPLAN +estimate = IfcCostScheduleTypeEnum.ESTIMATE +tender = IfcCostScheduleTypeEnum.TENDER +pricedbillofquantities = IfcCostScheduleTypeEnum.PRICEDBILLOFQUANTITIES +unpricedbillofquantities = IfcCostScheduleTypeEnum.UNPRICEDBILLOFQUANTITIES +scheduleofrates = IfcCostScheduleTypeEnum.SCHEDULEOFRATES +userdefined = IfcCostScheduleTypeEnum.USERDEFINED +notdefined = IfcCostScheduleTypeEnum.NOTDEFINED IfcCourseTypeEnum = enum_namespace() -armour = express_getattr(IfcCourseTypeEnum, 'ARMOUR', INDETERMINATE) -filter = express_getattr(IfcCourseTypeEnum, 'FILTER', INDETERMINATE) -ballastbed = express_getattr(IfcCourseTypeEnum, 'BALLASTBED', INDETERMINATE) -core = express_getattr(IfcCourseTypeEnum, 'CORE', INDETERMINATE) -pavement = express_getattr(IfcCourseTypeEnum, 'PAVEMENT', INDETERMINATE) -protection = express_getattr(IfcCourseTypeEnum, 'PROTECTION', INDETERMINATE) -userdefined = express_getattr(IfcCourseTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCourseTypeEnum, 'NOTDEFINED', INDETERMINATE) +armour = IfcCourseTypeEnum.ARMOUR +filter = IfcCourseTypeEnum.FILTER +ballastbed = IfcCourseTypeEnum.BALLASTBED +core = IfcCourseTypeEnum.CORE +pavement = IfcCourseTypeEnum.PAVEMENT +protection = IfcCourseTypeEnum.PROTECTION +userdefined = IfcCourseTypeEnum.USERDEFINED +notdefined = IfcCourseTypeEnum.NOTDEFINED IfcCoveringTypeEnum = enum_namespace() -ceiling = express_getattr(IfcCoveringTypeEnum, 'CEILING', INDETERMINATE) -flooring = express_getattr(IfcCoveringTypeEnum, 'FLOORING', INDETERMINATE) -cladding = express_getattr(IfcCoveringTypeEnum, 'CLADDING', INDETERMINATE) -roofing = express_getattr(IfcCoveringTypeEnum, 'ROOFING', INDETERMINATE) -molding = express_getattr(IfcCoveringTypeEnum, 'MOLDING', INDETERMINATE) -skirtingboard = express_getattr(IfcCoveringTypeEnum, 'SKIRTINGBOARD', INDETERMINATE) -insulation = express_getattr(IfcCoveringTypeEnum, 'INSULATION', INDETERMINATE) -membrane = express_getattr(IfcCoveringTypeEnum, 'MEMBRANE', INDETERMINATE) -sleeving = express_getattr(IfcCoveringTypeEnum, 'SLEEVING', INDETERMINATE) -wrapping = express_getattr(IfcCoveringTypeEnum, 'WRAPPING', INDETERMINATE) -coping = express_getattr(IfcCoveringTypeEnum, 'COPING', INDETERMINATE) -userdefined = express_getattr(IfcCoveringTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCoveringTypeEnum, 'NOTDEFINED', INDETERMINATE) +ceiling = IfcCoveringTypeEnum.CEILING +flooring = IfcCoveringTypeEnum.FLOORING +cladding = IfcCoveringTypeEnum.CLADDING +roofing = IfcCoveringTypeEnum.ROOFING +molding = IfcCoveringTypeEnum.MOLDING +skirtingboard = IfcCoveringTypeEnum.SKIRTINGBOARD +insulation = IfcCoveringTypeEnum.INSULATION +membrane = IfcCoveringTypeEnum.MEMBRANE +sleeving = IfcCoveringTypeEnum.SLEEVING +wrapping = IfcCoveringTypeEnum.WRAPPING +coping = IfcCoveringTypeEnum.COPING +userdefined = IfcCoveringTypeEnum.USERDEFINED +notdefined = IfcCoveringTypeEnum.NOTDEFINED IfcCrewResourceTypeEnum = enum_namespace() -office = express_getattr(IfcCrewResourceTypeEnum, 'OFFICE', INDETERMINATE) -site = express_getattr(IfcCrewResourceTypeEnum, 'SITE', INDETERMINATE) -userdefined = express_getattr(IfcCrewResourceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCrewResourceTypeEnum, 'NOTDEFINED', INDETERMINATE) +office = IfcCrewResourceTypeEnum.OFFICE +site = IfcCrewResourceTypeEnum.SITE +userdefined = IfcCrewResourceTypeEnum.USERDEFINED +notdefined = IfcCrewResourceTypeEnum.NOTDEFINED IfcCurtainWallTypeEnum = enum_namespace() -userdefined = express_getattr(IfcCurtainWallTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCurtainWallTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcCurtainWallTypeEnum.USERDEFINED +notdefined = IfcCurtainWallTypeEnum.NOTDEFINED IfcCurveInterpolationEnum = enum_namespace() -linear = express_getattr(IfcCurveInterpolationEnum, 'LINEAR', INDETERMINATE) -log_linear = express_getattr(IfcCurveInterpolationEnum, 'LOG_LINEAR', INDETERMINATE) -log_log = express_getattr(IfcCurveInterpolationEnum, 'LOG_LOG', INDETERMINATE) -notdefined = express_getattr(IfcCurveInterpolationEnum, 'NOTDEFINED', INDETERMINATE) +linear = IfcCurveInterpolationEnum.LINEAR +log_linear = IfcCurveInterpolationEnum.LOG_LINEAR +log_log = IfcCurveInterpolationEnum.LOG_LOG +notdefined = IfcCurveInterpolationEnum.NOTDEFINED IfcDamperTypeEnum = enum_namespace() -backdraftdamper = express_getattr(IfcDamperTypeEnum, 'BACKDRAFTDAMPER', INDETERMINATE) -balancingdamper = express_getattr(IfcDamperTypeEnum, 'BALANCINGDAMPER', INDETERMINATE) -blastdamper = express_getattr(IfcDamperTypeEnum, 'BLASTDAMPER', INDETERMINATE) -controldamper = express_getattr(IfcDamperTypeEnum, 'CONTROLDAMPER', INDETERMINATE) -firedamper = express_getattr(IfcDamperTypeEnum, 'FIREDAMPER', INDETERMINATE) -firesmokedamper = express_getattr(IfcDamperTypeEnum, 'FIRESMOKEDAMPER', INDETERMINATE) -fumehoodexhaust = express_getattr(IfcDamperTypeEnum, 'FUMEHOODEXHAUST', INDETERMINATE) -gravitydamper = express_getattr(IfcDamperTypeEnum, 'GRAVITYDAMPER', INDETERMINATE) -gravityreliefdamper = express_getattr(IfcDamperTypeEnum, 'GRAVITYRELIEFDAMPER', INDETERMINATE) -reliefdamper = express_getattr(IfcDamperTypeEnum, 'RELIEFDAMPER', INDETERMINATE) -smokedamper = express_getattr(IfcDamperTypeEnum, 'SMOKEDAMPER', INDETERMINATE) -userdefined = express_getattr(IfcDamperTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDamperTypeEnum, 'NOTDEFINED', INDETERMINATE) +backdraftdamper = IfcDamperTypeEnum.BACKDRAFTDAMPER +balancingdamper = IfcDamperTypeEnum.BALANCINGDAMPER +blastdamper = IfcDamperTypeEnum.BLASTDAMPER +controldamper = IfcDamperTypeEnum.CONTROLDAMPER +firedamper = IfcDamperTypeEnum.FIREDAMPER +firesmokedamper = IfcDamperTypeEnum.FIRESMOKEDAMPER +fumehoodexhaust = IfcDamperTypeEnum.FUMEHOODEXHAUST +gravitydamper = IfcDamperTypeEnum.GRAVITYDAMPER +gravityreliefdamper = IfcDamperTypeEnum.GRAVITYRELIEFDAMPER +reliefdamper = IfcDamperTypeEnum.RELIEFDAMPER +smokedamper = IfcDamperTypeEnum.SMOKEDAMPER +userdefined = IfcDamperTypeEnum.USERDEFINED +notdefined = IfcDamperTypeEnum.NOTDEFINED IfcDataOriginEnum = enum_namespace() -measured = express_getattr(IfcDataOriginEnum, 'MEASURED', INDETERMINATE) -predicted = express_getattr(IfcDataOriginEnum, 'PREDICTED', INDETERMINATE) -simulated = express_getattr(IfcDataOriginEnum, 'SIMULATED', INDETERMINATE) -userdefined = express_getattr(IfcDataOriginEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDataOriginEnum, 'NOTDEFINED', INDETERMINATE) +measured = IfcDataOriginEnum.MEASURED +predicted = IfcDataOriginEnum.PREDICTED +simulated = IfcDataOriginEnum.SIMULATED +userdefined = IfcDataOriginEnum.USERDEFINED +notdefined = IfcDataOriginEnum.NOTDEFINED IfcDerivedUnitEnum = enum_namespace() -angularvelocityunit = express_getattr(IfcDerivedUnitEnum, 'ANGULARVELOCITYUNIT', INDETERMINATE) -areadensityunit = express_getattr(IfcDerivedUnitEnum, 'AREADENSITYUNIT', INDETERMINATE) -compoundplaneangleunit = express_getattr(IfcDerivedUnitEnum, 'COMPOUNDPLANEANGLEUNIT', INDETERMINATE) -dynamicviscosityunit = express_getattr(IfcDerivedUnitEnum, 'DYNAMICVISCOSITYUNIT', INDETERMINATE) -heatfluxdensityunit = express_getattr(IfcDerivedUnitEnum, 'HEATFLUXDENSITYUNIT', INDETERMINATE) -integercountrateunit = express_getattr(IfcDerivedUnitEnum, 'INTEGERCOUNTRATEUNIT', INDETERMINATE) -isothermalmoisturecapacityunit = express_getattr(IfcDerivedUnitEnum, 'ISOTHERMALMOISTURECAPACITYUNIT', INDETERMINATE) -kinematicviscosityunit = express_getattr(IfcDerivedUnitEnum, 'KINEMATICVISCOSITYUNIT', INDETERMINATE) -linearvelocityunit = express_getattr(IfcDerivedUnitEnum, 'LINEARVELOCITYUNIT', INDETERMINATE) -massdensityunit = express_getattr(IfcDerivedUnitEnum, 'MASSDENSITYUNIT', INDETERMINATE) -massflowrateunit = express_getattr(IfcDerivedUnitEnum, 'MASSFLOWRATEUNIT', INDETERMINATE) -moisturediffusivityunit = express_getattr(IfcDerivedUnitEnum, 'MOISTUREDIFFUSIVITYUNIT', INDETERMINATE) -molecularweightunit = express_getattr(IfcDerivedUnitEnum, 'MOLECULARWEIGHTUNIT', INDETERMINATE) -specificheatcapacityunit = express_getattr(IfcDerivedUnitEnum, 'SPECIFICHEATCAPACITYUNIT', INDETERMINATE) -thermaladmittanceunit = express_getattr(IfcDerivedUnitEnum, 'THERMALADMITTANCEUNIT', INDETERMINATE) -thermalconductanceunit = express_getattr(IfcDerivedUnitEnum, 'THERMALCONDUCTANCEUNIT', INDETERMINATE) -thermalresistanceunit = express_getattr(IfcDerivedUnitEnum, 'THERMALRESISTANCEUNIT', INDETERMINATE) -thermaltransmittanceunit = express_getattr(IfcDerivedUnitEnum, 'THERMALTRANSMITTANCEUNIT', INDETERMINATE) -vaporpermeabilityunit = express_getattr(IfcDerivedUnitEnum, 'VAPORPERMEABILITYUNIT', INDETERMINATE) -volumetricflowrateunit = express_getattr(IfcDerivedUnitEnum, 'VOLUMETRICFLOWRATEUNIT', INDETERMINATE) -rotationalfrequencyunit = express_getattr(IfcDerivedUnitEnum, 'ROTATIONALFREQUENCYUNIT', INDETERMINATE) -torqueunit = express_getattr(IfcDerivedUnitEnum, 'TORQUEUNIT', INDETERMINATE) -momentofinertiaunit = express_getattr(IfcDerivedUnitEnum, 'MOMENTOFINERTIAUNIT', INDETERMINATE) -linearmomentunit = express_getattr(IfcDerivedUnitEnum, 'LINEARMOMENTUNIT', INDETERMINATE) -linearforceunit = express_getattr(IfcDerivedUnitEnum, 'LINEARFORCEUNIT', INDETERMINATE) -planarforceunit = express_getattr(IfcDerivedUnitEnum, 'PLANARFORCEUNIT', INDETERMINATE) -modulusofelasticityunit = express_getattr(IfcDerivedUnitEnum, 'MODULUSOFELASTICITYUNIT', INDETERMINATE) -shearmodulusunit = express_getattr(IfcDerivedUnitEnum, 'SHEARMODULUSUNIT', INDETERMINATE) -linearstiffnessunit = express_getattr(IfcDerivedUnitEnum, 'LINEARSTIFFNESSUNIT', INDETERMINATE) -rotationalstiffnessunit = express_getattr(IfcDerivedUnitEnum, 'ROTATIONALSTIFFNESSUNIT', INDETERMINATE) -modulusofsubgradereactionunit = express_getattr(IfcDerivedUnitEnum, 'MODULUSOFSUBGRADEREACTIONUNIT', INDETERMINATE) -accelerationunit = express_getattr(IfcDerivedUnitEnum, 'ACCELERATIONUNIT', INDETERMINATE) -curvatureunit = express_getattr(IfcDerivedUnitEnum, 'CURVATUREUNIT', INDETERMINATE) -heatingvalueunit = express_getattr(IfcDerivedUnitEnum, 'HEATINGVALUEUNIT', INDETERMINATE) -ionconcentrationunit = express_getattr(IfcDerivedUnitEnum, 'IONCONCENTRATIONUNIT', INDETERMINATE) -luminousintensitydistributionunit = express_getattr(IfcDerivedUnitEnum, 'LUMINOUSINTENSITYDISTRIBUTIONUNIT', INDETERMINATE) -massperlengthunit = express_getattr(IfcDerivedUnitEnum, 'MASSPERLENGTHUNIT', INDETERMINATE) -modulusoflinearsubgradereactionunit = express_getattr(IfcDerivedUnitEnum, 'MODULUSOFLINEARSUBGRADEREACTIONUNIT', INDETERMINATE) -modulusofrotationalsubgradereactionunit = express_getattr(IfcDerivedUnitEnum, 'MODULUSOFROTATIONALSUBGRADEREACTIONUNIT', INDETERMINATE) -phunit = express_getattr(IfcDerivedUnitEnum, 'PHUNIT', INDETERMINATE) -rotationalmassunit = express_getattr(IfcDerivedUnitEnum, 'ROTATIONALMASSUNIT', INDETERMINATE) -sectionareaintegralunit = express_getattr(IfcDerivedUnitEnum, 'SECTIONAREAINTEGRALUNIT', INDETERMINATE) -sectionmodulusunit = express_getattr(IfcDerivedUnitEnum, 'SECTIONMODULUSUNIT', INDETERMINATE) -soundpowerlevelunit = express_getattr(IfcDerivedUnitEnum, 'SOUNDPOWERLEVELUNIT', INDETERMINATE) -soundpowerunit = express_getattr(IfcDerivedUnitEnum, 'SOUNDPOWERUNIT', INDETERMINATE) -soundpressurelevelunit = express_getattr(IfcDerivedUnitEnum, 'SOUNDPRESSURELEVELUNIT', INDETERMINATE) -soundpressureunit = express_getattr(IfcDerivedUnitEnum, 'SOUNDPRESSUREUNIT', INDETERMINATE) -temperaturegradientunit = express_getattr(IfcDerivedUnitEnum, 'TEMPERATUREGRADIENTUNIT', INDETERMINATE) -temperaturerateofchangeunit = express_getattr(IfcDerivedUnitEnum, 'TEMPERATURERATEOFCHANGEUNIT', INDETERMINATE) -thermalexpansioncoefficientunit = express_getattr(IfcDerivedUnitEnum, 'THERMALEXPANSIONCOEFFICIENTUNIT', INDETERMINATE) -warpingconstantunit = express_getattr(IfcDerivedUnitEnum, 'WARPINGCONSTANTUNIT', INDETERMINATE) -warpingmomentunit = express_getattr(IfcDerivedUnitEnum, 'WARPINGMOMENTUNIT', INDETERMINATE) -userdefined = express_getattr(IfcDerivedUnitEnum, 'USERDEFINED', INDETERMINATE) +angularvelocityunit = IfcDerivedUnitEnum.ANGULARVELOCITYUNIT +areadensityunit = IfcDerivedUnitEnum.AREADENSITYUNIT +compoundplaneangleunit = IfcDerivedUnitEnum.COMPOUNDPLANEANGLEUNIT +dynamicviscosityunit = IfcDerivedUnitEnum.DYNAMICVISCOSITYUNIT +heatfluxdensityunit = IfcDerivedUnitEnum.HEATFLUXDENSITYUNIT +integercountrateunit = IfcDerivedUnitEnum.INTEGERCOUNTRATEUNIT +isothermalmoisturecapacityunit = IfcDerivedUnitEnum.ISOTHERMALMOISTURECAPACITYUNIT +kinematicviscosityunit = IfcDerivedUnitEnum.KINEMATICVISCOSITYUNIT +linearvelocityunit = IfcDerivedUnitEnum.LINEARVELOCITYUNIT +massdensityunit = IfcDerivedUnitEnum.MASSDENSITYUNIT +massflowrateunit = IfcDerivedUnitEnum.MASSFLOWRATEUNIT +moisturediffusivityunit = IfcDerivedUnitEnum.MOISTUREDIFFUSIVITYUNIT +molecularweightunit = IfcDerivedUnitEnum.MOLECULARWEIGHTUNIT +specificheatcapacityunit = IfcDerivedUnitEnum.SPECIFICHEATCAPACITYUNIT +thermaladmittanceunit = IfcDerivedUnitEnum.THERMALADMITTANCEUNIT +thermalconductanceunit = IfcDerivedUnitEnum.THERMALCONDUCTANCEUNIT +thermalresistanceunit = IfcDerivedUnitEnum.THERMALRESISTANCEUNIT +thermaltransmittanceunit = IfcDerivedUnitEnum.THERMALTRANSMITTANCEUNIT +vaporpermeabilityunit = IfcDerivedUnitEnum.VAPORPERMEABILITYUNIT +volumetricflowrateunit = IfcDerivedUnitEnum.VOLUMETRICFLOWRATEUNIT +rotationalfrequencyunit = IfcDerivedUnitEnum.ROTATIONALFREQUENCYUNIT +torqueunit = IfcDerivedUnitEnum.TORQUEUNIT +momentofinertiaunit = IfcDerivedUnitEnum.MOMENTOFINERTIAUNIT +linearmomentunit = IfcDerivedUnitEnum.LINEARMOMENTUNIT +linearforceunit = IfcDerivedUnitEnum.LINEARFORCEUNIT +planarforceunit = IfcDerivedUnitEnum.PLANARFORCEUNIT +modulusofelasticityunit = IfcDerivedUnitEnum.MODULUSOFELASTICITYUNIT +shearmodulusunit = IfcDerivedUnitEnum.SHEARMODULUSUNIT +linearstiffnessunit = IfcDerivedUnitEnum.LINEARSTIFFNESSUNIT +rotationalstiffnessunit = IfcDerivedUnitEnum.ROTATIONALSTIFFNESSUNIT +modulusofsubgradereactionunit = IfcDerivedUnitEnum.MODULUSOFSUBGRADEREACTIONUNIT +accelerationunit = IfcDerivedUnitEnum.ACCELERATIONUNIT +curvatureunit = IfcDerivedUnitEnum.CURVATUREUNIT +heatingvalueunit = IfcDerivedUnitEnum.HEATINGVALUEUNIT +ionconcentrationunit = IfcDerivedUnitEnum.IONCONCENTRATIONUNIT +luminousintensitydistributionunit = IfcDerivedUnitEnum.LUMINOUSINTENSITYDISTRIBUTIONUNIT +massperlengthunit = IfcDerivedUnitEnum.MASSPERLENGTHUNIT +modulusoflinearsubgradereactionunit = IfcDerivedUnitEnum.MODULUSOFLINEARSUBGRADEREACTIONUNIT +modulusofrotationalsubgradereactionunit = IfcDerivedUnitEnum.MODULUSOFROTATIONALSUBGRADEREACTIONUNIT +phunit = IfcDerivedUnitEnum.PHUNIT +rotationalmassunit = IfcDerivedUnitEnum.ROTATIONALMASSUNIT +sectionareaintegralunit = IfcDerivedUnitEnum.SECTIONAREAINTEGRALUNIT +sectionmodulusunit = IfcDerivedUnitEnum.SECTIONMODULUSUNIT +soundpowerlevelunit = IfcDerivedUnitEnum.SOUNDPOWERLEVELUNIT +soundpowerunit = IfcDerivedUnitEnum.SOUNDPOWERUNIT +soundpressurelevelunit = IfcDerivedUnitEnum.SOUNDPRESSURELEVELUNIT +soundpressureunit = IfcDerivedUnitEnum.SOUNDPRESSUREUNIT +temperaturegradientunit = IfcDerivedUnitEnum.TEMPERATUREGRADIENTUNIT +temperaturerateofchangeunit = IfcDerivedUnitEnum.TEMPERATURERATEOFCHANGEUNIT +thermalexpansioncoefficientunit = IfcDerivedUnitEnum.THERMALEXPANSIONCOEFFICIENTUNIT +warpingconstantunit = IfcDerivedUnitEnum.WARPINGCONSTANTUNIT +warpingmomentunit = IfcDerivedUnitEnum.WARPINGMOMENTUNIT +userdefined = IfcDerivedUnitEnum.USERDEFINED IfcDirectionSenseEnum = enum_namespace() -positive = express_getattr(IfcDirectionSenseEnum, 'POSITIVE', INDETERMINATE) -negative = express_getattr(IfcDirectionSenseEnum, 'NEGATIVE', INDETERMINATE) +positive = IfcDirectionSenseEnum.POSITIVE +negative = IfcDirectionSenseEnum.NEGATIVE IfcDiscreteAccessoryTypeEnum = enum_namespace() -anchorplate = express_getattr(IfcDiscreteAccessoryTypeEnum, 'ANCHORPLATE', INDETERMINATE) -bracket = express_getattr(IfcDiscreteAccessoryTypeEnum, 'BRACKET', INDETERMINATE) -shoe = express_getattr(IfcDiscreteAccessoryTypeEnum, 'SHOE', INDETERMINATE) -expansion_joint_device = express_getattr(IfcDiscreteAccessoryTypeEnum, 'EXPANSION_JOINT_DEVICE', INDETERMINATE) -birdprotection = express_getattr(IfcDiscreteAccessoryTypeEnum, 'BIRDPROTECTION', INDETERMINATE) -cablearranger = express_getattr(IfcDiscreteAccessoryTypeEnum, 'CABLEARRANGER', INDETERMINATE) -insulator = express_getattr(IfcDiscreteAccessoryTypeEnum, 'INSULATOR', INDETERMINATE) -lock = express_getattr(IfcDiscreteAccessoryTypeEnum, 'LOCK', INDETERMINATE) -tensioningequipment = express_getattr(IfcDiscreteAccessoryTypeEnum, 'TENSIONINGEQUIPMENT', INDETERMINATE) -railpad = express_getattr(IfcDiscreteAccessoryTypeEnum, 'RAILPAD', INDETERMINATE) -slidingchair = express_getattr(IfcDiscreteAccessoryTypeEnum, 'SLIDINGCHAIR', INDETERMINATE) -panel_strengthening = express_getattr(IfcDiscreteAccessoryTypeEnum, 'PANEL_STRENGTHENING', INDETERMINATE) -railbrace = express_getattr(IfcDiscreteAccessoryTypeEnum, 'RAILBRACE', INDETERMINATE) -elastic_cushion = express_getattr(IfcDiscreteAccessoryTypeEnum, 'ELASTIC_CUSHION', INDETERMINATE) -soundabsorption = express_getattr(IfcDiscreteAccessoryTypeEnum, 'SOUNDABSORPTION', INDETERMINATE) -rail_lubrication = express_getattr(IfcDiscreteAccessoryTypeEnum, 'RAIL_LUBRICATION', INDETERMINATE) -rail_mechanical_equipment = express_getattr(IfcDiscreteAccessoryTypeEnum, 'RAIL_MECHANICAL_EQUIPMENT', INDETERMINATE) -userdefined = express_getattr(IfcDiscreteAccessoryTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDiscreteAccessoryTypeEnum, 'NOTDEFINED', INDETERMINATE) +anchorplate = IfcDiscreteAccessoryTypeEnum.ANCHORPLATE +bracket = IfcDiscreteAccessoryTypeEnum.BRACKET +shoe = IfcDiscreteAccessoryTypeEnum.SHOE +expansion_joint_device = IfcDiscreteAccessoryTypeEnum.EXPANSION_JOINT_DEVICE +birdprotection = IfcDiscreteAccessoryTypeEnum.BIRDPROTECTION +cablearranger = IfcDiscreteAccessoryTypeEnum.CABLEARRANGER +insulator = IfcDiscreteAccessoryTypeEnum.INSULATOR +lock = IfcDiscreteAccessoryTypeEnum.LOCK +tensioningequipment = IfcDiscreteAccessoryTypeEnum.TENSIONINGEQUIPMENT +railpad = IfcDiscreteAccessoryTypeEnum.RAILPAD +slidingchair = IfcDiscreteAccessoryTypeEnum.SLIDINGCHAIR +panel_strengthening = IfcDiscreteAccessoryTypeEnum.PANEL_STRENGTHENING +railbrace = IfcDiscreteAccessoryTypeEnum.RAILBRACE +elastic_cushion = IfcDiscreteAccessoryTypeEnum.ELASTIC_CUSHION +soundabsorption = IfcDiscreteAccessoryTypeEnum.SOUNDABSORPTION +rail_lubrication = IfcDiscreteAccessoryTypeEnum.RAIL_LUBRICATION +rail_mechanical_equipment = IfcDiscreteAccessoryTypeEnum.RAIL_MECHANICAL_EQUIPMENT +userdefined = IfcDiscreteAccessoryTypeEnum.USERDEFINED +notdefined = IfcDiscreteAccessoryTypeEnum.NOTDEFINED IfcDistributionBoardTypeEnum = enum_namespace() -switchboard = express_getattr(IfcDistributionBoardTypeEnum, 'SWITCHBOARD', INDETERMINATE) -consumerunit = express_getattr(IfcDistributionBoardTypeEnum, 'CONSUMERUNIT', INDETERMINATE) -motorcontrolcentre = express_getattr(IfcDistributionBoardTypeEnum, 'MOTORCONTROLCENTRE', INDETERMINATE) -distributionframe = express_getattr(IfcDistributionBoardTypeEnum, 'DISTRIBUTIONFRAME', INDETERMINATE) -distributionboard = express_getattr(IfcDistributionBoardTypeEnum, 'DISTRIBUTIONBOARD', INDETERMINATE) -userdefined = express_getattr(IfcDistributionBoardTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDistributionBoardTypeEnum, 'NOTDEFINED', INDETERMINATE) +switchboard = IfcDistributionBoardTypeEnum.SWITCHBOARD +consumerunit = IfcDistributionBoardTypeEnum.CONSUMERUNIT +motorcontrolcentre = IfcDistributionBoardTypeEnum.MOTORCONTROLCENTRE +distributionframe = IfcDistributionBoardTypeEnum.DISTRIBUTIONFRAME +distributionboard = IfcDistributionBoardTypeEnum.DISTRIBUTIONBOARD +userdefined = IfcDistributionBoardTypeEnum.USERDEFINED +notdefined = IfcDistributionBoardTypeEnum.NOTDEFINED IfcDistributionChamberElementTypeEnum = enum_namespace() -formedduct = express_getattr(IfcDistributionChamberElementTypeEnum, 'FORMEDDUCT', INDETERMINATE) -inspectionchamber = express_getattr(IfcDistributionChamberElementTypeEnum, 'INSPECTIONCHAMBER', INDETERMINATE) -inspectionpit = express_getattr(IfcDistributionChamberElementTypeEnum, 'INSPECTIONPIT', INDETERMINATE) -manhole = express_getattr(IfcDistributionChamberElementTypeEnum, 'MANHOLE', INDETERMINATE) -meterchamber = express_getattr(IfcDistributionChamberElementTypeEnum, 'METERCHAMBER', INDETERMINATE) -sump = express_getattr(IfcDistributionChamberElementTypeEnum, 'SUMP', INDETERMINATE) -trench = express_getattr(IfcDistributionChamberElementTypeEnum, 'TRENCH', INDETERMINATE) -valvechamber = express_getattr(IfcDistributionChamberElementTypeEnum, 'VALVECHAMBER', INDETERMINATE) -userdefined = express_getattr(IfcDistributionChamberElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDistributionChamberElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +formedduct = IfcDistributionChamberElementTypeEnum.FORMEDDUCT +inspectionchamber = IfcDistributionChamberElementTypeEnum.INSPECTIONCHAMBER +inspectionpit = IfcDistributionChamberElementTypeEnum.INSPECTIONPIT +manhole = IfcDistributionChamberElementTypeEnum.MANHOLE +meterchamber = IfcDistributionChamberElementTypeEnum.METERCHAMBER +sump = IfcDistributionChamberElementTypeEnum.SUMP +trench = IfcDistributionChamberElementTypeEnum.TRENCH +valvechamber = IfcDistributionChamberElementTypeEnum.VALVECHAMBER +userdefined = IfcDistributionChamberElementTypeEnum.USERDEFINED +notdefined = IfcDistributionChamberElementTypeEnum.NOTDEFINED IfcDistributionPortTypeEnum = enum_namespace() -cable = express_getattr(IfcDistributionPortTypeEnum, 'CABLE', INDETERMINATE) -cablecarrier = express_getattr(IfcDistributionPortTypeEnum, 'CABLECARRIER', INDETERMINATE) -duct = express_getattr(IfcDistributionPortTypeEnum, 'DUCT', INDETERMINATE) -pipe = express_getattr(IfcDistributionPortTypeEnum, 'PIPE', INDETERMINATE) -wireless = express_getattr(IfcDistributionPortTypeEnum, 'WIRELESS', INDETERMINATE) -userdefined = express_getattr(IfcDistributionPortTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDistributionPortTypeEnum, 'NOTDEFINED', INDETERMINATE) +cable = IfcDistributionPortTypeEnum.CABLE +cablecarrier = IfcDistributionPortTypeEnum.CABLECARRIER +duct = IfcDistributionPortTypeEnum.DUCT +pipe = IfcDistributionPortTypeEnum.PIPE +wireless = IfcDistributionPortTypeEnum.WIRELESS +userdefined = IfcDistributionPortTypeEnum.USERDEFINED +notdefined = IfcDistributionPortTypeEnum.NOTDEFINED IfcDistributionSystemEnum = enum_namespace() -airconditioning = express_getattr(IfcDistributionSystemEnum, 'AIRCONDITIONING', INDETERMINATE) -audiovisual = express_getattr(IfcDistributionSystemEnum, 'AUDIOVISUAL', INDETERMINATE) -chemical = express_getattr(IfcDistributionSystemEnum, 'CHEMICAL', INDETERMINATE) -chilledwater = express_getattr(IfcDistributionSystemEnum, 'CHILLEDWATER', INDETERMINATE) -communication = express_getattr(IfcDistributionSystemEnum, 'COMMUNICATION', INDETERMINATE) -compressedair = express_getattr(IfcDistributionSystemEnum, 'COMPRESSEDAIR', INDETERMINATE) -condenserwater = express_getattr(IfcDistributionSystemEnum, 'CONDENSERWATER', INDETERMINATE) -control = express_getattr(IfcDistributionSystemEnum, 'CONTROL', INDETERMINATE) -conveying = express_getattr(IfcDistributionSystemEnum, 'CONVEYING', INDETERMINATE) -data = express_getattr(IfcDistributionSystemEnum, 'DATA', INDETERMINATE) -disposal = express_getattr(IfcDistributionSystemEnum, 'DISPOSAL', INDETERMINATE) -domesticcoldwater = express_getattr(IfcDistributionSystemEnum, 'DOMESTICCOLDWATER', INDETERMINATE) -domestichotwater = express_getattr(IfcDistributionSystemEnum, 'DOMESTICHOTWATER', INDETERMINATE) -drainage = express_getattr(IfcDistributionSystemEnum, 'DRAINAGE', INDETERMINATE) -earthing = express_getattr(IfcDistributionSystemEnum, 'EARTHING', INDETERMINATE) -electrical = express_getattr(IfcDistributionSystemEnum, 'ELECTRICAL', INDETERMINATE) -electroacoustic = express_getattr(IfcDistributionSystemEnum, 'ELECTROACOUSTIC', INDETERMINATE) -exhaust = express_getattr(IfcDistributionSystemEnum, 'EXHAUST', INDETERMINATE) -fireprotection = express_getattr(IfcDistributionSystemEnum, 'FIREPROTECTION', INDETERMINATE) -fuel = express_getattr(IfcDistributionSystemEnum, 'FUEL', INDETERMINATE) -gas = express_getattr(IfcDistributionSystemEnum, 'GAS', INDETERMINATE) -hazardous = express_getattr(IfcDistributionSystemEnum, 'HAZARDOUS', INDETERMINATE) -heating = express_getattr(IfcDistributionSystemEnum, 'HEATING', INDETERMINATE) -lighting = express_getattr(IfcDistributionSystemEnum, 'LIGHTING', INDETERMINATE) -lightningprotection = express_getattr(IfcDistributionSystemEnum, 'LIGHTNINGPROTECTION', INDETERMINATE) -municipalsolidwaste = express_getattr(IfcDistributionSystemEnum, 'MUNICIPALSOLIDWASTE', INDETERMINATE) -oil = express_getattr(IfcDistributionSystemEnum, 'OIL', INDETERMINATE) -operational = express_getattr(IfcDistributionSystemEnum, 'OPERATIONAL', INDETERMINATE) -powergeneration = express_getattr(IfcDistributionSystemEnum, 'POWERGENERATION', INDETERMINATE) -rainwater = express_getattr(IfcDistributionSystemEnum, 'RAINWATER', INDETERMINATE) -refrigeration = express_getattr(IfcDistributionSystemEnum, 'REFRIGERATION', INDETERMINATE) -security = express_getattr(IfcDistributionSystemEnum, 'SECURITY', INDETERMINATE) -sewage = express_getattr(IfcDistributionSystemEnum, 'SEWAGE', INDETERMINATE) -signal = express_getattr(IfcDistributionSystemEnum, 'SIGNAL', INDETERMINATE) -stormwater = express_getattr(IfcDistributionSystemEnum, 'STORMWATER', INDETERMINATE) -telephone = express_getattr(IfcDistributionSystemEnum, 'TELEPHONE', INDETERMINATE) -tv = express_getattr(IfcDistributionSystemEnum, 'TV', INDETERMINATE) -vacuum = express_getattr(IfcDistributionSystemEnum, 'VACUUM', INDETERMINATE) -vent = express_getattr(IfcDistributionSystemEnum, 'VENT', INDETERMINATE) -ventilation = express_getattr(IfcDistributionSystemEnum, 'VENTILATION', INDETERMINATE) -wastewater = express_getattr(IfcDistributionSystemEnum, 'WASTEWATER', INDETERMINATE) -watersupply = express_getattr(IfcDistributionSystemEnum, 'WATERSUPPLY', INDETERMINATE) -catenary_system = express_getattr(IfcDistributionSystemEnum, 'CATENARY_SYSTEM', INDETERMINATE) -overhead_contactline_system = express_getattr(IfcDistributionSystemEnum, 'OVERHEAD_CONTACTLINE_SYSTEM', INDETERMINATE) -return_circuit = express_getattr(IfcDistributionSystemEnum, 'RETURN_CIRCUIT', INDETERMINATE) -userdefined = express_getattr(IfcDistributionSystemEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDistributionSystemEnum, 'NOTDEFINED', INDETERMINATE) +airconditioning = IfcDistributionSystemEnum.AIRCONDITIONING +audiovisual = IfcDistributionSystemEnum.AUDIOVISUAL +chemical = IfcDistributionSystemEnum.CHEMICAL +chilledwater = IfcDistributionSystemEnum.CHILLEDWATER +communication = IfcDistributionSystemEnum.COMMUNICATION +compressedair = IfcDistributionSystemEnum.COMPRESSEDAIR +condenserwater = IfcDistributionSystemEnum.CONDENSERWATER +control = IfcDistributionSystemEnum.CONTROL +conveying = IfcDistributionSystemEnum.CONVEYING +data = IfcDistributionSystemEnum.DATA +disposal = IfcDistributionSystemEnum.DISPOSAL +domesticcoldwater = IfcDistributionSystemEnum.DOMESTICCOLDWATER +domestichotwater = IfcDistributionSystemEnum.DOMESTICHOTWATER +drainage = IfcDistributionSystemEnum.DRAINAGE +earthing = IfcDistributionSystemEnum.EARTHING +electrical = IfcDistributionSystemEnum.ELECTRICAL +electroacoustic = IfcDistributionSystemEnum.ELECTROACOUSTIC +exhaust = IfcDistributionSystemEnum.EXHAUST +fireprotection = IfcDistributionSystemEnum.FIREPROTECTION +fuel = IfcDistributionSystemEnum.FUEL +gas = IfcDistributionSystemEnum.GAS +hazardous = IfcDistributionSystemEnum.HAZARDOUS +heating = IfcDistributionSystemEnum.HEATING +lighting = IfcDistributionSystemEnum.LIGHTING +lightningprotection = IfcDistributionSystemEnum.LIGHTNINGPROTECTION +municipalsolidwaste = IfcDistributionSystemEnum.MUNICIPALSOLIDWASTE +oil = IfcDistributionSystemEnum.OIL +operational = IfcDistributionSystemEnum.OPERATIONAL +powergeneration = IfcDistributionSystemEnum.POWERGENERATION +rainwater = IfcDistributionSystemEnum.RAINWATER +refrigeration = IfcDistributionSystemEnum.REFRIGERATION +security = IfcDistributionSystemEnum.SECURITY +sewage = IfcDistributionSystemEnum.SEWAGE +signal = IfcDistributionSystemEnum.SIGNAL +stormwater = IfcDistributionSystemEnum.STORMWATER +telephone = IfcDistributionSystemEnum.TELEPHONE +tv = IfcDistributionSystemEnum.TV +vacuum = IfcDistributionSystemEnum.VACUUM +vent = IfcDistributionSystemEnum.VENT +ventilation = IfcDistributionSystemEnum.VENTILATION +wastewater = IfcDistributionSystemEnum.WASTEWATER +watersupply = IfcDistributionSystemEnum.WATERSUPPLY +catenary_system = IfcDistributionSystemEnum.CATENARY_SYSTEM +overhead_contactline_system = IfcDistributionSystemEnum.OVERHEAD_CONTACTLINE_SYSTEM +return_circuit = IfcDistributionSystemEnum.RETURN_CIRCUIT +userdefined = IfcDistributionSystemEnum.USERDEFINED +notdefined = IfcDistributionSystemEnum.NOTDEFINED IfcDocumentConfidentialityEnum = enum_namespace() -public = express_getattr(IfcDocumentConfidentialityEnum, 'PUBLIC', INDETERMINATE) -restricted = express_getattr(IfcDocumentConfidentialityEnum, 'RESTRICTED', INDETERMINATE) -confidential = express_getattr(IfcDocumentConfidentialityEnum, 'CONFIDENTIAL', INDETERMINATE) -personal = express_getattr(IfcDocumentConfidentialityEnum, 'PERSONAL', INDETERMINATE) -userdefined = express_getattr(IfcDocumentConfidentialityEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDocumentConfidentialityEnum, 'NOTDEFINED', INDETERMINATE) +public = IfcDocumentConfidentialityEnum.PUBLIC +restricted = IfcDocumentConfidentialityEnum.RESTRICTED +confidential = IfcDocumentConfidentialityEnum.CONFIDENTIAL +personal = IfcDocumentConfidentialityEnum.PERSONAL +userdefined = IfcDocumentConfidentialityEnum.USERDEFINED +notdefined = IfcDocumentConfidentialityEnum.NOTDEFINED IfcDocumentStatusEnum = enum_namespace() -draft = express_getattr(IfcDocumentStatusEnum, 'DRAFT', INDETERMINATE) -finaldraft = express_getattr(IfcDocumentStatusEnum, 'FINALDRAFT', INDETERMINATE) -final = express_getattr(IfcDocumentStatusEnum, 'FINAL', INDETERMINATE) -revision = express_getattr(IfcDocumentStatusEnum, 'REVISION', INDETERMINATE) -notdefined = express_getattr(IfcDocumentStatusEnum, 'NOTDEFINED', INDETERMINATE) +draft = IfcDocumentStatusEnum.DRAFT +finaldraft = IfcDocumentStatusEnum.FINALDRAFT +final = IfcDocumentStatusEnum.FINAL +revision = IfcDocumentStatusEnum.REVISION +notdefined = IfcDocumentStatusEnum.NOTDEFINED IfcDoorPanelOperationEnum = enum_namespace() -swinging = express_getattr(IfcDoorPanelOperationEnum, 'SWINGING', INDETERMINATE) -double_acting = express_getattr(IfcDoorPanelOperationEnum, 'DOUBLE_ACTING', INDETERMINATE) -sliding = express_getattr(IfcDoorPanelOperationEnum, 'SLIDING', INDETERMINATE) -folding = express_getattr(IfcDoorPanelOperationEnum, 'FOLDING', INDETERMINATE) -revolving = express_getattr(IfcDoorPanelOperationEnum, 'REVOLVING', INDETERMINATE) -rollingup = express_getattr(IfcDoorPanelOperationEnum, 'ROLLINGUP', INDETERMINATE) -fixedpanel = express_getattr(IfcDoorPanelOperationEnum, 'FIXEDPANEL', INDETERMINATE) -userdefined = express_getattr(IfcDoorPanelOperationEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDoorPanelOperationEnum, 'NOTDEFINED', INDETERMINATE) +swinging = IfcDoorPanelOperationEnum.SWINGING +double_acting = IfcDoorPanelOperationEnum.DOUBLE_ACTING +sliding = IfcDoorPanelOperationEnum.SLIDING +folding = IfcDoorPanelOperationEnum.FOLDING +revolving = IfcDoorPanelOperationEnum.REVOLVING +rollingup = IfcDoorPanelOperationEnum.ROLLINGUP +fixedpanel = IfcDoorPanelOperationEnum.FIXEDPANEL +userdefined = IfcDoorPanelOperationEnum.USERDEFINED +notdefined = IfcDoorPanelOperationEnum.NOTDEFINED IfcDoorPanelPositionEnum = enum_namespace() -left = express_getattr(IfcDoorPanelPositionEnum, 'LEFT', INDETERMINATE) -middle = express_getattr(IfcDoorPanelPositionEnum, 'MIDDLE', INDETERMINATE) -right = express_getattr(IfcDoorPanelPositionEnum, 'RIGHT', INDETERMINATE) -notdefined = express_getattr(IfcDoorPanelPositionEnum, 'NOTDEFINED', INDETERMINATE) +left = IfcDoorPanelPositionEnum.LEFT +middle = IfcDoorPanelPositionEnum.MIDDLE +right = IfcDoorPanelPositionEnum.RIGHT +notdefined = IfcDoorPanelPositionEnum.NOTDEFINED IfcDoorStyleConstructionEnum = enum_namespace() -aluminium = express_getattr(IfcDoorStyleConstructionEnum, 'ALUMINIUM', INDETERMINATE) -high_grade_steel = express_getattr(IfcDoorStyleConstructionEnum, 'HIGH_GRADE_STEEL', INDETERMINATE) -steel = express_getattr(IfcDoorStyleConstructionEnum, 'STEEL', INDETERMINATE) -wood = express_getattr(IfcDoorStyleConstructionEnum, 'WOOD', INDETERMINATE) -aluminium_wood = express_getattr(IfcDoorStyleConstructionEnum, 'ALUMINIUM_WOOD', INDETERMINATE) -aluminium_plastic = express_getattr(IfcDoorStyleConstructionEnum, 'ALUMINIUM_PLASTIC', INDETERMINATE) -plastic = express_getattr(IfcDoorStyleConstructionEnum, 'PLASTIC', INDETERMINATE) -userdefined = express_getattr(IfcDoorStyleConstructionEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDoorStyleConstructionEnum, 'NOTDEFINED', INDETERMINATE) +aluminium = IfcDoorStyleConstructionEnum.ALUMINIUM +high_grade_steel = IfcDoorStyleConstructionEnum.HIGH_GRADE_STEEL +steel = IfcDoorStyleConstructionEnum.STEEL +wood = IfcDoorStyleConstructionEnum.WOOD +aluminium_wood = IfcDoorStyleConstructionEnum.ALUMINIUM_WOOD +aluminium_plastic = IfcDoorStyleConstructionEnum.ALUMINIUM_PLASTIC +plastic = IfcDoorStyleConstructionEnum.PLASTIC +userdefined = IfcDoorStyleConstructionEnum.USERDEFINED +notdefined = IfcDoorStyleConstructionEnum.NOTDEFINED IfcDoorStyleOperationEnum = enum_namespace() -single_swing_left = express_getattr(IfcDoorStyleOperationEnum, 'SINGLE_SWING_LEFT', INDETERMINATE) -single_swing_right = express_getattr(IfcDoorStyleOperationEnum, 'SINGLE_SWING_RIGHT', INDETERMINATE) -double_door_single_swing = express_getattr(IfcDoorStyleOperationEnum, 'DOUBLE_DOOR_SINGLE_SWING', INDETERMINATE) -double_door_single_swing_opposite_left = express_getattr(IfcDoorStyleOperationEnum, 'DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_LEFT', INDETERMINATE) -double_door_single_swing_opposite_right = express_getattr(IfcDoorStyleOperationEnum, 'DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_RIGHT', INDETERMINATE) -double_swing_left = express_getattr(IfcDoorStyleOperationEnum, 'DOUBLE_SWING_LEFT', INDETERMINATE) -double_swing_right = express_getattr(IfcDoorStyleOperationEnum, 'DOUBLE_SWING_RIGHT', INDETERMINATE) -double_door_double_swing = express_getattr(IfcDoorStyleOperationEnum, 'DOUBLE_DOOR_DOUBLE_SWING', INDETERMINATE) -sliding_to_left = express_getattr(IfcDoorStyleOperationEnum, 'SLIDING_TO_LEFT', INDETERMINATE) -sliding_to_right = express_getattr(IfcDoorStyleOperationEnum, 'SLIDING_TO_RIGHT', INDETERMINATE) -double_door_sliding = express_getattr(IfcDoorStyleOperationEnum, 'DOUBLE_DOOR_SLIDING', INDETERMINATE) -folding_to_left = express_getattr(IfcDoorStyleOperationEnum, 'FOLDING_TO_LEFT', INDETERMINATE) -folding_to_right = express_getattr(IfcDoorStyleOperationEnum, 'FOLDING_TO_RIGHT', INDETERMINATE) -double_door_folding = express_getattr(IfcDoorStyleOperationEnum, 'DOUBLE_DOOR_FOLDING', INDETERMINATE) -revolving = express_getattr(IfcDoorStyleOperationEnum, 'REVOLVING', INDETERMINATE) -rollingup = express_getattr(IfcDoorStyleOperationEnum, 'ROLLINGUP', INDETERMINATE) -userdefined = express_getattr(IfcDoorStyleOperationEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDoorStyleOperationEnum, 'NOTDEFINED', INDETERMINATE) +single_swing_left = IfcDoorStyleOperationEnum.SINGLE_SWING_LEFT +single_swing_right = IfcDoorStyleOperationEnum.SINGLE_SWING_RIGHT +double_door_single_swing = IfcDoorStyleOperationEnum.DOUBLE_DOOR_SINGLE_SWING +double_door_single_swing_opposite_left = IfcDoorStyleOperationEnum.DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_LEFT +double_door_single_swing_opposite_right = IfcDoorStyleOperationEnum.DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_RIGHT +double_swing_left = IfcDoorStyleOperationEnum.DOUBLE_SWING_LEFT +double_swing_right = IfcDoorStyleOperationEnum.DOUBLE_SWING_RIGHT +double_door_double_swing = IfcDoorStyleOperationEnum.DOUBLE_DOOR_DOUBLE_SWING +sliding_to_left = IfcDoorStyleOperationEnum.SLIDING_TO_LEFT +sliding_to_right = IfcDoorStyleOperationEnum.SLIDING_TO_RIGHT +double_door_sliding = IfcDoorStyleOperationEnum.DOUBLE_DOOR_SLIDING +folding_to_left = IfcDoorStyleOperationEnum.FOLDING_TO_LEFT +folding_to_right = IfcDoorStyleOperationEnum.FOLDING_TO_RIGHT +double_door_folding = IfcDoorStyleOperationEnum.DOUBLE_DOOR_FOLDING +revolving = IfcDoorStyleOperationEnum.REVOLVING +rollingup = IfcDoorStyleOperationEnum.ROLLINGUP +userdefined = IfcDoorStyleOperationEnum.USERDEFINED +notdefined = IfcDoorStyleOperationEnum.NOTDEFINED IfcDoorTypeEnum = enum_namespace() -door = express_getattr(IfcDoorTypeEnum, 'DOOR', INDETERMINATE) -gate = express_getattr(IfcDoorTypeEnum, 'GATE', INDETERMINATE) -trapdoor = express_getattr(IfcDoorTypeEnum, 'TRAPDOOR', INDETERMINATE) -boom_barrier = express_getattr(IfcDoorTypeEnum, 'BOOM_BARRIER', INDETERMINATE) -turnstile = express_getattr(IfcDoorTypeEnum, 'TURNSTILE', INDETERMINATE) -userdefined = express_getattr(IfcDoorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDoorTypeEnum, 'NOTDEFINED', INDETERMINATE) +door = IfcDoorTypeEnum.DOOR +gate = IfcDoorTypeEnum.GATE +trapdoor = IfcDoorTypeEnum.TRAPDOOR +boom_barrier = IfcDoorTypeEnum.BOOM_BARRIER +turnstile = IfcDoorTypeEnum.TURNSTILE +userdefined = IfcDoorTypeEnum.USERDEFINED +notdefined = IfcDoorTypeEnum.NOTDEFINED IfcDoorTypeOperationEnum = enum_namespace() -single_swing_left = express_getattr(IfcDoorTypeOperationEnum, 'SINGLE_SWING_LEFT', INDETERMINATE) -single_swing_right = express_getattr(IfcDoorTypeOperationEnum, 'SINGLE_SWING_RIGHT', INDETERMINATE) -double_door_single_swing = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_DOOR_SINGLE_SWING', INDETERMINATE) -double_door_single_swing_opposite_left = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_LEFT', INDETERMINATE) -double_door_single_swing_opposite_right = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_RIGHT', INDETERMINATE) -double_swing_left = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_SWING_LEFT', INDETERMINATE) -double_swing_right = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_SWING_RIGHT', INDETERMINATE) -double_door_double_swing = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_DOOR_DOUBLE_SWING', INDETERMINATE) -sliding_to_left = express_getattr(IfcDoorTypeOperationEnum, 'SLIDING_TO_LEFT', INDETERMINATE) -sliding_to_right = express_getattr(IfcDoorTypeOperationEnum, 'SLIDING_TO_RIGHT', INDETERMINATE) -double_door_sliding = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_DOOR_SLIDING', INDETERMINATE) -folding_to_left = express_getattr(IfcDoorTypeOperationEnum, 'FOLDING_TO_LEFT', INDETERMINATE) -folding_to_right = express_getattr(IfcDoorTypeOperationEnum, 'FOLDING_TO_RIGHT', INDETERMINATE) -double_door_folding = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_DOOR_FOLDING', INDETERMINATE) -revolving = express_getattr(IfcDoorTypeOperationEnum, 'REVOLVING', INDETERMINATE) -rollingup = express_getattr(IfcDoorTypeOperationEnum, 'ROLLINGUP', INDETERMINATE) -swing_fixed_left = express_getattr(IfcDoorTypeOperationEnum, 'SWING_FIXED_LEFT', INDETERMINATE) -swing_fixed_right = express_getattr(IfcDoorTypeOperationEnum, 'SWING_FIXED_RIGHT', INDETERMINATE) -userdefined = express_getattr(IfcDoorTypeOperationEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDoorTypeOperationEnum, 'NOTDEFINED', INDETERMINATE) +single_swing_left = IfcDoorTypeOperationEnum.SINGLE_SWING_LEFT +single_swing_right = IfcDoorTypeOperationEnum.SINGLE_SWING_RIGHT +double_door_single_swing = IfcDoorTypeOperationEnum.DOUBLE_DOOR_SINGLE_SWING +double_door_single_swing_opposite_left = IfcDoorTypeOperationEnum.DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_LEFT +double_door_single_swing_opposite_right = IfcDoorTypeOperationEnum.DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_RIGHT +double_swing_left = IfcDoorTypeOperationEnum.DOUBLE_SWING_LEFT +double_swing_right = IfcDoorTypeOperationEnum.DOUBLE_SWING_RIGHT +double_door_double_swing = IfcDoorTypeOperationEnum.DOUBLE_DOOR_DOUBLE_SWING +sliding_to_left = IfcDoorTypeOperationEnum.SLIDING_TO_LEFT +sliding_to_right = IfcDoorTypeOperationEnum.SLIDING_TO_RIGHT +double_door_sliding = IfcDoorTypeOperationEnum.DOUBLE_DOOR_SLIDING +folding_to_left = IfcDoorTypeOperationEnum.FOLDING_TO_LEFT +folding_to_right = IfcDoorTypeOperationEnum.FOLDING_TO_RIGHT +double_door_folding = IfcDoorTypeOperationEnum.DOUBLE_DOOR_FOLDING +revolving = IfcDoorTypeOperationEnum.REVOLVING +rollingup = IfcDoorTypeOperationEnum.ROLLINGUP +swing_fixed_left = IfcDoorTypeOperationEnum.SWING_FIXED_LEFT +swing_fixed_right = IfcDoorTypeOperationEnum.SWING_FIXED_RIGHT +userdefined = IfcDoorTypeOperationEnum.USERDEFINED +notdefined = IfcDoorTypeOperationEnum.NOTDEFINED IfcDuctFittingTypeEnum = enum_namespace() -bend = express_getattr(IfcDuctFittingTypeEnum, 'BEND', INDETERMINATE) -connector = express_getattr(IfcDuctFittingTypeEnum, 'CONNECTOR', INDETERMINATE) -entry = express_getattr(IfcDuctFittingTypeEnum, 'ENTRY', INDETERMINATE) -exit = express_getattr(IfcDuctFittingTypeEnum, 'EXIT', INDETERMINATE) -junction = express_getattr(IfcDuctFittingTypeEnum, 'JUNCTION', INDETERMINATE) -obstruction = express_getattr(IfcDuctFittingTypeEnum, 'OBSTRUCTION', INDETERMINATE) -transition = express_getattr(IfcDuctFittingTypeEnum, 'TRANSITION', INDETERMINATE) -userdefined = express_getattr(IfcDuctFittingTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDuctFittingTypeEnum, 'NOTDEFINED', INDETERMINATE) +bend = IfcDuctFittingTypeEnum.BEND +connector = IfcDuctFittingTypeEnum.CONNECTOR +entry = IfcDuctFittingTypeEnum.ENTRY +exit = IfcDuctFittingTypeEnum.EXIT +junction = IfcDuctFittingTypeEnum.JUNCTION +obstruction = IfcDuctFittingTypeEnum.OBSTRUCTION +transition = IfcDuctFittingTypeEnum.TRANSITION +userdefined = IfcDuctFittingTypeEnum.USERDEFINED +notdefined = IfcDuctFittingTypeEnum.NOTDEFINED IfcDuctSegmentTypeEnum = enum_namespace() -rigidsegment = express_getattr(IfcDuctSegmentTypeEnum, 'RIGIDSEGMENT', INDETERMINATE) -flexiblesegment = express_getattr(IfcDuctSegmentTypeEnum, 'FLEXIBLESEGMENT', INDETERMINATE) -userdefined = express_getattr(IfcDuctSegmentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDuctSegmentTypeEnum, 'NOTDEFINED', INDETERMINATE) +rigidsegment = IfcDuctSegmentTypeEnum.RIGIDSEGMENT +flexiblesegment = IfcDuctSegmentTypeEnum.FLEXIBLESEGMENT +userdefined = IfcDuctSegmentTypeEnum.USERDEFINED +notdefined = IfcDuctSegmentTypeEnum.NOTDEFINED IfcDuctSilencerTypeEnum = enum_namespace() -flatoval = express_getattr(IfcDuctSilencerTypeEnum, 'FLATOVAL', INDETERMINATE) -rectangular = express_getattr(IfcDuctSilencerTypeEnum, 'RECTANGULAR', INDETERMINATE) -round = express_getattr(IfcDuctSilencerTypeEnum, 'ROUND', INDETERMINATE) -userdefined = express_getattr(IfcDuctSilencerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDuctSilencerTypeEnum, 'NOTDEFINED', INDETERMINATE) +flatoval = IfcDuctSilencerTypeEnum.FLATOVAL +rectangular = IfcDuctSilencerTypeEnum.RECTANGULAR +round = IfcDuctSilencerTypeEnum.ROUND +userdefined = IfcDuctSilencerTypeEnum.USERDEFINED +notdefined = IfcDuctSilencerTypeEnum.NOTDEFINED IfcEarthworksCutTypeEnum = enum_namespace() -trench = express_getattr(IfcEarthworksCutTypeEnum, 'TRENCH', INDETERMINATE) -dredging = express_getattr(IfcEarthworksCutTypeEnum, 'DREDGING', INDETERMINATE) -excavation = express_getattr(IfcEarthworksCutTypeEnum, 'EXCAVATION', INDETERMINATE) -overexcavation = express_getattr(IfcEarthworksCutTypeEnum, 'OVEREXCAVATION', INDETERMINATE) -topsoilremoval = express_getattr(IfcEarthworksCutTypeEnum, 'TOPSOILREMOVAL', INDETERMINATE) -stepexcavation = express_getattr(IfcEarthworksCutTypeEnum, 'STEPEXCAVATION', INDETERMINATE) -pavementmilling = express_getattr(IfcEarthworksCutTypeEnum, 'PAVEMENTMILLING', INDETERMINATE) -cut = express_getattr(IfcEarthworksCutTypeEnum, 'CUT', INDETERMINATE) -base_excavation = express_getattr(IfcEarthworksCutTypeEnum, 'BASE_EXCAVATION', INDETERMINATE) -userdefined = express_getattr(IfcEarthworksCutTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcEarthworksCutTypeEnum, 'NOTDEFINED', INDETERMINATE) +trench = IfcEarthworksCutTypeEnum.TRENCH +dredging = IfcEarthworksCutTypeEnum.DREDGING +excavation = IfcEarthworksCutTypeEnum.EXCAVATION +overexcavation = IfcEarthworksCutTypeEnum.OVEREXCAVATION +topsoilremoval = IfcEarthworksCutTypeEnum.TOPSOILREMOVAL +stepexcavation = IfcEarthworksCutTypeEnum.STEPEXCAVATION +pavementmilling = IfcEarthworksCutTypeEnum.PAVEMENTMILLING +cut = IfcEarthworksCutTypeEnum.CUT +base_excavation = IfcEarthworksCutTypeEnum.BASE_EXCAVATION +userdefined = IfcEarthworksCutTypeEnum.USERDEFINED +notdefined = IfcEarthworksCutTypeEnum.NOTDEFINED IfcEarthworksFillTypeEnum = enum_namespace() -backfill = express_getattr(IfcEarthworksFillTypeEnum, 'BACKFILL', INDETERMINATE) -counterweight = express_getattr(IfcEarthworksFillTypeEnum, 'COUNTERWEIGHT', INDETERMINATE) -subgrade = express_getattr(IfcEarthworksFillTypeEnum, 'SUBGRADE', INDETERMINATE) -embankment = express_getattr(IfcEarthworksFillTypeEnum, 'EMBANKMENT', INDETERMINATE) -transitionsection = express_getattr(IfcEarthworksFillTypeEnum, 'TRANSITIONSECTION', INDETERMINATE) -subgradebed = express_getattr(IfcEarthworksFillTypeEnum, 'SUBGRADEBED', INDETERMINATE) -slopefill = express_getattr(IfcEarthworksFillTypeEnum, 'SLOPEFILL', INDETERMINATE) -userdefined = express_getattr(IfcEarthworksFillTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcEarthworksFillTypeEnum, 'NOTDEFINED', INDETERMINATE) +backfill = IfcEarthworksFillTypeEnum.BACKFILL +counterweight = IfcEarthworksFillTypeEnum.COUNTERWEIGHT +subgrade = IfcEarthworksFillTypeEnum.SUBGRADE +embankment = IfcEarthworksFillTypeEnum.EMBANKMENT +transitionsection = IfcEarthworksFillTypeEnum.TRANSITIONSECTION +subgradebed = IfcEarthworksFillTypeEnum.SUBGRADEBED +slopefill = IfcEarthworksFillTypeEnum.SLOPEFILL +userdefined = IfcEarthworksFillTypeEnum.USERDEFINED +notdefined = IfcEarthworksFillTypeEnum.NOTDEFINED IfcElectricApplianceTypeEnum = enum_namespace() -dishwasher = express_getattr(IfcElectricApplianceTypeEnum, 'DISHWASHER', INDETERMINATE) -electriccooker = express_getattr(IfcElectricApplianceTypeEnum, 'ELECTRICCOOKER', INDETERMINATE) -freestandingelectricheater = express_getattr(IfcElectricApplianceTypeEnum, 'FREESTANDINGELECTRICHEATER', INDETERMINATE) -freestandingfan = express_getattr(IfcElectricApplianceTypeEnum, 'FREESTANDINGFAN', INDETERMINATE) -freestandingwaterheater = express_getattr(IfcElectricApplianceTypeEnum, 'FREESTANDINGWATERHEATER', INDETERMINATE) -freestandingwatercooler = express_getattr(IfcElectricApplianceTypeEnum, 'FREESTANDINGWATERCOOLER', INDETERMINATE) -freezer = express_getattr(IfcElectricApplianceTypeEnum, 'FREEZER', INDETERMINATE) -fridge_freezer = express_getattr(IfcElectricApplianceTypeEnum, 'FRIDGE_FREEZER', INDETERMINATE) -handdryer = express_getattr(IfcElectricApplianceTypeEnum, 'HANDDRYER', INDETERMINATE) -kitchenmachine = express_getattr(IfcElectricApplianceTypeEnum, 'KITCHENMACHINE', INDETERMINATE) -microwave = express_getattr(IfcElectricApplianceTypeEnum, 'MICROWAVE', INDETERMINATE) -photocopier = express_getattr(IfcElectricApplianceTypeEnum, 'PHOTOCOPIER', INDETERMINATE) -refrigerator = express_getattr(IfcElectricApplianceTypeEnum, 'REFRIGERATOR', INDETERMINATE) -tumbledryer = express_getattr(IfcElectricApplianceTypeEnum, 'TUMBLEDRYER', INDETERMINATE) -vendingmachine = express_getattr(IfcElectricApplianceTypeEnum, 'VENDINGMACHINE', INDETERMINATE) -washingmachine = express_getattr(IfcElectricApplianceTypeEnum, 'WASHINGMACHINE', INDETERMINATE) -userdefined = express_getattr(IfcElectricApplianceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcElectricApplianceTypeEnum, 'NOTDEFINED', INDETERMINATE) +dishwasher = IfcElectricApplianceTypeEnum.DISHWASHER +electriccooker = IfcElectricApplianceTypeEnum.ELECTRICCOOKER +freestandingelectricheater = IfcElectricApplianceTypeEnum.FREESTANDINGELECTRICHEATER +freestandingfan = IfcElectricApplianceTypeEnum.FREESTANDINGFAN +freestandingwaterheater = IfcElectricApplianceTypeEnum.FREESTANDINGWATERHEATER +freestandingwatercooler = IfcElectricApplianceTypeEnum.FREESTANDINGWATERCOOLER +freezer = IfcElectricApplianceTypeEnum.FREEZER +fridge_freezer = IfcElectricApplianceTypeEnum.FRIDGE_FREEZER +handdryer = IfcElectricApplianceTypeEnum.HANDDRYER +kitchenmachine = IfcElectricApplianceTypeEnum.KITCHENMACHINE +microwave = IfcElectricApplianceTypeEnum.MICROWAVE +photocopier = IfcElectricApplianceTypeEnum.PHOTOCOPIER +refrigerator = IfcElectricApplianceTypeEnum.REFRIGERATOR +tumbledryer = IfcElectricApplianceTypeEnum.TUMBLEDRYER +vendingmachine = IfcElectricApplianceTypeEnum.VENDINGMACHINE +washingmachine = IfcElectricApplianceTypeEnum.WASHINGMACHINE +userdefined = IfcElectricApplianceTypeEnum.USERDEFINED +notdefined = IfcElectricApplianceTypeEnum.NOTDEFINED IfcElectricDistributionBoardTypeEnum = enum_namespace() -consumerunit = express_getattr(IfcElectricDistributionBoardTypeEnum, 'CONSUMERUNIT', INDETERMINATE) -distributionboard = express_getattr(IfcElectricDistributionBoardTypeEnum, 'DISTRIBUTIONBOARD', INDETERMINATE) -motorcontrolcentre = express_getattr(IfcElectricDistributionBoardTypeEnum, 'MOTORCONTROLCENTRE', INDETERMINATE) -switchboard = express_getattr(IfcElectricDistributionBoardTypeEnum, 'SWITCHBOARD', INDETERMINATE) -userdefined = express_getattr(IfcElectricDistributionBoardTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcElectricDistributionBoardTypeEnum, 'NOTDEFINED', INDETERMINATE) +consumerunit = IfcElectricDistributionBoardTypeEnum.CONSUMERUNIT +distributionboard = IfcElectricDistributionBoardTypeEnum.DISTRIBUTIONBOARD +motorcontrolcentre = IfcElectricDistributionBoardTypeEnum.MOTORCONTROLCENTRE +switchboard = IfcElectricDistributionBoardTypeEnum.SWITCHBOARD +userdefined = IfcElectricDistributionBoardTypeEnum.USERDEFINED +notdefined = IfcElectricDistributionBoardTypeEnum.NOTDEFINED IfcElectricFlowStorageDeviceTypeEnum = enum_namespace() -battery = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'BATTERY', INDETERMINATE) -capacitorbank = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'CAPACITORBANK', INDETERMINATE) -harmonicfilter = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'HARMONICFILTER', INDETERMINATE) -inductorbank = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'INDUCTORBANK', INDETERMINATE) -ups = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'UPS', INDETERMINATE) -capacitor = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'CAPACITOR', INDETERMINATE) -compensator = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'COMPENSATOR', INDETERMINATE) -inductor = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'INDUCTOR', INDETERMINATE) -recharger = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'RECHARGER', INDETERMINATE) -userdefined = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'NOTDEFINED', INDETERMINATE) +battery = IfcElectricFlowStorageDeviceTypeEnum.BATTERY +capacitorbank = IfcElectricFlowStorageDeviceTypeEnum.CAPACITORBANK +harmonicfilter = IfcElectricFlowStorageDeviceTypeEnum.HARMONICFILTER +inductorbank = IfcElectricFlowStorageDeviceTypeEnum.INDUCTORBANK +ups = IfcElectricFlowStorageDeviceTypeEnum.UPS +capacitor = IfcElectricFlowStorageDeviceTypeEnum.CAPACITOR +compensator = IfcElectricFlowStorageDeviceTypeEnum.COMPENSATOR +inductor = IfcElectricFlowStorageDeviceTypeEnum.INDUCTOR +recharger = IfcElectricFlowStorageDeviceTypeEnum.RECHARGER +userdefined = IfcElectricFlowStorageDeviceTypeEnum.USERDEFINED +notdefined = IfcElectricFlowStorageDeviceTypeEnum.NOTDEFINED IfcElectricFlowTreatmentDeviceTypeEnum = enum_namespace() -electronicfilter = express_getattr(IfcElectricFlowTreatmentDeviceTypeEnum, 'ELECTRONICFILTER', INDETERMINATE) -userdefined = express_getattr(IfcElectricFlowTreatmentDeviceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcElectricFlowTreatmentDeviceTypeEnum, 'NOTDEFINED', INDETERMINATE) +electronicfilter = IfcElectricFlowTreatmentDeviceTypeEnum.ELECTRONICFILTER +userdefined = IfcElectricFlowTreatmentDeviceTypeEnum.USERDEFINED +notdefined = IfcElectricFlowTreatmentDeviceTypeEnum.NOTDEFINED IfcElectricGeneratorTypeEnum = enum_namespace() -chp = express_getattr(IfcElectricGeneratorTypeEnum, 'CHP', INDETERMINATE) -enginegenerator = express_getattr(IfcElectricGeneratorTypeEnum, 'ENGINEGENERATOR', INDETERMINATE) -standalone = express_getattr(IfcElectricGeneratorTypeEnum, 'STANDALONE', INDETERMINATE) -userdefined = express_getattr(IfcElectricGeneratorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcElectricGeneratorTypeEnum, 'NOTDEFINED', INDETERMINATE) +chp = IfcElectricGeneratorTypeEnum.CHP +enginegenerator = IfcElectricGeneratorTypeEnum.ENGINEGENERATOR +standalone = IfcElectricGeneratorTypeEnum.STANDALONE +userdefined = IfcElectricGeneratorTypeEnum.USERDEFINED +notdefined = IfcElectricGeneratorTypeEnum.NOTDEFINED IfcElectricMotorTypeEnum = enum_namespace() -dc = express_getattr(IfcElectricMotorTypeEnum, 'DC', INDETERMINATE) -induction = express_getattr(IfcElectricMotorTypeEnum, 'INDUCTION', INDETERMINATE) -polyphase = express_getattr(IfcElectricMotorTypeEnum, 'POLYPHASE', INDETERMINATE) -reluctancesynchronous = express_getattr(IfcElectricMotorTypeEnum, 'RELUCTANCESYNCHRONOUS', INDETERMINATE) -synchronous = express_getattr(IfcElectricMotorTypeEnum, 'SYNCHRONOUS', INDETERMINATE) -userdefined = express_getattr(IfcElectricMotorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcElectricMotorTypeEnum, 'NOTDEFINED', INDETERMINATE) +dc = IfcElectricMotorTypeEnum.DC +induction = IfcElectricMotorTypeEnum.INDUCTION +polyphase = IfcElectricMotorTypeEnum.POLYPHASE +reluctancesynchronous = IfcElectricMotorTypeEnum.RELUCTANCESYNCHRONOUS +synchronous = IfcElectricMotorTypeEnum.SYNCHRONOUS +userdefined = IfcElectricMotorTypeEnum.USERDEFINED +notdefined = IfcElectricMotorTypeEnum.NOTDEFINED IfcElectricTimeControlTypeEnum = enum_namespace() -timeclock = express_getattr(IfcElectricTimeControlTypeEnum, 'TIMECLOCK', INDETERMINATE) -timedelay = express_getattr(IfcElectricTimeControlTypeEnum, 'TIMEDELAY', INDETERMINATE) -relay = express_getattr(IfcElectricTimeControlTypeEnum, 'RELAY', INDETERMINATE) -userdefined = express_getattr(IfcElectricTimeControlTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcElectricTimeControlTypeEnum, 'NOTDEFINED', INDETERMINATE) +timeclock = IfcElectricTimeControlTypeEnum.TIMECLOCK +timedelay = IfcElectricTimeControlTypeEnum.TIMEDELAY +relay = IfcElectricTimeControlTypeEnum.RELAY +userdefined = IfcElectricTimeControlTypeEnum.USERDEFINED +notdefined = IfcElectricTimeControlTypeEnum.NOTDEFINED IfcElementAssemblyTypeEnum = enum_namespace() -accessory_assembly = express_getattr(IfcElementAssemblyTypeEnum, 'ACCESSORY_ASSEMBLY', INDETERMINATE) -arch = express_getattr(IfcElementAssemblyTypeEnum, 'ARCH', INDETERMINATE) -beam_grid = express_getattr(IfcElementAssemblyTypeEnum, 'BEAM_GRID', INDETERMINATE) -braced_frame = express_getattr(IfcElementAssemblyTypeEnum, 'BRACED_FRAME', INDETERMINATE) -girder = express_getattr(IfcElementAssemblyTypeEnum, 'GIRDER', INDETERMINATE) -reinforcement_unit = express_getattr(IfcElementAssemblyTypeEnum, 'REINFORCEMENT_UNIT', INDETERMINATE) -rigid_frame = express_getattr(IfcElementAssemblyTypeEnum, 'RIGID_FRAME', INDETERMINATE) -slab_field = express_getattr(IfcElementAssemblyTypeEnum, 'SLAB_FIELD', INDETERMINATE) -truss = express_getattr(IfcElementAssemblyTypeEnum, 'TRUSS', INDETERMINATE) -abutment = express_getattr(IfcElementAssemblyTypeEnum, 'ABUTMENT', INDETERMINATE) -pier = express_getattr(IfcElementAssemblyTypeEnum, 'PIER', INDETERMINATE) -pylon = express_getattr(IfcElementAssemblyTypeEnum, 'PYLON', INDETERMINATE) -cross_bracing = express_getattr(IfcElementAssemblyTypeEnum, 'CROSS_BRACING', INDETERMINATE) -deck = express_getattr(IfcElementAssemblyTypeEnum, 'DECK', INDETERMINATE) -mast = express_getattr(IfcElementAssemblyTypeEnum, 'MAST', INDETERMINATE) -signalassembly = express_getattr(IfcElementAssemblyTypeEnum, 'SIGNALASSEMBLY', INDETERMINATE) -grid = express_getattr(IfcElementAssemblyTypeEnum, 'GRID', INDETERMINATE) -shelter = express_getattr(IfcElementAssemblyTypeEnum, 'SHELTER', INDETERMINATE) -supportingassembly = express_getattr(IfcElementAssemblyTypeEnum, 'SUPPORTINGASSEMBLY', INDETERMINATE) -suspensionassembly = express_getattr(IfcElementAssemblyTypeEnum, 'SUSPENSIONASSEMBLY', INDETERMINATE) -traction_switching_assembly = express_getattr(IfcElementAssemblyTypeEnum, 'TRACTION_SWITCHING_ASSEMBLY', INDETERMINATE) -trackpanel = express_getattr(IfcElementAssemblyTypeEnum, 'TRACKPANEL', INDETERMINATE) -turnoutpanel = express_getattr(IfcElementAssemblyTypeEnum, 'TURNOUTPANEL', INDETERMINATE) -dilatationpanel = express_getattr(IfcElementAssemblyTypeEnum, 'DILATATIONPANEL', INDETERMINATE) -rail_mechanical_equipment_assembly = express_getattr(IfcElementAssemblyTypeEnum, 'RAIL_MECHANICAL_EQUIPMENT_ASSEMBLY', INDETERMINATE) -entranceworks = express_getattr(IfcElementAssemblyTypeEnum, 'ENTRANCEWORKS', INDETERMINATE) -sumpbuster = express_getattr(IfcElementAssemblyTypeEnum, 'SUMPBUSTER', INDETERMINATE) -traffic_calming_device = express_getattr(IfcElementAssemblyTypeEnum, 'TRAFFIC_CALMING_DEVICE', INDETERMINATE) -userdefined = express_getattr(IfcElementAssemblyTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcElementAssemblyTypeEnum, 'NOTDEFINED', INDETERMINATE) +accessory_assembly = IfcElementAssemblyTypeEnum.ACCESSORY_ASSEMBLY +arch = IfcElementAssemblyTypeEnum.ARCH +beam_grid = IfcElementAssemblyTypeEnum.BEAM_GRID +braced_frame = IfcElementAssemblyTypeEnum.BRACED_FRAME +girder = IfcElementAssemblyTypeEnum.GIRDER +reinforcement_unit = IfcElementAssemblyTypeEnum.REINFORCEMENT_UNIT +rigid_frame = IfcElementAssemblyTypeEnum.RIGID_FRAME +slab_field = IfcElementAssemblyTypeEnum.SLAB_FIELD +truss = IfcElementAssemblyTypeEnum.TRUSS +abutment = IfcElementAssemblyTypeEnum.ABUTMENT +pier = IfcElementAssemblyTypeEnum.PIER +pylon = IfcElementAssemblyTypeEnum.PYLON +cross_bracing = IfcElementAssemblyTypeEnum.CROSS_BRACING +deck = IfcElementAssemblyTypeEnum.DECK +mast = IfcElementAssemblyTypeEnum.MAST +signalassembly = IfcElementAssemblyTypeEnum.SIGNALASSEMBLY +grid = IfcElementAssemblyTypeEnum.GRID +shelter = IfcElementAssemblyTypeEnum.SHELTER +supportingassembly = IfcElementAssemblyTypeEnum.SUPPORTINGASSEMBLY +suspensionassembly = IfcElementAssemblyTypeEnum.SUSPENSIONASSEMBLY +traction_switching_assembly = IfcElementAssemblyTypeEnum.TRACTION_SWITCHING_ASSEMBLY +trackpanel = IfcElementAssemblyTypeEnum.TRACKPANEL +turnoutpanel = IfcElementAssemblyTypeEnum.TURNOUTPANEL +dilatationpanel = IfcElementAssemblyTypeEnum.DILATATIONPANEL +rail_mechanical_equipment_assembly = IfcElementAssemblyTypeEnum.RAIL_MECHANICAL_EQUIPMENT_ASSEMBLY +entranceworks = IfcElementAssemblyTypeEnum.ENTRANCEWORKS +sumpbuster = IfcElementAssemblyTypeEnum.SUMPBUSTER +traffic_calming_device = IfcElementAssemblyTypeEnum.TRAFFIC_CALMING_DEVICE +userdefined = IfcElementAssemblyTypeEnum.USERDEFINED +notdefined = IfcElementAssemblyTypeEnum.NOTDEFINED IfcElementCompositionEnum = enum_namespace() -complex = express_getattr(IfcElementCompositionEnum, 'COMPLEX', INDETERMINATE) -element = express_getattr(IfcElementCompositionEnum, 'ELEMENT', INDETERMINATE) -partial = express_getattr(IfcElementCompositionEnum, 'PARTIAL', INDETERMINATE) +complex = IfcElementCompositionEnum.COMPLEX +element = IfcElementCompositionEnum.ELEMENT +partial = IfcElementCompositionEnum.PARTIAL IfcEngineTypeEnum = enum_namespace() -externalcombustion = express_getattr(IfcEngineTypeEnum, 'EXTERNALCOMBUSTION', INDETERMINATE) -internalcombustion = express_getattr(IfcEngineTypeEnum, 'INTERNALCOMBUSTION', INDETERMINATE) -userdefined = express_getattr(IfcEngineTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcEngineTypeEnum, 'NOTDEFINED', INDETERMINATE) +externalcombustion = IfcEngineTypeEnum.EXTERNALCOMBUSTION +internalcombustion = IfcEngineTypeEnum.INTERNALCOMBUSTION +userdefined = IfcEngineTypeEnum.USERDEFINED +notdefined = IfcEngineTypeEnum.NOTDEFINED IfcEvaporativeCoolerTypeEnum = enum_namespace() -directevaporativerandommediaaircooler = express_getattr(IfcEvaporativeCoolerTypeEnum, 'DIRECTEVAPORATIVERANDOMMEDIAAIRCOOLER', INDETERMINATE) -directevaporativerigidmediaaircooler = express_getattr(IfcEvaporativeCoolerTypeEnum, 'DIRECTEVAPORATIVERIGIDMEDIAAIRCOOLER', INDETERMINATE) -directevaporativeslingerspackagedaircooler = express_getattr(IfcEvaporativeCoolerTypeEnum, 'DIRECTEVAPORATIVESLINGERSPACKAGEDAIRCOOLER', INDETERMINATE) -directevaporativepackagedrotaryaircooler = express_getattr(IfcEvaporativeCoolerTypeEnum, 'DIRECTEVAPORATIVEPACKAGEDROTARYAIRCOOLER', INDETERMINATE) -directevaporativeairwasher = express_getattr(IfcEvaporativeCoolerTypeEnum, 'DIRECTEVAPORATIVEAIRWASHER', INDETERMINATE) -indirectevaporativepackageaircooler = express_getattr(IfcEvaporativeCoolerTypeEnum, 'INDIRECTEVAPORATIVEPACKAGEAIRCOOLER', INDETERMINATE) -indirectevaporativewetcoil = express_getattr(IfcEvaporativeCoolerTypeEnum, 'INDIRECTEVAPORATIVEWETCOIL', INDETERMINATE) -indirectevaporativecoolingtowerorcoilcooler = express_getattr(IfcEvaporativeCoolerTypeEnum, 'INDIRECTEVAPORATIVECOOLINGTOWERORCOILCOOLER', INDETERMINATE) -indirectdirectcombination = express_getattr(IfcEvaporativeCoolerTypeEnum, 'INDIRECTDIRECTCOMBINATION', INDETERMINATE) -userdefined = express_getattr(IfcEvaporativeCoolerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcEvaporativeCoolerTypeEnum, 'NOTDEFINED', INDETERMINATE) +directevaporativerandommediaaircooler = IfcEvaporativeCoolerTypeEnum.DIRECTEVAPORATIVERANDOMMEDIAAIRCOOLER +directevaporativerigidmediaaircooler = IfcEvaporativeCoolerTypeEnum.DIRECTEVAPORATIVERIGIDMEDIAAIRCOOLER +directevaporativeslingerspackagedaircooler = IfcEvaporativeCoolerTypeEnum.DIRECTEVAPORATIVESLINGERSPACKAGEDAIRCOOLER +directevaporativepackagedrotaryaircooler = IfcEvaporativeCoolerTypeEnum.DIRECTEVAPORATIVEPACKAGEDROTARYAIRCOOLER +directevaporativeairwasher = IfcEvaporativeCoolerTypeEnum.DIRECTEVAPORATIVEAIRWASHER +indirectevaporativepackageaircooler = IfcEvaporativeCoolerTypeEnum.INDIRECTEVAPORATIVEPACKAGEAIRCOOLER +indirectevaporativewetcoil = IfcEvaporativeCoolerTypeEnum.INDIRECTEVAPORATIVEWETCOIL +indirectevaporativecoolingtowerorcoilcooler = IfcEvaporativeCoolerTypeEnum.INDIRECTEVAPORATIVECOOLINGTOWERORCOILCOOLER +indirectdirectcombination = IfcEvaporativeCoolerTypeEnum.INDIRECTDIRECTCOMBINATION +userdefined = IfcEvaporativeCoolerTypeEnum.USERDEFINED +notdefined = IfcEvaporativeCoolerTypeEnum.NOTDEFINED IfcEvaporatorTypeEnum = enum_namespace() -directexpansion = express_getattr(IfcEvaporatorTypeEnum, 'DIRECTEXPANSION', INDETERMINATE) -directexpansionshellandtube = express_getattr(IfcEvaporatorTypeEnum, 'DIRECTEXPANSIONSHELLANDTUBE', INDETERMINATE) -directexpansiontubeintube = express_getattr(IfcEvaporatorTypeEnum, 'DIRECTEXPANSIONTUBEINTUBE', INDETERMINATE) -directexpansionbrazedplate = express_getattr(IfcEvaporatorTypeEnum, 'DIRECTEXPANSIONBRAZEDPLATE', INDETERMINATE) -floodedshellandtube = express_getattr(IfcEvaporatorTypeEnum, 'FLOODEDSHELLANDTUBE', INDETERMINATE) -shellandcoil = express_getattr(IfcEvaporatorTypeEnum, 'SHELLANDCOIL', INDETERMINATE) -userdefined = express_getattr(IfcEvaporatorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcEvaporatorTypeEnum, 'NOTDEFINED', INDETERMINATE) +directexpansion = IfcEvaporatorTypeEnum.DIRECTEXPANSION +directexpansionshellandtube = IfcEvaporatorTypeEnum.DIRECTEXPANSIONSHELLANDTUBE +directexpansiontubeintube = IfcEvaporatorTypeEnum.DIRECTEXPANSIONTUBEINTUBE +directexpansionbrazedplate = IfcEvaporatorTypeEnum.DIRECTEXPANSIONBRAZEDPLATE +floodedshellandtube = IfcEvaporatorTypeEnum.FLOODEDSHELLANDTUBE +shellandcoil = IfcEvaporatorTypeEnum.SHELLANDCOIL +userdefined = IfcEvaporatorTypeEnum.USERDEFINED +notdefined = IfcEvaporatorTypeEnum.NOTDEFINED IfcEventTriggerTypeEnum = enum_namespace() -eventrule = express_getattr(IfcEventTriggerTypeEnum, 'EVENTRULE', INDETERMINATE) -eventmessage = express_getattr(IfcEventTriggerTypeEnum, 'EVENTMESSAGE', INDETERMINATE) -eventtime = express_getattr(IfcEventTriggerTypeEnum, 'EVENTTIME', INDETERMINATE) -eventcomplex = express_getattr(IfcEventTriggerTypeEnum, 'EVENTCOMPLEX', INDETERMINATE) -userdefined = express_getattr(IfcEventTriggerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcEventTriggerTypeEnum, 'NOTDEFINED', INDETERMINATE) +eventrule = IfcEventTriggerTypeEnum.EVENTRULE +eventmessage = IfcEventTriggerTypeEnum.EVENTMESSAGE +eventtime = IfcEventTriggerTypeEnum.EVENTTIME +eventcomplex = IfcEventTriggerTypeEnum.EVENTCOMPLEX +userdefined = IfcEventTriggerTypeEnum.USERDEFINED +notdefined = IfcEventTriggerTypeEnum.NOTDEFINED IfcEventTypeEnum = enum_namespace() -startevent = express_getattr(IfcEventTypeEnum, 'STARTEVENT', INDETERMINATE) -endevent = express_getattr(IfcEventTypeEnum, 'ENDEVENT', INDETERMINATE) -intermediateevent = express_getattr(IfcEventTypeEnum, 'INTERMEDIATEEVENT', INDETERMINATE) -userdefined = express_getattr(IfcEventTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcEventTypeEnum, 'NOTDEFINED', INDETERMINATE) +startevent = IfcEventTypeEnum.STARTEVENT +endevent = IfcEventTypeEnum.ENDEVENT +intermediateevent = IfcEventTypeEnum.INTERMEDIATEEVENT +userdefined = IfcEventTypeEnum.USERDEFINED +notdefined = IfcEventTypeEnum.NOTDEFINED IfcExternalSpatialElementTypeEnum = enum_namespace() -external = express_getattr(IfcExternalSpatialElementTypeEnum, 'EXTERNAL', INDETERMINATE) -external_earth = express_getattr(IfcExternalSpatialElementTypeEnum, 'EXTERNAL_EARTH', INDETERMINATE) -external_water = express_getattr(IfcExternalSpatialElementTypeEnum, 'EXTERNAL_WATER', INDETERMINATE) -external_fire = express_getattr(IfcExternalSpatialElementTypeEnum, 'EXTERNAL_FIRE', INDETERMINATE) -userdefined = express_getattr(IfcExternalSpatialElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcExternalSpatialElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +external = IfcExternalSpatialElementTypeEnum.EXTERNAL +external_earth = IfcExternalSpatialElementTypeEnum.EXTERNAL_EARTH +external_water = IfcExternalSpatialElementTypeEnum.EXTERNAL_WATER +external_fire = IfcExternalSpatialElementTypeEnum.EXTERNAL_FIRE +userdefined = IfcExternalSpatialElementTypeEnum.USERDEFINED +notdefined = IfcExternalSpatialElementTypeEnum.NOTDEFINED IfcFacilityPartCommonTypeEnum = enum_namespace() -segment = express_getattr(IfcFacilityPartCommonTypeEnum, 'SEGMENT', INDETERMINATE) -aboveground = express_getattr(IfcFacilityPartCommonTypeEnum, 'ABOVEGROUND', INDETERMINATE) -junction = express_getattr(IfcFacilityPartCommonTypeEnum, 'JUNCTION', INDETERMINATE) -levelcrossing = express_getattr(IfcFacilityPartCommonTypeEnum, 'LEVELCROSSING', INDETERMINATE) -belowground = express_getattr(IfcFacilityPartCommonTypeEnum, 'BELOWGROUND', INDETERMINATE) -substructure = express_getattr(IfcFacilityPartCommonTypeEnum, 'SUBSTRUCTURE', INDETERMINATE) -terminal = express_getattr(IfcFacilityPartCommonTypeEnum, 'TERMINAL', INDETERMINATE) -superstructure = express_getattr(IfcFacilityPartCommonTypeEnum, 'SUPERSTRUCTURE', INDETERMINATE) -userdefined = express_getattr(IfcFacilityPartCommonTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFacilityPartCommonTypeEnum, 'NOTDEFINED', INDETERMINATE) +segment = IfcFacilityPartCommonTypeEnum.SEGMENT +aboveground = IfcFacilityPartCommonTypeEnum.ABOVEGROUND +junction = IfcFacilityPartCommonTypeEnum.JUNCTION +levelcrossing = IfcFacilityPartCommonTypeEnum.LEVELCROSSING +belowground = IfcFacilityPartCommonTypeEnum.BELOWGROUND +substructure = IfcFacilityPartCommonTypeEnum.SUBSTRUCTURE +terminal = IfcFacilityPartCommonTypeEnum.TERMINAL +superstructure = IfcFacilityPartCommonTypeEnum.SUPERSTRUCTURE +userdefined = IfcFacilityPartCommonTypeEnum.USERDEFINED +notdefined = IfcFacilityPartCommonTypeEnum.NOTDEFINED IfcFacilityUsageEnum = enum_namespace() -lateral = express_getattr(IfcFacilityUsageEnum, 'LATERAL', INDETERMINATE) -region = express_getattr(IfcFacilityUsageEnum, 'REGION', INDETERMINATE) -vertical = express_getattr(IfcFacilityUsageEnum, 'VERTICAL', INDETERMINATE) -longitudinal = express_getattr(IfcFacilityUsageEnum, 'LONGITUDINAL', INDETERMINATE) -userdefined = express_getattr(IfcFacilityUsageEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFacilityUsageEnum, 'NOTDEFINED', INDETERMINATE) +lateral = IfcFacilityUsageEnum.LATERAL +region = IfcFacilityUsageEnum.REGION +vertical = IfcFacilityUsageEnum.VERTICAL +longitudinal = IfcFacilityUsageEnum.LONGITUDINAL +userdefined = IfcFacilityUsageEnum.USERDEFINED +notdefined = IfcFacilityUsageEnum.NOTDEFINED IfcFanTypeEnum = enum_namespace() -centrifugalforwardcurved = express_getattr(IfcFanTypeEnum, 'CENTRIFUGALFORWARDCURVED', INDETERMINATE) -centrifugalradial = express_getattr(IfcFanTypeEnum, 'CENTRIFUGALRADIAL', INDETERMINATE) -centrifugalbackwardinclinedcurved = express_getattr(IfcFanTypeEnum, 'CENTRIFUGALBACKWARDINCLINEDCURVED', INDETERMINATE) -centrifugalairfoil = express_getattr(IfcFanTypeEnum, 'CENTRIFUGALAIRFOIL', INDETERMINATE) -tubeaxial = express_getattr(IfcFanTypeEnum, 'TUBEAXIAL', INDETERMINATE) -vaneaxial = express_getattr(IfcFanTypeEnum, 'VANEAXIAL', INDETERMINATE) -propelloraxial = express_getattr(IfcFanTypeEnum, 'PROPELLORAXIAL', INDETERMINATE) -userdefined = express_getattr(IfcFanTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFanTypeEnum, 'NOTDEFINED', INDETERMINATE) +centrifugalforwardcurved = IfcFanTypeEnum.CENTRIFUGALFORWARDCURVED +centrifugalradial = IfcFanTypeEnum.CENTRIFUGALRADIAL +centrifugalbackwardinclinedcurved = IfcFanTypeEnum.CENTRIFUGALBACKWARDINCLINEDCURVED +centrifugalairfoil = IfcFanTypeEnum.CENTRIFUGALAIRFOIL +tubeaxial = IfcFanTypeEnum.TUBEAXIAL +vaneaxial = IfcFanTypeEnum.VANEAXIAL +propelloraxial = IfcFanTypeEnum.PROPELLORAXIAL +userdefined = IfcFanTypeEnum.USERDEFINED +notdefined = IfcFanTypeEnum.NOTDEFINED IfcFastenerTypeEnum = enum_namespace() -glue = express_getattr(IfcFastenerTypeEnum, 'GLUE', INDETERMINATE) -mortar = express_getattr(IfcFastenerTypeEnum, 'MORTAR', INDETERMINATE) -weld = express_getattr(IfcFastenerTypeEnum, 'WELD', INDETERMINATE) -userdefined = express_getattr(IfcFastenerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFastenerTypeEnum, 'NOTDEFINED', INDETERMINATE) +glue = IfcFastenerTypeEnum.GLUE +mortar = IfcFastenerTypeEnum.MORTAR +weld = IfcFastenerTypeEnum.WELD +userdefined = IfcFastenerTypeEnum.USERDEFINED +notdefined = IfcFastenerTypeEnum.NOTDEFINED IfcFilterTypeEnum = enum_namespace() -airparticlefilter = express_getattr(IfcFilterTypeEnum, 'AIRPARTICLEFILTER', INDETERMINATE) -compressedairfilter = express_getattr(IfcFilterTypeEnum, 'COMPRESSEDAIRFILTER', INDETERMINATE) -odorfilter = express_getattr(IfcFilterTypeEnum, 'ODORFILTER', INDETERMINATE) -oilfilter = express_getattr(IfcFilterTypeEnum, 'OILFILTER', INDETERMINATE) -strainer = express_getattr(IfcFilterTypeEnum, 'STRAINER', INDETERMINATE) -waterfilter = express_getattr(IfcFilterTypeEnum, 'WATERFILTER', INDETERMINATE) -userdefined = express_getattr(IfcFilterTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFilterTypeEnum, 'NOTDEFINED', INDETERMINATE) +airparticlefilter = IfcFilterTypeEnum.AIRPARTICLEFILTER +compressedairfilter = IfcFilterTypeEnum.COMPRESSEDAIRFILTER +odorfilter = IfcFilterTypeEnum.ODORFILTER +oilfilter = IfcFilterTypeEnum.OILFILTER +strainer = IfcFilterTypeEnum.STRAINER +waterfilter = IfcFilterTypeEnum.WATERFILTER +userdefined = IfcFilterTypeEnum.USERDEFINED +notdefined = IfcFilterTypeEnum.NOTDEFINED IfcFireSuppressionTerminalTypeEnum = enum_namespace() -breechinginlet = express_getattr(IfcFireSuppressionTerminalTypeEnum, 'BREECHINGINLET', INDETERMINATE) -firehydrant = express_getattr(IfcFireSuppressionTerminalTypeEnum, 'FIREHYDRANT', INDETERMINATE) -hosereel = express_getattr(IfcFireSuppressionTerminalTypeEnum, 'HOSEREEL', INDETERMINATE) -sprinkler = express_getattr(IfcFireSuppressionTerminalTypeEnum, 'SPRINKLER', INDETERMINATE) -sprinklerdeflector = express_getattr(IfcFireSuppressionTerminalTypeEnum, 'SPRINKLERDEFLECTOR', INDETERMINATE) -userdefined = express_getattr(IfcFireSuppressionTerminalTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFireSuppressionTerminalTypeEnum, 'NOTDEFINED', INDETERMINATE) +breechinginlet = IfcFireSuppressionTerminalTypeEnum.BREECHINGINLET +firehydrant = IfcFireSuppressionTerminalTypeEnum.FIREHYDRANT +hosereel = IfcFireSuppressionTerminalTypeEnum.HOSEREEL +sprinkler = IfcFireSuppressionTerminalTypeEnum.SPRINKLER +sprinklerdeflector = IfcFireSuppressionTerminalTypeEnum.SPRINKLERDEFLECTOR +userdefined = IfcFireSuppressionTerminalTypeEnum.USERDEFINED +notdefined = IfcFireSuppressionTerminalTypeEnum.NOTDEFINED IfcFlowDirectionEnum = enum_namespace() -source = express_getattr(IfcFlowDirectionEnum, 'SOURCE', INDETERMINATE) -sink = express_getattr(IfcFlowDirectionEnum, 'SINK', INDETERMINATE) -sourceandsink = express_getattr(IfcFlowDirectionEnum, 'SOURCEANDSINK', INDETERMINATE) -notdefined = express_getattr(IfcFlowDirectionEnum, 'NOTDEFINED', INDETERMINATE) +source = IfcFlowDirectionEnum.SOURCE +sink = IfcFlowDirectionEnum.SINK +sourceandsink = IfcFlowDirectionEnum.SOURCEANDSINK +notdefined = IfcFlowDirectionEnum.NOTDEFINED IfcFlowInstrumentTypeEnum = enum_namespace() -pressuregauge = express_getattr(IfcFlowInstrumentTypeEnum, 'PRESSUREGAUGE', INDETERMINATE) -thermometer = express_getattr(IfcFlowInstrumentTypeEnum, 'THERMOMETER', INDETERMINATE) -ammeter = express_getattr(IfcFlowInstrumentTypeEnum, 'AMMETER', INDETERMINATE) -frequencymeter = express_getattr(IfcFlowInstrumentTypeEnum, 'FREQUENCYMETER', INDETERMINATE) -powerfactormeter = express_getattr(IfcFlowInstrumentTypeEnum, 'POWERFACTORMETER', INDETERMINATE) -phaseanglemeter = express_getattr(IfcFlowInstrumentTypeEnum, 'PHASEANGLEMETER', INDETERMINATE) -voltmeter_peak = express_getattr(IfcFlowInstrumentTypeEnum, 'VOLTMETER_PEAK', INDETERMINATE) -voltmeter_rms = express_getattr(IfcFlowInstrumentTypeEnum, 'VOLTMETER_RMS', INDETERMINATE) -combined = express_getattr(IfcFlowInstrumentTypeEnum, 'COMBINED', INDETERMINATE) -voltmeter = express_getattr(IfcFlowInstrumentTypeEnum, 'VOLTMETER', INDETERMINATE) -userdefined = express_getattr(IfcFlowInstrumentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFlowInstrumentTypeEnum, 'NOTDEFINED', INDETERMINATE) +pressuregauge = IfcFlowInstrumentTypeEnum.PRESSUREGAUGE +thermometer = IfcFlowInstrumentTypeEnum.THERMOMETER +ammeter = IfcFlowInstrumentTypeEnum.AMMETER +frequencymeter = IfcFlowInstrumentTypeEnum.FREQUENCYMETER +powerfactormeter = IfcFlowInstrumentTypeEnum.POWERFACTORMETER +phaseanglemeter = IfcFlowInstrumentTypeEnum.PHASEANGLEMETER +voltmeter_peak = IfcFlowInstrumentTypeEnum.VOLTMETER_PEAK +voltmeter_rms = IfcFlowInstrumentTypeEnum.VOLTMETER_RMS +combined = IfcFlowInstrumentTypeEnum.COMBINED +voltmeter = IfcFlowInstrumentTypeEnum.VOLTMETER +userdefined = IfcFlowInstrumentTypeEnum.USERDEFINED +notdefined = IfcFlowInstrumentTypeEnum.NOTDEFINED IfcFlowMeterTypeEnum = enum_namespace() -energymeter = express_getattr(IfcFlowMeterTypeEnum, 'ENERGYMETER', INDETERMINATE) -gasmeter = express_getattr(IfcFlowMeterTypeEnum, 'GASMETER', INDETERMINATE) -oilmeter = express_getattr(IfcFlowMeterTypeEnum, 'OILMETER', INDETERMINATE) -watermeter = express_getattr(IfcFlowMeterTypeEnum, 'WATERMETER', INDETERMINATE) -userdefined = express_getattr(IfcFlowMeterTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFlowMeterTypeEnum, 'NOTDEFINED', INDETERMINATE) +energymeter = IfcFlowMeterTypeEnum.ENERGYMETER +gasmeter = IfcFlowMeterTypeEnum.GASMETER +oilmeter = IfcFlowMeterTypeEnum.OILMETER +watermeter = IfcFlowMeterTypeEnum.WATERMETER +userdefined = IfcFlowMeterTypeEnum.USERDEFINED +notdefined = IfcFlowMeterTypeEnum.NOTDEFINED IfcFootingTypeEnum = enum_namespace() -caisson_foundation = express_getattr(IfcFootingTypeEnum, 'CAISSON_FOUNDATION', INDETERMINATE) -footing_beam = express_getattr(IfcFootingTypeEnum, 'FOOTING_BEAM', INDETERMINATE) -pad_footing = express_getattr(IfcFootingTypeEnum, 'PAD_FOOTING', INDETERMINATE) -pile_cap = express_getattr(IfcFootingTypeEnum, 'PILE_CAP', INDETERMINATE) -strip_footing = express_getattr(IfcFootingTypeEnum, 'STRIP_FOOTING', INDETERMINATE) -userdefined = express_getattr(IfcFootingTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFootingTypeEnum, 'NOTDEFINED', INDETERMINATE) +caisson_foundation = IfcFootingTypeEnum.CAISSON_FOUNDATION +footing_beam = IfcFootingTypeEnum.FOOTING_BEAM +pad_footing = IfcFootingTypeEnum.PAD_FOOTING +pile_cap = IfcFootingTypeEnum.PILE_CAP +strip_footing = IfcFootingTypeEnum.STRIP_FOOTING +userdefined = IfcFootingTypeEnum.USERDEFINED +notdefined = IfcFootingTypeEnum.NOTDEFINED IfcFurnitureTypeEnum = enum_namespace() -chair = express_getattr(IfcFurnitureTypeEnum, 'CHAIR', INDETERMINATE) -table = express_getattr(IfcFurnitureTypeEnum, 'TABLE', INDETERMINATE) -desk = express_getattr(IfcFurnitureTypeEnum, 'DESK', INDETERMINATE) -bed = express_getattr(IfcFurnitureTypeEnum, 'BED', INDETERMINATE) -filecabinet = express_getattr(IfcFurnitureTypeEnum, 'FILECABINET', INDETERMINATE) -shelf = express_getattr(IfcFurnitureTypeEnum, 'SHELF', INDETERMINATE) -sofa = express_getattr(IfcFurnitureTypeEnum, 'SOFA', INDETERMINATE) -technicalcabinet = express_getattr(IfcFurnitureTypeEnum, 'TECHNICALCABINET', INDETERMINATE) -userdefined = express_getattr(IfcFurnitureTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFurnitureTypeEnum, 'NOTDEFINED', INDETERMINATE) +chair = IfcFurnitureTypeEnum.CHAIR +table = IfcFurnitureTypeEnum.TABLE +desk = IfcFurnitureTypeEnum.DESK +bed = IfcFurnitureTypeEnum.BED +filecabinet = IfcFurnitureTypeEnum.FILECABINET +shelf = IfcFurnitureTypeEnum.SHELF +sofa = IfcFurnitureTypeEnum.SOFA +technicalcabinet = IfcFurnitureTypeEnum.TECHNICALCABINET +userdefined = IfcFurnitureTypeEnum.USERDEFINED +notdefined = IfcFurnitureTypeEnum.NOTDEFINED IfcGeographicElementTypeEnum = enum_namespace() -terrain = express_getattr(IfcGeographicElementTypeEnum, 'TERRAIN', INDETERMINATE) -soil_boring_point = express_getattr(IfcGeographicElementTypeEnum, 'SOIL_BORING_POINT', INDETERMINATE) -userdefined = express_getattr(IfcGeographicElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcGeographicElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +terrain = IfcGeographicElementTypeEnum.TERRAIN +soil_boring_point = IfcGeographicElementTypeEnum.SOIL_BORING_POINT +userdefined = IfcGeographicElementTypeEnum.USERDEFINED +notdefined = IfcGeographicElementTypeEnum.NOTDEFINED IfcGeometricProjectionEnum = enum_namespace() -graph_view = express_getattr(IfcGeometricProjectionEnum, 'GRAPH_VIEW', INDETERMINATE) -sketch_view = express_getattr(IfcGeometricProjectionEnum, 'SKETCH_VIEW', INDETERMINATE) -model_view = express_getattr(IfcGeometricProjectionEnum, 'MODEL_VIEW', INDETERMINATE) -plan_view = express_getattr(IfcGeometricProjectionEnum, 'PLAN_VIEW', INDETERMINATE) -reflected_plan_view = express_getattr(IfcGeometricProjectionEnum, 'REFLECTED_PLAN_VIEW', INDETERMINATE) -section_view = express_getattr(IfcGeometricProjectionEnum, 'SECTION_VIEW', INDETERMINATE) -elevation_view = express_getattr(IfcGeometricProjectionEnum, 'ELEVATION_VIEW', INDETERMINATE) -userdefined = express_getattr(IfcGeometricProjectionEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcGeometricProjectionEnum, 'NOTDEFINED', INDETERMINATE) +graph_view = IfcGeometricProjectionEnum.GRAPH_VIEW +sketch_view = IfcGeometricProjectionEnum.SKETCH_VIEW +model_view = IfcGeometricProjectionEnum.MODEL_VIEW +plan_view = IfcGeometricProjectionEnum.PLAN_VIEW +reflected_plan_view = IfcGeometricProjectionEnum.REFLECTED_PLAN_VIEW +section_view = IfcGeometricProjectionEnum.SECTION_VIEW +elevation_view = IfcGeometricProjectionEnum.ELEVATION_VIEW +userdefined = IfcGeometricProjectionEnum.USERDEFINED +notdefined = IfcGeometricProjectionEnum.NOTDEFINED IfcGlobalOrLocalEnum = enum_namespace() -global_coords = express_getattr(IfcGlobalOrLocalEnum, 'GLOBAL_COORDS', INDETERMINATE) -local_coords = express_getattr(IfcGlobalOrLocalEnum, 'LOCAL_COORDS', INDETERMINATE) +global_coords = IfcGlobalOrLocalEnum.GLOBAL_COORDS +local_coords = IfcGlobalOrLocalEnum.LOCAL_COORDS IfcGridTypeEnum = enum_namespace() -rectangular = express_getattr(IfcGridTypeEnum, 'RECTANGULAR', INDETERMINATE) -radial = express_getattr(IfcGridTypeEnum, 'RADIAL', INDETERMINATE) -triangular = express_getattr(IfcGridTypeEnum, 'TRIANGULAR', INDETERMINATE) -irregular = express_getattr(IfcGridTypeEnum, 'IRREGULAR', INDETERMINATE) -userdefined = express_getattr(IfcGridTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcGridTypeEnum, 'NOTDEFINED', INDETERMINATE) +rectangular = IfcGridTypeEnum.RECTANGULAR +radial = IfcGridTypeEnum.RADIAL +triangular = IfcGridTypeEnum.TRIANGULAR +irregular = IfcGridTypeEnum.IRREGULAR +userdefined = IfcGridTypeEnum.USERDEFINED +notdefined = IfcGridTypeEnum.NOTDEFINED IfcHeatExchangerTypeEnum = enum_namespace() -plate = express_getattr(IfcHeatExchangerTypeEnum, 'PLATE', INDETERMINATE) -shellandtube = express_getattr(IfcHeatExchangerTypeEnum, 'SHELLANDTUBE', INDETERMINATE) -turnoutheating = express_getattr(IfcHeatExchangerTypeEnum, 'TURNOUTHEATING', INDETERMINATE) -userdefined = express_getattr(IfcHeatExchangerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcHeatExchangerTypeEnum, 'NOTDEFINED', INDETERMINATE) +plate = IfcHeatExchangerTypeEnum.PLATE +shellandtube = IfcHeatExchangerTypeEnum.SHELLANDTUBE +turnoutheating = IfcHeatExchangerTypeEnum.TURNOUTHEATING +userdefined = IfcHeatExchangerTypeEnum.USERDEFINED +notdefined = IfcHeatExchangerTypeEnum.NOTDEFINED IfcHumidifierTypeEnum = enum_namespace() -steaminjection = express_getattr(IfcHumidifierTypeEnum, 'STEAMINJECTION', INDETERMINATE) -adiabaticairwasher = express_getattr(IfcHumidifierTypeEnum, 'ADIABATICAIRWASHER', INDETERMINATE) -adiabaticpan = express_getattr(IfcHumidifierTypeEnum, 'ADIABATICPAN', INDETERMINATE) -adiabaticwettedelement = express_getattr(IfcHumidifierTypeEnum, 'ADIABATICWETTEDELEMENT', INDETERMINATE) -adiabaticatomizing = express_getattr(IfcHumidifierTypeEnum, 'ADIABATICATOMIZING', INDETERMINATE) -adiabaticultrasonic = express_getattr(IfcHumidifierTypeEnum, 'ADIABATICULTRASONIC', INDETERMINATE) -adiabaticrigidmedia = express_getattr(IfcHumidifierTypeEnum, 'ADIABATICRIGIDMEDIA', INDETERMINATE) -adiabaticcompressedairnozzle = express_getattr(IfcHumidifierTypeEnum, 'ADIABATICCOMPRESSEDAIRNOZZLE', INDETERMINATE) -assistedelectric = express_getattr(IfcHumidifierTypeEnum, 'ASSISTEDELECTRIC', INDETERMINATE) -assistednaturalgas = express_getattr(IfcHumidifierTypeEnum, 'ASSISTEDNATURALGAS', INDETERMINATE) -assistedpropane = express_getattr(IfcHumidifierTypeEnum, 'ASSISTEDPROPANE', INDETERMINATE) -assistedbutane = express_getattr(IfcHumidifierTypeEnum, 'ASSISTEDBUTANE', INDETERMINATE) -assistedsteam = express_getattr(IfcHumidifierTypeEnum, 'ASSISTEDSTEAM', INDETERMINATE) -userdefined = express_getattr(IfcHumidifierTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcHumidifierTypeEnum, 'NOTDEFINED', INDETERMINATE) +steaminjection = IfcHumidifierTypeEnum.STEAMINJECTION +adiabaticairwasher = IfcHumidifierTypeEnum.ADIABATICAIRWASHER +adiabaticpan = IfcHumidifierTypeEnum.ADIABATICPAN +adiabaticwettedelement = IfcHumidifierTypeEnum.ADIABATICWETTEDELEMENT +adiabaticatomizing = IfcHumidifierTypeEnum.ADIABATICATOMIZING +adiabaticultrasonic = IfcHumidifierTypeEnum.ADIABATICULTRASONIC +adiabaticrigidmedia = IfcHumidifierTypeEnum.ADIABATICRIGIDMEDIA +adiabaticcompressedairnozzle = IfcHumidifierTypeEnum.ADIABATICCOMPRESSEDAIRNOZZLE +assistedelectric = IfcHumidifierTypeEnum.ASSISTEDELECTRIC +assistednaturalgas = IfcHumidifierTypeEnum.ASSISTEDNATURALGAS +assistedpropane = IfcHumidifierTypeEnum.ASSISTEDPROPANE +assistedbutane = IfcHumidifierTypeEnum.ASSISTEDBUTANE +assistedsteam = IfcHumidifierTypeEnum.ASSISTEDSTEAM +userdefined = IfcHumidifierTypeEnum.USERDEFINED +notdefined = IfcHumidifierTypeEnum.NOTDEFINED IfcImpactProtectionDeviceTypeEnum = enum_namespace() -crashcushion = express_getattr(IfcImpactProtectionDeviceTypeEnum, 'CRASHCUSHION', INDETERMINATE) -dampingsystem = express_getattr(IfcImpactProtectionDeviceTypeEnum, 'DAMPINGSYSTEM', INDETERMINATE) -fender = express_getattr(IfcImpactProtectionDeviceTypeEnum, 'FENDER', INDETERMINATE) -bumper = express_getattr(IfcImpactProtectionDeviceTypeEnum, 'BUMPER', INDETERMINATE) -userdefined = express_getattr(IfcImpactProtectionDeviceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcImpactProtectionDeviceTypeEnum, 'NOTDEFINED', INDETERMINATE) +crashcushion = IfcImpactProtectionDeviceTypeEnum.CRASHCUSHION +dampingsystem = IfcImpactProtectionDeviceTypeEnum.DAMPINGSYSTEM +fender = IfcImpactProtectionDeviceTypeEnum.FENDER +bumper = IfcImpactProtectionDeviceTypeEnum.BUMPER +userdefined = IfcImpactProtectionDeviceTypeEnum.USERDEFINED +notdefined = IfcImpactProtectionDeviceTypeEnum.NOTDEFINED IfcInterceptorTypeEnum = enum_namespace() -cyclonic = express_getattr(IfcInterceptorTypeEnum, 'CYCLONIC', INDETERMINATE) -grease = express_getattr(IfcInterceptorTypeEnum, 'GREASE', INDETERMINATE) -oil = express_getattr(IfcInterceptorTypeEnum, 'OIL', INDETERMINATE) -petrol = express_getattr(IfcInterceptorTypeEnum, 'PETROL', INDETERMINATE) -userdefined = express_getattr(IfcInterceptorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcInterceptorTypeEnum, 'NOTDEFINED', INDETERMINATE) +cyclonic = IfcInterceptorTypeEnum.CYCLONIC +grease = IfcInterceptorTypeEnum.GREASE +oil = IfcInterceptorTypeEnum.OIL +petrol = IfcInterceptorTypeEnum.PETROL +userdefined = IfcInterceptorTypeEnum.USERDEFINED +notdefined = IfcInterceptorTypeEnum.NOTDEFINED IfcInternalOrExternalEnum = enum_namespace() -internal = express_getattr(IfcInternalOrExternalEnum, 'INTERNAL', INDETERMINATE) -external = express_getattr(IfcInternalOrExternalEnum, 'EXTERNAL', INDETERMINATE) -external_earth = express_getattr(IfcInternalOrExternalEnum, 'EXTERNAL_EARTH', INDETERMINATE) -external_water = express_getattr(IfcInternalOrExternalEnum, 'EXTERNAL_WATER', INDETERMINATE) -external_fire = express_getattr(IfcInternalOrExternalEnum, 'EXTERNAL_FIRE', INDETERMINATE) -notdefined = express_getattr(IfcInternalOrExternalEnum, 'NOTDEFINED', INDETERMINATE) +internal = IfcInternalOrExternalEnum.INTERNAL +external = IfcInternalOrExternalEnum.EXTERNAL +external_earth = IfcInternalOrExternalEnum.EXTERNAL_EARTH +external_water = IfcInternalOrExternalEnum.EXTERNAL_WATER +external_fire = IfcInternalOrExternalEnum.EXTERNAL_FIRE +notdefined = IfcInternalOrExternalEnum.NOTDEFINED IfcInventoryTypeEnum = enum_namespace() -assetinventory = express_getattr(IfcInventoryTypeEnum, 'ASSETINVENTORY', INDETERMINATE) -spaceinventory = express_getattr(IfcInventoryTypeEnum, 'SPACEINVENTORY', INDETERMINATE) -furnitureinventory = express_getattr(IfcInventoryTypeEnum, 'FURNITUREINVENTORY', INDETERMINATE) -userdefined = express_getattr(IfcInventoryTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcInventoryTypeEnum, 'NOTDEFINED', INDETERMINATE) +assetinventory = IfcInventoryTypeEnum.ASSETINVENTORY +spaceinventory = IfcInventoryTypeEnum.SPACEINVENTORY +furnitureinventory = IfcInventoryTypeEnum.FURNITUREINVENTORY +userdefined = IfcInventoryTypeEnum.USERDEFINED +notdefined = IfcInventoryTypeEnum.NOTDEFINED IfcJunctionBoxTypeEnum = enum_namespace() -data = express_getattr(IfcJunctionBoxTypeEnum, 'DATA', INDETERMINATE) -power = express_getattr(IfcJunctionBoxTypeEnum, 'POWER', INDETERMINATE) -userdefined = express_getattr(IfcJunctionBoxTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcJunctionBoxTypeEnum, 'NOTDEFINED', INDETERMINATE) +data = IfcJunctionBoxTypeEnum.DATA +power = IfcJunctionBoxTypeEnum.POWER +userdefined = IfcJunctionBoxTypeEnum.USERDEFINED +notdefined = IfcJunctionBoxTypeEnum.NOTDEFINED IfcKnotType = enum_namespace() -uniform_knots = express_getattr(IfcKnotType, 'UNIFORM_KNOTS', INDETERMINATE) -quasi_uniform_knots = express_getattr(IfcKnotType, 'QUASI_UNIFORM_KNOTS', INDETERMINATE) -piecewise_bezier_knots = express_getattr(IfcKnotType, 'PIECEWISE_BEZIER_KNOTS', INDETERMINATE) -unspecified = express_getattr(IfcKnotType, 'UNSPECIFIED', INDETERMINATE) +uniform_knots = IfcKnotType.UNIFORM_KNOTS +quasi_uniform_knots = IfcKnotType.QUASI_UNIFORM_KNOTS +piecewise_bezier_knots = IfcKnotType.PIECEWISE_BEZIER_KNOTS +unspecified = IfcKnotType.UNSPECIFIED IfcLaborResourceTypeEnum = enum_namespace() -administration = express_getattr(IfcLaborResourceTypeEnum, 'ADMINISTRATION', INDETERMINATE) -carpentry = express_getattr(IfcLaborResourceTypeEnum, 'CARPENTRY', INDETERMINATE) -cleaning = express_getattr(IfcLaborResourceTypeEnum, 'CLEANING', INDETERMINATE) -concrete = express_getattr(IfcLaborResourceTypeEnum, 'CONCRETE', INDETERMINATE) -drywall = express_getattr(IfcLaborResourceTypeEnum, 'DRYWALL', INDETERMINATE) -electric = express_getattr(IfcLaborResourceTypeEnum, 'ELECTRIC', INDETERMINATE) -finishing = express_getattr(IfcLaborResourceTypeEnum, 'FINISHING', INDETERMINATE) -flooring = express_getattr(IfcLaborResourceTypeEnum, 'FLOORING', INDETERMINATE) -general = express_getattr(IfcLaborResourceTypeEnum, 'GENERAL', INDETERMINATE) -hvac = express_getattr(IfcLaborResourceTypeEnum, 'HVAC', INDETERMINATE) -landscaping = express_getattr(IfcLaborResourceTypeEnum, 'LANDSCAPING', INDETERMINATE) -masonry = express_getattr(IfcLaborResourceTypeEnum, 'MASONRY', INDETERMINATE) -painting = express_getattr(IfcLaborResourceTypeEnum, 'PAINTING', INDETERMINATE) -paving = express_getattr(IfcLaborResourceTypeEnum, 'PAVING', INDETERMINATE) -plumbing = express_getattr(IfcLaborResourceTypeEnum, 'PLUMBING', INDETERMINATE) -roofing = express_getattr(IfcLaborResourceTypeEnum, 'ROOFING', INDETERMINATE) -sitegrading = express_getattr(IfcLaborResourceTypeEnum, 'SITEGRADING', INDETERMINATE) -steelwork = express_getattr(IfcLaborResourceTypeEnum, 'STEELWORK', INDETERMINATE) -surveying = express_getattr(IfcLaborResourceTypeEnum, 'SURVEYING', INDETERMINATE) -userdefined = express_getattr(IfcLaborResourceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcLaborResourceTypeEnum, 'NOTDEFINED', INDETERMINATE) +administration = IfcLaborResourceTypeEnum.ADMINISTRATION +carpentry = IfcLaborResourceTypeEnum.CARPENTRY +cleaning = IfcLaborResourceTypeEnum.CLEANING +concrete = IfcLaborResourceTypeEnum.CONCRETE +drywall = IfcLaborResourceTypeEnum.DRYWALL +electric = IfcLaborResourceTypeEnum.ELECTRIC +finishing = IfcLaborResourceTypeEnum.FINISHING +flooring = IfcLaborResourceTypeEnum.FLOORING +general = IfcLaborResourceTypeEnum.GENERAL +hvac = IfcLaborResourceTypeEnum.HVAC +landscaping = IfcLaborResourceTypeEnum.LANDSCAPING +masonry = IfcLaborResourceTypeEnum.MASONRY +painting = IfcLaborResourceTypeEnum.PAINTING +paving = IfcLaborResourceTypeEnum.PAVING +plumbing = IfcLaborResourceTypeEnum.PLUMBING +roofing = IfcLaborResourceTypeEnum.ROOFING +sitegrading = IfcLaborResourceTypeEnum.SITEGRADING +steelwork = IfcLaborResourceTypeEnum.STEELWORK +surveying = IfcLaborResourceTypeEnum.SURVEYING +userdefined = IfcLaborResourceTypeEnum.USERDEFINED +notdefined = IfcLaborResourceTypeEnum.NOTDEFINED IfcLampTypeEnum = enum_namespace() -compactfluorescent = express_getattr(IfcLampTypeEnum, 'COMPACTFLUORESCENT', INDETERMINATE) -fluorescent = express_getattr(IfcLampTypeEnum, 'FLUORESCENT', INDETERMINATE) -halogen = express_getattr(IfcLampTypeEnum, 'HALOGEN', INDETERMINATE) -highpressuremercury = express_getattr(IfcLampTypeEnum, 'HIGHPRESSUREMERCURY', INDETERMINATE) -highpressuresodium = express_getattr(IfcLampTypeEnum, 'HIGHPRESSURESODIUM', INDETERMINATE) -led = express_getattr(IfcLampTypeEnum, 'LED', INDETERMINATE) -metalhalide = express_getattr(IfcLampTypeEnum, 'METALHALIDE', INDETERMINATE) -oled = express_getattr(IfcLampTypeEnum, 'OLED', INDETERMINATE) -tungstenfilament = express_getattr(IfcLampTypeEnum, 'TUNGSTENFILAMENT', INDETERMINATE) -userdefined = express_getattr(IfcLampTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcLampTypeEnum, 'NOTDEFINED', INDETERMINATE) +compactfluorescent = IfcLampTypeEnum.COMPACTFLUORESCENT +fluorescent = IfcLampTypeEnum.FLUORESCENT +halogen = IfcLampTypeEnum.HALOGEN +highpressuremercury = IfcLampTypeEnum.HIGHPRESSUREMERCURY +highpressuresodium = IfcLampTypeEnum.HIGHPRESSURESODIUM +led = IfcLampTypeEnum.LED +metalhalide = IfcLampTypeEnum.METALHALIDE +oled = IfcLampTypeEnum.OLED +tungstenfilament = IfcLampTypeEnum.TUNGSTENFILAMENT +userdefined = IfcLampTypeEnum.USERDEFINED +notdefined = IfcLampTypeEnum.NOTDEFINED IfcLayerSetDirectionEnum = enum_namespace() -axis1 = express_getattr(IfcLayerSetDirectionEnum, 'AXIS1', INDETERMINATE) -axis2 = express_getattr(IfcLayerSetDirectionEnum, 'AXIS2', INDETERMINATE) -axis3 = express_getattr(IfcLayerSetDirectionEnum, 'AXIS3', INDETERMINATE) +axis1 = IfcLayerSetDirectionEnum.AXIS1 +axis2 = IfcLayerSetDirectionEnum.AXIS2 +axis3 = IfcLayerSetDirectionEnum.AXIS3 IfcLightDistributionCurveEnum = enum_namespace() -type_a = express_getattr(IfcLightDistributionCurveEnum, 'TYPE_A', INDETERMINATE) -type_b = express_getattr(IfcLightDistributionCurveEnum, 'TYPE_B', INDETERMINATE) -type_c = express_getattr(IfcLightDistributionCurveEnum, 'TYPE_C', INDETERMINATE) -notdefined = express_getattr(IfcLightDistributionCurveEnum, 'NOTDEFINED', INDETERMINATE) +type_a = IfcLightDistributionCurveEnum.TYPE_A +type_b = IfcLightDistributionCurveEnum.TYPE_B +type_c = IfcLightDistributionCurveEnum.TYPE_C +notdefined = IfcLightDistributionCurveEnum.NOTDEFINED IfcLightEmissionSourceEnum = enum_namespace() -compactfluorescent = express_getattr(IfcLightEmissionSourceEnum, 'COMPACTFLUORESCENT', INDETERMINATE) -fluorescent = express_getattr(IfcLightEmissionSourceEnum, 'FLUORESCENT', INDETERMINATE) -highpressuremercury = express_getattr(IfcLightEmissionSourceEnum, 'HIGHPRESSUREMERCURY', INDETERMINATE) -highpressuresodium = express_getattr(IfcLightEmissionSourceEnum, 'HIGHPRESSURESODIUM', INDETERMINATE) -lightemittingdiode = express_getattr(IfcLightEmissionSourceEnum, 'LIGHTEMITTINGDIODE', INDETERMINATE) -lowpressuresodium = express_getattr(IfcLightEmissionSourceEnum, 'LOWPRESSURESODIUM', INDETERMINATE) -lowvoltagehalogen = express_getattr(IfcLightEmissionSourceEnum, 'LOWVOLTAGEHALOGEN', INDETERMINATE) -mainvoltagehalogen = express_getattr(IfcLightEmissionSourceEnum, 'MAINVOLTAGEHALOGEN', INDETERMINATE) -metalhalide = express_getattr(IfcLightEmissionSourceEnum, 'METALHALIDE', INDETERMINATE) -tungstenfilament = express_getattr(IfcLightEmissionSourceEnum, 'TUNGSTENFILAMENT', INDETERMINATE) -notdefined = express_getattr(IfcLightEmissionSourceEnum, 'NOTDEFINED', INDETERMINATE) +compactfluorescent = IfcLightEmissionSourceEnum.COMPACTFLUORESCENT +fluorescent = IfcLightEmissionSourceEnum.FLUORESCENT +highpressuremercury = IfcLightEmissionSourceEnum.HIGHPRESSUREMERCURY +highpressuresodium = IfcLightEmissionSourceEnum.HIGHPRESSURESODIUM +lightemittingdiode = IfcLightEmissionSourceEnum.LIGHTEMITTINGDIODE +lowpressuresodium = IfcLightEmissionSourceEnum.LOWPRESSURESODIUM +lowvoltagehalogen = IfcLightEmissionSourceEnum.LOWVOLTAGEHALOGEN +mainvoltagehalogen = IfcLightEmissionSourceEnum.MAINVOLTAGEHALOGEN +metalhalide = IfcLightEmissionSourceEnum.METALHALIDE +tungstenfilament = IfcLightEmissionSourceEnum.TUNGSTENFILAMENT +notdefined = IfcLightEmissionSourceEnum.NOTDEFINED IfcLightFixtureTypeEnum = enum_namespace() -pointsource = express_getattr(IfcLightFixtureTypeEnum, 'POINTSOURCE', INDETERMINATE) -directionsource = express_getattr(IfcLightFixtureTypeEnum, 'DIRECTIONSOURCE', INDETERMINATE) -securitylighting = express_getattr(IfcLightFixtureTypeEnum, 'SECURITYLIGHTING', INDETERMINATE) -userdefined = express_getattr(IfcLightFixtureTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcLightFixtureTypeEnum, 'NOTDEFINED', INDETERMINATE) +pointsource = IfcLightFixtureTypeEnum.POINTSOURCE +directionsource = IfcLightFixtureTypeEnum.DIRECTIONSOURCE +securitylighting = IfcLightFixtureTypeEnum.SECURITYLIGHTING +userdefined = IfcLightFixtureTypeEnum.USERDEFINED +notdefined = IfcLightFixtureTypeEnum.NOTDEFINED IfcLiquidTerminalTypeEnum = enum_namespace() -loadingarm = express_getattr(IfcLiquidTerminalTypeEnum, 'LOADINGARM', INDETERMINATE) -hosereel = express_getattr(IfcLiquidTerminalTypeEnum, 'HOSEREEL', INDETERMINATE) -userdefined = express_getattr(IfcLiquidTerminalTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcLiquidTerminalTypeEnum, 'NOTDEFINED', INDETERMINATE) +loadingarm = IfcLiquidTerminalTypeEnum.LOADINGARM +hosereel = IfcLiquidTerminalTypeEnum.HOSEREEL +userdefined = IfcLiquidTerminalTypeEnum.USERDEFINED +notdefined = IfcLiquidTerminalTypeEnum.NOTDEFINED IfcLoadGroupTypeEnum = enum_namespace() -load_group = express_getattr(IfcLoadGroupTypeEnum, 'LOAD_GROUP', INDETERMINATE) -load_case = express_getattr(IfcLoadGroupTypeEnum, 'LOAD_CASE', INDETERMINATE) -load_combination = express_getattr(IfcLoadGroupTypeEnum, 'LOAD_COMBINATION', INDETERMINATE) -userdefined = express_getattr(IfcLoadGroupTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcLoadGroupTypeEnum, 'NOTDEFINED', INDETERMINATE) +load_group = IfcLoadGroupTypeEnum.LOAD_GROUP +load_case = IfcLoadGroupTypeEnum.LOAD_CASE +load_combination = IfcLoadGroupTypeEnum.LOAD_COMBINATION +userdefined = IfcLoadGroupTypeEnum.USERDEFINED +notdefined = IfcLoadGroupTypeEnum.NOTDEFINED IfcLogicalOperatorEnum = enum_namespace() -logicaland = express_getattr(IfcLogicalOperatorEnum, 'LOGICALAND', INDETERMINATE) -logicalor = express_getattr(IfcLogicalOperatorEnum, 'LOGICALOR', INDETERMINATE) -logicalxor = express_getattr(IfcLogicalOperatorEnum, 'LOGICALXOR', INDETERMINATE) -logicalnotand = express_getattr(IfcLogicalOperatorEnum, 'LOGICALNOTAND', INDETERMINATE) -logicalnotor = express_getattr(IfcLogicalOperatorEnum, 'LOGICALNOTOR', INDETERMINATE) +logicaland = IfcLogicalOperatorEnum.LOGICALAND +logicalor = IfcLogicalOperatorEnum.LOGICALOR +logicalxor = IfcLogicalOperatorEnum.LOGICALXOR +logicalnotand = IfcLogicalOperatorEnum.LOGICALNOTAND +logicalnotor = IfcLogicalOperatorEnum.LOGICALNOTOR IfcMarineFacilityTypeEnum = enum_namespace() -canal = express_getattr(IfcMarineFacilityTypeEnum, 'CANAL', INDETERMINATE) -waterwayshiplift = express_getattr(IfcMarineFacilityTypeEnum, 'WATERWAYSHIPLIFT', INDETERMINATE) -embankment = express_getattr(IfcMarineFacilityTypeEnum, 'EMBANKMENT', INDETERMINATE) -launchrecovery = express_getattr(IfcMarineFacilityTypeEnum, 'LAUNCHRECOVERY', INDETERMINATE) -marinedefence = express_getattr(IfcMarineFacilityTypeEnum, 'MARINEDEFENCE', INDETERMINATE) -hydrolift = express_getattr(IfcMarineFacilityTypeEnum, 'HYDROLIFT', INDETERMINATE) -shipyard = express_getattr(IfcMarineFacilityTypeEnum, 'SHIPYARD', INDETERMINATE) -shiplift = express_getattr(IfcMarineFacilityTypeEnum, 'SHIPLIFT', INDETERMINATE) -port = express_getattr(IfcMarineFacilityTypeEnum, 'PORT', INDETERMINATE) -quay = express_getattr(IfcMarineFacilityTypeEnum, 'QUAY', INDETERMINATE) -floatingdock = express_getattr(IfcMarineFacilityTypeEnum, 'FLOATINGDOCK', INDETERMINATE) -navigationalchannel = express_getattr(IfcMarineFacilityTypeEnum, 'NAVIGATIONALCHANNEL', INDETERMINATE) -breakwater = express_getattr(IfcMarineFacilityTypeEnum, 'BREAKWATER', INDETERMINATE) -drydock = express_getattr(IfcMarineFacilityTypeEnum, 'DRYDOCK', INDETERMINATE) -jetty = express_getattr(IfcMarineFacilityTypeEnum, 'JETTY', INDETERMINATE) -shiplock = express_getattr(IfcMarineFacilityTypeEnum, 'SHIPLOCK', INDETERMINATE) -barrierbeach = express_getattr(IfcMarineFacilityTypeEnum, 'BARRIERBEACH', INDETERMINATE) -slipway = express_getattr(IfcMarineFacilityTypeEnum, 'SLIPWAY', INDETERMINATE) -waterway = express_getattr(IfcMarineFacilityTypeEnum, 'WATERWAY', INDETERMINATE) -userdefined = express_getattr(IfcMarineFacilityTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcMarineFacilityTypeEnum, 'NOTDEFINED', INDETERMINATE) +canal = IfcMarineFacilityTypeEnum.CANAL +waterwayshiplift = IfcMarineFacilityTypeEnum.WATERWAYSHIPLIFT +embankment = IfcMarineFacilityTypeEnum.EMBANKMENT +launchrecovery = IfcMarineFacilityTypeEnum.LAUNCHRECOVERY +marinedefence = IfcMarineFacilityTypeEnum.MARINEDEFENCE +hydrolift = IfcMarineFacilityTypeEnum.HYDROLIFT +shipyard = IfcMarineFacilityTypeEnum.SHIPYARD +shiplift = IfcMarineFacilityTypeEnum.SHIPLIFT +port = IfcMarineFacilityTypeEnum.PORT +quay = IfcMarineFacilityTypeEnum.QUAY +floatingdock = IfcMarineFacilityTypeEnum.FLOATINGDOCK +navigationalchannel = IfcMarineFacilityTypeEnum.NAVIGATIONALCHANNEL +breakwater = IfcMarineFacilityTypeEnum.BREAKWATER +drydock = IfcMarineFacilityTypeEnum.DRYDOCK +jetty = IfcMarineFacilityTypeEnum.JETTY +shiplock = IfcMarineFacilityTypeEnum.SHIPLOCK +barrierbeach = IfcMarineFacilityTypeEnum.BARRIERBEACH +slipway = IfcMarineFacilityTypeEnum.SLIPWAY +waterway = IfcMarineFacilityTypeEnum.WATERWAY +userdefined = IfcMarineFacilityTypeEnum.USERDEFINED +notdefined = IfcMarineFacilityTypeEnum.NOTDEFINED IfcMarinePartTypeEnum = enum_namespace() -crest = express_getattr(IfcMarinePartTypeEnum, 'CREST', INDETERMINATE) -manufacturing = express_getattr(IfcMarinePartTypeEnum, 'MANUFACTURING', INDETERMINATE) -lowwaterline = express_getattr(IfcMarinePartTypeEnum, 'LOWWATERLINE', INDETERMINATE) -core = express_getattr(IfcMarinePartTypeEnum, 'CORE', INDETERMINATE) -waterfield = express_getattr(IfcMarinePartTypeEnum, 'WATERFIELD', INDETERMINATE) -cill_level = express_getattr(IfcMarinePartTypeEnum, 'CILL_LEVEL', INDETERMINATE) -berthingstructure = express_getattr(IfcMarinePartTypeEnum, 'BERTHINGSTRUCTURE', INDETERMINATE) -copelevel = express_getattr(IfcMarinePartTypeEnum, 'COPELEVEL', INDETERMINATE) -chamber = express_getattr(IfcMarinePartTypeEnum, 'CHAMBER', INDETERMINATE) -storage = express_getattr(IfcMarinePartTypeEnum, 'STORAGE', INDETERMINATE) -approachchannel = express_getattr(IfcMarinePartTypeEnum, 'APPROACHCHANNEL', INDETERMINATE) -vehicleservicing = express_getattr(IfcMarinePartTypeEnum, 'VEHICLESERVICING', INDETERMINATE) -shiptransfer = express_getattr(IfcMarinePartTypeEnum, 'SHIPTRANSFER', INDETERMINATE) -gatehead = express_getattr(IfcMarinePartTypeEnum, 'GATEHEAD', INDETERMINATE) -gudingstructure = express_getattr(IfcMarinePartTypeEnum, 'GUDINGSTRUCTURE', INDETERMINATE) -belowwaterline = express_getattr(IfcMarinePartTypeEnum, 'BELOWWATERLINE', INDETERMINATE) -weatherside = express_getattr(IfcMarinePartTypeEnum, 'WEATHERSIDE', INDETERMINATE) -landfield = express_getattr(IfcMarinePartTypeEnum, 'LANDFIELD', INDETERMINATE) -protection = express_getattr(IfcMarinePartTypeEnum, 'PROTECTION', INDETERMINATE) -leewardside = express_getattr(IfcMarinePartTypeEnum, 'LEEWARDSIDE', INDETERMINATE) -abovewaterline = express_getattr(IfcMarinePartTypeEnum, 'ABOVEWATERLINE', INDETERMINATE) -anchorage = express_getattr(IfcMarinePartTypeEnum, 'ANCHORAGE', INDETERMINATE) -navigationalarea = express_getattr(IfcMarinePartTypeEnum, 'NAVIGATIONALAREA', INDETERMINATE) -highwaterline = express_getattr(IfcMarinePartTypeEnum, 'HIGHWATERLINE', INDETERMINATE) -userdefined = express_getattr(IfcMarinePartTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcMarinePartTypeEnum, 'NOTDEFINED', INDETERMINATE) +crest = IfcMarinePartTypeEnum.CREST +manufacturing = IfcMarinePartTypeEnum.MANUFACTURING +lowwaterline = IfcMarinePartTypeEnum.LOWWATERLINE +core = IfcMarinePartTypeEnum.CORE +waterfield = IfcMarinePartTypeEnum.WATERFIELD +cill_level = IfcMarinePartTypeEnum.CILL_LEVEL +berthingstructure = IfcMarinePartTypeEnum.BERTHINGSTRUCTURE +copelevel = IfcMarinePartTypeEnum.COPELEVEL +chamber = IfcMarinePartTypeEnum.CHAMBER +storage = IfcMarinePartTypeEnum.STORAGE +approachchannel = IfcMarinePartTypeEnum.APPROACHCHANNEL +vehicleservicing = IfcMarinePartTypeEnum.VEHICLESERVICING +shiptransfer = IfcMarinePartTypeEnum.SHIPTRANSFER +gatehead = IfcMarinePartTypeEnum.GATEHEAD +gudingstructure = IfcMarinePartTypeEnum.GUDINGSTRUCTURE +belowwaterline = IfcMarinePartTypeEnum.BELOWWATERLINE +weatherside = IfcMarinePartTypeEnum.WEATHERSIDE +landfield = IfcMarinePartTypeEnum.LANDFIELD +protection = IfcMarinePartTypeEnum.PROTECTION +leewardside = IfcMarinePartTypeEnum.LEEWARDSIDE +abovewaterline = IfcMarinePartTypeEnum.ABOVEWATERLINE +anchorage = IfcMarinePartTypeEnum.ANCHORAGE +navigationalarea = IfcMarinePartTypeEnum.NAVIGATIONALAREA +highwaterline = IfcMarinePartTypeEnum.HIGHWATERLINE +userdefined = IfcMarinePartTypeEnum.USERDEFINED +notdefined = IfcMarinePartTypeEnum.NOTDEFINED IfcMechanicalFastenerTypeEnum = enum_namespace() -anchorbolt = express_getattr(IfcMechanicalFastenerTypeEnum, 'ANCHORBOLT', INDETERMINATE) -bolt = express_getattr(IfcMechanicalFastenerTypeEnum, 'BOLT', INDETERMINATE) -dowel = express_getattr(IfcMechanicalFastenerTypeEnum, 'DOWEL', INDETERMINATE) -nail = express_getattr(IfcMechanicalFastenerTypeEnum, 'NAIL', INDETERMINATE) -nailplate = express_getattr(IfcMechanicalFastenerTypeEnum, 'NAILPLATE', INDETERMINATE) -rivet = express_getattr(IfcMechanicalFastenerTypeEnum, 'RIVET', INDETERMINATE) -screw = express_getattr(IfcMechanicalFastenerTypeEnum, 'SCREW', INDETERMINATE) -shearconnector = express_getattr(IfcMechanicalFastenerTypeEnum, 'SHEARCONNECTOR', INDETERMINATE) -staple = express_getattr(IfcMechanicalFastenerTypeEnum, 'STAPLE', INDETERMINATE) -studshearconnector = express_getattr(IfcMechanicalFastenerTypeEnum, 'STUDSHEARCONNECTOR', INDETERMINATE) -coupler = express_getattr(IfcMechanicalFastenerTypeEnum, 'COUPLER', INDETERMINATE) -railjoint = express_getattr(IfcMechanicalFastenerTypeEnum, 'RAILJOINT', INDETERMINATE) -railfastening = express_getattr(IfcMechanicalFastenerTypeEnum, 'RAILFASTENING', INDETERMINATE) -chain = express_getattr(IfcMechanicalFastenerTypeEnum, 'CHAIN', INDETERMINATE) -rope = express_getattr(IfcMechanicalFastenerTypeEnum, 'ROPE', INDETERMINATE) -userdefined = express_getattr(IfcMechanicalFastenerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcMechanicalFastenerTypeEnum, 'NOTDEFINED', INDETERMINATE) +anchorbolt = IfcMechanicalFastenerTypeEnum.ANCHORBOLT +bolt = IfcMechanicalFastenerTypeEnum.BOLT +dowel = IfcMechanicalFastenerTypeEnum.DOWEL +nail = IfcMechanicalFastenerTypeEnum.NAIL +nailplate = IfcMechanicalFastenerTypeEnum.NAILPLATE +rivet = IfcMechanicalFastenerTypeEnum.RIVET +screw = IfcMechanicalFastenerTypeEnum.SCREW +shearconnector = IfcMechanicalFastenerTypeEnum.SHEARCONNECTOR +staple = IfcMechanicalFastenerTypeEnum.STAPLE +studshearconnector = IfcMechanicalFastenerTypeEnum.STUDSHEARCONNECTOR +coupler = IfcMechanicalFastenerTypeEnum.COUPLER +railjoint = IfcMechanicalFastenerTypeEnum.RAILJOINT +railfastening = IfcMechanicalFastenerTypeEnum.RAILFASTENING +chain = IfcMechanicalFastenerTypeEnum.CHAIN +rope = IfcMechanicalFastenerTypeEnum.ROPE +userdefined = IfcMechanicalFastenerTypeEnum.USERDEFINED +notdefined = IfcMechanicalFastenerTypeEnum.NOTDEFINED IfcMedicalDeviceTypeEnum = enum_namespace() -airstation = express_getattr(IfcMedicalDeviceTypeEnum, 'AIRSTATION', INDETERMINATE) -feedairunit = express_getattr(IfcMedicalDeviceTypeEnum, 'FEEDAIRUNIT', INDETERMINATE) -oxygengenerator = express_getattr(IfcMedicalDeviceTypeEnum, 'OXYGENGENERATOR', INDETERMINATE) -oxygenplant = express_getattr(IfcMedicalDeviceTypeEnum, 'OXYGENPLANT', INDETERMINATE) -vacuumstation = express_getattr(IfcMedicalDeviceTypeEnum, 'VACUUMSTATION', INDETERMINATE) -userdefined = express_getattr(IfcMedicalDeviceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcMedicalDeviceTypeEnum, 'NOTDEFINED', INDETERMINATE) +airstation = IfcMedicalDeviceTypeEnum.AIRSTATION +feedairunit = IfcMedicalDeviceTypeEnum.FEEDAIRUNIT +oxygengenerator = IfcMedicalDeviceTypeEnum.OXYGENGENERATOR +oxygenplant = IfcMedicalDeviceTypeEnum.OXYGENPLANT +vacuumstation = IfcMedicalDeviceTypeEnum.VACUUMSTATION +userdefined = IfcMedicalDeviceTypeEnum.USERDEFINED +notdefined = IfcMedicalDeviceTypeEnum.NOTDEFINED IfcMemberTypeEnum = enum_namespace() -brace = express_getattr(IfcMemberTypeEnum, 'BRACE', INDETERMINATE) -chord = express_getattr(IfcMemberTypeEnum, 'CHORD', INDETERMINATE) -collar = express_getattr(IfcMemberTypeEnum, 'COLLAR', INDETERMINATE) -member = express_getattr(IfcMemberTypeEnum, 'MEMBER', INDETERMINATE) -mullion = express_getattr(IfcMemberTypeEnum, 'MULLION', INDETERMINATE) -plate = express_getattr(IfcMemberTypeEnum, 'PLATE', INDETERMINATE) -post = express_getattr(IfcMemberTypeEnum, 'POST', INDETERMINATE) -purlin = express_getattr(IfcMemberTypeEnum, 'PURLIN', INDETERMINATE) -rafter = express_getattr(IfcMemberTypeEnum, 'RAFTER', INDETERMINATE) -stringer = express_getattr(IfcMemberTypeEnum, 'STRINGER', INDETERMINATE) -strut = express_getattr(IfcMemberTypeEnum, 'STRUT', INDETERMINATE) -stud = express_getattr(IfcMemberTypeEnum, 'STUD', INDETERMINATE) -stiffening_rib = express_getattr(IfcMemberTypeEnum, 'STIFFENING_RIB', INDETERMINATE) -arch_segment = express_getattr(IfcMemberTypeEnum, 'ARCH_SEGMENT', INDETERMINATE) -suspension_cable = express_getattr(IfcMemberTypeEnum, 'SUSPENSION_CABLE', INDETERMINATE) -suspender = express_getattr(IfcMemberTypeEnum, 'SUSPENDER', INDETERMINATE) -stay_cable = express_getattr(IfcMemberTypeEnum, 'STAY_CABLE', INDETERMINATE) -structuralcable = express_getattr(IfcMemberTypeEnum, 'STRUCTURALCABLE', INDETERMINATE) -tiebar = express_getattr(IfcMemberTypeEnum, 'TIEBAR', INDETERMINATE) -userdefined = express_getattr(IfcMemberTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcMemberTypeEnum, 'NOTDEFINED', INDETERMINATE) +brace = IfcMemberTypeEnum.BRACE +chord = IfcMemberTypeEnum.CHORD +collar = IfcMemberTypeEnum.COLLAR +member = IfcMemberTypeEnum.MEMBER +mullion = IfcMemberTypeEnum.MULLION +plate = IfcMemberTypeEnum.PLATE +post = IfcMemberTypeEnum.POST +purlin = IfcMemberTypeEnum.PURLIN +rafter = IfcMemberTypeEnum.RAFTER +stringer = IfcMemberTypeEnum.STRINGER +strut = IfcMemberTypeEnum.STRUT +stud = IfcMemberTypeEnum.STUD +stiffening_rib = IfcMemberTypeEnum.STIFFENING_RIB +arch_segment = IfcMemberTypeEnum.ARCH_SEGMENT +suspension_cable = IfcMemberTypeEnum.SUSPENSION_CABLE +suspender = IfcMemberTypeEnum.SUSPENDER +stay_cable = IfcMemberTypeEnum.STAY_CABLE +structuralcable = IfcMemberTypeEnum.STRUCTURALCABLE +tiebar = IfcMemberTypeEnum.TIEBAR +userdefined = IfcMemberTypeEnum.USERDEFINED +notdefined = IfcMemberTypeEnum.NOTDEFINED IfcMobileTelecommunicationsApplianceTypeEnum = enum_namespace() -e_utran_node_b = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'E_UTRAN_NODE_B', INDETERMINATE) -remote_radio_unit = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'REMOTE_RADIO_UNIT', INDETERMINATE) -accesspoint = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'ACCESSPOINT', INDETERMINATE) -basetransceiverstation = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'BASETRANSCEIVERSTATION', INDETERMINATE) -remoteunit = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'REMOTEUNIT', INDETERMINATE) -basebandunit = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'BASEBANDUNIT', INDETERMINATE) -masterunit = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'MASTERUNIT', INDETERMINATE) -userdefined = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'NOTDEFINED', INDETERMINATE) +e_utran_node_b = IfcMobileTelecommunicationsApplianceTypeEnum.E_UTRAN_NODE_B +remote_radio_unit = IfcMobileTelecommunicationsApplianceTypeEnum.REMOTE_RADIO_UNIT +accesspoint = IfcMobileTelecommunicationsApplianceTypeEnum.ACCESSPOINT +basetransceiverstation = IfcMobileTelecommunicationsApplianceTypeEnum.BASETRANSCEIVERSTATION +remoteunit = IfcMobileTelecommunicationsApplianceTypeEnum.REMOTEUNIT +basebandunit = IfcMobileTelecommunicationsApplianceTypeEnum.BASEBANDUNIT +masterunit = IfcMobileTelecommunicationsApplianceTypeEnum.MASTERUNIT +userdefined = IfcMobileTelecommunicationsApplianceTypeEnum.USERDEFINED +notdefined = IfcMobileTelecommunicationsApplianceTypeEnum.NOTDEFINED IfcMooringDeviceTypeEnum = enum_namespace() -linetensioner = express_getattr(IfcMooringDeviceTypeEnum, 'LINETENSIONER', INDETERMINATE) -magneticdevice = express_getattr(IfcMooringDeviceTypeEnum, 'MAGNETICDEVICE', INDETERMINATE) -mooringhooks = express_getattr(IfcMooringDeviceTypeEnum, 'MOORINGHOOKS', INDETERMINATE) -vacuumdevice = express_getattr(IfcMooringDeviceTypeEnum, 'VACUUMDEVICE', INDETERMINATE) -bollard = express_getattr(IfcMooringDeviceTypeEnum, 'BOLLARD', INDETERMINATE) -userdefined = express_getattr(IfcMooringDeviceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcMooringDeviceTypeEnum, 'NOTDEFINED', INDETERMINATE) +linetensioner = IfcMooringDeviceTypeEnum.LINETENSIONER +magneticdevice = IfcMooringDeviceTypeEnum.MAGNETICDEVICE +mooringhooks = IfcMooringDeviceTypeEnum.MOORINGHOOKS +vacuumdevice = IfcMooringDeviceTypeEnum.VACUUMDEVICE +bollard = IfcMooringDeviceTypeEnum.BOLLARD +userdefined = IfcMooringDeviceTypeEnum.USERDEFINED +notdefined = IfcMooringDeviceTypeEnum.NOTDEFINED IfcMotorConnectionTypeEnum = enum_namespace() -beltdrive = express_getattr(IfcMotorConnectionTypeEnum, 'BELTDRIVE', INDETERMINATE) -coupling = express_getattr(IfcMotorConnectionTypeEnum, 'COUPLING', INDETERMINATE) -directdrive = express_getattr(IfcMotorConnectionTypeEnum, 'DIRECTDRIVE', INDETERMINATE) -userdefined = express_getattr(IfcMotorConnectionTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcMotorConnectionTypeEnum, 'NOTDEFINED', INDETERMINATE) +beltdrive = IfcMotorConnectionTypeEnum.BELTDRIVE +coupling = IfcMotorConnectionTypeEnum.COUPLING +directdrive = IfcMotorConnectionTypeEnum.DIRECTDRIVE +userdefined = IfcMotorConnectionTypeEnum.USERDEFINED +notdefined = IfcMotorConnectionTypeEnum.NOTDEFINED IfcNavigationElementTypeEnum = enum_namespace() -beacon = express_getattr(IfcNavigationElementTypeEnum, 'BEACON', INDETERMINATE) -buoy = express_getattr(IfcNavigationElementTypeEnum, 'BUOY', INDETERMINATE) -userdefined = express_getattr(IfcNavigationElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcNavigationElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +beacon = IfcNavigationElementTypeEnum.BEACON +buoy = IfcNavigationElementTypeEnum.BUOY +userdefined = IfcNavigationElementTypeEnum.USERDEFINED +notdefined = IfcNavigationElementTypeEnum.NOTDEFINED IfcNullStyle = enum_namespace() -null = express_getattr(IfcNullStyle, 'NULL', INDETERMINATE) +null = IfcNullStyle.NULL IfcObjectTypeEnum = enum_namespace() -product = express_getattr(IfcObjectTypeEnum, 'PRODUCT', INDETERMINATE) -process = express_getattr(IfcObjectTypeEnum, 'PROCESS', INDETERMINATE) -control = express_getattr(IfcObjectTypeEnum, 'CONTROL', INDETERMINATE) -resource = express_getattr(IfcObjectTypeEnum, 'RESOURCE', INDETERMINATE) -actor = express_getattr(IfcObjectTypeEnum, 'ACTOR', INDETERMINATE) -group = express_getattr(IfcObjectTypeEnum, 'GROUP', INDETERMINATE) -project = express_getattr(IfcObjectTypeEnum, 'PROJECT', INDETERMINATE) -notdefined = express_getattr(IfcObjectTypeEnum, 'NOTDEFINED', INDETERMINATE) +product = IfcObjectTypeEnum.PRODUCT +process = IfcObjectTypeEnum.PROCESS +control = IfcObjectTypeEnum.CONTROL +resource = IfcObjectTypeEnum.RESOURCE +actor = IfcObjectTypeEnum.ACTOR +group = IfcObjectTypeEnum.GROUP +project = IfcObjectTypeEnum.PROJECT +notdefined = IfcObjectTypeEnum.NOTDEFINED IfcObjectiveEnum = enum_namespace() -codecompliance = express_getattr(IfcObjectiveEnum, 'CODECOMPLIANCE', INDETERMINATE) -codewaiver = express_getattr(IfcObjectiveEnum, 'CODEWAIVER', INDETERMINATE) -designintent = express_getattr(IfcObjectiveEnum, 'DESIGNINTENT', INDETERMINATE) -external = express_getattr(IfcObjectiveEnum, 'EXTERNAL', INDETERMINATE) -healthandsafety = express_getattr(IfcObjectiveEnum, 'HEALTHANDSAFETY', INDETERMINATE) -mergeconflict = express_getattr(IfcObjectiveEnum, 'MERGECONFLICT', INDETERMINATE) -modelview = express_getattr(IfcObjectiveEnum, 'MODELVIEW', INDETERMINATE) -parameter = express_getattr(IfcObjectiveEnum, 'PARAMETER', INDETERMINATE) -requirement = express_getattr(IfcObjectiveEnum, 'REQUIREMENT', INDETERMINATE) -specification = express_getattr(IfcObjectiveEnum, 'SPECIFICATION', INDETERMINATE) -triggercondition = express_getattr(IfcObjectiveEnum, 'TRIGGERCONDITION', INDETERMINATE) -userdefined = express_getattr(IfcObjectiveEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcObjectiveEnum, 'NOTDEFINED', INDETERMINATE) +codecompliance = IfcObjectiveEnum.CODECOMPLIANCE +codewaiver = IfcObjectiveEnum.CODEWAIVER +designintent = IfcObjectiveEnum.DESIGNINTENT +external = IfcObjectiveEnum.EXTERNAL +healthandsafety = IfcObjectiveEnum.HEALTHANDSAFETY +mergeconflict = IfcObjectiveEnum.MERGECONFLICT +modelview = IfcObjectiveEnum.MODELVIEW +parameter = IfcObjectiveEnum.PARAMETER +requirement = IfcObjectiveEnum.REQUIREMENT +specification = IfcObjectiveEnum.SPECIFICATION +triggercondition = IfcObjectiveEnum.TRIGGERCONDITION +userdefined = IfcObjectiveEnum.USERDEFINED +notdefined = IfcObjectiveEnum.NOTDEFINED IfcOccupantTypeEnum = enum_namespace() -assignee = express_getattr(IfcOccupantTypeEnum, 'ASSIGNEE', INDETERMINATE) -assignor = express_getattr(IfcOccupantTypeEnum, 'ASSIGNOR', INDETERMINATE) -lessee = express_getattr(IfcOccupantTypeEnum, 'LESSEE', INDETERMINATE) -lessor = express_getattr(IfcOccupantTypeEnum, 'LESSOR', INDETERMINATE) -lettingagent = express_getattr(IfcOccupantTypeEnum, 'LETTINGAGENT', INDETERMINATE) -owner = express_getattr(IfcOccupantTypeEnum, 'OWNER', INDETERMINATE) -tenant = express_getattr(IfcOccupantTypeEnum, 'TENANT', INDETERMINATE) -userdefined = express_getattr(IfcOccupantTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcOccupantTypeEnum, 'NOTDEFINED', INDETERMINATE) +assignee = IfcOccupantTypeEnum.ASSIGNEE +assignor = IfcOccupantTypeEnum.ASSIGNOR +lessee = IfcOccupantTypeEnum.LESSEE +lessor = IfcOccupantTypeEnum.LESSOR +lettingagent = IfcOccupantTypeEnum.LETTINGAGENT +owner = IfcOccupantTypeEnum.OWNER +tenant = IfcOccupantTypeEnum.TENANT +userdefined = IfcOccupantTypeEnum.USERDEFINED +notdefined = IfcOccupantTypeEnum.NOTDEFINED IfcOpeningElementTypeEnum = enum_namespace() -opening = express_getattr(IfcOpeningElementTypeEnum, 'OPENING', INDETERMINATE) -recess = express_getattr(IfcOpeningElementTypeEnum, 'RECESS', INDETERMINATE) -userdefined = express_getattr(IfcOpeningElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcOpeningElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +opening = IfcOpeningElementTypeEnum.OPENING +recess = IfcOpeningElementTypeEnum.RECESS +userdefined = IfcOpeningElementTypeEnum.USERDEFINED +notdefined = IfcOpeningElementTypeEnum.NOTDEFINED IfcOutletTypeEnum = enum_namespace() -audiovisualoutlet = express_getattr(IfcOutletTypeEnum, 'AUDIOVISUALOUTLET', INDETERMINATE) -communicationsoutlet = express_getattr(IfcOutletTypeEnum, 'COMMUNICATIONSOUTLET', INDETERMINATE) -poweroutlet = express_getattr(IfcOutletTypeEnum, 'POWEROUTLET', INDETERMINATE) -dataoutlet = express_getattr(IfcOutletTypeEnum, 'DATAOUTLET', INDETERMINATE) -telephoneoutlet = express_getattr(IfcOutletTypeEnum, 'TELEPHONEOUTLET', INDETERMINATE) -userdefined = express_getattr(IfcOutletTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcOutletTypeEnum, 'NOTDEFINED', INDETERMINATE) +audiovisualoutlet = IfcOutletTypeEnum.AUDIOVISUALOUTLET +communicationsoutlet = IfcOutletTypeEnum.COMMUNICATIONSOUTLET +poweroutlet = IfcOutletTypeEnum.POWEROUTLET +dataoutlet = IfcOutletTypeEnum.DATAOUTLET +telephoneoutlet = IfcOutletTypeEnum.TELEPHONEOUTLET +userdefined = IfcOutletTypeEnum.USERDEFINED +notdefined = IfcOutletTypeEnum.NOTDEFINED IfcPerformanceHistoryTypeEnum = enum_namespace() -userdefined = express_getattr(IfcPerformanceHistoryTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPerformanceHistoryTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcPerformanceHistoryTypeEnum.USERDEFINED +notdefined = IfcPerformanceHistoryTypeEnum.NOTDEFINED IfcPermeableCoveringOperationEnum = enum_namespace() -grill = express_getattr(IfcPermeableCoveringOperationEnum, 'GRILL', INDETERMINATE) -louver = express_getattr(IfcPermeableCoveringOperationEnum, 'LOUVER', INDETERMINATE) -screen = express_getattr(IfcPermeableCoveringOperationEnum, 'SCREEN', INDETERMINATE) -userdefined = express_getattr(IfcPermeableCoveringOperationEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPermeableCoveringOperationEnum, 'NOTDEFINED', INDETERMINATE) +grill = IfcPermeableCoveringOperationEnum.GRILL +louver = IfcPermeableCoveringOperationEnum.LOUVER +screen = IfcPermeableCoveringOperationEnum.SCREEN +userdefined = IfcPermeableCoveringOperationEnum.USERDEFINED +notdefined = IfcPermeableCoveringOperationEnum.NOTDEFINED IfcPermitTypeEnum = enum_namespace() -access = express_getattr(IfcPermitTypeEnum, 'ACCESS', INDETERMINATE) -building = express_getattr(IfcPermitTypeEnum, 'BUILDING', INDETERMINATE) -work = express_getattr(IfcPermitTypeEnum, 'WORK', INDETERMINATE) -userdefined = express_getattr(IfcPermitTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPermitTypeEnum, 'NOTDEFINED', INDETERMINATE) +access = IfcPermitTypeEnum.ACCESS +building = IfcPermitTypeEnum.BUILDING +work = IfcPermitTypeEnum.WORK +userdefined = IfcPermitTypeEnum.USERDEFINED +notdefined = IfcPermitTypeEnum.NOTDEFINED IfcPhysicalOrVirtualEnum = enum_namespace() -physical = express_getattr(IfcPhysicalOrVirtualEnum, 'PHYSICAL', INDETERMINATE) -virtual = express_getattr(IfcPhysicalOrVirtualEnum, 'VIRTUAL', INDETERMINATE) -notdefined = express_getattr(IfcPhysicalOrVirtualEnum, 'NOTDEFINED', INDETERMINATE) +physical = IfcPhysicalOrVirtualEnum.PHYSICAL +virtual = IfcPhysicalOrVirtualEnum.VIRTUAL +notdefined = IfcPhysicalOrVirtualEnum.NOTDEFINED IfcPileConstructionEnum = enum_namespace() -cast_in_place = express_getattr(IfcPileConstructionEnum, 'CAST_IN_PLACE', INDETERMINATE) -composite = express_getattr(IfcPileConstructionEnum, 'COMPOSITE', INDETERMINATE) -precast_concrete = express_getattr(IfcPileConstructionEnum, 'PRECAST_CONCRETE', INDETERMINATE) -prefab_steel = express_getattr(IfcPileConstructionEnum, 'PREFAB_STEEL', INDETERMINATE) -userdefined = express_getattr(IfcPileConstructionEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPileConstructionEnum, 'NOTDEFINED', INDETERMINATE) +cast_in_place = IfcPileConstructionEnum.CAST_IN_PLACE +composite = IfcPileConstructionEnum.COMPOSITE +precast_concrete = IfcPileConstructionEnum.PRECAST_CONCRETE +prefab_steel = IfcPileConstructionEnum.PREFAB_STEEL +userdefined = IfcPileConstructionEnum.USERDEFINED +notdefined = IfcPileConstructionEnum.NOTDEFINED IfcPileTypeEnum = enum_namespace() -bored = express_getattr(IfcPileTypeEnum, 'BORED', INDETERMINATE) -driven = express_getattr(IfcPileTypeEnum, 'DRIVEN', INDETERMINATE) -jetgrouting = express_getattr(IfcPileTypeEnum, 'JETGROUTING', INDETERMINATE) -cohesion = express_getattr(IfcPileTypeEnum, 'COHESION', INDETERMINATE) -friction = express_getattr(IfcPileTypeEnum, 'FRICTION', INDETERMINATE) -support = express_getattr(IfcPileTypeEnum, 'SUPPORT', INDETERMINATE) -userdefined = express_getattr(IfcPileTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPileTypeEnum, 'NOTDEFINED', INDETERMINATE) +bored = IfcPileTypeEnum.BORED +driven = IfcPileTypeEnum.DRIVEN +jetgrouting = IfcPileTypeEnum.JETGROUTING +cohesion = IfcPileTypeEnum.COHESION +friction = IfcPileTypeEnum.FRICTION +support = IfcPileTypeEnum.SUPPORT +userdefined = IfcPileTypeEnum.USERDEFINED +notdefined = IfcPileTypeEnum.NOTDEFINED IfcPipeFittingTypeEnum = enum_namespace() -bend = express_getattr(IfcPipeFittingTypeEnum, 'BEND', INDETERMINATE) -connector = express_getattr(IfcPipeFittingTypeEnum, 'CONNECTOR', INDETERMINATE) -entry = express_getattr(IfcPipeFittingTypeEnum, 'ENTRY', INDETERMINATE) -exit = express_getattr(IfcPipeFittingTypeEnum, 'EXIT', INDETERMINATE) -junction = express_getattr(IfcPipeFittingTypeEnum, 'JUNCTION', INDETERMINATE) -obstruction = express_getattr(IfcPipeFittingTypeEnum, 'OBSTRUCTION', INDETERMINATE) -transition = express_getattr(IfcPipeFittingTypeEnum, 'TRANSITION', INDETERMINATE) -userdefined = express_getattr(IfcPipeFittingTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPipeFittingTypeEnum, 'NOTDEFINED', INDETERMINATE) +bend = IfcPipeFittingTypeEnum.BEND +connector = IfcPipeFittingTypeEnum.CONNECTOR +entry = IfcPipeFittingTypeEnum.ENTRY +exit = IfcPipeFittingTypeEnum.EXIT +junction = IfcPipeFittingTypeEnum.JUNCTION +obstruction = IfcPipeFittingTypeEnum.OBSTRUCTION +transition = IfcPipeFittingTypeEnum.TRANSITION +userdefined = IfcPipeFittingTypeEnum.USERDEFINED +notdefined = IfcPipeFittingTypeEnum.NOTDEFINED IfcPipeSegmentTypeEnum = enum_namespace() -culvert = express_getattr(IfcPipeSegmentTypeEnum, 'CULVERT', INDETERMINATE) -flexiblesegment = express_getattr(IfcPipeSegmentTypeEnum, 'FLEXIBLESEGMENT', INDETERMINATE) -rigidsegment = express_getattr(IfcPipeSegmentTypeEnum, 'RIGIDSEGMENT', INDETERMINATE) -gutter = express_getattr(IfcPipeSegmentTypeEnum, 'GUTTER', INDETERMINATE) -spool = express_getattr(IfcPipeSegmentTypeEnum, 'SPOOL', INDETERMINATE) -userdefined = express_getattr(IfcPipeSegmentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPipeSegmentTypeEnum, 'NOTDEFINED', INDETERMINATE) +culvert = IfcPipeSegmentTypeEnum.CULVERT +flexiblesegment = IfcPipeSegmentTypeEnum.FLEXIBLESEGMENT +rigidsegment = IfcPipeSegmentTypeEnum.RIGIDSEGMENT +gutter = IfcPipeSegmentTypeEnum.GUTTER +spool = IfcPipeSegmentTypeEnum.SPOOL +userdefined = IfcPipeSegmentTypeEnum.USERDEFINED +notdefined = IfcPipeSegmentTypeEnum.NOTDEFINED IfcPlateTypeEnum = enum_namespace() -curtain_panel = express_getattr(IfcPlateTypeEnum, 'CURTAIN_PANEL', INDETERMINATE) -sheet = express_getattr(IfcPlateTypeEnum, 'SHEET', INDETERMINATE) -flange_plate = express_getattr(IfcPlateTypeEnum, 'FLANGE_PLATE', INDETERMINATE) -web_plate = express_getattr(IfcPlateTypeEnum, 'WEB_PLATE', INDETERMINATE) -stiffener_plate = express_getattr(IfcPlateTypeEnum, 'STIFFENER_PLATE', INDETERMINATE) -gusset_plate = express_getattr(IfcPlateTypeEnum, 'GUSSET_PLATE', INDETERMINATE) -cover_plate = express_getattr(IfcPlateTypeEnum, 'COVER_PLATE', INDETERMINATE) -splice_plate = express_getattr(IfcPlateTypeEnum, 'SPLICE_PLATE', INDETERMINATE) -base_plate = express_getattr(IfcPlateTypeEnum, 'BASE_PLATE', INDETERMINATE) -userdefined = express_getattr(IfcPlateTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPlateTypeEnum, 'NOTDEFINED', INDETERMINATE) +curtain_panel = IfcPlateTypeEnum.CURTAIN_PANEL +sheet = IfcPlateTypeEnum.SHEET +flange_plate = IfcPlateTypeEnum.FLANGE_PLATE +web_plate = IfcPlateTypeEnum.WEB_PLATE +stiffener_plate = IfcPlateTypeEnum.STIFFENER_PLATE +gusset_plate = IfcPlateTypeEnum.GUSSET_PLATE +cover_plate = IfcPlateTypeEnum.COVER_PLATE +splice_plate = IfcPlateTypeEnum.SPLICE_PLATE +base_plate = IfcPlateTypeEnum.BASE_PLATE +userdefined = IfcPlateTypeEnum.USERDEFINED +notdefined = IfcPlateTypeEnum.NOTDEFINED IfcPreferredSurfaceCurveRepresentation = enum_namespace() -curve3d = express_getattr(IfcPreferredSurfaceCurveRepresentation, 'CURVE3D', INDETERMINATE) -pcurve_s1 = express_getattr(IfcPreferredSurfaceCurveRepresentation, 'PCURVE_S1', INDETERMINATE) -pcurve_s2 = express_getattr(IfcPreferredSurfaceCurveRepresentation, 'PCURVE_S2', INDETERMINATE) +curve3d = IfcPreferredSurfaceCurveRepresentation.CURVE3D +pcurve_s1 = IfcPreferredSurfaceCurveRepresentation.PCURVE_S1 +pcurve_s2 = IfcPreferredSurfaceCurveRepresentation.PCURVE_S2 IfcProcedureTypeEnum = enum_namespace() -advice_caution = express_getattr(IfcProcedureTypeEnum, 'ADVICE_CAUTION', INDETERMINATE) -advice_note = express_getattr(IfcProcedureTypeEnum, 'ADVICE_NOTE', INDETERMINATE) -advice_warning = express_getattr(IfcProcedureTypeEnum, 'ADVICE_WARNING', INDETERMINATE) -calibration = express_getattr(IfcProcedureTypeEnum, 'CALIBRATION', INDETERMINATE) -diagnostic = express_getattr(IfcProcedureTypeEnum, 'DIAGNOSTIC', INDETERMINATE) -shutdown = express_getattr(IfcProcedureTypeEnum, 'SHUTDOWN', INDETERMINATE) -startup = express_getattr(IfcProcedureTypeEnum, 'STARTUP', INDETERMINATE) -userdefined = express_getattr(IfcProcedureTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcProcedureTypeEnum, 'NOTDEFINED', INDETERMINATE) +advice_caution = IfcProcedureTypeEnum.ADVICE_CAUTION +advice_note = IfcProcedureTypeEnum.ADVICE_NOTE +advice_warning = IfcProcedureTypeEnum.ADVICE_WARNING +calibration = IfcProcedureTypeEnum.CALIBRATION +diagnostic = IfcProcedureTypeEnum.DIAGNOSTIC +shutdown = IfcProcedureTypeEnum.SHUTDOWN +startup = IfcProcedureTypeEnum.STARTUP +userdefined = IfcProcedureTypeEnum.USERDEFINED +notdefined = IfcProcedureTypeEnum.NOTDEFINED IfcProfileTypeEnum = enum_namespace() -curve = express_getattr(IfcProfileTypeEnum, 'CURVE', INDETERMINATE) -area = express_getattr(IfcProfileTypeEnum, 'AREA', INDETERMINATE) +curve = IfcProfileTypeEnum.CURVE +area = IfcProfileTypeEnum.AREA IfcProjectOrderTypeEnum = enum_namespace() -changeorder = express_getattr(IfcProjectOrderTypeEnum, 'CHANGEORDER', INDETERMINATE) -maintenanceworkorder = express_getattr(IfcProjectOrderTypeEnum, 'MAINTENANCEWORKORDER', INDETERMINATE) -moveorder = express_getattr(IfcProjectOrderTypeEnum, 'MOVEORDER', INDETERMINATE) -purchaseorder = express_getattr(IfcProjectOrderTypeEnum, 'PURCHASEORDER', INDETERMINATE) -workorder = express_getattr(IfcProjectOrderTypeEnum, 'WORKORDER', INDETERMINATE) -userdefined = express_getattr(IfcProjectOrderTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcProjectOrderTypeEnum, 'NOTDEFINED', INDETERMINATE) +changeorder = IfcProjectOrderTypeEnum.CHANGEORDER +maintenanceworkorder = IfcProjectOrderTypeEnum.MAINTENANCEWORKORDER +moveorder = IfcProjectOrderTypeEnum.MOVEORDER +purchaseorder = IfcProjectOrderTypeEnum.PURCHASEORDER +workorder = IfcProjectOrderTypeEnum.WORKORDER +userdefined = IfcProjectOrderTypeEnum.USERDEFINED +notdefined = IfcProjectOrderTypeEnum.NOTDEFINED IfcProjectedOrTrueLengthEnum = enum_namespace() -projected_length = express_getattr(IfcProjectedOrTrueLengthEnum, 'PROJECTED_LENGTH', INDETERMINATE) -true_length = express_getattr(IfcProjectedOrTrueLengthEnum, 'TRUE_LENGTH', INDETERMINATE) +projected_length = IfcProjectedOrTrueLengthEnum.PROJECTED_LENGTH +true_length = IfcProjectedOrTrueLengthEnum.TRUE_LENGTH IfcProjectionElementTypeEnum = enum_namespace() -blister = express_getattr(IfcProjectionElementTypeEnum, 'BLISTER', INDETERMINATE) -deviator = express_getattr(IfcProjectionElementTypeEnum, 'DEVIATOR', INDETERMINATE) -userdefined = express_getattr(IfcProjectionElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcProjectionElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +blister = IfcProjectionElementTypeEnum.BLISTER +deviator = IfcProjectionElementTypeEnum.DEVIATOR +userdefined = IfcProjectionElementTypeEnum.USERDEFINED +notdefined = IfcProjectionElementTypeEnum.NOTDEFINED IfcPropertySetTemplateTypeEnum = enum_namespace() -pset_typedrivenonly = express_getattr(IfcPropertySetTemplateTypeEnum, 'PSET_TYPEDRIVENONLY', INDETERMINATE) -pset_typedrivenoverride = express_getattr(IfcPropertySetTemplateTypeEnum, 'PSET_TYPEDRIVENOVERRIDE', INDETERMINATE) -pset_occurrencedriven = express_getattr(IfcPropertySetTemplateTypeEnum, 'PSET_OCCURRENCEDRIVEN', INDETERMINATE) -pset_performancedriven = express_getattr(IfcPropertySetTemplateTypeEnum, 'PSET_PERFORMANCEDRIVEN', INDETERMINATE) -qto_typedrivenonly = express_getattr(IfcPropertySetTemplateTypeEnum, 'QTO_TYPEDRIVENONLY', INDETERMINATE) -qto_typedrivenoverride = express_getattr(IfcPropertySetTemplateTypeEnum, 'QTO_TYPEDRIVENOVERRIDE', INDETERMINATE) -qto_occurrencedriven = express_getattr(IfcPropertySetTemplateTypeEnum, 'QTO_OCCURRENCEDRIVEN', INDETERMINATE) -notdefined = express_getattr(IfcPropertySetTemplateTypeEnum, 'NOTDEFINED', INDETERMINATE) +pset_typedrivenonly = IfcPropertySetTemplateTypeEnum.PSET_TYPEDRIVENONLY +pset_typedrivenoverride = IfcPropertySetTemplateTypeEnum.PSET_TYPEDRIVENOVERRIDE +pset_occurrencedriven = IfcPropertySetTemplateTypeEnum.PSET_OCCURRENCEDRIVEN +pset_performancedriven = IfcPropertySetTemplateTypeEnum.PSET_PERFORMANCEDRIVEN +qto_typedrivenonly = IfcPropertySetTemplateTypeEnum.QTO_TYPEDRIVENONLY +qto_typedrivenoverride = IfcPropertySetTemplateTypeEnum.QTO_TYPEDRIVENOVERRIDE +qto_occurrencedriven = IfcPropertySetTemplateTypeEnum.QTO_OCCURRENCEDRIVEN +notdefined = IfcPropertySetTemplateTypeEnum.NOTDEFINED IfcProtectiveDeviceTrippingUnitTypeEnum = enum_namespace() -electronic = express_getattr(IfcProtectiveDeviceTrippingUnitTypeEnum, 'ELECTRONIC', INDETERMINATE) -electromagnetic = express_getattr(IfcProtectiveDeviceTrippingUnitTypeEnum, 'ELECTROMAGNETIC', INDETERMINATE) -residualcurrent = express_getattr(IfcProtectiveDeviceTrippingUnitTypeEnum, 'RESIDUALCURRENT', INDETERMINATE) -thermal = express_getattr(IfcProtectiveDeviceTrippingUnitTypeEnum, 'THERMAL', INDETERMINATE) -userdefined = express_getattr(IfcProtectiveDeviceTrippingUnitTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcProtectiveDeviceTrippingUnitTypeEnum, 'NOTDEFINED', INDETERMINATE) +electronic = IfcProtectiveDeviceTrippingUnitTypeEnum.ELECTRONIC +electromagnetic = IfcProtectiveDeviceTrippingUnitTypeEnum.ELECTROMAGNETIC +residualcurrent = IfcProtectiveDeviceTrippingUnitTypeEnum.RESIDUALCURRENT +thermal = IfcProtectiveDeviceTrippingUnitTypeEnum.THERMAL +userdefined = IfcProtectiveDeviceTrippingUnitTypeEnum.USERDEFINED +notdefined = IfcProtectiveDeviceTrippingUnitTypeEnum.NOTDEFINED IfcProtectiveDeviceTypeEnum = enum_namespace() -circuitbreaker = express_getattr(IfcProtectiveDeviceTypeEnum, 'CIRCUITBREAKER', INDETERMINATE) -earthleakagecircuitbreaker = express_getattr(IfcProtectiveDeviceTypeEnum, 'EARTHLEAKAGECIRCUITBREAKER', INDETERMINATE) -earthingswitch = express_getattr(IfcProtectiveDeviceTypeEnum, 'EARTHINGSWITCH', INDETERMINATE) -fusedisconnector = express_getattr(IfcProtectiveDeviceTypeEnum, 'FUSEDISCONNECTOR', INDETERMINATE) -residualcurrentcircuitbreaker = express_getattr(IfcProtectiveDeviceTypeEnum, 'RESIDUALCURRENTCIRCUITBREAKER', INDETERMINATE) -residualcurrentswitch = express_getattr(IfcProtectiveDeviceTypeEnum, 'RESIDUALCURRENTSWITCH', INDETERMINATE) -varistor = express_getattr(IfcProtectiveDeviceTypeEnum, 'VARISTOR', INDETERMINATE) -anti_arcing_device = express_getattr(IfcProtectiveDeviceTypeEnum, 'ANTI_ARCING_DEVICE', INDETERMINATE) -sparkgap = express_getattr(IfcProtectiveDeviceTypeEnum, 'SPARKGAP', INDETERMINATE) -voltagelimiter = express_getattr(IfcProtectiveDeviceTypeEnum, 'VOLTAGELIMITER', INDETERMINATE) -userdefined = express_getattr(IfcProtectiveDeviceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcProtectiveDeviceTypeEnum, 'NOTDEFINED', INDETERMINATE) +circuitbreaker = IfcProtectiveDeviceTypeEnum.CIRCUITBREAKER +earthleakagecircuitbreaker = IfcProtectiveDeviceTypeEnum.EARTHLEAKAGECIRCUITBREAKER +earthingswitch = IfcProtectiveDeviceTypeEnum.EARTHINGSWITCH +fusedisconnector = IfcProtectiveDeviceTypeEnum.FUSEDISCONNECTOR +residualcurrentcircuitbreaker = IfcProtectiveDeviceTypeEnum.RESIDUALCURRENTCIRCUITBREAKER +residualcurrentswitch = IfcProtectiveDeviceTypeEnum.RESIDUALCURRENTSWITCH +varistor = IfcProtectiveDeviceTypeEnum.VARISTOR +anti_arcing_device = IfcProtectiveDeviceTypeEnum.ANTI_ARCING_DEVICE +sparkgap = IfcProtectiveDeviceTypeEnum.SPARKGAP +voltagelimiter = IfcProtectiveDeviceTypeEnum.VOLTAGELIMITER +userdefined = IfcProtectiveDeviceTypeEnum.USERDEFINED +notdefined = IfcProtectiveDeviceTypeEnum.NOTDEFINED IfcPumpTypeEnum = enum_namespace() -circulator = express_getattr(IfcPumpTypeEnum, 'CIRCULATOR', INDETERMINATE) -endsuction = express_getattr(IfcPumpTypeEnum, 'ENDSUCTION', INDETERMINATE) -splitcase = express_getattr(IfcPumpTypeEnum, 'SPLITCASE', INDETERMINATE) -submersiblepump = express_getattr(IfcPumpTypeEnum, 'SUBMERSIBLEPUMP', INDETERMINATE) -sumppump = express_getattr(IfcPumpTypeEnum, 'SUMPPUMP', INDETERMINATE) -verticalinline = express_getattr(IfcPumpTypeEnum, 'VERTICALINLINE', INDETERMINATE) -verticalturbine = express_getattr(IfcPumpTypeEnum, 'VERTICALTURBINE', INDETERMINATE) -userdefined = express_getattr(IfcPumpTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPumpTypeEnum, 'NOTDEFINED', INDETERMINATE) +circulator = IfcPumpTypeEnum.CIRCULATOR +endsuction = IfcPumpTypeEnum.ENDSUCTION +splitcase = IfcPumpTypeEnum.SPLITCASE +submersiblepump = IfcPumpTypeEnum.SUBMERSIBLEPUMP +sumppump = IfcPumpTypeEnum.SUMPPUMP +verticalinline = IfcPumpTypeEnum.VERTICALINLINE +verticalturbine = IfcPumpTypeEnum.VERTICALTURBINE +userdefined = IfcPumpTypeEnum.USERDEFINED +notdefined = IfcPumpTypeEnum.NOTDEFINED IfcRailTypeEnum = enum_namespace() -rackrail = express_getattr(IfcRailTypeEnum, 'RACKRAIL', INDETERMINATE) -blade = express_getattr(IfcRailTypeEnum, 'BLADE', INDETERMINATE) -guardrail = express_getattr(IfcRailTypeEnum, 'GUARDRAIL', INDETERMINATE) -stockrail = express_getattr(IfcRailTypeEnum, 'STOCKRAIL', INDETERMINATE) -checkrail = express_getattr(IfcRailTypeEnum, 'CHECKRAIL', INDETERMINATE) -rail = express_getattr(IfcRailTypeEnum, 'RAIL', INDETERMINATE) -userdefined = express_getattr(IfcRailTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcRailTypeEnum, 'NOTDEFINED', INDETERMINATE) +rackrail = IfcRailTypeEnum.RACKRAIL +blade = IfcRailTypeEnum.BLADE +guardrail = IfcRailTypeEnum.GUARDRAIL +stockrail = IfcRailTypeEnum.STOCKRAIL +checkrail = IfcRailTypeEnum.CHECKRAIL +rail = IfcRailTypeEnum.RAIL +userdefined = IfcRailTypeEnum.USERDEFINED +notdefined = IfcRailTypeEnum.NOTDEFINED IfcRailingTypeEnum = enum_namespace() -handrail = express_getattr(IfcRailingTypeEnum, 'HANDRAIL', INDETERMINATE) -guardrail = express_getattr(IfcRailingTypeEnum, 'GUARDRAIL', INDETERMINATE) -balustrade = express_getattr(IfcRailingTypeEnum, 'BALUSTRADE', INDETERMINATE) -fence = express_getattr(IfcRailingTypeEnum, 'FENCE', INDETERMINATE) -userdefined = express_getattr(IfcRailingTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcRailingTypeEnum, 'NOTDEFINED', INDETERMINATE) +handrail = IfcRailingTypeEnum.HANDRAIL +guardrail = IfcRailingTypeEnum.GUARDRAIL +balustrade = IfcRailingTypeEnum.BALUSTRADE +fence = IfcRailingTypeEnum.FENCE +userdefined = IfcRailingTypeEnum.USERDEFINED +notdefined = IfcRailingTypeEnum.NOTDEFINED IfcRailwayPartTypeEnum = enum_namespace() -trackstructure = express_getattr(IfcRailwayPartTypeEnum, 'TRACKSTRUCTURE', INDETERMINATE) -trackstructurepart = express_getattr(IfcRailwayPartTypeEnum, 'TRACKSTRUCTUREPART', INDETERMINATE) -linesidestructurepart = express_getattr(IfcRailwayPartTypeEnum, 'LINESIDESTRUCTUREPART', INDETERMINATE) -dilatationsuperstructure = express_getattr(IfcRailwayPartTypeEnum, 'DILATATIONSUPERSTRUCTURE', INDETERMINATE) -plaintracksupestructure = express_getattr(IfcRailwayPartTypeEnum, 'PLAINTRACKSUPESTRUCTURE', INDETERMINATE) -linesidestructure = express_getattr(IfcRailwayPartTypeEnum, 'LINESIDESTRUCTURE', INDETERMINATE) -superstructure = express_getattr(IfcRailwayPartTypeEnum, 'SUPERSTRUCTURE', INDETERMINATE) -turnoutsuperstructure = express_getattr(IfcRailwayPartTypeEnum, 'TURNOUTSUPERSTRUCTURE', INDETERMINATE) -userdefined = express_getattr(IfcRailwayPartTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcRailwayPartTypeEnum, 'NOTDEFINED', INDETERMINATE) +trackstructure = IfcRailwayPartTypeEnum.TRACKSTRUCTURE +trackstructurepart = IfcRailwayPartTypeEnum.TRACKSTRUCTUREPART +linesidestructurepart = IfcRailwayPartTypeEnum.LINESIDESTRUCTUREPART +dilatationsuperstructure = IfcRailwayPartTypeEnum.DILATATIONSUPERSTRUCTURE +plaintracksupestructure = IfcRailwayPartTypeEnum.PLAINTRACKSUPESTRUCTURE +linesidestructure = IfcRailwayPartTypeEnum.LINESIDESTRUCTURE +superstructure = IfcRailwayPartTypeEnum.SUPERSTRUCTURE +turnoutsuperstructure = IfcRailwayPartTypeEnum.TURNOUTSUPERSTRUCTURE +userdefined = IfcRailwayPartTypeEnum.USERDEFINED +notdefined = IfcRailwayPartTypeEnum.NOTDEFINED IfcRampFlightTypeEnum = enum_namespace() -straight = express_getattr(IfcRampFlightTypeEnum, 'STRAIGHT', INDETERMINATE) -spiral = express_getattr(IfcRampFlightTypeEnum, 'SPIRAL', INDETERMINATE) -userdefined = express_getattr(IfcRampFlightTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcRampFlightTypeEnum, 'NOTDEFINED', INDETERMINATE) +straight = IfcRampFlightTypeEnum.STRAIGHT +spiral = IfcRampFlightTypeEnum.SPIRAL +userdefined = IfcRampFlightTypeEnum.USERDEFINED +notdefined = IfcRampFlightTypeEnum.NOTDEFINED IfcRampTypeEnum = enum_namespace() -straight_run_ramp = express_getattr(IfcRampTypeEnum, 'STRAIGHT_RUN_RAMP', INDETERMINATE) -two_straight_run_ramp = express_getattr(IfcRampTypeEnum, 'TWO_STRAIGHT_RUN_RAMP', INDETERMINATE) -quarter_turn_ramp = express_getattr(IfcRampTypeEnum, 'QUARTER_TURN_RAMP', INDETERMINATE) -two_quarter_turn_ramp = express_getattr(IfcRampTypeEnum, 'TWO_QUARTER_TURN_RAMP', INDETERMINATE) -half_turn_ramp = express_getattr(IfcRampTypeEnum, 'HALF_TURN_RAMP', INDETERMINATE) -spiral_ramp = express_getattr(IfcRampTypeEnum, 'SPIRAL_RAMP', INDETERMINATE) -userdefined = express_getattr(IfcRampTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcRampTypeEnum, 'NOTDEFINED', INDETERMINATE) +straight_run_ramp = IfcRampTypeEnum.STRAIGHT_RUN_RAMP +two_straight_run_ramp = IfcRampTypeEnum.TWO_STRAIGHT_RUN_RAMP +quarter_turn_ramp = IfcRampTypeEnum.QUARTER_TURN_RAMP +two_quarter_turn_ramp = IfcRampTypeEnum.TWO_QUARTER_TURN_RAMP +half_turn_ramp = IfcRampTypeEnum.HALF_TURN_RAMP +spiral_ramp = IfcRampTypeEnum.SPIRAL_RAMP +userdefined = IfcRampTypeEnum.USERDEFINED +notdefined = IfcRampTypeEnum.NOTDEFINED IfcRecurrenceTypeEnum = enum_namespace() -daily = express_getattr(IfcRecurrenceTypeEnum, 'DAILY', INDETERMINATE) -weekly = express_getattr(IfcRecurrenceTypeEnum, 'WEEKLY', INDETERMINATE) -monthly_by_day_of_month = express_getattr(IfcRecurrenceTypeEnum, 'MONTHLY_BY_DAY_OF_MONTH', INDETERMINATE) -monthly_by_position = express_getattr(IfcRecurrenceTypeEnum, 'MONTHLY_BY_POSITION', INDETERMINATE) -by_day_count = express_getattr(IfcRecurrenceTypeEnum, 'BY_DAY_COUNT', INDETERMINATE) -by_weekday_count = express_getattr(IfcRecurrenceTypeEnum, 'BY_WEEKDAY_COUNT', INDETERMINATE) -yearly_by_day_of_month = express_getattr(IfcRecurrenceTypeEnum, 'YEARLY_BY_DAY_OF_MONTH', INDETERMINATE) -yearly_by_position = express_getattr(IfcRecurrenceTypeEnum, 'YEARLY_BY_POSITION', INDETERMINATE) +daily = IfcRecurrenceTypeEnum.DAILY +weekly = IfcRecurrenceTypeEnum.WEEKLY +monthly_by_day_of_month = IfcRecurrenceTypeEnum.MONTHLY_BY_DAY_OF_MONTH +monthly_by_position = IfcRecurrenceTypeEnum.MONTHLY_BY_POSITION +by_day_count = IfcRecurrenceTypeEnum.BY_DAY_COUNT +by_weekday_count = IfcRecurrenceTypeEnum.BY_WEEKDAY_COUNT +yearly_by_day_of_month = IfcRecurrenceTypeEnum.YEARLY_BY_DAY_OF_MONTH +yearly_by_position = IfcRecurrenceTypeEnum.YEARLY_BY_POSITION IfcReferentTypeEnum = enum_namespace() -kilopoint = express_getattr(IfcReferentTypeEnum, 'KILOPOINT', INDETERMINATE) -milepoint = express_getattr(IfcReferentTypeEnum, 'MILEPOINT', INDETERMINATE) -station = express_getattr(IfcReferentTypeEnum, 'STATION', INDETERMINATE) -referencemarker = express_getattr(IfcReferentTypeEnum, 'REFERENCEMARKER', INDETERMINATE) -userdefined = express_getattr(IfcReferentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcReferentTypeEnum, 'NOTDEFINED', INDETERMINATE) +kilopoint = IfcReferentTypeEnum.KILOPOINT +milepoint = IfcReferentTypeEnum.MILEPOINT +station = IfcReferentTypeEnum.STATION +referencemarker = IfcReferentTypeEnum.REFERENCEMARKER +userdefined = IfcReferentTypeEnum.USERDEFINED +notdefined = IfcReferentTypeEnum.NOTDEFINED IfcReflectanceMethodEnum = enum_namespace() -blinn = express_getattr(IfcReflectanceMethodEnum, 'BLINN', INDETERMINATE) -flat = express_getattr(IfcReflectanceMethodEnum, 'FLAT', INDETERMINATE) -glass = express_getattr(IfcReflectanceMethodEnum, 'GLASS', INDETERMINATE) -matt = express_getattr(IfcReflectanceMethodEnum, 'MATT', INDETERMINATE) -metal = express_getattr(IfcReflectanceMethodEnum, 'METAL', INDETERMINATE) -mirror = express_getattr(IfcReflectanceMethodEnum, 'MIRROR', INDETERMINATE) -phong = express_getattr(IfcReflectanceMethodEnum, 'PHONG', INDETERMINATE) -plastic = express_getattr(IfcReflectanceMethodEnum, 'PLASTIC', INDETERMINATE) -strauss = express_getattr(IfcReflectanceMethodEnum, 'STRAUSS', INDETERMINATE) -notdefined = express_getattr(IfcReflectanceMethodEnum, 'NOTDEFINED', INDETERMINATE) +blinn = IfcReflectanceMethodEnum.BLINN +flat = IfcReflectanceMethodEnum.FLAT +glass = IfcReflectanceMethodEnum.GLASS +matt = IfcReflectanceMethodEnum.MATT +metal = IfcReflectanceMethodEnum.METAL +mirror = IfcReflectanceMethodEnum.MIRROR +phong = IfcReflectanceMethodEnum.PHONG +plastic = IfcReflectanceMethodEnum.PLASTIC +strauss = IfcReflectanceMethodEnum.STRAUSS +notdefined = IfcReflectanceMethodEnum.NOTDEFINED IfcReinforcedSoilTypeEnum = enum_namespace() -surchargepreloaded = express_getattr(IfcReinforcedSoilTypeEnum, 'SURCHARGEPRELOADED', INDETERMINATE) -verticallydrained = express_getattr(IfcReinforcedSoilTypeEnum, 'VERTICALLYDRAINED', INDETERMINATE) -dynamicallycompacted = express_getattr(IfcReinforcedSoilTypeEnum, 'DYNAMICALLYCOMPACTED', INDETERMINATE) -replaced = express_getattr(IfcReinforcedSoilTypeEnum, 'REPLACED', INDETERMINATE) -rollercompacted = express_getattr(IfcReinforcedSoilTypeEnum, 'ROLLERCOMPACTED', INDETERMINATE) -grouted = express_getattr(IfcReinforcedSoilTypeEnum, 'GROUTED', INDETERMINATE) -userdefined = express_getattr(IfcReinforcedSoilTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcReinforcedSoilTypeEnum, 'NOTDEFINED', INDETERMINATE) +surchargepreloaded = IfcReinforcedSoilTypeEnum.SURCHARGEPRELOADED +verticallydrained = IfcReinforcedSoilTypeEnum.VERTICALLYDRAINED +dynamicallycompacted = IfcReinforcedSoilTypeEnum.DYNAMICALLYCOMPACTED +replaced = IfcReinforcedSoilTypeEnum.REPLACED +rollercompacted = IfcReinforcedSoilTypeEnum.ROLLERCOMPACTED +grouted = IfcReinforcedSoilTypeEnum.GROUTED +userdefined = IfcReinforcedSoilTypeEnum.USERDEFINED +notdefined = IfcReinforcedSoilTypeEnum.NOTDEFINED IfcReinforcingBarRoleEnum = enum_namespace() -main = express_getattr(IfcReinforcingBarRoleEnum, 'MAIN', INDETERMINATE) -shear = express_getattr(IfcReinforcingBarRoleEnum, 'SHEAR', INDETERMINATE) -ligature = express_getattr(IfcReinforcingBarRoleEnum, 'LIGATURE', INDETERMINATE) -stud = express_getattr(IfcReinforcingBarRoleEnum, 'STUD', INDETERMINATE) -punching = express_getattr(IfcReinforcingBarRoleEnum, 'PUNCHING', INDETERMINATE) -edge = express_getattr(IfcReinforcingBarRoleEnum, 'EDGE', INDETERMINATE) -ring = express_getattr(IfcReinforcingBarRoleEnum, 'RING', INDETERMINATE) -anchoring = express_getattr(IfcReinforcingBarRoleEnum, 'ANCHORING', INDETERMINATE) -userdefined = express_getattr(IfcReinforcingBarRoleEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcReinforcingBarRoleEnum, 'NOTDEFINED', INDETERMINATE) +main = IfcReinforcingBarRoleEnum.MAIN +shear = IfcReinforcingBarRoleEnum.SHEAR +ligature = IfcReinforcingBarRoleEnum.LIGATURE +stud = IfcReinforcingBarRoleEnum.STUD +punching = IfcReinforcingBarRoleEnum.PUNCHING +edge = IfcReinforcingBarRoleEnum.EDGE +ring = IfcReinforcingBarRoleEnum.RING +anchoring = IfcReinforcingBarRoleEnum.ANCHORING +userdefined = IfcReinforcingBarRoleEnum.USERDEFINED +notdefined = IfcReinforcingBarRoleEnum.NOTDEFINED IfcReinforcingBarSurfaceEnum = enum_namespace() -plain = express_getattr(IfcReinforcingBarSurfaceEnum, 'PLAIN', INDETERMINATE) -textured = express_getattr(IfcReinforcingBarSurfaceEnum, 'TEXTURED', INDETERMINATE) +plain = IfcReinforcingBarSurfaceEnum.PLAIN +textured = IfcReinforcingBarSurfaceEnum.TEXTURED IfcReinforcingBarTypeEnum = enum_namespace() -anchoring = express_getattr(IfcReinforcingBarTypeEnum, 'ANCHORING', INDETERMINATE) -edge = express_getattr(IfcReinforcingBarTypeEnum, 'EDGE', INDETERMINATE) -ligature = express_getattr(IfcReinforcingBarTypeEnum, 'LIGATURE', INDETERMINATE) -main = express_getattr(IfcReinforcingBarTypeEnum, 'MAIN', INDETERMINATE) -punching = express_getattr(IfcReinforcingBarTypeEnum, 'PUNCHING', INDETERMINATE) -ring = express_getattr(IfcReinforcingBarTypeEnum, 'RING', INDETERMINATE) -shear = express_getattr(IfcReinforcingBarTypeEnum, 'SHEAR', INDETERMINATE) -stud = express_getattr(IfcReinforcingBarTypeEnum, 'STUD', INDETERMINATE) -spacebar = express_getattr(IfcReinforcingBarTypeEnum, 'SPACEBAR', INDETERMINATE) -userdefined = express_getattr(IfcReinforcingBarTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcReinforcingBarTypeEnum, 'NOTDEFINED', INDETERMINATE) +anchoring = IfcReinforcingBarTypeEnum.ANCHORING +edge = IfcReinforcingBarTypeEnum.EDGE +ligature = IfcReinforcingBarTypeEnum.LIGATURE +main = IfcReinforcingBarTypeEnum.MAIN +punching = IfcReinforcingBarTypeEnum.PUNCHING +ring = IfcReinforcingBarTypeEnum.RING +shear = IfcReinforcingBarTypeEnum.SHEAR +stud = IfcReinforcingBarTypeEnum.STUD +spacebar = IfcReinforcingBarTypeEnum.SPACEBAR +userdefined = IfcReinforcingBarTypeEnum.USERDEFINED +notdefined = IfcReinforcingBarTypeEnum.NOTDEFINED IfcReinforcingMeshTypeEnum = enum_namespace() -userdefined = express_getattr(IfcReinforcingMeshTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcReinforcingMeshTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcReinforcingMeshTypeEnum.USERDEFINED +notdefined = IfcReinforcingMeshTypeEnum.NOTDEFINED IfcRoadPartTypeEnum = enum_namespace() -roadsidepart = express_getattr(IfcRoadPartTypeEnum, 'ROADSIDEPART', INDETERMINATE) -bus_stop = express_getattr(IfcRoadPartTypeEnum, 'BUS_STOP', INDETERMINATE) -hardshoulder = express_getattr(IfcRoadPartTypeEnum, 'HARDSHOULDER', INDETERMINATE) -intersection = express_getattr(IfcRoadPartTypeEnum, 'INTERSECTION', INDETERMINATE) -passingbay = express_getattr(IfcRoadPartTypeEnum, 'PASSINGBAY', INDETERMINATE) -roadwayplateau = express_getattr(IfcRoadPartTypeEnum, 'ROADWAYPLATEAU', INDETERMINATE) -roadside = express_getattr(IfcRoadPartTypeEnum, 'ROADSIDE', INDETERMINATE) -refugeisland = express_getattr(IfcRoadPartTypeEnum, 'REFUGEISLAND', INDETERMINATE) -tollplaza = express_getattr(IfcRoadPartTypeEnum, 'TOLLPLAZA', INDETERMINATE) -centralreserve = express_getattr(IfcRoadPartTypeEnum, 'CENTRALRESERVE', INDETERMINATE) -sidewalk = express_getattr(IfcRoadPartTypeEnum, 'SIDEWALK', INDETERMINATE) -parkingbay = express_getattr(IfcRoadPartTypeEnum, 'PARKINGBAY', INDETERMINATE) -railwaycrossing = express_getattr(IfcRoadPartTypeEnum, 'RAILWAYCROSSING', INDETERMINATE) -pedestrian_crossing = express_getattr(IfcRoadPartTypeEnum, 'PEDESTRIAN_CROSSING', INDETERMINATE) -softshoulder = express_getattr(IfcRoadPartTypeEnum, 'SOFTSHOULDER', INDETERMINATE) -bicyclecrossing = express_getattr(IfcRoadPartTypeEnum, 'BICYCLECROSSING', INDETERMINATE) -centralisland = express_getattr(IfcRoadPartTypeEnum, 'CENTRALISLAND', INDETERMINATE) -shoulder = express_getattr(IfcRoadPartTypeEnum, 'SHOULDER', INDETERMINATE) -trafficlane = express_getattr(IfcRoadPartTypeEnum, 'TRAFFICLANE', INDETERMINATE) -roadsegment = express_getattr(IfcRoadPartTypeEnum, 'ROADSEGMENT', INDETERMINATE) -roundabout = express_getattr(IfcRoadPartTypeEnum, 'ROUNDABOUT', INDETERMINATE) -layby = express_getattr(IfcRoadPartTypeEnum, 'LAYBY', INDETERMINATE) -carriageway = express_getattr(IfcRoadPartTypeEnum, 'CARRIAGEWAY', INDETERMINATE) -trafficisland = express_getattr(IfcRoadPartTypeEnum, 'TRAFFICISLAND', INDETERMINATE) -userdefined = express_getattr(IfcRoadPartTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcRoadPartTypeEnum, 'NOTDEFINED', INDETERMINATE) +roadsidepart = IfcRoadPartTypeEnum.ROADSIDEPART +bus_stop = IfcRoadPartTypeEnum.BUS_STOP +hardshoulder = IfcRoadPartTypeEnum.HARDSHOULDER +intersection = IfcRoadPartTypeEnum.INTERSECTION +passingbay = IfcRoadPartTypeEnum.PASSINGBAY +roadwayplateau = IfcRoadPartTypeEnum.ROADWAYPLATEAU +roadside = IfcRoadPartTypeEnum.ROADSIDE +refugeisland = IfcRoadPartTypeEnum.REFUGEISLAND +tollplaza = IfcRoadPartTypeEnum.TOLLPLAZA +centralreserve = IfcRoadPartTypeEnum.CENTRALRESERVE +sidewalk = IfcRoadPartTypeEnum.SIDEWALK +parkingbay = IfcRoadPartTypeEnum.PARKINGBAY +railwaycrossing = IfcRoadPartTypeEnum.RAILWAYCROSSING +pedestrian_crossing = IfcRoadPartTypeEnum.PEDESTRIAN_CROSSING +softshoulder = IfcRoadPartTypeEnum.SOFTSHOULDER +bicyclecrossing = IfcRoadPartTypeEnum.BICYCLECROSSING +centralisland = IfcRoadPartTypeEnum.CENTRALISLAND +shoulder = IfcRoadPartTypeEnum.SHOULDER +trafficlane = IfcRoadPartTypeEnum.TRAFFICLANE +roadsegment = IfcRoadPartTypeEnum.ROADSEGMENT +roundabout = IfcRoadPartTypeEnum.ROUNDABOUT +layby = IfcRoadPartTypeEnum.LAYBY +carriageway = IfcRoadPartTypeEnum.CARRIAGEWAY +trafficisland = IfcRoadPartTypeEnum.TRAFFICISLAND +userdefined = IfcRoadPartTypeEnum.USERDEFINED +notdefined = IfcRoadPartTypeEnum.NOTDEFINED IfcRoleEnum = enum_namespace() -supplier = express_getattr(IfcRoleEnum, 'SUPPLIER', INDETERMINATE) -manufacturer = express_getattr(IfcRoleEnum, 'MANUFACTURER', INDETERMINATE) -contractor = express_getattr(IfcRoleEnum, 'CONTRACTOR', INDETERMINATE) -subcontractor = express_getattr(IfcRoleEnum, 'SUBCONTRACTOR', INDETERMINATE) -architect = express_getattr(IfcRoleEnum, 'ARCHITECT', INDETERMINATE) -structuralengineer = express_getattr(IfcRoleEnum, 'STRUCTURALENGINEER', INDETERMINATE) -costengineer = express_getattr(IfcRoleEnum, 'COSTENGINEER', INDETERMINATE) -client = express_getattr(IfcRoleEnum, 'CLIENT', INDETERMINATE) -buildingowner = express_getattr(IfcRoleEnum, 'BUILDINGOWNER', INDETERMINATE) -buildingoperator = express_getattr(IfcRoleEnum, 'BUILDINGOPERATOR', INDETERMINATE) -mechanicalengineer = express_getattr(IfcRoleEnum, 'MECHANICALENGINEER', INDETERMINATE) -electricalengineer = express_getattr(IfcRoleEnum, 'ELECTRICALENGINEER', INDETERMINATE) -projectmanager = express_getattr(IfcRoleEnum, 'PROJECTMANAGER', INDETERMINATE) -facilitiesmanager = express_getattr(IfcRoleEnum, 'FACILITIESMANAGER', INDETERMINATE) -civilengineer = express_getattr(IfcRoleEnum, 'CIVILENGINEER', INDETERMINATE) -commissioningengineer = express_getattr(IfcRoleEnum, 'COMMISSIONINGENGINEER', INDETERMINATE) -engineer = express_getattr(IfcRoleEnum, 'ENGINEER', INDETERMINATE) -owner = express_getattr(IfcRoleEnum, 'OWNER', INDETERMINATE) -consultant = express_getattr(IfcRoleEnum, 'CONSULTANT', INDETERMINATE) -constructionmanager = express_getattr(IfcRoleEnum, 'CONSTRUCTIONMANAGER', INDETERMINATE) -fieldconstructionmanager = express_getattr(IfcRoleEnum, 'FIELDCONSTRUCTIONMANAGER', INDETERMINATE) -reseller = express_getattr(IfcRoleEnum, 'RESELLER', INDETERMINATE) -userdefined = express_getattr(IfcRoleEnum, 'USERDEFINED', INDETERMINATE) +supplier = IfcRoleEnum.SUPPLIER +manufacturer = IfcRoleEnum.MANUFACTURER +contractor = IfcRoleEnum.CONTRACTOR +subcontractor = IfcRoleEnum.SUBCONTRACTOR +architect = IfcRoleEnum.ARCHITECT +structuralengineer = IfcRoleEnum.STRUCTURALENGINEER +costengineer = IfcRoleEnum.COSTENGINEER +client = IfcRoleEnum.CLIENT +buildingowner = IfcRoleEnum.BUILDINGOWNER +buildingoperator = IfcRoleEnum.BUILDINGOPERATOR +mechanicalengineer = IfcRoleEnum.MECHANICALENGINEER +electricalengineer = IfcRoleEnum.ELECTRICALENGINEER +projectmanager = IfcRoleEnum.PROJECTMANAGER +facilitiesmanager = IfcRoleEnum.FACILITIESMANAGER +civilengineer = IfcRoleEnum.CIVILENGINEER +commissioningengineer = IfcRoleEnum.COMMISSIONINGENGINEER +engineer = IfcRoleEnum.ENGINEER +owner = IfcRoleEnum.OWNER +consultant = IfcRoleEnum.CONSULTANT +constructionmanager = IfcRoleEnum.CONSTRUCTIONMANAGER +fieldconstructionmanager = IfcRoleEnum.FIELDCONSTRUCTIONMANAGER +reseller = IfcRoleEnum.RESELLER +userdefined = IfcRoleEnum.USERDEFINED IfcRoofTypeEnum = enum_namespace() -flat_roof = express_getattr(IfcRoofTypeEnum, 'FLAT_ROOF', INDETERMINATE) -shed_roof = express_getattr(IfcRoofTypeEnum, 'SHED_ROOF', INDETERMINATE) -gable_roof = express_getattr(IfcRoofTypeEnum, 'GABLE_ROOF', INDETERMINATE) -hip_roof = express_getattr(IfcRoofTypeEnum, 'HIP_ROOF', INDETERMINATE) -hipped_gable_roof = express_getattr(IfcRoofTypeEnum, 'HIPPED_GABLE_ROOF', INDETERMINATE) -gambrel_roof = express_getattr(IfcRoofTypeEnum, 'GAMBREL_ROOF', INDETERMINATE) -mansard_roof = express_getattr(IfcRoofTypeEnum, 'MANSARD_ROOF', INDETERMINATE) -barrel_roof = express_getattr(IfcRoofTypeEnum, 'BARREL_ROOF', INDETERMINATE) -rainbow_roof = express_getattr(IfcRoofTypeEnum, 'RAINBOW_ROOF', INDETERMINATE) -butterfly_roof = express_getattr(IfcRoofTypeEnum, 'BUTTERFLY_ROOF', INDETERMINATE) -pavilion_roof = express_getattr(IfcRoofTypeEnum, 'PAVILION_ROOF', INDETERMINATE) -dome_roof = express_getattr(IfcRoofTypeEnum, 'DOME_ROOF', INDETERMINATE) -freeform = express_getattr(IfcRoofTypeEnum, 'FREEFORM', INDETERMINATE) -userdefined = express_getattr(IfcRoofTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcRoofTypeEnum, 'NOTDEFINED', INDETERMINATE) +flat_roof = IfcRoofTypeEnum.FLAT_ROOF +shed_roof = IfcRoofTypeEnum.SHED_ROOF +gable_roof = IfcRoofTypeEnum.GABLE_ROOF +hip_roof = IfcRoofTypeEnum.HIP_ROOF +hipped_gable_roof = IfcRoofTypeEnum.HIPPED_GABLE_ROOF +gambrel_roof = IfcRoofTypeEnum.GAMBREL_ROOF +mansard_roof = IfcRoofTypeEnum.MANSARD_ROOF +barrel_roof = IfcRoofTypeEnum.BARREL_ROOF +rainbow_roof = IfcRoofTypeEnum.RAINBOW_ROOF +butterfly_roof = IfcRoofTypeEnum.BUTTERFLY_ROOF +pavilion_roof = IfcRoofTypeEnum.PAVILION_ROOF +dome_roof = IfcRoofTypeEnum.DOME_ROOF +freeform = IfcRoofTypeEnum.FREEFORM +userdefined = IfcRoofTypeEnum.USERDEFINED +notdefined = IfcRoofTypeEnum.NOTDEFINED IfcSIPrefix = enum_namespace() -exa = express_getattr(IfcSIPrefix, 'EXA', INDETERMINATE) -peta = express_getattr(IfcSIPrefix, 'PETA', INDETERMINATE) -tera = express_getattr(IfcSIPrefix, 'TERA', INDETERMINATE) -giga = express_getattr(IfcSIPrefix, 'GIGA', INDETERMINATE) -mega = express_getattr(IfcSIPrefix, 'MEGA', INDETERMINATE) -kilo = express_getattr(IfcSIPrefix, 'KILO', INDETERMINATE) -hecto = express_getattr(IfcSIPrefix, 'HECTO', INDETERMINATE) -deca = express_getattr(IfcSIPrefix, 'DECA', INDETERMINATE) -deci = express_getattr(IfcSIPrefix, 'DECI', INDETERMINATE) -centi = express_getattr(IfcSIPrefix, 'CENTI', INDETERMINATE) -milli = express_getattr(IfcSIPrefix, 'MILLI', INDETERMINATE) -micro = express_getattr(IfcSIPrefix, 'MICRO', INDETERMINATE) -nano = express_getattr(IfcSIPrefix, 'NANO', INDETERMINATE) -pico = express_getattr(IfcSIPrefix, 'PICO', INDETERMINATE) -femto = express_getattr(IfcSIPrefix, 'FEMTO', INDETERMINATE) -atto = express_getattr(IfcSIPrefix, 'ATTO', INDETERMINATE) +exa = IfcSIPrefix.EXA +peta = IfcSIPrefix.PETA +tera = IfcSIPrefix.TERA +giga = IfcSIPrefix.GIGA +mega = IfcSIPrefix.MEGA +kilo = IfcSIPrefix.KILO +hecto = IfcSIPrefix.HECTO +deca = IfcSIPrefix.DECA +deci = IfcSIPrefix.DECI +centi = IfcSIPrefix.CENTI +milli = IfcSIPrefix.MILLI +micro = IfcSIPrefix.MICRO +nano = IfcSIPrefix.NANO +pico = IfcSIPrefix.PICO +femto = IfcSIPrefix.FEMTO +atto = IfcSIPrefix.ATTO IfcSIUnitName = enum_namespace() -ampere = express_getattr(IfcSIUnitName, 'AMPERE', INDETERMINATE) -becquerel = express_getattr(IfcSIUnitName, 'BECQUEREL', INDETERMINATE) -candela = express_getattr(IfcSIUnitName, 'CANDELA', INDETERMINATE) -coulomb = express_getattr(IfcSIUnitName, 'COULOMB', INDETERMINATE) -cubic_metre = express_getattr(IfcSIUnitName, 'CUBIC_METRE', INDETERMINATE) -degree_celsius = express_getattr(IfcSIUnitName, 'DEGREE_CELSIUS', INDETERMINATE) -farad = express_getattr(IfcSIUnitName, 'FARAD', INDETERMINATE) -gram = express_getattr(IfcSIUnitName, 'GRAM', INDETERMINATE) -gray = express_getattr(IfcSIUnitName, 'GRAY', INDETERMINATE) -henry = express_getattr(IfcSIUnitName, 'HENRY', INDETERMINATE) -hertz = express_getattr(IfcSIUnitName, 'HERTZ', INDETERMINATE) -joule = express_getattr(IfcSIUnitName, 'JOULE', INDETERMINATE) -kelvin = express_getattr(IfcSIUnitName, 'KELVIN', INDETERMINATE) -lumen = express_getattr(IfcSIUnitName, 'LUMEN', INDETERMINATE) -lux = express_getattr(IfcSIUnitName, 'LUX', INDETERMINATE) -metre = express_getattr(IfcSIUnitName, 'METRE', INDETERMINATE) -mole = express_getattr(IfcSIUnitName, 'MOLE', INDETERMINATE) -newton = express_getattr(IfcSIUnitName, 'NEWTON', INDETERMINATE) -ohm = express_getattr(IfcSIUnitName, 'OHM', INDETERMINATE) -pascal = express_getattr(IfcSIUnitName, 'PASCAL', INDETERMINATE) -radian = express_getattr(IfcSIUnitName, 'RADIAN', INDETERMINATE) -second = express_getattr(IfcSIUnitName, 'SECOND', INDETERMINATE) -siemens = express_getattr(IfcSIUnitName, 'SIEMENS', INDETERMINATE) -sievert = express_getattr(IfcSIUnitName, 'SIEVERT', INDETERMINATE) -square_metre = express_getattr(IfcSIUnitName, 'SQUARE_METRE', INDETERMINATE) -steradian = express_getattr(IfcSIUnitName, 'STERADIAN', INDETERMINATE) -tesla = express_getattr(IfcSIUnitName, 'TESLA', INDETERMINATE) -volt = express_getattr(IfcSIUnitName, 'VOLT', INDETERMINATE) -watt = express_getattr(IfcSIUnitName, 'WATT', INDETERMINATE) -weber = express_getattr(IfcSIUnitName, 'WEBER', INDETERMINATE) +ampere = IfcSIUnitName.AMPERE +becquerel = IfcSIUnitName.BECQUEREL +candela = IfcSIUnitName.CANDELA +coulomb = IfcSIUnitName.COULOMB +cubic_metre = IfcSIUnitName.CUBIC_METRE +degree_celsius = IfcSIUnitName.DEGREE_CELSIUS +farad = IfcSIUnitName.FARAD +gram = IfcSIUnitName.GRAM +gray = IfcSIUnitName.GRAY +henry = IfcSIUnitName.HENRY +hertz = IfcSIUnitName.HERTZ +joule = IfcSIUnitName.JOULE +kelvin = IfcSIUnitName.KELVIN +lumen = IfcSIUnitName.LUMEN +lux = IfcSIUnitName.LUX +metre = IfcSIUnitName.METRE +mole = IfcSIUnitName.MOLE +newton = IfcSIUnitName.NEWTON +ohm = IfcSIUnitName.OHM +pascal = IfcSIUnitName.PASCAL +radian = IfcSIUnitName.RADIAN +second = IfcSIUnitName.SECOND +siemens = IfcSIUnitName.SIEMENS +sievert = IfcSIUnitName.SIEVERT +square_metre = IfcSIUnitName.SQUARE_METRE +steradian = IfcSIUnitName.STERADIAN +tesla = IfcSIUnitName.TESLA +volt = IfcSIUnitName.VOLT +watt = IfcSIUnitName.WATT +weber = IfcSIUnitName.WEBER IfcSanitaryTerminalTypeEnum = enum_namespace() -bath = express_getattr(IfcSanitaryTerminalTypeEnum, 'BATH', INDETERMINATE) -bidet = express_getattr(IfcSanitaryTerminalTypeEnum, 'BIDET', INDETERMINATE) -cistern = express_getattr(IfcSanitaryTerminalTypeEnum, 'CISTERN', INDETERMINATE) -shower = express_getattr(IfcSanitaryTerminalTypeEnum, 'SHOWER', INDETERMINATE) -sink = express_getattr(IfcSanitaryTerminalTypeEnum, 'SINK', INDETERMINATE) -sanitaryfountain = express_getattr(IfcSanitaryTerminalTypeEnum, 'SANITARYFOUNTAIN', INDETERMINATE) -toiletpan = express_getattr(IfcSanitaryTerminalTypeEnum, 'TOILETPAN', INDETERMINATE) -urinal = express_getattr(IfcSanitaryTerminalTypeEnum, 'URINAL', INDETERMINATE) -washhandbasin = express_getattr(IfcSanitaryTerminalTypeEnum, 'WASHHANDBASIN', INDETERMINATE) -wcseat = express_getattr(IfcSanitaryTerminalTypeEnum, 'WCSEAT', INDETERMINATE) -userdefined = express_getattr(IfcSanitaryTerminalTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSanitaryTerminalTypeEnum, 'NOTDEFINED', INDETERMINATE) +bath = IfcSanitaryTerminalTypeEnum.BATH +bidet = IfcSanitaryTerminalTypeEnum.BIDET +cistern = IfcSanitaryTerminalTypeEnum.CISTERN +shower = IfcSanitaryTerminalTypeEnum.SHOWER +sink = IfcSanitaryTerminalTypeEnum.SINK +sanitaryfountain = IfcSanitaryTerminalTypeEnum.SANITARYFOUNTAIN +toiletpan = IfcSanitaryTerminalTypeEnum.TOILETPAN +urinal = IfcSanitaryTerminalTypeEnum.URINAL +washhandbasin = IfcSanitaryTerminalTypeEnum.WASHHANDBASIN +wcseat = IfcSanitaryTerminalTypeEnum.WCSEAT +userdefined = IfcSanitaryTerminalTypeEnum.USERDEFINED +notdefined = IfcSanitaryTerminalTypeEnum.NOTDEFINED IfcSectionTypeEnum = enum_namespace() -uniform = express_getattr(IfcSectionTypeEnum, 'UNIFORM', INDETERMINATE) -tapered = express_getattr(IfcSectionTypeEnum, 'TAPERED', INDETERMINATE) +uniform = IfcSectionTypeEnum.UNIFORM +tapered = IfcSectionTypeEnum.TAPERED IfcSensorTypeEnum = enum_namespace() -cosensor = express_getattr(IfcSensorTypeEnum, 'COSENSOR', INDETERMINATE) -co2sensor = express_getattr(IfcSensorTypeEnum, 'CO2SENSOR', INDETERMINATE) -conductancesensor = express_getattr(IfcSensorTypeEnum, 'CONDUCTANCESENSOR', INDETERMINATE) -contactsensor = express_getattr(IfcSensorTypeEnum, 'CONTACTSENSOR', INDETERMINATE) -firesensor = express_getattr(IfcSensorTypeEnum, 'FIRESENSOR', INDETERMINATE) -flowsensor = express_getattr(IfcSensorTypeEnum, 'FLOWSENSOR', INDETERMINATE) -frostsensor = express_getattr(IfcSensorTypeEnum, 'FROSTSENSOR', INDETERMINATE) -gassensor = express_getattr(IfcSensorTypeEnum, 'GASSENSOR', INDETERMINATE) -heatsensor = express_getattr(IfcSensorTypeEnum, 'HEATSENSOR', INDETERMINATE) -humiditysensor = express_getattr(IfcSensorTypeEnum, 'HUMIDITYSENSOR', INDETERMINATE) -identifiersensor = express_getattr(IfcSensorTypeEnum, 'IDENTIFIERSENSOR', INDETERMINATE) -ionconcentrationsensor = express_getattr(IfcSensorTypeEnum, 'IONCONCENTRATIONSENSOR', INDETERMINATE) -levelsensor = express_getattr(IfcSensorTypeEnum, 'LEVELSENSOR', INDETERMINATE) -lightsensor = express_getattr(IfcSensorTypeEnum, 'LIGHTSENSOR', INDETERMINATE) -moisturesensor = express_getattr(IfcSensorTypeEnum, 'MOISTURESENSOR', INDETERMINATE) -movementsensor = express_getattr(IfcSensorTypeEnum, 'MOVEMENTSENSOR', INDETERMINATE) -phsensor = express_getattr(IfcSensorTypeEnum, 'PHSENSOR', INDETERMINATE) -pressuresensor = express_getattr(IfcSensorTypeEnum, 'PRESSURESENSOR', INDETERMINATE) -radiationsensor = express_getattr(IfcSensorTypeEnum, 'RADIATIONSENSOR', INDETERMINATE) -radioactivitysensor = express_getattr(IfcSensorTypeEnum, 'RADIOACTIVITYSENSOR', INDETERMINATE) -smokesensor = express_getattr(IfcSensorTypeEnum, 'SMOKESENSOR', INDETERMINATE) -soundsensor = express_getattr(IfcSensorTypeEnum, 'SOUNDSENSOR', INDETERMINATE) -temperaturesensor = express_getattr(IfcSensorTypeEnum, 'TEMPERATURESENSOR', INDETERMINATE) -windsensor = express_getattr(IfcSensorTypeEnum, 'WINDSENSOR', INDETERMINATE) -earthquakesensor = express_getattr(IfcSensorTypeEnum, 'EARTHQUAKESENSOR', INDETERMINATE) -foreignobjectdetectionsensor = express_getattr(IfcSensorTypeEnum, 'FOREIGNOBJECTDETECTIONSENSOR', INDETERMINATE) -obstaclesensor = express_getattr(IfcSensorTypeEnum, 'OBSTACLESENSOR', INDETERMINATE) -rainsensor = express_getattr(IfcSensorTypeEnum, 'RAINSENSOR', INDETERMINATE) -snowdepthsensor = express_getattr(IfcSensorTypeEnum, 'SNOWDEPTHSENSOR', INDETERMINATE) -trainsensor = express_getattr(IfcSensorTypeEnum, 'TRAINSENSOR', INDETERMINATE) -turnoutclosuresensor = express_getattr(IfcSensorTypeEnum, 'TURNOUTCLOSURESENSOR', INDETERMINATE) -wheelsensor = express_getattr(IfcSensorTypeEnum, 'WHEELSENSOR', INDETERMINATE) -userdefined = express_getattr(IfcSensorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSensorTypeEnum, 'NOTDEFINED', INDETERMINATE) +cosensor = IfcSensorTypeEnum.COSENSOR +co2sensor = IfcSensorTypeEnum.CO2SENSOR +conductancesensor = IfcSensorTypeEnum.CONDUCTANCESENSOR +contactsensor = IfcSensorTypeEnum.CONTACTSENSOR +firesensor = IfcSensorTypeEnum.FIRESENSOR +flowsensor = IfcSensorTypeEnum.FLOWSENSOR +frostsensor = IfcSensorTypeEnum.FROSTSENSOR +gassensor = IfcSensorTypeEnum.GASSENSOR +heatsensor = IfcSensorTypeEnum.HEATSENSOR +humiditysensor = IfcSensorTypeEnum.HUMIDITYSENSOR +identifiersensor = IfcSensorTypeEnum.IDENTIFIERSENSOR +ionconcentrationsensor = IfcSensorTypeEnum.IONCONCENTRATIONSENSOR +levelsensor = IfcSensorTypeEnum.LEVELSENSOR +lightsensor = IfcSensorTypeEnum.LIGHTSENSOR +moisturesensor = IfcSensorTypeEnum.MOISTURESENSOR +movementsensor = IfcSensorTypeEnum.MOVEMENTSENSOR +phsensor = IfcSensorTypeEnum.PHSENSOR +pressuresensor = IfcSensorTypeEnum.PRESSURESENSOR +radiationsensor = IfcSensorTypeEnum.RADIATIONSENSOR +radioactivitysensor = IfcSensorTypeEnum.RADIOACTIVITYSENSOR +smokesensor = IfcSensorTypeEnum.SMOKESENSOR +soundsensor = IfcSensorTypeEnum.SOUNDSENSOR +temperaturesensor = IfcSensorTypeEnum.TEMPERATURESENSOR +windsensor = IfcSensorTypeEnum.WINDSENSOR +earthquakesensor = IfcSensorTypeEnum.EARTHQUAKESENSOR +foreignobjectdetectionsensor = IfcSensorTypeEnum.FOREIGNOBJECTDETECTIONSENSOR +obstaclesensor = IfcSensorTypeEnum.OBSTACLESENSOR +rainsensor = IfcSensorTypeEnum.RAINSENSOR +snowdepthsensor = IfcSensorTypeEnum.SNOWDEPTHSENSOR +trainsensor = IfcSensorTypeEnum.TRAINSENSOR +turnoutclosuresensor = IfcSensorTypeEnum.TURNOUTCLOSURESENSOR +wheelsensor = IfcSensorTypeEnum.WHEELSENSOR +userdefined = IfcSensorTypeEnum.USERDEFINED +notdefined = IfcSensorTypeEnum.NOTDEFINED IfcSequenceEnum = enum_namespace() -start_start = express_getattr(IfcSequenceEnum, 'START_START', INDETERMINATE) -start_finish = express_getattr(IfcSequenceEnum, 'START_FINISH', INDETERMINATE) -finish_start = express_getattr(IfcSequenceEnum, 'FINISH_START', INDETERMINATE) -finish_finish = express_getattr(IfcSequenceEnum, 'FINISH_FINISH', INDETERMINATE) -userdefined = express_getattr(IfcSequenceEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSequenceEnum, 'NOTDEFINED', INDETERMINATE) +start_start = IfcSequenceEnum.START_START +start_finish = IfcSequenceEnum.START_FINISH +finish_start = IfcSequenceEnum.FINISH_START +finish_finish = IfcSequenceEnum.FINISH_FINISH +userdefined = IfcSequenceEnum.USERDEFINED +notdefined = IfcSequenceEnum.NOTDEFINED IfcShadingDeviceTypeEnum = enum_namespace() -jalousie = express_getattr(IfcShadingDeviceTypeEnum, 'JALOUSIE', INDETERMINATE) -shutter = express_getattr(IfcShadingDeviceTypeEnum, 'SHUTTER', INDETERMINATE) -awning = express_getattr(IfcShadingDeviceTypeEnum, 'AWNING', INDETERMINATE) -userdefined = express_getattr(IfcShadingDeviceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcShadingDeviceTypeEnum, 'NOTDEFINED', INDETERMINATE) +jalousie = IfcShadingDeviceTypeEnum.JALOUSIE +shutter = IfcShadingDeviceTypeEnum.SHUTTER +awning = IfcShadingDeviceTypeEnum.AWNING +userdefined = IfcShadingDeviceTypeEnum.USERDEFINED +notdefined = IfcShadingDeviceTypeEnum.NOTDEFINED IfcSignTypeEnum = enum_namespace() -marker = express_getattr(IfcSignTypeEnum, 'MARKER', INDETERMINATE) -pictoral = express_getattr(IfcSignTypeEnum, 'PICTORAL', INDETERMINATE) -mirror = express_getattr(IfcSignTypeEnum, 'MIRROR', INDETERMINATE) -userdefined = express_getattr(IfcSignTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSignTypeEnum, 'NOTDEFINED', INDETERMINATE) +marker = IfcSignTypeEnum.MARKER +pictoral = IfcSignTypeEnum.PICTORAL +mirror = IfcSignTypeEnum.MIRROR +userdefined = IfcSignTypeEnum.USERDEFINED +notdefined = IfcSignTypeEnum.NOTDEFINED IfcSignalTypeEnum = enum_namespace() -visual = express_getattr(IfcSignalTypeEnum, 'VISUAL', INDETERMINATE) -audio = express_getattr(IfcSignalTypeEnum, 'AUDIO', INDETERMINATE) -mixed = express_getattr(IfcSignalTypeEnum, 'MIXED', INDETERMINATE) -userdefined = express_getattr(IfcSignalTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSignalTypeEnum, 'NOTDEFINED', INDETERMINATE) +visual = IfcSignalTypeEnum.VISUAL +audio = IfcSignalTypeEnum.AUDIO +mixed = IfcSignalTypeEnum.MIXED +userdefined = IfcSignalTypeEnum.USERDEFINED +notdefined = IfcSignalTypeEnum.NOTDEFINED IfcSimplePropertyTemplateTypeEnum = enum_namespace() -p_singlevalue = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'P_SINGLEVALUE', INDETERMINATE) -p_enumeratedvalue = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'P_ENUMERATEDVALUE', INDETERMINATE) -p_boundedvalue = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'P_BOUNDEDVALUE', INDETERMINATE) -p_listvalue = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'P_LISTVALUE', INDETERMINATE) -p_tablevalue = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'P_TABLEVALUE', INDETERMINATE) -p_referencevalue = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'P_REFERENCEVALUE', INDETERMINATE) -q_length = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'Q_LENGTH', INDETERMINATE) -q_area = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'Q_AREA', INDETERMINATE) -q_volume = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'Q_VOLUME', INDETERMINATE) -q_count = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'Q_COUNT', INDETERMINATE) -q_weight = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'Q_WEIGHT', INDETERMINATE) -q_time = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'Q_TIME', INDETERMINATE) +p_singlevalue = IfcSimplePropertyTemplateTypeEnum.P_SINGLEVALUE +p_enumeratedvalue = IfcSimplePropertyTemplateTypeEnum.P_ENUMERATEDVALUE +p_boundedvalue = IfcSimplePropertyTemplateTypeEnum.P_BOUNDEDVALUE +p_listvalue = IfcSimplePropertyTemplateTypeEnum.P_LISTVALUE +p_tablevalue = IfcSimplePropertyTemplateTypeEnum.P_TABLEVALUE +p_referencevalue = IfcSimplePropertyTemplateTypeEnum.P_REFERENCEVALUE +q_length = IfcSimplePropertyTemplateTypeEnum.Q_LENGTH +q_area = IfcSimplePropertyTemplateTypeEnum.Q_AREA +q_volume = IfcSimplePropertyTemplateTypeEnum.Q_VOLUME +q_count = IfcSimplePropertyTemplateTypeEnum.Q_COUNT +q_weight = IfcSimplePropertyTemplateTypeEnum.Q_WEIGHT +q_time = IfcSimplePropertyTemplateTypeEnum.Q_TIME IfcSlabTypeEnum = enum_namespace() -floor = express_getattr(IfcSlabTypeEnum, 'FLOOR', INDETERMINATE) -roof = express_getattr(IfcSlabTypeEnum, 'ROOF', INDETERMINATE) -landing = express_getattr(IfcSlabTypeEnum, 'LANDING', INDETERMINATE) -baseslab = express_getattr(IfcSlabTypeEnum, 'BASESLAB', INDETERMINATE) -approach_slab = express_getattr(IfcSlabTypeEnum, 'APPROACH_SLAB', INDETERMINATE) -paving = express_getattr(IfcSlabTypeEnum, 'PAVING', INDETERMINATE) -wearing = express_getattr(IfcSlabTypeEnum, 'WEARING', INDETERMINATE) -sidewalk = express_getattr(IfcSlabTypeEnum, 'SIDEWALK', INDETERMINATE) -trackslab = express_getattr(IfcSlabTypeEnum, 'TRACKSLAB', INDETERMINATE) -userdefined = express_getattr(IfcSlabTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSlabTypeEnum, 'NOTDEFINED', INDETERMINATE) +floor = IfcSlabTypeEnum.FLOOR +roof = IfcSlabTypeEnum.ROOF +landing = IfcSlabTypeEnum.LANDING +baseslab = IfcSlabTypeEnum.BASESLAB +approach_slab = IfcSlabTypeEnum.APPROACH_SLAB +paving = IfcSlabTypeEnum.PAVING +wearing = IfcSlabTypeEnum.WEARING +sidewalk = IfcSlabTypeEnum.SIDEWALK +trackslab = IfcSlabTypeEnum.TRACKSLAB +userdefined = IfcSlabTypeEnum.USERDEFINED +notdefined = IfcSlabTypeEnum.NOTDEFINED IfcSolarDeviceTypeEnum = enum_namespace() -solarcollector = express_getattr(IfcSolarDeviceTypeEnum, 'SOLARCOLLECTOR', INDETERMINATE) -solarpanel = express_getattr(IfcSolarDeviceTypeEnum, 'SOLARPANEL', INDETERMINATE) -userdefined = express_getattr(IfcSolarDeviceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSolarDeviceTypeEnum, 'NOTDEFINED', INDETERMINATE) +solarcollector = IfcSolarDeviceTypeEnum.SOLARCOLLECTOR +solarpanel = IfcSolarDeviceTypeEnum.SOLARPANEL +userdefined = IfcSolarDeviceTypeEnum.USERDEFINED +notdefined = IfcSolarDeviceTypeEnum.NOTDEFINED IfcSpaceHeaterTypeEnum = enum_namespace() -convector = express_getattr(IfcSpaceHeaterTypeEnum, 'CONVECTOR', INDETERMINATE) -radiator = express_getattr(IfcSpaceHeaterTypeEnum, 'RADIATOR', INDETERMINATE) -userdefined = express_getattr(IfcSpaceHeaterTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSpaceHeaterTypeEnum, 'NOTDEFINED', INDETERMINATE) +convector = IfcSpaceHeaterTypeEnum.CONVECTOR +radiator = IfcSpaceHeaterTypeEnum.RADIATOR +userdefined = IfcSpaceHeaterTypeEnum.USERDEFINED +notdefined = IfcSpaceHeaterTypeEnum.NOTDEFINED IfcSpaceTypeEnum = enum_namespace() -space = express_getattr(IfcSpaceTypeEnum, 'SPACE', INDETERMINATE) -parking = express_getattr(IfcSpaceTypeEnum, 'PARKING', INDETERMINATE) -gfa = express_getattr(IfcSpaceTypeEnum, 'GFA', INDETERMINATE) -internal = express_getattr(IfcSpaceTypeEnum, 'INTERNAL', INDETERMINATE) -external = express_getattr(IfcSpaceTypeEnum, 'EXTERNAL', INDETERMINATE) -userdefined = express_getattr(IfcSpaceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSpaceTypeEnum, 'NOTDEFINED', INDETERMINATE) +space = IfcSpaceTypeEnum.SPACE +parking = IfcSpaceTypeEnum.PARKING +gfa = IfcSpaceTypeEnum.GFA +internal = IfcSpaceTypeEnum.INTERNAL +external = IfcSpaceTypeEnum.EXTERNAL +userdefined = IfcSpaceTypeEnum.USERDEFINED +notdefined = IfcSpaceTypeEnum.NOTDEFINED IfcSpatialZoneTypeEnum = enum_namespace() -construction = express_getattr(IfcSpatialZoneTypeEnum, 'CONSTRUCTION', INDETERMINATE) -firesafety = express_getattr(IfcSpatialZoneTypeEnum, 'FIRESAFETY', INDETERMINATE) -lighting = express_getattr(IfcSpatialZoneTypeEnum, 'LIGHTING', INDETERMINATE) -occupancy = express_getattr(IfcSpatialZoneTypeEnum, 'OCCUPANCY', INDETERMINATE) -security = express_getattr(IfcSpatialZoneTypeEnum, 'SECURITY', INDETERMINATE) -thermal = express_getattr(IfcSpatialZoneTypeEnum, 'THERMAL', INDETERMINATE) -transport = express_getattr(IfcSpatialZoneTypeEnum, 'TRANSPORT', INDETERMINATE) -ventilation = express_getattr(IfcSpatialZoneTypeEnum, 'VENTILATION', INDETERMINATE) -reservation = express_getattr(IfcSpatialZoneTypeEnum, 'RESERVATION', INDETERMINATE) -userdefined = express_getattr(IfcSpatialZoneTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSpatialZoneTypeEnum, 'NOTDEFINED', INDETERMINATE) +construction = IfcSpatialZoneTypeEnum.CONSTRUCTION +firesafety = IfcSpatialZoneTypeEnum.FIRESAFETY +lighting = IfcSpatialZoneTypeEnum.LIGHTING +occupancy = IfcSpatialZoneTypeEnum.OCCUPANCY +security = IfcSpatialZoneTypeEnum.SECURITY +thermal = IfcSpatialZoneTypeEnum.THERMAL +transport = IfcSpatialZoneTypeEnum.TRANSPORT +ventilation = IfcSpatialZoneTypeEnum.VENTILATION +reservation = IfcSpatialZoneTypeEnum.RESERVATION +userdefined = IfcSpatialZoneTypeEnum.USERDEFINED +notdefined = IfcSpatialZoneTypeEnum.NOTDEFINED IfcStackTerminalTypeEnum = enum_namespace() -birdcage = express_getattr(IfcStackTerminalTypeEnum, 'BIRDCAGE', INDETERMINATE) -cowl = express_getattr(IfcStackTerminalTypeEnum, 'COWL', INDETERMINATE) -rainwaterhopper = express_getattr(IfcStackTerminalTypeEnum, 'RAINWATERHOPPER', INDETERMINATE) -userdefined = express_getattr(IfcStackTerminalTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcStackTerminalTypeEnum, 'NOTDEFINED', INDETERMINATE) +birdcage = IfcStackTerminalTypeEnum.BIRDCAGE +cowl = IfcStackTerminalTypeEnum.COWL +rainwaterhopper = IfcStackTerminalTypeEnum.RAINWATERHOPPER +userdefined = IfcStackTerminalTypeEnum.USERDEFINED +notdefined = IfcStackTerminalTypeEnum.NOTDEFINED IfcStairFlightTypeEnum = enum_namespace() -straight = express_getattr(IfcStairFlightTypeEnum, 'STRAIGHT', INDETERMINATE) -winder = express_getattr(IfcStairFlightTypeEnum, 'WINDER', INDETERMINATE) -spiral = express_getattr(IfcStairFlightTypeEnum, 'SPIRAL', INDETERMINATE) -curved = express_getattr(IfcStairFlightTypeEnum, 'CURVED', INDETERMINATE) -freeform = express_getattr(IfcStairFlightTypeEnum, 'FREEFORM', INDETERMINATE) -userdefined = express_getattr(IfcStairFlightTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcStairFlightTypeEnum, 'NOTDEFINED', INDETERMINATE) +straight = IfcStairFlightTypeEnum.STRAIGHT +winder = IfcStairFlightTypeEnum.WINDER +spiral = IfcStairFlightTypeEnum.SPIRAL +curved = IfcStairFlightTypeEnum.CURVED +freeform = IfcStairFlightTypeEnum.FREEFORM +userdefined = IfcStairFlightTypeEnum.USERDEFINED +notdefined = IfcStairFlightTypeEnum.NOTDEFINED IfcStairTypeEnum = enum_namespace() -straight_run_stair = express_getattr(IfcStairTypeEnum, 'STRAIGHT_RUN_STAIR', INDETERMINATE) -two_straight_run_stair = express_getattr(IfcStairTypeEnum, 'TWO_STRAIGHT_RUN_STAIR', INDETERMINATE) -quarter_winding_stair = express_getattr(IfcStairTypeEnum, 'QUARTER_WINDING_STAIR', INDETERMINATE) -quarter_turn_stair = express_getattr(IfcStairTypeEnum, 'QUARTER_TURN_STAIR', INDETERMINATE) -half_winding_stair = express_getattr(IfcStairTypeEnum, 'HALF_WINDING_STAIR', INDETERMINATE) -half_turn_stair = express_getattr(IfcStairTypeEnum, 'HALF_TURN_STAIR', INDETERMINATE) -two_quarter_winding_stair = express_getattr(IfcStairTypeEnum, 'TWO_QUARTER_WINDING_STAIR', INDETERMINATE) -two_quarter_turn_stair = express_getattr(IfcStairTypeEnum, 'TWO_QUARTER_TURN_STAIR', INDETERMINATE) -three_quarter_winding_stair = express_getattr(IfcStairTypeEnum, 'THREE_QUARTER_WINDING_STAIR', INDETERMINATE) -three_quarter_turn_stair = express_getattr(IfcStairTypeEnum, 'THREE_QUARTER_TURN_STAIR', INDETERMINATE) -spiral_stair = express_getattr(IfcStairTypeEnum, 'SPIRAL_STAIR', INDETERMINATE) -double_return_stair = express_getattr(IfcStairTypeEnum, 'DOUBLE_RETURN_STAIR', INDETERMINATE) -curved_run_stair = express_getattr(IfcStairTypeEnum, 'CURVED_RUN_STAIR', INDETERMINATE) -two_curved_run_stair = express_getattr(IfcStairTypeEnum, 'TWO_CURVED_RUN_STAIR', INDETERMINATE) -ladder = express_getattr(IfcStairTypeEnum, 'LADDER', INDETERMINATE) -userdefined = express_getattr(IfcStairTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcStairTypeEnum, 'NOTDEFINED', INDETERMINATE) +straight_run_stair = IfcStairTypeEnum.STRAIGHT_RUN_STAIR +two_straight_run_stair = IfcStairTypeEnum.TWO_STRAIGHT_RUN_STAIR +quarter_winding_stair = IfcStairTypeEnum.QUARTER_WINDING_STAIR +quarter_turn_stair = IfcStairTypeEnum.QUARTER_TURN_STAIR +half_winding_stair = IfcStairTypeEnum.HALF_WINDING_STAIR +half_turn_stair = IfcStairTypeEnum.HALF_TURN_STAIR +two_quarter_winding_stair = IfcStairTypeEnum.TWO_QUARTER_WINDING_STAIR +two_quarter_turn_stair = IfcStairTypeEnum.TWO_QUARTER_TURN_STAIR +three_quarter_winding_stair = IfcStairTypeEnum.THREE_QUARTER_WINDING_STAIR +three_quarter_turn_stair = IfcStairTypeEnum.THREE_QUARTER_TURN_STAIR +spiral_stair = IfcStairTypeEnum.SPIRAL_STAIR +double_return_stair = IfcStairTypeEnum.DOUBLE_RETURN_STAIR +curved_run_stair = IfcStairTypeEnum.CURVED_RUN_STAIR +two_curved_run_stair = IfcStairTypeEnum.TWO_CURVED_RUN_STAIR +ladder = IfcStairTypeEnum.LADDER +userdefined = IfcStairTypeEnum.USERDEFINED +notdefined = IfcStairTypeEnum.NOTDEFINED IfcStateEnum = enum_namespace() -readwrite = express_getattr(IfcStateEnum, 'READWRITE', INDETERMINATE) -readonly = express_getattr(IfcStateEnum, 'READONLY', INDETERMINATE) -locked = express_getattr(IfcStateEnum, 'LOCKED', INDETERMINATE) -readwritelocked = express_getattr(IfcStateEnum, 'READWRITELOCKED', INDETERMINATE) -readonlylocked = express_getattr(IfcStateEnum, 'READONLYLOCKED', INDETERMINATE) +readwrite = IfcStateEnum.READWRITE +readonly = IfcStateEnum.READONLY +locked = IfcStateEnum.LOCKED +readwritelocked = IfcStateEnum.READWRITELOCKED +readonlylocked = IfcStateEnum.READONLYLOCKED IfcStructuralCurveActivityTypeEnum = enum_namespace() -const = express_getattr(IfcStructuralCurveActivityTypeEnum, 'CONST', INDETERMINATE) -linear = express_getattr(IfcStructuralCurveActivityTypeEnum, 'LINEAR', INDETERMINATE) -polygonal = express_getattr(IfcStructuralCurveActivityTypeEnum, 'POLYGONAL', INDETERMINATE) -equidistant = express_getattr(IfcStructuralCurveActivityTypeEnum, 'EQUIDISTANT', INDETERMINATE) -sinus = express_getattr(IfcStructuralCurveActivityTypeEnum, 'SINUS', INDETERMINATE) -parabola = express_getattr(IfcStructuralCurveActivityTypeEnum, 'PARABOLA', INDETERMINATE) -discrete = express_getattr(IfcStructuralCurveActivityTypeEnum, 'DISCRETE', INDETERMINATE) -userdefined = express_getattr(IfcStructuralCurveActivityTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcStructuralCurveActivityTypeEnum, 'NOTDEFINED', INDETERMINATE) +const = IfcStructuralCurveActivityTypeEnum.CONST +linear = IfcStructuralCurveActivityTypeEnum.LINEAR +polygonal = IfcStructuralCurveActivityTypeEnum.POLYGONAL +equidistant = IfcStructuralCurveActivityTypeEnum.EQUIDISTANT +sinus = IfcStructuralCurveActivityTypeEnum.SINUS +parabola = IfcStructuralCurveActivityTypeEnum.PARABOLA +discrete = IfcStructuralCurveActivityTypeEnum.DISCRETE +userdefined = IfcStructuralCurveActivityTypeEnum.USERDEFINED +notdefined = IfcStructuralCurveActivityTypeEnum.NOTDEFINED IfcStructuralCurveMemberTypeEnum = enum_namespace() -rigid_joined_member = express_getattr(IfcStructuralCurveMemberTypeEnum, 'RIGID_JOINED_MEMBER', INDETERMINATE) -pin_joined_member = express_getattr(IfcStructuralCurveMemberTypeEnum, 'PIN_JOINED_MEMBER', INDETERMINATE) -cable = express_getattr(IfcStructuralCurveMemberTypeEnum, 'CABLE', INDETERMINATE) -tension_member = express_getattr(IfcStructuralCurveMemberTypeEnum, 'TENSION_MEMBER', INDETERMINATE) -compression_member = express_getattr(IfcStructuralCurveMemberTypeEnum, 'COMPRESSION_MEMBER', INDETERMINATE) -userdefined = express_getattr(IfcStructuralCurveMemberTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcStructuralCurveMemberTypeEnum, 'NOTDEFINED', INDETERMINATE) +rigid_joined_member = IfcStructuralCurveMemberTypeEnum.RIGID_JOINED_MEMBER +pin_joined_member = IfcStructuralCurveMemberTypeEnum.PIN_JOINED_MEMBER +cable = IfcStructuralCurveMemberTypeEnum.CABLE +tension_member = IfcStructuralCurveMemberTypeEnum.TENSION_MEMBER +compression_member = IfcStructuralCurveMemberTypeEnum.COMPRESSION_MEMBER +userdefined = IfcStructuralCurveMemberTypeEnum.USERDEFINED +notdefined = IfcStructuralCurveMemberTypeEnum.NOTDEFINED IfcStructuralSurfaceActivityTypeEnum = enum_namespace() -const = express_getattr(IfcStructuralSurfaceActivityTypeEnum, 'CONST', INDETERMINATE) -bilinear = express_getattr(IfcStructuralSurfaceActivityTypeEnum, 'BILINEAR', INDETERMINATE) -discrete = express_getattr(IfcStructuralSurfaceActivityTypeEnum, 'DISCRETE', INDETERMINATE) -isocontour = express_getattr(IfcStructuralSurfaceActivityTypeEnum, 'ISOCONTOUR', INDETERMINATE) -userdefined = express_getattr(IfcStructuralSurfaceActivityTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcStructuralSurfaceActivityTypeEnum, 'NOTDEFINED', INDETERMINATE) +const = IfcStructuralSurfaceActivityTypeEnum.CONST +bilinear = IfcStructuralSurfaceActivityTypeEnum.BILINEAR +discrete = IfcStructuralSurfaceActivityTypeEnum.DISCRETE +isocontour = IfcStructuralSurfaceActivityTypeEnum.ISOCONTOUR +userdefined = IfcStructuralSurfaceActivityTypeEnum.USERDEFINED +notdefined = IfcStructuralSurfaceActivityTypeEnum.NOTDEFINED IfcStructuralSurfaceMemberTypeEnum = enum_namespace() -bending_element = express_getattr(IfcStructuralSurfaceMemberTypeEnum, 'BENDING_ELEMENT', INDETERMINATE) -membrane_element = express_getattr(IfcStructuralSurfaceMemberTypeEnum, 'MEMBRANE_ELEMENT', INDETERMINATE) -shell = express_getattr(IfcStructuralSurfaceMemberTypeEnum, 'SHELL', INDETERMINATE) -userdefined = express_getattr(IfcStructuralSurfaceMemberTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcStructuralSurfaceMemberTypeEnum, 'NOTDEFINED', INDETERMINATE) +bending_element = IfcStructuralSurfaceMemberTypeEnum.BENDING_ELEMENT +membrane_element = IfcStructuralSurfaceMemberTypeEnum.MEMBRANE_ELEMENT +shell = IfcStructuralSurfaceMemberTypeEnum.SHELL +userdefined = IfcStructuralSurfaceMemberTypeEnum.USERDEFINED +notdefined = IfcStructuralSurfaceMemberTypeEnum.NOTDEFINED IfcSubContractResourceTypeEnum = enum_namespace() -purchase = express_getattr(IfcSubContractResourceTypeEnum, 'PURCHASE', INDETERMINATE) -work = express_getattr(IfcSubContractResourceTypeEnum, 'WORK', INDETERMINATE) -userdefined = express_getattr(IfcSubContractResourceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSubContractResourceTypeEnum, 'NOTDEFINED', INDETERMINATE) +purchase = IfcSubContractResourceTypeEnum.PURCHASE +work = IfcSubContractResourceTypeEnum.WORK +userdefined = IfcSubContractResourceTypeEnum.USERDEFINED +notdefined = IfcSubContractResourceTypeEnum.NOTDEFINED IfcSurfaceFeatureTypeEnum = enum_namespace() -mark = express_getattr(IfcSurfaceFeatureTypeEnum, 'MARK', INDETERMINATE) -tag = express_getattr(IfcSurfaceFeatureTypeEnum, 'TAG', INDETERMINATE) -treatment = express_getattr(IfcSurfaceFeatureTypeEnum, 'TREATMENT', INDETERMINATE) -defect = express_getattr(IfcSurfaceFeatureTypeEnum, 'DEFECT', INDETERMINATE) -hatchmarking = express_getattr(IfcSurfaceFeatureTypeEnum, 'HATCHMARKING', INDETERMINATE) -linemarking = express_getattr(IfcSurfaceFeatureTypeEnum, 'LINEMARKING', INDETERMINATE) -pavementsurfacemarking = express_getattr(IfcSurfaceFeatureTypeEnum, 'PAVEMENTSURFACEMARKING', INDETERMINATE) -symbolmarking = express_getattr(IfcSurfaceFeatureTypeEnum, 'SYMBOLMARKING', INDETERMINATE) -nonskidsurfacing = express_getattr(IfcSurfaceFeatureTypeEnum, 'NONSKIDSURFACING', INDETERMINATE) -rumblestrip = express_getattr(IfcSurfaceFeatureTypeEnum, 'RUMBLESTRIP', INDETERMINATE) -transverserumblestrip = express_getattr(IfcSurfaceFeatureTypeEnum, 'TRANSVERSERUMBLESTRIP', INDETERMINATE) -userdefined = express_getattr(IfcSurfaceFeatureTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSurfaceFeatureTypeEnum, 'NOTDEFINED', INDETERMINATE) +mark = IfcSurfaceFeatureTypeEnum.MARK +tag = IfcSurfaceFeatureTypeEnum.TAG +treatment = IfcSurfaceFeatureTypeEnum.TREATMENT +defect = IfcSurfaceFeatureTypeEnum.DEFECT +hatchmarking = IfcSurfaceFeatureTypeEnum.HATCHMARKING +linemarking = IfcSurfaceFeatureTypeEnum.LINEMARKING +pavementsurfacemarking = IfcSurfaceFeatureTypeEnum.PAVEMENTSURFACEMARKING +symbolmarking = IfcSurfaceFeatureTypeEnum.SYMBOLMARKING +nonskidsurfacing = IfcSurfaceFeatureTypeEnum.NONSKIDSURFACING +rumblestrip = IfcSurfaceFeatureTypeEnum.RUMBLESTRIP +transverserumblestrip = IfcSurfaceFeatureTypeEnum.TRANSVERSERUMBLESTRIP +userdefined = IfcSurfaceFeatureTypeEnum.USERDEFINED +notdefined = IfcSurfaceFeatureTypeEnum.NOTDEFINED IfcSurfaceSide = enum_namespace() -positive = express_getattr(IfcSurfaceSide, 'POSITIVE', INDETERMINATE) -negative = express_getattr(IfcSurfaceSide, 'NEGATIVE', INDETERMINATE) -both = express_getattr(IfcSurfaceSide, 'BOTH', INDETERMINATE) +positive = IfcSurfaceSide.POSITIVE +negative = IfcSurfaceSide.NEGATIVE +both = IfcSurfaceSide.BOTH IfcSwitchingDeviceTypeEnum = enum_namespace() -contactor = express_getattr(IfcSwitchingDeviceTypeEnum, 'CONTACTOR', INDETERMINATE) -dimmerswitch = express_getattr(IfcSwitchingDeviceTypeEnum, 'DIMMERSWITCH', INDETERMINATE) -emergencystop = express_getattr(IfcSwitchingDeviceTypeEnum, 'EMERGENCYSTOP', INDETERMINATE) -keypad = express_getattr(IfcSwitchingDeviceTypeEnum, 'KEYPAD', INDETERMINATE) -momentaryswitch = express_getattr(IfcSwitchingDeviceTypeEnum, 'MOMENTARYSWITCH', INDETERMINATE) -selectorswitch = express_getattr(IfcSwitchingDeviceTypeEnum, 'SELECTORSWITCH', INDETERMINATE) -starter = express_getattr(IfcSwitchingDeviceTypeEnum, 'STARTER', INDETERMINATE) -switchdisconnector = express_getattr(IfcSwitchingDeviceTypeEnum, 'SWITCHDISCONNECTOR', INDETERMINATE) -toggleswitch = express_getattr(IfcSwitchingDeviceTypeEnum, 'TOGGLESWITCH', INDETERMINATE) -relay = express_getattr(IfcSwitchingDeviceTypeEnum, 'RELAY', INDETERMINATE) -start_and_stop_equipment = express_getattr(IfcSwitchingDeviceTypeEnum, 'START_AND_STOP_EQUIPMENT', INDETERMINATE) -userdefined = express_getattr(IfcSwitchingDeviceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSwitchingDeviceTypeEnum, 'NOTDEFINED', INDETERMINATE) +contactor = IfcSwitchingDeviceTypeEnum.CONTACTOR +dimmerswitch = IfcSwitchingDeviceTypeEnum.DIMMERSWITCH +emergencystop = IfcSwitchingDeviceTypeEnum.EMERGENCYSTOP +keypad = IfcSwitchingDeviceTypeEnum.KEYPAD +momentaryswitch = IfcSwitchingDeviceTypeEnum.MOMENTARYSWITCH +selectorswitch = IfcSwitchingDeviceTypeEnum.SELECTORSWITCH +starter = IfcSwitchingDeviceTypeEnum.STARTER +switchdisconnector = IfcSwitchingDeviceTypeEnum.SWITCHDISCONNECTOR +toggleswitch = IfcSwitchingDeviceTypeEnum.TOGGLESWITCH +relay = IfcSwitchingDeviceTypeEnum.RELAY +start_and_stop_equipment = IfcSwitchingDeviceTypeEnum.START_AND_STOP_EQUIPMENT +userdefined = IfcSwitchingDeviceTypeEnum.USERDEFINED +notdefined = IfcSwitchingDeviceTypeEnum.NOTDEFINED IfcSystemFurnitureElementTypeEnum = enum_namespace() -panel = express_getattr(IfcSystemFurnitureElementTypeEnum, 'PANEL', INDETERMINATE) -worksurface = express_getattr(IfcSystemFurnitureElementTypeEnum, 'WORKSURFACE', INDETERMINATE) -subrack = express_getattr(IfcSystemFurnitureElementTypeEnum, 'SUBRACK', INDETERMINATE) -userdefined = express_getattr(IfcSystemFurnitureElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSystemFurnitureElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +panel = IfcSystemFurnitureElementTypeEnum.PANEL +worksurface = IfcSystemFurnitureElementTypeEnum.WORKSURFACE +subrack = IfcSystemFurnitureElementTypeEnum.SUBRACK +userdefined = IfcSystemFurnitureElementTypeEnum.USERDEFINED +notdefined = IfcSystemFurnitureElementTypeEnum.NOTDEFINED IfcTankTypeEnum = enum_namespace() -basin = express_getattr(IfcTankTypeEnum, 'BASIN', INDETERMINATE) -breakpressure = express_getattr(IfcTankTypeEnum, 'BREAKPRESSURE', INDETERMINATE) -expansion = express_getattr(IfcTankTypeEnum, 'EXPANSION', INDETERMINATE) -feedandexpansion = express_getattr(IfcTankTypeEnum, 'FEEDANDEXPANSION', INDETERMINATE) -pressurevessel = express_getattr(IfcTankTypeEnum, 'PRESSUREVESSEL', INDETERMINATE) -storage = express_getattr(IfcTankTypeEnum, 'STORAGE', INDETERMINATE) -vessel = express_getattr(IfcTankTypeEnum, 'VESSEL', INDETERMINATE) -oilretentiontray = express_getattr(IfcTankTypeEnum, 'OILRETENTIONTRAY', INDETERMINATE) -userdefined = express_getattr(IfcTankTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTankTypeEnum, 'NOTDEFINED', INDETERMINATE) +basin = IfcTankTypeEnum.BASIN +breakpressure = IfcTankTypeEnum.BREAKPRESSURE +expansion = IfcTankTypeEnum.EXPANSION +feedandexpansion = IfcTankTypeEnum.FEEDANDEXPANSION +pressurevessel = IfcTankTypeEnum.PRESSUREVESSEL +storage = IfcTankTypeEnum.STORAGE +vessel = IfcTankTypeEnum.VESSEL +oilretentiontray = IfcTankTypeEnum.OILRETENTIONTRAY +userdefined = IfcTankTypeEnum.USERDEFINED +notdefined = IfcTankTypeEnum.NOTDEFINED IfcTaskDurationEnum = enum_namespace() -elapsedtime = express_getattr(IfcTaskDurationEnum, 'ELAPSEDTIME', INDETERMINATE) -worktime = express_getattr(IfcTaskDurationEnum, 'WORKTIME', INDETERMINATE) -notdefined = express_getattr(IfcTaskDurationEnum, 'NOTDEFINED', INDETERMINATE) +elapsedtime = IfcTaskDurationEnum.ELAPSEDTIME +worktime = IfcTaskDurationEnum.WORKTIME +notdefined = IfcTaskDurationEnum.NOTDEFINED IfcTaskTypeEnum = enum_namespace() -attendance = express_getattr(IfcTaskTypeEnum, 'ATTENDANCE', INDETERMINATE) -construction = express_getattr(IfcTaskTypeEnum, 'CONSTRUCTION', INDETERMINATE) -demolition = express_getattr(IfcTaskTypeEnum, 'DEMOLITION', INDETERMINATE) -dismantle = express_getattr(IfcTaskTypeEnum, 'DISMANTLE', INDETERMINATE) -disposal = express_getattr(IfcTaskTypeEnum, 'DISPOSAL', INDETERMINATE) -installation = express_getattr(IfcTaskTypeEnum, 'INSTALLATION', INDETERMINATE) -logistic = express_getattr(IfcTaskTypeEnum, 'LOGISTIC', INDETERMINATE) -maintenance = express_getattr(IfcTaskTypeEnum, 'MAINTENANCE', INDETERMINATE) -move = express_getattr(IfcTaskTypeEnum, 'MOVE', INDETERMINATE) -operation = express_getattr(IfcTaskTypeEnum, 'OPERATION', INDETERMINATE) -removal = express_getattr(IfcTaskTypeEnum, 'REMOVAL', INDETERMINATE) -renovation = express_getattr(IfcTaskTypeEnum, 'RENOVATION', INDETERMINATE) -userdefined = express_getattr(IfcTaskTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTaskTypeEnum, 'NOTDEFINED', INDETERMINATE) +attendance = IfcTaskTypeEnum.ATTENDANCE +construction = IfcTaskTypeEnum.CONSTRUCTION +demolition = IfcTaskTypeEnum.DEMOLITION +dismantle = IfcTaskTypeEnum.DISMANTLE +disposal = IfcTaskTypeEnum.DISPOSAL +installation = IfcTaskTypeEnum.INSTALLATION +logistic = IfcTaskTypeEnum.LOGISTIC +maintenance = IfcTaskTypeEnum.MAINTENANCE +move = IfcTaskTypeEnum.MOVE +operation = IfcTaskTypeEnum.OPERATION +removal = IfcTaskTypeEnum.REMOVAL +renovation = IfcTaskTypeEnum.RENOVATION +userdefined = IfcTaskTypeEnum.USERDEFINED +notdefined = IfcTaskTypeEnum.NOTDEFINED IfcTendonAnchorTypeEnum = enum_namespace() -coupler = express_getattr(IfcTendonAnchorTypeEnum, 'COUPLER', INDETERMINATE) -fixed_end = express_getattr(IfcTendonAnchorTypeEnum, 'FIXED_END', INDETERMINATE) -tensioning_end = express_getattr(IfcTendonAnchorTypeEnum, 'TENSIONING_END', INDETERMINATE) -userdefined = express_getattr(IfcTendonAnchorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTendonAnchorTypeEnum, 'NOTDEFINED', INDETERMINATE) +coupler = IfcTendonAnchorTypeEnum.COUPLER +fixed_end = IfcTendonAnchorTypeEnum.FIXED_END +tensioning_end = IfcTendonAnchorTypeEnum.TENSIONING_END +userdefined = IfcTendonAnchorTypeEnum.USERDEFINED +notdefined = IfcTendonAnchorTypeEnum.NOTDEFINED IfcTendonConduitTypeEnum = enum_namespace() -duct = express_getattr(IfcTendonConduitTypeEnum, 'DUCT', INDETERMINATE) -coupler = express_getattr(IfcTendonConduitTypeEnum, 'COUPLER', INDETERMINATE) -grouting_duct = express_getattr(IfcTendonConduitTypeEnum, 'GROUTING_DUCT', INDETERMINATE) -trumpet = express_getattr(IfcTendonConduitTypeEnum, 'TRUMPET', INDETERMINATE) -diabolo = express_getattr(IfcTendonConduitTypeEnum, 'DIABOLO', INDETERMINATE) -userdefined = express_getattr(IfcTendonConduitTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTendonConduitTypeEnum, 'NOTDEFINED', INDETERMINATE) +duct = IfcTendonConduitTypeEnum.DUCT +coupler = IfcTendonConduitTypeEnum.COUPLER +grouting_duct = IfcTendonConduitTypeEnum.GROUTING_DUCT +trumpet = IfcTendonConduitTypeEnum.TRUMPET +diabolo = IfcTendonConduitTypeEnum.DIABOLO +userdefined = IfcTendonConduitTypeEnum.USERDEFINED +notdefined = IfcTendonConduitTypeEnum.NOTDEFINED IfcTendonTypeEnum = enum_namespace() -bar = express_getattr(IfcTendonTypeEnum, 'BAR', INDETERMINATE) -coated = express_getattr(IfcTendonTypeEnum, 'COATED', INDETERMINATE) -strand = express_getattr(IfcTendonTypeEnum, 'STRAND', INDETERMINATE) -wire = express_getattr(IfcTendonTypeEnum, 'WIRE', INDETERMINATE) -userdefined = express_getattr(IfcTendonTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTendonTypeEnum, 'NOTDEFINED', INDETERMINATE) +bar = IfcTendonTypeEnum.BAR +coated = IfcTendonTypeEnum.COATED +strand = IfcTendonTypeEnum.STRAND +wire = IfcTendonTypeEnum.WIRE +userdefined = IfcTendonTypeEnum.USERDEFINED +notdefined = IfcTendonTypeEnum.NOTDEFINED IfcTextPath = enum_namespace() -left = express_getattr(IfcTextPath, 'LEFT', INDETERMINATE) -right = express_getattr(IfcTextPath, 'RIGHT', INDETERMINATE) -up = express_getattr(IfcTextPath, 'UP', INDETERMINATE) -down = express_getattr(IfcTextPath, 'DOWN', INDETERMINATE) +left = IfcTextPath.LEFT +right = IfcTextPath.RIGHT +up = IfcTextPath.UP +down = IfcTextPath.DOWN IfcTimeSeriesDataTypeEnum = enum_namespace() -continuous = express_getattr(IfcTimeSeriesDataTypeEnum, 'CONTINUOUS', INDETERMINATE) -discrete = express_getattr(IfcTimeSeriesDataTypeEnum, 'DISCRETE', INDETERMINATE) -discretebinary = express_getattr(IfcTimeSeriesDataTypeEnum, 'DISCRETEBINARY', INDETERMINATE) -piecewisebinary = express_getattr(IfcTimeSeriesDataTypeEnum, 'PIECEWISEBINARY', INDETERMINATE) -piecewiseconstant = express_getattr(IfcTimeSeriesDataTypeEnum, 'PIECEWISECONSTANT', INDETERMINATE) -piecewisecontinuous = express_getattr(IfcTimeSeriesDataTypeEnum, 'PIECEWISECONTINUOUS', INDETERMINATE) -notdefined = express_getattr(IfcTimeSeriesDataTypeEnum, 'NOTDEFINED', INDETERMINATE) +continuous = IfcTimeSeriesDataTypeEnum.CONTINUOUS +discrete = IfcTimeSeriesDataTypeEnum.DISCRETE +discretebinary = IfcTimeSeriesDataTypeEnum.DISCRETEBINARY +piecewisebinary = IfcTimeSeriesDataTypeEnum.PIECEWISEBINARY +piecewiseconstant = IfcTimeSeriesDataTypeEnum.PIECEWISECONSTANT +piecewisecontinuous = IfcTimeSeriesDataTypeEnum.PIECEWISECONTINUOUS +notdefined = IfcTimeSeriesDataTypeEnum.NOTDEFINED IfcTrackElementTypeEnum = enum_namespace() -trackendofalignment = express_getattr(IfcTrackElementTypeEnum, 'TRACKENDOFALIGNMENT', INDETERMINATE) -blockingdevice = express_getattr(IfcTrackElementTypeEnum, 'BLOCKINGDEVICE', INDETERMINATE) -vehiclestop = express_getattr(IfcTrackElementTypeEnum, 'VEHICLESTOP', INDETERMINATE) -sleeper = express_getattr(IfcTrackElementTypeEnum, 'SLEEPER', INDETERMINATE) -half_set_of_blades = express_getattr(IfcTrackElementTypeEnum, 'HALF_SET_OF_BLADES', INDETERMINATE) -speedregulator = express_getattr(IfcTrackElementTypeEnum, 'SPEEDREGULATOR', INDETERMINATE) -derailer = express_getattr(IfcTrackElementTypeEnum, 'DERAILER', INDETERMINATE) -frog = express_getattr(IfcTrackElementTypeEnum, 'FROG', INDETERMINATE) -userdefined = express_getattr(IfcTrackElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTrackElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +trackendofalignment = IfcTrackElementTypeEnum.TRACKENDOFALIGNMENT +blockingdevice = IfcTrackElementTypeEnum.BLOCKINGDEVICE +vehiclestop = IfcTrackElementTypeEnum.VEHICLESTOP +sleeper = IfcTrackElementTypeEnum.SLEEPER +half_set_of_blades = IfcTrackElementTypeEnum.HALF_SET_OF_BLADES +speedregulator = IfcTrackElementTypeEnum.SPEEDREGULATOR +derailer = IfcTrackElementTypeEnum.DERAILER +frog = IfcTrackElementTypeEnum.FROG +userdefined = IfcTrackElementTypeEnum.USERDEFINED +notdefined = IfcTrackElementTypeEnum.NOTDEFINED IfcTransformerTypeEnum = enum_namespace() -current = express_getattr(IfcTransformerTypeEnum, 'CURRENT', INDETERMINATE) -frequency = express_getattr(IfcTransformerTypeEnum, 'FREQUENCY', INDETERMINATE) -inverter = express_getattr(IfcTransformerTypeEnum, 'INVERTER', INDETERMINATE) -rectifier = express_getattr(IfcTransformerTypeEnum, 'RECTIFIER', INDETERMINATE) -voltage = express_getattr(IfcTransformerTypeEnum, 'VOLTAGE', INDETERMINATE) -chopper = express_getattr(IfcTransformerTypeEnum, 'CHOPPER', INDETERMINATE) -combined = express_getattr(IfcTransformerTypeEnum, 'COMBINED', INDETERMINATE) -userdefined = express_getattr(IfcTransformerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTransformerTypeEnum, 'NOTDEFINED', INDETERMINATE) +current = IfcTransformerTypeEnum.CURRENT +frequency = IfcTransformerTypeEnum.FREQUENCY +inverter = IfcTransformerTypeEnum.INVERTER +rectifier = IfcTransformerTypeEnum.RECTIFIER +voltage = IfcTransformerTypeEnum.VOLTAGE +chopper = IfcTransformerTypeEnum.CHOPPER +combined = IfcTransformerTypeEnum.COMBINED +userdefined = IfcTransformerTypeEnum.USERDEFINED +notdefined = IfcTransformerTypeEnum.NOTDEFINED IfcTransitionCode = enum_namespace() -discontinuous = express_getattr(IfcTransitionCode, 'DISCONTINUOUS', INDETERMINATE) -continuous = express_getattr(IfcTransitionCode, 'CONTINUOUS', INDETERMINATE) -contsamegradient = express_getattr(IfcTransitionCode, 'CONTSAMEGRADIENT', INDETERMINATE) -contsamegradientsamecurvature = express_getattr(IfcTransitionCode, 'CONTSAMEGRADIENTSAMECURVATURE', INDETERMINATE) +discontinuous = IfcTransitionCode.DISCONTINUOUS +continuous = IfcTransitionCode.CONTINUOUS +contsamegradient = IfcTransitionCode.CONTSAMEGRADIENT +contsamegradientsamecurvature = IfcTransitionCode.CONTSAMEGRADIENTSAMECURVATURE IfcTransitionCurveType = enum_namespace() -biquadraticparabola = express_getattr(IfcTransitionCurveType, 'BIQUADRATICPARABOLA', INDETERMINATE) -blosscurve = express_getattr(IfcTransitionCurveType, 'BLOSSCURVE', INDETERMINATE) -clothoidcurve = express_getattr(IfcTransitionCurveType, 'CLOTHOIDCURVE', INDETERMINATE) -cosinecurve = express_getattr(IfcTransitionCurveType, 'COSINECURVE', INDETERMINATE) -cubicparabola = express_getattr(IfcTransitionCurveType, 'CUBICPARABOLA', INDETERMINATE) -sinecurve = express_getattr(IfcTransitionCurveType, 'SINECURVE', INDETERMINATE) +biquadraticparabola = IfcTransitionCurveType.BIQUADRATICPARABOLA +blosscurve = IfcTransitionCurveType.BLOSSCURVE +clothoidcurve = IfcTransitionCurveType.CLOTHOIDCURVE +cosinecurve = IfcTransitionCurveType.COSINECURVE +cubicparabola = IfcTransitionCurveType.CUBICPARABOLA +sinecurve = IfcTransitionCurveType.SINECURVE IfcTransportElementFixedTypeEnum = enum_namespace() -elevator = express_getattr(IfcTransportElementFixedTypeEnum, 'ELEVATOR', INDETERMINATE) -escalator = express_getattr(IfcTransportElementFixedTypeEnum, 'ESCALATOR', INDETERMINATE) -movingwalkway = express_getattr(IfcTransportElementFixedTypeEnum, 'MOVINGWALKWAY', INDETERMINATE) -craneway = express_getattr(IfcTransportElementFixedTypeEnum, 'CRANEWAY', INDETERMINATE) -liftinggear = express_getattr(IfcTransportElementFixedTypeEnum, 'LIFTINGGEAR', INDETERMINATE) -userdefined = express_getattr(IfcTransportElementFixedTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTransportElementFixedTypeEnum, 'NOTDEFINED', INDETERMINATE) +elevator = IfcTransportElementFixedTypeEnum.ELEVATOR +escalator = IfcTransportElementFixedTypeEnum.ESCALATOR +movingwalkway = IfcTransportElementFixedTypeEnum.MOVINGWALKWAY +craneway = IfcTransportElementFixedTypeEnum.CRANEWAY +liftinggear = IfcTransportElementFixedTypeEnum.LIFTINGGEAR +userdefined = IfcTransportElementFixedTypeEnum.USERDEFINED +notdefined = IfcTransportElementFixedTypeEnum.NOTDEFINED IfcTransportElementNonFixedTypeEnum = enum_namespace() -vehicle = express_getattr(IfcTransportElementNonFixedTypeEnum, 'VEHICLE', INDETERMINATE) -vehicletracked = express_getattr(IfcTransportElementNonFixedTypeEnum, 'VEHICLETRACKED', INDETERMINATE) -rollingstock = express_getattr(IfcTransportElementNonFixedTypeEnum, 'ROLLINGSTOCK', INDETERMINATE) -vehiclewheeled = express_getattr(IfcTransportElementNonFixedTypeEnum, 'VEHICLEWHEELED', INDETERMINATE) -vehicleair = express_getattr(IfcTransportElementNonFixedTypeEnum, 'VEHICLEAIR', INDETERMINATE) -cargo = express_getattr(IfcTransportElementNonFixedTypeEnum, 'CARGO', INDETERMINATE) -vehiclemarine = express_getattr(IfcTransportElementNonFixedTypeEnum, 'VEHICLEMARINE', INDETERMINATE) -userdefined = express_getattr(IfcTransportElementNonFixedTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTransportElementNonFixedTypeEnum, 'NOTDEFINED', INDETERMINATE) +vehicle = IfcTransportElementNonFixedTypeEnum.VEHICLE +vehicletracked = IfcTransportElementNonFixedTypeEnum.VEHICLETRACKED +rollingstock = IfcTransportElementNonFixedTypeEnum.ROLLINGSTOCK +vehiclewheeled = IfcTransportElementNonFixedTypeEnum.VEHICLEWHEELED +vehicleair = IfcTransportElementNonFixedTypeEnum.VEHICLEAIR +cargo = IfcTransportElementNonFixedTypeEnum.CARGO +vehiclemarine = IfcTransportElementNonFixedTypeEnum.VEHICLEMARINE +userdefined = IfcTransportElementNonFixedTypeEnum.USERDEFINED +notdefined = IfcTransportElementNonFixedTypeEnum.NOTDEFINED IfcTrimmingPreference = enum_namespace() -cartesian = express_getattr(IfcTrimmingPreference, 'CARTESIAN', INDETERMINATE) -parameter = express_getattr(IfcTrimmingPreference, 'PARAMETER', INDETERMINATE) -unspecified = express_getattr(IfcTrimmingPreference, 'UNSPECIFIED', INDETERMINATE) +cartesian = IfcTrimmingPreference.CARTESIAN +parameter = IfcTrimmingPreference.PARAMETER +unspecified = IfcTrimmingPreference.UNSPECIFIED IfcTubeBundleTypeEnum = enum_namespace() -finned = express_getattr(IfcTubeBundleTypeEnum, 'FINNED', INDETERMINATE) -userdefined = express_getattr(IfcTubeBundleTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTubeBundleTypeEnum, 'NOTDEFINED', INDETERMINATE) +finned = IfcTubeBundleTypeEnum.FINNED +userdefined = IfcTubeBundleTypeEnum.USERDEFINED +notdefined = IfcTubeBundleTypeEnum.NOTDEFINED IfcUnitEnum = enum_namespace() -absorbeddoseunit = express_getattr(IfcUnitEnum, 'ABSORBEDDOSEUNIT', INDETERMINATE) -amountofsubstanceunit = express_getattr(IfcUnitEnum, 'AMOUNTOFSUBSTANCEUNIT', INDETERMINATE) -areaunit = express_getattr(IfcUnitEnum, 'AREAUNIT', INDETERMINATE) -doseequivalentunit = express_getattr(IfcUnitEnum, 'DOSEEQUIVALENTUNIT', INDETERMINATE) -electriccapacitanceunit = express_getattr(IfcUnitEnum, 'ELECTRICCAPACITANCEUNIT', INDETERMINATE) -electricchargeunit = express_getattr(IfcUnitEnum, 'ELECTRICCHARGEUNIT', INDETERMINATE) -electricconductanceunit = express_getattr(IfcUnitEnum, 'ELECTRICCONDUCTANCEUNIT', INDETERMINATE) -electriccurrentunit = express_getattr(IfcUnitEnum, 'ELECTRICCURRENTUNIT', INDETERMINATE) -electricresistanceunit = express_getattr(IfcUnitEnum, 'ELECTRICRESISTANCEUNIT', INDETERMINATE) -electricvoltageunit = express_getattr(IfcUnitEnum, 'ELECTRICVOLTAGEUNIT', INDETERMINATE) -energyunit = express_getattr(IfcUnitEnum, 'ENERGYUNIT', INDETERMINATE) -forceunit = express_getattr(IfcUnitEnum, 'FORCEUNIT', INDETERMINATE) -frequencyunit = express_getattr(IfcUnitEnum, 'FREQUENCYUNIT', INDETERMINATE) -illuminanceunit = express_getattr(IfcUnitEnum, 'ILLUMINANCEUNIT', INDETERMINATE) -inductanceunit = express_getattr(IfcUnitEnum, 'INDUCTANCEUNIT', INDETERMINATE) -lengthunit = express_getattr(IfcUnitEnum, 'LENGTHUNIT', INDETERMINATE) -luminousfluxunit = express_getattr(IfcUnitEnum, 'LUMINOUSFLUXUNIT', INDETERMINATE) -luminousintensityunit = express_getattr(IfcUnitEnum, 'LUMINOUSINTENSITYUNIT', INDETERMINATE) -magneticfluxdensityunit = express_getattr(IfcUnitEnum, 'MAGNETICFLUXDENSITYUNIT', INDETERMINATE) -magneticfluxunit = express_getattr(IfcUnitEnum, 'MAGNETICFLUXUNIT', INDETERMINATE) -massunit = express_getattr(IfcUnitEnum, 'MASSUNIT', INDETERMINATE) -planeangleunit = express_getattr(IfcUnitEnum, 'PLANEANGLEUNIT', INDETERMINATE) -powerunit = express_getattr(IfcUnitEnum, 'POWERUNIT', INDETERMINATE) -pressureunit = express_getattr(IfcUnitEnum, 'PRESSUREUNIT', INDETERMINATE) -radioactivityunit = express_getattr(IfcUnitEnum, 'RADIOACTIVITYUNIT', INDETERMINATE) -solidangleunit = express_getattr(IfcUnitEnum, 'SOLIDANGLEUNIT', INDETERMINATE) -thermodynamictemperatureunit = express_getattr(IfcUnitEnum, 'THERMODYNAMICTEMPERATUREUNIT', INDETERMINATE) -timeunit = express_getattr(IfcUnitEnum, 'TIMEUNIT', INDETERMINATE) -volumeunit = express_getattr(IfcUnitEnum, 'VOLUMEUNIT', INDETERMINATE) -userdefined = express_getattr(IfcUnitEnum, 'USERDEFINED', INDETERMINATE) +absorbeddoseunit = IfcUnitEnum.ABSORBEDDOSEUNIT +amountofsubstanceunit = IfcUnitEnum.AMOUNTOFSUBSTANCEUNIT +areaunit = IfcUnitEnum.AREAUNIT +doseequivalentunit = IfcUnitEnum.DOSEEQUIVALENTUNIT +electriccapacitanceunit = IfcUnitEnum.ELECTRICCAPACITANCEUNIT +electricchargeunit = IfcUnitEnum.ELECTRICCHARGEUNIT +electricconductanceunit = IfcUnitEnum.ELECTRICCONDUCTANCEUNIT +electriccurrentunit = IfcUnitEnum.ELECTRICCURRENTUNIT +electricresistanceunit = IfcUnitEnum.ELECTRICRESISTANCEUNIT +electricvoltageunit = IfcUnitEnum.ELECTRICVOLTAGEUNIT +energyunit = IfcUnitEnum.ENERGYUNIT +forceunit = IfcUnitEnum.FORCEUNIT +frequencyunit = IfcUnitEnum.FREQUENCYUNIT +illuminanceunit = IfcUnitEnum.ILLUMINANCEUNIT +inductanceunit = IfcUnitEnum.INDUCTANCEUNIT +lengthunit = IfcUnitEnum.LENGTHUNIT +luminousfluxunit = IfcUnitEnum.LUMINOUSFLUXUNIT +luminousintensityunit = IfcUnitEnum.LUMINOUSINTENSITYUNIT +magneticfluxdensityunit = IfcUnitEnum.MAGNETICFLUXDENSITYUNIT +magneticfluxunit = IfcUnitEnum.MAGNETICFLUXUNIT +massunit = IfcUnitEnum.MASSUNIT +planeangleunit = IfcUnitEnum.PLANEANGLEUNIT +powerunit = IfcUnitEnum.POWERUNIT +pressureunit = IfcUnitEnum.PRESSUREUNIT +radioactivityunit = IfcUnitEnum.RADIOACTIVITYUNIT +solidangleunit = IfcUnitEnum.SOLIDANGLEUNIT +thermodynamictemperatureunit = IfcUnitEnum.THERMODYNAMICTEMPERATUREUNIT +timeunit = IfcUnitEnum.TIMEUNIT +volumeunit = IfcUnitEnum.VOLUMEUNIT +userdefined = IfcUnitEnum.USERDEFINED IfcUnitaryControlElementTypeEnum = enum_namespace() -alarmpanel = express_getattr(IfcUnitaryControlElementTypeEnum, 'ALARMPANEL', INDETERMINATE) -controlpanel = express_getattr(IfcUnitaryControlElementTypeEnum, 'CONTROLPANEL', INDETERMINATE) -gasdetectionpanel = express_getattr(IfcUnitaryControlElementTypeEnum, 'GASDETECTIONPANEL', INDETERMINATE) -indicatorpanel = express_getattr(IfcUnitaryControlElementTypeEnum, 'INDICATORPANEL', INDETERMINATE) -mimicpanel = express_getattr(IfcUnitaryControlElementTypeEnum, 'MIMICPANEL', INDETERMINATE) -humidistat = express_getattr(IfcUnitaryControlElementTypeEnum, 'HUMIDISTAT', INDETERMINATE) -thermostat = express_getattr(IfcUnitaryControlElementTypeEnum, 'THERMOSTAT', INDETERMINATE) -weatherstation = express_getattr(IfcUnitaryControlElementTypeEnum, 'WEATHERSTATION', INDETERMINATE) -combined = express_getattr(IfcUnitaryControlElementTypeEnum, 'COMBINED', INDETERMINATE) -userdefined = express_getattr(IfcUnitaryControlElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcUnitaryControlElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +alarmpanel = IfcUnitaryControlElementTypeEnum.ALARMPANEL +controlpanel = IfcUnitaryControlElementTypeEnum.CONTROLPANEL +gasdetectionpanel = IfcUnitaryControlElementTypeEnum.GASDETECTIONPANEL +indicatorpanel = IfcUnitaryControlElementTypeEnum.INDICATORPANEL +mimicpanel = IfcUnitaryControlElementTypeEnum.MIMICPANEL +humidistat = IfcUnitaryControlElementTypeEnum.HUMIDISTAT +thermostat = IfcUnitaryControlElementTypeEnum.THERMOSTAT +weatherstation = IfcUnitaryControlElementTypeEnum.WEATHERSTATION +combined = IfcUnitaryControlElementTypeEnum.COMBINED +userdefined = IfcUnitaryControlElementTypeEnum.USERDEFINED +notdefined = IfcUnitaryControlElementTypeEnum.NOTDEFINED IfcUnitaryEquipmentTypeEnum = enum_namespace() -airhandler = express_getattr(IfcUnitaryEquipmentTypeEnum, 'AIRHANDLER', INDETERMINATE) -airconditioningunit = express_getattr(IfcUnitaryEquipmentTypeEnum, 'AIRCONDITIONINGUNIT', INDETERMINATE) -dehumidifier = express_getattr(IfcUnitaryEquipmentTypeEnum, 'DEHUMIDIFIER', INDETERMINATE) -splitsystem = express_getattr(IfcUnitaryEquipmentTypeEnum, 'SPLITSYSTEM', INDETERMINATE) -rooftopunit = express_getattr(IfcUnitaryEquipmentTypeEnum, 'ROOFTOPUNIT', INDETERMINATE) -userdefined = express_getattr(IfcUnitaryEquipmentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcUnitaryEquipmentTypeEnum, 'NOTDEFINED', INDETERMINATE) +airhandler = IfcUnitaryEquipmentTypeEnum.AIRHANDLER +airconditioningunit = IfcUnitaryEquipmentTypeEnum.AIRCONDITIONINGUNIT +dehumidifier = IfcUnitaryEquipmentTypeEnum.DEHUMIDIFIER +splitsystem = IfcUnitaryEquipmentTypeEnum.SPLITSYSTEM +rooftopunit = IfcUnitaryEquipmentTypeEnum.ROOFTOPUNIT +userdefined = IfcUnitaryEquipmentTypeEnum.USERDEFINED +notdefined = IfcUnitaryEquipmentTypeEnum.NOTDEFINED IfcValveTypeEnum = enum_namespace() -airrelease = express_getattr(IfcValveTypeEnum, 'AIRRELEASE', INDETERMINATE) -antivacuum = express_getattr(IfcValveTypeEnum, 'ANTIVACUUM', INDETERMINATE) -changeover = express_getattr(IfcValveTypeEnum, 'CHANGEOVER', INDETERMINATE) -check = express_getattr(IfcValveTypeEnum, 'CHECK', INDETERMINATE) -commissioning = express_getattr(IfcValveTypeEnum, 'COMMISSIONING', INDETERMINATE) -diverting = express_getattr(IfcValveTypeEnum, 'DIVERTING', INDETERMINATE) -drawoffcock = express_getattr(IfcValveTypeEnum, 'DRAWOFFCOCK', INDETERMINATE) -doublecheck = express_getattr(IfcValveTypeEnum, 'DOUBLECHECK', INDETERMINATE) -doubleregulating = express_getattr(IfcValveTypeEnum, 'DOUBLEREGULATING', INDETERMINATE) -faucet = express_getattr(IfcValveTypeEnum, 'FAUCET', INDETERMINATE) -flushing = express_getattr(IfcValveTypeEnum, 'FLUSHING', INDETERMINATE) -gascock = express_getattr(IfcValveTypeEnum, 'GASCOCK', INDETERMINATE) -gastap = express_getattr(IfcValveTypeEnum, 'GASTAP', INDETERMINATE) -isolating = express_getattr(IfcValveTypeEnum, 'ISOLATING', INDETERMINATE) -mixing = express_getattr(IfcValveTypeEnum, 'MIXING', INDETERMINATE) -pressurereducing = express_getattr(IfcValveTypeEnum, 'PRESSUREREDUCING', INDETERMINATE) -pressurerelief = express_getattr(IfcValveTypeEnum, 'PRESSURERELIEF', INDETERMINATE) -regulating = express_getattr(IfcValveTypeEnum, 'REGULATING', INDETERMINATE) -safetycutoff = express_getattr(IfcValveTypeEnum, 'SAFETYCUTOFF', INDETERMINATE) -steamtrap = express_getattr(IfcValveTypeEnum, 'STEAMTRAP', INDETERMINATE) -stopcock = express_getattr(IfcValveTypeEnum, 'STOPCOCK', INDETERMINATE) -userdefined = express_getattr(IfcValveTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcValveTypeEnum, 'NOTDEFINED', INDETERMINATE) +airrelease = IfcValveTypeEnum.AIRRELEASE +antivacuum = IfcValveTypeEnum.ANTIVACUUM +changeover = IfcValveTypeEnum.CHANGEOVER +check = IfcValveTypeEnum.CHECK +commissioning = IfcValveTypeEnum.COMMISSIONING +diverting = IfcValveTypeEnum.DIVERTING +drawoffcock = IfcValveTypeEnum.DRAWOFFCOCK +doublecheck = IfcValveTypeEnum.DOUBLECHECK +doubleregulating = IfcValveTypeEnum.DOUBLEREGULATING +faucet = IfcValveTypeEnum.FAUCET +flushing = IfcValveTypeEnum.FLUSHING +gascock = IfcValveTypeEnum.GASCOCK +gastap = IfcValveTypeEnum.GASTAP +isolating = IfcValveTypeEnum.ISOLATING +mixing = IfcValveTypeEnum.MIXING +pressurereducing = IfcValveTypeEnum.PRESSUREREDUCING +pressurerelief = IfcValveTypeEnum.PRESSURERELIEF +regulating = IfcValveTypeEnum.REGULATING +safetycutoff = IfcValveTypeEnum.SAFETYCUTOFF +steamtrap = IfcValveTypeEnum.STEAMTRAP +stopcock = IfcValveTypeEnum.STOPCOCK +userdefined = IfcValveTypeEnum.USERDEFINED +notdefined = IfcValveTypeEnum.NOTDEFINED IfcVibrationDamperTypeEnum = enum_namespace() -bending_yield = express_getattr(IfcVibrationDamperTypeEnum, 'BENDING_YIELD', INDETERMINATE) -shear_yield = express_getattr(IfcVibrationDamperTypeEnum, 'SHEAR_YIELD', INDETERMINATE) -axial_yield = express_getattr(IfcVibrationDamperTypeEnum, 'AXIAL_YIELD', INDETERMINATE) -friction = express_getattr(IfcVibrationDamperTypeEnum, 'FRICTION', INDETERMINATE) -viscous = express_getattr(IfcVibrationDamperTypeEnum, 'VISCOUS', INDETERMINATE) -rubber = express_getattr(IfcVibrationDamperTypeEnum, 'RUBBER', INDETERMINATE) -userdefined = express_getattr(IfcVibrationDamperTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcVibrationDamperTypeEnum, 'NOTDEFINED', INDETERMINATE) +bending_yield = IfcVibrationDamperTypeEnum.BENDING_YIELD +shear_yield = IfcVibrationDamperTypeEnum.SHEAR_YIELD +axial_yield = IfcVibrationDamperTypeEnum.AXIAL_YIELD +friction = IfcVibrationDamperTypeEnum.FRICTION +viscous = IfcVibrationDamperTypeEnum.VISCOUS +rubber = IfcVibrationDamperTypeEnum.RUBBER +userdefined = IfcVibrationDamperTypeEnum.USERDEFINED +notdefined = IfcVibrationDamperTypeEnum.NOTDEFINED IfcVibrationIsolatorTypeEnum = enum_namespace() -compression = express_getattr(IfcVibrationIsolatorTypeEnum, 'COMPRESSION', INDETERMINATE) -spring = express_getattr(IfcVibrationIsolatorTypeEnum, 'SPRING', INDETERMINATE) -base = express_getattr(IfcVibrationIsolatorTypeEnum, 'BASE', INDETERMINATE) -userdefined = express_getattr(IfcVibrationIsolatorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcVibrationIsolatorTypeEnum, 'NOTDEFINED', INDETERMINATE) +compression = IfcVibrationIsolatorTypeEnum.COMPRESSION +spring = IfcVibrationIsolatorTypeEnum.SPRING +base = IfcVibrationIsolatorTypeEnum.BASE +userdefined = IfcVibrationIsolatorTypeEnum.USERDEFINED +notdefined = IfcVibrationIsolatorTypeEnum.NOTDEFINED IfcVoidingFeatureTypeEnum = enum_namespace() -cutout = express_getattr(IfcVoidingFeatureTypeEnum, 'CUTOUT', INDETERMINATE) -notch = express_getattr(IfcVoidingFeatureTypeEnum, 'NOTCH', INDETERMINATE) -hole = express_getattr(IfcVoidingFeatureTypeEnum, 'HOLE', INDETERMINATE) -miter = express_getattr(IfcVoidingFeatureTypeEnum, 'MITER', INDETERMINATE) -chamfer = express_getattr(IfcVoidingFeatureTypeEnum, 'CHAMFER', INDETERMINATE) -edge = express_getattr(IfcVoidingFeatureTypeEnum, 'EDGE', INDETERMINATE) -userdefined = express_getattr(IfcVoidingFeatureTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcVoidingFeatureTypeEnum, 'NOTDEFINED', INDETERMINATE) +cutout = IfcVoidingFeatureTypeEnum.CUTOUT +notch = IfcVoidingFeatureTypeEnum.NOTCH +hole = IfcVoidingFeatureTypeEnum.HOLE +miter = IfcVoidingFeatureTypeEnum.MITER +chamfer = IfcVoidingFeatureTypeEnum.CHAMFER +edge = IfcVoidingFeatureTypeEnum.EDGE +userdefined = IfcVoidingFeatureTypeEnum.USERDEFINED +notdefined = IfcVoidingFeatureTypeEnum.NOTDEFINED IfcWallTypeEnum = enum_namespace() -movable = express_getattr(IfcWallTypeEnum, 'MOVABLE', INDETERMINATE) -parapet = express_getattr(IfcWallTypeEnum, 'PARAPET', INDETERMINATE) -partitioning = express_getattr(IfcWallTypeEnum, 'PARTITIONING', INDETERMINATE) -plumbingwall = express_getattr(IfcWallTypeEnum, 'PLUMBINGWALL', INDETERMINATE) -shear = express_getattr(IfcWallTypeEnum, 'SHEAR', INDETERMINATE) -solidwall = express_getattr(IfcWallTypeEnum, 'SOLIDWALL', INDETERMINATE) -standard = express_getattr(IfcWallTypeEnum, 'STANDARD', INDETERMINATE) -polygonal = express_getattr(IfcWallTypeEnum, 'POLYGONAL', INDETERMINATE) -elementedwall = express_getattr(IfcWallTypeEnum, 'ELEMENTEDWALL', INDETERMINATE) -retainingwall = express_getattr(IfcWallTypeEnum, 'RETAININGWALL', INDETERMINATE) -wavewall = express_getattr(IfcWallTypeEnum, 'WAVEWALL', INDETERMINATE) -userdefined = express_getattr(IfcWallTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcWallTypeEnum, 'NOTDEFINED', INDETERMINATE) +movable = IfcWallTypeEnum.MOVABLE +parapet = IfcWallTypeEnum.PARAPET +partitioning = IfcWallTypeEnum.PARTITIONING +plumbingwall = IfcWallTypeEnum.PLUMBINGWALL +shear = IfcWallTypeEnum.SHEAR +solidwall = IfcWallTypeEnum.SOLIDWALL +standard = IfcWallTypeEnum.STANDARD +polygonal = IfcWallTypeEnum.POLYGONAL +elementedwall = IfcWallTypeEnum.ELEMENTEDWALL +retainingwall = IfcWallTypeEnum.RETAININGWALL +wavewall = IfcWallTypeEnum.WAVEWALL +userdefined = IfcWallTypeEnum.USERDEFINED +notdefined = IfcWallTypeEnum.NOTDEFINED IfcWasteTerminalTypeEnum = enum_namespace() -floortrap = express_getattr(IfcWasteTerminalTypeEnum, 'FLOORTRAP', INDETERMINATE) -floorwaste = express_getattr(IfcWasteTerminalTypeEnum, 'FLOORWASTE', INDETERMINATE) -gullysump = express_getattr(IfcWasteTerminalTypeEnum, 'GULLYSUMP', INDETERMINATE) -gullytrap = express_getattr(IfcWasteTerminalTypeEnum, 'GULLYTRAP', INDETERMINATE) -roofdrain = express_getattr(IfcWasteTerminalTypeEnum, 'ROOFDRAIN', INDETERMINATE) -wastedisposalunit = express_getattr(IfcWasteTerminalTypeEnum, 'WASTEDISPOSALUNIT', INDETERMINATE) -wastetrap = express_getattr(IfcWasteTerminalTypeEnum, 'WASTETRAP', INDETERMINATE) -userdefined = express_getattr(IfcWasteTerminalTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcWasteTerminalTypeEnum, 'NOTDEFINED', INDETERMINATE) +floortrap = IfcWasteTerminalTypeEnum.FLOORTRAP +floorwaste = IfcWasteTerminalTypeEnum.FLOORWASTE +gullysump = IfcWasteTerminalTypeEnum.GULLYSUMP +gullytrap = IfcWasteTerminalTypeEnum.GULLYTRAP +roofdrain = IfcWasteTerminalTypeEnum.ROOFDRAIN +wastedisposalunit = IfcWasteTerminalTypeEnum.WASTEDISPOSALUNIT +wastetrap = IfcWasteTerminalTypeEnum.WASTETRAP +userdefined = IfcWasteTerminalTypeEnum.USERDEFINED +notdefined = IfcWasteTerminalTypeEnum.NOTDEFINED IfcWindowPanelOperationEnum = enum_namespace() -sidehungrighthand = express_getattr(IfcWindowPanelOperationEnum, 'SIDEHUNGRIGHTHAND', INDETERMINATE) -sidehunglefthand = express_getattr(IfcWindowPanelOperationEnum, 'SIDEHUNGLEFTHAND', INDETERMINATE) -tiltandturnrighthand = express_getattr(IfcWindowPanelOperationEnum, 'TILTANDTURNRIGHTHAND', INDETERMINATE) -tiltandturnlefthand = express_getattr(IfcWindowPanelOperationEnum, 'TILTANDTURNLEFTHAND', INDETERMINATE) -tophung = express_getattr(IfcWindowPanelOperationEnum, 'TOPHUNG', INDETERMINATE) -bottomhung = express_getattr(IfcWindowPanelOperationEnum, 'BOTTOMHUNG', INDETERMINATE) -pivothorizontal = express_getattr(IfcWindowPanelOperationEnum, 'PIVOTHORIZONTAL', INDETERMINATE) -pivotvertical = express_getattr(IfcWindowPanelOperationEnum, 'PIVOTVERTICAL', INDETERMINATE) -slidinghorizontal = express_getattr(IfcWindowPanelOperationEnum, 'SLIDINGHORIZONTAL', INDETERMINATE) -slidingvertical = express_getattr(IfcWindowPanelOperationEnum, 'SLIDINGVERTICAL', INDETERMINATE) -removablecasement = express_getattr(IfcWindowPanelOperationEnum, 'REMOVABLECASEMENT', INDETERMINATE) -fixedcasement = express_getattr(IfcWindowPanelOperationEnum, 'FIXEDCASEMENT', INDETERMINATE) -otheroperation = express_getattr(IfcWindowPanelOperationEnum, 'OTHEROPERATION', INDETERMINATE) -notdefined = express_getattr(IfcWindowPanelOperationEnum, 'NOTDEFINED', INDETERMINATE) +sidehungrighthand = IfcWindowPanelOperationEnum.SIDEHUNGRIGHTHAND +sidehunglefthand = IfcWindowPanelOperationEnum.SIDEHUNGLEFTHAND +tiltandturnrighthand = IfcWindowPanelOperationEnum.TILTANDTURNRIGHTHAND +tiltandturnlefthand = IfcWindowPanelOperationEnum.TILTANDTURNLEFTHAND +tophung = IfcWindowPanelOperationEnum.TOPHUNG +bottomhung = IfcWindowPanelOperationEnum.BOTTOMHUNG +pivothorizontal = IfcWindowPanelOperationEnum.PIVOTHORIZONTAL +pivotvertical = IfcWindowPanelOperationEnum.PIVOTVERTICAL +slidinghorizontal = IfcWindowPanelOperationEnum.SLIDINGHORIZONTAL +slidingvertical = IfcWindowPanelOperationEnum.SLIDINGVERTICAL +removablecasement = IfcWindowPanelOperationEnum.REMOVABLECASEMENT +fixedcasement = IfcWindowPanelOperationEnum.FIXEDCASEMENT +otheroperation = IfcWindowPanelOperationEnum.OTHEROPERATION +notdefined = IfcWindowPanelOperationEnum.NOTDEFINED IfcWindowPanelPositionEnum = enum_namespace() -left = express_getattr(IfcWindowPanelPositionEnum, 'LEFT', INDETERMINATE) -middle = express_getattr(IfcWindowPanelPositionEnum, 'MIDDLE', INDETERMINATE) -right = express_getattr(IfcWindowPanelPositionEnum, 'RIGHT', INDETERMINATE) -bottom = express_getattr(IfcWindowPanelPositionEnum, 'BOTTOM', INDETERMINATE) -top = express_getattr(IfcWindowPanelPositionEnum, 'TOP', INDETERMINATE) -notdefined = express_getattr(IfcWindowPanelPositionEnum, 'NOTDEFINED', INDETERMINATE) +left = IfcWindowPanelPositionEnum.LEFT +middle = IfcWindowPanelPositionEnum.MIDDLE +right = IfcWindowPanelPositionEnum.RIGHT +bottom = IfcWindowPanelPositionEnum.BOTTOM +top = IfcWindowPanelPositionEnum.TOP +notdefined = IfcWindowPanelPositionEnum.NOTDEFINED IfcWindowStyleConstructionEnum = enum_namespace() -aluminium = express_getattr(IfcWindowStyleConstructionEnum, 'ALUMINIUM', INDETERMINATE) -high_grade_steel = express_getattr(IfcWindowStyleConstructionEnum, 'HIGH_GRADE_STEEL', INDETERMINATE) -steel = express_getattr(IfcWindowStyleConstructionEnum, 'STEEL', INDETERMINATE) -wood = express_getattr(IfcWindowStyleConstructionEnum, 'WOOD', INDETERMINATE) -aluminium_wood = express_getattr(IfcWindowStyleConstructionEnum, 'ALUMINIUM_WOOD', INDETERMINATE) -plastic = express_getattr(IfcWindowStyleConstructionEnum, 'PLASTIC', INDETERMINATE) -other_construction = express_getattr(IfcWindowStyleConstructionEnum, 'OTHER_CONSTRUCTION', INDETERMINATE) -notdefined = express_getattr(IfcWindowStyleConstructionEnum, 'NOTDEFINED', INDETERMINATE) +aluminium = IfcWindowStyleConstructionEnum.ALUMINIUM +high_grade_steel = IfcWindowStyleConstructionEnum.HIGH_GRADE_STEEL +steel = IfcWindowStyleConstructionEnum.STEEL +wood = IfcWindowStyleConstructionEnum.WOOD +aluminium_wood = IfcWindowStyleConstructionEnum.ALUMINIUM_WOOD +plastic = IfcWindowStyleConstructionEnum.PLASTIC +other_construction = IfcWindowStyleConstructionEnum.OTHER_CONSTRUCTION +notdefined = IfcWindowStyleConstructionEnum.NOTDEFINED IfcWindowStyleOperationEnum = enum_namespace() -single_panel = express_getattr(IfcWindowStyleOperationEnum, 'SINGLE_PANEL', INDETERMINATE) -double_panel_vertical = express_getattr(IfcWindowStyleOperationEnum, 'DOUBLE_PANEL_VERTICAL', INDETERMINATE) -double_panel_horizontal = express_getattr(IfcWindowStyleOperationEnum, 'DOUBLE_PANEL_HORIZONTAL', INDETERMINATE) -triple_panel_vertical = express_getattr(IfcWindowStyleOperationEnum, 'TRIPLE_PANEL_VERTICAL', INDETERMINATE) -triple_panel_bottom = express_getattr(IfcWindowStyleOperationEnum, 'TRIPLE_PANEL_BOTTOM', INDETERMINATE) -triple_panel_top = express_getattr(IfcWindowStyleOperationEnum, 'TRIPLE_PANEL_TOP', INDETERMINATE) -triple_panel_left = express_getattr(IfcWindowStyleOperationEnum, 'TRIPLE_PANEL_LEFT', INDETERMINATE) -triple_panel_right = express_getattr(IfcWindowStyleOperationEnum, 'TRIPLE_PANEL_RIGHT', INDETERMINATE) -triple_panel_horizontal = express_getattr(IfcWindowStyleOperationEnum, 'TRIPLE_PANEL_HORIZONTAL', INDETERMINATE) -userdefined = express_getattr(IfcWindowStyleOperationEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcWindowStyleOperationEnum, 'NOTDEFINED', INDETERMINATE) +single_panel = IfcWindowStyleOperationEnum.SINGLE_PANEL +double_panel_vertical = IfcWindowStyleOperationEnum.DOUBLE_PANEL_VERTICAL +double_panel_horizontal = IfcWindowStyleOperationEnum.DOUBLE_PANEL_HORIZONTAL +triple_panel_vertical = IfcWindowStyleOperationEnum.TRIPLE_PANEL_VERTICAL +triple_panel_bottom = IfcWindowStyleOperationEnum.TRIPLE_PANEL_BOTTOM +triple_panel_top = IfcWindowStyleOperationEnum.TRIPLE_PANEL_TOP +triple_panel_left = IfcWindowStyleOperationEnum.TRIPLE_PANEL_LEFT +triple_panel_right = IfcWindowStyleOperationEnum.TRIPLE_PANEL_RIGHT +triple_panel_horizontal = IfcWindowStyleOperationEnum.TRIPLE_PANEL_HORIZONTAL +userdefined = IfcWindowStyleOperationEnum.USERDEFINED +notdefined = IfcWindowStyleOperationEnum.NOTDEFINED IfcWindowTypeEnum = enum_namespace() -window = express_getattr(IfcWindowTypeEnum, 'WINDOW', INDETERMINATE) -skylight = express_getattr(IfcWindowTypeEnum, 'SKYLIGHT', INDETERMINATE) -lightdome = express_getattr(IfcWindowTypeEnum, 'LIGHTDOME', INDETERMINATE) -userdefined = express_getattr(IfcWindowTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcWindowTypeEnum, 'NOTDEFINED', INDETERMINATE) +window = IfcWindowTypeEnum.WINDOW +skylight = IfcWindowTypeEnum.SKYLIGHT +lightdome = IfcWindowTypeEnum.LIGHTDOME +userdefined = IfcWindowTypeEnum.USERDEFINED +notdefined = IfcWindowTypeEnum.NOTDEFINED IfcWindowTypePartitioningEnum = enum_namespace() -single_panel = express_getattr(IfcWindowTypePartitioningEnum, 'SINGLE_PANEL', INDETERMINATE) -double_panel_vertical = express_getattr(IfcWindowTypePartitioningEnum, 'DOUBLE_PANEL_VERTICAL', INDETERMINATE) -double_panel_horizontal = express_getattr(IfcWindowTypePartitioningEnum, 'DOUBLE_PANEL_HORIZONTAL', INDETERMINATE) -triple_panel_vertical = express_getattr(IfcWindowTypePartitioningEnum, 'TRIPLE_PANEL_VERTICAL', INDETERMINATE) -triple_panel_bottom = express_getattr(IfcWindowTypePartitioningEnum, 'TRIPLE_PANEL_BOTTOM', INDETERMINATE) -triple_panel_top = express_getattr(IfcWindowTypePartitioningEnum, 'TRIPLE_PANEL_TOP', INDETERMINATE) -triple_panel_left = express_getattr(IfcWindowTypePartitioningEnum, 'TRIPLE_PANEL_LEFT', INDETERMINATE) -triple_panel_right = express_getattr(IfcWindowTypePartitioningEnum, 'TRIPLE_PANEL_RIGHT', INDETERMINATE) -triple_panel_horizontal = express_getattr(IfcWindowTypePartitioningEnum, 'TRIPLE_PANEL_HORIZONTAL', INDETERMINATE) -userdefined = express_getattr(IfcWindowTypePartitioningEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcWindowTypePartitioningEnum, 'NOTDEFINED', INDETERMINATE) +single_panel = IfcWindowTypePartitioningEnum.SINGLE_PANEL +double_panel_vertical = IfcWindowTypePartitioningEnum.DOUBLE_PANEL_VERTICAL +double_panel_horizontal = IfcWindowTypePartitioningEnum.DOUBLE_PANEL_HORIZONTAL +triple_panel_vertical = IfcWindowTypePartitioningEnum.TRIPLE_PANEL_VERTICAL +triple_panel_bottom = IfcWindowTypePartitioningEnum.TRIPLE_PANEL_BOTTOM +triple_panel_top = IfcWindowTypePartitioningEnum.TRIPLE_PANEL_TOP +triple_panel_left = IfcWindowTypePartitioningEnum.TRIPLE_PANEL_LEFT +triple_panel_right = IfcWindowTypePartitioningEnum.TRIPLE_PANEL_RIGHT +triple_panel_horizontal = IfcWindowTypePartitioningEnum.TRIPLE_PANEL_HORIZONTAL +userdefined = IfcWindowTypePartitioningEnum.USERDEFINED +notdefined = IfcWindowTypePartitioningEnum.NOTDEFINED IfcWorkCalendarTypeEnum = enum_namespace() -firstshift = express_getattr(IfcWorkCalendarTypeEnum, 'FIRSTSHIFT', INDETERMINATE) -secondshift = express_getattr(IfcWorkCalendarTypeEnum, 'SECONDSHIFT', INDETERMINATE) -thirdshift = express_getattr(IfcWorkCalendarTypeEnum, 'THIRDSHIFT', INDETERMINATE) -userdefined = express_getattr(IfcWorkCalendarTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcWorkCalendarTypeEnum, 'NOTDEFINED', INDETERMINATE) +firstshift = IfcWorkCalendarTypeEnum.FIRSTSHIFT +secondshift = IfcWorkCalendarTypeEnum.SECONDSHIFT +thirdshift = IfcWorkCalendarTypeEnum.THIRDSHIFT +userdefined = IfcWorkCalendarTypeEnum.USERDEFINED +notdefined = IfcWorkCalendarTypeEnum.NOTDEFINED IfcWorkPlanTypeEnum = enum_namespace() -actual = express_getattr(IfcWorkPlanTypeEnum, 'ACTUAL', INDETERMINATE) -baseline = express_getattr(IfcWorkPlanTypeEnum, 'BASELINE', INDETERMINATE) -planned = express_getattr(IfcWorkPlanTypeEnum, 'PLANNED', INDETERMINATE) -userdefined = express_getattr(IfcWorkPlanTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcWorkPlanTypeEnum, 'NOTDEFINED', INDETERMINATE) +actual = IfcWorkPlanTypeEnum.ACTUAL +baseline = IfcWorkPlanTypeEnum.BASELINE +planned = IfcWorkPlanTypeEnum.PLANNED +userdefined = IfcWorkPlanTypeEnum.USERDEFINED +notdefined = IfcWorkPlanTypeEnum.NOTDEFINED IfcWorkScheduleTypeEnum = enum_namespace() -actual = express_getattr(IfcWorkScheduleTypeEnum, 'ACTUAL', INDETERMINATE) -baseline = express_getattr(IfcWorkScheduleTypeEnum, 'BASELINE', INDETERMINATE) -planned = express_getattr(IfcWorkScheduleTypeEnum, 'PLANNED', INDETERMINATE) -userdefined = express_getattr(IfcWorkScheduleTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcWorkScheduleTypeEnum, 'NOTDEFINED', INDETERMINATE) +actual = IfcWorkScheduleTypeEnum.ACTUAL +baseline = IfcWorkScheduleTypeEnum.BASELINE +planned = IfcWorkScheduleTypeEnum.PLANNED +userdefined = IfcWorkScheduleTypeEnum.USERDEFINED +notdefined = IfcWorkScheduleTypeEnum.NOTDEFINED def IfcActionRequest(*args, **kwargs): return ifcopenshell.create_entity('IfcActionRequest', 'IFC4X3_RC1', *args, **kwargs) diff --git a/src/ifcopenshell-python/ifcopenshell/express/rules/IFC4X3_RC2.py b/src/ifcopenshell-python/ifcopenshell/express/rules/IFC4X3_RC2.py index 516271085a4..0303689be5e 100644 --- a/src/ifcopenshell-python/ifcopenshell/express/rules/IFC4X3_RC2.py +++ b/src/ifcopenshell-python/ifcopenshell/express/rules/IFC4X3_RC2.py @@ -1,5 +1,8 @@ import ifcopenshell +def is_indeterminate(v): + return v is None or type(v).__name__ == 'indeterminate_type' + def exists(v): if callable(v): try: @@ -7,10 +10,10 @@ def exists(v): except IndexError as e: return False else: - return v is not None + return not is_indeterminate(v) def nvl(v, default): - return v if v is not None else default + return v if not is_indeterminate(v) else default def is_entity(inst): if isinstance(inst, ifcopenshell.entity_instance): @@ -22,13 +25,13 @@ def is_entity(inst): def express_len(v): if isinstance(v, ifcopenshell.entity_instance) and (not is_entity(v)): v = v[0] - elif v is None or v is INDETERMINATE: + elif is_indeterminate(v): return INDETERMINATE return len(v) old_range = range def range(*args): - if INDETERMINATE in args: + if any(map(is_indeterminate, args)): return yield from old_range(*args) sizeof = express_len @@ -149,2360 +152,2360 @@ class enum_namespace: def __getattr__(self, k): return express_getattr(k, 'upper', INDETERMINATE)() IfcActionRequestTypeEnum = enum_namespace() -email = express_getattr(IfcActionRequestTypeEnum, 'EMAIL', INDETERMINATE) -fax = express_getattr(IfcActionRequestTypeEnum, 'FAX', INDETERMINATE) -phone = express_getattr(IfcActionRequestTypeEnum, 'PHONE', INDETERMINATE) -post = express_getattr(IfcActionRequestTypeEnum, 'POST', INDETERMINATE) -verbal = express_getattr(IfcActionRequestTypeEnum, 'VERBAL', INDETERMINATE) -userdefined = express_getattr(IfcActionRequestTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcActionRequestTypeEnum, 'NOTDEFINED', INDETERMINATE) +email = IfcActionRequestTypeEnum.EMAIL +fax = IfcActionRequestTypeEnum.FAX +phone = IfcActionRequestTypeEnum.PHONE +post = IfcActionRequestTypeEnum.POST +verbal = IfcActionRequestTypeEnum.VERBAL +userdefined = IfcActionRequestTypeEnum.USERDEFINED +notdefined = IfcActionRequestTypeEnum.NOTDEFINED IfcActionSourceTypeEnum = enum_namespace() -dead_load_g = express_getattr(IfcActionSourceTypeEnum, 'DEAD_LOAD_G', INDETERMINATE) -completion_g1 = express_getattr(IfcActionSourceTypeEnum, 'COMPLETION_G1', INDETERMINATE) -live_load_q = express_getattr(IfcActionSourceTypeEnum, 'LIVE_LOAD_Q', INDETERMINATE) -snow_s = express_getattr(IfcActionSourceTypeEnum, 'SNOW_S', INDETERMINATE) -wind_w = express_getattr(IfcActionSourceTypeEnum, 'WIND_W', INDETERMINATE) -prestressing_p = express_getattr(IfcActionSourceTypeEnum, 'PRESTRESSING_P', INDETERMINATE) -settlement_u = express_getattr(IfcActionSourceTypeEnum, 'SETTLEMENT_U', INDETERMINATE) -temperature_t = express_getattr(IfcActionSourceTypeEnum, 'TEMPERATURE_T', INDETERMINATE) -earthquake_e = express_getattr(IfcActionSourceTypeEnum, 'EARTHQUAKE_E', INDETERMINATE) -fire = express_getattr(IfcActionSourceTypeEnum, 'FIRE', INDETERMINATE) -impulse = express_getattr(IfcActionSourceTypeEnum, 'IMPULSE', INDETERMINATE) -impact = express_getattr(IfcActionSourceTypeEnum, 'IMPACT', INDETERMINATE) -transport = express_getattr(IfcActionSourceTypeEnum, 'TRANSPORT', INDETERMINATE) -erection = express_getattr(IfcActionSourceTypeEnum, 'ERECTION', INDETERMINATE) -propping = express_getattr(IfcActionSourceTypeEnum, 'PROPPING', INDETERMINATE) -system_imperfection = express_getattr(IfcActionSourceTypeEnum, 'SYSTEM_IMPERFECTION', INDETERMINATE) -shrinkage = express_getattr(IfcActionSourceTypeEnum, 'SHRINKAGE', INDETERMINATE) -creep = express_getattr(IfcActionSourceTypeEnum, 'CREEP', INDETERMINATE) -lack_of_fit = express_getattr(IfcActionSourceTypeEnum, 'LACK_OF_FIT', INDETERMINATE) -buoyancy = express_getattr(IfcActionSourceTypeEnum, 'BUOYANCY', INDETERMINATE) -ice = express_getattr(IfcActionSourceTypeEnum, 'ICE', INDETERMINATE) -current = express_getattr(IfcActionSourceTypeEnum, 'CURRENT', INDETERMINATE) -wave = express_getattr(IfcActionSourceTypeEnum, 'WAVE', INDETERMINATE) -rain = express_getattr(IfcActionSourceTypeEnum, 'RAIN', INDETERMINATE) -brakes = express_getattr(IfcActionSourceTypeEnum, 'BRAKES', INDETERMINATE) -userdefined = express_getattr(IfcActionSourceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcActionSourceTypeEnum, 'NOTDEFINED', INDETERMINATE) +dead_load_g = IfcActionSourceTypeEnum.DEAD_LOAD_G +completion_g1 = IfcActionSourceTypeEnum.COMPLETION_G1 +live_load_q = IfcActionSourceTypeEnum.LIVE_LOAD_Q +snow_s = IfcActionSourceTypeEnum.SNOW_S +wind_w = IfcActionSourceTypeEnum.WIND_W +prestressing_p = IfcActionSourceTypeEnum.PRESTRESSING_P +settlement_u = IfcActionSourceTypeEnum.SETTLEMENT_U +temperature_t = IfcActionSourceTypeEnum.TEMPERATURE_T +earthquake_e = IfcActionSourceTypeEnum.EARTHQUAKE_E +fire = IfcActionSourceTypeEnum.FIRE +impulse = IfcActionSourceTypeEnum.IMPULSE +impact = IfcActionSourceTypeEnum.IMPACT +transport = IfcActionSourceTypeEnum.TRANSPORT +erection = IfcActionSourceTypeEnum.ERECTION +propping = IfcActionSourceTypeEnum.PROPPING +system_imperfection = IfcActionSourceTypeEnum.SYSTEM_IMPERFECTION +shrinkage = IfcActionSourceTypeEnum.SHRINKAGE +creep = IfcActionSourceTypeEnum.CREEP +lack_of_fit = IfcActionSourceTypeEnum.LACK_OF_FIT +buoyancy = IfcActionSourceTypeEnum.BUOYANCY +ice = IfcActionSourceTypeEnum.ICE +current = IfcActionSourceTypeEnum.CURRENT +wave = IfcActionSourceTypeEnum.WAVE +rain = IfcActionSourceTypeEnum.RAIN +brakes = IfcActionSourceTypeEnum.BRAKES +userdefined = IfcActionSourceTypeEnum.USERDEFINED +notdefined = IfcActionSourceTypeEnum.NOTDEFINED IfcActionTypeEnum = enum_namespace() -permanent_g = express_getattr(IfcActionTypeEnum, 'PERMANENT_G', INDETERMINATE) -variable_q = express_getattr(IfcActionTypeEnum, 'VARIABLE_Q', INDETERMINATE) -extraordinary_a = express_getattr(IfcActionTypeEnum, 'EXTRAORDINARY_A', INDETERMINATE) -userdefined = express_getattr(IfcActionTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcActionTypeEnum, 'NOTDEFINED', INDETERMINATE) +permanent_g = IfcActionTypeEnum.PERMANENT_G +variable_q = IfcActionTypeEnum.VARIABLE_Q +extraordinary_a = IfcActionTypeEnum.EXTRAORDINARY_A +userdefined = IfcActionTypeEnum.USERDEFINED +notdefined = IfcActionTypeEnum.NOTDEFINED IfcActuatorTypeEnum = enum_namespace() -electricactuator = express_getattr(IfcActuatorTypeEnum, 'ELECTRICACTUATOR', INDETERMINATE) -handoperatedactuator = express_getattr(IfcActuatorTypeEnum, 'HANDOPERATEDACTUATOR', INDETERMINATE) -hydraulicactuator = express_getattr(IfcActuatorTypeEnum, 'HYDRAULICACTUATOR', INDETERMINATE) -pneumaticactuator = express_getattr(IfcActuatorTypeEnum, 'PNEUMATICACTUATOR', INDETERMINATE) -thermostaticactuator = express_getattr(IfcActuatorTypeEnum, 'THERMOSTATICACTUATOR', INDETERMINATE) -userdefined = express_getattr(IfcActuatorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcActuatorTypeEnum, 'NOTDEFINED', INDETERMINATE) +electricactuator = IfcActuatorTypeEnum.ELECTRICACTUATOR +handoperatedactuator = IfcActuatorTypeEnum.HANDOPERATEDACTUATOR +hydraulicactuator = IfcActuatorTypeEnum.HYDRAULICACTUATOR +pneumaticactuator = IfcActuatorTypeEnum.PNEUMATICACTUATOR +thermostaticactuator = IfcActuatorTypeEnum.THERMOSTATICACTUATOR +userdefined = IfcActuatorTypeEnum.USERDEFINED +notdefined = IfcActuatorTypeEnum.NOTDEFINED IfcAddressTypeEnum = enum_namespace() -office = express_getattr(IfcAddressTypeEnum, 'OFFICE', INDETERMINATE) -site = express_getattr(IfcAddressTypeEnum, 'SITE', INDETERMINATE) -home = express_getattr(IfcAddressTypeEnum, 'HOME', INDETERMINATE) -distributionpoint = express_getattr(IfcAddressTypeEnum, 'DISTRIBUTIONPOINT', INDETERMINATE) -userdefined = express_getattr(IfcAddressTypeEnum, 'USERDEFINED', INDETERMINATE) +office = IfcAddressTypeEnum.OFFICE +site = IfcAddressTypeEnum.SITE +home = IfcAddressTypeEnum.HOME +distributionpoint = IfcAddressTypeEnum.DISTRIBUTIONPOINT +userdefined = IfcAddressTypeEnum.USERDEFINED IfcAirTerminalBoxTypeEnum = enum_namespace() -constantflow = express_getattr(IfcAirTerminalBoxTypeEnum, 'CONSTANTFLOW', INDETERMINATE) -variableflowpressuredependant = express_getattr(IfcAirTerminalBoxTypeEnum, 'VARIABLEFLOWPRESSUREDEPENDANT', INDETERMINATE) -variableflowpressureindependant = express_getattr(IfcAirTerminalBoxTypeEnum, 'VARIABLEFLOWPRESSUREINDEPENDANT', INDETERMINATE) -userdefined = express_getattr(IfcAirTerminalBoxTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAirTerminalBoxTypeEnum, 'NOTDEFINED', INDETERMINATE) +constantflow = IfcAirTerminalBoxTypeEnum.CONSTANTFLOW +variableflowpressuredependant = IfcAirTerminalBoxTypeEnum.VARIABLEFLOWPRESSUREDEPENDANT +variableflowpressureindependant = IfcAirTerminalBoxTypeEnum.VARIABLEFLOWPRESSUREINDEPENDANT +userdefined = IfcAirTerminalBoxTypeEnum.USERDEFINED +notdefined = IfcAirTerminalBoxTypeEnum.NOTDEFINED IfcAirTerminalTypeEnum = enum_namespace() -diffuser = express_getattr(IfcAirTerminalTypeEnum, 'DIFFUSER', INDETERMINATE) -grille = express_getattr(IfcAirTerminalTypeEnum, 'GRILLE', INDETERMINATE) -louvre = express_getattr(IfcAirTerminalTypeEnum, 'LOUVRE', INDETERMINATE) -register = express_getattr(IfcAirTerminalTypeEnum, 'REGISTER', INDETERMINATE) -userdefined = express_getattr(IfcAirTerminalTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAirTerminalTypeEnum, 'NOTDEFINED', INDETERMINATE) +diffuser = IfcAirTerminalTypeEnum.DIFFUSER +grille = IfcAirTerminalTypeEnum.GRILLE +louvre = IfcAirTerminalTypeEnum.LOUVRE +register = IfcAirTerminalTypeEnum.REGISTER +userdefined = IfcAirTerminalTypeEnum.USERDEFINED +notdefined = IfcAirTerminalTypeEnum.NOTDEFINED IfcAirToAirHeatRecoveryTypeEnum = enum_namespace() -fixedplatecounterflowexchanger = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'FIXEDPLATECOUNTERFLOWEXCHANGER', INDETERMINATE) -fixedplatecrossflowexchanger = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'FIXEDPLATECROSSFLOWEXCHANGER', INDETERMINATE) -fixedplateparallelflowexchanger = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'FIXEDPLATEPARALLELFLOWEXCHANGER', INDETERMINATE) -rotarywheel = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'ROTARYWHEEL', INDETERMINATE) -runaroundcoilloop = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'RUNAROUNDCOILLOOP', INDETERMINATE) -heatpipe = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'HEATPIPE', INDETERMINATE) -twintowerenthalpyrecoveryloops = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'TWINTOWERENTHALPYRECOVERYLOOPS', INDETERMINATE) -thermosiphonsealedtubeheatexchangers = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'THERMOSIPHONSEALEDTUBEHEATEXCHANGERS', INDETERMINATE) -thermosiphoncoiltypeheatexchangers = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'THERMOSIPHONCOILTYPEHEATEXCHANGERS', INDETERMINATE) -userdefined = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'NOTDEFINED', INDETERMINATE) +fixedplatecounterflowexchanger = IfcAirToAirHeatRecoveryTypeEnum.FIXEDPLATECOUNTERFLOWEXCHANGER +fixedplatecrossflowexchanger = IfcAirToAirHeatRecoveryTypeEnum.FIXEDPLATECROSSFLOWEXCHANGER +fixedplateparallelflowexchanger = IfcAirToAirHeatRecoveryTypeEnum.FIXEDPLATEPARALLELFLOWEXCHANGER +rotarywheel = IfcAirToAirHeatRecoveryTypeEnum.ROTARYWHEEL +runaroundcoilloop = IfcAirToAirHeatRecoveryTypeEnum.RUNAROUNDCOILLOOP +heatpipe = IfcAirToAirHeatRecoveryTypeEnum.HEATPIPE +twintowerenthalpyrecoveryloops = IfcAirToAirHeatRecoveryTypeEnum.TWINTOWERENTHALPYRECOVERYLOOPS +thermosiphonsealedtubeheatexchangers = IfcAirToAirHeatRecoveryTypeEnum.THERMOSIPHONSEALEDTUBEHEATEXCHANGERS +thermosiphoncoiltypeheatexchangers = IfcAirToAirHeatRecoveryTypeEnum.THERMOSIPHONCOILTYPEHEATEXCHANGERS +userdefined = IfcAirToAirHeatRecoveryTypeEnum.USERDEFINED +notdefined = IfcAirToAirHeatRecoveryTypeEnum.NOTDEFINED IfcAlarmTypeEnum = enum_namespace() -bell = express_getattr(IfcAlarmTypeEnum, 'BELL', INDETERMINATE) -breakglassbutton = express_getattr(IfcAlarmTypeEnum, 'BREAKGLASSBUTTON', INDETERMINATE) -light = express_getattr(IfcAlarmTypeEnum, 'LIGHT', INDETERMINATE) -manualpullbox = express_getattr(IfcAlarmTypeEnum, 'MANUALPULLBOX', INDETERMINATE) -siren = express_getattr(IfcAlarmTypeEnum, 'SIREN', INDETERMINATE) -whistle = express_getattr(IfcAlarmTypeEnum, 'WHISTLE', INDETERMINATE) -railwaycrocodile = express_getattr(IfcAlarmTypeEnum, 'RAILWAYCROCODILE', INDETERMINATE) -railwaydetonator = express_getattr(IfcAlarmTypeEnum, 'RAILWAYDETONATOR', INDETERMINATE) -userdefined = express_getattr(IfcAlarmTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAlarmTypeEnum, 'NOTDEFINED', INDETERMINATE) +bell = IfcAlarmTypeEnum.BELL +breakglassbutton = IfcAlarmTypeEnum.BREAKGLASSBUTTON +light = IfcAlarmTypeEnum.LIGHT +manualpullbox = IfcAlarmTypeEnum.MANUALPULLBOX +siren = IfcAlarmTypeEnum.SIREN +whistle = IfcAlarmTypeEnum.WHISTLE +railwaycrocodile = IfcAlarmTypeEnum.RAILWAYCROCODILE +railwaydetonator = IfcAlarmTypeEnum.RAILWAYDETONATOR +userdefined = IfcAlarmTypeEnum.USERDEFINED +notdefined = IfcAlarmTypeEnum.NOTDEFINED IfcAlignmentCantSegmentTypeEnum = enum_namespace() -constantcant = express_getattr(IfcAlignmentCantSegmentTypeEnum, 'CONSTANTCANT', INDETERMINATE) -lineartransition = express_getattr(IfcAlignmentCantSegmentTypeEnum, 'LINEARTRANSITION', INDETERMINATE) -biquadraticparabola = express_getattr(IfcAlignmentCantSegmentTypeEnum, 'BIQUADRATICPARABOLA', INDETERMINATE) -blosscurve = express_getattr(IfcAlignmentCantSegmentTypeEnum, 'BLOSSCURVE', INDETERMINATE) -cosinecurve = express_getattr(IfcAlignmentCantSegmentTypeEnum, 'COSINECURVE', INDETERMINATE) -sinecurve = express_getattr(IfcAlignmentCantSegmentTypeEnum, 'SINECURVE', INDETERMINATE) -viennesebend = express_getattr(IfcAlignmentCantSegmentTypeEnum, 'VIENNESEBEND', INDETERMINATE) +constantcant = IfcAlignmentCantSegmentTypeEnum.CONSTANTCANT +lineartransition = IfcAlignmentCantSegmentTypeEnum.LINEARTRANSITION +biquadraticparabola = IfcAlignmentCantSegmentTypeEnum.BIQUADRATICPARABOLA +blosscurve = IfcAlignmentCantSegmentTypeEnum.BLOSSCURVE +cosinecurve = IfcAlignmentCantSegmentTypeEnum.COSINECURVE +sinecurve = IfcAlignmentCantSegmentTypeEnum.SINECURVE +viennesebend = IfcAlignmentCantSegmentTypeEnum.VIENNESEBEND IfcAlignmentHorizontalSegmentTypeEnum = enum_namespace() -line = express_getattr(IfcAlignmentHorizontalSegmentTypeEnum, 'LINE', INDETERMINATE) -circulararc = express_getattr(IfcAlignmentHorizontalSegmentTypeEnum, 'CIRCULARARC', INDETERMINATE) -clothoid = express_getattr(IfcAlignmentHorizontalSegmentTypeEnum, 'CLOTHOID', INDETERMINATE) -cubicspiral = express_getattr(IfcAlignmentHorizontalSegmentTypeEnum, 'CUBICSPIRAL', INDETERMINATE) -biquadraticparabola = express_getattr(IfcAlignmentHorizontalSegmentTypeEnum, 'BIQUADRATICPARABOLA', INDETERMINATE) -blosscurve = express_getattr(IfcAlignmentHorizontalSegmentTypeEnum, 'BLOSSCURVE', INDETERMINATE) -cosinecurve = express_getattr(IfcAlignmentHorizontalSegmentTypeEnum, 'COSINECURVE', INDETERMINATE) -sinecurve = express_getattr(IfcAlignmentHorizontalSegmentTypeEnum, 'SINECURVE', INDETERMINATE) -viennesebend = express_getattr(IfcAlignmentHorizontalSegmentTypeEnum, 'VIENNESEBEND', INDETERMINATE) +line = IfcAlignmentHorizontalSegmentTypeEnum.LINE +circulararc = IfcAlignmentHorizontalSegmentTypeEnum.CIRCULARARC +clothoid = IfcAlignmentHorizontalSegmentTypeEnum.CLOTHOID +cubicspiral = IfcAlignmentHorizontalSegmentTypeEnum.CUBICSPIRAL +biquadraticparabola = IfcAlignmentHorizontalSegmentTypeEnum.BIQUADRATICPARABOLA +blosscurve = IfcAlignmentHorizontalSegmentTypeEnum.BLOSSCURVE +cosinecurve = IfcAlignmentHorizontalSegmentTypeEnum.COSINECURVE +sinecurve = IfcAlignmentHorizontalSegmentTypeEnum.SINECURVE +viennesebend = IfcAlignmentHorizontalSegmentTypeEnum.VIENNESEBEND IfcAlignmentTypeEnum = enum_namespace() -userdefined = express_getattr(IfcAlignmentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAlignmentTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcAlignmentTypeEnum.USERDEFINED +notdefined = IfcAlignmentTypeEnum.NOTDEFINED IfcAlignmentVerticalSegmentTypeEnum = enum_namespace() -constantgradient = express_getattr(IfcAlignmentVerticalSegmentTypeEnum, 'CONSTANTGRADIENT', INDETERMINATE) -circulararc = express_getattr(IfcAlignmentVerticalSegmentTypeEnum, 'CIRCULARARC', INDETERMINATE) -parabolicarc = express_getattr(IfcAlignmentVerticalSegmentTypeEnum, 'PARABOLICARC', INDETERMINATE) -clothoid = express_getattr(IfcAlignmentVerticalSegmentTypeEnum, 'CLOTHOID', INDETERMINATE) +constantgradient = IfcAlignmentVerticalSegmentTypeEnum.CONSTANTGRADIENT +circulararc = IfcAlignmentVerticalSegmentTypeEnum.CIRCULARARC +parabolicarc = IfcAlignmentVerticalSegmentTypeEnum.PARABOLICARC +clothoid = IfcAlignmentVerticalSegmentTypeEnum.CLOTHOID IfcAnalysisModelTypeEnum = enum_namespace() -in_plane_loading_2d = express_getattr(IfcAnalysisModelTypeEnum, 'IN_PLANE_LOADING_2D', INDETERMINATE) -out_plane_loading_2d = express_getattr(IfcAnalysisModelTypeEnum, 'OUT_PLANE_LOADING_2D', INDETERMINATE) -loading_3d = express_getattr(IfcAnalysisModelTypeEnum, 'LOADING_3D', INDETERMINATE) -userdefined = express_getattr(IfcAnalysisModelTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAnalysisModelTypeEnum, 'NOTDEFINED', INDETERMINATE) +in_plane_loading_2d = IfcAnalysisModelTypeEnum.IN_PLANE_LOADING_2D +out_plane_loading_2d = IfcAnalysisModelTypeEnum.OUT_PLANE_LOADING_2D +loading_3d = IfcAnalysisModelTypeEnum.LOADING_3D +userdefined = IfcAnalysisModelTypeEnum.USERDEFINED +notdefined = IfcAnalysisModelTypeEnum.NOTDEFINED IfcAnalysisTheoryTypeEnum = enum_namespace() -first_order_theory = express_getattr(IfcAnalysisTheoryTypeEnum, 'FIRST_ORDER_THEORY', INDETERMINATE) -second_order_theory = express_getattr(IfcAnalysisTheoryTypeEnum, 'SECOND_ORDER_THEORY', INDETERMINATE) -third_order_theory = express_getattr(IfcAnalysisTheoryTypeEnum, 'THIRD_ORDER_THEORY', INDETERMINATE) -full_nonlinear_theory = express_getattr(IfcAnalysisTheoryTypeEnum, 'FULL_NONLINEAR_THEORY', INDETERMINATE) -userdefined = express_getattr(IfcAnalysisTheoryTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAnalysisTheoryTypeEnum, 'NOTDEFINED', INDETERMINATE) +first_order_theory = IfcAnalysisTheoryTypeEnum.FIRST_ORDER_THEORY +second_order_theory = IfcAnalysisTheoryTypeEnum.SECOND_ORDER_THEORY +third_order_theory = IfcAnalysisTheoryTypeEnum.THIRD_ORDER_THEORY +full_nonlinear_theory = IfcAnalysisTheoryTypeEnum.FULL_NONLINEAR_THEORY +userdefined = IfcAnalysisTheoryTypeEnum.USERDEFINED +notdefined = IfcAnalysisTheoryTypeEnum.NOTDEFINED IfcAnnotationTypeEnum = enum_namespace() -assumedpoint = express_getattr(IfcAnnotationTypeEnum, 'ASSUMEDPOINT', INDETERMINATE) -asbuiltarea = express_getattr(IfcAnnotationTypeEnum, 'ASBUILTAREA', INDETERMINATE) -asbuiltline = express_getattr(IfcAnnotationTypeEnum, 'ASBUILTLINE', INDETERMINATE) -non_physical_signal = express_getattr(IfcAnnotationTypeEnum, 'NON_PHYSICAL_SIGNAL', INDETERMINATE) -assumedline = express_getattr(IfcAnnotationTypeEnum, 'ASSUMEDLINE', INDETERMINATE) -widthevent = express_getattr(IfcAnnotationTypeEnum, 'WIDTHEVENT', INDETERMINATE) -assumedarea = express_getattr(IfcAnnotationTypeEnum, 'ASSUMEDAREA', INDETERMINATE) -superelevationevent = express_getattr(IfcAnnotationTypeEnum, 'SUPERELEVATIONEVENT', INDETERMINATE) -asbuiltpoint = express_getattr(IfcAnnotationTypeEnum, 'ASBUILTPOINT', INDETERMINATE) -userdefined = express_getattr(IfcAnnotationTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAnnotationTypeEnum, 'NOTDEFINED', INDETERMINATE) +assumedpoint = IfcAnnotationTypeEnum.ASSUMEDPOINT +asbuiltarea = IfcAnnotationTypeEnum.ASBUILTAREA +asbuiltline = IfcAnnotationTypeEnum.ASBUILTLINE +non_physical_signal = IfcAnnotationTypeEnum.NON_PHYSICAL_SIGNAL +assumedline = IfcAnnotationTypeEnum.ASSUMEDLINE +widthevent = IfcAnnotationTypeEnum.WIDTHEVENT +assumedarea = IfcAnnotationTypeEnum.ASSUMEDAREA +superelevationevent = IfcAnnotationTypeEnum.SUPERELEVATIONEVENT +asbuiltpoint = IfcAnnotationTypeEnum.ASBUILTPOINT +userdefined = IfcAnnotationTypeEnum.USERDEFINED +notdefined = IfcAnnotationTypeEnum.NOTDEFINED IfcArithmeticOperatorEnum = enum_namespace() -add = express_getattr(IfcArithmeticOperatorEnum, 'ADD', INDETERMINATE) -divide = express_getattr(IfcArithmeticOperatorEnum, 'DIVIDE', INDETERMINATE) -multiply = express_getattr(IfcArithmeticOperatorEnum, 'MULTIPLY', INDETERMINATE) -subtract = express_getattr(IfcArithmeticOperatorEnum, 'SUBTRACT', INDETERMINATE) +add = IfcArithmeticOperatorEnum.ADD +divide = IfcArithmeticOperatorEnum.DIVIDE +multiply = IfcArithmeticOperatorEnum.MULTIPLY +subtract = IfcArithmeticOperatorEnum.SUBTRACT IfcAssemblyPlaceEnum = enum_namespace() -site = express_getattr(IfcAssemblyPlaceEnum, 'SITE', INDETERMINATE) -factory = express_getattr(IfcAssemblyPlaceEnum, 'FACTORY', INDETERMINATE) -notdefined = express_getattr(IfcAssemblyPlaceEnum, 'NOTDEFINED', INDETERMINATE) +site = IfcAssemblyPlaceEnum.SITE +factory = IfcAssemblyPlaceEnum.FACTORY +notdefined = IfcAssemblyPlaceEnum.NOTDEFINED IfcAudioVisualApplianceTypeEnum = enum_namespace() -amplifier = express_getattr(IfcAudioVisualApplianceTypeEnum, 'AMPLIFIER', INDETERMINATE) -camera = express_getattr(IfcAudioVisualApplianceTypeEnum, 'CAMERA', INDETERMINATE) -display = express_getattr(IfcAudioVisualApplianceTypeEnum, 'DISPLAY', INDETERMINATE) -microphone = express_getattr(IfcAudioVisualApplianceTypeEnum, 'MICROPHONE', INDETERMINATE) -player = express_getattr(IfcAudioVisualApplianceTypeEnum, 'PLAYER', INDETERMINATE) -projector = express_getattr(IfcAudioVisualApplianceTypeEnum, 'PROJECTOR', INDETERMINATE) -receiver = express_getattr(IfcAudioVisualApplianceTypeEnum, 'RECEIVER', INDETERMINATE) -speaker = express_getattr(IfcAudioVisualApplianceTypeEnum, 'SPEAKER', INDETERMINATE) -switcher = express_getattr(IfcAudioVisualApplianceTypeEnum, 'SWITCHER', INDETERMINATE) -telephone = express_getattr(IfcAudioVisualApplianceTypeEnum, 'TELEPHONE', INDETERMINATE) -tuner = express_getattr(IfcAudioVisualApplianceTypeEnum, 'TUNER', INDETERMINATE) -railway_communication_terminal = express_getattr(IfcAudioVisualApplianceTypeEnum, 'RAILWAY_COMMUNICATION_TERMINAL', INDETERMINATE) -userdefined = express_getattr(IfcAudioVisualApplianceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAudioVisualApplianceTypeEnum, 'NOTDEFINED', INDETERMINATE) +amplifier = IfcAudioVisualApplianceTypeEnum.AMPLIFIER +camera = IfcAudioVisualApplianceTypeEnum.CAMERA +display = IfcAudioVisualApplianceTypeEnum.DISPLAY +microphone = IfcAudioVisualApplianceTypeEnum.MICROPHONE +player = IfcAudioVisualApplianceTypeEnum.PLAYER +projector = IfcAudioVisualApplianceTypeEnum.PROJECTOR +receiver = IfcAudioVisualApplianceTypeEnum.RECEIVER +speaker = IfcAudioVisualApplianceTypeEnum.SPEAKER +switcher = IfcAudioVisualApplianceTypeEnum.SWITCHER +telephone = IfcAudioVisualApplianceTypeEnum.TELEPHONE +tuner = IfcAudioVisualApplianceTypeEnum.TUNER +railway_communication_terminal = IfcAudioVisualApplianceTypeEnum.RAILWAY_COMMUNICATION_TERMINAL +userdefined = IfcAudioVisualApplianceTypeEnum.USERDEFINED +notdefined = IfcAudioVisualApplianceTypeEnum.NOTDEFINED IfcBSplineCurveForm = enum_namespace() -polyline_form = express_getattr(IfcBSplineCurveForm, 'POLYLINE_FORM', INDETERMINATE) -circular_arc = express_getattr(IfcBSplineCurveForm, 'CIRCULAR_ARC', INDETERMINATE) -elliptic_arc = express_getattr(IfcBSplineCurveForm, 'ELLIPTIC_ARC', INDETERMINATE) -parabolic_arc = express_getattr(IfcBSplineCurveForm, 'PARABOLIC_ARC', INDETERMINATE) -hyperbolic_arc = express_getattr(IfcBSplineCurveForm, 'HYPERBOLIC_ARC', INDETERMINATE) -unspecified = express_getattr(IfcBSplineCurveForm, 'UNSPECIFIED', INDETERMINATE) +polyline_form = IfcBSplineCurveForm.POLYLINE_FORM +circular_arc = IfcBSplineCurveForm.CIRCULAR_ARC +elliptic_arc = IfcBSplineCurveForm.ELLIPTIC_ARC +parabolic_arc = IfcBSplineCurveForm.PARABOLIC_ARC +hyperbolic_arc = IfcBSplineCurveForm.HYPERBOLIC_ARC +unspecified = IfcBSplineCurveForm.UNSPECIFIED IfcBSplineSurfaceForm = enum_namespace() -plane_surf = express_getattr(IfcBSplineSurfaceForm, 'PLANE_SURF', INDETERMINATE) -cylindrical_surf = express_getattr(IfcBSplineSurfaceForm, 'CYLINDRICAL_SURF', INDETERMINATE) -conical_surf = express_getattr(IfcBSplineSurfaceForm, 'CONICAL_SURF', INDETERMINATE) -spherical_surf = express_getattr(IfcBSplineSurfaceForm, 'SPHERICAL_SURF', INDETERMINATE) -toroidal_surf = express_getattr(IfcBSplineSurfaceForm, 'TOROIDAL_SURF', INDETERMINATE) -surf_of_revolution = express_getattr(IfcBSplineSurfaceForm, 'SURF_OF_REVOLUTION', INDETERMINATE) -ruled_surf = express_getattr(IfcBSplineSurfaceForm, 'RULED_SURF', INDETERMINATE) -generalised_cone = express_getattr(IfcBSplineSurfaceForm, 'GENERALISED_CONE', INDETERMINATE) -quadric_surf = express_getattr(IfcBSplineSurfaceForm, 'QUADRIC_SURF', INDETERMINATE) -surf_of_linear_extrusion = express_getattr(IfcBSplineSurfaceForm, 'SURF_OF_LINEAR_EXTRUSION', INDETERMINATE) -unspecified = express_getattr(IfcBSplineSurfaceForm, 'UNSPECIFIED', INDETERMINATE) +plane_surf = IfcBSplineSurfaceForm.PLANE_SURF +cylindrical_surf = IfcBSplineSurfaceForm.CYLINDRICAL_SURF +conical_surf = IfcBSplineSurfaceForm.CONICAL_SURF +spherical_surf = IfcBSplineSurfaceForm.SPHERICAL_SURF +toroidal_surf = IfcBSplineSurfaceForm.TOROIDAL_SURF +surf_of_revolution = IfcBSplineSurfaceForm.SURF_OF_REVOLUTION +ruled_surf = IfcBSplineSurfaceForm.RULED_SURF +generalised_cone = IfcBSplineSurfaceForm.GENERALISED_CONE +quadric_surf = IfcBSplineSurfaceForm.QUADRIC_SURF +surf_of_linear_extrusion = IfcBSplineSurfaceForm.SURF_OF_LINEAR_EXTRUSION +unspecified = IfcBSplineSurfaceForm.UNSPECIFIED IfcBeamTypeEnum = enum_namespace() -beam = express_getattr(IfcBeamTypeEnum, 'BEAM', INDETERMINATE) -joist = express_getattr(IfcBeamTypeEnum, 'JOIST', INDETERMINATE) -hollowcore = express_getattr(IfcBeamTypeEnum, 'HOLLOWCORE', INDETERMINATE) -lintel = express_getattr(IfcBeamTypeEnum, 'LINTEL', INDETERMINATE) -spandrel = express_getattr(IfcBeamTypeEnum, 'SPANDREL', INDETERMINATE) -t_beam = express_getattr(IfcBeamTypeEnum, 'T_BEAM', INDETERMINATE) -girder_segment = express_getattr(IfcBeamTypeEnum, 'GIRDER_SEGMENT', INDETERMINATE) -diaphragm = express_getattr(IfcBeamTypeEnum, 'DIAPHRAGM', INDETERMINATE) -piercap = express_getattr(IfcBeamTypeEnum, 'PIERCAP', INDETERMINATE) -hatstone = express_getattr(IfcBeamTypeEnum, 'HATSTONE', INDETERMINATE) -cornice = express_getattr(IfcBeamTypeEnum, 'CORNICE', INDETERMINATE) -edgebeam = express_getattr(IfcBeamTypeEnum, 'EDGEBEAM', INDETERMINATE) -userdefined = express_getattr(IfcBeamTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBeamTypeEnum, 'NOTDEFINED', INDETERMINATE) +beam = IfcBeamTypeEnum.BEAM +joist = IfcBeamTypeEnum.JOIST +hollowcore = IfcBeamTypeEnum.HOLLOWCORE +lintel = IfcBeamTypeEnum.LINTEL +spandrel = IfcBeamTypeEnum.SPANDREL +t_beam = IfcBeamTypeEnum.T_BEAM +girder_segment = IfcBeamTypeEnum.GIRDER_SEGMENT +diaphragm = IfcBeamTypeEnum.DIAPHRAGM +piercap = IfcBeamTypeEnum.PIERCAP +hatstone = IfcBeamTypeEnum.HATSTONE +cornice = IfcBeamTypeEnum.CORNICE +edgebeam = IfcBeamTypeEnum.EDGEBEAM +userdefined = IfcBeamTypeEnum.USERDEFINED +notdefined = IfcBeamTypeEnum.NOTDEFINED IfcBearingTypeDisplacementEnum = enum_namespace() -fixed_movement = express_getattr(IfcBearingTypeDisplacementEnum, 'FIXED_MOVEMENT', INDETERMINATE) -guided_longitudinal = express_getattr(IfcBearingTypeDisplacementEnum, 'GUIDED_LONGITUDINAL', INDETERMINATE) -guided_transversal = express_getattr(IfcBearingTypeDisplacementEnum, 'GUIDED_TRANSVERSAL', INDETERMINATE) -free_movement = express_getattr(IfcBearingTypeDisplacementEnum, 'FREE_MOVEMENT', INDETERMINATE) -notdefined = express_getattr(IfcBearingTypeDisplacementEnum, 'NOTDEFINED', INDETERMINATE) +fixed_movement = IfcBearingTypeDisplacementEnum.FIXED_MOVEMENT +guided_longitudinal = IfcBearingTypeDisplacementEnum.GUIDED_LONGITUDINAL +guided_transversal = IfcBearingTypeDisplacementEnum.GUIDED_TRANSVERSAL +free_movement = IfcBearingTypeDisplacementEnum.FREE_MOVEMENT +notdefined = IfcBearingTypeDisplacementEnum.NOTDEFINED IfcBearingTypeEnum = enum_namespace() -cylindrical = express_getattr(IfcBearingTypeEnum, 'CYLINDRICAL', INDETERMINATE) -spherical = express_getattr(IfcBearingTypeEnum, 'SPHERICAL', INDETERMINATE) -elastomeric = express_getattr(IfcBearingTypeEnum, 'ELASTOMERIC', INDETERMINATE) -pot = express_getattr(IfcBearingTypeEnum, 'POT', INDETERMINATE) -guide = express_getattr(IfcBearingTypeEnum, 'GUIDE', INDETERMINATE) -rocker = express_getattr(IfcBearingTypeEnum, 'ROCKER', INDETERMINATE) -roller = express_getattr(IfcBearingTypeEnum, 'ROLLER', INDETERMINATE) -disk = express_getattr(IfcBearingTypeEnum, 'DISK', INDETERMINATE) -userdefined = express_getattr(IfcBearingTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBearingTypeEnum, 'NOTDEFINED', INDETERMINATE) +cylindrical = IfcBearingTypeEnum.CYLINDRICAL +spherical = IfcBearingTypeEnum.SPHERICAL +elastomeric = IfcBearingTypeEnum.ELASTOMERIC +pot = IfcBearingTypeEnum.POT +guide = IfcBearingTypeEnum.GUIDE +rocker = IfcBearingTypeEnum.ROCKER +roller = IfcBearingTypeEnum.ROLLER +disk = IfcBearingTypeEnum.DISK +userdefined = IfcBearingTypeEnum.USERDEFINED +notdefined = IfcBearingTypeEnum.NOTDEFINED IfcBenchmarkEnum = enum_namespace() -greaterthan = express_getattr(IfcBenchmarkEnum, 'GREATERTHAN', INDETERMINATE) -greaterthanorequalto = express_getattr(IfcBenchmarkEnum, 'GREATERTHANOREQUALTO', INDETERMINATE) -lessthan = express_getattr(IfcBenchmarkEnum, 'LESSTHAN', INDETERMINATE) -lessthanorequalto = express_getattr(IfcBenchmarkEnum, 'LESSTHANOREQUALTO', INDETERMINATE) -equalto = express_getattr(IfcBenchmarkEnum, 'EQUALTO', INDETERMINATE) -notequalto = express_getattr(IfcBenchmarkEnum, 'NOTEQUALTO', INDETERMINATE) -includes = express_getattr(IfcBenchmarkEnum, 'INCLUDES', INDETERMINATE) -notincludes = express_getattr(IfcBenchmarkEnum, 'NOTINCLUDES', INDETERMINATE) -includedin = express_getattr(IfcBenchmarkEnum, 'INCLUDEDIN', INDETERMINATE) -notincludedin = express_getattr(IfcBenchmarkEnum, 'NOTINCLUDEDIN', INDETERMINATE) +greaterthan = IfcBenchmarkEnum.GREATERTHAN +greaterthanorequalto = IfcBenchmarkEnum.GREATERTHANOREQUALTO +lessthan = IfcBenchmarkEnum.LESSTHAN +lessthanorequalto = IfcBenchmarkEnum.LESSTHANOREQUALTO +equalto = IfcBenchmarkEnum.EQUALTO +notequalto = IfcBenchmarkEnum.NOTEQUALTO +includes = IfcBenchmarkEnum.INCLUDES +notincludes = IfcBenchmarkEnum.NOTINCLUDES +includedin = IfcBenchmarkEnum.INCLUDEDIN +notincludedin = IfcBenchmarkEnum.NOTINCLUDEDIN IfcBoilerTypeEnum = enum_namespace() -water = express_getattr(IfcBoilerTypeEnum, 'WATER', INDETERMINATE) -steam = express_getattr(IfcBoilerTypeEnum, 'STEAM', INDETERMINATE) -userdefined = express_getattr(IfcBoilerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBoilerTypeEnum, 'NOTDEFINED', INDETERMINATE) +water = IfcBoilerTypeEnum.WATER +steam = IfcBoilerTypeEnum.STEAM +userdefined = IfcBoilerTypeEnum.USERDEFINED +notdefined = IfcBoilerTypeEnum.NOTDEFINED IfcBooleanOperator = enum_namespace() -union = express_getattr(IfcBooleanOperator, 'UNION', INDETERMINATE) -intersection = express_getattr(IfcBooleanOperator, 'INTERSECTION', INDETERMINATE) -difference = express_getattr(IfcBooleanOperator, 'DIFFERENCE', INDETERMINATE) +union = IfcBooleanOperator.UNION +intersection = IfcBooleanOperator.INTERSECTION +difference = IfcBooleanOperator.DIFFERENCE IfcBridgePartTypeEnum = enum_namespace() -abutment = express_getattr(IfcBridgePartTypeEnum, 'ABUTMENT', INDETERMINATE) -deck = express_getattr(IfcBridgePartTypeEnum, 'DECK', INDETERMINATE) -deck_segment = express_getattr(IfcBridgePartTypeEnum, 'DECK_SEGMENT', INDETERMINATE) -foundation = express_getattr(IfcBridgePartTypeEnum, 'FOUNDATION', INDETERMINATE) -pier = express_getattr(IfcBridgePartTypeEnum, 'PIER', INDETERMINATE) -pier_segment = express_getattr(IfcBridgePartTypeEnum, 'PIER_SEGMENT', INDETERMINATE) -pylon = express_getattr(IfcBridgePartTypeEnum, 'PYLON', INDETERMINATE) -substructure = express_getattr(IfcBridgePartTypeEnum, 'SUBSTRUCTURE', INDETERMINATE) -superstructure = express_getattr(IfcBridgePartTypeEnum, 'SUPERSTRUCTURE', INDETERMINATE) -surfacestructure = express_getattr(IfcBridgePartTypeEnum, 'SURFACESTRUCTURE', INDETERMINATE) -userdefined = express_getattr(IfcBridgePartTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBridgePartTypeEnum, 'NOTDEFINED', INDETERMINATE) +abutment = IfcBridgePartTypeEnum.ABUTMENT +deck = IfcBridgePartTypeEnum.DECK +deck_segment = IfcBridgePartTypeEnum.DECK_SEGMENT +foundation = IfcBridgePartTypeEnum.FOUNDATION +pier = IfcBridgePartTypeEnum.PIER +pier_segment = IfcBridgePartTypeEnum.PIER_SEGMENT +pylon = IfcBridgePartTypeEnum.PYLON +substructure = IfcBridgePartTypeEnum.SUBSTRUCTURE +superstructure = IfcBridgePartTypeEnum.SUPERSTRUCTURE +surfacestructure = IfcBridgePartTypeEnum.SURFACESTRUCTURE +userdefined = IfcBridgePartTypeEnum.USERDEFINED +notdefined = IfcBridgePartTypeEnum.NOTDEFINED IfcBridgeTypeEnum = enum_namespace() -arched = express_getattr(IfcBridgeTypeEnum, 'ARCHED', INDETERMINATE) -cable_stayed = express_getattr(IfcBridgeTypeEnum, 'CABLE_STAYED', INDETERMINATE) -cantilever = express_getattr(IfcBridgeTypeEnum, 'CANTILEVER', INDETERMINATE) -culvert = express_getattr(IfcBridgeTypeEnum, 'CULVERT', INDETERMINATE) -framework = express_getattr(IfcBridgeTypeEnum, 'FRAMEWORK', INDETERMINATE) -girder = express_getattr(IfcBridgeTypeEnum, 'GIRDER', INDETERMINATE) -suspension = express_getattr(IfcBridgeTypeEnum, 'SUSPENSION', INDETERMINATE) -truss = express_getattr(IfcBridgeTypeEnum, 'TRUSS', INDETERMINATE) -userdefined = express_getattr(IfcBridgeTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBridgeTypeEnum, 'NOTDEFINED', INDETERMINATE) +arched = IfcBridgeTypeEnum.ARCHED +cable_stayed = IfcBridgeTypeEnum.CABLE_STAYED +cantilever = IfcBridgeTypeEnum.CANTILEVER +culvert = IfcBridgeTypeEnum.CULVERT +framework = IfcBridgeTypeEnum.FRAMEWORK +girder = IfcBridgeTypeEnum.GIRDER +suspension = IfcBridgeTypeEnum.SUSPENSION +truss = IfcBridgeTypeEnum.TRUSS +userdefined = IfcBridgeTypeEnum.USERDEFINED +notdefined = IfcBridgeTypeEnum.NOTDEFINED IfcBuildingElementPartTypeEnum = enum_namespace() -insulation = express_getattr(IfcBuildingElementPartTypeEnum, 'INSULATION', INDETERMINATE) -precastpanel = express_getattr(IfcBuildingElementPartTypeEnum, 'PRECASTPANEL', INDETERMINATE) -apron = express_getattr(IfcBuildingElementPartTypeEnum, 'APRON', INDETERMINATE) -armourunit = express_getattr(IfcBuildingElementPartTypeEnum, 'ARMOURUNIT', INDETERMINATE) -safetycage = express_getattr(IfcBuildingElementPartTypeEnum, 'SAFETYCAGE', INDETERMINATE) -userdefined = express_getattr(IfcBuildingElementPartTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBuildingElementPartTypeEnum, 'NOTDEFINED', INDETERMINATE) +insulation = IfcBuildingElementPartTypeEnum.INSULATION +precastpanel = IfcBuildingElementPartTypeEnum.PRECASTPANEL +apron = IfcBuildingElementPartTypeEnum.APRON +armourunit = IfcBuildingElementPartTypeEnum.ARMOURUNIT +safetycage = IfcBuildingElementPartTypeEnum.SAFETYCAGE +userdefined = IfcBuildingElementPartTypeEnum.USERDEFINED +notdefined = IfcBuildingElementPartTypeEnum.NOTDEFINED IfcBuildingElementProxyTypeEnum = enum_namespace() -complex = express_getattr(IfcBuildingElementProxyTypeEnum, 'COMPLEX', INDETERMINATE) -element = express_getattr(IfcBuildingElementProxyTypeEnum, 'ELEMENT', INDETERMINATE) -partial = express_getattr(IfcBuildingElementProxyTypeEnum, 'PARTIAL', INDETERMINATE) -provisionforvoid = express_getattr(IfcBuildingElementProxyTypeEnum, 'PROVISIONFORVOID', INDETERMINATE) -provisionforspace = express_getattr(IfcBuildingElementProxyTypeEnum, 'PROVISIONFORSPACE', INDETERMINATE) -userdefined = express_getattr(IfcBuildingElementProxyTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBuildingElementProxyTypeEnum, 'NOTDEFINED', INDETERMINATE) +complex = IfcBuildingElementProxyTypeEnum.COMPLEX +element = IfcBuildingElementProxyTypeEnum.ELEMENT +partial = IfcBuildingElementProxyTypeEnum.PARTIAL +provisionforvoid = IfcBuildingElementProxyTypeEnum.PROVISIONFORVOID +provisionforspace = IfcBuildingElementProxyTypeEnum.PROVISIONFORSPACE +userdefined = IfcBuildingElementProxyTypeEnum.USERDEFINED +notdefined = IfcBuildingElementProxyTypeEnum.NOTDEFINED IfcBuildingSystemTypeEnum = enum_namespace() -fenestration = express_getattr(IfcBuildingSystemTypeEnum, 'FENESTRATION', INDETERMINATE) -foundation = express_getattr(IfcBuildingSystemTypeEnum, 'FOUNDATION', INDETERMINATE) -loadbearing = express_getattr(IfcBuildingSystemTypeEnum, 'LOADBEARING', INDETERMINATE) -outershell = express_getattr(IfcBuildingSystemTypeEnum, 'OUTERSHELL', INDETERMINATE) -shading = express_getattr(IfcBuildingSystemTypeEnum, 'SHADING', INDETERMINATE) -transport = express_getattr(IfcBuildingSystemTypeEnum, 'TRANSPORT', INDETERMINATE) -reinforcing = express_getattr(IfcBuildingSystemTypeEnum, 'REINFORCING', INDETERMINATE) -prestressing = express_getattr(IfcBuildingSystemTypeEnum, 'PRESTRESSING', INDETERMINATE) -erosionprevention = express_getattr(IfcBuildingSystemTypeEnum, 'EROSIONPREVENTION', INDETERMINATE) -userdefined = express_getattr(IfcBuildingSystemTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBuildingSystemTypeEnum, 'NOTDEFINED', INDETERMINATE) +fenestration = IfcBuildingSystemTypeEnum.FENESTRATION +foundation = IfcBuildingSystemTypeEnum.FOUNDATION +loadbearing = IfcBuildingSystemTypeEnum.LOADBEARING +outershell = IfcBuildingSystemTypeEnum.OUTERSHELL +shading = IfcBuildingSystemTypeEnum.SHADING +transport = IfcBuildingSystemTypeEnum.TRANSPORT +reinforcing = IfcBuildingSystemTypeEnum.REINFORCING +prestressing = IfcBuildingSystemTypeEnum.PRESTRESSING +erosionprevention = IfcBuildingSystemTypeEnum.EROSIONPREVENTION +userdefined = IfcBuildingSystemTypeEnum.USERDEFINED +notdefined = IfcBuildingSystemTypeEnum.NOTDEFINED IfcBuiltSystemTypeEnum = enum_namespace() -reinforcing = express_getattr(IfcBuiltSystemTypeEnum, 'REINFORCING', INDETERMINATE) -mooring = express_getattr(IfcBuiltSystemTypeEnum, 'MOORING', INDETERMINATE) -outershell = express_getattr(IfcBuiltSystemTypeEnum, 'OUTERSHELL', INDETERMINATE) -trackcircuit = express_getattr(IfcBuiltSystemTypeEnum, 'TRACKCIRCUIT', INDETERMINATE) -erosionprevention = express_getattr(IfcBuiltSystemTypeEnum, 'EROSIONPREVENTION', INDETERMINATE) -foundation = express_getattr(IfcBuiltSystemTypeEnum, 'FOUNDATION', INDETERMINATE) -loadbearing = express_getattr(IfcBuiltSystemTypeEnum, 'LOADBEARING', INDETERMINATE) -shading = express_getattr(IfcBuiltSystemTypeEnum, 'SHADING', INDETERMINATE) -fenestration = express_getattr(IfcBuiltSystemTypeEnum, 'FENESTRATION', INDETERMINATE) -mooringsystem = express_getattr(IfcBuiltSystemTypeEnum, 'MOORINGSYSTEM', INDETERMINATE) -transport = express_getattr(IfcBuiltSystemTypeEnum, 'TRANSPORT', INDETERMINATE) -prestressing = express_getattr(IfcBuiltSystemTypeEnum, 'PRESTRESSING', INDETERMINATE) -userdefined = express_getattr(IfcBuiltSystemTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBuiltSystemTypeEnum, 'NOTDEFINED', INDETERMINATE) +reinforcing = IfcBuiltSystemTypeEnum.REINFORCING +mooring = IfcBuiltSystemTypeEnum.MOORING +outershell = IfcBuiltSystemTypeEnum.OUTERSHELL +trackcircuit = IfcBuiltSystemTypeEnum.TRACKCIRCUIT +erosionprevention = IfcBuiltSystemTypeEnum.EROSIONPREVENTION +foundation = IfcBuiltSystemTypeEnum.FOUNDATION +loadbearing = IfcBuiltSystemTypeEnum.LOADBEARING +shading = IfcBuiltSystemTypeEnum.SHADING +fenestration = IfcBuiltSystemTypeEnum.FENESTRATION +mooringsystem = IfcBuiltSystemTypeEnum.MOORINGSYSTEM +transport = IfcBuiltSystemTypeEnum.TRANSPORT +prestressing = IfcBuiltSystemTypeEnum.PRESTRESSING +userdefined = IfcBuiltSystemTypeEnum.USERDEFINED +notdefined = IfcBuiltSystemTypeEnum.NOTDEFINED IfcBurnerTypeEnum = enum_namespace() -userdefined = express_getattr(IfcBurnerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBurnerTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcBurnerTypeEnum.USERDEFINED +notdefined = IfcBurnerTypeEnum.NOTDEFINED IfcCableCarrierFittingTypeEnum = enum_namespace() -bend = express_getattr(IfcCableCarrierFittingTypeEnum, 'BEND', INDETERMINATE) -cross = express_getattr(IfcCableCarrierFittingTypeEnum, 'CROSS', INDETERMINATE) -reducer = express_getattr(IfcCableCarrierFittingTypeEnum, 'REDUCER', INDETERMINATE) -tee = express_getattr(IfcCableCarrierFittingTypeEnum, 'TEE', INDETERMINATE) -userdefined = express_getattr(IfcCableCarrierFittingTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCableCarrierFittingTypeEnum, 'NOTDEFINED', INDETERMINATE) +bend = IfcCableCarrierFittingTypeEnum.BEND +cross = IfcCableCarrierFittingTypeEnum.CROSS +reducer = IfcCableCarrierFittingTypeEnum.REDUCER +tee = IfcCableCarrierFittingTypeEnum.TEE +userdefined = IfcCableCarrierFittingTypeEnum.USERDEFINED +notdefined = IfcCableCarrierFittingTypeEnum.NOTDEFINED IfcCableCarrierSegmentTypeEnum = enum_namespace() -cableladdersegment = express_getattr(IfcCableCarrierSegmentTypeEnum, 'CABLELADDERSEGMENT', INDETERMINATE) -cabletraysegment = express_getattr(IfcCableCarrierSegmentTypeEnum, 'CABLETRAYSEGMENT', INDETERMINATE) -cabletrunkingsegment = express_getattr(IfcCableCarrierSegmentTypeEnum, 'CABLETRUNKINGSEGMENT', INDETERMINATE) -conduitsegment = express_getattr(IfcCableCarrierSegmentTypeEnum, 'CONDUITSEGMENT', INDETERMINATE) -cablebracket = express_getattr(IfcCableCarrierSegmentTypeEnum, 'CABLEBRACKET', INDETERMINATE) -catenarywire = express_getattr(IfcCableCarrierSegmentTypeEnum, 'CATENARYWIRE', INDETERMINATE) -dropper = express_getattr(IfcCableCarrierSegmentTypeEnum, 'DROPPER', INDETERMINATE) -userdefined = express_getattr(IfcCableCarrierSegmentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCableCarrierSegmentTypeEnum, 'NOTDEFINED', INDETERMINATE) +cableladdersegment = IfcCableCarrierSegmentTypeEnum.CABLELADDERSEGMENT +cabletraysegment = IfcCableCarrierSegmentTypeEnum.CABLETRAYSEGMENT +cabletrunkingsegment = IfcCableCarrierSegmentTypeEnum.CABLETRUNKINGSEGMENT +conduitsegment = IfcCableCarrierSegmentTypeEnum.CONDUITSEGMENT +cablebracket = IfcCableCarrierSegmentTypeEnum.CABLEBRACKET +catenarywire = IfcCableCarrierSegmentTypeEnum.CATENARYWIRE +dropper = IfcCableCarrierSegmentTypeEnum.DROPPER +userdefined = IfcCableCarrierSegmentTypeEnum.USERDEFINED +notdefined = IfcCableCarrierSegmentTypeEnum.NOTDEFINED IfcCableFittingTypeEnum = enum_namespace() -connector = express_getattr(IfcCableFittingTypeEnum, 'CONNECTOR', INDETERMINATE) -entry = express_getattr(IfcCableFittingTypeEnum, 'ENTRY', INDETERMINATE) -exit = express_getattr(IfcCableFittingTypeEnum, 'EXIT', INDETERMINATE) -junction = express_getattr(IfcCableFittingTypeEnum, 'JUNCTION', INDETERMINATE) -transition = express_getattr(IfcCableFittingTypeEnum, 'TRANSITION', INDETERMINATE) -fanout = express_getattr(IfcCableFittingTypeEnum, 'FANOUT', INDETERMINATE) -userdefined = express_getattr(IfcCableFittingTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCableFittingTypeEnum, 'NOTDEFINED', INDETERMINATE) +connector = IfcCableFittingTypeEnum.CONNECTOR +entry = IfcCableFittingTypeEnum.ENTRY +exit = IfcCableFittingTypeEnum.EXIT +junction = IfcCableFittingTypeEnum.JUNCTION +transition = IfcCableFittingTypeEnum.TRANSITION +fanout = IfcCableFittingTypeEnum.FANOUT +userdefined = IfcCableFittingTypeEnum.USERDEFINED +notdefined = IfcCableFittingTypeEnum.NOTDEFINED IfcCableSegmentTypeEnum = enum_namespace() -busbarsegment = express_getattr(IfcCableSegmentTypeEnum, 'BUSBARSEGMENT', INDETERMINATE) -cablesegment = express_getattr(IfcCableSegmentTypeEnum, 'CABLESEGMENT', INDETERMINATE) -conductorsegment = express_getattr(IfcCableSegmentTypeEnum, 'CONDUCTORSEGMENT', INDETERMINATE) -coresegment = express_getattr(IfcCableSegmentTypeEnum, 'CORESEGMENT', INDETERMINATE) -contactwiresegment = express_getattr(IfcCableSegmentTypeEnum, 'CONTACTWIRESEGMENT', INDETERMINATE) -fibersegment = express_getattr(IfcCableSegmentTypeEnum, 'FIBERSEGMENT', INDETERMINATE) -fibertube = express_getattr(IfcCableSegmentTypeEnum, 'FIBERTUBE', INDETERMINATE) -opticalcablesegment = express_getattr(IfcCableSegmentTypeEnum, 'OPTICALCABLESEGMENT', INDETERMINATE) -stitchwire = express_getattr(IfcCableSegmentTypeEnum, 'STITCHWIRE', INDETERMINATE) -wirepairsegment = express_getattr(IfcCableSegmentTypeEnum, 'WIREPAIRSEGMENT', INDETERMINATE) -userdefined = express_getattr(IfcCableSegmentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCableSegmentTypeEnum, 'NOTDEFINED', INDETERMINATE) +busbarsegment = IfcCableSegmentTypeEnum.BUSBARSEGMENT +cablesegment = IfcCableSegmentTypeEnum.CABLESEGMENT +conductorsegment = IfcCableSegmentTypeEnum.CONDUCTORSEGMENT +coresegment = IfcCableSegmentTypeEnum.CORESEGMENT +contactwiresegment = IfcCableSegmentTypeEnum.CONTACTWIRESEGMENT +fibersegment = IfcCableSegmentTypeEnum.FIBERSEGMENT +fibertube = IfcCableSegmentTypeEnum.FIBERTUBE +opticalcablesegment = IfcCableSegmentTypeEnum.OPTICALCABLESEGMENT +stitchwire = IfcCableSegmentTypeEnum.STITCHWIRE +wirepairsegment = IfcCableSegmentTypeEnum.WIREPAIRSEGMENT +userdefined = IfcCableSegmentTypeEnum.USERDEFINED +notdefined = IfcCableSegmentTypeEnum.NOTDEFINED IfcCaissonFoundationTypeEnum = enum_namespace() -well = express_getattr(IfcCaissonFoundationTypeEnum, 'WELL', INDETERMINATE) -caisson = express_getattr(IfcCaissonFoundationTypeEnum, 'CAISSON', INDETERMINATE) -userdefined = express_getattr(IfcCaissonFoundationTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCaissonFoundationTypeEnum, 'NOTDEFINED', INDETERMINATE) +well = IfcCaissonFoundationTypeEnum.WELL +caisson = IfcCaissonFoundationTypeEnum.CAISSON +userdefined = IfcCaissonFoundationTypeEnum.USERDEFINED +notdefined = IfcCaissonFoundationTypeEnum.NOTDEFINED IfcChangeActionEnum = enum_namespace() -nochange = express_getattr(IfcChangeActionEnum, 'NOCHANGE', INDETERMINATE) -modified = express_getattr(IfcChangeActionEnum, 'MODIFIED', INDETERMINATE) -added = express_getattr(IfcChangeActionEnum, 'ADDED', INDETERMINATE) -deleted = express_getattr(IfcChangeActionEnum, 'DELETED', INDETERMINATE) -notdefined = express_getattr(IfcChangeActionEnum, 'NOTDEFINED', INDETERMINATE) +nochange = IfcChangeActionEnum.NOCHANGE +modified = IfcChangeActionEnum.MODIFIED +added = IfcChangeActionEnum.ADDED +deleted = IfcChangeActionEnum.DELETED +notdefined = IfcChangeActionEnum.NOTDEFINED IfcChillerTypeEnum = enum_namespace() -aircooled = express_getattr(IfcChillerTypeEnum, 'AIRCOOLED', INDETERMINATE) -watercooled = express_getattr(IfcChillerTypeEnum, 'WATERCOOLED', INDETERMINATE) -heatrecovery = express_getattr(IfcChillerTypeEnum, 'HEATRECOVERY', INDETERMINATE) -userdefined = express_getattr(IfcChillerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcChillerTypeEnum, 'NOTDEFINED', INDETERMINATE) +aircooled = IfcChillerTypeEnum.AIRCOOLED +watercooled = IfcChillerTypeEnum.WATERCOOLED +heatrecovery = IfcChillerTypeEnum.HEATRECOVERY +userdefined = IfcChillerTypeEnum.USERDEFINED +notdefined = IfcChillerTypeEnum.NOTDEFINED IfcChimneyTypeEnum = enum_namespace() -userdefined = express_getattr(IfcChimneyTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcChimneyTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcChimneyTypeEnum.USERDEFINED +notdefined = IfcChimneyTypeEnum.NOTDEFINED IfcCoilTypeEnum = enum_namespace() -dxcoolingcoil = express_getattr(IfcCoilTypeEnum, 'DXCOOLINGCOIL', INDETERMINATE) -electricheatingcoil = express_getattr(IfcCoilTypeEnum, 'ELECTRICHEATINGCOIL', INDETERMINATE) -gasheatingcoil = express_getattr(IfcCoilTypeEnum, 'GASHEATINGCOIL', INDETERMINATE) -hydroniccoil = express_getattr(IfcCoilTypeEnum, 'HYDRONICCOIL', INDETERMINATE) -steamheatingcoil = express_getattr(IfcCoilTypeEnum, 'STEAMHEATINGCOIL', INDETERMINATE) -watercoolingcoil = express_getattr(IfcCoilTypeEnum, 'WATERCOOLINGCOIL', INDETERMINATE) -waterheatingcoil = express_getattr(IfcCoilTypeEnum, 'WATERHEATINGCOIL', INDETERMINATE) -userdefined = express_getattr(IfcCoilTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCoilTypeEnum, 'NOTDEFINED', INDETERMINATE) +dxcoolingcoil = IfcCoilTypeEnum.DXCOOLINGCOIL +electricheatingcoil = IfcCoilTypeEnum.ELECTRICHEATINGCOIL +gasheatingcoil = IfcCoilTypeEnum.GASHEATINGCOIL +hydroniccoil = IfcCoilTypeEnum.HYDRONICCOIL +steamheatingcoil = IfcCoilTypeEnum.STEAMHEATINGCOIL +watercoolingcoil = IfcCoilTypeEnum.WATERCOOLINGCOIL +waterheatingcoil = IfcCoilTypeEnum.WATERHEATINGCOIL +userdefined = IfcCoilTypeEnum.USERDEFINED +notdefined = IfcCoilTypeEnum.NOTDEFINED IfcColumnTypeEnum = enum_namespace() -column = express_getattr(IfcColumnTypeEnum, 'COLUMN', INDETERMINATE) -pilaster = express_getattr(IfcColumnTypeEnum, 'PILASTER', INDETERMINATE) -pierstem = express_getattr(IfcColumnTypeEnum, 'PIERSTEM', INDETERMINATE) -pierstem_segment = express_getattr(IfcColumnTypeEnum, 'PIERSTEM_SEGMENT', INDETERMINATE) -standcolumn = express_getattr(IfcColumnTypeEnum, 'STANDCOLUMN', INDETERMINATE) -userdefined = express_getattr(IfcColumnTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcColumnTypeEnum, 'NOTDEFINED', INDETERMINATE) +column = IfcColumnTypeEnum.COLUMN +pilaster = IfcColumnTypeEnum.PILASTER +pierstem = IfcColumnTypeEnum.PIERSTEM +pierstem_segment = IfcColumnTypeEnum.PIERSTEM_SEGMENT +standcolumn = IfcColumnTypeEnum.STANDCOLUMN +userdefined = IfcColumnTypeEnum.USERDEFINED +notdefined = IfcColumnTypeEnum.NOTDEFINED IfcCommunicationsApplianceTypeEnum = enum_namespace() -antenna = express_getattr(IfcCommunicationsApplianceTypeEnum, 'ANTENNA', INDETERMINATE) -computer = express_getattr(IfcCommunicationsApplianceTypeEnum, 'COMPUTER', INDETERMINATE) -fax = express_getattr(IfcCommunicationsApplianceTypeEnum, 'FAX', INDETERMINATE) -gateway = express_getattr(IfcCommunicationsApplianceTypeEnum, 'GATEWAY', INDETERMINATE) -modem = express_getattr(IfcCommunicationsApplianceTypeEnum, 'MODEM', INDETERMINATE) -networkappliance = express_getattr(IfcCommunicationsApplianceTypeEnum, 'NETWORKAPPLIANCE', INDETERMINATE) -networkbridge = express_getattr(IfcCommunicationsApplianceTypeEnum, 'NETWORKBRIDGE', INDETERMINATE) -networkhub = express_getattr(IfcCommunicationsApplianceTypeEnum, 'NETWORKHUB', INDETERMINATE) -printer = express_getattr(IfcCommunicationsApplianceTypeEnum, 'PRINTER', INDETERMINATE) -repeater = express_getattr(IfcCommunicationsApplianceTypeEnum, 'REPEATER', INDETERMINATE) -router = express_getattr(IfcCommunicationsApplianceTypeEnum, 'ROUTER', INDETERMINATE) -scanner = express_getattr(IfcCommunicationsApplianceTypeEnum, 'SCANNER', INDETERMINATE) -automaton = express_getattr(IfcCommunicationsApplianceTypeEnum, 'AUTOMATON', INDETERMINATE) -intelligent_peripheral = express_getattr(IfcCommunicationsApplianceTypeEnum, 'INTELLIGENT_PERIPHERAL', INDETERMINATE) -ip_network_equipment = express_getattr(IfcCommunicationsApplianceTypeEnum, 'IP_NETWORK_EQUIPMENT', INDETERMINATE) -optical_network_unit = express_getattr(IfcCommunicationsApplianceTypeEnum, 'OPTICAL_NETWORK_UNIT', INDETERMINATE) -telecommand = express_getattr(IfcCommunicationsApplianceTypeEnum, 'TELECOMMAND', INDETERMINATE) -telephonyexchange = express_getattr(IfcCommunicationsApplianceTypeEnum, 'TELEPHONYEXCHANGE', INDETERMINATE) -transitioncomponent = express_getattr(IfcCommunicationsApplianceTypeEnum, 'TRANSITIONCOMPONENT', INDETERMINATE) -transponder = express_getattr(IfcCommunicationsApplianceTypeEnum, 'TRANSPONDER', INDETERMINATE) -transportequipment = express_getattr(IfcCommunicationsApplianceTypeEnum, 'TRANSPORTEQUIPMENT', INDETERMINATE) -userdefined = express_getattr(IfcCommunicationsApplianceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCommunicationsApplianceTypeEnum, 'NOTDEFINED', INDETERMINATE) +antenna = IfcCommunicationsApplianceTypeEnum.ANTENNA +computer = IfcCommunicationsApplianceTypeEnum.COMPUTER +fax = IfcCommunicationsApplianceTypeEnum.FAX +gateway = IfcCommunicationsApplianceTypeEnum.GATEWAY +modem = IfcCommunicationsApplianceTypeEnum.MODEM +networkappliance = IfcCommunicationsApplianceTypeEnum.NETWORKAPPLIANCE +networkbridge = IfcCommunicationsApplianceTypeEnum.NETWORKBRIDGE +networkhub = IfcCommunicationsApplianceTypeEnum.NETWORKHUB +printer = IfcCommunicationsApplianceTypeEnum.PRINTER +repeater = IfcCommunicationsApplianceTypeEnum.REPEATER +router = IfcCommunicationsApplianceTypeEnum.ROUTER +scanner = IfcCommunicationsApplianceTypeEnum.SCANNER +automaton = IfcCommunicationsApplianceTypeEnum.AUTOMATON +intelligent_peripheral = IfcCommunicationsApplianceTypeEnum.INTELLIGENT_PERIPHERAL +ip_network_equipment = IfcCommunicationsApplianceTypeEnum.IP_NETWORK_EQUIPMENT +optical_network_unit = IfcCommunicationsApplianceTypeEnum.OPTICAL_NETWORK_UNIT +telecommand = IfcCommunicationsApplianceTypeEnum.TELECOMMAND +telephonyexchange = IfcCommunicationsApplianceTypeEnum.TELEPHONYEXCHANGE +transitioncomponent = IfcCommunicationsApplianceTypeEnum.TRANSITIONCOMPONENT +transponder = IfcCommunicationsApplianceTypeEnum.TRANSPONDER +transportequipment = IfcCommunicationsApplianceTypeEnum.TRANSPORTEQUIPMENT +userdefined = IfcCommunicationsApplianceTypeEnum.USERDEFINED +notdefined = IfcCommunicationsApplianceTypeEnum.NOTDEFINED IfcComplexPropertyTemplateTypeEnum = enum_namespace() -p_complex = express_getattr(IfcComplexPropertyTemplateTypeEnum, 'P_COMPLEX', INDETERMINATE) -q_complex = express_getattr(IfcComplexPropertyTemplateTypeEnum, 'Q_COMPLEX', INDETERMINATE) +p_complex = IfcComplexPropertyTemplateTypeEnum.P_COMPLEX +q_complex = IfcComplexPropertyTemplateTypeEnum.Q_COMPLEX IfcCompressorTypeEnum = enum_namespace() -dynamic = express_getattr(IfcCompressorTypeEnum, 'DYNAMIC', INDETERMINATE) -reciprocating = express_getattr(IfcCompressorTypeEnum, 'RECIPROCATING', INDETERMINATE) -rotary = express_getattr(IfcCompressorTypeEnum, 'ROTARY', INDETERMINATE) -scroll = express_getattr(IfcCompressorTypeEnum, 'SCROLL', INDETERMINATE) -trochoidal = express_getattr(IfcCompressorTypeEnum, 'TROCHOIDAL', INDETERMINATE) -singlestage = express_getattr(IfcCompressorTypeEnum, 'SINGLESTAGE', INDETERMINATE) -booster = express_getattr(IfcCompressorTypeEnum, 'BOOSTER', INDETERMINATE) -opentype = express_getattr(IfcCompressorTypeEnum, 'OPENTYPE', INDETERMINATE) -hermetic = express_getattr(IfcCompressorTypeEnum, 'HERMETIC', INDETERMINATE) -semihermetic = express_getattr(IfcCompressorTypeEnum, 'SEMIHERMETIC', INDETERMINATE) -weldedshellhermetic = express_getattr(IfcCompressorTypeEnum, 'WELDEDSHELLHERMETIC', INDETERMINATE) -rollingpiston = express_getattr(IfcCompressorTypeEnum, 'ROLLINGPISTON', INDETERMINATE) -rotaryvane = express_getattr(IfcCompressorTypeEnum, 'ROTARYVANE', INDETERMINATE) -singlescrew = express_getattr(IfcCompressorTypeEnum, 'SINGLESCREW', INDETERMINATE) -twinscrew = express_getattr(IfcCompressorTypeEnum, 'TWINSCREW', INDETERMINATE) -userdefined = express_getattr(IfcCompressorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCompressorTypeEnum, 'NOTDEFINED', INDETERMINATE) +dynamic = IfcCompressorTypeEnum.DYNAMIC +reciprocating = IfcCompressorTypeEnum.RECIPROCATING +rotary = IfcCompressorTypeEnum.ROTARY +scroll = IfcCompressorTypeEnum.SCROLL +trochoidal = IfcCompressorTypeEnum.TROCHOIDAL +singlestage = IfcCompressorTypeEnum.SINGLESTAGE +booster = IfcCompressorTypeEnum.BOOSTER +opentype = IfcCompressorTypeEnum.OPENTYPE +hermetic = IfcCompressorTypeEnum.HERMETIC +semihermetic = IfcCompressorTypeEnum.SEMIHERMETIC +weldedshellhermetic = IfcCompressorTypeEnum.WELDEDSHELLHERMETIC +rollingpiston = IfcCompressorTypeEnum.ROLLINGPISTON +rotaryvane = IfcCompressorTypeEnum.ROTARYVANE +singlescrew = IfcCompressorTypeEnum.SINGLESCREW +twinscrew = IfcCompressorTypeEnum.TWINSCREW +userdefined = IfcCompressorTypeEnum.USERDEFINED +notdefined = IfcCompressorTypeEnum.NOTDEFINED IfcCondenserTypeEnum = enum_namespace() -aircooled = express_getattr(IfcCondenserTypeEnum, 'AIRCOOLED', INDETERMINATE) -evaporativecooled = express_getattr(IfcCondenserTypeEnum, 'EVAPORATIVECOOLED', INDETERMINATE) -watercooled = express_getattr(IfcCondenserTypeEnum, 'WATERCOOLED', INDETERMINATE) -watercooledbrazedplate = express_getattr(IfcCondenserTypeEnum, 'WATERCOOLEDBRAZEDPLATE', INDETERMINATE) -watercooledshellcoil = express_getattr(IfcCondenserTypeEnum, 'WATERCOOLEDSHELLCOIL', INDETERMINATE) -watercooledshelltube = express_getattr(IfcCondenserTypeEnum, 'WATERCOOLEDSHELLTUBE', INDETERMINATE) -watercooledtubeintube = express_getattr(IfcCondenserTypeEnum, 'WATERCOOLEDTUBEINTUBE', INDETERMINATE) -userdefined = express_getattr(IfcCondenserTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCondenserTypeEnum, 'NOTDEFINED', INDETERMINATE) +aircooled = IfcCondenserTypeEnum.AIRCOOLED +evaporativecooled = IfcCondenserTypeEnum.EVAPORATIVECOOLED +watercooled = IfcCondenserTypeEnum.WATERCOOLED +watercooledbrazedplate = IfcCondenserTypeEnum.WATERCOOLEDBRAZEDPLATE +watercooledshellcoil = IfcCondenserTypeEnum.WATERCOOLEDSHELLCOIL +watercooledshelltube = IfcCondenserTypeEnum.WATERCOOLEDSHELLTUBE +watercooledtubeintube = IfcCondenserTypeEnum.WATERCOOLEDTUBEINTUBE +userdefined = IfcCondenserTypeEnum.USERDEFINED +notdefined = IfcCondenserTypeEnum.NOTDEFINED IfcConnectionTypeEnum = enum_namespace() -atpath = express_getattr(IfcConnectionTypeEnum, 'ATPATH', INDETERMINATE) -atstart = express_getattr(IfcConnectionTypeEnum, 'ATSTART', INDETERMINATE) -atend = express_getattr(IfcConnectionTypeEnum, 'ATEND', INDETERMINATE) -notdefined = express_getattr(IfcConnectionTypeEnum, 'NOTDEFINED', INDETERMINATE) +atpath = IfcConnectionTypeEnum.ATPATH +atstart = IfcConnectionTypeEnum.ATSTART +atend = IfcConnectionTypeEnum.ATEND +notdefined = IfcConnectionTypeEnum.NOTDEFINED IfcConstraintEnum = enum_namespace() -hard = express_getattr(IfcConstraintEnum, 'HARD', INDETERMINATE) -soft = express_getattr(IfcConstraintEnum, 'SOFT', INDETERMINATE) -advisory = express_getattr(IfcConstraintEnum, 'ADVISORY', INDETERMINATE) -userdefined = express_getattr(IfcConstraintEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcConstraintEnum, 'NOTDEFINED', INDETERMINATE) +hard = IfcConstraintEnum.HARD +soft = IfcConstraintEnum.SOFT +advisory = IfcConstraintEnum.ADVISORY +userdefined = IfcConstraintEnum.USERDEFINED +notdefined = IfcConstraintEnum.NOTDEFINED IfcConstructionEquipmentResourceTypeEnum = enum_namespace() -demolishing = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'DEMOLISHING', INDETERMINATE) -earthmoving = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'EARTHMOVING', INDETERMINATE) -erecting = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'ERECTING', INDETERMINATE) -heating = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'HEATING', INDETERMINATE) -lighting = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'LIGHTING', INDETERMINATE) -paving = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'PAVING', INDETERMINATE) -pumping = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'PUMPING', INDETERMINATE) -transporting = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'TRANSPORTING', INDETERMINATE) -userdefined = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'NOTDEFINED', INDETERMINATE) +demolishing = IfcConstructionEquipmentResourceTypeEnum.DEMOLISHING +earthmoving = IfcConstructionEquipmentResourceTypeEnum.EARTHMOVING +erecting = IfcConstructionEquipmentResourceTypeEnum.ERECTING +heating = IfcConstructionEquipmentResourceTypeEnum.HEATING +lighting = IfcConstructionEquipmentResourceTypeEnum.LIGHTING +paving = IfcConstructionEquipmentResourceTypeEnum.PAVING +pumping = IfcConstructionEquipmentResourceTypeEnum.PUMPING +transporting = IfcConstructionEquipmentResourceTypeEnum.TRANSPORTING +userdefined = IfcConstructionEquipmentResourceTypeEnum.USERDEFINED +notdefined = IfcConstructionEquipmentResourceTypeEnum.NOTDEFINED IfcConstructionMaterialResourceTypeEnum = enum_namespace() -aggregates = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'AGGREGATES', INDETERMINATE) -concrete = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'CONCRETE', INDETERMINATE) -drywall = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'DRYWALL', INDETERMINATE) -fuel = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'FUEL', INDETERMINATE) -gypsum = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'GYPSUM', INDETERMINATE) -masonry = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'MASONRY', INDETERMINATE) -metal = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'METAL', INDETERMINATE) -plastic = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'PLASTIC', INDETERMINATE) -wood = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'WOOD', INDETERMINATE) -notdefined = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'NOTDEFINED', INDETERMINATE) -userdefined = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'USERDEFINED', INDETERMINATE) +aggregates = IfcConstructionMaterialResourceTypeEnum.AGGREGATES +concrete = IfcConstructionMaterialResourceTypeEnum.CONCRETE +drywall = IfcConstructionMaterialResourceTypeEnum.DRYWALL +fuel = IfcConstructionMaterialResourceTypeEnum.FUEL +gypsum = IfcConstructionMaterialResourceTypeEnum.GYPSUM +masonry = IfcConstructionMaterialResourceTypeEnum.MASONRY +metal = IfcConstructionMaterialResourceTypeEnum.METAL +plastic = IfcConstructionMaterialResourceTypeEnum.PLASTIC +wood = IfcConstructionMaterialResourceTypeEnum.WOOD +notdefined = IfcConstructionMaterialResourceTypeEnum.NOTDEFINED +userdefined = IfcConstructionMaterialResourceTypeEnum.USERDEFINED IfcConstructionProductResourceTypeEnum = enum_namespace() -assembly = express_getattr(IfcConstructionProductResourceTypeEnum, 'ASSEMBLY', INDETERMINATE) -formwork = express_getattr(IfcConstructionProductResourceTypeEnum, 'FORMWORK', INDETERMINATE) -userdefined = express_getattr(IfcConstructionProductResourceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcConstructionProductResourceTypeEnum, 'NOTDEFINED', INDETERMINATE) +assembly = IfcConstructionProductResourceTypeEnum.ASSEMBLY +formwork = IfcConstructionProductResourceTypeEnum.FORMWORK +userdefined = IfcConstructionProductResourceTypeEnum.USERDEFINED +notdefined = IfcConstructionProductResourceTypeEnum.NOTDEFINED IfcControllerTypeEnum = enum_namespace() -floating = express_getattr(IfcControllerTypeEnum, 'FLOATING', INDETERMINATE) -programmable = express_getattr(IfcControllerTypeEnum, 'PROGRAMMABLE', INDETERMINATE) -proportional = express_getattr(IfcControllerTypeEnum, 'PROPORTIONAL', INDETERMINATE) -multiposition = express_getattr(IfcControllerTypeEnum, 'MULTIPOSITION', INDETERMINATE) -twoposition = express_getattr(IfcControllerTypeEnum, 'TWOPOSITION', INDETERMINATE) -userdefined = express_getattr(IfcControllerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcControllerTypeEnum, 'NOTDEFINED', INDETERMINATE) +floating = IfcControllerTypeEnum.FLOATING +programmable = IfcControllerTypeEnum.PROGRAMMABLE +proportional = IfcControllerTypeEnum.PROPORTIONAL +multiposition = IfcControllerTypeEnum.MULTIPOSITION +twoposition = IfcControllerTypeEnum.TWOPOSITION +userdefined = IfcControllerTypeEnum.USERDEFINED +notdefined = IfcControllerTypeEnum.NOTDEFINED IfcConveyorSegmentTypeEnum = enum_namespace() -chuteconveyor = express_getattr(IfcConveyorSegmentTypeEnum, 'CHUTECONVEYOR', INDETERMINATE) -beltconveyor = express_getattr(IfcConveyorSegmentTypeEnum, 'BELTCONVEYOR', INDETERMINATE) -screwconveyor = express_getattr(IfcConveyorSegmentTypeEnum, 'SCREWCONVEYOR', INDETERMINATE) -bucketconveyor = express_getattr(IfcConveyorSegmentTypeEnum, 'BUCKETCONVEYOR', INDETERMINATE) -userdefined = express_getattr(IfcConveyorSegmentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcConveyorSegmentTypeEnum, 'NOTDEFINED', INDETERMINATE) +chuteconveyor = IfcConveyorSegmentTypeEnum.CHUTECONVEYOR +beltconveyor = IfcConveyorSegmentTypeEnum.BELTCONVEYOR +screwconveyor = IfcConveyorSegmentTypeEnum.SCREWCONVEYOR +bucketconveyor = IfcConveyorSegmentTypeEnum.BUCKETCONVEYOR +userdefined = IfcConveyorSegmentTypeEnum.USERDEFINED +notdefined = IfcConveyorSegmentTypeEnum.NOTDEFINED IfcCooledBeamTypeEnum = enum_namespace() -active = express_getattr(IfcCooledBeamTypeEnum, 'ACTIVE', INDETERMINATE) -passive = express_getattr(IfcCooledBeamTypeEnum, 'PASSIVE', INDETERMINATE) -userdefined = express_getattr(IfcCooledBeamTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCooledBeamTypeEnum, 'NOTDEFINED', INDETERMINATE) +active = IfcCooledBeamTypeEnum.ACTIVE +passive = IfcCooledBeamTypeEnum.PASSIVE +userdefined = IfcCooledBeamTypeEnum.USERDEFINED +notdefined = IfcCooledBeamTypeEnum.NOTDEFINED IfcCoolingTowerTypeEnum = enum_namespace() -naturaldraft = express_getattr(IfcCoolingTowerTypeEnum, 'NATURALDRAFT', INDETERMINATE) -mechanicalinduceddraft = express_getattr(IfcCoolingTowerTypeEnum, 'MECHANICALINDUCEDDRAFT', INDETERMINATE) -mechanicalforceddraft = express_getattr(IfcCoolingTowerTypeEnum, 'MECHANICALFORCEDDRAFT', INDETERMINATE) -userdefined = express_getattr(IfcCoolingTowerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCoolingTowerTypeEnum, 'NOTDEFINED', INDETERMINATE) +naturaldraft = IfcCoolingTowerTypeEnum.NATURALDRAFT +mechanicalinduceddraft = IfcCoolingTowerTypeEnum.MECHANICALINDUCEDDRAFT +mechanicalforceddraft = IfcCoolingTowerTypeEnum.MECHANICALFORCEDDRAFT +userdefined = IfcCoolingTowerTypeEnum.USERDEFINED +notdefined = IfcCoolingTowerTypeEnum.NOTDEFINED IfcCostItemTypeEnum = enum_namespace() -userdefined = express_getattr(IfcCostItemTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCostItemTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcCostItemTypeEnum.USERDEFINED +notdefined = IfcCostItemTypeEnum.NOTDEFINED IfcCostScheduleTypeEnum = enum_namespace() -budget = express_getattr(IfcCostScheduleTypeEnum, 'BUDGET', INDETERMINATE) -costplan = express_getattr(IfcCostScheduleTypeEnum, 'COSTPLAN', INDETERMINATE) -estimate = express_getattr(IfcCostScheduleTypeEnum, 'ESTIMATE', INDETERMINATE) -tender = express_getattr(IfcCostScheduleTypeEnum, 'TENDER', INDETERMINATE) -pricedbillofquantities = express_getattr(IfcCostScheduleTypeEnum, 'PRICEDBILLOFQUANTITIES', INDETERMINATE) -unpricedbillofquantities = express_getattr(IfcCostScheduleTypeEnum, 'UNPRICEDBILLOFQUANTITIES', INDETERMINATE) -scheduleofrates = express_getattr(IfcCostScheduleTypeEnum, 'SCHEDULEOFRATES', INDETERMINATE) -userdefined = express_getattr(IfcCostScheduleTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCostScheduleTypeEnum, 'NOTDEFINED', INDETERMINATE) +budget = IfcCostScheduleTypeEnum.BUDGET +costplan = IfcCostScheduleTypeEnum.COSTPLAN +estimate = IfcCostScheduleTypeEnum.ESTIMATE +tender = IfcCostScheduleTypeEnum.TENDER +pricedbillofquantities = IfcCostScheduleTypeEnum.PRICEDBILLOFQUANTITIES +unpricedbillofquantities = IfcCostScheduleTypeEnum.UNPRICEDBILLOFQUANTITIES +scheduleofrates = IfcCostScheduleTypeEnum.SCHEDULEOFRATES +userdefined = IfcCostScheduleTypeEnum.USERDEFINED +notdefined = IfcCostScheduleTypeEnum.NOTDEFINED IfcCourseTypeEnum = enum_namespace() -armour = express_getattr(IfcCourseTypeEnum, 'ARMOUR', INDETERMINATE) -filter = express_getattr(IfcCourseTypeEnum, 'FILTER', INDETERMINATE) -ballastbed = express_getattr(IfcCourseTypeEnum, 'BALLASTBED', INDETERMINATE) -core = express_getattr(IfcCourseTypeEnum, 'CORE', INDETERMINATE) -pavement = express_getattr(IfcCourseTypeEnum, 'PAVEMENT', INDETERMINATE) -protection = express_getattr(IfcCourseTypeEnum, 'PROTECTION', INDETERMINATE) -userdefined = express_getattr(IfcCourseTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCourseTypeEnum, 'NOTDEFINED', INDETERMINATE) +armour = IfcCourseTypeEnum.ARMOUR +filter = IfcCourseTypeEnum.FILTER +ballastbed = IfcCourseTypeEnum.BALLASTBED +core = IfcCourseTypeEnum.CORE +pavement = IfcCourseTypeEnum.PAVEMENT +protection = IfcCourseTypeEnum.PROTECTION +userdefined = IfcCourseTypeEnum.USERDEFINED +notdefined = IfcCourseTypeEnum.NOTDEFINED IfcCoveringTypeEnum = enum_namespace() -ceiling = express_getattr(IfcCoveringTypeEnum, 'CEILING', INDETERMINATE) -flooring = express_getattr(IfcCoveringTypeEnum, 'FLOORING', INDETERMINATE) -cladding = express_getattr(IfcCoveringTypeEnum, 'CLADDING', INDETERMINATE) -roofing = express_getattr(IfcCoveringTypeEnum, 'ROOFING', INDETERMINATE) -molding = express_getattr(IfcCoveringTypeEnum, 'MOLDING', INDETERMINATE) -skirtingboard = express_getattr(IfcCoveringTypeEnum, 'SKIRTINGBOARD', INDETERMINATE) -insulation = express_getattr(IfcCoveringTypeEnum, 'INSULATION', INDETERMINATE) -membrane = express_getattr(IfcCoveringTypeEnum, 'MEMBRANE', INDETERMINATE) -sleeving = express_getattr(IfcCoveringTypeEnum, 'SLEEVING', INDETERMINATE) -wrapping = express_getattr(IfcCoveringTypeEnum, 'WRAPPING', INDETERMINATE) -coping = express_getattr(IfcCoveringTypeEnum, 'COPING', INDETERMINATE) -userdefined = express_getattr(IfcCoveringTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCoveringTypeEnum, 'NOTDEFINED', INDETERMINATE) +ceiling = IfcCoveringTypeEnum.CEILING +flooring = IfcCoveringTypeEnum.FLOORING +cladding = IfcCoveringTypeEnum.CLADDING +roofing = IfcCoveringTypeEnum.ROOFING +molding = IfcCoveringTypeEnum.MOLDING +skirtingboard = IfcCoveringTypeEnum.SKIRTINGBOARD +insulation = IfcCoveringTypeEnum.INSULATION +membrane = IfcCoveringTypeEnum.MEMBRANE +sleeving = IfcCoveringTypeEnum.SLEEVING +wrapping = IfcCoveringTypeEnum.WRAPPING +coping = IfcCoveringTypeEnum.COPING +userdefined = IfcCoveringTypeEnum.USERDEFINED +notdefined = IfcCoveringTypeEnum.NOTDEFINED IfcCrewResourceTypeEnum = enum_namespace() -office = express_getattr(IfcCrewResourceTypeEnum, 'OFFICE', INDETERMINATE) -site = express_getattr(IfcCrewResourceTypeEnum, 'SITE', INDETERMINATE) -userdefined = express_getattr(IfcCrewResourceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCrewResourceTypeEnum, 'NOTDEFINED', INDETERMINATE) +office = IfcCrewResourceTypeEnum.OFFICE +site = IfcCrewResourceTypeEnum.SITE +userdefined = IfcCrewResourceTypeEnum.USERDEFINED +notdefined = IfcCrewResourceTypeEnum.NOTDEFINED IfcCurtainWallTypeEnum = enum_namespace() -userdefined = express_getattr(IfcCurtainWallTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCurtainWallTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcCurtainWallTypeEnum.USERDEFINED +notdefined = IfcCurtainWallTypeEnum.NOTDEFINED IfcCurveInterpolationEnum = enum_namespace() -linear = express_getattr(IfcCurveInterpolationEnum, 'LINEAR', INDETERMINATE) -log_linear = express_getattr(IfcCurveInterpolationEnum, 'LOG_LINEAR', INDETERMINATE) -log_log = express_getattr(IfcCurveInterpolationEnum, 'LOG_LOG', INDETERMINATE) -notdefined = express_getattr(IfcCurveInterpolationEnum, 'NOTDEFINED', INDETERMINATE) +linear = IfcCurveInterpolationEnum.LINEAR +log_linear = IfcCurveInterpolationEnum.LOG_LINEAR +log_log = IfcCurveInterpolationEnum.LOG_LOG +notdefined = IfcCurveInterpolationEnum.NOTDEFINED IfcDamperTypeEnum = enum_namespace() -backdraftdamper = express_getattr(IfcDamperTypeEnum, 'BACKDRAFTDAMPER', INDETERMINATE) -balancingdamper = express_getattr(IfcDamperTypeEnum, 'BALANCINGDAMPER', INDETERMINATE) -blastdamper = express_getattr(IfcDamperTypeEnum, 'BLASTDAMPER', INDETERMINATE) -controldamper = express_getattr(IfcDamperTypeEnum, 'CONTROLDAMPER', INDETERMINATE) -firedamper = express_getattr(IfcDamperTypeEnum, 'FIREDAMPER', INDETERMINATE) -firesmokedamper = express_getattr(IfcDamperTypeEnum, 'FIRESMOKEDAMPER', INDETERMINATE) -fumehoodexhaust = express_getattr(IfcDamperTypeEnum, 'FUMEHOODEXHAUST', INDETERMINATE) -gravitydamper = express_getattr(IfcDamperTypeEnum, 'GRAVITYDAMPER', INDETERMINATE) -gravityreliefdamper = express_getattr(IfcDamperTypeEnum, 'GRAVITYRELIEFDAMPER', INDETERMINATE) -reliefdamper = express_getattr(IfcDamperTypeEnum, 'RELIEFDAMPER', INDETERMINATE) -smokedamper = express_getattr(IfcDamperTypeEnum, 'SMOKEDAMPER', INDETERMINATE) -userdefined = express_getattr(IfcDamperTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDamperTypeEnum, 'NOTDEFINED', INDETERMINATE) +backdraftdamper = IfcDamperTypeEnum.BACKDRAFTDAMPER +balancingdamper = IfcDamperTypeEnum.BALANCINGDAMPER +blastdamper = IfcDamperTypeEnum.BLASTDAMPER +controldamper = IfcDamperTypeEnum.CONTROLDAMPER +firedamper = IfcDamperTypeEnum.FIREDAMPER +firesmokedamper = IfcDamperTypeEnum.FIRESMOKEDAMPER +fumehoodexhaust = IfcDamperTypeEnum.FUMEHOODEXHAUST +gravitydamper = IfcDamperTypeEnum.GRAVITYDAMPER +gravityreliefdamper = IfcDamperTypeEnum.GRAVITYRELIEFDAMPER +reliefdamper = IfcDamperTypeEnum.RELIEFDAMPER +smokedamper = IfcDamperTypeEnum.SMOKEDAMPER +userdefined = IfcDamperTypeEnum.USERDEFINED +notdefined = IfcDamperTypeEnum.NOTDEFINED IfcDataOriginEnum = enum_namespace() -measured = express_getattr(IfcDataOriginEnum, 'MEASURED', INDETERMINATE) -predicted = express_getattr(IfcDataOriginEnum, 'PREDICTED', INDETERMINATE) -simulated = express_getattr(IfcDataOriginEnum, 'SIMULATED', INDETERMINATE) -userdefined = express_getattr(IfcDataOriginEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDataOriginEnum, 'NOTDEFINED', INDETERMINATE) +measured = IfcDataOriginEnum.MEASURED +predicted = IfcDataOriginEnum.PREDICTED +simulated = IfcDataOriginEnum.SIMULATED +userdefined = IfcDataOriginEnum.USERDEFINED +notdefined = IfcDataOriginEnum.NOTDEFINED IfcDerivedUnitEnum = enum_namespace() -angularvelocityunit = express_getattr(IfcDerivedUnitEnum, 'ANGULARVELOCITYUNIT', INDETERMINATE) -areadensityunit = express_getattr(IfcDerivedUnitEnum, 'AREADENSITYUNIT', INDETERMINATE) -compoundplaneangleunit = express_getattr(IfcDerivedUnitEnum, 'COMPOUNDPLANEANGLEUNIT', INDETERMINATE) -dynamicviscosityunit = express_getattr(IfcDerivedUnitEnum, 'DYNAMICVISCOSITYUNIT', INDETERMINATE) -heatfluxdensityunit = express_getattr(IfcDerivedUnitEnum, 'HEATFLUXDENSITYUNIT', INDETERMINATE) -integercountrateunit = express_getattr(IfcDerivedUnitEnum, 'INTEGERCOUNTRATEUNIT', INDETERMINATE) -isothermalmoisturecapacityunit = express_getattr(IfcDerivedUnitEnum, 'ISOTHERMALMOISTURECAPACITYUNIT', INDETERMINATE) -kinematicviscosityunit = express_getattr(IfcDerivedUnitEnum, 'KINEMATICVISCOSITYUNIT', INDETERMINATE) -linearvelocityunit = express_getattr(IfcDerivedUnitEnum, 'LINEARVELOCITYUNIT', INDETERMINATE) -massdensityunit = express_getattr(IfcDerivedUnitEnum, 'MASSDENSITYUNIT', INDETERMINATE) -massflowrateunit = express_getattr(IfcDerivedUnitEnum, 'MASSFLOWRATEUNIT', INDETERMINATE) -moisturediffusivityunit = express_getattr(IfcDerivedUnitEnum, 'MOISTUREDIFFUSIVITYUNIT', INDETERMINATE) -molecularweightunit = express_getattr(IfcDerivedUnitEnum, 'MOLECULARWEIGHTUNIT', INDETERMINATE) -specificheatcapacityunit = express_getattr(IfcDerivedUnitEnum, 'SPECIFICHEATCAPACITYUNIT', INDETERMINATE) -thermaladmittanceunit = express_getattr(IfcDerivedUnitEnum, 'THERMALADMITTANCEUNIT', INDETERMINATE) -thermalconductanceunit = express_getattr(IfcDerivedUnitEnum, 'THERMALCONDUCTANCEUNIT', INDETERMINATE) -thermalresistanceunit = express_getattr(IfcDerivedUnitEnum, 'THERMALRESISTANCEUNIT', INDETERMINATE) -thermaltransmittanceunit = express_getattr(IfcDerivedUnitEnum, 'THERMALTRANSMITTANCEUNIT', INDETERMINATE) -vaporpermeabilityunit = express_getattr(IfcDerivedUnitEnum, 'VAPORPERMEABILITYUNIT', INDETERMINATE) -volumetricflowrateunit = express_getattr(IfcDerivedUnitEnum, 'VOLUMETRICFLOWRATEUNIT', INDETERMINATE) -rotationalfrequencyunit = express_getattr(IfcDerivedUnitEnum, 'ROTATIONALFREQUENCYUNIT', INDETERMINATE) -torqueunit = express_getattr(IfcDerivedUnitEnum, 'TORQUEUNIT', INDETERMINATE) -momentofinertiaunit = express_getattr(IfcDerivedUnitEnum, 'MOMENTOFINERTIAUNIT', INDETERMINATE) -linearmomentunit = express_getattr(IfcDerivedUnitEnum, 'LINEARMOMENTUNIT', INDETERMINATE) -linearforceunit = express_getattr(IfcDerivedUnitEnum, 'LINEARFORCEUNIT', INDETERMINATE) -planarforceunit = express_getattr(IfcDerivedUnitEnum, 'PLANARFORCEUNIT', INDETERMINATE) -modulusofelasticityunit = express_getattr(IfcDerivedUnitEnum, 'MODULUSOFELASTICITYUNIT', INDETERMINATE) -shearmodulusunit = express_getattr(IfcDerivedUnitEnum, 'SHEARMODULUSUNIT', INDETERMINATE) -linearstiffnessunit = express_getattr(IfcDerivedUnitEnum, 'LINEARSTIFFNESSUNIT', INDETERMINATE) -rotationalstiffnessunit = express_getattr(IfcDerivedUnitEnum, 'ROTATIONALSTIFFNESSUNIT', INDETERMINATE) -modulusofsubgradereactionunit = express_getattr(IfcDerivedUnitEnum, 'MODULUSOFSUBGRADEREACTIONUNIT', INDETERMINATE) -accelerationunit = express_getattr(IfcDerivedUnitEnum, 'ACCELERATIONUNIT', INDETERMINATE) -curvatureunit = express_getattr(IfcDerivedUnitEnum, 'CURVATUREUNIT', INDETERMINATE) -heatingvalueunit = express_getattr(IfcDerivedUnitEnum, 'HEATINGVALUEUNIT', INDETERMINATE) -ionconcentrationunit = express_getattr(IfcDerivedUnitEnum, 'IONCONCENTRATIONUNIT', INDETERMINATE) -luminousintensitydistributionunit = express_getattr(IfcDerivedUnitEnum, 'LUMINOUSINTENSITYDISTRIBUTIONUNIT', INDETERMINATE) -massperlengthunit = express_getattr(IfcDerivedUnitEnum, 'MASSPERLENGTHUNIT', INDETERMINATE) -modulusoflinearsubgradereactionunit = express_getattr(IfcDerivedUnitEnum, 'MODULUSOFLINEARSUBGRADEREACTIONUNIT', INDETERMINATE) -modulusofrotationalsubgradereactionunit = express_getattr(IfcDerivedUnitEnum, 'MODULUSOFROTATIONALSUBGRADEREACTIONUNIT', INDETERMINATE) -phunit = express_getattr(IfcDerivedUnitEnum, 'PHUNIT', INDETERMINATE) -rotationalmassunit = express_getattr(IfcDerivedUnitEnum, 'ROTATIONALMASSUNIT', INDETERMINATE) -sectionareaintegralunit = express_getattr(IfcDerivedUnitEnum, 'SECTIONAREAINTEGRALUNIT', INDETERMINATE) -sectionmodulusunit = express_getattr(IfcDerivedUnitEnum, 'SECTIONMODULUSUNIT', INDETERMINATE) -soundpowerlevelunit = express_getattr(IfcDerivedUnitEnum, 'SOUNDPOWERLEVELUNIT', INDETERMINATE) -soundpowerunit = express_getattr(IfcDerivedUnitEnum, 'SOUNDPOWERUNIT', INDETERMINATE) -soundpressurelevelunit = express_getattr(IfcDerivedUnitEnum, 'SOUNDPRESSURELEVELUNIT', INDETERMINATE) -soundpressureunit = express_getattr(IfcDerivedUnitEnum, 'SOUNDPRESSUREUNIT', INDETERMINATE) -temperaturegradientunit = express_getattr(IfcDerivedUnitEnum, 'TEMPERATUREGRADIENTUNIT', INDETERMINATE) -temperaturerateofchangeunit = express_getattr(IfcDerivedUnitEnum, 'TEMPERATURERATEOFCHANGEUNIT', INDETERMINATE) -thermalexpansioncoefficientunit = express_getattr(IfcDerivedUnitEnum, 'THERMALEXPANSIONCOEFFICIENTUNIT', INDETERMINATE) -warpingconstantunit = express_getattr(IfcDerivedUnitEnum, 'WARPINGCONSTANTUNIT', INDETERMINATE) -warpingmomentunit = express_getattr(IfcDerivedUnitEnum, 'WARPINGMOMENTUNIT', INDETERMINATE) -userdefined = express_getattr(IfcDerivedUnitEnum, 'USERDEFINED', INDETERMINATE) +angularvelocityunit = IfcDerivedUnitEnum.ANGULARVELOCITYUNIT +areadensityunit = IfcDerivedUnitEnum.AREADENSITYUNIT +compoundplaneangleunit = IfcDerivedUnitEnum.COMPOUNDPLANEANGLEUNIT +dynamicviscosityunit = IfcDerivedUnitEnum.DYNAMICVISCOSITYUNIT +heatfluxdensityunit = IfcDerivedUnitEnum.HEATFLUXDENSITYUNIT +integercountrateunit = IfcDerivedUnitEnum.INTEGERCOUNTRATEUNIT +isothermalmoisturecapacityunit = IfcDerivedUnitEnum.ISOTHERMALMOISTURECAPACITYUNIT +kinematicviscosityunit = IfcDerivedUnitEnum.KINEMATICVISCOSITYUNIT +linearvelocityunit = IfcDerivedUnitEnum.LINEARVELOCITYUNIT +massdensityunit = IfcDerivedUnitEnum.MASSDENSITYUNIT +massflowrateunit = IfcDerivedUnitEnum.MASSFLOWRATEUNIT +moisturediffusivityunit = IfcDerivedUnitEnum.MOISTUREDIFFUSIVITYUNIT +molecularweightunit = IfcDerivedUnitEnum.MOLECULARWEIGHTUNIT +specificheatcapacityunit = IfcDerivedUnitEnum.SPECIFICHEATCAPACITYUNIT +thermaladmittanceunit = IfcDerivedUnitEnum.THERMALADMITTANCEUNIT +thermalconductanceunit = IfcDerivedUnitEnum.THERMALCONDUCTANCEUNIT +thermalresistanceunit = IfcDerivedUnitEnum.THERMALRESISTANCEUNIT +thermaltransmittanceunit = IfcDerivedUnitEnum.THERMALTRANSMITTANCEUNIT +vaporpermeabilityunit = IfcDerivedUnitEnum.VAPORPERMEABILITYUNIT +volumetricflowrateunit = IfcDerivedUnitEnum.VOLUMETRICFLOWRATEUNIT +rotationalfrequencyunit = IfcDerivedUnitEnum.ROTATIONALFREQUENCYUNIT +torqueunit = IfcDerivedUnitEnum.TORQUEUNIT +momentofinertiaunit = IfcDerivedUnitEnum.MOMENTOFINERTIAUNIT +linearmomentunit = IfcDerivedUnitEnum.LINEARMOMENTUNIT +linearforceunit = IfcDerivedUnitEnum.LINEARFORCEUNIT +planarforceunit = IfcDerivedUnitEnum.PLANARFORCEUNIT +modulusofelasticityunit = IfcDerivedUnitEnum.MODULUSOFELASTICITYUNIT +shearmodulusunit = IfcDerivedUnitEnum.SHEARMODULUSUNIT +linearstiffnessunit = IfcDerivedUnitEnum.LINEARSTIFFNESSUNIT +rotationalstiffnessunit = IfcDerivedUnitEnum.ROTATIONALSTIFFNESSUNIT +modulusofsubgradereactionunit = IfcDerivedUnitEnum.MODULUSOFSUBGRADEREACTIONUNIT +accelerationunit = IfcDerivedUnitEnum.ACCELERATIONUNIT +curvatureunit = IfcDerivedUnitEnum.CURVATUREUNIT +heatingvalueunit = IfcDerivedUnitEnum.HEATINGVALUEUNIT +ionconcentrationunit = IfcDerivedUnitEnum.IONCONCENTRATIONUNIT +luminousintensitydistributionunit = IfcDerivedUnitEnum.LUMINOUSINTENSITYDISTRIBUTIONUNIT +massperlengthunit = IfcDerivedUnitEnum.MASSPERLENGTHUNIT +modulusoflinearsubgradereactionunit = IfcDerivedUnitEnum.MODULUSOFLINEARSUBGRADEREACTIONUNIT +modulusofrotationalsubgradereactionunit = IfcDerivedUnitEnum.MODULUSOFROTATIONALSUBGRADEREACTIONUNIT +phunit = IfcDerivedUnitEnum.PHUNIT +rotationalmassunit = IfcDerivedUnitEnum.ROTATIONALMASSUNIT +sectionareaintegralunit = IfcDerivedUnitEnum.SECTIONAREAINTEGRALUNIT +sectionmodulusunit = IfcDerivedUnitEnum.SECTIONMODULUSUNIT +soundpowerlevelunit = IfcDerivedUnitEnum.SOUNDPOWERLEVELUNIT +soundpowerunit = IfcDerivedUnitEnum.SOUNDPOWERUNIT +soundpressurelevelunit = IfcDerivedUnitEnum.SOUNDPRESSURELEVELUNIT +soundpressureunit = IfcDerivedUnitEnum.SOUNDPRESSUREUNIT +temperaturegradientunit = IfcDerivedUnitEnum.TEMPERATUREGRADIENTUNIT +temperaturerateofchangeunit = IfcDerivedUnitEnum.TEMPERATURERATEOFCHANGEUNIT +thermalexpansioncoefficientunit = IfcDerivedUnitEnum.THERMALEXPANSIONCOEFFICIENTUNIT +warpingconstantunit = IfcDerivedUnitEnum.WARPINGCONSTANTUNIT +warpingmomentunit = IfcDerivedUnitEnum.WARPINGMOMENTUNIT +userdefined = IfcDerivedUnitEnum.USERDEFINED IfcDirectionSenseEnum = enum_namespace() -positive = express_getattr(IfcDirectionSenseEnum, 'POSITIVE', INDETERMINATE) -negative = express_getattr(IfcDirectionSenseEnum, 'NEGATIVE', INDETERMINATE) +positive = IfcDirectionSenseEnum.POSITIVE +negative = IfcDirectionSenseEnum.NEGATIVE IfcDiscreteAccessoryTypeEnum = enum_namespace() -anchorplate = express_getattr(IfcDiscreteAccessoryTypeEnum, 'ANCHORPLATE', INDETERMINATE) -bracket = express_getattr(IfcDiscreteAccessoryTypeEnum, 'BRACKET', INDETERMINATE) -shoe = express_getattr(IfcDiscreteAccessoryTypeEnum, 'SHOE', INDETERMINATE) -expansion_joint_device = express_getattr(IfcDiscreteAccessoryTypeEnum, 'EXPANSION_JOINT_DEVICE', INDETERMINATE) -birdprotection = express_getattr(IfcDiscreteAccessoryTypeEnum, 'BIRDPROTECTION', INDETERMINATE) -cablearranger = express_getattr(IfcDiscreteAccessoryTypeEnum, 'CABLEARRANGER', INDETERMINATE) -insulator = express_getattr(IfcDiscreteAccessoryTypeEnum, 'INSULATOR', INDETERMINATE) -lock = express_getattr(IfcDiscreteAccessoryTypeEnum, 'LOCK', INDETERMINATE) -tensioningequipment = express_getattr(IfcDiscreteAccessoryTypeEnum, 'TENSIONINGEQUIPMENT', INDETERMINATE) -railpad = express_getattr(IfcDiscreteAccessoryTypeEnum, 'RAILPAD', INDETERMINATE) -slidingchair = express_getattr(IfcDiscreteAccessoryTypeEnum, 'SLIDINGCHAIR', INDETERMINATE) -panel_strengthening = express_getattr(IfcDiscreteAccessoryTypeEnum, 'PANEL_STRENGTHENING', INDETERMINATE) -railbrace = express_getattr(IfcDiscreteAccessoryTypeEnum, 'RAILBRACE', INDETERMINATE) -elastic_cushion = express_getattr(IfcDiscreteAccessoryTypeEnum, 'ELASTIC_CUSHION', INDETERMINATE) -soundabsorption = express_getattr(IfcDiscreteAccessoryTypeEnum, 'SOUNDABSORPTION', INDETERMINATE) -rail_lubrication = express_getattr(IfcDiscreteAccessoryTypeEnum, 'RAIL_LUBRICATION', INDETERMINATE) -rail_mechanical_equipment = express_getattr(IfcDiscreteAccessoryTypeEnum, 'RAIL_MECHANICAL_EQUIPMENT', INDETERMINATE) -userdefined = express_getattr(IfcDiscreteAccessoryTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDiscreteAccessoryTypeEnum, 'NOTDEFINED', INDETERMINATE) +anchorplate = IfcDiscreteAccessoryTypeEnum.ANCHORPLATE +bracket = IfcDiscreteAccessoryTypeEnum.BRACKET +shoe = IfcDiscreteAccessoryTypeEnum.SHOE +expansion_joint_device = IfcDiscreteAccessoryTypeEnum.EXPANSION_JOINT_DEVICE +birdprotection = IfcDiscreteAccessoryTypeEnum.BIRDPROTECTION +cablearranger = IfcDiscreteAccessoryTypeEnum.CABLEARRANGER +insulator = IfcDiscreteAccessoryTypeEnum.INSULATOR +lock = IfcDiscreteAccessoryTypeEnum.LOCK +tensioningequipment = IfcDiscreteAccessoryTypeEnum.TENSIONINGEQUIPMENT +railpad = IfcDiscreteAccessoryTypeEnum.RAILPAD +slidingchair = IfcDiscreteAccessoryTypeEnum.SLIDINGCHAIR +panel_strengthening = IfcDiscreteAccessoryTypeEnum.PANEL_STRENGTHENING +railbrace = IfcDiscreteAccessoryTypeEnum.RAILBRACE +elastic_cushion = IfcDiscreteAccessoryTypeEnum.ELASTIC_CUSHION +soundabsorption = IfcDiscreteAccessoryTypeEnum.SOUNDABSORPTION +rail_lubrication = IfcDiscreteAccessoryTypeEnum.RAIL_LUBRICATION +rail_mechanical_equipment = IfcDiscreteAccessoryTypeEnum.RAIL_MECHANICAL_EQUIPMENT +userdefined = IfcDiscreteAccessoryTypeEnum.USERDEFINED +notdefined = IfcDiscreteAccessoryTypeEnum.NOTDEFINED IfcDistributionBoardTypeEnum = enum_namespace() -switchboard = express_getattr(IfcDistributionBoardTypeEnum, 'SWITCHBOARD', INDETERMINATE) -consumerunit = express_getattr(IfcDistributionBoardTypeEnum, 'CONSUMERUNIT', INDETERMINATE) -motorcontrolcentre = express_getattr(IfcDistributionBoardTypeEnum, 'MOTORCONTROLCENTRE', INDETERMINATE) -distributionframe = express_getattr(IfcDistributionBoardTypeEnum, 'DISTRIBUTIONFRAME', INDETERMINATE) -distributionboard = express_getattr(IfcDistributionBoardTypeEnum, 'DISTRIBUTIONBOARD', INDETERMINATE) -userdefined = express_getattr(IfcDistributionBoardTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDistributionBoardTypeEnum, 'NOTDEFINED', INDETERMINATE) +switchboard = IfcDistributionBoardTypeEnum.SWITCHBOARD +consumerunit = IfcDistributionBoardTypeEnum.CONSUMERUNIT +motorcontrolcentre = IfcDistributionBoardTypeEnum.MOTORCONTROLCENTRE +distributionframe = IfcDistributionBoardTypeEnum.DISTRIBUTIONFRAME +distributionboard = IfcDistributionBoardTypeEnum.DISTRIBUTIONBOARD +userdefined = IfcDistributionBoardTypeEnum.USERDEFINED +notdefined = IfcDistributionBoardTypeEnum.NOTDEFINED IfcDistributionChamberElementTypeEnum = enum_namespace() -formedduct = express_getattr(IfcDistributionChamberElementTypeEnum, 'FORMEDDUCT', INDETERMINATE) -inspectionchamber = express_getattr(IfcDistributionChamberElementTypeEnum, 'INSPECTIONCHAMBER', INDETERMINATE) -inspectionpit = express_getattr(IfcDistributionChamberElementTypeEnum, 'INSPECTIONPIT', INDETERMINATE) -manhole = express_getattr(IfcDistributionChamberElementTypeEnum, 'MANHOLE', INDETERMINATE) -meterchamber = express_getattr(IfcDistributionChamberElementTypeEnum, 'METERCHAMBER', INDETERMINATE) -sump = express_getattr(IfcDistributionChamberElementTypeEnum, 'SUMP', INDETERMINATE) -trench = express_getattr(IfcDistributionChamberElementTypeEnum, 'TRENCH', INDETERMINATE) -valvechamber = express_getattr(IfcDistributionChamberElementTypeEnum, 'VALVECHAMBER', INDETERMINATE) -userdefined = express_getattr(IfcDistributionChamberElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDistributionChamberElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +formedduct = IfcDistributionChamberElementTypeEnum.FORMEDDUCT +inspectionchamber = IfcDistributionChamberElementTypeEnum.INSPECTIONCHAMBER +inspectionpit = IfcDistributionChamberElementTypeEnum.INSPECTIONPIT +manhole = IfcDistributionChamberElementTypeEnum.MANHOLE +meterchamber = IfcDistributionChamberElementTypeEnum.METERCHAMBER +sump = IfcDistributionChamberElementTypeEnum.SUMP +trench = IfcDistributionChamberElementTypeEnum.TRENCH +valvechamber = IfcDistributionChamberElementTypeEnum.VALVECHAMBER +userdefined = IfcDistributionChamberElementTypeEnum.USERDEFINED +notdefined = IfcDistributionChamberElementTypeEnum.NOTDEFINED IfcDistributionPortTypeEnum = enum_namespace() -cable = express_getattr(IfcDistributionPortTypeEnum, 'CABLE', INDETERMINATE) -cablecarrier = express_getattr(IfcDistributionPortTypeEnum, 'CABLECARRIER', INDETERMINATE) -duct = express_getattr(IfcDistributionPortTypeEnum, 'DUCT', INDETERMINATE) -pipe = express_getattr(IfcDistributionPortTypeEnum, 'PIPE', INDETERMINATE) -wireless = express_getattr(IfcDistributionPortTypeEnum, 'WIRELESS', INDETERMINATE) -userdefined = express_getattr(IfcDistributionPortTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDistributionPortTypeEnum, 'NOTDEFINED', INDETERMINATE) +cable = IfcDistributionPortTypeEnum.CABLE +cablecarrier = IfcDistributionPortTypeEnum.CABLECARRIER +duct = IfcDistributionPortTypeEnum.DUCT +pipe = IfcDistributionPortTypeEnum.PIPE +wireless = IfcDistributionPortTypeEnum.WIRELESS +userdefined = IfcDistributionPortTypeEnum.USERDEFINED +notdefined = IfcDistributionPortTypeEnum.NOTDEFINED IfcDistributionSystemEnum = enum_namespace() -airconditioning = express_getattr(IfcDistributionSystemEnum, 'AIRCONDITIONING', INDETERMINATE) -audiovisual = express_getattr(IfcDistributionSystemEnum, 'AUDIOVISUAL', INDETERMINATE) -chemical = express_getattr(IfcDistributionSystemEnum, 'CHEMICAL', INDETERMINATE) -chilledwater = express_getattr(IfcDistributionSystemEnum, 'CHILLEDWATER', INDETERMINATE) -communication = express_getattr(IfcDistributionSystemEnum, 'COMMUNICATION', INDETERMINATE) -compressedair = express_getattr(IfcDistributionSystemEnum, 'COMPRESSEDAIR', INDETERMINATE) -condenserwater = express_getattr(IfcDistributionSystemEnum, 'CONDENSERWATER', INDETERMINATE) -control = express_getattr(IfcDistributionSystemEnum, 'CONTROL', INDETERMINATE) -conveying = express_getattr(IfcDistributionSystemEnum, 'CONVEYING', INDETERMINATE) -data = express_getattr(IfcDistributionSystemEnum, 'DATA', INDETERMINATE) -disposal = express_getattr(IfcDistributionSystemEnum, 'DISPOSAL', INDETERMINATE) -domesticcoldwater = express_getattr(IfcDistributionSystemEnum, 'DOMESTICCOLDWATER', INDETERMINATE) -domestichotwater = express_getattr(IfcDistributionSystemEnum, 'DOMESTICHOTWATER', INDETERMINATE) -drainage = express_getattr(IfcDistributionSystemEnum, 'DRAINAGE', INDETERMINATE) -earthing = express_getattr(IfcDistributionSystemEnum, 'EARTHING', INDETERMINATE) -electrical = express_getattr(IfcDistributionSystemEnum, 'ELECTRICAL', INDETERMINATE) -electroacoustic = express_getattr(IfcDistributionSystemEnum, 'ELECTROACOUSTIC', INDETERMINATE) -exhaust = express_getattr(IfcDistributionSystemEnum, 'EXHAUST', INDETERMINATE) -fireprotection = express_getattr(IfcDistributionSystemEnum, 'FIREPROTECTION', INDETERMINATE) -fuel = express_getattr(IfcDistributionSystemEnum, 'FUEL', INDETERMINATE) -gas = express_getattr(IfcDistributionSystemEnum, 'GAS', INDETERMINATE) -hazardous = express_getattr(IfcDistributionSystemEnum, 'HAZARDOUS', INDETERMINATE) -heating = express_getattr(IfcDistributionSystemEnum, 'HEATING', INDETERMINATE) -lighting = express_getattr(IfcDistributionSystemEnum, 'LIGHTING', INDETERMINATE) -lightningprotection = express_getattr(IfcDistributionSystemEnum, 'LIGHTNINGPROTECTION', INDETERMINATE) -municipalsolidwaste = express_getattr(IfcDistributionSystemEnum, 'MUNICIPALSOLIDWASTE', INDETERMINATE) -oil = express_getattr(IfcDistributionSystemEnum, 'OIL', INDETERMINATE) -operational = express_getattr(IfcDistributionSystemEnum, 'OPERATIONAL', INDETERMINATE) -powergeneration = express_getattr(IfcDistributionSystemEnum, 'POWERGENERATION', INDETERMINATE) -rainwater = express_getattr(IfcDistributionSystemEnum, 'RAINWATER', INDETERMINATE) -refrigeration = express_getattr(IfcDistributionSystemEnum, 'REFRIGERATION', INDETERMINATE) -security = express_getattr(IfcDistributionSystemEnum, 'SECURITY', INDETERMINATE) -sewage = express_getattr(IfcDistributionSystemEnum, 'SEWAGE', INDETERMINATE) -signal = express_getattr(IfcDistributionSystemEnum, 'SIGNAL', INDETERMINATE) -stormwater = express_getattr(IfcDistributionSystemEnum, 'STORMWATER', INDETERMINATE) -telephone = express_getattr(IfcDistributionSystemEnum, 'TELEPHONE', INDETERMINATE) -tv = express_getattr(IfcDistributionSystemEnum, 'TV', INDETERMINATE) -vacuum = express_getattr(IfcDistributionSystemEnum, 'VACUUM', INDETERMINATE) -vent = express_getattr(IfcDistributionSystemEnum, 'VENT', INDETERMINATE) -ventilation = express_getattr(IfcDistributionSystemEnum, 'VENTILATION', INDETERMINATE) -wastewater = express_getattr(IfcDistributionSystemEnum, 'WASTEWATER', INDETERMINATE) -watersupply = express_getattr(IfcDistributionSystemEnum, 'WATERSUPPLY', INDETERMINATE) -catenary_system = express_getattr(IfcDistributionSystemEnum, 'CATENARY_SYSTEM', INDETERMINATE) -overhead_contactline_system = express_getattr(IfcDistributionSystemEnum, 'OVERHEAD_CONTACTLINE_SYSTEM', INDETERMINATE) -return_circuit = express_getattr(IfcDistributionSystemEnum, 'RETURN_CIRCUIT', INDETERMINATE) -userdefined = express_getattr(IfcDistributionSystemEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDistributionSystemEnum, 'NOTDEFINED', INDETERMINATE) +airconditioning = IfcDistributionSystemEnum.AIRCONDITIONING +audiovisual = IfcDistributionSystemEnum.AUDIOVISUAL +chemical = IfcDistributionSystemEnum.CHEMICAL +chilledwater = IfcDistributionSystemEnum.CHILLEDWATER +communication = IfcDistributionSystemEnum.COMMUNICATION +compressedair = IfcDistributionSystemEnum.COMPRESSEDAIR +condenserwater = IfcDistributionSystemEnum.CONDENSERWATER +control = IfcDistributionSystemEnum.CONTROL +conveying = IfcDistributionSystemEnum.CONVEYING +data = IfcDistributionSystemEnum.DATA +disposal = IfcDistributionSystemEnum.DISPOSAL +domesticcoldwater = IfcDistributionSystemEnum.DOMESTICCOLDWATER +domestichotwater = IfcDistributionSystemEnum.DOMESTICHOTWATER +drainage = IfcDistributionSystemEnum.DRAINAGE +earthing = IfcDistributionSystemEnum.EARTHING +electrical = IfcDistributionSystemEnum.ELECTRICAL +electroacoustic = IfcDistributionSystemEnum.ELECTROACOUSTIC +exhaust = IfcDistributionSystemEnum.EXHAUST +fireprotection = IfcDistributionSystemEnum.FIREPROTECTION +fuel = IfcDistributionSystemEnum.FUEL +gas = IfcDistributionSystemEnum.GAS +hazardous = IfcDistributionSystemEnum.HAZARDOUS +heating = IfcDistributionSystemEnum.HEATING +lighting = IfcDistributionSystemEnum.LIGHTING +lightningprotection = IfcDistributionSystemEnum.LIGHTNINGPROTECTION +municipalsolidwaste = IfcDistributionSystemEnum.MUNICIPALSOLIDWASTE +oil = IfcDistributionSystemEnum.OIL +operational = IfcDistributionSystemEnum.OPERATIONAL +powergeneration = IfcDistributionSystemEnum.POWERGENERATION +rainwater = IfcDistributionSystemEnum.RAINWATER +refrigeration = IfcDistributionSystemEnum.REFRIGERATION +security = IfcDistributionSystemEnum.SECURITY +sewage = IfcDistributionSystemEnum.SEWAGE +signal = IfcDistributionSystemEnum.SIGNAL +stormwater = IfcDistributionSystemEnum.STORMWATER +telephone = IfcDistributionSystemEnum.TELEPHONE +tv = IfcDistributionSystemEnum.TV +vacuum = IfcDistributionSystemEnum.VACUUM +vent = IfcDistributionSystemEnum.VENT +ventilation = IfcDistributionSystemEnum.VENTILATION +wastewater = IfcDistributionSystemEnum.WASTEWATER +watersupply = IfcDistributionSystemEnum.WATERSUPPLY +catenary_system = IfcDistributionSystemEnum.CATENARY_SYSTEM +overhead_contactline_system = IfcDistributionSystemEnum.OVERHEAD_CONTACTLINE_SYSTEM +return_circuit = IfcDistributionSystemEnum.RETURN_CIRCUIT +userdefined = IfcDistributionSystemEnum.USERDEFINED +notdefined = IfcDistributionSystemEnum.NOTDEFINED IfcDocumentConfidentialityEnum = enum_namespace() -public = express_getattr(IfcDocumentConfidentialityEnum, 'PUBLIC', INDETERMINATE) -restricted = express_getattr(IfcDocumentConfidentialityEnum, 'RESTRICTED', INDETERMINATE) -confidential = express_getattr(IfcDocumentConfidentialityEnum, 'CONFIDENTIAL', INDETERMINATE) -personal = express_getattr(IfcDocumentConfidentialityEnum, 'PERSONAL', INDETERMINATE) -userdefined = express_getattr(IfcDocumentConfidentialityEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDocumentConfidentialityEnum, 'NOTDEFINED', INDETERMINATE) +public = IfcDocumentConfidentialityEnum.PUBLIC +restricted = IfcDocumentConfidentialityEnum.RESTRICTED +confidential = IfcDocumentConfidentialityEnum.CONFIDENTIAL +personal = IfcDocumentConfidentialityEnum.PERSONAL +userdefined = IfcDocumentConfidentialityEnum.USERDEFINED +notdefined = IfcDocumentConfidentialityEnum.NOTDEFINED IfcDocumentStatusEnum = enum_namespace() -draft = express_getattr(IfcDocumentStatusEnum, 'DRAFT', INDETERMINATE) -finaldraft = express_getattr(IfcDocumentStatusEnum, 'FINALDRAFT', INDETERMINATE) -final = express_getattr(IfcDocumentStatusEnum, 'FINAL', INDETERMINATE) -revision = express_getattr(IfcDocumentStatusEnum, 'REVISION', INDETERMINATE) -notdefined = express_getattr(IfcDocumentStatusEnum, 'NOTDEFINED', INDETERMINATE) +draft = IfcDocumentStatusEnum.DRAFT +finaldraft = IfcDocumentStatusEnum.FINALDRAFT +final = IfcDocumentStatusEnum.FINAL +revision = IfcDocumentStatusEnum.REVISION +notdefined = IfcDocumentStatusEnum.NOTDEFINED IfcDoorPanelOperationEnum = enum_namespace() -swinging = express_getattr(IfcDoorPanelOperationEnum, 'SWINGING', INDETERMINATE) -double_acting = express_getattr(IfcDoorPanelOperationEnum, 'DOUBLE_ACTING', INDETERMINATE) -sliding = express_getattr(IfcDoorPanelOperationEnum, 'SLIDING', INDETERMINATE) -folding = express_getattr(IfcDoorPanelOperationEnum, 'FOLDING', INDETERMINATE) -revolving = express_getattr(IfcDoorPanelOperationEnum, 'REVOLVING', INDETERMINATE) -rollingup = express_getattr(IfcDoorPanelOperationEnum, 'ROLLINGUP', INDETERMINATE) -fixedpanel = express_getattr(IfcDoorPanelOperationEnum, 'FIXEDPANEL', INDETERMINATE) -userdefined = express_getattr(IfcDoorPanelOperationEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDoorPanelOperationEnum, 'NOTDEFINED', INDETERMINATE) +swinging = IfcDoorPanelOperationEnum.SWINGING +double_acting = IfcDoorPanelOperationEnum.DOUBLE_ACTING +sliding = IfcDoorPanelOperationEnum.SLIDING +folding = IfcDoorPanelOperationEnum.FOLDING +revolving = IfcDoorPanelOperationEnum.REVOLVING +rollingup = IfcDoorPanelOperationEnum.ROLLINGUP +fixedpanel = IfcDoorPanelOperationEnum.FIXEDPANEL +userdefined = IfcDoorPanelOperationEnum.USERDEFINED +notdefined = IfcDoorPanelOperationEnum.NOTDEFINED IfcDoorPanelPositionEnum = enum_namespace() -left = express_getattr(IfcDoorPanelPositionEnum, 'LEFT', INDETERMINATE) -middle = express_getattr(IfcDoorPanelPositionEnum, 'MIDDLE', INDETERMINATE) -right = express_getattr(IfcDoorPanelPositionEnum, 'RIGHT', INDETERMINATE) -notdefined = express_getattr(IfcDoorPanelPositionEnum, 'NOTDEFINED', INDETERMINATE) +left = IfcDoorPanelPositionEnum.LEFT +middle = IfcDoorPanelPositionEnum.MIDDLE +right = IfcDoorPanelPositionEnum.RIGHT +notdefined = IfcDoorPanelPositionEnum.NOTDEFINED IfcDoorStyleConstructionEnum = enum_namespace() -aluminium = express_getattr(IfcDoorStyleConstructionEnum, 'ALUMINIUM', INDETERMINATE) -high_grade_steel = express_getattr(IfcDoorStyleConstructionEnum, 'HIGH_GRADE_STEEL', INDETERMINATE) -steel = express_getattr(IfcDoorStyleConstructionEnum, 'STEEL', INDETERMINATE) -wood = express_getattr(IfcDoorStyleConstructionEnum, 'WOOD', INDETERMINATE) -aluminium_wood = express_getattr(IfcDoorStyleConstructionEnum, 'ALUMINIUM_WOOD', INDETERMINATE) -aluminium_plastic = express_getattr(IfcDoorStyleConstructionEnum, 'ALUMINIUM_PLASTIC', INDETERMINATE) -plastic = express_getattr(IfcDoorStyleConstructionEnum, 'PLASTIC', INDETERMINATE) -userdefined = express_getattr(IfcDoorStyleConstructionEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDoorStyleConstructionEnum, 'NOTDEFINED', INDETERMINATE) +aluminium = IfcDoorStyleConstructionEnum.ALUMINIUM +high_grade_steel = IfcDoorStyleConstructionEnum.HIGH_GRADE_STEEL +steel = IfcDoorStyleConstructionEnum.STEEL +wood = IfcDoorStyleConstructionEnum.WOOD +aluminium_wood = IfcDoorStyleConstructionEnum.ALUMINIUM_WOOD +aluminium_plastic = IfcDoorStyleConstructionEnum.ALUMINIUM_PLASTIC +plastic = IfcDoorStyleConstructionEnum.PLASTIC +userdefined = IfcDoorStyleConstructionEnum.USERDEFINED +notdefined = IfcDoorStyleConstructionEnum.NOTDEFINED IfcDoorStyleOperationEnum = enum_namespace() -single_swing_left = express_getattr(IfcDoorStyleOperationEnum, 'SINGLE_SWING_LEFT', INDETERMINATE) -single_swing_right = express_getattr(IfcDoorStyleOperationEnum, 'SINGLE_SWING_RIGHT', INDETERMINATE) -double_door_single_swing = express_getattr(IfcDoorStyleOperationEnum, 'DOUBLE_DOOR_SINGLE_SWING', INDETERMINATE) -double_door_single_swing_opposite_left = express_getattr(IfcDoorStyleOperationEnum, 'DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_LEFT', INDETERMINATE) -double_door_single_swing_opposite_right = express_getattr(IfcDoorStyleOperationEnum, 'DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_RIGHT', INDETERMINATE) -double_swing_left = express_getattr(IfcDoorStyleOperationEnum, 'DOUBLE_SWING_LEFT', INDETERMINATE) -double_swing_right = express_getattr(IfcDoorStyleOperationEnum, 'DOUBLE_SWING_RIGHT', INDETERMINATE) -double_door_double_swing = express_getattr(IfcDoorStyleOperationEnum, 'DOUBLE_DOOR_DOUBLE_SWING', INDETERMINATE) -sliding_to_left = express_getattr(IfcDoorStyleOperationEnum, 'SLIDING_TO_LEFT', INDETERMINATE) -sliding_to_right = express_getattr(IfcDoorStyleOperationEnum, 'SLIDING_TO_RIGHT', INDETERMINATE) -double_door_sliding = express_getattr(IfcDoorStyleOperationEnum, 'DOUBLE_DOOR_SLIDING', INDETERMINATE) -folding_to_left = express_getattr(IfcDoorStyleOperationEnum, 'FOLDING_TO_LEFT', INDETERMINATE) -folding_to_right = express_getattr(IfcDoorStyleOperationEnum, 'FOLDING_TO_RIGHT', INDETERMINATE) -double_door_folding = express_getattr(IfcDoorStyleOperationEnum, 'DOUBLE_DOOR_FOLDING', INDETERMINATE) -revolving = express_getattr(IfcDoorStyleOperationEnum, 'REVOLVING', INDETERMINATE) -rollingup = express_getattr(IfcDoorStyleOperationEnum, 'ROLLINGUP', INDETERMINATE) -userdefined = express_getattr(IfcDoorStyleOperationEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDoorStyleOperationEnum, 'NOTDEFINED', INDETERMINATE) +single_swing_left = IfcDoorStyleOperationEnum.SINGLE_SWING_LEFT +single_swing_right = IfcDoorStyleOperationEnum.SINGLE_SWING_RIGHT +double_door_single_swing = IfcDoorStyleOperationEnum.DOUBLE_DOOR_SINGLE_SWING +double_door_single_swing_opposite_left = IfcDoorStyleOperationEnum.DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_LEFT +double_door_single_swing_opposite_right = IfcDoorStyleOperationEnum.DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_RIGHT +double_swing_left = IfcDoorStyleOperationEnum.DOUBLE_SWING_LEFT +double_swing_right = IfcDoorStyleOperationEnum.DOUBLE_SWING_RIGHT +double_door_double_swing = IfcDoorStyleOperationEnum.DOUBLE_DOOR_DOUBLE_SWING +sliding_to_left = IfcDoorStyleOperationEnum.SLIDING_TO_LEFT +sliding_to_right = IfcDoorStyleOperationEnum.SLIDING_TO_RIGHT +double_door_sliding = IfcDoorStyleOperationEnum.DOUBLE_DOOR_SLIDING +folding_to_left = IfcDoorStyleOperationEnum.FOLDING_TO_LEFT +folding_to_right = IfcDoorStyleOperationEnum.FOLDING_TO_RIGHT +double_door_folding = IfcDoorStyleOperationEnum.DOUBLE_DOOR_FOLDING +revolving = IfcDoorStyleOperationEnum.REVOLVING +rollingup = IfcDoorStyleOperationEnum.ROLLINGUP +userdefined = IfcDoorStyleOperationEnum.USERDEFINED +notdefined = IfcDoorStyleOperationEnum.NOTDEFINED IfcDoorTypeEnum = enum_namespace() -door = express_getattr(IfcDoorTypeEnum, 'DOOR', INDETERMINATE) -gate = express_getattr(IfcDoorTypeEnum, 'GATE', INDETERMINATE) -trapdoor = express_getattr(IfcDoorTypeEnum, 'TRAPDOOR', INDETERMINATE) -boom_barrier = express_getattr(IfcDoorTypeEnum, 'BOOM_BARRIER', INDETERMINATE) -turnstile = express_getattr(IfcDoorTypeEnum, 'TURNSTILE', INDETERMINATE) -userdefined = express_getattr(IfcDoorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDoorTypeEnum, 'NOTDEFINED', INDETERMINATE) +door = IfcDoorTypeEnum.DOOR +gate = IfcDoorTypeEnum.GATE +trapdoor = IfcDoorTypeEnum.TRAPDOOR +boom_barrier = IfcDoorTypeEnum.BOOM_BARRIER +turnstile = IfcDoorTypeEnum.TURNSTILE +userdefined = IfcDoorTypeEnum.USERDEFINED +notdefined = IfcDoorTypeEnum.NOTDEFINED IfcDoorTypeOperationEnum = enum_namespace() -single_swing_left = express_getattr(IfcDoorTypeOperationEnum, 'SINGLE_SWING_LEFT', INDETERMINATE) -single_swing_right = express_getattr(IfcDoorTypeOperationEnum, 'SINGLE_SWING_RIGHT', INDETERMINATE) -double_door_single_swing = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_DOOR_SINGLE_SWING', INDETERMINATE) -double_door_single_swing_opposite_left = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_LEFT', INDETERMINATE) -double_door_single_swing_opposite_right = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_RIGHT', INDETERMINATE) -double_swing_left = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_SWING_LEFT', INDETERMINATE) -double_swing_right = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_SWING_RIGHT', INDETERMINATE) -double_door_double_swing = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_DOOR_DOUBLE_SWING', INDETERMINATE) -sliding_to_left = express_getattr(IfcDoorTypeOperationEnum, 'SLIDING_TO_LEFT', INDETERMINATE) -sliding_to_right = express_getattr(IfcDoorTypeOperationEnum, 'SLIDING_TO_RIGHT', INDETERMINATE) -double_door_sliding = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_DOOR_SLIDING', INDETERMINATE) -folding_to_left = express_getattr(IfcDoorTypeOperationEnum, 'FOLDING_TO_LEFT', INDETERMINATE) -folding_to_right = express_getattr(IfcDoorTypeOperationEnum, 'FOLDING_TO_RIGHT', INDETERMINATE) -double_door_folding = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_DOOR_FOLDING', INDETERMINATE) -revolving = express_getattr(IfcDoorTypeOperationEnum, 'REVOLVING', INDETERMINATE) -rollingup = express_getattr(IfcDoorTypeOperationEnum, 'ROLLINGUP', INDETERMINATE) -swing_fixed_left = express_getattr(IfcDoorTypeOperationEnum, 'SWING_FIXED_LEFT', INDETERMINATE) -swing_fixed_right = express_getattr(IfcDoorTypeOperationEnum, 'SWING_FIXED_RIGHT', INDETERMINATE) -userdefined = express_getattr(IfcDoorTypeOperationEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDoorTypeOperationEnum, 'NOTDEFINED', INDETERMINATE) +single_swing_left = IfcDoorTypeOperationEnum.SINGLE_SWING_LEFT +single_swing_right = IfcDoorTypeOperationEnum.SINGLE_SWING_RIGHT +double_door_single_swing = IfcDoorTypeOperationEnum.DOUBLE_DOOR_SINGLE_SWING +double_door_single_swing_opposite_left = IfcDoorTypeOperationEnum.DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_LEFT +double_door_single_swing_opposite_right = IfcDoorTypeOperationEnum.DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_RIGHT +double_swing_left = IfcDoorTypeOperationEnum.DOUBLE_SWING_LEFT +double_swing_right = IfcDoorTypeOperationEnum.DOUBLE_SWING_RIGHT +double_door_double_swing = IfcDoorTypeOperationEnum.DOUBLE_DOOR_DOUBLE_SWING +sliding_to_left = IfcDoorTypeOperationEnum.SLIDING_TO_LEFT +sliding_to_right = IfcDoorTypeOperationEnum.SLIDING_TO_RIGHT +double_door_sliding = IfcDoorTypeOperationEnum.DOUBLE_DOOR_SLIDING +folding_to_left = IfcDoorTypeOperationEnum.FOLDING_TO_LEFT +folding_to_right = IfcDoorTypeOperationEnum.FOLDING_TO_RIGHT +double_door_folding = IfcDoorTypeOperationEnum.DOUBLE_DOOR_FOLDING +revolving = IfcDoorTypeOperationEnum.REVOLVING +rollingup = IfcDoorTypeOperationEnum.ROLLINGUP +swing_fixed_left = IfcDoorTypeOperationEnum.SWING_FIXED_LEFT +swing_fixed_right = IfcDoorTypeOperationEnum.SWING_FIXED_RIGHT +userdefined = IfcDoorTypeOperationEnum.USERDEFINED +notdefined = IfcDoorTypeOperationEnum.NOTDEFINED IfcDuctFittingTypeEnum = enum_namespace() -bend = express_getattr(IfcDuctFittingTypeEnum, 'BEND', INDETERMINATE) -connector = express_getattr(IfcDuctFittingTypeEnum, 'CONNECTOR', INDETERMINATE) -entry = express_getattr(IfcDuctFittingTypeEnum, 'ENTRY', INDETERMINATE) -exit = express_getattr(IfcDuctFittingTypeEnum, 'EXIT', INDETERMINATE) -junction = express_getattr(IfcDuctFittingTypeEnum, 'JUNCTION', INDETERMINATE) -obstruction = express_getattr(IfcDuctFittingTypeEnum, 'OBSTRUCTION', INDETERMINATE) -transition = express_getattr(IfcDuctFittingTypeEnum, 'TRANSITION', INDETERMINATE) -userdefined = express_getattr(IfcDuctFittingTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDuctFittingTypeEnum, 'NOTDEFINED', INDETERMINATE) +bend = IfcDuctFittingTypeEnum.BEND +connector = IfcDuctFittingTypeEnum.CONNECTOR +entry = IfcDuctFittingTypeEnum.ENTRY +exit = IfcDuctFittingTypeEnum.EXIT +junction = IfcDuctFittingTypeEnum.JUNCTION +obstruction = IfcDuctFittingTypeEnum.OBSTRUCTION +transition = IfcDuctFittingTypeEnum.TRANSITION +userdefined = IfcDuctFittingTypeEnum.USERDEFINED +notdefined = IfcDuctFittingTypeEnum.NOTDEFINED IfcDuctSegmentTypeEnum = enum_namespace() -rigidsegment = express_getattr(IfcDuctSegmentTypeEnum, 'RIGIDSEGMENT', INDETERMINATE) -flexiblesegment = express_getattr(IfcDuctSegmentTypeEnum, 'FLEXIBLESEGMENT', INDETERMINATE) -userdefined = express_getattr(IfcDuctSegmentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDuctSegmentTypeEnum, 'NOTDEFINED', INDETERMINATE) +rigidsegment = IfcDuctSegmentTypeEnum.RIGIDSEGMENT +flexiblesegment = IfcDuctSegmentTypeEnum.FLEXIBLESEGMENT +userdefined = IfcDuctSegmentTypeEnum.USERDEFINED +notdefined = IfcDuctSegmentTypeEnum.NOTDEFINED IfcDuctSilencerTypeEnum = enum_namespace() -flatoval = express_getattr(IfcDuctSilencerTypeEnum, 'FLATOVAL', INDETERMINATE) -rectangular = express_getattr(IfcDuctSilencerTypeEnum, 'RECTANGULAR', INDETERMINATE) -round = express_getattr(IfcDuctSilencerTypeEnum, 'ROUND', INDETERMINATE) -userdefined = express_getattr(IfcDuctSilencerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDuctSilencerTypeEnum, 'NOTDEFINED', INDETERMINATE) +flatoval = IfcDuctSilencerTypeEnum.FLATOVAL +rectangular = IfcDuctSilencerTypeEnum.RECTANGULAR +round = IfcDuctSilencerTypeEnum.ROUND +userdefined = IfcDuctSilencerTypeEnum.USERDEFINED +notdefined = IfcDuctSilencerTypeEnum.NOTDEFINED IfcEarthworksCutTypeEnum = enum_namespace() -trench = express_getattr(IfcEarthworksCutTypeEnum, 'TRENCH', INDETERMINATE) -dredging = express_getattr(IfcEarthworksCutTypeEnum, 'DREDGING', INDETERMINATE) -excavation = express_getattr(IfcEarthworksCutTypeEnum, 'EXCAVATION', INDETERMINATE) -overexcavation = express_getattr(IfcEarthworksCutTypeEnum, 'OVEREXCAVATION', INDETERMINATE) -topsoilremoval = express_getattr(IfcEarthworksCutTypeEnum, 'TOPSOILREMOVAL', INDETERMINATE) -stepexcavation = express_getattr(IfcEarthworksCutTypeEnum, 'STEPEXCAVATION', INDETERMINATE) -pavementmilling = express_getattr(IfcEarthworksCutTypeEnum, 'PAVEMENTMILLING', INDETERMINATE) -cut = express_getattr(IfcEarthworksCutTypeEnum, 'CUT', INDETERMINATE) -base_excavation = express_getattr(IfcEarthworksCutTypeEnum, 'BASE_EXCAVATION', INDETERMINATE) -userdefined = express_getattr(IfcEarthworksCutTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcEarthworksCutTypeEnum, 'NOTDEFINED', INDETERMINATE) +trench = IfcEarthworksCutTypeEnum.TRENCH +dredging = IfcEarthworksCutTypeEnum.DREDGING +excavation = IfcEarthworksCutTypeEnum.EXCAVATION +overexcavation = IfcEarthworksCutTypeEnum.OVEREXCAVATION +topsoilremoval = IfcEarthworksCutTypeEnum.TOPSOILREMOVAL +stepexcavation = IfcEarthworksCutTypeEnum.STEPEXCAVATION +pavementmilling = IfcEarthworksCutTypeEnum.PAVEMENTMILLING +cut = IfcEarthworksCutTypeEnum.CUT +base_excavation = IfcEarthworksCutTypeEnum.BASE_EXCAVATION +userdefined = IfcEarthworksCutTypeEnum.USERDEFINED +notdefined = IfcEarthworksCutTypeEnum.NOTDEFINED IfcEarthworksFillTypeEnum = enum_namespace() -backfill = express_getattr(IfcEarthworksFillTypeEnum, 'BACKFILL', INDETERMINATE) -counterweight = express_getattr(IfcEarthworksFillTypeEnum, 'COUNTERWEIGHT', INDETERMINATE) -subgrade = express_getattr(IfcEarthworksFillTypeEnum, 'SUBGRADE', INDETERMINATE) -embankment = express_getattr(IfcEarthworksFillTypeEnum, 'EMBANKMENT', INDETERMINATE) -transitionsection = express_getattr(IfcEarthworksFillTypeEnum, 'TRANSITIONSECTION', INDETERMINATE) -subgradebed = express_getattr(IfcEarthworksFillTypeEnum, 'SUBGRADEBED', INDETERMINATE) -slopefill = express_getattr(IfcEarthworksFillTypeEnum, 'SLOPEFILL', INDETERMINATE) -userdefined = express_getattr(IfcEarthworksFillTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcEarthworksFillTypeEnum, 'NOTDEFINED', INDETERMINATE) +backfill = IfcEarthworksFillTypeEnum.BACKFILL +counterweight = IfcEarthworksFillTypeEnum.COUNTERWEIGHT +subgrade = IfcEarthworksFillTypeEnum.SUBGRADE +embankment = IfcEarthworksFillTypeEnum.EMBANKMENT +transitionsection = IfcEarthworksFillTypeEnum.TRANSITIONSECTION +subgradebed = IfcEarthworksFillTypeEnum.SUBGRADEBED +slopefill = IfcEarthworksFillTypeEnum.SLOPEFILL +userdefined = IfcEarthworksFillTypeEnum.USERDEFINED +notdefined = IfcEarthworksFillTypeEnum.NOTDEFINED IfcElectricApplianceTypeEnum = enum_namespace() -dishwasher = express_getattr(IfcElectricApplianceTypeEnum, 'DISHWASHER', INDETERMINATE) -electriccooker = express_getattr(IfcElectricApplianceTypeEnum, 'ELECTRICCOOKER', INDETERMINATE) -freestandingelectricheater = express_getattr(IfcElectricApplianceTypeEnum, 'FREESTANDINGELECTRICHEATER', INDETERMINATE) -freestandingfan = express_getattr(IfcElectricApplianceTypeEnum, 'FREESTANDINGFAN', INDETERMINATE) -freestandingwaterheater = express_getattr(IfcElectricApplianceTypeEnum, 'FREESTANDINGWATERHEATER', INDETERMINATE) -freestandingwatercooler = express_getattr(IfcElectricApplianceTypeEnum, 'FREESTANDINGWATERCOOLER', INDETERMINATE) -freezer = express_getattr(IfcElectricApplianceTypeEnum, 'FREEZER', INDETERMINATE) -fridge_freezer = express_getattr(IfcElectricApplianceTypeEnum, 'FRIDGE_FREEZER', INDETERMINATE) -handdryer = express_getattr(IfcElectricApplianceTypeEnum, 'HANDDRYER', INDETERMINATE) -kitchenmachine = express_getattr(IfcElectricApplianceTypeEnum, 'KITCHENMACHINE', INDETERMINATE) -microwave = express_getattr(IfcElectricApplianceTypeEnum, 'MICROWAVE', INDETERMINATE) -photocopier = express_getattr(IfcElectricApplianceTypeEnum, 'PHOTOCOPIER', INDETERMINATE) -refrigerator = express_getattr(IfcElectricApplianceTypeEnum, 'REFRIGERATOR', INDETERMINATE) -tumbledryer = express_getattr(IfcElectricApplianceTypeEnum, 'TUMBLEDRYER', INDETERMINATE) -vendingmachine = express_getattr(IfcElectricApplianceTypeEnum, 'VENDINGMACHINE', INDETERMINATE) -washingmachine = express_getattr(IfcElectricApplianceTypeEnum, 'WASHINGMACHINE', INDETERMINATE) -userdefined = express_getattr(IfcElectricApplianceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcElectricApplianceTypeEnum, 'NOTDEFINED', INDETERMINATE) +dishwasher = IfcElectricApplianceTypeEnum.DISHWASHER +electriccooker = IfcElectricApplianceTypeEnum.ELECTRICCOOKER +freestandingelectricheater = IfcElectricApplianceTypeEnum.FREESTANDINGELECTRICHEATER +freestandingfan = IfcElectricApplianceTypeEnum.FREESTANDINGFAN +freestandingwaterheater = IfcElectricApplianceTypeEnum.FREESTANDINGWATERHEATER +freestandingwatercooler = IfcElectricApplianceTypeEnum.FREESTANDINGWATERCOOLER +freezer = IfcElectricApplianceTypeEnum.FREEZER +fridge_freezer = IfcElectricApplianceTypeEnum.FRIDGE_FREEZER +handdryer = IfcElectricApplianceTypeEnum.HANDDRYER +kitchenmachine = IfcElectricApplianceTypeEnum.KITCHENMACHINE +microwave = IfcElectricApplianceTypeEnum.MICROWAVE +photocopier = IfcElectricApplianceTypeEnum.PHOTOCOPIER +refrigerator = IfcElectricApplianceTypeEnum.REFRIGERATOR +tumbledryer = IfcElectricApplianceTypeEnum.TUMBLEDRYER +vendingmachine = IfcElectricApplianceTypeEnum.VENDINGMACHINE +washingmachine = IfcElectricApplianceTypeEnum.WASHINGMACHINE +userdefined = IfcElectricApplianceTypeEnum.USERDEFINED +notdefined = IfcElectricApplianceTypeEnum.NOTDEFINED IfcElectricDistributionBoardTypeEnum = enum_namespace() -consumerunit = express_getattr(IfcElectricDistributionBoardTypeEnum, 'CONSUMERUNIT', INDETERMINATE) -distributionboard = express_getattr(IfcElectricDistributionBoardTypeEnum, 'DISTRIBUTIONBOARD', INDETERMINATE) -motorcontrolcentre = express_getattr(IfcElectricDistributionBoardTypeEnum, 'MOTORCONTROLCENTRE', INDETERMINATE) -switchboard = express_getattr(IfcElectricDistributionBoardTypeEnum, 'SWITCHBOARD', INDETERMINATE) -userdefined = express_getattr(IfcElectricDistributionBoardTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcElectricDistributionBoardTypeEnum, 'NOTDEFINED', INDETERMINATE) +consumerunit = IfcElectricDistributionBoardTypeEnum.CONSUMERUNIT +distributionboard = IfcElectricDistributionBoardTypeEnum.DISTRIBUTIONBOARD +motorcontrolcentre = IfcElectricDistributionBoardTypeEnum.MOTORCONTROLCENTRE +switchboard = IfcElectricDistributionBoardTypeEnum.SWITCHBOARD +userdefined = IfcElectricDistributionBoardTypeEnum.USERDEFINED +notdefined = IfcElectricDistributionBoardTypeEnum.NOTDEFINED IfcElectricFlowStorageDeviceTypeEnum = enum_namespace() -battery = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'BATTERY', INDETERMINATE) -capacitorbank = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'CAPACITORBANK', INDETERMINATE) -harmonicfilter = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'HARMONICFILTER', INDETERMINATE) -inductorbank = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'INDUCTORBANK', INDETERMINATE) -ups = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'UPS', INDETERMINATE) -capacitor = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'CAPACITOR', INDETERMINATE) -compensator = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'COMPENSATOR', INDETERMINATE) -inductor = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'INDUCTOR', INDETERMINATE) -recharger = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'RECHARGER', INDETERMINATE) -userdefined = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'NOTDEFINED', INDETERMINATE) +battery = IfcElectricFlowStorageDeviceTypeEnum.BATTERY +capacitorbank = IfcElectricFlowStorageDeviceTypeEnum.CAPACITORBANK +harmonicfilter = IfcElectricFlowStorageDeviceTypeEnum.HARMONICFILTER +inductorbank = IfcElectricFlowStorageDeviceTypeEnum.INDUCTORBANK +ups = IfcElectricFlowStorageDeviceTypeEnum.UPS +capacitor = IfcElectricFlowStorageDeviceTypeEnum.CAPACITOR +compensator = IfcElectricFlowStorageDeviceTypeEnum.COMPENSATOR +inductor = IfcElectricFlowStorageDeviceTypeEnum.INDUCTOR +recharger = IfcElectricFlowStorageDeviceTypeEnum.RECHARGER +userdefined = IfcElectricFlowStorageDeviceTypeEnum.USERDEFINED +notdefined = IfcElectricFlowStorageDeviceTypeEnum.NOTDEFINED IfcElectricFlowTreatmentDeviceTypeEnum = enum_namespace() -electronicfilter = express_getattr(IfcElectricFlowTreatmentDeviceTypeEnum, 'ELECTRONICFILTER', INDETERMINATE) -userdefined = express_getattr(IfcElectricFlowTreatmentDeviceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcElectricFlowTreatmentDeviceTypeEnum, 'NOTDEFINED', INDETERMINATE) +electronicfilter = IfcElectricFlowTreatmentDeviceTypeEnum.ELECTRONICFILTER +userdefined = IfcElectricFlowTreatmentDeviceTypeEnum.USERDEFINED +notdefined = IfcElectricFlowTreatmentDeviceTypeEnum.NOTDEFINED IfcElectricGeneratorTypeEnum = enum_namespace() -chp = express_getattr(IfcElectricGeneratorTypeEnum, 'CHP', INDETERMINATE) -enginegenerator = express_getattr(IfcElectricGeneratorTypeEnum, 'ENGINEGENERATOR', INDETERMINATE) -standalone = express_getattr(IfcElectricGeneratorTypeEnum, 'STANDALONE', INDETERMINATE) -userdefined = express_getattr(IfcElectricGeneratorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcElectricGeneratorTypeEnum, 'NOTDEFINED', INDETERMINATE) +chp = IfcElectricGeneratorTypeEnum.CHP +enginegenerator = IfcElectricGeneratorTypeEnum.ENGINEGENERATOR +standalone = IfcElectricGeneratorTypeEnum.STANDALONE +userdefined = IfcElectricGeneratorTypeEnum.USERDEFINED +notdefined = IfcElectricGeneratorTypeEnum.NOTDEFINED IfcElectricMotorTypeEnum = enum_namespace() -dc = express_getattr(IfcElectricMotorTypeEnum, 'DC', INDETERMINATE) -induction = express_getattr(IfcElectricMotorTypeEnum, 'INDUCTION', INDETERMINATE) -polyphase = express_getattr(IfcElectricMotorTypeEnum, 'POLYPHASE', INDETERMINATE) -reluctancesynchronous = express_getattr(IfcElectricMotorTypeEnum, 'RELUCTANCESYNCHRONOUS', INDETERMINATE) -synchronous = express_getattr(IfcElectricMotorTypeEnum, 'SYNCHRONOUS', INDETERMINATE) -userdefined = express_getattr(IfcElectricMotorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcElectricMotorTypeEnum, 'NOTDEFINED', INDETERMINATE) +dc = IfcElectricMotorTypeEnum.DC +induction = IfcElectricMotorTypeEnum.INDUCTION +polyphase = IfcElectricMotorTypeEnum.POLYPHASE +reluctancesynchronous = IfcElectricMotorTypeEnum.RELUCTANCESYNCHRONOUS +synchronous = IfcElectricMotorTypeEnum.SYNCHRONOUS +userdefined = IfcElectricMotorTypeEnum.USERDEFINED +notdefined = IfcElectricMotorTypeEnum.NOTDEFINED IfcElectricTimeControlTypeEnum = enum_namespace() -timeclock = express_getattr(IfcElectricTimeControlTypeEnum, 'TIMECLOCK', INDETERMINATE) -timedelay = express_getattr(IfcElectricTimeControlTypeEnum, 'TIMEDELAY', INDETERMINATE) -relay = express_getattr(IfcElectricTimeControlTypeEnum, 'RELAY', INDETERMINATE) -userdefined = express_getattr(IfcElectricTimeControlTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcElectricTimeControlTypeEnum, 'NOTDEFINED', INDETERMINATE) +timeclock = IfcElectricTimeControlTypeEnum.TIMECLOCK +timedelay = IfcElectricTimeControlTypeEnum.TIMEDELAY +relay = IfcElectricTimeControlTypeEnum.RELAY +userdefined = IfcElectricTimeControlTypeEnum.USERDEFINED +notdefined = IfcElectricTimeControlTypeEnum.NOTDEFINED IfcElementAssemblyTypeEnum = enum_namespace() -accessory_assembly = express_getattr(IfcElementAssemblyTypeEnum, 'ACCESSORY_ASSEMBLY', INDETERMINATE) -arch = express_getattr(IfcElementAssemblyTypeEnum, 'ARCH', INDETERMINATE) -beam_grid = express_getattr(IfcElementAssemblyTypeEnum, 'BEAM_GRID', INDETERMINATE) -braced_frame = express_getattr(IfcElementAssemblyTypeEnum, 'BRACED_FRAME', INDETERMINATE) -girder = express_getattr(IfcElementAssemblyTypeEnum, 'GIRDER', INDETERMINATE) -reinforcement_unit = express_getattr(IfcElementAssemblyTypeEnum, 'REINFORCEMENT_UNIT', INDETERMINATE) -rigid_frame = express_getattr(IfcElementAssemblyTypeEnum, 'RIGID_FRAME', INDETERMINATE) -slab_field = express_getattr(IfcElementAssemblyTypeEnum, 'SLAB_FIELD', INDETERMINATE) -truss = express_getattr(IfcElementAssemblyTypeEnum, 'TRUSS', INDETERMINATE) -abutment = express_getattr(IfcElementAssemblyTypeEnum, 'ABUTMENT', INDETERMINATE) -pier = express_getattr(IfcElementAssemblyTypeEnum, 'PIER', INDETERMINATE) -pylon = express_getattr(IfcElementAssemblyTypeEnum, 'PYLON', INDETERMINATE) -cross_bracing = express_getattr(IfcElementAssemblyTypeEnum, 'CROSS_BRACING', INDETERMINATE) -deck = express_getattr(IfcElementAssemblyTypeEnum, 'DECK', INDETERMINATE) -mast = express_getattr(IfcElementAssemblyTypeEnum, 'MAST', INDETERMINATE) -signalassembly = express_getattr(IfcElementAssemblyTypeEnum, 'SIGNALASSEMBLY', INDETERMINATE) -grid = express_getattr(IfcElementAssemblyTypeEnum, 'GRID', INDETERMINATE) -shelter = express_getattr(IfcElementAssemblyTypeEnum, 'SHELTER', INDETERMINATE) -supportingassembly = express_getattr(IfcElementAssemblyTypeEnum, 'SUPPORTINGASSEMBLY', INDETERMINATE) -suspensionassembly = express_getattr(IfcElementAssemblyTypeEnum, 'SUSPENSIONASSEMBLY', INDETERMINATE) -traction_switching_assembly = express_getattr(IfcElementAssemblyTypeEnum, 'TRACTION_SWITCHING_ASSEMBLY', INDETERMINATE) -trackpanel = express_getattr(IfcElementAssemblyTypeEnum, 'TRACKPANEL', INDETERMINATE) -turnoutpanel = express_getattr(IfcElementAssemblyTypeEnum, 'TURNOUTPANEL', INDETERMINATE) -dilatationpanel = express_getattr(IfcElementAssemblyTypeEnum, 'DILATATIONPANEL', INDETERMINATE) -rail_mechanical_equipment_assembly = express_getattr(IfcElementAssemblyTypeEnum, 'RAIL_MECHANICAL_EQUIPMENT_ASSEMBLY', INDETERMINATE) -entranceworks = express_getattr(IfcElementAssemblyTypeEnum, 'ENTRANCEWORKS', INDETERMINATE) -sumpbuster = express_getattr(IfcElementAssemblyTypeEnum, 'SUMPBUSTER', INDETERMINATE) -traffic_calming_device = express_getattr(IfcElementAssemblyTypeEnum, 'TRAFFIC_CALMING_DEVICE', INDETERMINATE) -userdefined = express_getattr(IfcElementAssemblyTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcElementAssemblyTypeEnum, 'NOTDEFINED', INDETERMINATE) +accessory_assembly = IfcElementAssemblyTypeEnum.ACCESSORY_ASSEMBLY +arch = IfcElementAssemblyTypeEnum.ARCH +beam_grid = IfcElementAssemblyTypeEnum.BEAM_GRID +braced_frame = IfcElementAssemblyTypeEnum.BRACED_FRAME +girder = IfcElementAssemblyTypeEnum.GIRDER +reinforcement_unit = IfcElementAssemblyTypeEnum.REINFORCEMENT_UNIT +rigid_frame = IfcElementAssemblyTypeEnum.RIGID_FRAME +slab_field = IfcElementAssemblyTypeEnum.SLAB_FIELD +truss = IfcElementAssemblyTypeEnum.TRUSS +abutment = IfcElementAssemblyTypeEnum.ABUTMENT +pier = IfcElementAssemblyTypeEnum.PIER +pylon = IfcElementAssemblyTypeEnum.PYLON +cross_bracing = IfcElementAssemblyTypeEnum.CROSS_BRACING +deck = IfcElementAssemblyTypeEnum.DECK +mast = IfcElementAssemblyTypeEnum.MAST +signalassembly = IfcElementAssemblyTypeEnum.SIGNALASSEMBLY +grid = IfcElementAssemblyTypeEnum.GRID +shelter = IfcElementAssemblyTypeEnum.SHELTER +supportingassembly = IfcElementAssemblyTypeEnum.SUPPORTINGASSEMBLY +suspensionassembly = IfcElementAssemblyTypeEnum.SUSPENSIONASSEMBLY +traction_switching_assembly = IfcElementAssemblyTypeEnum.TRACTION_SWITCHING_ASSEMBLY +trackpanel = IfcElementAssemblyTypeEnum.TRACKPANEL +turnoutpanel = IfcElementAssemblyTypeEnum.TURNOUTPANEL +dilatationpanel = IfcElementAssemblyTypeEnum.DILATATIONPANEL +rail_mechanical_equipment_assembly = IfcElementAssemblyTypeEnum.RAIL_MECHANICAL_EQUIPMENT_ASSEMBLY +entranceworks = IfcElementAssemblyTypeEnum.ENTRANCEWORKS +sumpbuster = IfcElementAssemblyTypeEnum.SUMPBUSTER +traffic_calming_device = IfcElementAssemblyTypeEnum.TRAFFIC_CALMING_DEVICE +userdefined = IfcElementAssemblyTypeEnum.USERDEFINED +notdefined = IfcElementAssemblyTypeEnum.NOTDEFINED IfcElementCompositionEnum = enum_namespace() -complex = express_getattr(IfcElementCompositionEnum, 'COMPLEX', INDETERMINATE) -element = express_getattr(IfcElementCompositionEnum, 'ELEMENT', INDETERMINATE) -partial = express_getattr(IfcElementCompositionEnum, 'PARTIAL', INDETERMINATE) +complex = IfcElementCompositionEnum.COMPLEX +element = IfcElementCompositionEnum.ELEMENT +partial = IfcElementCompositionEnum.PARTIAL IfcEngineTypeEnum = enum_namespace() -externalcombustion = express_getattr(IfcEngineTypeEnum, 'EXTERNALCOMBUSTION', INDETERMINATE) -internalcombustion = express_getattr(IfcEngineTypeEnum, 'INTERNALCOMBUSTION', INDETERMINATE) -userdefined = express_getattr(IfcEngineTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcEngineTypeEnum, 'NOTDEFINED', INDETERMINATE) +externalcombustion = IfcEngineTypeEnum.EXTERNALCOMBUSTION +internalcombustion = IfcEngineTypeEnum.INTERNALCOMBUSTION +userdefined = IfcEngineTypeEnum.USERDEFINED +notdefined = IfcEngineTypeEnum.NOTDEFINED IfcEvaporativeCoolerTypeEnum = enum_namespace() -directevaporativerandommediaaircooler = express_getattr(IfcEvaporativeCoolerTypeEnum, 'DIRECTEVAPORATIVERANDOMMEDIAAIRCOOLER', INDETERMINATE) -directevaporativerigidmediaaircooler = express_getattr(IfcEvaporativeCoolerTypeEnum, 'DIRECTEVAPORATIVERIGIDMEDIAAIRCOOLER', INDETERMINATE) -directevaporativeslingerspackagedaircooler = express_getattr(IfcEvaporativeCoolerTypeEnum, 'DIRECTEVAPORATIVESLINGERSPACKAGEDAIRCOOLER', INDETERMINATE) -directevaporativepackagedrotaryaircooler = express_getattr(IfcEvaporativeCoolerTypeEnum, 'DIRECTEVAPORATIVEPACKAGEDROTARYAIRCOOLER', INDETERMINATE) -directevaporativeairwasher = express_getattr(IfcEvaporativeCoolerTypeEnum, 'DIRECTEVAPORATIVEAIRWASHER', INDETERMINATE) -indirectevaporativepackageaircooler = express_getattr(IfcEvaporativeCoolerTypeEnum, 'INDIRECTEVAPORATIVEPACKAGEAIRCOOLER', INDETERMINATE) -indirectevaporativewetcoil = express_getattr(IfcEvaporativeCoolerTypeEnum, 'INDIRECTEVAPORATIVEWETCOIL', INDETERMINATE) -indirectevaporativecoolingtowerorcoilcooler = express_getattr(IfcEvaporativeCoolerTypeEnum, 'INDIRECTEVAPORATIVECOOLINGTOWERORCOILCOOLER', INDETERMINATE) -indirectdirectcombination = express_getattr(IfcEvaporativeCoolerTypeEnum, 'INDIRECTDIRECTCOMBINATION', INDETERMINATE) -userdefined = express_getattr(IfcEvaporativeCoolerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcEvaporativeCoolerTypeEnum, 'NOTDEFINED', INDETERMINATE) +directevaporativerandommediaaircooler = IfcEvaporativeCoolerTypeEnum.DIRECTEVAPORATIVERANDOMMEDIAAIRCOOLER +directevaporativerigidmediaaircooler = IfcEvaporativeCoolerTypeEnum.DIRECTEVAPORATIVERIGIDMEDIAAIRCOOLER +directevaporativeslingerspackagedaircooler = IfcEvaporativeCoolerTypeEnum.DIRECTEVAPORATIVESLINGERSPACKAGEDAIRCOOLER +directevaporativepackagedrotaryaircooler = IfcEvaporativeCoolerTypeEnum.DIRECTEVAPORATIVEPACKAGEDROTARYAIRCOOLER +directevaporativeairwasher = IfcEvaporativeCoolerTypeEnum.DIRECTEVAPORATIVEAIRWASHER +indirectevaporativepackageaircooler = IfcEvaporativeCoolerTypeEnum.INDIRECTEVAPORATIVEPACKAGEAIRCOOLER +indirectevaporativewetcoil = IfcEvaporativeCoolerTypeEnum.INDIRECTEVAPORATIVEWETCOIL +indirectevaporativecoolingtowerorcoilcooler = IfcEvaporativeCoolerTypeEnum.INDIRECTEVAPORATIVECOOLINGTOWERORCOILCOOLER +indirectdirectcombination = IfcEvaporativeCoolerTypeEnum.INDIRECTDIRECTCOMBINATION +userdefined = IfcEvaporativeCoolerTypeEnum.USERDEFINED +notdefined = IfcEvaporativeCoolerTypeEnum.NOTDEFINED IfcEvaporatorTypeEnum = enum_namespace() -directexpansion = express_getattr(IfcEvaporatorTypeEnum, 'DIRECTEXPANSION', INDETERMINATE) -directexpansionshellandtube = express_getattr(IfcEvaporatorTypeEnum, 'DIRECTEXPANSIONSHELLANDTUBE', INDETERMINATE) -directexpansiontubeintube = express_getattr(IfcEvaporatorTypeEnum, 'DIRECTEXPANSIONTUBEINTUBE', INDETERMINATE) -directexpansionbrazedplate = express_getattr(IfcEvaporatorTypeEnum, 'DIRECTEXPANSIONBRAZEDPLATE', INDETERMINATE) -floodedshellandtube = express_getattr(IfcEvaporatorTypeEnum, 'FLOODEDSHELLANDTUBE', INDETERMINATE) -shellandcoil = express_getattr(IfcEvaporatorTypeEnum, 'SHELLANDCOIL', INDETERMINATE) -userdefined = express_getattr(IfcEvaporatorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcEvaporatorTypeEnum, 'NOTDEFINED', INDETERMINATE) +directexpansion = IfcEvaporatorTypeEnum.DIRECTEXPANSION +directexpansionshellandtube = IfcEvaporatorTypeEnum.DIRECTEXPANSIONSHELLANDTUBE +directexpansiontubeintube = IfcEvaporatorTypeEnum.DIRECTEXPANSIONTUBEINTUBE +directexpansionbrazedplate = IfcEvaporatorTypeEnum.DIRECTEXPANSIONBRAZEDPLATE +floodedshellandtube = IfcEvaporatorTypeEnum.FLOODEDSHELLANDTUBE +shellandcoil = IfcEvaporatorTypeEnum.SHELLANDCOIL +userdefined = IfcEvaporatorTypeEnum.USERDEFINED +notdefined = IfcEvaporatorTypeEnum.NOTDEFINED IfcEventTriggerTypeEnum = enum_namespace() -eventrule = express_getattr(IfcEventTriggerTypeEnum, 'EVENTRULE', INDETERMINATE) -eventmessage = express_getattr(IfcEventTriggerTypeEnum, 'EVENTMESSAGE', INDETERMINATE) -eventtime = express_getattr(IfcEventTriggerTypeEnum, 'EVENTTIME', INDETERMINATE) -eventcomplex = express_getattr(IfcEventTriggerTypeEnum, 'EVENTCOMPLEX', INDETERMINATE) -userdefined = express_getattr(IfcEventTriggerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcEventTriggerTypeEnum, 'NOTDEFINED', INDETERMINATE) +eventrule = IfcEventTriggerTypeEnum.EVENTRULE +eventmessage = IfcEventTriggerTypeEnum.EVENTMESSAGE +eventtime = IfcEventTriggerTypeEnum.EVENTTIME +eventcomplex = IfcEventTriggerTypeEnum.EVENTCOMPLEX +userdefined = IfcEventTriggerTypeEnum.USERDEFINED +notdefined = IfcEventTriggerTypeEnum.NOTDEFINED IfcEventTypeEnum = enum_namespace() -startevent = express_getattr(IfcEventTypeEnum, 'STARTEVENT', INDETERMINATE) -endevent = express_getattr(IfcEventTypeEnum, 'ENDEVENT', INDETERMINATE) -intermediateevent = express_getattr(IfcEventTypeEnum, 'INTERMEDIATEEVENT', INDETERMINATE) -userdefined = express_getattr(IfcEventTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcEventTypeEnum, 'NOTDEFINED', INDETERMINATE) +startevent = IfcEventTypeEnum.STARTEVENT +endevent = IfcEventTypeEnum.ENDEVENT +intermediateevent = IfcEventTypeEnum.INTERMEDIATEEVENT +userdefined = IfcEventTypeEnum.USERDEFINED +notdefined = IfcEventTypeEnum.NOTDEFINED IfcExternalSpatialElementTypeEnum = enum_namespace() -external = express_getattr(IfcExternalSpatialElementTypeEnum, 'EXTERNAL', INDETERMINATE) -external_earth = express_getattr(IfcExternalSpatialElementTypeEnum, 'EXTERNAL_EARTH', INDETERMINATE) -external_water = express_getattr(IfcExternalSpatialElementTypeEnum, 'EXTERNAL_WATER', INDETERMINATE) -external_fire = express_getattr(IfcExternalSpatialElementTypeEnum, 'EXTERNAL_FIRE', INDETERMINATE) -userdefined = express_getattr(IfcExternalSpatialElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcExternalSpatialElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +external = IfcExternalSpatialElementTypeEnum.EXTERNAL +external_earth = IfcExternalSpatialElementTypeEnum.EXTERNAL_EARTH +external_water = IfcExternalSpatialElementTypeEnum.EXTERNAL_WATER +external_fire = IfcExternalSpatialElementTypeEnum.EXTERNAL_FIRE +userdefined = IfcExternalSpatialElementTypeEnum.USERDEFINED +notdefined = IfcExternalSpatialElementTypeEnum.NOTDEFINED IfcFacilityPartCommonTypeEnum = enum_namespace() -segment = express_getattr(IfcFacilityPartCommonTypeEnum, 'SEGMENT', INDETERMINATE) -aboveground = express_getattr(IfcFacilityPartCommonTypeEnum, 'ABOVEGROUND', INDETERMINATE) -junction = express_getattr(IfcFacilityPartCommonTypeEnum, 'JUNCTION', INDETERMINATE) -levelcrossing = express_getattr(IfcFacilityPartCommonTypeEnum, 'LEVELCROSSING', INDETERMINATE) -belowground = express_getattr(IfcFacilityPartCommonTypeEnum, 'BELOWGROUND', INDETERMINATE) -substructure = express_getattr(IfcFacilityPartCommonTypeEnum, 'SUBSTRUCTURE', INDETERMINATE) -terminal = express_getattr(IfcFacilityPartCommonTypeEnum, 'TERMINAL', INDETERMINATE) -superstructure = express_getattr(IfcFacilityPartCommonTypeEnum, 'SUPERSTRUCTURE', INDETERMINATE) -userdefined = express_getattr(IfcFacilityPartCommonTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFacilityPartCommonTypeEnum, 'NOTDEFINED', INDETERMINATE) +segment = IfcFacilityPartCommonTypeEnum.SEGMENT +aboveground = IfcFacilityPartCommonTypeEnum.ABOVEGROUND +junction = IfcFacilityPartCommonTypeEnum.JUNCTION +levelcrossing = IfcFacilityPartCommonTypeEnum.LEVELCROSSING +belowground = IfcFacilityPartCommonTypeEnum.BELOWGROUND +substructure = IfcFacilityPartCommonTypeEnum.SUBSTRUCTURE +terminal = IfcFacilityPartCommonTypeEnum.TERMINAL +superstructure = IfcFacilityPartCommonTypeEnum.SUPERSTRUCTURE +userdefined = IfcFacilityPartCommonTypeEnum.USERDEFINED +notdefined = IfcFacilityPartCommonTypeEnum.NOTDEFINED IfcFacilityUsageEnum = enum_namespace() -lateral = express_getattr(IfcFacilityUsageEnum, 'LATERAL', INDETERMINATE) -region = express_getattr(IfcFacilityUsageEnum, 'REGION', INDETERMINATE) -vertical = express_getattr(IfcFacilityUsageEnum, 'VERTICAL', INDETERMINATE) -longitudinal = express_getattr(IfcFacilityUsageEnum, 'LONGITUDINAL', INDETERMINATE) -userdefined = express_getattr(IfcFacilityUsageEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFacilityUsageEnum, 'NOTDEFINED', INDETERMINATE) +lateral = IfcFacilityUsageEnum.LATERAL +region = IfcFacilityUsageEnum.REGION +vertical = IfcFacilityUsageEnum.VERTICAL +longitudinal = IfcFacilityUsageEnum.LONGITUDINAL +userdefined = IfcFacilityUsageEnum.USERDEFINED +notdefined = IfcFacilityUsageEnum.NOTDEFINED IfcFanTypeEnum = enum_namespace() -centrifugalforwardcurved = express_getattr(IfcFanTypeEnum, 'CENTRIFUGALFORWARDCURVED', INDETERMINATE) -centrifugalradial = express_getattr(IfcFanTypeEnum, 'CENTRIFUGALRADIAL', INDETERMINATE) -centrifugalbackwardinclinedcurved = express_getattr(IfcFanTypeEnum, 'CENTRIFUGALBACKWARDINCLINEDCURVED', INDETERMINATE) -centrifugalairfoil = express_getattr(IfcFanTypeEnum, 'CENTRIFUGALAIRFOIL', INDETERMINATE) -tubeaxial = express_getattr(IfcFanTypeEnum, 'TUBEAXIAL', INDETERMINATE) -vaneaxial = express_getattr(IfcFanTypeEnum, 'VANEAXIAL', INDETERMINATE) -propelloraxial = express_getattr(IfcFanTypeEnum, 'PROPELLORAXIAL', INDETERMINATE) -userdefined = express_getattr(IfcFanTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFanTypeEnum, 'NOTDEFINED', INDETERMINATE) +centrifugalforwardcurved = IfcFanTypeEnum.CENTRIFUGALFORWARDCURVED +centrifugalradial = IfcFanTypeEnum.CENTRIFUGALRADIAL +centrifugalbackwardinclinedcurved = IfcFanTypeEnum.CENTRIFUGALBACKWARDINCLINEDCURVED +centrifugalairfoil = IfcFanTypeEnum.CENTRIFUGALAIRFOIL +tubeaxial = IfcFanTypeEnum.TUBEAXIAL +vaneaxial = IfcFanTypeEnum.VANEAXIAL +propelloraxial = IfcFanTypeEnum.PROPELLORAXIAL +userdefined = IfcFanTypeEnum.USERDEFINED +notdefined = IfcFanTypeEnum.NOTDEFINED IfcFastenerTypeEnum = enum_namespace() -glue = express_getattr(IfcFastenerTypeEnum, 'GLUE', INDETERMINATE) -mortar = express_getattr(IfcFastenerTypeEnum, 'MORTAR', INDETERMINATE) -weld = express_getattr(IfcFastenerTypeEnum, 'WELD', INDETERMINATE) -userdefined = express_getattr(IfcFastenerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFastenerTypeEnum, 'NOTDEFINED', INDETERMINATE) +glue = IfcFastenerTypeEnum.GLUE +mortar = IfcFastenerTypeEnum.MORTAR +weld = IfcFastenerTypeEnum.WELD +userdefined = IfcFastenerTypeEnum.USERDEFINED +notdefined = IfcFastenerTypeEnum.NOTDEFINED IfcFilterTypeEnum = enum_namespace() -airparticlefilter = express_getattr(IfcFilterTypeEnum, 'AIRPARTICLEFILTER', INDETERMINATE) -compressedairfilter = express_getattr(IfcFilterTypeEnum, 'COMPRESSEDAIRFILTER', INDETERMINATE) -odorfilter = express_getattr(IfcFilterTypeEnum, 'ODORFILTER', INDETERMINATE) -oilfilter = express_getattr(IfcFilterTypeEnum, 'OILFILTER', INDETERMINATE) -strainer = express_getattr(IfcFilterTypeEnum, 'STRAINER', INDETERMINATE) -waterfilter = express_getattr(IfcFilterTypeEnum, 'WATERFILTER', INDETERMINATE) -userdefined = express_getattr(IfcFilterTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFilterTypeEnum, 'NOTDEFINED', INDETERMINATE) +airparticlefilter = IfcFilterTypeEnum.AIRPARTICLEFILTER +compressedairfilter = IfcFilterTypeEnum.COMPRESSEDAIRFILTER +odorfilter = IfcFilterTypeEnum.ODORFILTER +oilfilter = IfcFilterTypeEnum.OILFILTER +strainer = IfcFilterTypeEnum.STRAINER +waterfilter = IfcFilterTypeEnum.WATERFILTER +userdefined = IfcFilterTypeEnum.USERDEFINED +notdefined = IfcFilterTypeEnum.NOTDEFINED IfcFireSuppressionTerminalTypeEnum = enum_namespace() -breechinginlet = express_getattr(IfcFireSuppressionTerminalTypeEnum, 'BREECHINGINLET', INDETERMINATE) -firehydrant = express_getattr(IfcFireSuppressionTerminalTypeEnum, 'FIREHYDRANT', INDETERMINATE) -hosereel = express_getattr(IfcFireSuppressionTerminalTypeEnum, 'HOSEREEL', INDETERMINATE) -sprinkler = express_getattr(IfcFireSuppressionTerminalTypeEnum, 'SPRINKLER', INDETERMINATE) -sprinklerdeflector = express_getattr(IfcFireSuppressionTerminalTypeEnum, 'SPRINKLERDEFLECTOR', INDETERMINATE) -userdefined = express_getattr(IfcFireSuppressionTerminalTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFireSuppressionTerminalTypeEnum, 'NOTDEFINED', INDETERMINATE) +breechinginlet = IfcFireSuppressionTerminalTypeEnum.BREECHINGINLET +firehydrant = IfcFireSuppressionTerminalTypeEnum.FIREHYDRANT +hosereel = IfcFireSuppressionTerminalTypeEnum.HOSEREEL +sprinkler = IfcFireSuppressionTerminalTypeEnum.SPRINKLER +sprinklerdeflector = IfcFireSuppressionTerminalTypeEnum.SPRINKLERDEFLECTOR +userdefined = IfcFireSuppressionTerminalTypeEnum.USERDEFINED +notdefined = IfcFireSuppressionTerminalTypeEnum.NOTDEFINED IfcFlowDirectionEnum = enum_namespace() -source = express_getattr(IfcFlowDirectionEnum, 'SOURCE', INDETERMINATE) -sink = express_getattr(IfcFlowDirectionEnum, 'SINK', INDETERMINATE) -sourceandsink = express_getattr(IfcFlowDirectionEnum, 'SOURCEANDSINK', INDETERMINATE) -notdefined = express_getattr(IfcFlowDirectionEnum, 'NOTDEFINED', INDETERMINATE) +source = IfcFlowDirectionEnum.SOURCE +sink = IfcFlowDirectionEnum.SINK +sourceandsink = IfcFlowDirectionEnum.SOURCEANDSINK +notdefined = IfcFlowDirectionEnum.NOTDEFINED IfcFlowInstrumentTypeEnum = enum_namespace() -pressuregauge = express_getattr(IfcFlowInstrumentTypeEnum, 'PRESSUREGAUGE', INDETERMINATE) -thermometer = express_getattr(IfcFlowInstrumentTypeEnum, 'THERMOMETER', INDETERMINATE) -ammeter = express_getattr(IfcFlowInstrumentTypeEnum, 'AMMETER', INDETERMINATE) -frequencymeter = express_getattr(IfcFlowInstrumentTypeEnum, 'FREQUENCYMETER', INDETERMINATE) -powerfactormeter = express_getattr(IfcFlowInstrumentTypeEnum, 'POWERFACTORMETER', INDETERMINATE) -phaseanglemeter = express_getattr(IfcFlowInstrumentTypeEnum, 'PHASEANGLEMETER', INDETERMINATE) -voltmeter_peak = express_getattr(IfcFlowInstrumentTypeEnum, 'VOLTMETER_PEAK', INDETERMINATE) -voltmeter_rms = express_getattr(IfcFlowInstrumentTypeEnum, 'VOLTMETER_RMS', INDETERMINATE) -combined = express_getattr(IfcFlowInstrumentTypeEnum, 'COMBINED', INDETERMINATE) -voltmeter = express_getattr(IfcFlowInstrumentTypeEnum, 'VOLTMETER', INDETERMINATE) -userdefined = express_getattr(IfcFlowInstrumentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFlowInstrumentTypeEnum, 'NOTDEFINED', INDETERMINATE) +pressuregauge = IfcFlowInstrumentTypeEnum.PRESSUREGAUGE +thermometer = IfcFlowInstrumentTypeEnum.THERMOMETER +ammeter = IfcFlowInstrumentTypeEnum.AMMETER +frequencymeter = IfcFlowInstrumentTypeEnum.FREQUENCYMETER +powerfactormeter = IfcFlowInstrumentTypeEnum.POWERFACTORMETER +phaseanglemeter = IfcFlowInstrumentTypeEnum.PHASEANGLEMETER +voltmeter_peak = IfcFlowInstrumentTypeEnum.VOLTMETER_PEAK +voltmeter_rms = IfcFlowInstrumentTypeEnum.VOLTMETER_RMS +combined = IfcFlowInstrumentTypeEnum.COMBINED +voltmeter = IfcFlowInstrumentTypeEnum.VOLTMETER +userdefined = IfcFlowInstrumentTypeEnum.USERDEFINED +notdefined = IfcFlowInstrumentTypeEnum.NOTDEFINED IfcFlowMeterTypeEnum = enum_namespace() -energymeter = express_getattr(IfcFlowMeterTypeEnum, 'ENERGYMETER', INDETERMINATE) -gasmeter = express_getattr(IfcFlowMeterTypeEnum, 'GASMETER', INDETERMINATE) -oilmeter = express_getattr(IfcFlowMeterTypeEnum, 'OILMETER', INDETERMINATE) -watermeter = express_getattr(IfcFlowMeterTypeEnum, 'WATERMETER', INDETERMINATE) -userdefined = express_getattr(IfcFlowMeterTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFlowMeterTypeEnum, 'NOTDEFINED', INDETERMINATE) +energymeter = IfcFlowMeterTypeEnum.ENERGYMETER +gasmeter = IfcFlowMeterTypeEnum.GASMETER +oilmeter = IfcFlowMeterTypeEnum.OILMETER +watermeter = IfcFlowMeterTypeEnum.WATERMETER +userdefined = IfcFlowMeterTypeEnum.USERDEFINED +notdefined = IfcFlowMeterTypeEnum.NOTDEFINED IfcFootingTypeEnum = enum_namespace() -caisson_foundation = express_getattr(IfcFootingTypeEnum, 'CAISSON_FOUNDATION', INDETERMINATE) -footing_beam = express_getattr(IfcFootingTypeEnum, 'FOOTING_BEAM', INDETERMINATE) -pad_footing = express_getattr(IfcFootingTypeEnum, 'PAD_FOOTING', INDETERMINATE) -pile_cap = express_getattr(IfcFootingTypeEnum, 'PILE_CAP', INDETERMINATE) -strip_footing = express_getattr(IfcFootingTypeEnum, 'STRIP_FOOTING', INDETERMINATE) -userdefined = express_getattr(IfcFootingTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFootingTypeEnum, 'NOTDEFINED', INDETERMINATE) +caisson_foundation = IfcFootingTypeEnum.CAISSON_FOUNDATION +footing_beam = IfcFootingTypeEnum.FOOTING_BEAM +pad_footing = IfcFootingTypeEnum.PAD_FOOTING +pile_cap = IfcFootingTypeEnum.PILE_CAP +strip_footing = IfcFootingTypeEnum.STRIP_FOOTING +userdefined = IfcFootingTypeEnum.USERDEFINED +notdefined = IfcFootingTypeEnum.NOTDEFINED IfcFurnitureTypeEnum = enum_namespace() -chair = express_getattr(IfcFurnitureTypeEnum, 'CHAIR', INDETERMINATE) -table = express_getattr(IfcFurnitureTypeEnum, 'TABLE', INDETERMINATE) -desk = express_getattr(IfcFurnitureTypeEnum, 'DESK', INDETERMINATE) -bed = express_getattr(IfcFurnitureTypeEnum, 'BED', INDETERMINATE) -filecabinet = express_getattr(IfcFurnitureTypeEnum, 'FILECABINET', INDETERMINATE) -shelf = express_getattr(IfcFurnitureTypeEnum, 'SHELF', INDETERMINATE) -sofa = express_getattr(IfcFurnitureTypeEnum, 'SOFA', INDETERMINATE) -technicalcabinet = express_getattr(IfcFurnitureTypeEnum, 'TECHNICALCABINET', INDETERMINATE) -userdefined = express_getattr(IfcFurnitureTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFurnitureTypeEnum, 'NOTDEFINED', INDETERMINATE) +chair = IfcFurnitureTypeEnum.CHAIR +table = IfcFurnitureTypeEnum.TABLE +desk = IfcFurnitureTypeEnum.DESK +bed = IfcFurnitureTypeEnum.BED +filecabinet = IfcFurnitureTypeEnum.FILECABINET +shelf = IfcFurnitureTypeEnum.SHELF +sofa = IfcFurnitureTypeEnum.SOFA +technicalcabinet = IfcFurnitureTypeEnum.TECHNICALCABINET +userdefined = IfcFurnitureTypeEnum.USERDEFINED +notdefined = IfcFurnitureTypeEnum.NOTDEFINED IfcGeographicElementTypeEnum = enum_namespace() -terrain = express_getattr(IfcGeographicElementTypeEnum, 'TERRAIN', INDETERMINATE) -soil_boring_point = express_getattr(IfcGeographicElementTypeEnum, 'SOIL_BORING_POINT', INDETERMINATE) -userdefined = express_getattr(IfcGeographicElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcGeographicElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +terrain = IfcGeographicElementTypeEnum.TERRAIN +soil_boring_point = IfcGeographicElementTypeEnum.SOIL_BORING_POINT +userdefined = IfcGeographicElementTypeEnum.USERDEFINED +notdefined = IfcGeographicElementTypeEnum.NOTDEFINED IfcGeometricProjectionEnum = enum_namespace() -graph_view = express_getattr(IfcGeometricProjectionEnum, 'GRAPH_VIEW', INDETERMINATE) -sketch_view = express_getattr(IfcGeometricProjectionEnum, 'SKETCH_VIEW', INDETERMINATE) -model_view = express_getattr(IfcGeometricProjectionEnum, 'MODEL_VIEW', INDETERMINATE) -plan_view = express_getattr(IfcGeometricProjectionEnum, 'PLAN_VIEW', INDETERMINATE) -reflected_plan_view = express_getattr(IfcGeometricProjectionEnum, 'REFLECTED_PLAN_VIEW', INDETERMINATE) -section_view = express_getattr(IfcGeometricProjectionEnum, 'SECTION_VIEW', INDETERMINATE) -elevation_view = express_getattr(IfcGeometricProjectionEnum, 'ELEVATION_VIEW', INDETERMINATE) -userdefined = express_getattr(IfcGeometricProjectionEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcGeometricProjectionEnum, 'NOTDEFINED', INDETERMINATE) +graph_view = IfcGeometricProjectionEnum.GRAPH_VIEW +sketch_view = IfcGeometricProjectionEnum.SKETCH_VIEW +model_view = IfcGeometricProjectionEnum.MODEL_VIEW +plan_view = IfcGeometricProjectionEnum.PLAN_VIEW +reflected_plan_view = IfcGeometricProjectionEnum.REFLECTED_PLAN_VIEW +section_view = IfcGeometricProjectionEnum.SECTION_VIEW +elevation_view = IfcGeometricProjectionEnum.ELEVATION_VIEW +userdefined = IfcGeometricProjectionEnum.USERDEFINED +notdefined = IfcGeometricProjectionEnum.NOTDEFINED IfcGlobalOrLocalEnum = enum_namespace() -global_coords = express_getattr(IfcGlobalOrLocalEnum, 'GLOBAL_COORDS', INDETERMINATE) -local_coords = express_getattr(IfcGlobalOrLocalEnum, 'LOCAL_COORDS', INDETERMINATE) +global_coords = IfcGlobalOrLocalEnum.GLOBAL_COORDS +local_coords = IfcGlobalOrLocalEnum.LOCAL_COORDS IfcGridTypeEnum = enum_namespace() -rectangular = express_getattr(IfcGridTypeEnum, 'RECTANGULAR', INDETERMINATE) -radial = express_getattr(IfcGridTypeEnum, 'RADIAL', INDETERMINATE) -triangular = express_getattr(IfcGridTypeEnum, 'TRIANGULAR', INDETERMINATE) -irregular = express_getattr(IfcGridTypeEnum, 'IRREGULAR', INDETERMINATE) -userdefined = express_getattr(IfcGridTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcGridTypeEnum, 'NOTDEFINED', INDETERMINATE) +rectangular = IfcGridTypeEnum.RECTANGULAR +radial = IfcGridTypeEnum.RADIAL +triangular = IfcGridTypeEnum.TRIANGULAR +irregular = IfcGridTypeEnum.IRREGULAR +userdefined = IfcGridTypeEnum.USERDEFINED +notdefined = IfcGridTypeEnum.NOTDEFINED IfcHeatExchangerTypeEnum = enum_namespace() -plate = express_getattr(IfcHeatExchangerTypeEnum, 'PLATE', INDETERMINATE) -shellandtube = express_getattr(IfcHeatExchangerTypeEnum, 'SHELLANDTUBE', INDETERMINATE) -turnoutheating = express_getattr(IfcHeatExchangerTypeEnum, 'TURNOUTHEATING', INDETERMINATE) -userdefined = express_getattr(IfcHeatExchangerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcHeatExchangerTypeEnum, 'NOTDEFINED', INDETERMINATE) +plate = IfcHeatExchangerTypeEnum.PLATE +shellandtube = IfcHeatExchangerTypeEnum.SHELLANDTUBE +turnoutheating = IfcHeatExchangerTypeEnum.TURNOUTHEATING +userdefined = IfcHeatExchangerTypeEnum.USERDEFINED +notdefined = IfcHeatExchangerTypeEnum.NOTDEFINED IfcHumidifierTypeEnum = enum_namespace() -steaminjection = express_getattr(IfcHumidifierTypeEnum, 'STEAMINJECTION', INDETERMINATE) -adiabaticairwasher = express_getattr(IfcHumidifierTypeEnum, 'ADIABATICAIRWASHER', INDETERMINATE) -adiabaticpan = express_getattr(IfcHumidifierTypeEnum, 'ADIABATICPAN', INDETERMINATE) -adiabaticwettedelement = express_getattr(IfcHumidifierTypeEnum, 'ADIABATICWETTEDELEMENT', INDETERMINATE) -adiabaticatomizing = express_getattr(IfcHumidifierTypeEnum, 'ADIABATICATOMIZING', INDETERMINATE) -adiabaticultrasonic = express_getattr(IfcHumidifierTypeEnum, 'ADIABATICULTRASONIC', INDETERMINATE) -adiabaticrigidmedia = express_getattr(IfcHumidifierTypeEnum, 'ADIABATICRIGIDMEDIA', INDETERMINATE) -adiabaticcompressedairnozzle = express_getattr(IfcHumidifierTypeEnum, 'ADIABATICCOMPRESSEDAIRNOZZLE', INDETERMINATE) -assistedelectric = express_getattr(IfcHumidifierTypeEnum, 'ASSISTEDELECTRIC', INDETERMINATE) -assistednaturalgas = express_getattr(IfcHumidifierTypeEnum, 'ASSISTEDNATURALGAS', INDETERMINATE) -assistedpropane = express_getattr(IfcHumidifierTypeEnum, 'ASSISTEDPROPANE', INDETERMINATE) -assistedbutane = express_getattr(IfcHumidifierTypeEnum, 'ASSISTEDBUTANE', INDETERMINATE) -assistedsteam = express_getattr(IfcHumidifierTypeEnum, 'ASSISTEDSTEAM', INDETERMINATE) -userdefined = express_getattr(IfcHumidifierTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcHumidifierTypeEnum, 'NOTDEFINED', INDETERMINATE) +steaminjection = IfcHumidifierTypeEnum.STEAMINJECTION +adiabaticairwasher = IfcHumidifierTypeEnum.ADIABATICAIRWASHER +adiabaticpan = IfcHumidifierTypeEnum.ADIABATICPAN +adiabaticwettedelement = IfcHumidifierTypeEnum.ADIABATICWETTEDELEMENT +adiabaticatomizing = IfcHumidifierTypeEnum.ADIABATICATOMIZING +adiabaticultrasonic = IfcHumidifierTypeEnum.ADIABATICULTRASONIC +adiabaticrigidmedia = IfcHumidifierTypeEnum.ADIABATICRIGIDMEDIA +adiabaticcompressedairnozzle = IfcHumidifierTypeEnum.ADIABATICCOMPRESSEDAIRNOZZLE +assistedelectric = IfcHumidifierTypeEnum.ASSISTEDELECTRIC +assistednaturalgas = IfcHumidifierTypeEnum.ASSISTEDNATURALGAS +assistedpropane = IfcHumidifierTypeEnum.ASSISTEDPROPANE +assistedbutane = IfcHumidifierTypeEnum.ASSISTEDBUTANE +assistedsteam = IfcHumidifierTypeEnum.ASSISTEDSTEAM +userdefined = IfcHumidifierTypeEnum.USERDEFINED +notdefined = IfcHumidifierTypeEnum.NOTDEFINED IfcImpactProtectionDeviceTypeEnum = enum_namespace() -crashcushion = express_getattr(IfcImpactProtectionDeviceTypeEnum, 'CRASHCUSHION', INDETERMINATE) -dampingsystem = express_getattr(IfcImpactProtectionDeviceTypeEnum, 'DAMPINGSYSTEM', INDETERMINATE) -fender = express_getattr(IfcImpactProtectionDeviceTypeEnum, 'FENDER', INDETERMINATE) -bumper = express_getattr(IfcImpactProtectionDeviceTypeEnum, 'BUMPER', INDETERMINATE) -userdefined = express_getattr(IfcImpactProtectionDeviceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcImpactProtectionDeviceTypeEnum, 'NOTDEFINED', INDETERMINATE) +crashcushion = IfcImpactProtectionDeviceTypeEnum.CRASHCUSHION +dampingsystem = IfcImpactProtectionDeviceTypeEnum.DAMPINGSYSTEM +fender = IfcImpactProtectionDeviceTypeEnum.FENDER +bumper = IfcImpactProtectionDeviceTypeEnum.BUMPER +userdefined = IfcImpactProtectionDeviceTypeEnum.USERDEFINED +notdefined = IfcImpactProtectionDeviceTypeEnum.NOTDEFINED IfcInterceptorTypeEnum = enum_namespace() -cyclonic = express_getattr(IfcInterceptorTypeEnum, 'CYCLONIC', INDETERMINATE) -grease = express_getattr(IfcInterceptorTypeEnum, 'GREASE', INDETERMINATE) -oil = express_getattr(IfcInterceptorTypeEnum, 'OIL', INDETERMINATE) -petrol = express_getattr(IfcInterceptorTypeEnum, 'PETROL', INDETERMINATE) -userdefined = express_getattr(IfcInterceptorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcInterceptorTypeEnum, 'NOTDEFINED', INDETERMINATE) +cyclonic = IfcInterceptorTypeEnum.CYCLONIC +grease = IfcInterceptorTypeEnum.GREASE +oil = IfcInterceptorTypeEnum.OIL +petrol = IfcInterceptorTypeEnum.PETROL +userdefined = IfcInterceptorTypeEnum.USERDEFINED +notdefined = IfcInterceptorTypeEnum.NOTDEFINED IfcInternalOrExternalEnum = enum_namespace() -internal = express_getattr(IfcInternalOrExternalEnum, 'INTERNAL', INDETERMINATE) -external = express_getattr(IfcInternalOrExternalEnum, 'EXTERNAL', INDETERMINATE) -external_earth = express_getattr(IfcInternalOrExternalEnum, 'EXTERNAL_EARTH', INDETERMINATE) -external_water = express_getattr(IfcInternalOrExternalEnum, 'EXTERNAL_WATER', INDETERMINATE) -external_fire = express_getattr(IfcInternalOrExternalEnum, 'EXTERNAL_FIRE', INDETERMINATE) -notdefined = express_getattr(IfcInternalOrExternalEnum, 'NOTDEFINED', INDETERMINATE) +internal = IfcInternalOrExternalEnum.INTERNAL +external = IfcInternalOrExternalEnum.EXTERNAL +external_earth = IfcInternalOrExternalEnum.EXTERNAL_EARTH +external_water = IfcInternalOrExternalEnum.EXTERNAL_WATER +external_fire = IfcInternalOrExternalEnum.EXTERNAL_FIRE +notdefined = IfcInternalOrExternalEnum.NOTDEFINED IfcInventoryTypeEnum = enum_namespace() -assetinventory = express_getattr(IfcInventoryTypeEnum, 'ASSETINVENTORY', INDETERMINATE) -spaceinventory = express_getattr(IfcInventoryTypeEnum, 'SPACEINVENTORY', INDETERMINATE) -furnitureinventory = express_getattr(IfcInventoryTypeEnum, 'FURNITUREINVENTORY', INDETERMINATE) -userdefined = express_getattr(IfcInventoryTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcInventoryTypeEnum, 'NOTDEFINED', INDETERMINATE) +assetinventory = IfcInventoryTypeEnum.ASSETINVENTORY +spaceinventory = IfcInventoryTypeEnum.SPACEINVENTORY +furnitureinventory = IfcInventoryTypeEnum.FURNITUREINVENTORY +userdefined = IfcInventoryTypeEnum.USERDEFINED +notdefined = IfcInventoryTypeEnum.NOTDEFINED IfcJunctionBoxTypeEnum = enum_namespace() -data = express_getattr(IfcJunctionBoxTypeEnum, 'DATA', INDETERMINATE) -power = express_getattr(IfcJunctionBoxTypeEnum, 'POWER', INDETERMINATE) -userdefined = express_getattr(IfcJunctionBoxTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcJunctionBoxTypeEnum, 'NOTDEFINED', INDETERMINATE) +data = IfcJunctionBoxTypeEnum.DATA +power = IfcJunctionBoxTypeEnum.POWER +userdefined = IfcJunctionBoxTypeEnum.USERDEFINED +notdefined = IfcJunctionBoxTypeEnum.NOTDEFINED IfcKnotType = enum_namespace() -uniform_knots = express_getattr(IfcKnotType, 'UNIFORM_KNOTS', INDETERMINATE) -quasi_uniform_knots = express_getattr(IfcKnotType, 'QUASI_UNIFORM_KNOTS', INDETERMINATE) -piecewise_bezier_knots = express_getattr(IfcKnotType, 'PIECEWISE_BEZIER_KNOTS', INDETERMINATE) -unspecified = express_getattr(IfcKnotType, 'UNSPECIFIED', INDETERMINATE) +uniform_knots = IfcKnotType.UNIFORM_KNOTS +quasi_uniform_knots = IfcKnotType.QUASI_UNIFORM_KNOTS +piecewise_bezier_knots = IfcKnotType.PIECEWISE_BEZIER_KNOTS +unspecified = IfcKnotType.UNSPECIFIED IfcLaborResourceTypeEnum = enum_namespace() -administration = express_getattr(IfcLaborResourceTypeEnum, 'ADMINISTRATION', INDETERMINATE) -carpentry = express_getattr(IfcLaborResourceTypeEnum, 'CARPENTRY', INDETERMINATE) -cleaning = express_getattr(IfcLaborResourceTypeEnum, 'CLEANING', INDETERMINATE) -concrete = express_getattr(IfcLaborResourceTypeEnum, 'CONCRETE', INDETERMINATE) -drywall = express_getattr(IfcLaborResourceTypeEnum, 'DRYWALL', INDETERMINATE) -electric = express_getattr(IfcLaborResourceTypeEnum, 'ELECTRIC', INDETERMINATE) -finishing = express_getattr(IfcLaborResourceTypeEnum, 'FINISHING', INDETERMINATE) -flooring = express_getattr(IfcLaborResourceTypeEnum, 'FLOORING', INDETERMINATE) -general = express_getattr(IfcLaborResourceTypeEnum, 'GENERAL', INDETERMINATE) -hvac = express_getattr(IfcLaborResourceTypeEnum, 'HVAC', INDETERMINATE) -landscaping = express_getattr(IfcLaborResourceTypeEnum, 'LANDSCAPING', INDETERMINATE) -masonry = express_getattr(IfcLaborResourceTypeEnum, 'MASONRY', INDETERMINATE) -painting = express_getattr(IfcLaborResourceTypeEnum, 'PAINTING', INDETERMINATE) -paving = express_getattr(IfcLaborResourceTypeEnum, 'PAVING', INDETERMINATE) -plumbing = express_getattr(IfcLaborResourceTypeEnum, 'PLUMBING', INDETERMINATE) -roofing = express_getattr(IfcLaborResourceTypeEnum, 'ROOFING', INDETERMINATE) -sitegrading = express_getattr(IfcLaborResourceTypeEnum, 'SITEGRADING', INDETERMINATE) -steelwork = express_getattr(IfcLaborResourceTypeEnum, 'STEELWORK', INDETERMINATE) -surveying = express_getattr(IfcLaborResourceTypeEnum, 'SURVEYING', INDETERMINATE) -userdefined = express_getattr(IfcLaborResourceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcLaborResourceTypeEnum, 'NOTDEFINED', INDETERMINATE) +administration = IfcLaborResourceTypeEnum.ADMINISTRATION +carpentry = IfcLaborResourceTypeEnum.CARPENTRY +cleaning = IfcLaborResourceTypeEnum.CLEANING +concrete = IfcLaborResourceTypeEnum.CONCRETE +drywall = IfcLaborResourceTypeEnum.DRYWALL +electric = IfcLaborResourceTypeEnum.ELECTRIC +finishing = IfcLaborResourceTypeEnum.FINISHING +flooring = IfcLaborResourceTypeEnum.FLOORING +general = IfcLaborResourceTypeEnum.GENERAL +hvac = IfcLaborResourceTypeEnum.HVAC +landscaping = IfcLaborResourceTypeEnum.LANDSCAPING +masonry = IfcLaborResourceTypeEnum.MASONRY +painting = IfcLaborResourceTypeEnum.PAINTING +paving = IfcLaborResourceTypeEnum.PAVING +plumbing = IfcLaborResourceTypeEnum.PLUMBING +roofing = IfcLaborResourceTypeEnum.ROOFING +sitegrading = IfcLaborResourceTypeEnum.SITEGRADING +steelwork = IfcLaborResourceTypeEnum.STEELWORK +surveying = IfcLaborResourceTypeEnum.SURVEYING +userdefined = IfcLaborResourceTypeEnum.USERDEFINED +notdefined = IfcLaborResourceTypeEnum.NOTDEFINED IfcLampTypeEnum = enum_namespace() -compactfluorescent = express_getattr(IfcLampTypeEnum, 'COMPACTFLUORESCENT', INDETERMINATE) -fluorescent = express_getattr(IfcLampTypeEnum, 'FLUORESCENT', INDETERMINATE) -halogen = express_getattr(IfcLampTypeEnum, 'HALOGEN', INDETERMINATE) -highpressuremercury = express_getattr(IfcLampTypeEnum, 'HIGHPRESSUREMERCURY', INDETERMINATE) -highpressuresodium = express_getattr(IfcLampTypeEnum, 'HIGHPRESSURESODIUM', INDETERMINATE) -led = express_getattr(IfcLampTypeEnum, 'LED', INDETERMINATE) -metalhalide = express_getattr(IfcLampTypeEnum, 'METALHALIDE', INDETERMINATE) -oled = express_getattr(IfcLampTypeEnum, 'OLED', INDETERMINATE) -tungstenfilament = express_getattr(IfcLampTypeEnum, 'TUNGSTENFILAMENT', INDETERMINATE) -userdefined = express_getattr(IfcLampTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcLampTypeEnum, 'NOTDEFINED', INDETERMINATE) +compactfluorescent = IfcLampTypeEnum.COMPACTFLUORESCENT +fluorescent = IfcLampTypeEnum.FLUORESCENT +halogen = IfcLampTypeEnum.HALOGEN +highpressuremercury = IfcLampTypeEnum.HIGHPRESSUREMERCURY +highpressuresodium = IfcLampTypeEnum.HIGHPRESSURESODIUM +led = IfcLampTypeEnum.LED +metalhalide = IfcLampTypeEnum.METALHALIDE +oled = IfcLampTypeEnum.OLED +tungstenfilament = IfcLampTypeEnum.TUNGSTENFILAMENT +userdefined = IfcLampTypeEnum.USERDEFINED +notdefined = IfcLampTypeEnum.NOTDEFINED IfcLayerSetDirectionEnum = enum_namespace() -axis1 = express_getattr(IfcLayerSetDirectionEnum, 'AXIS1', INDETERMINATE) -axis2 = express_getattr(IfcLayerSetDirectionEnum, 'AXIS2', INDETERMINATE) -axis3 = express_getattr(IfcLayerSetDirectionEnum, 'AXIS3', INDETERMINATE) +axis1 = IfcLayerSetDirectionEnum.AXIS1 +axis2 = IfcLayerSetDirectionEnum.AXIS2 +axis3 = IfcLayerSetDirectionEnum.AXIS3 IfcLightDistributionCurveEnum = enum_namespace() -type_a = express_getattr(IfcLightDistributionCurveEnum, 'TYPE_A', INDETERMINATE) -type_b = express_getattr(IfcLightDistributionCurveEnum, 'TYPE_B', INDETERMINATE) -type_c = express_getattr(IfcLightDistributionCurveEnum, 'TYPE_C', INDETERMINATE) -notdefined = express_getattr(IfcLightDistributionCurveEnum, 'NOTDEFINED', INDETERMINATE) +type_a = IfcLightDistributionCurveEnum.TYPE_A +type_b = IfcLightDistributionCurveEnum.TYPE_B +type_c = IfcLightDistributionCurveEnum.TYPE_C +notdefined = IfcLightDistributionCurveEnum.NOTDEFINED IfcLightEmissionSourceEnum = enum_namespace() -compactfluorescent = express_getattr(IfcLightEmissionSourceEnum, 'COMPACTFLUORESCENT', INDETERMINATE) -fluorescent = express_getattr(IfcLightEmissionSourceEnum, 'FLUORESCENT', INDETERMINATE) -highpressuremercury = express_getattr(IfcLightEmissionSourceEnum, 'HIGHPRESSUREMERCURY', INDETERMINATE) -highpressuresodium = express_getattr(IfcLightEmissionSourceEnum, 'HIGHPRESSURESODIUM', INDETERMINATE) -lightemittingdiode = express_getattr(IfcLightEmissionSourceEnum, 'LIGHTEMITTINGDIODE', INDETERMINATE) -lowpressuresodium = express_getattr(IfcLightEmissionSourceEnum, 'LOWPRESSURESODIUM', INDETERMINATE) -lowvoltagehalogen = express_getattr(IfcLightEmissionSourceEnum, 'LOWVOLTAGEHALOGEN', INDETERMINATE) -mainvoltagehalogen = express_getattr(IfcLightEmissionSourceEnum, 'MAINVOLTAGEHALOGEN', INDETERMINATE) -metalhalide = express_getattr(IfcLightEmissionSourceEnum, 'METALHALIDE', INDETERMINATE) -tungstenfilament = express_getattr(IfcLightEmissionSourceEnum, 'TUNGSTENFILAMENT', INDETERMINATE) -notdefined = express_getattr(IfcLightEmissionSourceEnum, 'NOTDEFINED', INDETERMINATE) +compactfluorescent = IfcLightEmissionSourceEnum.COMPACTFLUORESCENT +fluorescent = IfcLightEmissionSourceEnum.FLUORESCENT +highpressuremercury = IfcLightEmissionSourceEnum.HIGHPRESSUREMERCURY +highpressuresodium = IfcLightEmissionSourceEnum.HIGHPRESSURESODIUM +lightemittingdiode = IfcLightEmissionSourceEnum.LIGHTEMITTINGDIODE +lowpressuresodium = IfcLightEmissionSourceEnum.LOWPRESSURESODIUM +lowvoltagehalogen = IfcLightEmissionSourceEnum.LOWVOLTAGEHALOGEN +mainvoltagehalogen = IfcLightEmissionSourceEnum.MAINVOLTAGEHALOGEN +metalhalide = IfcLightEmissionSourceEnum.METALHALIDE +tungstenfilament = IfcLightEmissionSourceEnum.TUNGSTENFILAMENT +notdefined = IfcLightEmissionSourceEnum.NOTDEFINED IfcLightFixtureTypeEnum = enum_namespace() -pointsource = express_getattr(IfcLightFixtureTypeEnum, 'POINTSOURCE', INDETERMINATE) -directionsource = express_getattr(IfcLightFixtureTypeEnum, 'DIRECTIONSOURCE', INDETERMINATE) -securitylighting = express_getattr(IfcLightFixtureTypeEnum, 'SECURITYLIGHTING', INDETERMINATE) -userdefined = express_getattr(IfcLightFixtureTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcLightFixtureTypeEnum, 'NOTDEFINED', INDETERMINATE) +pointsource = IfcLightFixtureTypeEnum.POINTSOURCE +directionsource = IfcLightFixtureTypeEnum.DIRECTIONSOURCE +securitylighting = IfcLightFixtureTypeEnum.SECURITYLIGHTING +userdefined = IfcLightFixtureTypeEnum.USERDEFINED +notdefined = IfcLightFixtureTypeEnum.NOTDEFINED IfcLiquidTerminalTypeEnum = enum_namespace() -loadingarm = express_getattr(IfcLiquidTerminalTypeEnum, 'LOADINGARM', INDETERMINATE) -hosereel = express_getattr(IfcLiquidTerminalTypeEnum, 'HOSEREEL', INDETERMINATE) -userdefined = express_getattr(IfcLiquidTerminalTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcLiquidTerminalTypeEnum, 'NOTDEFINED', INDETERMINATE) +loadingarm = IfcLiquidTerminalTypeEnum.LOADINGARM +hosereel = IfcLiquidTerminalTypeEnum.HOSEREEL +userdefined = IfcLiquidTerminalTypeEnum.USERDEFINED +notdefined = IfcLiquidTerminalTypeEnum.NOTDEFINED IfcLoadGroupTypeEnum = enum_namespace() -load_group = express_getattr(IfcLoadGroupTypeEnum, 'LOAD_GROUP', INDETERMINATE) -load_case = express_getattr(IfcLoadGroupTypeEnum, 'LOAD_CASE', INDETERMINATE) -load_combination = express_getattr(IfcLoadGroupTypeEnum, 'LOAD_COMBINATION', INDETERMINATE) -userdefined = express_getattr(IfcLoadGroupTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcLoadGroupTypeEnum, 'NOTDEFINED', INDETERMINATE) +load_group = IfcLoadGroupTypeEnum.LOAD_GROUP +load_case = IfcLoadGroupTypeEnum.LOAD_CASE +load_combination = IfcLoadGroupTypeEnum.LOAD_COMBINATION +userdefined = IfcLoadGroupTypeEnum.USERDEFINED +notdefined = IfcLoadGroupTypeEnum.NOTDEFINED IfcLogicalOperatorEnum = enum_namespace() -logicaland = express_getattr(IfcLogicalOperatorEnum, 'LOGICALAND', INDETERMINATE) -logicalor = express_getattr(IfcLogicalOperatorEnum, 'LOGICALOR', INDETERMINATE) -logicalxor = express_getattr(IfcLogicalOperatorEnum, 'LOGICALXOR', INDETERMINATE) -logicalnotand = express_getattr(IfcLogicalOperatorEnum, 'LOGICALNOTAND', INDETERMINATE) -logicalnotor = express_getattr(IfcLogicalOperatorEnum, 'LOGICALNOTOR', INDETERMINATE) +logicaland = IfcLogicalOperatorEnum.LOGICALAND +logicalor = IfcLogicalOperatorEnum.LOGICALOR +logicalxor = IfcLogicalOperatorEnum.LOGICALXOR +logicalnotand = IfcLogicalOperatorEnum.LOGICALNOTAND +logicalnotor = IfcLogicalOperatorEnum.LOGICALNOTOR IfcMarineFacilityTypeEnum = enum_namespace() -canal = express_getattr(IfcMarineFacilityTypeEnum, 'CANAL', INDETERMINATE) -waterwayshiplift = express_getattr(IfcMarineFacilityTypeEnum, 'WATERWAYSHIPLIFT', INDETERMINATE) -embankment = express_getattr(IfcMarineFacilityTypeEnum, 'EMBANKMENT', INDETERMINATE) -launchrecovery = express_getattr(IfcMarineFacilityTypeEnum, 'LAUNCHRECOVERY', INDETERMINATE) -marinedefence = express_getattr(IfcMarineFacilityTypeEnum, 'MARINEDEFENCE', INDETERMINATE) -hydrolift = express_getattr(IfcMarineFacilityTypeEnum, 'HYDROLIFT', INDETERMINATE) -shipyard = express_getattr(IfcMarineFacilityTypeEnum, 'SHIPYARD', INDETERMINATE) -shiplift = express_getattr(IfcMarineFacilityTypeEnum, 'SHIPLIFT', INDETERMINATE) -port = express_getattr(IfcMarineFacilityTypeEnum, 'PORT', INDETERMINATE) -quay = express_getattr(IfcMarineFacilityTypeEnum, 'QUAY', INDETERMINATE) -floatingdock = express_getattr(IfcMarineFacilityTypeEnum, 'FLOATINGDOCK', INDETERMINATE) -navigationalchannel = express_getattr(IfcMarineFacilityTypeEnum, 'NAVIGATIONALCHANNEL', INDETERMINATE) -breakwater = express_getattr(IfcMarineFacilityTypeEnum, 'BREAKWATER', INDETERMINATE) -drydock = express_getattr(IfcMarineFacilityTypeEnum, 'DRYDOCK', INDETERMINATE) -jetty = express_getattr(IfcMarineFacilityTypeEnum, 'JETTY', INDETERMINATE) -shiplock = express_getattr(IfcMarineFacilityTypeEnum, 'SHIPLOCK', INDETERMINATE) -barrierbeach = express_getattr(IfcMarineFacilityTypeEnum, 'BARRIERBEACH', INDETERMINATE) -slipway = express_getattr(IfcMarineFacilityTypeEnum, 'SLIPWAY', INDETERMINATE) -waterway = express_getattr(IfcMarineFacilityTypeEnum, 'WATERWAY', INDETERMINATE) -userdefined = express_getattr(IfcMarineFacilityTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcMarineFacilityTypeEnum, 'NOTDEFINED', INDETERMINATE) +canal = IfcMarineFacilityTypeEnum.CANAL +waterwayshiplift = IfcMarineFacilityTypeEnum.WATERWAYSHIPLIFT +embankment = IfcMarineFacilityTypeEnum.EMBANKMENT +launchrecovery = IfcMarineFacilityTypeEnum.LAUNCHRECOVERY +marinedefence = IfcMarineFacilityTypeEnum.MARINEDEFENCE +hydrolift = IfcMarineFacilityTypeEnum.HYDROLIFT +shipyard = IfcMarineFacilityTypeEnum.SHIPYARD +shiplift = IfcMarineFacilityTypeEnum.SHIPLIFT +port = IfcMarineFacilityTypeEnum.PORT +quay = IfcMarineFacilityTypeEnum.QUAY +floatingdock = IfcMarineFacilityTypeEnum.FLOATINGDOCK +navigationalchannel = IfcMarineFacilityTypeEnum.NAVIGATIONALCHANNEL +breakwater = IfcMarineFacilityTypeEnum.BREAKWATER +drydock = IfcMarineFacilityTypeEnum.DRYDOCK +jetty = IfcMarineFacilityTypeEnum.JETTY +shiplock = IfcMarineFacilityTypeEnum.SHIPLOCK +barrierbeach = IfcMarineFacilityTypeEnum.BARRIERBEACH +slipway = IfcMarineFacilityTypeEnum.SLIPWAY +waterway = IfcMarineFacilityTypeEnum.WATERWAY +userdefined = IfcMarineFacilityTypeEnum.USERDEFINED +notdefined = IfcMarineFacilityTypeEnum.NOTDEFINED IfcMarinePartTypeEnum = enum_namespace() -crest = express_getattr(IfcMarinePartTypeEnum, 'CREST', INDETERMINATE) -manufacturing = express_getattr(IfcMarinePartTypeEnum, 'MANUFACTURING', INDETERMINATE) -lowwaterline = express_getattr(IfcMarinePartTypeEnum, 'LOWWATERLINE', INDETERMINATE) -core = express_getattr(IfcMarinePartTypeEnum, 'CORE', INDETERMINATE) -waterfield = express_getattr(IfcMarinePartTypeEnum, 'WATERFIELD', INDETERMINATE) -cill_level = express_getattr(IfcMarinePartTypeEnum, 'CILL_LEVEL', INDETERMINATE) -berthingstructure = express_getattr(IfcMarinePartTypeEnum, 'BERTHINGSTRUCTURE', INDETERMINATE) -copelevel = express_getattr(IfcMarinePartTypeEnum, 'COPELEVEL', INDETERMINATE) -chamber = express_getattr(IfcMarinePartTypeEnum, 'CHAMBER', INDETERMINATE) -storage = express_getattr(IfcMarinePartTypeEnum, 'STORAGE', INDETERMINATE) -approachchannel = express_getattr(IfcMarinePartTypeEnum, 'APPROACHCHANNEL', INDETERMINATE) -vehicleservicing = express_getattr(IfcMarinePartTypeEnum, 'VEHICLESERVICING', INDETERMINATE) -shiptransfer = express_getattr(IfcMarinePartTypeEnum, 'SHIPTRANSFER', INDETERMINATE) -gatehead = express_getattr(IfcMarinePartTypeEnum, 'GATEHEAD', INDETERMINATE) -gudingstructure = express_getattr(IfcMarinePartTypeEnum, 'GUDINGSTRUCTURE', INDETERMINATE) -belowwaterline = express_getattr(IfcMarinePartTypeEnum, 'BELOWWATERLINE', INDETERMINATE) -weatherside = express_getattr(IfcMarinePartTypeEnum, 'WEATHERSIDE', INDETERMINATE) -landfield = express_getattr(IfcMarinePartTypeEnum, 'LANDFIELD', INDETERMINATE) -protection = express_getattr(IfcMarinePartTypeEnum, 'PROTECTION', INDETERMINATE) -leewardside = express_getattr(IfcMarinePartTypeEnum, 'LEEWARDSIDE', INDETERMINATE) -abovewaterline = express_getattr(IfcMarinePartTypeEnum, 'ABOVEWATERLINE', INDETERMINATE) -anchorage = express_getattr(IfcMarinePartTypeEnum, 'ANCHORAGE', INDETERMINATE) -navigationalarea = express_getattr(IfcMarinePartTypeEnum, 'NAVIGATIONALAREA', INDETERMINATE) -highwaterline = express_getattr(IfcMarinePartTypeEnum, 'HIGHWATERLINE', INDETERMINATE) -userdefined = express_getattr(IfcMarinePartTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcMarinePartTypeEnum, 'NOTDEFINED', INDETERMINATE) +crest = IfcMarinePartTypeEnum.CREST +manufacturing = IfcMarinePartTypeEnum.MANUFACTURING +lowwaterline = IfcMarinePartTypeEnum.LOWWATERLINE +core = IfcMarinePartTypeEnum.CORE +waterfield = IfcMarinePartTypeEnum.WATERFIELD +cill_level = IfcMarinePartTypeEnum.CILL_LEVEL +berthingstructure = IfcMarinePartTypeEnum.BERTHINGSTRUCTURE +copelevel = IfcMarinePartTypeEnum.COPELEVEL +chamber = IfcMarinePartTypeEnum.CHAMBER +storage = IfcMarinePartTypeEnum.STORAGE +approachchannel = IfcMarinePartTypeEnum.APPROACHCHANNEL +vehicleservicing = IfcMarinePartTypeEnum.VEHICLESERVICING +shiptransfer = IfcMarinePartTypeEnum.SHIPTRANSFER +gatehead = IfcMarinePartTypeEnum.GATEHEAD +gudingstructure = IfcMarinePartTypeEnum.GUDINGSTRUCTURE +belowwaterline = IfcMarinePartTypeEnum.BELOWWATERLINE +weatherside = IfcMarinePartTypeEnum.WEATHERSIDE +landfield = IfcMarinePartTypeEnum.LANDFIELD +protection = IfcMarinePartTypeEnum.PROTECTION +leewardside = IfcMarinePartTypeEnum.LEEWARDSIDE +abovewaterline = IfcMarinePartTypeEnum.ABOVEWATERLINE +anchorage = IfcMarinePartTypeEnum.ANCHORAGE +navigationalarea = IfcMarinePartTypeEnum.NAVIGATIONALAREA +highwaterline = IfcMarinePartTypeEnum.HIGHWATERLINE +userdefined = IfcMarinePartTypeEnum.USERDEFINED +notdefined = IfcMarinePartTypeEnum.NOTDEFINED IfcMechanicalFastenerTypeEnum = enum_namespace() -anchorbolt = express_getattr(IfcMechanicalFastenerTypeEnum, 'ANCHORBOLT', INDETERMINATE) -bolt = express_getattr(IfcMechanicalFastenerTypeEnum, 'BOLT', INDETERMINATE) -dowel = express_getattr(IfcMechanicalFastenerTypeEnum, 'DOWEL', INDETERMINATE) -nail = express_getattr(IfcMechanicalFastenerTypeEnum, 'NAIL', INDETERMINATE) -nailplate = express_getattr(IfcMechanicalFastenerTypeEnum, 'NAILPLATE', INDETERMINATE) -rivet = express_getattr(IfcMechanicalFastenerTypeEnum, 'RIVET', INDETERMINATE) -screw = express_getattr(IfcMechanicalFastenerTypeEnum, 'SCREW', INDETERMINATE) -shearconnector = express_getattr(IfcMechanicalFastenerTypeEnum, 'SHEARCONNECTOR', INDETERMINATE) -staple = express_getattr(IfcMechanicalFastenerTypeEnum, 'STAPLE', INDETERMINATE) -studshearconnector = express_getattr(IfcMechanicalFastenerTypeEnum, 'STUDSHEARCONNECTOR', INDETERMINATE) -coupler = express_getattr(IfcMechanicalFastenerTypeEnum, 'COUPLER', INDETERMINATE) -railjoint = express_getattr(IfcMechanicalFastenerTypeEnum, 'RAILJOINT', INDETERMINATE) -railfastening = express_getattr(IfcMechanicalFastenerTypeEnum, 'RAILFASTENING', INDETERMINATE) -chain = express_getattr(IfcMechanicalFastenerTypeEnum, 'CHAIN', INDETERMINATE) -rope = express_getattr(IfcMechanicalFastenerTypeEnum, 'ROPE', INDETERMINATE) -userdefined = express_getattr(IfcMechanicalFastenerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcMechanicalFastenerTypeEnum, 'NOTDEFINED', INDETERMINATE) +anchorbolt = IfcMechanicalFastenerTypeEnum.ANCHORBOLT +bolt = IfcMechanicalFastenerTypeEnum.BOLT +dowel = IfcMechanicalFastenerTypeEnum.DOWEL +nail = IfcMechanicalFastenerTypeEnum.NAIL +nailplate = IfcMechanicalFastenerTypeEnum.NAILPLATE +rivet = IfcMechanicalFastenerTypeEnum.RIVET +screw = IfcMechanicalFastenerTypeEnum.SCREW +shearconnector = IfcMechanicalFastenerTypeEnum.SHEARCONNECTOR +staple = IfcMechanicalFastenerTypeEnum.STAPLE +studshearconnector = IfcMechanicalFastenerTypeEnum.STUDSHEARCONNECTOR +coupler = IfcMechanicalFastenerTypeEnum.COUPLER +railjoint = IfcMechanicalFastenerTypeEnum.RAILJOINT +railfastening = IfcMechanicalFastenerTypeEnum.RAILFASTENING +chain = IfcMechanicalFastenerTypeEnum.CHAIN +rope = IfcMechanicalFastenerTypeEnum.ROPE +userdefined = IfcMechanicalFastenerTypeEnum.USERDEFINED +notdefined = IfcMechanicalFastenerTypeEnum.NOTDEFINED IfcMedicalDeviceTypeEnum = enum_namespace() -airstation = express_getattr(IfcMedicalDeviceTypeEnum, 'AIRSTATION', INDETERMINATE) -feedairunit = express_getattr(IfcMedicalDeviceTypeEnum, 'FEEDAIRUNIT', INDETERMINATE) -oxygengenerator = express_getattr(IfcMedicalDeviceTypeEnum, 'OXYGENGENERATOR', INDETERMINATE) -oxygenplant = express_getattr(IfcMedicalDeviceTypeEnum, 'OXYGENPLANT', INDETERMINATE) -vacuumstation = express_getattr(IfcMedicalDeviceTypeEnum, 'VACUUMSTATION', INDETERMINATE) -userdefined = express_getattr(IfcMedicalDeviceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcMedicalDeviceTypeEnum, 'NOTDEFINED', INDETERMINATE) +airstation = IfcMedicalDeviceTypeEnum.AIRSTATION +feedairunit = IfcMedicalDeviceTypeEnum.FEEDAIRUNIT +oxygengenerator = IfcMedicalDeviceTypeEnum.OXYGENGENERATOR +oxygenplant = IfcMedicalDeviceTypeEnum.OXYGENPLANT +vacuumstation = IfcMedicalDeviceTypeEnum.VACUUMSTATION +userdefined = IfcMedicalDeviceTypeEnum.USERDEFINED +notdefined = IfcMedicalDeviceTypeEnum.NOTDEFINED IfcMemberTypeEnum = enum_namespace() -brace = express_getattr(IfcMemberTypeEnum, 'BRACE', INDETERMINATE) -chord = express_getattr(IfcMemberTypeEnum, 'CHORD', INDETERMINATE) -collar = express_getattr(IfcMemberTypeEnum, 'COLLAR', INDETERMINATE) -member = express_getattr(IfcMemberTypeEnum, 'MEMBER', INDETERMINATE) -mullion = express_getattr(IfcMemberTypeEnum, 'MULLION', INDETERMINATE) -plate = express_getattr(IfcMemberTypeEnum, 'PLATE', INDETERMINATE) -post = express_getattr(IfcMemberTypeEnum, 'POST', INDETERMINATE) -purlin = express_getattr(IfcMemberTypeEnum, 'PURLIN', INDETERMINATE) -rafter = express_getattr(IfcMemberTypeEnum, 'RAFTER', INDETERMINATE) -stringer = express_getattr(IfcMemberTypeEnum, 'STRINGER', INDETERMINATE) -strut = express_getattr(IfcMemberTypeEnum, 'STRUT', INDETERMINATE) -stud = express_getattr(IfcMemberTypeEnum, 'STUD', INDETERMINATE) -stiffening_rib = express_getattr(IfcMemberTypeEnum, 'STIFFENING_RIB', INDETERMINATE) -arch_segment = express_getattr(IfcMemberTypeEnum, 'ARCH_SEGMENT', INDETERMINATE) -suspension_cable = express_getattr(IfcMemberTypeEnum, 'SUSPENSION_CABLE', INDETERMINATE) -suspender = express_getattr(IfcMemberTypeEnum, 'SUSPENDER', INDETERMINATE) -stay_cable = express_getattr(IfcMemberTypeEnum, 'STAY_CABLE', INDETERMINATE) -structuralcable = express_getattr(IfcMemberTypeEnum, 'STRUCTURALCABLE', INDETERMINATE) -tiebar = express_getattr(IfcMemberTypeEnum, 'TIEBAR', INDETERMINATE) -userdefined = express_getattr(IfcMemberTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcMemberTypeEnum, 'NOTDEFINED', INDETERMINATE) +brace = IfcMemberTypeEnum.BRACE +chord = IfcMemberTypeEnum.CHORD +collar = IfcMemberTypeEnum.COLLAR +member = IfcMemberTypeEnum.MEMBER +mullion = IfcMemberTypeEnum.MULLION +plate = IfcMemberTypeEnum.PLATE +post = IfcMemberTypeEnum.POST +purlin = IfcMemberTypeEnum.PURLIN +rafter = IfcMemberTypeEnum.RAFTER +stringer = IfcMemberTypeEnum.STRINGER +strut = IfcMemberTypeEnum.STRUT +stud = IfcMemberTypeEnum.STUD +stiffening_rib = IfcMemberTypeEnum.STIFFENING_RIB +arch_segment = IfcMemberTypeEnum.ARCH_SEGMENT +suspension_cable = IfcMemberTypeEnum.SUSPENSION_CABLE +suspender = IfcMemberTypeEnum.SUSPENDER +stay_cable = IfcMemberTypeEnum.STAY_CABLE +structuralcable = IfcMemberTypeEnum.STRUCTURALCABLE +tiebar = IfcMemberTypeEnum.TIEBAR +userdefined = IfcMemberTypeEnum.USERDEFINED +notdefined = IfcMemberTypeEnum.NOTDEFINED IfcMobileTelecommunicationsApplianceTypeEnum = enum_namespace() -e_utran_node_b = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'E_UTRAN_NODE_B', INDETERMINATE) -remote_radio_unit = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'REMOTE_RADIO_UNIT', INDETERMINATE) -accesspoint = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'ACCESSPOINT', INDETERMINATE) -basetransceiverstation = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'BASETRANSCEIVERSTATION', INDETERMINATE) -remoteunit = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'REMOTEUNIT', INDETERMINATE) -basebandunit = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'BASEBANDUNIT', INDETERMINATE) -masterunit = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'MASTERUNIT', INDETERMINATE) -userdefined = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'NOTDEFINED', INDETERMINATE) +e_utran_node_b = IfcMobileTelecommunicationsApplianceTypeEnum.E_UTRAN_NODE_B +remote_radio_unit = IfcMobileTelecommunicationsApplianceTypeEnum.REMOTE_RADIO_UNIT +accesspoint = IfcMobileTelecommunicationsApplianceTypeEnum.ACCESSPOINT +basetransceiverstation = IfcMobileTelecommunicationsApplianceTypeEnum.BASETRANSCEIVERSTATION +remoteunit = IfcMobileTelecommunicationsApplianceTypeEnum.REMOTEUNIT +basebandunit = IfcMobileTelecommunicationsApplianceTypeEnum.BASEBANDUNIT +masterunit = IfcMobileTelecommunicationsApplianceTypeEnum.MASTERUNIT +userdefined = IfcMobileTelecommunicationsApplianceTypeEnum.USERDEFINED +notdefined = IfcMobileTelecommunicationsApplianceTypeEnum.NOTDEFINED IfcMooringDeviceTypeEnum = enum_namespace() -linetensioner = express_getattr(IfcMooringDeviceTypeEnum, 'LINETENSIONER', INDETERMINATE) -magneticdevice = express_getattr(IfcMooringDeviceTypeEnum, 'MAGNETICDEVICE', INDETERMINATE) -mooringhooks = express_getattr(IfcMooringDeviceTypeEnum, 'MOORINGHOOKS', INDETERMINATE) -vacuumdevice = express_getattr(IfcMooringDeviceTypeEnum, 'VACUUMDEVICE', INDETERMINATE) -bollard = express_getattr(IfcMooringDeviceTypeEnum, 'BOLLARD', INDETERMINATE) -userdefined = express_getattr(IfcMooringDeviceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcMooringDeviceTypeEnum, 'NOTDEFINED', INDETERMINATE) +linetensioner = IfcMooringDeviceTypeEnum.LINETENSIONER +magneticdevice = IfcMooringDeviceTypeEnum.MAGNETICDEVICE +mooringhooks = IfcMooringDeviceTypeEnum.MOORINGHOOKS +vacuumdevice = IfcMooringDeviceTypeEnum.VACUUMDEVICE +bollard = IfcMooringDeviceTypeEnum.BOLLARD +userdefined = IfcMooringDeviceTypeEnum.USERDEFINED +notdefined = IfcMooringDeviceTypeEnum.NOTDEFINED IfcMotorConnectionTypeEnum = enum_namespace() -beltdrive = express_getattr(IfcMotorConnectionTypeEnum, 'BELTDRIVE', INDETERMINATE) -coupling = express_getattr(IfcMotorConnectionTypeEnum, 'COUPLING', INDETERMINATE) -directdrive = express_getattr(IfcMotorConnectionTypeEnum, 'DIRECTDRIVE', INDETERMINATE) -userdefined = express_getattr(IfcMotorConnectionTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcMotorConnectionTypeEnum, 'NOTDEFINED', INDETERMINATE) +beltdrive = IfcMotorConnectionTypeEnum.BELTDRIVE +coupling = IfcMotorConnectionTypeEnum.COUPLING +directdrive = IfcMotorConnectionTypeEnum.DIRECTDRIVE +userdefined = IfcMotorConnectionTypeEnum.USERDEFINED +notdefined = IfcMotorConnectionTypeEnum.NOTDEFINED IfcNavigationElementTypeEnum = enum_namespace() -beacon = express_getattr(IfcNavigationElementTypeEnum, 'BEACON', INDETERMINATE) -buoy = express_getattr(IfcNavigationElementTypeEnum, 'BUOY', INDETERMINATE) -userdefined = express_getattr(IfcNavigationElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcNavigationElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +beacon = IfcNavigationElementTypeEnum.BEACON +buoy = IfcNavigationElementTypeEnum.BUOY +userdefined = IfcNavigationElementTypeEnum.USERDEFINED +notdefined = IfcNavigationElementTypeEnum.NOTDEFINED IfcNullStyle = enum_namespace() -null = express_getattr(IfcNullStyle, 'NULL', INDETERMINATE) +null = IfcNullStyle.NULL IfcObjectTypeEnum = enum_namespace() -product = express_getattr(IfcObjectTypeEnum, 'PRODUCT', INDETERMINATE) -process = express_getattr(IfcObjectTypeEnum, 'PROCESS', INDETERMINATE) -control = express_getattr(IfcObjectTypeEnum, 'CONTROL', INDETERMINATE) -resource = express_getattr(IfcObjectTypeEnum, 'RESOURCE', INDETERMINATE) -actor = express_getattr(IfcObjectTypeEnum, 'ACTOR', INDETERMINATE) -group = express_getattr(IfcObjectTypeEnum, 'GROUP', INDETERMINATE) -project = express_getattr(IfcObjectTypeEnum, 'PROJECT', INDETERMINATE) -notdefined = express_getattr(IfcObjectTypeEnum, 'NOTDEFINED', INDETERMINATE) +product = IfcObjectTypeEnum.PRODUCT +process = IfcObjectTypeEnum.PROCESS +control = IfcObjectTypeEnum.CONTROL +resource = IfcObjectTypeEnum.RESOURCE +actor = IfcObjectTypeEnum.ACTOR +group = IfcObjectTypeEnum.GROUP +project = IfcObjectTypeEnum.PROJECT +notdefined = IfcObjectTypeEnum.NOTDEFINED IfcObjectiveEnum = enum_namespace() -codecompliance = express_getattr(IfcObjectiveEnum, 'CODECOMPLIANCE', INDETERMINATE) -codewaiver = express_getattr(IfcObjectiveEnum, 'CODEWAIVER', INDETERMINATE) -designintent = express_getattr(IfcObjectiveEnum, 'DESIGNINTENT', INDETERMINATE) -external = express_getattr(IfcObjectiveEnum, 'EXTERNAL', INDETERMINATE) -healthandsafety = express_getattr(IfcObjectiveEnum, 'HEALTHANDSAFETY', INDETERMINATE) -mergeconflict = express_getattr(IfcObjectiveEnum, 'MERGECONFLICT', INDETERMINATE) -modelview = express_getattr(IfcObjectiveEnum, 'MODELVIEW', INDETERMINATE) -parameter = express_getattr(IfcObjectiveEnum, 'PARAMETER', INDETERMINATE) -requirement = express_getattr(IfcObjectiveEnum, 'REQUIREMENT', INDETERMINATE) -specification = express_getattr(IfcObjectiveEnum, 'SPECIFICATION', INDETERMINATE) -triggercondition = express_getattr(IfcObjectiveEnum, 'TRIGGERCONDITION', INDETERMINATE) -userdefined = express_getattr(IfcObjectiveEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcObjectiveEnum, 'NOTDEFINED', INDETERMINATE) +codecompliance = IfcObjectiveEnum.CODECOMPLIANCE +codewaiver = IfcObjectiveEnum.CODEWAIVER +designintent = IfcObjectiveEnum.DESIGNINTENT +external = IfcObjectiveEnum.EXTERNAL +healthandsafety = IfcObjectiveEnum.HEALTHANDSAFETY +mergeconflict = IfcObjectiveEnum.MERGECONFLICT +modelview = IfcObjectiveEnum.MODELVIEW +parameter = IfcObjectiveEnum.PARAMETER +requirement = IfcObjectiveEnum.REQUIREMENT +specification = IfcObjectiveEnum.SPECIFICATION +triggercondition = IfcObjectiveEnum.TRIGGERCONDITION +userdefined = IfcObjectiveEnum.USERDEFINED +notdefined = IfcObjectiveEnum.NOTDEFINED IfcOccupantTypeEnum = enum_namespace() -assignee = express_getattr(IfcOccupantTypeEnum, 'ASSIGNEE', INDETERMINATE) -assignor = express_getattr(IfcOccupantTypeEnum, 'ASSIGNOR', INDETERMINATE) -lessee = express_getattr(IfcOccupantTypeEnum, 'LESSEE', INDETERMINATE) -lessor = express_getattr(IfcOccupantTypeEnum, 'LESSOR', INDETERMINATE) -lettingagent = express_getattr(IfcOccupantTypeEnum, 'LETTINGAGENT', INDETERMINATE) -owner = express_getattr(IfcOccupantTypeEnum, 'OWNER', INDETERMINATE) -tenant = express_getattr(IfcOccupantTypeEnum, 'TENANT', INDETERMINATE) -userdefined = express_getattr(IfcOccupantTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcOccupantTypeEnum, 'NOTDEFINED', INDETERMINATE) +assignee = IfcOccupantTypeEnum.ASSIGNEE +assignor = IfcOccupantTypeEnum.ASSIGNOR +lessee = IfcOccupantTypeEnum.LESSEE +lessor = IfcOccupantTypeEnum.LESSOR +lettingagent = IfcOccupantTypeEnum.LETTINGAGENT +owner = IfcOccupantTypeEnum.OWNER +tenant = IfcOccupantTypeEnum.TENANT +userdefined = IfcOccupantTypeEnum.USERDEFINED +notdefined = IfcOccupantTypeEnum.NOTDEFINED IfcOpeningElementTypeEnum = enum_namespace() -opening = express_getattr(IfcOpeningElementTypeEnum, 'OPENING', INDETERMINATE) -recess = express_getattr(IfcOpeningElementTypeEnum, 'RECESS', INDETERMINATE) -userdefined = express_getattr(IfcOpeningElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcOpeningElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +opening = IfcOpeningElementTypeEnum.OPENING +recess = IfcOpeningElementTypeEnum.RECESS +userdefined = IfcOpeningElementTypeEnum.USERDEFINED +notdefined = IfcOpeningElementTypeEnum.NOTDEFINED IfcOutletTypeEnum = enum_namespace() -audiovisualoutlet = express_getattr(IfcOutletTypeEnum, 'AUDIOVISUALOUTLET', INDETERMINATE) -communicationsoutlet = express_getattr(IfcOutletTypeEnum, 'COMMUNICATIONSOUTLET', INDETERMINATE) -poweroutlet = express_getattr(IfcOutletTypeEnum, 'POWEROUTLET', INDETERMINATE) -dataoutlet = express_getattr(IfcOutletTypeEnum, 'DATAOUTLET', INDETERMINATE) -telephoneoutlet = express_getattr(IfcOutletTypeEnum, 'TELEPHONEOUTLET', INDETERMINATE) -userdefined = express_getattr(IfcOutletTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcOutletTypeEnum, 'NOTDEFINED', INDETERMINATE) +audiovisualoutlet = IfcOutletTypeEnum.AUDIOVISUALOUTLET +communicationsoutlet = IfcOutletTypeEnum.COMMUNICATIONSOUTLET +poweroutlet = IfcOutletTypeEnum.POWEROUTLET +dataoutlet = IfcOutletTypeEnum.DATAOUTLET +telephoneoutlet = IfcOutletTypeEnum.TELEPHONEOUTLET +userdefined = IfcOutletTypeEnum.USERDEFINED +notdefined = IfcOutletTypeEnum.NOTDEFINED IfcPerformanceHistoryTypeEnum = enum_namespace() -userdefined = express_getattr(IfcPerformanceHistoryTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPerformanceHistoryTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcPerformanceHistoryTypeEnum.USERDEFINED +notdefined = IfcPerformanceHistoryTypeEnum.NOTDEFINED IfcPermeableCoveringOperationEnum = enum_namespace() -grill = express_getattr(IfcPermeableCoveringOperationEnum, 'GRILL', INDETERMINATE) -louver = express_getattr(IfcPermeableCoveringOperationEnum, 'LOUVER', INDETERMINATE) -screen = express_getattr(IfcPermeableCoveringOperationEnum, 'SCREEN', INDETERMINATE) -userdefined = express_getattr(IfcPermeableCoveringOperationEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPermeableCoveringOperationEnum, 'NOTDEFINED', INDETERMINATE) +grill = IfcPermeableCoveringOperationEnum.GRILL +louver = IfcPermeableCoveringOperationEnum.LOUVER +screen = IfcPermeableCoveringOperationEnum.SCREEN +userdefined = IfcPermeableCoveringOperationEnum.USERDEFINED +notdefined = IfcPermeableCoveringOperationEnum.NOTDEFINED IfcPermitTypeEnum = enum_namespace() -access = express_getattr(IfcPermitTypeEnum, 'ACCESS', INDETERMINATE) -building = express_getattr(IfcPermitTypeEnum, 'BUILDING', INDETERMINATE) -work = express_getattr(IfcPermitTypeEnum, 'WORK', INDETERMINATE) -userdefined = express_getattr(IfcPermitTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPermitTypeEnum, 'NOTDEFINED', INDETERMINATE) +access = IfcPermitTypeEnum.ACCESS +building = IfcPermitTypeEnum.BUILDING +work = IfcPermitTypeEnum.WORK +userdefined = IfcPermitTypeEnum.USERDEFINED +notdefined = IfcPermitTypeEnum.NOTDEFINED IfcPhysicalOrVirtualEnum = enum_namespace() -physical = express_getattr(IfcPhysicalOrVirtualEnum, 'PHYSICAL', INDETERMINATE) -virtual = express_getattr(IfcPhysicalOrVirtualEnum, 'VIRTUAL', INDETERMINATE) -notdefined = express_getattr(IfcPhysicalOrVirtualEnum, 'NOTDEFINED', INDETERMINATE) +physical = IfcPhysicalOrVirtualEnum.PHYSICAL +virtual = IfcPhysicalOrVirtualEnum.VIRTUAL +notdefined = IfcPhysicalOrVirtualEnum.NOTDEFINED IfcPileConstructionEnum = enum_namespace() -cast_in_place = express_getattr(IfcPileConstructionEnum, 'CAST_IN_PLACE', INDETERMINATE) -composite = express_getattr(IfcPileConstructionEnum, 'COMPOSITE', INDETERMINATE) -precast_concrete = express_getattr(IfcPileConstructionEnum, 'PRECAST_CONCRETE', INDETERMINATE) -prefab_steel = express_getattr(IfcPileConstructionEnum, 'PREFAB_STEEL', INDETERMINATE) -userdefined = express_getattr(IfcPileConstructionEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPileConstructionEnum, 'NOTDEFINED', INDETERMINATE) +cast_in_place = IfcPileConstructionEnum.CAST_IN_PLACE +composite = IfcPileConstructionEnum.COMPOSITE +precast_concrete = IfcPileConstructionEnum.PRECAST_CONCRETE +prefab_steel = IfcPileConstructionEnum.PREFAB_STEEL +userdefined = IfcPileConstructionEnum.USERDEFINED +notdefined = IfcPileConstructionEnum.NOTDEFINED IfcPileTypeEnum = enum_namespace() -bored = express_getattr(IfcPileTypeEnum, 'BORED', INDETERMINATE) -driven = express_getattr(IfcPileTypeEnum, 'DRIVEN', INDETERMINATE) -jetgrouting = express_getattr(IfcPileTypeEnum, 'JETGROUTING', INDETERMINATE) -cohesion = express_getattr(IfcPileTypeEnum, 'COHESION', INDETERMINATE) -friction = express_getattr(IfcPileTypeEnum, 'FRICTION', INDETERMINATE) -support = express_getattr(IfcPileTypeEnum, 'SUPPORT', INDETERMINATE) -userdefined = express_getattr(IfcPileTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPileTypeEnum, 'NOTDEFINED', INDETERMINATE) +bored = IfcPileTypeEnum.BORED +driven = IfcPileTypeEnum.DRIVEN +jetgrouting = IfcPileTypeEnum.JETGROUTING +cohesion = IfcPileTypeEnum.COHESION +friction = IfcPileTypeEnum.FRICTION +support = IfcPileTypeEnum.SUPPORT +userdefined = IfcPileTypeEnum.USERDEFINED +notdefined = IfcPileTypeEnum.NOTDEFINED IfcPipeFittingTypeEnum = enum_namespace() -bend = express_getattr(IfcPipeFittingTypeEnum, 'BEND', INDETERMINATE) -connector = express_getattr(IfcPipeFittingTypeEnum, 'CONNECTOR', INDETERMINATE) -entry = express_getattr(IfcPipeFittingTypeEnum, 'ENTRY', INDETERMINATE) -exit = express_getattr(IfcPipeFittingTypeEnum, 'EXIT', INDETERMINATE) -junction = express_getattr(IfcPipeFittingTypeEnum, 'JUNCTION', INDETERMINATE) -obstruction = express_getattr(IfcPipeFittingTypeEnum, 'OBSTRUCTION', INDETERMINATE) -transition = express_getattr(IfcPipeFittingTypeEnum, 'TRANSITION', INDETERMINATE) -userdefined = express_getattr(IfcPipeFittingTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPipeFittingTypeEnum, 'NOTDEFINED', INDETERMINATE) +bend = IfcPipeFittingTypeEnum.BEND +connector = IfcPipeFittingTypeEnum.CONNECTOR +entry = IfcPipeFittingTypeEnum.ENTRY +exit = IfcPipeFittingTypeEnum.EXIT +junction = IfcPipeFittingTypeEnum.JUNCTION +obstruction = IfcPipeFittingTypeEnum.OBSTRUCTION +transition = IfcPipeFittingTypeEnum.TRANSITION +userdefined = IfcPipeFittingTypeEnum.USERDEFINED +notdefined = IfcPipeFittingTypeEnum.NOTDEFINED IfcPipeSegmentTypeEnum = enum_namespace() -culvert = express_getattr(IfcPipeSegmentTypeEnum, 'CULVERT', INDETERMINATE) -flexiblesegment = express_getattr(IfcPipeSegmentTypeEnum, 'FLEXIBLESEGMENT', INDETERMINATE) -rigidsegment = express_getattr(IfcPipeSegmentTypeEnum, 'RIGIDSEGMENT', INDETERMINATE) -gutter = express_getattr(IfcPipeSegmentTypeEnum, 'GUTTER', INDETERMINATE) -spool = express_getattr(IfcPipeSegmentTypeEnum, 'SPOOL', INDETERMINATE) -userdefined = express_getattr(IfcPipeSegmentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPipeSegmentTypeEnum, 'NOTDEFINED', INDETERMINATE) +culvert = IfcPipeSegmentTypeEnum.CULVERT +flexiblesegment = IfcPipeSegmentTypeEnum.FLEXIBLESEGMENT +rigidsegment = IfcPipeSegmentTypeEnum.RIGIDSEGMENT +gutter = IfcPipeSegmentTypeEnum.GUTTER +spool = IfcPipeSegmentTypeEnum.SPOOL +userdefined = IfcPipeSegmentTypeEnum.USERDEFINED +notdefined = IfcPipeSegmentTypeEnum.NOTDEFINED IfcPlateTypeEnum = enum_namespace() -curtain_panel = express_getattr(IfcPlateTypeEnum, 'CURTAIN_PANEL', INDETERMINATE) -sheet = express_getattr(IfcPlateTypeEnum, 'SHEET', INDETERMINATE) -flange_plate = express_getattr(IfcPlateTypeEnum, 'FLANGE_PLATE', INDETERMINATE) -web_plate = express_getattr(IfcPlateTypeEnum, 'WEB_PLATE', INDETERMINATE) -stiffener_plate = express_getattr(IfcPlateTypeEnum, 'STIFFENER_PLATE', INDETERMINATE) -gusset_plate = express_getattr(IfcPlateTypeEnum, 'GUSSET_PLATE', INDETERMINATE) -cover_plate = express_getattr(IfcPlateTypeEnum, 'COVER_PLATE', INDETERMINATE) -splice_plate = express_getattr(IfcPlateTypeEnum, 'SPLICE_PLATE', INDETERMINATE) -base_plate = express_getattr(IfcPlateTypeEnum, 'BASE_PLATE', INDETERMINATE) -userdefined = express_getattr(IfcPlateTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPlateTypeEnum, 'NOTDEFINED', INDETERMINATE) +curtain_panel = IfcPlateTypeEnum.CURTAIN_PANEL +sheet = IfcPlateTypeEnum.SHEET +flange_plate = IfcPlateTypeEnum.FLANGE_PLATE +web_plate = IfcPlateTypeEnum.WEB_PLATE +stiffener_plate = IfcPlateTypeEnum.STIFFENER_PLATE +gusset_plate = IfcPlateTypeEnum.GUSSET_PLATE +cover_plate = IfcPlateTypeEnum.COVER_PLATE +splice_plate = IfcPlateTypeEnum.SPLICE_PLATE +base_plate = IfcPlateTypeEnum.BASE_PLATE +userdefined = IfcPlateTypeEnum.USERDEFINED +notdefined = IfcPlateTypeEnum.NOTDEFINED IfcPreferredSurfaceCurveRepresentation = enum_namespace() -curve3d = express_getattr(IfcPreferredSurfaceCurveRepresentation, 'CURVE3D', INDETERMINATE) -pcurve_s1 = express_getattr(IfcPreferredSurfaceCurveRepresentation, 'PCURVE_S1', INDETERMINATE) -pcurve_s2 = express_getattr(IfcPreferredSurfaceCurveRepresentation, 'PCURVE_S2', INDETERMINATE) +curve3d = IfcPreferredSurfaceCurveRepresentation.CURVE3D +pcurve_s1 = IfcPreferredSurfaceCurveRepresentation.PCURVE_S1 +pcurve_s2 = IfcPreferredSurfaceCurveRepresentation.PCURVE_S2 IfcProcedureTypeEnum = enum_namespace() -advice_caution = express_getattr(IfcProcedureTypeEnum, 'ADVICE_CAUTION', INDETERMINATE) -advice_note = express_getattr(IfcProcedureTypeEnum, 'ADVICE_NOTE', INDETERMINATE) -advice_warning = express_getattr(IfcProcedureTypeEnum, 'ADVICE_WARNING', INDETERMINATE) -calibration = express_getattr(IfcProcedureTypeEnum, 'CALIBRATION', INDETERMINATE) -diagnostic = express_getattr(IfcProcedureTypeEnum, 'DIAGNOSTIC', INDETERMINATE) -shutdown = express_getattr(IfcProcedureTypeEnum, 'SHUTDOWN', INDETERMINATE) -startup = express_getattr(IfcProcedureTypeEnum, 'STARTUP', INDETERMINATE) -userdefined = express_getattr(IfcProcedureTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcProcedureTypeEnum, 'NOTDEFINED', INDETERMINATE) +advice_caution = IfcProcedureTypeEnum.ADVICE_CAUTION +advice_note = IfcProcedureTypeEnum.ADVICE_NOTE +advice_warning = IfcProcedureTypeEnum.ADVICE_WARNING +calibration = IfcProcedureTypeEnum.CALIBRATION +diagnostic = IfcProcedureTypeEnum.DIAGNOSTIC +shutdown = IfcProcedureTypeEnum.SHUTDOWN +startup = IfcProcedureTypeEnum.STARTUP +userdefined = IfcProcedureTypeEnum.USERDEFINED +notdefined = IfcProcedureTypeEnum.NOTDEFINED IfcProfileTypeEnum = enum_namespace() -curve = express_getattr(IfcProfileTypeEnum, 'CURVE', INDETERMINATE) -area = express_getattr(IfcProfileTypeEnum, 'AREA', INDETERMINATE) +curve = IfcProfileTypeEnum.CURVE +area = IfcProfileTypeEnum.AREA IfcProjectOrderTypeEnum = enum_namespace() -changeorder = express_getattr(IfcProjectOrderTypeEnum, 'CHANGEORDER', INDETERMINATE) -maintenanceworkorder = express_getattr(IfcProjectOrderTypeEnum, 'MAINTENANCEWORKORDER', INDETERMINATE) -moveorder = express_getattr(IfcProjectOrderTypeEnum, 'MOVEORDER', INDETERMINATE) -purchaseorder = express_getattr(IfcProjectOrderTypeEnum, 'PURCHASEORDER', INDETERMINATE) -workorder = express_getattr(IfcProjectOrderTypeEnum, 'WORKORDER', INDETERMINATE) -userdefined = express_getattr(IfcProjectOrderTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcProjectOrderTypeEnum, 'NOTDEFINED', INDETERMINATE) +changeorder = IfcProjectOrderTypeEnum.CHANGEORDER +maintenanceworkorder = IfcProjectOrderTypeEnum.MAINTENANCEWORKORDER +moveorder = IfcProjectOrderTypeEnum.MOVEORDER +purchaseorder = IfcProjectOrderTypeEnum.PURCHASEORDER +workorder = IfcProjectOrderTypeEnum.WORKORDER +userdefined = IfcProjectOrderTypeEnum.USERDEFINED +notdefined = IfcProjectOrderTypeEnum.NOTDEFINED IfcProjectedOrTrueLengthEnum = enum_namespace() -projected_length = express_getattr(IfcProjectedOrTrueLengthEnum, 'PROJECTED_LENGTH', INDETERMINATE) -true_length = express_getattr(IfcProjectedOrTrueLengthEnum, 'TRUE_LENGTH', INDETERMINATE) +projected_length = IfcProjectedOrTrueLengthEnum.PROJECTED_LENGTH +true_length = IfcProjectedOrTrueLengthEnum.TRUE_LENGTH IfcProjectionElementTypeEnum = enum_namespace() -blister = express_getattr(IfcProjectionElementTypeEnum, 'BLISTER', INDETERMINATE) -deviator = express_getattr(IfcProjectionElementTypeEnum, 'DEVIATOR', INDETERMINATE) -userdefined = express_getattr(IfcProjectionElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcProjectionElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +blister = IfcProjectionElementTypeEnum.BLISTER +deviator = IfcProjectionElementTypeEnum.DEVIATOR +userdefined = IfcProjectionElementTypeEnum.USERDEFINED +notdefined = IfcProjectionElementTypeEnum.NOTDEFINED IfcPropertySetTemplateTypeEnum = enum_namespace() -pset_typedrivenonly = express_getattr(IfcPropertySetTemplateTypeEnum, 'PSET_TYPEDRIVENONLY', INDETERMINATE) -pset_typedrivenoverride = express_getattr(IfcPropertySetTemplateTypeEnum, 'PSET_TYPEDRIVENOVERRIDE', INDETERMINATE) -pset_occurrencedriven = express_getattr(IfcPropertySetTemplateTypeEnum, 'PSET_OCCURRENCEDRIVEN', INDETERMINATE) -pset_performancedriven = express_getattr(IfcPropertySetTemplateTypeEnum, 'PSET_PERFORMANCEDRIVEN', INDETERMINATE) -qto_typedrivenonly = express_getattr(IfcPropertySetTemplateTypeEnum, 'QTO_TYPEDRIVENONLY', INDETERMINATE) -qto_typedrivenoverride = express_getattr(IfcPropertySetTemplateTypeEnum, 'QTO_TYPEDRIVENOVERRIDE', INDETERMINATE) -qto_occurrencedriven = express_getattr(IfcPropertySetTemplateTypeEnum, 'QTO_OCCURRENCEDRIVEN', INDETERMINATE) -notdefined = express_getattr(IfcPropertySetTemplateTypeEnum, 'NOTDEFINED', INDETERMINATE) +pset_typedrivenonly = IfcPropertySetTemplateTypeEnum.PSET_TYPEDRIVENONLY +pset_typedrivenoverride = IfcPropertySetTemplateTypeEnum.PSET_TYPEDRIVENOVERRIDE +pset_occurrencedriven = IfcPropertySetTemplateTypeEnum.PSET_OCCURRENCEDRIVEN +pset_performancedriven = IfcPropertySetTemplateTypeEnum.PSET_PERFORMANCEDRIVEN +qto_typedrivenonly = IfcPropertySetTemplateTypeEnum.QTO_TYPEDRIVENONLY +qto_typedrivenoverride = IfcPropertySetTemplateTypeEnum.QTO_TYPEDRIVENOVERRIDE +qto_occurrencedriven = IfcPropertySetTemplateTypeEnum.QTO_OCCURRENCEDRIVEN +notdefined = IfcPropertySetTemplateTypeEnum.NOTDEFINED IfcProtectiveDeviceTrippingUnitTypeEnum = enum_namespace() -electronic = express_getattr(IfcProtectiveDeviceTrippingUnitTypeEnum, 'ELECTRONIC', INDETERMINATE) -electromagnetic = express_getattr(IfcProtectiveDeviceTrippingUnitTypeEnum, 'ELECTROMAGNETIC', INDETERMINATE) -residualcurrent = express_getattr(IfcProtectiveDeviceTrippingUnitTypeEnum, 'RESIDUALCURRENT', INDETERMINATE) -thermal = express_getattr(IfcProtectiveDeviceTrippingUnitTypeEnum, 'THERMAL', INDETERMINATE) -userdefined = express_getattr(IfcProtectiveDeviceTrippingUnitTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcProtectiveDeviceTrippingUnitTypeEnum, 'NOTDEFINED', INDETERMINATE) +electronic = IfcProtectiveDeviceTrippingUnitTypeEnum.ELECTRONIC +electromagnetic = IfcProtectiveDeviceTrippingUnitTypeEnum.ELECTROMAGNETIC +residualcurrent = IfcProtectiveDeviceTrippingUnitTypeEnum.RESIDUALCURRENT +thermal = IfcProtectiveDeviceTrippingUnitTypeEnum.THERMAL +userdefined = IfcProtectiveDeviceTrippingUnitTypeEnum.USERDEFINED +notdefined = IfcProtectiveDeviceTrippingUnitTypeEnum.NOTDEFINED IfcProtectiveDeviceTypeEnum = enum_namespace() -circuitbreaker = express_getattr(IfcProtectiveDeviceTypeEnum, 'CIRCUITBREAKER', INDETERMINATE) -earthleakagecircuitbreaker = express_getattr(IfcProtectiveDeviceTypeEnum, 'EARTHLEAKAGECIRCUITBREAKER', INDETERMINATE) -earthingswitch = express_getattr(IfcProtectiveDeviceTypeEnum, 'EARTHINGSWITCH', INDETERMINATE) -fusedisconnector = express_getattr(IfcProtectiveDeviceTypeEnum, 'FUSEDISCONNECTOR', INDETERMINATE) -residualcurrentcircuitbreaker = express_getattr(IfcProtectiveDeviceTypeEnum, 'RESIDUALCURRENTCIRCUITBREAKER', INDETERMINATE) -residualcurrentswitch = express_getattr(IfcProtectiveDeviceTypeEnum, 'RESIDUALCURRENTSWITCH', INDETERMINATE) -varistor = express_getattr(IfcProtectiveDeviceTypeEnum, 'VARISTOR', INDETERMINATE) -anti_arcing_device = express_getattr(IfcProtectiveDeviceTypeEnum, 'ANTI_ARCING_DEVICE', INDETERMINATE) -sparkgap = express_getattr(IfcProtectiveDeviceTypeEnum, 'SPARKGAP', INDETERMINATE) -voltagelimiter = express_getattr(IfcProtectiveDeviceTypeEnum, 'VOLTAGELIMITER', INDETERMINATE) -userdefined = express_getattr(IfcProtectiveDeviceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcProtectiveDeviceTypeEnum, 'NOTDEFINED', INDETERMINATE) +circuitbreaker = IfcProtectiveDeviceTypeEnum.CIRCUITBREAKER +earthleakagecircuitbreaker = IfcProtectiveDeviceTypeEnum.EARTHLEAKAGECIRCUITBREAKER +earthingswitch = IfcProtectiveDeviceTypeEnum.EARTHINGSWITCH +fusedisconnector = IfcProtectiveDeviceTypeEnum.FUSEDISCONNECTOR +residualcurrentcircuitbreaker = IfcProtectiveDeviceTypeEnum.RESIDUALCURRENTCIRCUITBREAKER +residualcurrentswitch = IfcProtectiveDeviceTypeEnum.RESIDUALCURRENTSWITCH +varistor = IfcProtectiveDeviceTypeEnum.VARISTOR +anti_arcing_device = IfcProtectiveDeviceTypeEnum.ANTI_ARCING_DEVICE +sparkgap = IfcProtectiveDeviceTypeEnum.SPARKGAP +voltagelimiter = IfcProtectiveDeviceTypeEnum.VOLTAGELIMITER +userdefined = IfcProtectiveDeviceTypeEnum.USERDEFINED +notdefined = IfcProtectiveDeviceTypeEnum.NOTDEFINED IfcPumpTypeEnum = enum_namespace() -circulator = express_getattr(IfcPumpTypeEnum, 'CIRCULATOR', INDETERMINATE) -endsuction = express_getattr(IfcPumpTypeEnum, 'ENDSUCTION', INDETERMINATE) -splitcase = express_getattr(IfcPumpTypeEnum, 'SPLITCASE', INDETERMINATE) -submersiblepump = express_getattr(IfcPumpTypeEnum, 'SUBMERSIBLEPUMP', INDETERMINATE) -sumppump = express_getattr(IfcPumpTypeEnum, 'SUMPPUMP', INDETERMINATE) -verticalinline = express_getattr(IfcPumpTypeEnum, 'VERTICALINLINE', INDETERMINATE) -verticalturbine = express_getattr(IfcPumpTypeEnum, 'VERTICALTURBINE', INDETERMINATE) -userdefined = express_getattr(IfcPumpTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPumpTypeEnum, 'NOTDEFINED', INDETERMINATE) +circulator = IfcPumpTypeEnum.CIRCULATOR +endsuction = IfcPumpTypeEnum.ENDSUCTION +splitcase = IfcPumpTypeEnum.SPLITCASE +submersiblepump = IfcPumpTypeEnum.SUBMERSIBLEPUMP +sumppump = IfcPumpTypeEnum.SUMPPUMP +verticalinline = IfcPumpTypeEnum.VERTICALINLINE +verticalturbine = IfcPumpTypeEnum.VERTICALTURBINE +userdefined = IfcPumpTypeEnum.USERDEFINED +notdefined = IfcPumpTypeEnum.NOTDEFINED IfcRailTypeEnum = enum_namespace() -rackrail = express_getattr(IfcRailTypeEnum, 'RACKRAIL', INDETERMINATE) -blade = express_getattr(IfcRailTypeEnum, 'BLADE', INDETERMINATE) -guardrail = express_getattr(IfcRailTypeEnum, 'GUARDRAIL', INDETERMINATE) -stockrail = express_getattr(IfcRailTypeEnum, 'STOCKRAIL', INDETERMINATE) -checkrail = express_getattr(IfcRailTypeEnum, 'CHECKRAIL', INDETERMINATE) -rail = express_getattr(IfcRailTypeEnum, 'RAIL', INDETERMINATE) -userdefined = express_getattr(IfcRailTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcRailTypeEnum, 'NOTDEFINED', INDETERMINATE) +rackrail = IfcRailTypeEnum.RACKRAIL +blade = IfcRailTypeEnum.BLADE +guardrail = IfcRailTypeEnum.GUARDRAIL +stockrail = IfcRailTypeEnum.STOCKRAIL +checkrail = IfcRailTypeEnum.CHECKRAIL +rail = IfcRailTypeEnum.RAIL +userdefined = IfcRailTypeEnum.USERDEFINED +notdefined = IfcRailTypeEnum.NOTDEFINED IfcRailingTypeEnum = enum_namespace() -handrail = express_getattr(IfcRailingTypeEnum, 'HANDRAIL', INDETERMINATE) -guardrail = express_getattr(IfcRailingTypeEnum, 'GUARDRAIL', INDETERMINATE) -balustrade = express_getattr(IfcRailingTypeEnum, 'BALUSTRADE', INDETERMINATE) -fence = express_getattr(IfcRailingTypeEnum, 'FENCE', INDETERMINATE) -userdefined = express_getattr(IfcRailingTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcRailingTypeEnum, 'NOTDEFINED', INDETERMINATE) +handrail = IfcRailingTypeEnum.HANDRAIL +guardrail = IfcRailingTypeEnum.GUARDRAIL +balustrade = IfcRailingTypeEnum.BALUSTRADE +fence = IfcRailingTypeEnum.FENCE +userdefined = IfcRailingTypeEnum.USERDEFINED +notdefined = IfcRailingTypeEnum.NOTDEFINED IfcRailwayPartTypeEnum = enum_namespace() -trackstructure = express_getattr(IfcRailwayPartTypeEnum, 'TRACKSTRUCTURE', INDETERMINATE) -trackstructurepart = express_getattr(IfcRailwayPartTypeEnum, 'TRACKSTRUCTUREPART', INDETERMINATE) -linesidestructurepart = express_getattr(IfcRailwayPartTypeEnum, 'LINESIDESTRUCTUREPART', INDETERMINATE) -dilatationsuperstructure = express_getattr(IfcRailwayPartTypeEnum, 'DILATATIONSUPERSTRUCTURE', INDETERMINATE) -plaintracksupestructure = express_getattr(IfcRailwayPartTypeEnum, 'PLAINTRACKSUPESTRUCTURE', INDETERMINATE) -linesidestructure = express_getattr(IfcRailwayPartTypeEnum, 'LINESIDESTRUCTURE', INDETERMINATE) -superstructure = express_getattr(IfcRailwayPartTypeEnum, 'SUPERSTRUCTURE', INDETERMINATE) -turnoutsuperstructure = express_getattr(IfcRailwayPartTypeEnum, 'TURNOUTSUPERSTRUCTURE', INDETERMINATE) -userdefined = express_getattr(IfcRailwayPartTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcRailwayPartTypeEnum, 'NOTDEFINED', INDETERMINATE) +trackstructure = IfcRailwayPartTypeEnum.TRACKSTRUCTURE +trackstructurepart = IfcRailwayPartTypeEnum.TRACKSTRUCTUREPART +linesidestructurepart = IfcRailwayPartTypeEnum.LINESIDESTRUCTUREPART +dilatationsuperstructure = IfcRailwayPartTypeEnum.DILATATIONSUPERSTRUCTURE +plaintracksupestructure = IfcRailwayPartTypeEnum.PLAINTRACKSUPESTRUCTURE +linesidestructure = IfcRailwayPartTypeEnum.LINESIDESTRUCTURE +superstructure = IfcRailwayPartTypeEnum.SUPERSTRUCTURE +turnoutsuperstructure = IfcRailwayPartTypeEnum.TURNOUTSUPERSTRUCTURE +userdefined = IfcRailwayPartTypeEnum.USERDEFINED +notdefined = IfcRailwayPartTypeEnum.NOTDEFINED IfcRampFlightTypeEnum = enum_namespace() -straight = express_getattr(IfcRampFlightTypeEnum, 'STRAIGHT', INDETERMINATE) -spiral = express_getattr(IfcRampFlightTypeEnum, 'SPIRAL', INDETERMINATE) -userdefined = express_getattr(IfcRampFlightTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcRampFlightTypeEnum, 'NOTDEFINED', INDETERMINATE) +straight = IfcRampFlightTypeEnum.STRAIGHT +spiral = IfcRampFlightTypeEnum.SPIRAL +userdefined = IfcRampFlightTypeEnum.USERDEFINED +notdefined = IfcRampFlightTypeEnum.NOTDEFINED IfcRampTypeEnum = enum_namespace() -straight_run_ramp = express_getattr(IfcRampTypeEnum, 'STRAIGHT_RUN_RAMP', INDETERMINATE) -two_straight_run_ramp = express_getattr(IfcRampTypeEnum, 'TWO_STRAIGHT_RUN_RAMP', INDETERMINATE) -quarter_turn_ramp = express_getattr(IfcRampTypeEnum, 'QUARTER_TURN_RAMP', INDETERMINATE) -two_quarter_turn_ramp = express_getattr(IfcRampTypeEnum, 'TWO_QUARTER_TURN_RAMP', INDETERMINATE) -half_turn_ramp = express_getattr(IfcRampTypeEnum, 'HALF_TURN_RAMP', INDETERMINATE) -spiral_ramp = express_getattr(IfcRampTypeEnum, 'SPIRAL_RAMP', INDETERMINATE) -userdefined = express_getattr(IfcRampTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcRampTypeEnum, 'NOTDEFINED', INDETERMINATE) +straight_run_ramp = IfcRampTypeEnum.STRAIGHT_RUN_RAMP +two_straight_run_ramp = IfcRampTypeEnum.TWO_STRAIGHT_RUN_RAMP +quarter_turn_ramp = IfcRampTypeEnum.QUARTER_TURN_RAMP +two_quarter_turn_ramp = IfcRampTypeEnum.TWO_QUARTER_TURN_RAMP +half_turn_ramp = IfcRampTypeEnum.HALF_TURN_RAMP +spiral_ramp = IfcRampTypeEnum.SPIRAL_RAMP +userdefined = IfcRampTypeEnum.USERDEFINED +notdefined = IfcRampTypeEnum.NOTDEFINED IfcRecurrenceTypeEnum = enum_namespace() -daily = express_getattr(IfcRecurrenceTypeEnum, 'DAILY', INDETERMINATE) -weekly = express_getattr(IfcRecurrenceTypeEnum, 'WEEKLY', INDETERMINATE) -monthly_by_day_of_month = express_getattr(IfcRecurrenceTypeEnum, 'MONTHLY_BY_DAY_OF_MONTH', INDETERMINATE) -monthly_by_position = express_getattr(IfcRecurrenceTypeEnum, 'MONTHLY_BY_POSITION', INDETERMINATE) -by_day_count = express_getattr(IfcRecurrenceTypeEnum, 'BY_DAY_COUNT', INDETERMINATE) -by_weekday_count = express_getattr(IfcRecurrenceTypeEnum, 'BY_WEEKDAY_COUNT', INDETERMINATE) -yearly_by_day_of_month = express_getattr(IfcRecurrenceTypeEnum, 'YEARLY_BY_DAY_OF_MONTH', INDETERMINATE) -yearly_by_position = express_getattr(IfcRecurrenceTypeEnum, 'YEARLY_BY_POSITION', INDETERMINATE) +daily = IfcRecurrenceTypeEnum.DAILY +weekly = IfcRecurrenceTypeEnum.WEEKLY +monthly_by_day_of_month = IfcRecurrenceTypeEnum.MONTHLY_BY_DAY_OF_MONTH +monthly_by_position = IfcRecurrenceTypeEnum.MONTHLY_BY_POSITION +by_day_count = IfcRecurrenceTypeEnum.BY_DAY_COUNT +by_weekday_count = IfcRecurrenceTypeEnum.BY_WEEKDAY_COUNT +yearly_by_day_of_month = IfcRecurrenceTypeEnum.YEARLY_BY_DAY_OF_MONTH +yearly_by_position = IfcRecurrenceTypeEnum.YEARLY_BY_POSITION IfcReferentTypeEnum = enum_namespace() -kilopoint = express_getattr(IfcReferentTypeEnum, 'KILOPOINT', INDETERMINATE) -milepoint = express_getattr(IfcReferentTypeEnum, 'MILEPOINT', INDETERMINATE) -station = express_getattr(IfcReferentTypeEnum, 'STATION', INDETERMINATE) -referencemarker = express_getattr(IfcReferentTypeEnum, 'REFERENCEMARKER', INDETERMINATE) -userdefined = express_getattr(IfcReferentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcReferentTypeEnum, 'NOTDEFINED', INDETERMINATE) +kilopoint = IfcReferentTypeEnum.KILOPOINT +milepoint = IfcReferentTypeEnum.MILEPOINT +station = IfcReferentTypeEnum.STATION +referencemarker = IfcReferentTypeEnum.REFERENCEMARKER +userdefined = IfcReferentTypeEnum.USERDEFINED +notdefined = IfcReferentTypeEnum.NOTDEFINED IfcReflectanceMethodEnum = enum_namespace() -blinn = express_getattr(IfcReflectanceMethodEnum, 'BLINN', INDETERMINATE) -flat = express_getattr(IfcReflectanceMethodEnum, 'FLAT', INDETERMINATE) -glass = express_getattr(IfcReflectanceMethodEnum, 'GLASS', INDETERMINATE) -matt = express_getattr(IfcReflectanceMethodEnum, 'MATT', INDETERMINATE) -metal = express_getattr(IfcReflectanceMethodEnum, 'METAL', INDETERMINATE) -mirror = express_getattr(IfcReflectanceMethodEnum, 'MIRROR', INDETERMINATE) -phong = express_getattr(IfcReflectanceMethodEnum, 'PHONG', INDETERMINATE) -plastic = express_getattr(IfcReflectanceMethodEnum, 'PLASTIC', INDETERMINATE) -strauss = express_getattr(IfcReflectanceMethodEnum, 'STRAUSS', INDETERMINATE) -notdefined = express_getattr(IfcReflectanceMethodEnum, 'NOTDEFINED', INDETERMINATE) +blinn = IfcReflectanceMethodEnum.BLINN +flat = IfcReflectanceMethodEnum.FLAT +glass = IfcReflectanceMethodEnum.GLASS +matt = IfcReflectanceMethodEnum.MATT +metal = IfcReflectanceMethodEnum.METAL +mirror = IfcReflectanceMethodEnum.MIRROR +phong = IfcReflectanceMethodEnum.PHONG +plastic = IfcReflectanceMethodEnum.PLASTIC +strauss = IfcReflectanceMethodEnum.STRAUSS +notdefined = IfcReflectanceMethodEnum.NOTDEFINED IfcReinforcedSoilTypeEnum = enum_namespace() -surchargepreloaded = express_getattr(IfcReinforcedSoilTypeEnum, 'SURCHARGEPRELOADED', INDETERMINATE) -verticallydrained = express_getattr(IfcReinforcedSoilTypeEnum, 'VERTICALLYDRAINED', INDETERMINATE) -dynamicallycompacted = express_getattr(IfcReinforcedSoilTypeEnum, 'DYNAMICALLYCOMPACTED', INDETERMINATE) -replaced = express_getattr(IfcReinforcedSoilTypeEnum, 'REPLACED', INDETERMINATE) -rollercompacted = express_getattr(IfcReinforcedSoilTypeEnum, 'ROLLERCOMPACTED', INDETERMINATE) -grouted = express_getattr(IfcReinforcedSoilTypeEnum, 'GROUTED', INDETERMINATE) -userdefined = express_getattr(IfcReinforcedSoilTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcReinforcedSoilTypeEnum, 'NOTDEFINED', INDETERMINATE) +surchargepreloaded = IfcReinforcedSoilTypeEnum.SURCHARGEPRELOADED +verticallydrained = IfcReinforcedSoilTypeEnum.VERTICALLYDRAINED +dynamicallycompacted = IfcReinforcedSoilTypeEnum.DYNAMICALLYCOMPACTED +replaced = IfcReinforcedSoilTypeEnum.REPLACED +rollercompacted = IfcReinforcedSoilTypeEnum.ROLLERCOMPACTED +grouted = IfcReinforcedSoilTypeEnum.GROUTED +userdefined = IfcReinforcedSoilTypeEnum.USERDEFINED +notdefined = IfcReinforcedSoilTypeEnum.NOTDEFINED IfcReinforcingBarRoleEnum = enum_namespace() -main = express_getattr(IfcReinforcingBarRoleEnum, 'MAIN', INDETERMINATE) -shear = express_getattr(IfcReinforcingBarRoleEnum, 'SHEAR', INDETERMINATE) -ligature = express_getattr(IfcReinforcingBarRoleEnum, 'LIGATURE', INDETERMINATE) -stud = express_getattr(IfcReinforcingBarRoleEnum, 'STUD', INDETERMINATE) -punching = express_getattr(IfcReinforcingBarRoleEnum, 'PUNCHING', INDETERMINATE) -edge = express_getattr(IfcReinforcingBarRoleEnum, 'EDGE', INDETERMINATE) -ring = express_getattr(IfcReinforcingBarRoleEnum, 'RING', INDETERMINATE) -anchoring = express_getattr(IfcReinforcingBarRoleEnum, 'ANCHORING', INDETERMINATE) -userdefined = express_getattr(IfcReinforcingBarRoleEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcReinforcingBarRoleEnum, 'NOTDEFINED', INDETERMINATE) +main = IfcReinforcingBarRoleEnum.MAIN +shear = IfcReinforcingBarRoleEnum.SHEAR +ligature = IfcReinforcingBarRoleEnum.LIGATURE +stud = IfcReinforcingBarRoleEnum.STUD +punching = IfcReinforcingBarRoleEnum.PUNCHING +edge = IfcReinforcingBarRoleEnum.EDGE +ring = IfcReinforcingBarRoleEnum.RING +anchoring = IfcReinforcingBarRoleEnum.ANCHORING +userdefined = IfcReinforcingBarRoleEnum.USERDEFINED +notdefined = IfcReinforcingBarRoleEnum.NOTDEFINED IfcReinforcingBarSurfaceEnum = enum_namespace() -plain = express_getattr(IfcReinforcingBarSurfaceEnum, 'PLAIN', INDETERMINATE) -textured = express_getattr(IfcReinforcingBarSurfaceEnum, 'TEXTURED', INDETERMINATE) +plain = IfcReinforcingBarSurfaceEnum.PLAIN +textured = IfcReinforcingBarSurfaceEnum.TEXTURED IfcReinforcingBarTypeEnum = enum_namespace() -anchoring = express_getattr(IfcReinforcingBarTypeEnum, 'ANCHORING', INDETERMINATE) -edge = express_getattr(IfcReinforcingBarTypeEnum, 'EDGE', INDETERMINATE) -ligature = express_getattr(IfcReinforcingBarTypeEnum, 'LIGATURE', INDETERMINATE) -main = express_getattr(IfcReinforcingBarTypeEnum, 'MAIN', INDETERMINATE) -punching = express_getattr(IfcReinforcingBarTypeEnum, 'PUNCHING', INDETERMINATE) -ring = express_getattr(IfcReinforcingBarTypeEnum, 'RING', INDETERMINATE) -shear = express_getattr(IfcReinforcingBarTypeEnum, 'SHEAR', INDETERMINATE) -stud = express_getattr(IfcReinforcingBarTypeEnum, 'STUD', INDETERMINATE) -spacebar = express_getattr(IfcReinforcingBarTypeEnum, 'SPACEBAR', INDETERMINATE) -userdefined = express_getattr(IfcReinforcingBarTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcReinforcingBarTypeEnum, 'NOTDEFINED', INDETERMINATE) +anchoring = IfcReinforcingBarTypeEnum.ANCHORING +edge = IfcReinforcingBarTypeEnum.EDGE +ligature = IfcReinforcingBarTypeEnum.LIGATURE +main = IfcReinforcingBarTypeEnum.MAIN +punching = IfcReinforcingBarTypeEnum.PUNCHING +ring = IfcReinforcingBarTypeEnum.RING +shear = IfcReinforcingBarTypeEnum.SHEAR +stud = IfcReinforcingBarTypeEnum.STUD +spacebar = IfcReinforcingBarTypeEnum.SPACEBAR +userdefined = IfcReinforcingBarTypeEnum.USERDEFINED +notdefined = IfcReinforcingBarTypeEnum.NOTDEFINED IfcReinforcingMeshTypeEnum = enum_namespace() -userdefined = express_getattr(IfcReinforcingMeshTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcReinforcingMeshTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcReinforcingMeshTypeEnum.USERDEFINED +notdefined = IfcReinforcingMeshTypeEnum.NOTDEFINED IfcRoadPartTypeEnum = enum_namespace() -roadsidepart = express_getattr(IfcRoadPartTypeEnum, 'ROADSIDEPART', INDETERMINATE) -bus_stop = express_getattr(IfcRoadPartTypeEnum, 'BUS_STOP', INDETERMINATE) -hardshoulder = express_getattr(IfcRoadPartTypeEnum, 'HARDSHOULDER', INDETERMINATE) -intersection = express_getattr(IfcRoadPartTypeEnum, 'INTERSECTION', INDETERMINATE) -passingbay = express_getattr(IfcRoadPartTypeEnum, 'PASSINGBAY', INDETERMINATE) -roadwayplateau = express_getattr(IfcRoadPartTypeEnum, 'ROADWAYPLATEAU', INDETERMINATE) -roadside = express_getattr(IfcRoadPartTypeEnum, 'ROADSIDE', INDETERMINATE) -refugeisland = express_getattr(IfcRoadPartTypeEnum, 'REFUGEISLAND', INDETERMINATE) -tollplaza = express_getattr(IfcRoadPartTypeEnum, 'TOLLPLAZA', INDETERMINATE) -centralreserve = express_getattr(IfcRoadPartTypeEnum, 'CENTRALRESERVE', INDETERMINATE) -sidewalk = express_getattr(IfcRoadPartTypeEnum, 'SIDEWALK', INDETERMINATE) -parkingbay = express_getattr(IfcRoadPartTypeEnum, 'PARKINGBAY', INDETERMINATE) -railwaycrossing = express_getattr(IfcRoadPartTypeEnum, 'RAILWAYCROSSING', INDETERMINATE) -pedestrian_crossing = express_getattr(IfcRoadPartTypeEnum, 'PEDESTRIAN_CROSSING', INDETERMINATE) -softshoulder = express_getattr(IfcRoadPartTypeEnum, 'SOFTSHOULDER', INDETERMINATE) -bicyclecrossing = express_getattr(IfcRoadPartTypeEnum, 'BICYCLECROSSING', INDETERMINATE) -centralisland = express_getattr(IfcRoadPartTypeEnum, 'CENTRALISLAND', INDETERMINATE) -shoulder = express_getattr(IfcRoadPartTypeEnum, 'SHOULDER', INDETERMINATE) -trafficlane = express_getattr(IfcRoadPartTypeEnum, 'TRAFFICLANE', INDETERMINATE) -roadsegment = express_getattr(IfcRoadPartTypeEnum, 'ROADSEGMENT', INDETERMINATE) -roundabout = express_getattr(IfcRoadPartTypeEnum, 'ROUNDABOUT', INDETERMINATE) -layby = express_getattr(IfcRoadPartTypeEnum, 'LAYBY', INDETERMINATE) -carriageway = express_getattr(IfcRoadPartTypeEnum, 'CARRIAGEWAY', INDETERMINATE) -trafficisland = express_getattr(IfcRoadPartTypeEnum, 'TRAFFICISLAND', INDETERMINATE) -userdefined = express_getattr(IfcRoadPartTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcRoadPartTypeEnum, 'NOTDEFINED', INDETERMINATE) +roadsidepart = IfcRoadPartTypeEnum.ROADSIDEPART +bus_stop = IfcRoadPartTypeEnum.BUS_STOP +hardshoulder = IfcRoadPartTypeEnum.HARDSHOULDER +intersection = IfcRoadPartTypeEnum.INTERSECTION +passingbay = IfcRoadPartTypeEnum.PASSINGBAY +roadwayplateau = IfcRoadPartTypeEnum.ROADWAYPLATEAU +roadside = IfcRoadPartTypeEnum.ROADSIDE +refugeisland = IfcRoadPartTypeEnum.REFUGEISLAND +tollplaza = IfcRoadPartTypeEnum.TOLLPLAZA +centralreserve = IfcRoadPartTypeEnum.CENTRALRESERVE +sidewalk = IfcRoadPartTypeEnum.SIDEWALK +parkingbay = IfcRoadPartTypeEnum.PARKINGBAY +railwaycrossing = IfcRoadPartTypeEnum.RAILWAYCROSSING +pedestrian_crossing = IfcRoadPartTypeEnum.PEDESTRIAN_CROSSING +softshoulder = IfcRoadPartTypeEnum.SOFTSHOULDER +bicyclecrossing = IfcRoadPartTypeEnum.BICYCLECROSSING +centralisland = IfcRoadPartTypeEnum.CENTRALISLAND +shoulder = IfcRoadPartTypeEnum.SHOULDER +trafficlane = IfcRoadPartTypeEnum.TRAFFICLANE +roadsegment = IfcRoadPartTypeEnum.ROADSEGMENT +roundabout = IfcRoadPartTypeEnum.ROUNDABOUT +layby = IfcRoadPartTypeEnum.LAYBY +carriageway = IfcRoadPartTypeEnum.CARRIAGEWAY +trafficisland = IfcRoadPartTypeEnum.TRAFFICISLAND +userdefined = IfcRoadPartTypeEnum.USERDEFINED +notdefined = IfcRoadPartTypeEnum.NOTDEFINED IfcRoleEnum = enum_namespace() -supplier = express_getattr(IfcRoleEnum, 'SUPPLIER', INDETERMINATE) -manufacturer = express_getattr(IfcRoleEnum, 'MANUFACTURER', INDETERMINATE) -contractor = express_getattr(IfcRoleEnum, 'CONTRACTOR', INDETERMINATE) -subcontractor = express_getattr(IfcRoleEnum, 'SUBCONTRACTOR', INDETERMINATE) -architect = express_getattr(IfcRoleEnum, 'ARCHITECT', INDETERMINATE) -structuralengineer = express_getattr(IfcRoleEnum, 'STRUCTURALENGINEER', INDETERMINATE) -costengineer = express_getattr(IfcRoleEnum, 'COSTENGINEER', INDETERMINATE) -client = express_getattr(IfcRoleEnum, 'CLIENT', INDETERMINATE) -buildingowner = express_getattr(IfcRoleEnum, 'BUILDINGOWNER', INDETERMINATE) -buildingoperator = express_getattr(IfcRoleEnum, 'BUILDINGOPERATOR', INDETERMINATE) -mechanicalengineer = express_getattr(IfcRoleEnum, 'MECHANICALENGINEER', INDETERMINATE) -electricalengineer = express_getattr(IfcRoleEnum, 'ELECTRICALENGINEER', INDETERMINATE) -projectmanager = express_getattr(IfcRoleEnum, 'PROJECTMANAGER', INDETERMINATE) -facilitiesmanager = express_getattr(IfcRoleEnum, 'FACILITIESMANAGER', INDETERMINATE) -civilengineer = express_getattr(IfcRoleEnum, 'CIVILENGINEER', INDETERMINATE) -commissioningengineer = express_getattr(IfcRoleEnum, 'COMMISSIONINGENGINEER', INDETERMINATE) -engineer = express_getattr(IfcRoleEnum, 'ENGINEER', INDETERMINATE) -owner = express_getattr(IfcRoleEnum, 'OWNER', INDETERMINATE) -consultant = express_getattr(IfcRoleEnum, 'CONSULTANT', INDETERMINATE) -constructionmanager = express_getattr(IfcRoleEnum, 'CONSTRUCTIONMANAGER', INDETERMINATE) -fieldconstructionmanager = express_getattr(IfcRoleEnum, 'FIELDCONSTRUCTIONMANAGER', INDETERMINATE) -reseller = express_getattr(IfcRoleEnum, 'RESELLER', INDETERMINATE) -userdefined = express_getattr(IfcRoleEnum, 'USERDEFINED', INDETERMINATE) +supplier = IfcRoleEnum.SUPPLIER +manufacturer = IfcRoleEnum.MANUFACTURER +contractor = IfcRoleEnum.CONTRACTOR +subcontractor = IfcRoleEnum.SUBCONTRACTOR +architect = IfcRoleEnum.ARCHITECT +structuralengineer = IfcRoleEnum.STRUCTURALENGINEER +costengineer = IfcRoleEnum.COSTENGINEER +client = IfcRoleEnum.CLIENT +buildingowner = IfcRoleEnum.BUILDINGOWNER +buildingoperator = IfcRoleEnum.BUILDINGOPERATOR +mechanicalengineer = IfcRoleEnum.MECHANICALENGINEER +electricalengineer = IfcRoleEnum.ELECTRICALENGINEER +projectmanager = IfcRoleEnum.PROJECTMANAGER +facilitiesmanager = IfcRoleEnum.FACILITIESMANAGER +civilengineer = IfcRoleEnum.CIVILENGINEER +commissioningengineer = IfcRoleEnum.COMMISSIONINGENGINEER +engineer = IfcRoleEnum.ENGINEER +owner = IfcRoleEnum.OWNER +consultant = IfcRoleEnum.CONSULTANT +constructionmanager = IfcRoleEnum.CONSTRUCTIONMANAGER +fieldconstructionmanager = IfcRoleEnum.FIELDCONSTRUCTIONMANAGER +reseller = IfcRoleEnum.RESELLER +userdefined = IfcRoleEnum.USERDEFINED IfcRoofTypeEnum = enum_namespace() -flat_roof = express_getattr(IfcRoofTypeEnum, 'FLAT_ROOF', INDETERMINATE) -shed_roof = express_getattr(IfcRoofTypeEnum, 'SHED_ROOF', INDETERMINATE) -gable_roof = express_getattr(IfcRoofTypeEnum, 'GABLE_ROOF', INDETERMINATE) -hip_roof = express_getattr(IfcRoofTypeEnum, 'HIP_ROOF', INDETERMINATE) -hipped_gable_roof = express_getattr(IfcRoofTypeEnum, 'HIPPED_GABLE_ROOF', INDETERMINATE) -gambrel_roof = express_getattr(IfcRoofTypeEnum, 'GAMBREL_ROOF', INDETERMINATE) -mansard_roof = express_getattr(IfcRoofTypeEnum, 'MANSARD_ROOF', INDETERMINATE) -barrel_roof = express_getattr(IfcRoofTypeEnum, 'BARREL_ROOF', INDETERMINATE) -rainbow_roof = express_getattr(IfcRoofTypeEnum, 'RAINBOW_ROOF', INDETERMINATE) -butterfly_roof = express_getattr(IfcRoofTypeEnum, 'BUTTERFLY_ROOF', INDETERMINATE) -pavilion_roof = express_getattr(IfcRoofTypeEnum, 'PAVILION_ROOF', INDETERMINATE) -dome_roof = express_getattr(IfcRoofTypeEnum, 'DOME_ROOF', INDETERMINATE) -freeform = express_getattr(IfcRoofTypeEnum, 'FREEFORM', INDETERMINATE) -userdefined = express_getattr(IfcRoofTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcRoofTypeEnum, 'NOTDEFINED', INDETERMINATE) +flat_roof = IfcRoofTypeEnum.FLAT_ROOF +shed_roof = IfcRoofTypeEnum.SHED_ROOF +gable_roof = IfcRoofTypeEnum.GABLE_ROOF +hip_roof = IfcRoofTypeEnum.HIP_ROOF +hipped_gable_roof = IfcRoofTypeEnum.HIPPED_GABLE_ROOF +gambrel_roof = IfcRoofTypeEnum.GAMBREL_ROOF +mansard_roof = IfcRoofTypeEnum.MANSARD_ROOF +barrel_roof = IfcRoofTypeEnum.BARREL_ROOF +rainbow_roof = IfcRoofTypeEnum.RAINBOW_ROOF +butterfly_roof = IfcRoofTypeEnum.BUTTERFLY_ROOF +pavilion_roof = IfcRoofTypeEnum.PAVILION_ROOF +dome_roof = IfcRoofTypeEnum.DOME_ROOF +freeform = IfcRoofTypeEnum.FREEFORM +userdefined = IfcRoofTypeEnum.USERDEFINED +notdefined = IfcRoofTypeEnum.NOTDEFINED IfcSIPrefix = enum_namespace() -exa = express_getattr(IfcSIPrefix, 'EXA', INDETERMINATE) -peta = express_getattr(IfcSIPrefix, 'PETA', INDETERMINATE) -tera = express_getattr(IfcSIPrefix, 'TERA', INDETERMINATE) -giga = express_getattr(IfcSIPrefix, 'GIGA', INDETERMINATE) -mega = express_getattr(IfcSIPrefix, 'MEGA', INDETERMINATE) -kilo = express_getattr(IfcSIPrefix, 'KILO', INDETERMINATE) -hecto = express_getattr(IfcSIPrefix, 'HECTO', INDETERMINATE) -deca = express_getattr(IfcSIPrefix, 'DECA', INDETERMINATE) -deci = express_getattr(IfcSIPrefix, 'DECI', INDETERMINATE) -centi = express_getattr(IfcSIPrefix, 'CENTI', INDETERMINATE) -milli = express_getattr(IfcSIPrefix, 'MILLI', INDETERMINATE) -micro = express_getattr(IfcSIPrefix, 'MICRO', INDETERMINATE) -nano = express_getattr(IfcSIPrefix, 'NANO', INDETERMINATE) -pico = express_getattr(IfcSIPrefix, 'PICO', INDETERMINATE) -femto = express_getattr(IfcSIPrefix, 'FEMTO', INDETERMINATE) -atto = express_getattr(IfcSIPrefix, 'ATTO', INDETERMINATE) +exa = IfcSIPrefix.EXA +peta = IfcSIPrefix.PETA +tera = IfcSIPrefix.TERA +giga = IfcSIPrefix.GIGA +mega = IfcSIPrefix.MEGA +kilo = IfcSIPrefix.KILO +hecto = IfcSIPrefix.HECTO +deca = IfcSIPrefix.DECA +deci = IfcSIPrefix.DECI +centi = IfcSIPrefix.CENTI +milli = IfcSIPrefix.MILLI +micro = IfcSIPrefix.MICRO +nano = IfcSIPrefix.NANO +pico = IfcSIPrefix.PICO +femto = IfcSIPrefix.FEMTO +atto = IfcSIPrefix.ATTO IfcSIUnitName = enum_namespace() -ampere = express_getattr(IfcSIUnitName, 'AMPERE', INDETERMINATE) -becquerel = express_getattr(IfcSIUnitName, 'BECQUEREL', INDETERMINATE) -candela = express_getattr(IfcSIUnitName, 'CANDELA', INDETERMINATE) -coulomb = express_getattr(IfcSIUnitName, 'COULOMB', INDETERMINATE) -cubic_metre = express_getattr(IfcSIUnitName, 'CUBIC_METRE', INDETERMINATE) -degree_celsius = express_getattr(IfcSIUnitName, 'DEGREE_CELSIUS', INDETERMINATE) -farad = express_getattr(IfcSIUnitName, 'FARAD', INDETERMINATE) -gram = express_getattr(IfcSIUnitName, 'GRAM', INDETERMINATE) -gray = express_getattr(IfcSIUnitName, 'GRAY', INDETERMINATE) -henry = express_getattr(IfcSIUnitName, 'HENRY', INDETERMINATE) -hertz = express_getattr(IfcSIUnitName, 'HERTZ', INDETERMINATE) -joule = express_getattr(IfcSIUnitName, 'JOULE', INDETERMINATE) -kelvin = express_getattr(IfcSIUnitName, 'KELVIN', INDETERMINATE) -lumen = express_getattr(IfcSIUnitName, 'LUMEN', INDETERMINATE) -lux = express_getattr(IfcSIUnitName, 'LUX', INDETERMINATE) -metre = express_getattr(IfcSIUnitName, 'METRE', INDETERMINATE) -mole = express_getattr(IfcSIUnitName, 'MOLE', INDETERMINATE) -newton = express_getattr(IfcSIUnitName, 'NEWTON', INDETERMINATE) -ohm = express_getattr(IfcSIUnitName, 'OHM', INDETERMINATE) -pascal = express_getattr(IfcSIUnitName, 'PASCAL', INDETERMINATE) -radian = express_getattr(IfcSIUnitName, 'RADIAN', INDETERMINATE) -second = express_getattr(IfcSIUnitName, 'SECOND', INDETERMINATE) -siemens = express_getattr(IfcSIUnitName, 'SIEMENS', INDETERMINATE) -sievert = express_getattr(IfcSIUnitName, 'SIEVERT', INDETERMINATE) -square_metre = express_getattr(IfcSIUnitName, 'SQUARE_METRE', INDETERMINATE) -steradian = express_getattr(IfcSIUnitName, 'STERADIAN', INDETERMINATE) -tesla = express_getattr(IfcSIUnitName, 'TESLA', INDETERMINATE) -volt = express_getattr(IfcSIUnitName, 'VOLT', INDETERMINATE) -watt = express_getattr(IfcSIUnitName, 'WATT', INDETERMINATE) -weber = express_getattr(IfcSIUnitName, 'WEBER', INDETERMINATE) +ampere = IfcSIUnitName.AMPERE +becquerel = IfcSIUnitName.BECQUEREL +candela = IfcSIUnitName.CANDELA +coulomb = IfcSIUnitName.COULOMB +cubic_metre = IfcSIUnitName.CUBIC_METRE +degree_celsius = IfcSIUnitName.DEGREE_CELSIUS +farad = IfcSIUnitName.FARAD +gram = IfcSIUnitName.GRAM +gray = IfcSIUnitName.GRAY +henry = IfcSIUnitName.HENRY +hertz = IfcSIUnitName.HERTZ +joule = IfcSIUnitName.JOULE +kelvin = IfcSIUnitName.KELVIN +lumen = IfcSIUnitName.LUMEN +lux = IfcSIUnitName.LUX +metre = IfcSIUnitName.METRE +mole = IfcSIUnitName.MOLE +newton = IfcSIUnitName.NEWTON +ohm = IfcSIUnitName.OHM +pascal = IfcSIUnitName.PASCAL +radian = IfcSIUnitName.RADIAN +second = IfcSIUnitName.SECOND +siemens = IfcSIUnitName.SIEMENS +sievert = IfcSIUnitName.SIEVERT +square_metre = IfcSIUnitName.SQUARE_METRE +steradian = IfcSIUnitName.STERADIAN +tesla = IfcSIUnitName.TESLA +volt = IfcSIUnitName.VOLT +watt = IfcSIUnitName.WATT +weber = IfcSIUnitName.WEBER IfcSanitaryTerminalTypeEnum = enum_namespace() -bath = express_getattr(IfcSanitaryTerminalTypeEnum, 'BATH', INDETERMINATE) -bidet = express_getattr(IfcSanitaryTerminalTypeEnum, 'BIDET', INDETERMINATE) -cistern = express_getattr(IfcSanitaryTerminalTypeEnum, 'CISTERN', INDETERMINATE) -shower = express_getattr(IfcSanitaryTerminalTypeEnum, 'SHOWER', INDETERMINATE) -sink = express_getattr(IfcSanitaryTerminalTypeEnum, 'SINK', INDETERMINATE) -sanitaryfountain = express_getattr(IfcSanitaryTerminalTypeEnum, 'SANITARYFOUNTAIN', INDETERMINATE) -toiletpan = express_getattr(IfcSanitaryTerminalTypeEnum, 'TOILETPAN', INDETERMINATE) -urinal = express_getattr(IfcSanitaryTerminalTypeEnum, 'URINAL', INDETERMINATE) -washhandbasin = express_getattr(IfcSanitaryTerminalTypeEnum, 'WASHHANDBASIN', INDETERMINATE) -wcseat = express_getattr(IfcSanitaryTerminalTypeEnum, 'WCSEAT', INDETERMINATE) -userdefined = express_getattr(IfcSanitaryTerminalTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSanitaryTerminalTypeEnum, 'NOTDEFINED', INDETERMINATE) +bath = IfcSanitaryTerminalTypeEnum.BATH +bidet = IfcSanitaryTerminalTypeEnum.BIDET +cistern = IfcSanitaryTerminalTypeEnum.CISTERN +shower = IfcSanitaryTerminalTypeEnum.SHOWER +sink = IfcSanitaryTerminalTypeEnum.SINK +sanitaryfountain = IfcSanitaryTerminalTypeEnum.SANITARYFOUNTAIN +toiletpan = IfcSanitaryTerminalTypeEnum.TOILETPAN +urinal = IfcSanitaryTerminalTypeEnum.URINAL +washhandbasin = IfcSanitaryTerminalTypeEnum.WASHHANDBASIN +wcseat = IfcSanitaryTerminalTypeEnum.WCSEAT +userdefined = IfcSanitaryTerminalTypeEnum.USERDEFINED +notdefined = IfcSanitaryTerminalTypeEnum.NOTDEFINED IfcSectionTypeEnum = enum_namespace() -uniform = express_getattr(IfcSectionTypeEnum, 'UNIFORM', INDETERMINATE) -tapered = express_getattr(IfcSectionTypeEnum, 'TAPERED', INDETERMINATE) +uniform = IfcSectionTypeEnum.UNIFORM +tapered = IfcSectionTypeEnum.TAPERED IfcSensorTypeEnum = enum_namespace() -cosensor = express_getattr(IfcSensorTypeEnum, 'COSENSOR', INDETERMINATE) -co2sensor = express_getattr(IfcSensorTypeEnum, 'CO2SENSOR', INDETERMINATE) -conductancesensor = express_getattr(IfcSensorTypeEnum, 'CONDUCTANCESENSOR', INDETERMINATE) -contactsensor = express_getattr(IfcSensorTypeEnum, 'CONTACTSENSOR', INDETERMINATE) -firesensor = express_getattr(IfcSensorTypeEnum, 'FIRESENSOR', INDETERMINATE) -flowsensor = express_getattr(IfcSensorTypeEnum, 'FLOWSENSOR', INDETERMINATE) -frostsensor = express_getattr(IfcSensorTypeEnum, 'FROSTSENSOR', INDETERMINATE) -gassensor = express_getattr(IfcSensorTypeEnum, 'GASSENSOR', INDETERMINATE) -heatsensor = express_getattr(IfcSensorTypeEnum, 'HEATSENSOR', INDETERMINATE) -humiditysensor = express_getattr(IfcSensorTypeEnum, 'HUMIDITYSENSOR', INDETERMINATE) -identifiersensor = express_getattr(IfcSensorTypeEnum, 'IDENTIFIERSENSOR', INDETERMINATE) -ionconcentrationsensor = express_getattr(IfcSensorTypeEnum, 'IONCONCENTRATIONSENSOR', INDETERMINATE) -levelsensor = express_getattr(IfcSensorTypeEnum, 'LEVELSENSOR', INDETERMINATE) -lightsensor = express_getattr(IfcSensorTypeEnum, 'LIGHTSENSOR', INDETERMINATE) -moisturesensor = express_getattr(IfcSensorTypeEnum, 'MOISTURESENSOR', INDETERMINATE) -movementsensor = express_getattr(IfcSensorTypeEnum, 'MOVEMENTSENSOR', INDETERMINATE) -phsensor = express_getattr(IfcSensorTypeEnum, 'PHSENSOR', INDETERMINATE) -pressuresensor = express_getattr(IfcSensorTypeEnum, 'PRESSURESENSOR', INDETERMINATE) -radiationsensor = express_getattr(IfcSensorTypeEnum, 'RADIATIONSENSOR', INDETERMINATE) -radioactivitysensor = express_getattr(IfcSensorTypeEnum, 'RADIOACTIVITYSENSOR', INDETERMINATE) -smokesensor = express_getattr(IfcSensorTypeEnum, 'SMOKESENSOR', INDETERMINATE) -soundsensor = express_getattr(IfcSensorTypeEnum, 'SOUNDSENSOR', INDETERMINATE) -temperaturesensor = express_getattr(IfcSensorTypeEnum, 'TEMPERATURESENSOR', INDETERMINATE) -windsensor = express_getattr(IfcSensorTypeEnum, 'WINDSENSOR', INDETERMINATE) -earthquakesensor = express_getattr(IfcSensorTypeEnum, 'EARTHQUAKESENSOR', INDETERMINATE) -foreignobjectdetectionsensor = express_getattr(IfcSensorTypeEnum, 'FOREIGNOBJECTDETECTIONSENSOR', INDETERMINATE) -obstaclesensor = express_getattr(IfcSensorTypeEnum, 'OBSTACLESENSOR', INDETERMINATE) -rainsensor = express_getattr(IfcSensorTypeEnum, 'RAINSENSOR', INDETERMINATE) -snowdepthsensor = express_getattr(IfcSensorTypeEnum, 'SNOWDEPTHSENSOR', INDETERMINATE) -trainsensor = express_getattr(IfcSensorTypeEnum, 'TRAINSENSOR', INDETERMINATE) -turnoutclosuresensor = express_getattr(IfcSensorTypeEnum, 'TURNOUTCLOSURESENSOR', INDETERMINATE) -wheelsensor = express_getattr(IfcSensorTypeEnum, 'WHEELSENSOR', INDETERMINATE) -userdefined = express_getattr(IfcSensorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSensorTypeEnum, 'NOTDEFINED', INDETERMINATE) +cosensor = IfcSensorTypeEnum.COSENSOR +co2sensor = IfcSensorTypeEnum.CO2SENSOR +conductancesensor = IfcSensorTypeEnum.CONDUCTANCESENSOR +contactsensor = IfcSensorTypeEnum.CONTACTSENSOR +firesensor = IfcSensorTypeEnum.FIRESENSOR +flowsensor = IfcSensorTypeEnum.FLOWSENSOR +frostsensor = IfcSensorTypeEnum.FROSTSENSOR +gassensor = IfcSensorTypeEnum.GASSENSOR +heatsensor = IfcSensorTypeEnum.HEATSENSOR +humiditysensor = IfcSensorTypeEnum.HUMIDITYSENSOR +identifiersensor = IfcSensorTypeEnum.IDENTIFIERSENSOR +ionconcentrationsensor = IfcSensorTypeEnum.IONCONCENTRATIONSENSOR +levelsensor = IfcSensorTypeEnum.LEVELSENSOR +lightsensor = IfcSensorTypeEnum.LIGHTSENSOR +moisturesensor = IfcSensorTypeEnum.MOISTURESENSOR +movementsensor = IfcSensorTypeEnum.MOVEMENTSENSOR +phsensor = IfcSensorTypeEnum.PHSENSOR +pressuresensor = IfcSensorTypeEnum.PRESSURESENSOR +radiationsensor = IfcSensorTypeEnum.RADIATIONSENSOR +radioactivitysensor = IfcSensorTypeEnum.RADIOACTIVITYSENSOR +smokesensor = IfcSensorTypeEnum.SMOKESENSOR +soundsensor = IfcSensorTypeEnum.SOUNDSENSOR +temperaturesensor = IfcSensorTypeEnum.TEMPERATURESENSOR +windsensor = IfcSensorTypeEnum.WINDSENSOR +earthquakesensor = IfcSensorTypeEnum.EARTHQUAKESENSOR +foreignobjectdetectionsensor = IfcSensorTypeEnum.FOREIGNOBJECTDETECTIONSENSOR +obstaclesensor = IfcSensorTypeEnum.OBSTACLESENSOR +rainsensor = IfcSensorTypeEnum.RAINSENSOR +snowdepthsensor = IfcSensorTypeEnum.SNOWDEPTHSENSOR +trainsensor = IfcSensorTypeEnum.TRAINSENSOR +turnoutclosuresensor = IfcSensorTypeEnum.TURNOUTCLOSURESENSOR +wheelsensor = IfcSensorTypeEnum.WHEELSENSOR +userdefined = IfcSensorTypeEnum.USERDEFINED +notdefined = IfcSensorTypeEnum.NOTDEFINED IfcSequenceEnum = enum_namespace() -start_start = express_getattr(IfcSequenceEnum, 'START_START', INDETERMINATE) -start_finish = express_getattr(IfcSequenceEnum, 'START_FINISH', INDETERMINATE) -finish_start = express_getattr(IfcSequenceEnum, 'FINISH_START', INDETERMINATE) -finish_finish = express_getattr(IfcSequenceEnum, 'FINISH_FINISH', INDETERMINATE) -userdefined = express_getattr(IfcSequenceEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSequenceEnum, 'NOTDEFINED', INDETERMINATE) +start_start = IfcSequenceEnum.START_START +start_finish = IfcSequenceEnum.START_FINISH +finish_start = IfcSequenceEnum.FINISH_START +finish_finish = IfcSequenceEnum.FINISH_FINISH +userdefined = IfcSequenceEnum.USERDEFINED +notdefined = IfcSequenceEnum.NOTDEFINED IfcShadingDeviceTypeEnum = enum_namespace() -jalousie = express_getattr(IfcShadingDeviceTypeEnum, 'JALOUSIE', INDETERMINATE) -shutter = express_getattr(IfcShadingDeviceTypeEnum, 'SHUTTER', INDETERMINATE) -awning = express_getattr(IfcShadingDeviceTypeEnum, 'AWNING', INDETERMINATE) -userdefined = express_getattr(IfcShadingDeviceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcShadingDeviceTypeEnum, 'NOTDEFINED', INDETERMINATE) +jalousie = IfcShadingDeviceTypeEnum.JALOUSIE +shutter = IfcShadingDeviceTypeEnum.SHUTTER +awning = IfcShadingDeviceTypeEnum.AWNING +userdefined = IfcShadingDeviceTypeEnum.USERDEFINED +notdefined = IfcShadingDeviceTypeEnum.NOTDEFINED IfcSignTypeEnum = enum_namespace() -marker = express_getattr(IfcSignTypeEnum, 'MARKER', INDETERMINATE) -pictoral = express_getattr(IfcSignTypeEnum, 'PICTORAL', INDETERMINATE) -mirror = express_getattr(IfcSignTypeEnum, 'MIRROR', INDETERMINATE) -userdefined = express_getattr(IfcSignTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSignTypeEnum, 'NOTDEFINED', INDETERMINATE) +marker = IfcSignTypeEnum.MARKER +pictoral = IfcSignTypeEnum.PICTORAL +mirror = IfcSignTypeEnum.MIRROR +userdefined = IfcSignTypeEnum.USERDEFINED +notdefined = IfcSignTypeEnum.NOTDEFINED IfcSignalTypeEnum = enum_namespace() -visual = express_getattr(IfcSignalTypeEnum, 'VISUAL', INDETERMINATE) -audio = express_getattr(IfcSignalTypeEnum, 'AUDIO', INDETERMINATE) -mixed = express_getattr(IfcSignalTypeEnum, 'MIXED', INDETERMINATE) -userdefined = express_getattr(IfcSignalTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSignalTypeEnum, 'NOTDEFINED', INDETERMINATE) +visual = IfcSignalTypeEnum.VISUAL +audio = IfcSignalTypeEnum.AUDIO +mixed = IfcSignalTypeEnum.MIXED +userdefined = IfcSignalTypeEnum.USERDEFINED +notdefined = IfcSignalTypeEnum.NOTDEFINED IfcSimplePropertyTemplateTypeEnum = enum_namespace() -p_singlevalue = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'P_SINGLEVALUE', INDETERMINATE) -p_enumeratedvalue = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'P_ENUMERATEDVALUE', INDETERMINATE) -p_boundedvalue = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'P_BOUNDEDVALUE', INDETERMINATE) -p_listvalue = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'P_LISTVALUE', INDETERMINATE) -p_tablevalue = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'P_TABLEVALUE', INDETERMINATE) -p_referencevalue = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'P_REFERENCEVALUE', INDETERMINATE) -q_length = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'Q_LENGTH', INDETERMINATE) -q_area = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'Q_AREA', INDETERMINATE) -q_volume = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'Q_VOLUME', INDETERMINATE) -q_count = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'Q_COUNT', INDETERMINATE) -q_weight = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'Q_WEIGHT', INDETERMINATE) -q_time = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'Q_TIME', INDETERMINATE) +p_singlevalue = IfcSimplePropertyTemplateTypeEnum.P_SINGLEVALUE +p_enumeratedvalue = IfcSimplePropertyTemplateTypeEnum.P_ENUMERATEDVALUE +p_boundedvalue = IfcSimplePropertyTemplateTypeEnum.P_BOUNDEDVALUE +p_listvalue = IfcSimplePropertyTemplateTypeEnum.P_LISTVALUE +p_tablevalue = IfcSimplePropertyTemplateTypeEnum.P_TABLEVALUE +p_referencevalue = IfcSimplePropertyTemplateTypeEnum.P_REFERENCEVALUE +q_length = IfcSimplePropertyTemplateTypeEnum.Q_LENGTH +q_area = IfcSimplePropertyTemplateTypeEnum.Q_AREA +q_volume = IfcSimplePropertyTemplateTypeEnum.Q_VOLUME +q_count = IfcSimplePropertyTemplateTypeEnum.Q_COUNT +q_weight = IfcSimplePropertyTemplateTypeEnum.Q_WEIGHT +q_time = IfcSimplePropertyTemplateTypeEnum.Q_TIME IfcSlabTypeEnum = enum_namespace() -floor = express_getattr(IfcSlabTypeEnum, 'FLOOR', INDETERMINATE) -roof = express_getattr(IfcSlabTypeEnum, 'ROOF', INDETERMINATE) -landing = express_getattr(IfcSlabTypeEnum, 'LANDING', INDETERMINATE) -baseslab = express_getattr(IfcSlabTypeEnum, 'BASESLAB', INDETERMINATE) -approach_slab = express_getattr(IfcSlabTypeEnum, 'APPROACH_SLAB', INDETERMINATE) -paving = express_getattr(IfcSlabTypeEnum, 'PAVING', INDETERMINATE) -wearing = express_getattr(IfcSlabTypeEnum, 'WEARING', INDETERMINATE) -sidewalk = express_getattr(IfcSlabTypeEnum, 'SIDEWALK', INDETERMINATE) -trackslab = express_getattr(IfcSlabTypeEnum, 'TRACKSLAB', INDETERMINATE) -userdefined = express_getattr(IfcSlabTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSlabTypeEnum, 'NOTDEFINED', INDETERMINATE) +floor = IfcSlabTypeEnum.FLOOR +roof = IfcSlabTypeEnum.ROOF +landing = IfcSlabTypeEnum.LANDING +baseslab = IfcSlabTypeEnum.BASESLAB +approach_slab = IfcSlabTypeEnum.APPROACH_SLAB +paving = IfcSlabTypeEnum.PAVING +wearing = IfcSlabTypeEnum.WEARING +sidewalk = IfcSlabTypeEnum.SIDEWALK +trackslab = IfcSlabTypeEnum.TRACKSLAB +userdefined = IfcSlabTypeEnum.USERDEFINED +notdefined = IfcSlabTypeEnum.NOTDEFINED IfcSolarDeviceTypeEnum = enum_namespace() -solarcollector = express_getattr(IfcSolarDeviceTypeEnum, 'SOLARCOLLECTOR', INDETERMINATE) -solarpanel = express_getattr(IfcSolarDeviceTypeEnum, 'SOLARPANEL', INDETERMINATE) -userdefined = express_getattr(IfcSolarDeviceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSolarDeviceTypeEnum, 'NOTDEFINED', INDETERMINATE) +solarcollector = IfcSolarDeviceTypeEnum.SOLARCOLLECTOR +solarpanel = IfcSolarDeviceTypeEnum.SOLARPANEL +userdefined = IfcSolarDeviceTypeEnum.USERDEFINED +notdefined = IfcSolarDeviceTypeEnum.NOTDEFINED IfcSpaceHeaterTypeEnum = enum_namespace() -convector = express_getattr(IfcSpaceHeaterTypeEnum, 'CONVECTOR', INDETERMINATE) -radiator = express_getattr(IfcSpaceHeaterTypeEnum, 'RADIATOR', INDETERMINATE) -userdefined = express_getattr(IfcSpaceHeaterTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSpaceHeaterTypeEnum, 'NOTDEFINED', INDETERMINATE) +convector = IfcSpaceHeaterTypeEnum.CONVECTOR +radiator = IfcSpaceHeaterTypeEnum.RADIATOR +userdefined = IfcSpaceHeaterTypeEnum.USERDEFINED +notdefined = IfcSpaceHeaterTypeEnum.NOTDEFINED IfcSpaceTypeEnum = enum_namespace() -space = express_getattr(IfcSpaceTypeEnum, 'SPACE', INDETERMINATE) -parking = express_getattr(IfcSpaceTypeEnum, 'PARKING', INDETERMINATE) -gfa = express_getattr(IfcSpaceTypeEnum, 'GFA', INDETERMINATE) -internal = express_getattr(IfcSpaceTypeEnum, 'INTERNAL', INDETERMINATE) -external = express_getattr(IfcSpaceTypeEnum, 'EXTERNAL', INDETERMINATE) -userdefined = express_getattr(IfcSpaceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSpaceTypeEnum, 'NOTDEFINED', INDETERMINATE) +space = IfcSpaceTypeEnum.SPACE +parking = IfcSpaceTypeEnum.PARKING +gfa = IfcSpaceTypeEnum.GFA +internal = IfcSpaceTypeEnum.INTERNAL +external = IfcSpaceTypeEnum.EXTERNAL +userdefined = IfcSpaceTypeEnum.USERDEFINED +notdefined = IfcSpaceTypeEnum.NOTDEFINED IfcSpatialZoneTypeEnum = enum_namespace() -construction = express_getattr(IfcSpatialZoneTypeEnum, 'CONSTRUCTION', INDETERMINATE) -firesafety = express_getattr(IfcSpatialZoneTypeEnum, 'FIRESAFETY', INDETERMINATE) -lighting = express_getattr(IfcSpatialZoneTypeEnum, 'LIGHTING', INDETERMINATE) -occupancy = express_getattr(IfcSpatialZoneTypeEnum, 'OCCUPANCY', INDETERMINATE) -security = express_getattr(IfcSpatialZoneTypeEnum, 'SECURITY', INDETERMINATE) -thermal = express_getattr(IfcSpatialZoneTypeEnum, 'THERMAL', INDETERMINATE) -transport = express_getattr(IfcSpatialZoneTypeEnum, 'TRANSPORT', INDETERMINATE) -ventilation = express_getattr(IfcSpatialZoneTypeEnum, 'VENTILATION', INDETERMINATE) -reservation = express_getattr(IfcSpatialZoneTypeEnum, 'RESERVATION', INDETERMINATE) -userdefined = express_getattr(IfcSpatialZoneTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSpatialZoneTypeEnum, 'NOTDEFINED', INDETERMINATE) +construction = IfcSpatialZoneTypeEnum.CONSTRUCTION +firesafety = IfcSpatialZoneTypeEnum.FIRESAFETY +lighting = IfcSpatialZoneTypeEnum.LIGHTING +occupancy = IfcSpatialZoneTypeEnum.OCCUPANCY +security = IfcSpatialZoneTypeEnum.SECURITY +thermal = IfcSpatialZoneTypeEnum.THERMAL +transport = IfcSpatialZoneTypeEnum.TRANSPORT +ventilation = IfcSpatialZoneTypeEnum.VENTILATION +reservation = IfcSpatialZoneTypeEnum.RESERVATION +userdefined = IfcSpatialZoneTypeEnum.USERDEFINED +notdefined = IfcSpatialZoneTypeEnum.NOTDEFINED IfcStackTerminalTypeEnum = enum_namespace() -birdcage = express_getattr(IfcStackTerminalTypeEnum, 'BIRDCAGE', INDETERMINATE) -cowl = express_getattr(IfcStackTerminalTypeEnum, 'COWL', INDETERMINATE) -rainwaterhopper = express_getattr(IfcStackTerminalTypeEnum, 'RAINWATERHOPPER', INDETERMINATE) -userdefined = express_getattr(IfcStackTerminalTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcStackTerminalTypeEnum, 'NOTDEFINED', INDETERMINATE) +birdcage = IfcStackTerminalTypeEnum.BIRDCAGE +cowl = IfcStackTerminalTypeEnum.COWL +rainwaterhopper = IfcStackTerminalTypeEnum.RAINWATERHOPPER +userdefined = IfcStackTerminalTypeEnum.USERDEFINED +notdefined = IfcStackTerminalTypeEnum.NOTDEFINED IfcStairFlightTypeEnum = enum_namespace() -straight = express_getattr(IfcStairFlightTypeEnum, 'STRAIGHT', INDETERMINATE) -winder = express_getattr(IfcStairFlightTypeEnum, 'WINDER', INDETERMINATE) -spiral = express_getattr(IfcStairFlightTypeEnum, 'SPIRAL', INDETERMINATE) -curved = express_getattr(IfcStairFlightTypeEnum, 'CURVED', INDETERMINATE) -freeform = express_getattr(IfcStairFlightTypeEnum, 'FREEFORM', INDETERMINATE) -userdefined = express_getattr(IfcStairFlightTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcStairFlightTypeEnum, 'NOTDEFINED', INDETERMINATE) +straight = IfcStairFlightTypeEnum.STRAIGHT +winder = IfcStairFlightTypeEnum.WINDER +spiral = IfcStairFlightTypeEnum.SPIRAL +curved = IfcStairFlightTypeEnum.CURVED +freeform = IfcStairFlightTypeEnum.FREEFORM +userdefined = IfcStairFlightTypeEnum.USERDEFINED +notdefined = IfcStairFlightTypeEnum.NOTDEFINED IfcStairTypeEnum = enum_namespace() -straight_run_stair = express_getattr(IfcStairTypeEnum, 'STRAIGHT_RUN_STAIR', INDETERMINATE) -two_straight_run_stair = express_getattr(IfcStairTypeEnum, 'TWO_STRAIGHT_RUN_STAIR', INDETERMINATE) -quarter_winding_stair = express_getattr(IfcStairTypeEnum, 'QUARTER_WINDING_STAIR', INDETERMINATE) -quarter_turn_stair = express_getattr(IfcStairTypeEnum, 'QUARTER_TURN_STAIR', INDETERMINATE) -half_winding_stair = express_getattr(IfcStairTypeEnum, 'HALF_WINDING_STAIR', INDETERMINATE) -half_turn_stair = express_getattr(IfcStairTypeEnum, 'HALF_TURN_STAIR', INDETERMINATE) -two_quarter_winding_stair = express_getattr(IfcStairTypeEnum, 'TWO_QUARTER_WINDING_STAIR', INDETERMINATE) -two_quarter_turn_stair = express_getattr(IfcStairTypeEnum, 'TWO_QUARTER_TURN_STAIR', INDETERMINATE) -three_quarter_winding_stair = express_getattr(IfcStairTypeEnum, 'THREE_QUARTER_WINDING_STAIR', INDETERMINATE) -three_quarter_turn_stair = express_getattr(IfcStairTypeEnum, 'THREE_QUARTER_TURN_STAIR', INDETERMINATE) -spiral_stair = express_getattr(IfcStairTypeEnum, 'SPIRAL_STAIR', INDETERMINATE) -double_return_stair = express_getattr(IfcStairTypeEnum, 'DOUBLE_RETURN_STAIR', INDETERMINATE) -curved_run_stair = express_getattr(IfcStairTypeEnum, 'CURVED_RUN_STAIR', INDETERMINATE) -two_curved_run_stair = express_getattr(IfcStairTypeEnum, 'TWO_CURVED_RUN_STAIR', INDETERMINATE) -ladder = express_getattr(IfcStairTypeEnum, 'LADDER', INDETERMINATE) -userdefined = express_getattr(IfcStairTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcStairTypeEnum, 'NOTDEFINED', INDETERMINATE) +straight_run_stair = IfcStairTypeEnum.STRAIGHT_RUN_STAIR +two_straight_run_stair = IfcStairTypeEnum.TWO_STRAIGHT_RUN_STAIR +quarter_winding_stair = IfcStairTypeEnum.QUARTER_WINDING_STAIR +quarter_turn_stair = IfcStairTypeEnum.QUARTER_TURN_STAIR +half_winding_stair = IfcStairTypeEnum.HALF_WINDING_STAIR +half_turn_stair = IfcStairTypeEnum.HALF_TURN_STAIR +two_quarter_winding_stair = IfcStairTypeEnum.TWO_QUARTER_WINDING_STAIR +two_quarter_turn_stair = IfcStairTypeEnum.TWO_QUARTER_TURN_STAIR +three_quarter_winding_stair = IfcStairTypeEnum.THREE_QUARTER_WINDING_STAIR +three_quarter_turn_stair = IfcStairTypeEnum.THREE_QUARTER_TURN_STAIR +spiral_stair = IfcStairTypeEnum.SPIRAL_STAIR +double_return_stair = IfcStairTypeEnum.DOUBLE_RETURN_STAIR +curved_run_stair = IfcStairTypeEnum.CURVED_RUN_STAIR +two_curved_run_stair = IfcStairTypeEnum.TWO_CURVED_RUN_STAIR +ladder = IfcStairTypeEnum.LADDER +userdefined = IfcStairTypeEnum.USERDEFINED +notdefined = IfcStairTypeEnum.NOTDEFINED IfcStateEnum = enum_namespace() -readwrite = express_getattr(IfcStateEnum, 'READWRITE', INDETERMINATE) -readonly = express_getattr(IfcStateEnum, 'READONLY', INDETERMINATE) -locked = express_getattr(IfcStateEnum, 'LOCKED', INDETERMINATE) -readwritelocked = express_getattr(IfcStateEnum, 'READWRITELOCKED', INDETERMINATE) -readonlylocked = express_getattr(IfcStateEnum, 'READONLYLOCKED', INDETERMINATE) +readwrite = IfcStateEnum.READWRITE +readonly = IfcStateEnum.READONLY +locked = IfcStateEnum.LOCKED +readwritelocked = IfcStateEnum.READWRITELOCKED +readonlylocked = IfcStateEnum.READONLYLOCKED IfcStructuralCurveActivityTypeEnum = enum_namespace() -const = express_getattr(IfcStructuralCurveActivityTypeEnum, 'CONST', INDETERMINATE) -linear = express_getattr(IfcStructuralCurveActivityTypeEnum, 'LINEAR', INDETERMINATE) -polygonal = express_getattr(IfcStructuralCurveActivityTypeEnum, 'POLYGONAL', INDETERMINATE) -equidistant = express_getattr(IfcStructuralCurveActivityTypeEnum, 'EQUIDISTANT', INDETERMINATE) -sinus = express_getattr(IfcStructuralCurveActivityTypeEnum, 'SINUS', INDETERMINATE) -parabola = express_getattr(IfcStructuralCurveActivityTypeEnum, 'PARABOLA', INDETERMINATE) -discrete = express_getattr(IfcStructuralCurveActivityTypeEnum, 'DISCRETE', INDETERMINATE) -userdefined = express_getattr(IfcStructuralCurveActivityTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcStructuralCurveActivityTypeEnum, 'NOTDEFINED', INDETERMINATE) +const = IfcStructuralCurveActivityTypeEnum.CONST +linear = IfcStructuralCurveActivityTypeEnum.LINEAR +polygonal = IfcStructuralCurveActivityTypeEnum.POLYGONAL +equidistant = IfcStructuralCurveActivityTypeEnum.EQUIDISTANT +sinus = IfcStructuralCurveActivityTypeEnum.SINUS +parabola = IfcStructuralCurveActivityTypeEnum.PARABOLA +discrete = IfcStructuralCurveActivityTypeEnum.DISCRETE +userdefined = IfcStructuralCurveActivityTypeEnum.USERDEFINED +notdefined = IfcStructuralCurveActivityTypeEnum.NOTDEFINED IfcStructuralCurveMemberTypeEnum = enum_namespace() -rigid_joined_member = express_getattr(IfcStructuralCurveMemberTypeEnum, 'RIGID_JOINED_MEMBER', INDETERMINATE) -pin_joined_member = express_getattr(IfcStructuralCurveMemberTypeEnum, 'PIN_JOINED_MEMBER', INDETERMINATE) -cable = express_getattr(IfcStructuralCurveMemberTypeEnum, 'CABLE', INDETERMINATE) -tension_member = express_getattr(IfcStructuralCurveMemberTypeEnum, 'TENSION_MEMBER', INDETERMINATE) -compression_member = express_getattr(IfcStructuralCurveMemberTypeEnum, 'COMPRESSION_MEMBER', INDETERMINATE) -userdefined = express_getattr(IfcStructuralCurveMemberTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcStructuralCurveMemberTypeEnum, 'NOTDEFINED', INDETERMINATE) +rigid_joined_member = IfcStructuralCurveMemberTypeEnum.RIGID_JOINED_MEMBER +pin_joined_member = IfcStructuralCurveMemberTypeEnum.PIN_JOINED_MEMBER +cable = IfcStructuralCurveMemberTypeEnum.CABLE +tension_member = IfcStructuralCurveMemberTypeEnum.TENSION_MEMBER +compression_member = IfcStructuralCurveMemberTypeEnum.COMPRESSION_MEMBER +userdefined = IfcStructuralCurveMemberTypeEnum.USERDEFINED +notdefined = IfcStructuralCurveMemberTypeEnum.NOTDEFINED IfcStructuralSurfaceActivityTypeEnum = enum_namespace() -const = express_getattr(IfcStructuralSurfaceActivityTypeEnum, 'CONST', INDETERMINATE) -bilinear = express_getattr(IfcStructuralSurfaceActivityTypeEnum, 'BILINEAR', INDETERMINATE) -discrete = express_getattr(IfcStructuralSurfaceActivityTypeEnum, 'DISCRETE', INDETERMINATE) -isocontour = express_getattr(IfcStructuralSurfaceActivityTypeEnum, 'ISOCONTOUR', INDETERMINATE) -userdefined = express_getattr(IfcStructuralSurfaceActivityTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcStructuralSurfaceActivityTypeEnum, 'NOTDEFINED', INDETERMINATE) +const = IfcStructuralSurfaceActivityTypeEnum.CONST +bilinear = IfcStructuralSurfaceActivityTypeEnum.BILINEAR +discrete = IfcStructuralSurfaceActivityTypeEnum.DISCRETE +isocontour = IfcStructuralSurfaceActivityTypeEnum.ISOCONTOUR +userdefined = IfcStructuralSurfaceActivityTypeEnum.USERDEFINED +notdefined = IfcStructuralSurfaceActivityTypeEnum.NOTDEFINED IfcStructuralSurfaceMemberTypeEnum = enum_namespace() -bending_element = express_getattr(IfcStructuralSurfaceMemberTypeEnum, 'BENDING_ELEMENT', INDETERMINATE) -membrane_element = express_getattr(IfcStructuralSurfaceMemberTypeEnum, 'MEMBRANE_ELEMENT', INDETERMINATE) -shell = express_getattr(IfcStructuralSurfaceMemberTypeEnum, 'SHELL', INDETERMINATE) -userdefined = express_getattr(IfcStructuralSurfaceMemberTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcStructuralSurfaceMemberTypeEnum, 'NOTDEFINED', INDETERMINATE) +bending_element = IfcStructuralSurfaceMemberTypeEnum.BENDING_ELEMENT +membrane_element = IfcStructuralSurfaceMemberTypeEnum.MEMBRANE_ELEMENT +shell = IfcStructuralSurfaceMemberTypeEnum.SHELL +userdefined = IfcStructuralSurfaceMemberTypeEnum.USERDEFINED +notdefined = IfcStructuralSurfaceMemberTypeEnum.NOTDEFINED IfcSubContractResourceTypeEnum = enum_namespace() -purchase = express_getattr(IfcSubContractResourceTypeEnum, 'PURCHASE', INDETERMINATE) -work = express_getattr(IfcSubContractResourceTypeEnum, 'WORK', INDETERMINATE) -userdefined = express_getattr(IfcSubContractResourceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSubContractResourceTypeEnum, 'NOTDEFINED', INDETERMINATE) +purchase = IfcSubContractResourceTypeEnum.PURCHASE +work = IfcSubContractResourceTypeEnum.WORK +userdefined = IfcSubContractResourceTypeEnum.USERDEFINED +notdefined = IfcSubContractResourceTypeEnum.NOTDEFINED IfcSurfaceFeatureTypeEnum = enum_namespace() -mark = express_getattr(IfcSurfaceFeatureTypeEnum, 'MARK', INDETERMINATE) -tag = express_getattr(IfcSurfaceFeatureTypeEnum, 'TAG', INDETERMINATE) -treatment = express_getattr(IfcSurfaceFeatureTypeEnum, 'TREATMENT', INDETERMINATE) -defect = express_getattr(IfcSurfaceFeatureTypeEnum, 'DEFECT', INDETERMINATE) -hatchmarking = express_getattr(IfcSurfaceFeatureTypeEnum, 'HATCHMARKING', INDETERMINATE) -linemarking = express_getattr(IfcSurfaceFeatureTypeEnum, 'LINEMARKING', INDETERMINATE) -pavementsurfacemarking = express_getattr(IfcSurfaceFeatureTypeEnum, 'PAVEMENTSURFACEMARKING', INDETERMINATE) -symbolmarking = express_getattr(IfcSurfaceFeatureTypeEnum, 'SYMBOLMARKING', INDETERMINATE) -nonskidsurfacing = express_getattr(IfcSurfaceFeatureTypeEnum, 'NONSKIDSURFACING', INDETERMINATE) -rumblestrip = express_getattr(IfcSurfaceFeatureTypeEnum, 'RUMBLESTRIP', INDETERMINATE) -transverserumblestrip = express_getattr(IfcSurfaceFeatureTypeEnum, 'TRANSVERSERUMBLESTRIP', INDETERMINATE) -userdefined = express_getattr(IfcSurfaceFeatureTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSurfaceFeatureTypeEnum, 'NOTDEFINED', INDETERMINATE) +mark = IfcSurfaceFeatureTypeEnum.MARK +tag = IfcSurfaceFeatureTypeEnum.TAG +treatment = IfcSurfaceFeatureTypeEnum.TREATMENT +defect = IfcSurfaceFeatureTypeEnum.DEFECT +hatchmarking = IfcSurfaceFeatureTypeEnum.HATCHMARKING +linemarking = IfcSurfaceFeatureTypeEnum.LINEMARKING +pavementsurfacemarking = IfcSurfaceFeatureTypeEnum.PAVEMENTSURFACEMARKING +symbolmarking = IfcSurfaceFeatureTypeEnum.SYMBOLMARKING +nonskidsurfacing = IfcSurfaceFeatureTypeEnum.NONSKIDSURFACING +rumblestrip = IfcSurfaceFeatureTypeEnum.RUMBLESTRIP +transverserumblestrip = IfcSurfaceFeatureTypeEnum.TRANSVERSERUMBLESTRIP +userdefined = IfcSurfaceFeatureTypeEnum.USERDEFINED +notdefined = IfcSurfaceFeatureTypeEnum.NOTDEFINED IfcSurfaceSide = enum_namespace() -positive = express_getattr(IfcSurfaceSide, 'POSITIVE', INDETERMINATE) -negative = express_getattr(IfcSurfaceSide, 'NEGATIVE', INDETERMINATE) -both = express_getattr(IfcSurfaceSide, 'BOTH', INDETERMINATE) +positive = IfcSurfaceSide.POSITIVE +negative = IfcSurfaceSide.NEGATIVE +both = IfcSurfaceSide.BOTH IfcSwitchingDeviceTypeEnum = enum_namespace() -contactor = express_getattr(IfcSwitchingDeviceTypeEnum, 'CONTACTOR', INDETERMINATE) -dimmerswitch = express_getattr(IfcSwitchingDeviceTypeEnum, 'DIMMERSWITCH', INDETERMINATE) -emergencystop = express_getattr(IfcSwitchingDeviceTypeEnum, 'EMERGENCYSTOP', INDETERMINATE) -keypad = express_getattr(IfcSwitchingDeviceTypeEnum, 'KEYPAD', INDETERMINATE) -momentaryswitch = express_getattr(IfcSwitchingDeviceTypeEnum, 'MOMENTARYSWITCH', INDETERMINATE) -selectorswitch = express_getattr(IfcSwitchingDeviceTypeEnum, 'SELECTORSWITCH', INDETERMINATE) -starter = express_getattr(IfcSwitchingDeviceTypeEnum, 'STARTER', INDETERMINATE) -switchdisconnector = express_getattr(IfcSwitchingDeviceTypeEnum, 'SWITCHDISCONNECTOR', INDETERMINATE) -toggleswitch = express_getattr(IfcSwitchingDeviceTypeEnum, 'TOGGLESWITCH', INDETERMINATE) -relay = express_getattr(IfcSwitchingDeviceTypeEnum, 'RELAY', INDETERMINATE) -start_and_stop_equipment = express_getattr(IfcSwitchingDeviceTypeEnum, 'START_AND_STOP_EQUIPMENT', INDETERMINATE) -userdefined = express_getattr(IfcSwitchingDeviceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSwitchingDeviceTypeEnum, 'NOTDEFINED', INDETERMINATE) +contactor = IfcSwitchingDeviceTypeEnum.CONTACTOR +dimmerswitch = IfcSwitchingDeviceTypeEnum.DIMMERSWITCH +emergencystop = IfcSwitchingDeviceTypeEnum.EMERGENCYSTOP +keypad = IfcSwitchingDeviceTypeEnum.KEYPAD +momentaryswitch = IfcSwitchingDeviceTypeEnum.MOMENTARYSWITCH +selectorswitch = IfcSwitchingDeviceTypeEnum.SELECTORSWITCH +starter = IfcSwitchingDeviceTypeEnum.STARTER +switchdisconnector = IfcSwitchingDeviceTypeEnum.SWITCHDISCONNECTOR +toggleswitch = IfcSwitchingDeviceTypeEnum.TOGGLESWITCH +relay = IfcSwitchingDeviceTypeEnum.RELAY +start_and_stop_equipment = IfcSwitchingDeviceTypeEnum.START_AND_STOP_EQUIPMENT +userdefined = IfcSwitchingDeviceTypeEnum.USERDEFINED +notdefined = IfcSwitchingDeviceTypeEnum.NOTDEFINED IfcSystemFurnitureElementTypeEnum = enum_namespace() -panel = express_getattr(IfcSystemFurnitureElementTypeEnum, 'PANEL', INDETERMINATE) -worksurface = express_getattr(IfcSystemFurnitureElementTypeEnum, 'WORKSURFACE', INDETERMINATE) -subrack = express_getattr(IfcSystemFurnitureElementTypeEnum, 'SUBRACK', INDETERMINATE) -userdefined = express_getattr(IfcSystemFurnitureElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSystemFurnitureElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +panel = IfcSystemFurnitureElementTypeEnum.PANEL +worksurface = IfcSystemFurnitureElementTypeEnum.WORKSURFACE +subrack = IfcSystemFurnitureElementTypeEnum.SUBRACK +userdefined = IfcSystemFurnitureElementTypeEnum.USERDEFINED +notdefined = IfcSystemFurnitureElementTypeEnum.NOTDEFINED IfcTankTypeEnum = enum_namespace() -basin = express_getattr(IfcTankTypeEnum, 'BASIN', INDETERMINATE) -breakpressure = express_getattr(IfcTankTypeEnum, 'BREAKPRESSURE', INDETERMINATE) -expansion = express_getattr(IfcTankTypeEnum, 'EXPANSION', INDETERMINATE) -feedandexpansion = express_getattr(IfcTankTypeEnum, 'FEEDANDEXPANSION', INDETERMINATE) -pressurevessel = express_getattr(IfcTankTypeEnum, 'PRESSUREVESSEL', INDETERMINATE) -storage = express_getattr(IfcTankTypeEnum, 'STORAGE', INDETERMINATE) -vessel = express_getattr(IfcTankTypeEnum, 'VESSEL', INDETERMINATE) -oilretentiontray = express_getattr(IfcTankTypeEnum, 'OILRETENTIONTRAY', INDETERMINATE) -userdefined = express_getattr(IfcTankTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTankTypeEnum, 'NOTDEFINED', INDETERMINATE) +basin = IfcTankTypeEnum.BASIN +breakpressure = IfcTankTypeEnum.BREAKPRESSURE +expansion = IfcTankTypeEnum.EXPANSION +feedandexpansion = IfcTankTypeEnum.FEEDANDEXPANSION +pressurevessel = IfcTankTypeEnum.PRESSUREVESSEL +storage = IfcTankTypeEnum.STORAGE +vessel = IfcTankTypeEnum.VESSEL +oilretentiontray = IfcTankTypeEnum.OILRETENTIONTRAY +userdefined = IfcTankTypeEnum.USERDEFINED +notdefined = IfcTankTypeEnum.NOTDEFINED IfcTaskDurationEnum = enum_namespace() -elapsedtime = express_getattr(IfcTaskDurationEnum, 'ELAPSEDTIME', INDETERMINATE) -worktime = express_getattr(IfcTaskDurationEnum, 'WORKTIME', INDETERMINATE) -notdefined = express_getattr(IfcTaskDurationEnum, 'NOTDEFINED', INDETERMINATE) +elapsedtime = IfcTaskDurationEnum.ELAPSEDTIME +worktime = IfcTaskDurationEnum.WORKTIME +notdefined = IfcTaskDurationEnum.NOTDEFINED IfcTaskTypeEnum = enum_namespace() -attendance = express_getattr(IfcTaskTypeEnum, 'ATTENDANCE', INDETERMINATE) -construction = express_getattr(IfcTaskTypeEnum, 'CONSTRUCTION', INDETERMINATE) -demolition = express_getattr(IfcTaskTypeEnum, 'DEMOLITION', INDETERMINATE) -dismantle = express_getattr(IfcTaskTypeEnum, 'DISMANTLE', INDETERMINATE) -disposal = express_getattr(IfcTaskTypeEnum, 'DISPOSAL', INDETERMINATE) -installation = express_getattr(IfcTaskTypeEnum, 'INSTALLATION', INDETERMINATE) -logistic = express_getattr(IfcTaskTypeEnum, 'LOGISTIC', INDETERMINATE) -maintenance = express_getattr(IfcTaskTypeEnum, 'MAINTENANCE', INDETERMINATE) -move = express_getattr(IfcTaskTypeEnum, 'MOVE', INDETERMINATE) -operation = express_getattr(IfcTaskTypeEnum, 'OPERATION', INDETERMINATE) -removal = express_getattr(IfcTaskTypeEnum, 'REMOVAL', INDETERMINATE) -renovation = express_getattr(IfcTaskTypeEnum, 'RENOVATION', INDETERMINATE) -userdefined = express_getattr(IfcTaskTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTaskTypeEnum, 'NOTDEFINED', INDETERMINATE) +attendance = IfcTaskTypeEnum.ATTENDANCE +construction = IfcTaskTypeEnum.CONSTRUCTION +demolition = IfcTaskTypeEnum.DEMOLITION +dismantle = IfcTaskTypeEnum.DISMANTLE +disposal = IfcTaskTypeEnum.DISPOSAL +installation = IfcTaskTypeEnum.INSTALLATION +logistic = IfcTaskTypeEnum.LOGISTIC +maintenance = IfcTaskTypeEnum.MAINTENANCE +move = IfcTaskTypeEnum.MOVE +operation = IfcTaskTypeEnum.OPERATION +removal = IfcTaskTypeEnum.REMOVAL +renovation = IfcTaskTypeEnum.RENOVATION +userdefined = IfcTaskTypeEnum.USERDEFINED +notdefined = IfcTaskTypeEnum.NOTDEFINED IfcTendonAnchorTypeEnum = enum_namespace() -coupler = express_getattr(IfcTendonAnchorTypeEnum, 'COUPLER', INDETERMINATE) -fixed_end = express_getattr(IfcTendonAnchorTypeEnum, 'FIXED_END', INDETERMINATE) -tensioning_end = express_getattr(IfcTendonAnchorTypeEnum, 'TENSIONING_END', INDETERMINATE) -userdefined = express_getattr(IfcTendonAnchorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTendonAnchorTypeEnum, 'NOTDEFINED', INDETERMINATE) +coupler = IfcTendonAnchorTypeEnum.COUPLER +fixed_end = IfcTendonAnchorTypeEnum.FIXED_END +tensioning_end = IfcTendonAnchorTypeEnum.TENSIONING_END +userdefined = IfcTendonAnchorTypeEnum.USERDEFINED +notdefined = IfcTendonAnchorTypeEnum.NOTDEFINED IfcTendonConduitTypeEnum = enum_namespace() -duct = express_getattr(IfcTendonConduitTypeEnum, 'DUCT', INDETERMINATE) -coupler = express_getattr(IfcTendonConduitTypeEnum, 'COUPLER', INDETERMINATE) -grouting_duct = express_getattr(IfcTendonConduitTypeEnum, 'GROUTING_DUCT', INDETERMINATE) -trumpet = express_getattr(IfcTendonConduitTypeEnum, 'TRUMPET', INDETERMINATE) -diabolo = express_getattr(IfcTendonConduitTypeEnum, 'DIABOLO', INDETERMINATE) -userdefined = express_getattr(IfcTendonConduitTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTendonConduitTypeEnum, 'NOTDEFINED', INDETERMINATE) +duct = IfcTendonConduitTypeEnum.DUCT +coupler = IfcTendonConduitTypeEnum.COUPLER +grouting_duct = IfcTendonConduitTypeEnum.GROUTING_DUCT +trumpet = IfcTendonConduitTypeEnum.TRUMPET +diabolo = IfcTendonConduitTypeEnum.DIABOLO +userdefined = IfcTendonConduitTypeEnum.USERDEFINED +notdefined = IfcTendonConduitTypeEnum.NOTDEFINED IfcTendonTypeEnum = enum_namespace() -bar = express_getattr(IfcTendonTypeEnum, 'BAR', INDETERMINATE) -coated = express_getattr(IfcTendonTypeEnum, 'COATED', INDETERMINATE) -strand = express_getattr(IfcTendonTypeEnum, 'STRAND', INDETERMINATE) -wire = express_getattr(IfcTendonTypeEnum, 'WIRE', INDETERMINATE) -userdefined = express_getattr(IfcTendonTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTendonTypeEnum, 'NOTDEFINED', INDETERMINATE) +bar = IfcTendonTypeEnum.BAR +coated = IfcTendonTypeEnum.COATED +strand = IfcTendonTypeEnum.STRAND +wire = IfcTendonTypeEnum.WIRE +userdefined = IfcTendonTypeEnum.USERDEFINED +notdefined = IfcTendonTypeEnum.NOTDEFINED IfcTextPath = enum_namespace() -left = express_getattr(IfcTextPath, 'LEFT', INDETERMINATE) -right = express_getattr(IfcTextPath, 'RIGHT', INDETERMINATE) -up = express_getattr(IfcTextPath, 'UP', INDETERMINATE) -down = express_getattr(IfcTextPath, 'DOWN', INDETERMINATE) +left = IfcTextPath.LEFT +right = IfcTextPath.RIGHT +up = IfcTextPath.UP +down = IfcTextPath.DOWN IfcTimeSeriesDataTypeEnum = enum_namespace() -continuous = express_getattr(IfcTimeSeriesDataTypeEnum, 'CONTINUOUS', INDETERMINATE) -discrete = express_getattr(IfcTimeSeriesDataTypeEnum, 'DISCRETE', INDETERMINATE) -discretebinary = express_getattr(IfcTimeSeriesDataTypeEnum, 'DISCRETEBINARY', INDETERMINATE) -piecewisebinary = express_getattr(IfcTimeSeriesDataTypeEnum, 'PIECEWISEBINARY', INDETERMINATE) -piecewiseconstant = express_getattr(IfcTimeSeriesDataTypeEnum, 'PIECEWISECONSTANT', INDETERMINATE) -piecewisecontinuous = express_getattr(IfcTimeSeriesDataTypeEnum, 'PIECEWISECONTINUOUS', INDETERMINATE) -notdefined = express_getattr(IfcTimeSeriesDataTypeEnum, 'NOTDEFINED', INDETERMINATE) +continuous = IfcTimeSeriesDataTypeEnum.CONTINUOUS +discrete = IfcTimeSeriesDataTypeEnum.DISCRETE +discretebinary = IfcTimeSeriesDataTypeEnum.DISCRETEBINARY +piecewisebinary = IfcTimeSeriesDataTypeEnum.PIECEWISEBINARY +piecewiseconstant = IfcTimeSeriesDataTypeEnum.PIECEWISECONSTANT +piecewisecontinuous = IfcTimeSeriesDataTypeEnum.PIECEWISECONTINUOUS +notdefined = IfcTimeSeriesDataTypeEnum.NOTDEFINED IfcTrackElementTypeEnum = enum_namespace() -trackendofalignment = express_getattr(IfcTrackElementTypeEnum, 'TRACKENDOFALIGNMENT', INDETERMINATE) -blockingdevice = express_getattr(IfcTrackElementTypeEnum, 'BLOCKINGDEVICE', INDETERMINATE) -vehiclestop = express_getattr(IfcTrackElementTypeEnum, 'VEHICLESTOP', INDETERMINATE) -sleeper = express_getattr(IfcTrackElementTypeEnum, 'SLEEPER', INDETERMINATE) -half_set_of_blades = express_getattr(IfcTrackElementTypeEnum, 'HALF_SET_OF_BLADES', INDETERMINATE) -speedregulator = express_getattr(IfcTrackElementTypeEnum, 'SPEEDREGULATOR', INDETERMINATE) -derailer = express_getattr(IfcTrackElementTypeEnum, 'DERAILER', INDETERMINATE) -frog = express_getattr(IfcTrackElementTypeEnum, 'FROG', INDETERMINATE) -userdefined = express_getattr(IfcTrackElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTrackElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +trackendofalignment = IfcTrackElementTypeEnum.TRACKENDOFALIGNMENT +blockingdevice = IfcTrackElementTypeEnum.BLOCKINGDEVICE +vehiclestop = IfcTrackElementTypeEnum.VEHICLESTOP +sleeper = IfcTrackElementTypeEnum.SLEEPER +half_set_of_blades = IfcTrackElementTypeEnum.HALF_SET_OF_BLADES +speedregulator = IfcTrackElementTypeEnum.SPEEDREGULATOR +derailer = IfcTrackElementTypeEnum.DERAILER +frog = IfcTrackElementTypeEnum.FROG +userdefined = IfcTrackElementTypeEnum.USERDEFINED +notdefined = IfcTrackElementTypeEnum.NOTDEFINED IfcTransformerTypeEnum = enum_namespace() -current = express_getattr(IfcTransformerTypeEnum, 'CURRENT', INDETERMINATE) -frequency = express_getattr(IfcTransformerTypeEnum, 'FREQUENCY', INDETERMINATE) -inverter = express_getattr(IfcTransformerTypeEnum, 'INVERTER', INDETERMINATE) -rectifier = express_getattr(IfcTransformerTypeEnum, 'RECTIFIER', INDETERMINATE) -voltage = express_getattr(IfcTransformerTypeEnum, 'VOLTAGE', INDETERMINATE) -chopper = express_getattr(IfcTransformerTypeEnum, 'CHOPPER', INDETERMINATE) -combined = express_getattr(IfcTransformerTypeEnum, 'COMBINED', INDETERMINATE) -userdefined = express_getattr(IfcTransformerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTransformerTypeEnum, 'NOTDEFINED', INDETERMINATE) +current = IfcTransformerTypeEnum.CURRENT +frequency = IfcTransformerTypeEnum.FREQUENCY +inverter = IfcTransformerTypeEnum.INVERTER +rectifier = IfcTransformerTypeEnum.RECTIFIER +voltage = IfcTransformerTypeEnum.VOLTAGE +chopper = IfcTransformerTypeEnum.CHOPPER +combined = IfcTransformerTypeEnum.COMBINED +userdefined = IfcTransformerTypeEnum.USERDEFINED +notdefined = IfcTransformerTypeEnum.NOTDEFINED IfcTransitionCode = enum_namespace() -discontinuous = express_getattr(IfcTransitionCode, 'DISCONTINUOUS', INDETERMINATE) -continuous = express_getattr(IfcTransitionCode, 'CONTINUOUS', INDETERMINATE) -contsamegradient = express_getattr(IfcTransitionCode, 'CONTSAMEGRADIENT', INDETERMINATE) -contsamegradientsamecurvature = express_getattr(IfcTransitionCode, 'CONTSAMEGRADIENTSAMECURVATURE', INDETERMINATE) +discontinuous = IfcTransitionCode.DISCONTINUOUS +continuous = IfcTransitionCode.CONTINUOUS +contsamegradient = IfcTransitionCode.CONTSAMEGRADIENT +contsamegradientsamecurvature = IfcTransitionCode.CONTSAMEGRADIENTSAMECURVATURE IfcTransitionCurveType = enum_namespace() -biquadraticparabola = express_getattr(IfcTransitionCurveType, 'BIQUADRATICPARABOLA', INDETERMINATE) -blosscurve = express_getattr(IfcTransitionCurveType, 'BLOSSCURVE', INDETERMINATE) -clothoidcurve = express_getattr(IfcTransitionCurveType, 'CLOTHOIDCURVE', INDETERMINATE) -cosinecurve = express_getattr(IfcTransitionCurveType, 'COSINECURVE', INDETERMINATE) -cubicparabola = express_getattr(IfcTransitionCurveType, 'CUBICPARABOLA', INDETERMINATE) -sinecurve = express_getattr(IfcTransitionCurveType, 'SINECURVE', INDETERMINATE) +biquadraticparabola = IfcTransitionCurveType.BIQUADRATICPARABOLA +blosscurve = IfcTransitionCurveType.BLOSSCURVE +clothoidcurve = IfcTransitionCurveType.CLOTHOIDCURVE +cosinecurve = IfcTransitionCurveType.COSINECURVE +cubicparabola = IfcTransitionCurveType.CUBICPARABOLA +sinecurve = IfcTransitionCurveType.SINECURVE IfcTransportElementFixedTypeEnum = enum_namespace() -elevator = express_getattr(IfcTransportElementFixedTypeEnum, 'ELEVATOR', INDETERMINATE) -escalator = express_getattr(IfcTransportElementFixedTypeEnum, 'ESCALATOR', INDETERMINATE) -movingwalkway = express_getattr(IfcTransportElementFixedTypeEnum, 'MOVINGWALKWAY', INDETERMINATE) -craneway = express_getattr(IfcTransportElementFixedTypeEnum, 'CRANEWAY', INDETERMINATE) -liftinggear = express_getattr(IfcTransportElementFixedTypeEnum, 'LIFTINGGEAR', INDETERMINATE) -userdefined = express_getattr(IfcTransportElementFixedTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTransportElementFixedTypeEnum, 'NOTDEFINED', INDETERMINATE) +elevator = IfcTransportElementFixedTypeEnum.ELEVATOR +escalator = IfcTransportElementFixedTypeEnum.ESCALATOR +movingwalkway = IfcTransportElementFixedTypeEnum.MOVINGWALKWAY +craneway = IfcTransportElementFixedTypeEnum.CRANEWAY +liftinggear = IfcTransportElementFixedTypeEnum.LIFTINGGEAR +userdefined = IfcTransportElementFixedTypeEnum.USERDEFINED +notdefined = IfcTransportElementFixedTypeEnum.NOTDEFINED IfcTransportElementNonFixedTypeEnum = enum_namespace() -vehicle = express_getattr(IfcTransportElementNonFixedTypeEnum, 'VEHICLE', INDETERMINATE) -vehicletracked = express_getattr(IfcTransportElementNonFixedTypeEnum, 'VEHICLETRACKED', INDETERMINATE) -rollingstock = express_getattr(IfcTransportElementNonFixedTypeEnum, 'ROLLINGSTOCK', INDETERMINATE) -vehiclewheeled = express_getattr(IfcTransportElementNonFixedTypeEnum, 'VEHICLEWHEELED', INDETERMINATE) -vehicleair = express_getattr(IfcTransportElementNonFixedTypeEnum, 'VEHICLEAIR', INDETERMINATE) -cargo = express_getattr(IfcTransportElementNonFixedTypeEnum, 'CARGO', INDETERMINATE) -vehiclemarine = express_getattr(IfcTransportElementNonFixedTypeEnum, 'VEHICLEMARINE', INDETERMINATE) -userdefined = express_getattr(IfcTransportElementNonFixedTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTransportElementNonFixedTypeEnum, 'NOTDEFINED', INDETERMINATE) +vehicle = IfcTransportElementNonFixedTypeEnum.VEHICLE +vehicletracked = IfcTransportElementNonFixedTypeEnum.VEHICLETRACKED +rollingstock = IfcTransportElementNonFixedTypeEnum.ROLLINGSTOCK +vehiclewheeled = IfcTransportElementNonFixedTypeEnum.VEHICLEWHEELED +vehicleair = IfcTransportElementNonFixedTypeEnum.VEHICLEAIR +cargo = IfcTransportElementNonFixedTypeEnum.CARGO +vehiclemarine = IfcTransportElementNonFixedTypeEnum.VEHICLEMARINE +userdefined = IfcTransportElementNonFixedTypeEnum.USERDEFINED +notdefined = IfcTransportElementNonFixedTypeEnum.NOTDEFINED IfcTrimmingPreference = enum_namespace() -cartesian = express_getattr(IfcTrimmingPreference, 'CARTESIAN', INDETERMINATE) -parameter = express_getattr(IfcTrimmingPreference, 'PARAMETER', INDETERMINATE) -unspecified = express_getattr(IfcTrimmingPreference, 'UNSPECIFIED', INDETERMINATE) +cartesian = IfcTrimmingPreference.CARTESIAN +parameter = IfcTrimmingPreference.PARAMETER +unspecified = IfcTrimmingPreference.UNSPECIFIED IfcTubeBundleTypeEnum = enum_namespace() -finned = express_getattr(IfcTubeBundleTypeEnum, 'FINNED', INDETERMINATE) -userdefined = express_getattr(IfcTubeBundleTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTubeBundleTypeEnum, 'NOTDEFINED', INDETERMINATE) +finned = IfcTubeBundleTypeEnum.FINNED +userdefined = IfcTubeBundleTypeEnum.USERDEFINED +notdefined = IfcTubeBundleTypeEnum.NOTDEFINED IfcUnitEnum = enum_namespace() -absorbeddoseunit = express_getattr(IfcUnitEnum, 'ABSORBEDDOSEUNIT', INDETERMINATE) -amountofsubstanceunit = express_getattr(IfcUnitEnum, 'AMOUNTOFSUBSTANCEUNIT', INDETERMINATE) -areaunit = express_getattr(IfcUnitEnum, 'AREAUNIT', INDETERMINATE) -doseequivalentunit = express_getattr(IfcUnitEnum, 'DOSEEQUIVALENTUNIT', INDETERMINATE) -electriccapacitanceunit = express_getattr(IfcUnitEnum, 'ELECTRICCAPACITANCEUNIT', INDETERMINATE) -electricchargeunit = express_getattr(IfcUnitEnum, 'ELECTRICCHARGEUNIT', INDETERMINATE) -electricconductanceunit = express_getattr(IfcUnitEnum, 'ELECTRICCONDUCTANCEUNIT', INDETERMINATE) -electriccurrentunit = express_getattr(IfcUnitEnum, 'ELECTRICCURRENTUNIT', INDETERMINATE) -electricresistanceunit = express_getattr(IfcUnitEnum, 'ELECTRICRESISTANCEUNIT', INDETERMINATE) -electricvoltageunit = express_getattr(IfcUnitEnum, 'ELECTRICVOLTAGEUNIT', INDETERMINATE) -energyunit = express_getattr(IfcUnitEnum, 'ENERGYUNIT', INDETERMINATE) -forceunit = express_getattr(IfcUnitEnum, 'FORCEUNIT', INDETERMINATE) -frequencyunit = express_getattr(IfcUnitEnum, 'FREQUENCYUNIT', INDETERMINATE) -illuminanceunit = express_getattr(IfcUnitEnum, 'ILLUMINANCEUNIT', INDETERMINATE) -inductanceunit = express_getattr(IfcUnitEnum, 'INDUCTANCEUNIT', INDETERMINATE) -lengthunit = express_getattr(IfcUnitEnum, 'LENGTHUNIT', INDETERMINATE) -luminousfluxunit = express_getattr(IfcUnitEnum, 'LUMINOUSFLUXUNIT', INDETERMINATE) -luminousintensityunit = express_getattr(IfcUnitEnum, 'LUMINOUSINTENSITYUNIT', INDETERMINATE) -magneticfluxdensityunit = express_getattr(IfcUnitEnum, 'MAGNETICFLUXDENSITYUNIT', INDETERMINATE) -magneticfluxunit = express_getattr(IfcUnitEnum, 'MAGNETICFLUXUNIT', INDETERMINATE) -massunit = express_getattr(IfcUnitEnum, 'MASSUNIT', INDETERMINATE) -planeangleunit = express_getattr(IfcUnitEnum, 'PLANEANGLEUNIT', INDETERMINATE) -powerunit = express_getattr(IfcUnitEnum, 'POWERUNIT', INDETERMINATE) -pressureunit = express_getattr(IfcUnitEnum, 'PRESSUREUNIT', INDETERMINATE) -radioactivityunit = express_getattr(IfcUnitEnum, 'RADIOACTIVITYUNIT', INDETERMINATE) -solidangleunit = express_getattr(IfcUnitEnum, 'SOLIDANGLEUNIT', INDETERMINATE) -thermodynamictemperatureunit = express_getattr(IfcUnitEnum, 'THERMODYNAMICTEMPERATUREUNIT', INDETERMINATE) -timeunit = express_getattr(IfcUnitEnum, 'TIMEUNIT', INDETERMINATE) -volumeunit = express_getattr(IfcUnitEnum, 'VOLUMEUNIT', INDETERMINATE) -userdefined = express_getattr(IfcUnitEnum, 'USERDEFINED', INDETERMINATE) +absorbeddoseunit = IfcUnitEnum.ABSORBEDDOSEUNIT +amountofsubstanceunit = IfcUnitEnum.AMOUNTOFSUBSTANCEUNIT +areaunit = IfcUnitEnum.AREAUNIT +doseequivalentunit = IfcUnitEnum.DOSEEQUIVALENTUNIT +electriccapacitanceunit = IfcUnitEnum.ELECTRICCAPACITANCEUNIT +electricchargeunit = IfcUnitEnum.ELECTRICCHARGEUNIT +electricconductanceunit = IfcUnitEnum.ELECTRICCONDUCTANCEUNIT +electriccurrentunit = IfcUnitEnum.ELECTRICCURRENTUNIT +electricresistanceunit = IfcUnitEnum.ELECTRICRESISTANCEUNIT +electricvoltageunit = IfcUnitEnum.ELECTRICVOLTAGEUNIT +energyunit = IfcUnitEnum.ENERGYUNIT +forceunit = IfcUnitEnum.FORCEUNIT +frequencyunit = IfcUnitEnum.FREQUENCYUNIT +illuminanceunit = IfcUnitEnum.ILLUMINANCEUNIT +inductanceunit = IfcUnitEnum.INDUCTANCEUNIT +lengthunit = IfcUnitEnum.LENGTHUNIT +luminousfluxunit = IfcUnitEnum.LUMINOUSFLUXUNIT +luminousintensityunit = IfcUnitEnum.LUMINOUSINTENSITYUNIT +magneticfluxdensityunit = IfcUnitEnum.MAGNETICFLUXDENSITYUNIT +magneticfluxunit = IfcUnitEnum.MAGNETICFLUXUNIT +massunit = IfcUnitEnum.MASSUNIT +planeangleunit = IfcUnitEnum.PLANEANGLEUNIT +powerunit = IfcUnitEnum.POWERUNIT +pressureunit = IfcUnitEnum.PRESSUREUNIT +radioactivityunit = IfcUnitEnum.RADIOACTIVITYUNIT +solidangleunit = IfcUnitEnum.SOLIDANGLEUNIT +thermodynamictemperatureunit = IfcUnitEnum.THERMODYNAMICTEMPERATUREUNIT +timeunit = IfcUnitEnum.TIMEUNIT +volumeunit = IfcUnitEnum.VOLUMEUNIT +userdefined = IfcUnitEnum.USERDEFINED IfcUnitaryControlElementTypeEnum = enum_namespace() -alarmpanel = express_getattr(IfcUnitaryControlElementTypeEnum, 'ALARMPANEL', INDETERMINATE) -controlpanel = express_getattr(IfcUnitaryControlElementTypeEnum, 'CONTROLPANEL', INDETERMINATE) -gasdetectionpanel = express_getattr(IfcUnitaryControlElementTypeEnum, 'GASDETECTIONPANEL', INDETERMINATE) -indicatorpanel = express_getattr(IfcUnitaryControlElementTypeEnum, 'INDICATORPANEL', INDETERMINATE) -mimicpanel = express_getattr(IfcUnitaryControlElementTypeEnum, 'MIMICPANEL', INDETERMINATE) -humidistat = express_getattr(IfcUnitaryControlElementTypeEnum, 'HUMIDISTAT', INDETERMINATE) -thermostat = express_getattr(IfcUnitaryControlElementTypeEnum, 'THERMOSTAT', INDETERMINATE) -weatherstation = express_getattr(IfcUnitaryControlElementTypeEnum, 'WEATHERSTATION', INDETERMINATE) -combined = express_getattr(IfcUnitaryControlElementTypeEnum, 'COMBINED', INDETERMINATE) -userdefined = express_getattr(IfcUnitaryControlElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcUnitaryControlElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +alarmpanel = IfcUnitaryControlElementTypeEnum.ALARMPANEL +controlpanel = IfcUnitaryControlElementTypeEnum.CONTROLPANEL +gasdetectionpanel = IfcUnitaryControlElementTypeEnum.GASDETECTIONPANEL +indicatorpanel = IfcUnitaryControlElementTypeEnum.INDICATORPANEL +mimicpanel = IfcUnitaryControlElementTypeEnum.MIMICPANEL +humidistat = IfcUnitaryControlElementTypeEnum.HUMIDISTAT +thermostat = IfcUnitaryControlElementTypeEnum.THERMOSTAT +weatherstation = IfcUnitaryControlElementTypeEnum.WEATHERSTATION +combined = IfcUnitaryControlElementTypeEnum.COMBINED +userdefined = IfcUnitaryControlElementTypeEnum.USERDEFINED +notdefined = IfcUnitaryControlElementTypeEnum.NOTDEFINED IfcUnitaryEquipmentTypeEnum = enum_namespace() -airhandler = express_getattr(IfcUnitaryEquipmentTypeEnum, 'AIRHANDLER', INDETERMINATE) -airconditioningunit = express_getattr(IfcUnitaryEquipmentTypeEnum, 'AIRCONDITIONINGUNIT', INDETERMINATE) -dehumidifier = express_getattr(IfcUnitaryEquipmentTypeEnum, 'DEHUMIDIFIER', INDETERMINATE) -splitsystem = express_getattr(IfcUnitaryEquipmentTypeEnum, 'SPLITSYSTEM', INDETERMINATE) -rooftopunit = express_getattr(IfcUnitaryEquipmentTypeEnum, 'ROOFTOPUNIT', INDETERMINATE) -userdefined = express_getattr(IfcUnitaryEquipmentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcUnitaryEquipmentTypeEnum, 'NOTDEFINED', INDETERMINATE) +airhandler = IfcUnitaryEquipmentTypeEnum.AIRHANDLER +airconditioningunit = IfcUnitaryEquipmentTypeEnum.AIRCONDITIONINGUNIT +dehumidifier = IfcUnitaryEquipmentTypeEnum.DEHUMIDIFIER +splitsystem = IfcUnitaryEquipmentTypeEnum.SPLITSYSTEM +rooftopunit = IfcUnitaryEquipmentTypeEnum.ROOFTOPUNIT +userdefined = IfcUnitaryEquipmentTypeEnum.USERDEFINED +notdefined = IfcUnitaryEquipmentTypeEnum.NOTDEFINED IfcValveTypeEnum = enum_namespace() -airrelease = express_getattr(IfcValveTypeEnum, 'AIRRELEASE', INDETERMINATE) -antivacuum = express_getattr(IfcValveTypeEnum, 'ANTIVACUUM', INDETERMINATE) -changeover = express_getattr(IfcValveTypeEnum, 'CHANGEOVER', INDETERMINATE) -check = express_getattr(IfcValveTypeEnum, 'CHECK', INDETERMINATE) -commissioning = express_getattr(IfcValveTypeEnum, 'COMMISSIONING', INDETERMINATE) -diverting = express_getattr(IfcValveTypeEnum, 'DIVERTING', INDETERMINATE) -drawoffcock = express_getattr(IfcValveTypeEnum, 'DRAWOFFCOCK', INDETERMINATE) -doublecheck = express_getattr(IfcValveTypeEnum, 'DOUBLECHECK', INDETERMINATE) -doubleregulating = express_getattr(IfcValveTypeEnum, 'DOUBLEREGULATING', INDETERMINATE) -faucet = express_getattr(IfcValveTypeEnum, 'FAUCET', INDETERMINATE) -flushing = express_getattr(IfcValveTypeEnum, 'FLUSHING', INDETERMINATE) -gascock = express_getattr(IfcValveTypeEnum, 'GASCOCK', INDETERMINATE) -gastap = express_getattr(IfcValveTypeEnum, 'GASTAP', INDETERMINATE) -isolating = express_getattr(IfcValveTypeEnum, 'ISOLATING', INDETERMINATE) -mixing = express_getattr(IfcValveTypeEnum, 'MIXING', INDETERMINATE) -pressurereducing = express_getattr(IfcValveTypeEnum, 'PRESSUREREDUCING', INDETERMINATE) -pressurerelief = express_getattr(IfcValveTypeEnum, 'PRESSURERELIEF', INDETERMINATE) -regulating = express_getattr(IfcValveTypeEnum, 'REGULATING', INDETERMINATE) -safetycutoff = express_getattr(IfcValveTypeEnum, 'SAFETYCUTOFF', INDETERMINATE) -steamtrap = express_getattr(IfcValveTypeEnum, 'STEAMTRAP', INDETERMINATE) -stopcock = express_getattr(IfcValveTypeEnum, 'STOPCOCK', INDETERMINATE) -userdefined = express_getattr(IfcValveTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcValveTypeEnum, 'NOTDEFINED', INDETERMINATE) +airrelease = IfcValveTypeEnum.AIRRELEASE +antivacuum = IfcValveTypeEnum.ANTIVACUUM +changeover = IfcValveTypeEnum.CHANGEOVER +check = IfcValveTypeEnum.CHECK +commissioning = IfcValveTypeEnum.COMMISSIONING +diverting = IfcValveTypeEnum.DIVERTING +drawoffcock = IfcValveTypeEnum.DRAWOFFCOCK +doublecheck = IfcValveTypeEnum.DOUBLECHECK +doubleregulating = IfcValveTypeEnum.DOUBLEREGULATING +faucet = IfcValveTypeEnum.FAUCET +flushing = IfcValveTypeEnum.FLUSHING +gascock = IfcValveTypeEnum.GASCOCK +gastap = IfcValveTypeEnum.GASTAP +isolating = IfcValveTypeEnum.ISOLATING +mixing = IfcValveTypeEnum.MIXING +pressurereducing = IfcValveTypeEnum.PRESSUREREDUCING +pressurerelief = IfcValveTypeEnum.PRESSURERELIEF +regulating = IfcValveTypeEnum.REGULATING +safetycutoff = IfcValveTypeEnum.SAFETYCUTOFF +steamtrap = IfcValveTypeEnum.STEAMTRAP +stopcock = IfcValveTypeEnum.STOPCOCK +userdefined = IfcValveTypeEnum.USERDEFINED +notdefined = IfcValveTypeEnum.NOTDEFINED IfcVibrationDamperTypeEnum = enum_namespace() -bending_yield = express_getattr(IfcVibrationDamperTypeEnum, 'BENDING_YIELD', INDETERMINATE) -shear_yield = express_getattr(IfcVibrationDamperTypeEnum, 'SHEAR_YIELD', INDETERMINATE) -axial_yield = express_getattr(IfcVibrationDamperTypeEnum, 'AXIAL_YIELD', INDETERMINATE) -friction = express_getattr(IfcVibrationDamperTypeEnum, 'FRICTION', INDETERMINATE) -viscous = express_getattr(IfcVibrationDamperTypeEnum, 'VISCOUS', INDETERMINATE) -rubber = express_getattr(IfcVibrationDamperTypeEnum, 'RUBBER', INDETERMINATE) -userdefined = express_getattr(IfcVibrationDamperTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcVibrationDamperTypeEnum, 'NOTDEFINED', INDETERMINATE) +bending_yield = IfcVibrationDamperTypeEnum.BENDING_YIELD +shear_yield = IfcVibrationDamperTypeEnum.SHEAR_YIELD +axial_yield = IfcVibrationDamperTypeEnum.AXIAL_YIELD +friction = IfcVibrationDamperTypeEnum.FRICTION +viscous = IfcVibrationDamperTypeEnum.VISCOUS +rubber = IfcVibrationDamperTypeEnum.RUBBER +userdefined = IfcVibrationDamperTypeEnum.USERDEFINED +notdefined = IfcVibrationDamperTypeEnum.NOTDEFINED IfcVibrationIsolatorTypeEnum = enum_namespace() -compression = express_getattr(IfcVibrationIsolatorTypeEnum, 'COMPRESSION', INDETERMINATE) -spring = express_getattr(IfcVibrationIsolatorTypeEnum, 'SPRING', INDETERMINATE) -base = express_getattr(IfcVibrationIsolatorTypeEnum, 'BASE', INDETERMINATE) -userdefined = express_getattr(IfcVibrationIsolatorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcVibrationIsolatorTypeEnum, 'NOTDEFINED', INDETERMINATE) +compression = IfcVibrationIsolatorTypeEnum.COMPRESSION +spring = IfcVibrationIsolatorTypeEnum.SPRING +base = IfcVibrationIsolatorTypeEnum.BASE +userdefined = IfcVibrationIsolatorTypeEnum.USERDEFINED +notdefined = IfcVibrationIsolatorTypeEnum.NOTDEFINED IfcVoidingFeatureTypeEnum = enum_namespace() -cutout = express_getattr(IfcVoidingFeatureTypeEnum, 'CUTOUT', INDETERMINATE) -notch = express_getattr(IfcVoidingFeatureTypeEnum, 'NOTCH', INDETERMINATE) -hole = express_getattr(IfcVoidingFeatureTypeEnum, 'HOLE', INDETERMINATE) -miter = express_getattr(IfcVoidingFeatureTypeEnum, 'MITER', INDETERMINATE) -chamfer = express_getattr(IfcVoidingFeatureTypeEnum, 'CHAMFER', INDETERMINATE) -edge = express_getattr(IfcVoidingFeatureTypeEnum, 'EDGE', INDETERMINATE) -userdefined = express_getattr(IfcVoidingFeatureTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcVoidingFeatureTypeEnum, 'NOTDEFINED', INDETERMINATE) +cutout = IfcVoidingFeatureTypeEnum.CUTOUT +notch = IfcVoidingFeatureTypeEnum.NOTCH +hole = IfcVoidingFeatureTypeEnum.HOLE +miter = IfcVoidingFeatureTypeEnum.MITER +chamfer = IfcVoidingFeatureTypeEnum.CHAMFER +edge = IfcVoidingFeatureTypeEnum.EDGE +userdefined = IfcVoidingFeatureTypeEnum.USERDEFINED +notdefined = IfcVoidingFeatureTypeEnum.NOTDEFINED IfcWallTypeEnum = enum_namespace() -movable = express_getattr(IfcWallTypeEnum, 'MOVABLE', INDETERMINATE) -parapet = express_getattr(IfcWallTypeEnum, 'PARAPET', INDETERMINATE) -partitioning = express_getattr(IfcWallTypeEnum, 'PARTITIONING', INDETERMINATE) -plumbingwall = express_getattr(IfcWallTypeEnum, 'PLUMBINGWALL', INDETERMINATE) -shear = express_getattr(IfcWallTypeEnum, 'SHEAR', INDETERMINATE) -solidwall = express_getattr(IfcWallTypeEnum, 'SOLIDWALL', INDETERMINATE) -standard = express_getattr(IfcWallTypeEnum, 'STANDARD', INDETERMINATE) -polygonal = express_getattr(IfcWallTypeEnum, 'POLYGONAL', INDETERMINATE) -elementedwall = express_getattr(IfcWallTypeEnum, 'ELEMENTEDWALL', INDETERMINATE) -retainingwall = express_getattr(IfcWallTypeEnum, 'RETAININGWALL', INDETERMINATE) -wavewall = express_getattr(IfcWallTypeEnum, 'WAVEWALL', INDETERMINATE) -userdefined = express_getattr(IfcWallTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcWallTypeEnum, 'NOTDEFINED', INDETERMINATE) +movable = IfcWallTypeEnum.MOVABLE +parapet = IfcWallTypeEnum.PARAPET +partitioning = IfcWallTypeEnum.PARTITIONING +plumbingwall = IfcWallTypeEnum.PLUMBINGWALL +shear = IfcWallTypeEnum.SHEAR +solidwall = IfcWallTypeEnum.SOLIDWALL +standard = IfcWallTypeEnum.STANDARD +polygonal = IfcWallTypeEnum.POLYGONAL +elementedwall = IfcWallTypeEnum.ELEMENTEDWALL +retainingwall = IfcWallTypeEnum.RETAININGWALL +wavewall = IfcWallTypeEnum.WAVEWALL +userdefined = IfcWallTypeEnum.USERDEFINED +notdefined = IfcWallTypeEnum.NOTDEFINED IfcWasteTerminalTypeEnum = enum_namespace() -floortrap = express_getattr(IfcWasteTerminalTypeEnum, 'FLOORTRAP', INDETERMINATE) -floorwaste = express_getattr(IfcWasteTerminalTypeEnum, 'FLOORWASTE', INDETERMINATE) -gullysump = express_getattr(IfcWasteTerminalTypeEnum, 'GULLYSUMP', INDETERMINATE) -gullytrap = express_getattr(IfcWasteTerminalTypeEnum, 'GULLYTRAP', INDETERMINATE) -roofdrain = express_getattr(IfcWasteTerminalTypeEnum, 'ROOFDRAIN', INDETERMINATE) -wastedisposalunit = express_getattr(IfcWasteTerminalTypeEnum, 'WASTEDISPOSALUNIT', INDETERMINATE) -wastetrap = express_getattr(IfcWasteTerminalTypeEnum, 'WASTETRAP', INDETERMINATE) -userdefined = express_getattr(IfcWasteTerminalTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcWasteTerminalTypeEnum, 'NOTDEFINED', INDETERMINATE) +floortrap = IfcWasteTerminalTypeEnum.FLOORTRAP +floorwaste = IfcWasteTerminalTypeEnum.FLOORWASTE +gullysump = IfcWasteTerminalTypeEnum.GULLYSUMP +gullytrap = IfcWasteTerminalTypeEnum.GULLYTRAP +roofdrain = IfcWasteTerminalTypeEnum.ROOFDRAIN +wastedisposalunit = IfcWasteTerminalTypeEnum.WASTEDISPOSALUNIT +wastetrap = IfcWasteTerminalTypeEnum.WASTETRAP +userdefined = IfcWasteTerminalTypeEnum.USERDEFINED +notdefined = IfcWasteTerminalTypeEnum.NOTDEFINED IfcWindowPanelOperationEnum = enum_namespace() -sidehungrighthand = express_getattr(IfcWindowPanelOperationEnum, 'SIDEHUNGRIGHTHAND', INDETERMINATE) -sidehunglefthand = express_getattr(IfcWindowPanelOperationEnum, 'SIDEHUNGLEFTHAND', INDETERMINATE) -tiltandturnrighthand = express_getattr(IfcWindowPanelOperationEnum, 'TILTANDTURNRIGHTHAND', INDETERMINATE) -tiltandturnlefthand = express_getattr(IfcWindowPanelOperationEnum, 'TILTANDTURNLEFTHAND', INDETERMINATE) -tophung = express_getattr(IfcWindowPanelOperationEnum, 'TOPHUNG', INDETERMINATE) -bottomhung = express_getattr(IfcWindowPanelOperationEnum, 'BOTTOMHUNG', INDETERMINATE) -pivothorizontal = express_getattr(IfcWindowPanelOperationEnum, 'PIVOTHORIZONTAL', INDETERMINATE) -pivotvertical = express_getattr(IfcWindowPanelOperationEnum, 'PIVOTVERTICAL', INDETERMINATE) -slidinghorizontal = express_getattr(IfcWindowPanelOperationEnum, 'SLIDINGHORIZONTAL', INDETERMINATE) -slidingvertical = express_getattr(IfcWindowPanelOperationEnum, 'SLIDINGVERTICAL', INDETERMINATE) -removablecasement = express_getattr(IfcWindowPanelOperationEnum, 'REMOVABLECASEMENT', INDETERMINATE) -fixedcasement = express_getattr(IfcWindowPanelOperationEnum, 'FIXEDCASEMENT', INDETERMINATE) -otheroperation = express_getattr(IfcWindowPanelOperationEnum, 'OTHEROPERATION', INDETERMINATE) -notdefined = express_getattr(IfcWindowPanelOperationEnum, 'NOTDEFINED', INDETERMINATE) +sidehungrighthand = IfcWindowPanelOperationEnum.SIDEHUNGRIGHTHAND +sidehunglefthand = IfcWindowPanelOperationEnum.SIDEHUNGLEFTHAND +tiltandturnrighthand = IfcWindowPanelOperationEnum.TILTANDTURNRIGHTHAND +tiltandturnlefthand = IfcWindowPanelOperationEnum.TILTANDTURNLEFTHAND +tophung = IfcWindowPanelOperationEnum.TOPHUNG +bottomhung = IfcWindowPanelOperationEnum.BOTTOMHUNG +pivothorizontal = IfcWindowPanelOperationEnum.PIVOTHORIZONTAL +pivotvertical = IfcWindowPanelOperationEnum.PIVOTVERTICAL +slidinghorizontal = IfcWindowPanelOperationEnum.SLIDINGHORIZONTAL +slidingvertical = IfcWindowPanelOperationEnum.SLIDINGVERTICAL +removablecasement = IfcWindowPanelOperationEnum.REMOVABLECASEMENT +fixedcasement = IfcWindowPanelOperationEnum.FIXEDCASEMENT +otheroperation = IfcWindowPanelOperationEnum.OTHEROPERATION +notdefined = IfcWindowPanelOperationEnum.NOTDEFINED IfcWindowPanelPositionEnum = enum_namespace() -left = express_getattr(IfcWindowPanelPositionEnum, 'LEFT', INDETERMINATE) -middle = express_getattr(IfcWindowPanelPositionEnum, 'MIDDLE', INDETERMINATE) -right = express_getattr(IfcWindowPanelPositionEnum, 'RIGHT', INDETERMINATE) -bottom = express_getattr(IfcWindowPanelPositionEnum, 'BOTTOM', INDETERMINATE) -top = express_getattr(IfcWindowPanelPositionEnum, 'TOP', INDETERMINATE) -notdefined = express_getattr(IfcWindowPanelPositionEnum, 'NOTDEFINED', INDETERMINATE) +left = IfcWindowPanelPositionEnum.LEFT +middle = IfcWindowPanelPositionEnum.MIDDLE +right = IfcWindowPanelPositionEnum.RIGHT +bottom = IfcWindowPanelPositionEnum.BOTTOM +top = IfcWindowPanelPositionEnum.TOP +notdefined = IfcWindowPanelPositionEnum.NOTDEFINED IfcWindowStyleConstructionEnum = enum_namespace() -aluminium = express_getattr(IfcWindowStyleConstructionEnum, 'ALUMINIUM', INDETERMINATE) -high_grade_steel = express_getattr(IfcWindowStyleConstructionEnum, 'HIGH_GRADE_STEEL', INDETERMINATE) -steel = express_getattr(IfcWindowStyleConstructionEnum, 'STEEL', INDETERMINATE) -wood = express_getattr(IfcWindowStyleConstructionEnum, 'WOOD', INDETERMINATE) -aluminium_wood = express_getattr(IfcWindowStyleConstructionEnum, 'ALUMINIUM_WOOD', INDETERMINATE) -plastic = express_getattr(IfcWindowStyleConstructionEnum, 'PLASTIC', INDETERMINATE) -other_construction = express_getattr(IfcWindowStyleConstructionEnum, 'OTHER_CONSTRUCTION', INDETERMINATE) -notdefined = express_getattr(IfcWindowStyleConstructionEnum, 'NOTDEFINED', INDETERMINATE) +aluminium = IfcWindowStyleConstructionEnum.ALUMINIUM +high_grade_steel = IfcWindowStyleConstructionEnum.HIGH_GRADE_STEEL +steel = IfcWindowStyleConstructionEnum.STEEL +wood = IfcWindowStyleConstructionEnum.WOOD +aluminium_wood = IfcWindowStyleConstructionEnum.ALUMINIUM_WOOD +plastic = IfcWindowStyleConstructionEnum.PLASTIC +other_construction = IfcWindowStyleConstructionEnum.OTHER_CONSTRUCTION +notdefined = IfcWindowStyleConstructionEnum.NOTDEFINED IfcWindowStyleOperationEnum = enum_namespace() -single_panel = express_getattr(IfcWindowStyleOperationEnum, 'SINGLE_PANEL', INDETERMINATE) -double_panel_vertical = express_getattr(IfcWindowStyleOperationEnum, 'DOUBLE_PANEL_VERTICAL', INDETERMINATE) -double_panel_horizontal = express_getattr(IfcWindowStyleOperationEnum, 'DOUBLE_PANEL_HORIZONTAL', INDETERMINATE) -triple_panel_vertical = express_getattr(IfcWindowStyleOperationEnum, 'TRIPLE_PANEL_VERTICAL', INDETERMINATE) -triple_panel_bottom = express_getattr(IfcWindowStyleOperationEnum, 'TRIPLE_PANEL_BOTTOM', INDETERMINATE) -triple_panel_top = express_getattr(IfcWindowStyleOperationEnum, 'TRIPLE_PANEL_TOP', INDETERMINATE) -triple_panel_left = express_getattr(IfcWindowStyleOperationEnum, 'TRIPLE_PANEL_LEFT', INDETERMINATE) -triple_panel_right = express_getattr(IfcWindowStyleOperationEnum, 'TRIPLE_PANEL_RIGHT', INDETERMINATE) -triple_panel_horizontal = express_getattr(IfcWindowStyleOperationEnum, 'TRIPLE_PANEL_HORIZONTAL', INDETERMINATE) -userdefined = express_getattr(IfcWindowStyleOperationEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcWindowStyleOperationEnum, 'NOTDEFINED', INDETERMINATE) +single_panel = IfcWindowStyleOperationEnum.SINGLE_PANEL +double_panel_vertical = IfcWindowStyleOperationEnum.DOUBLE_PANEL_VERTICAL +double_panel_horizontal = IfcWindowStyleOperationEnum.DOUBLE_PANEL_HORIZONTAL +triple_panel_vertical = IfcWindowStyleOperationEnum.TRIPLE_PANEL_VERTICAL +triple_panel_bottom = IfcWindowStyleOperationEnum.TRIPLE_PANEL_BOTTOM +triple_panel_top = IfcWindowStyleOperationEnum.TRIPLE_PANEL_TOP +triple_panel_left = IfcWindowStyleOperationEnum.TRIPLE_PANEL_LEFT +triple_panel_right = IfcWindowStyleOperationEnum.TRIPLE_PANEL_RIGHT +triple_panel_horizontal = IfcWindowStyleOperationEnum.TRIPLE_PANEL_HORIZONTAL +userdefined = IfcWindowStyleOperationEnum.USERDEFINED +notdefined = IfcWindowStyleOperationEnum.NOTDEFINED IfcWindowTypeEnum = enum_namespace() -window = express_getattr(IfcWindowTypeEnum, 'WINDOW', INDETERMINATE) -skylight = express_getattr(IfcWindowTypeEnum, 'SKYLIGHT', INDETERMINATE) -lightdome = express_getattr(IfcWindowTypeEnum, 'LIGHTDOME', INDETERMINATE) -userdefined = express_getattr(IfcWindowTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcWindowTypeEnum, 'NOTDEFINED', INDETERMINATE) +window = IfcWindowTypeEnum.WINDOW +skylight = IfcWindowTypeEnum.SKYLIGHT +lightdome = IfcWindowTypeEnum.LIGHTDOME +userdefined = IfcWindowTypeEnum.USERDEFINED +notdefined = IfcWindowTypeEnum.NOTDEFINED IfcWindowTypePartitioningEnum = enum_namespace() -single_panel = express_getattr(IfcWindowTypePartitioningEnum, 'SINGLE_PANEL', INDETERMINATE) -double_panel_vertical = express_getattr(IfcWindowTypePartitioningEnum, 'DOUBLE_PANEL_VERTICAL', INDETERMINATE) -double_panel_horizontal = express_getattr(IfcWindowTypePartitioningEnum, 'DOUBLE_PANEL_HORIZONTAL', INDETERMINATE) -triple_panel_vertical = express_getattr(IfcWindowTypePartitioningEnum, 'TRIPLE_PANEL_VERTICAL', INDETERMINATE) -triple_panel_bottom = express_getattr(IfcWindowTypePartitioningEnum, 'TRIPLE_PANEL_BOTTOM', INDETERMINATE) -triple_panel_top = express_getattr(IfcWindowTypePartitioningEnum, 'TRIPLE_PANEL_TOP', INDETERMINATE) -triple_panel_left = express_getattr(IfcWindowTypePartitioningEnum, 'TRIPLE_PANEL_LEFT', INDETERMINATE) -triple_panel_right = express_getattr(IfcWindowTypePartitioningEnum, 'TRIPLE_PANEL_RIGHT', INDETERMINATE) -triple_panel_horizontal = express_getattr(IfcWindowTypePartitioningEnum, 'TRIPLE_PANEL_HORIZONTAL', INDETERMINATE) -userdefined = express_getattr(IfcWindowTypePartitioningEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcWindowTypePartitioningEnum, 'NOTDEFINED', INDETERMINATE) +single_panel = IfcWindowTypePartitioningEnum.SINGLE_PANEL +double_panel_vertical = IfcWindowTypePartitioningEnum.DOUBLE_PANEL_VERTICAL +double_panel_horizontal = IfcWindowTypePartitioningEnum.DOUBLE_PANEL_HORIZONTAL +triple_panel_vertical = IfcWindowTypePartitioningEnum.TRIPLE_PANEL_VERTICAL +triple_panel_bottom = IfcWindowTypePartitioningEnum.TRIPLE_PANEL_BOTTOM +triple_panel_top = IfcWindowTypePartitioningEnum.TRIPLE_PANEL_TOP +triple_panel_left = IfcWindowTypePartitioningEnum.TRIPLE_PANEL_LEFT +triple_panel_right = IfcWindowTypePartitioningEnum.TRIPLE_PANEL_RIGHT +triple_panel_horizontal = IfcWindowTypePartitioningEnum.TRIPLE_PANEL_HORIZONTAL +userdefined = IfcWindowTypePartitioningEnum.USERDEFINED +notdefined = IfcWindowTypePartitioningEnum.NOTDEFINED IfcWorkCalendarTypeEnum = enum_namespace() -firstshift = express_getattr(IfcWorkCalendarTypeEnum, 'FIRSTSHIFT', INDETERMINATE) -secondshift = express_getattr(IfcWorkCalendarTypeEnum, 'SECONDSHIFT', INDETERMINATE) -thirdshift = express_getattr(IfcWorkCalendarTypeEnum, 'THIRDSHIFT', INDETERMINATE) -userdefined = express_getattr(IfcWorkCalendarTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcWorkCalendarTypeEnum, 'NOTDEFINED', INDETERMINATE) +firstshift = IfcWorkCalendarTypeEnum.FIRSTSHIFT +secondshift = IfcWorkCalendarTypeEnum.SECONDSHIFT +thirdshift = IfcWorkCalendarTypeEnum.THIRDSHIFT +userdefined = IfcWorkCalendarTypeEnum.USERDEFINED +notdefined = IfcWorkCalendarTypeEnum.NOTDEFINED IfcWorkPlanTypeEnum = enum_namespace() -actual = express_getattr(IfcWorkPlanTypeEnum, 'ACTUAL', INDETERMINATE) -baseline = express_getattr(IfcWorkPlanTypeEnum, 'BASELINE', INDETERMINATE) -planned = express_getattr(IfcWorkPlanTypeEnum, 'PLANNED', INDETERMINATE) -userdefined = express_getattr(IfcWorkPlanTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcWorkPlanTypeEnum, 'NOTDEFINED', INDETERMINATE) +actual = IfcWorkPlanTypeEnum.ACTUAL +baseline = IfcWorkPlanTypeEnum.BASELINE +planned = IfcWorkPlanTypeEnum.PLANNED +userdefined = IfcWorkPlanTypeEnum.USERDEFINED +notdefined = IfcWorkPlanTypeEnum.NOTDEFINED IfcWorkScheduleTypeEnum = enum_namespace() -actual = express_getattr(IfcWorkScheduleTypeEnum, 'ACTUAL', INDETERMINATE) -baseline = express_getattr(IfcWorkScheduleTypeEnum, 'BASELINE', INDETERMINATE) -planned = express_getattr(IfcWorkScheduleTypeEnum, 'PLANNED', INDETERMINATE) -userdefined = express_getattr(IfcWorkScheduleTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcWorkScheduleTypeEnum, 'NOTDEFINED', INDETERMINATE) +actual = IfcWorkScheduleTypeEnum.ACTUAL +baseline = IfcWorkScheduleTypeEnum.BASELINE +planned = IfcWorkScheduleTypeEnum.PLANNED +userdefined = IfcWorkScheduleTypeEnum.USERDEFINED +notdefined = IfcWorkScheduleTypeEnum.NOTDEFINED def IfcActionRequest(*args, **kwargs): return ifcopenshell.create_entity('IfcActionRequest', 'IFC4X3_RC2', *args, **kwargs) diff --git a/src/ifcopenshell-python/ifcopenshell/express/rules/IFC4X3_RC3.py b/src/ifcopenshell-python/ifcopenshell/express/rules/IFC4X3_RC3.py index 02c8a5a37dc..38e4f8b4483 100644 --- a/src/ifcopenshell-python/ifcopenshell/express/rules/IFC4X3_RC3.py +++ b/src/ifcopenshell-python/ifcopenshell/express/rules/IFC4X3_RC3.py @@ -1,5 +1,8 @@ import ifcopenshell +def is_indeterminate(v): + return v is None or type(v).__name__ == 'indeterminate_type' + def exists(v): if callable(v): try: @@ -7,10 +10,10 @@ def exists(v): except IndexError as e: return False else: - return v is not None + return not is_indeterminate(v) def nvl(v, default): - return v if v is not None else default + return v if not is_indeterminate(v) else default def is_entity(inst): if isinstance(inst, ifcopenshell.entity_instance): @@ -22,13 +25,13 @@ def is_entity(inst): def express_len(v): if isinstance(v, ifcopenshell.entity_instance) and (not is_entity(v)): v = v[0] - elif v is None or v is INDETERMINATE: + elif is_indeterminate(v): return INDETERMINATE return len(v) old_range = range def range(*args): - if INDETERMINATE in args: + if any(map(is_indeterminate, args)): return yield from old_range(*args) sizeof = express_len @@ -149,2373 +152,2373 @@ class enum_namespace: def __getattr__(self, k): return express_getattr(k, 'upper', INDETERMINATE)() IfcActionRequestTypeEnum = enum_namespace() -email = express_getattr(IfcActionRequestTypeEnum, 'EMAIL', INDETERMINATE) -fax = express_getattr(IfcActionRequestTypeEnum, 'FAX', INDETERMINATE) -phone = express_getattr(IfcActionRequestTypeEnum, 'PHONE', INDETERMINATE) -post = express_getattr(IfcActionRequestTypeEnum, 'POST', INDETERMINATE) -verbal = express_getattr(IfcActionRequestTypeEnum, 'VERBAL', INDETERMINATE) -userdefined = express_getattr(IfcActionRequestTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcActionRequestTypeEnum, 'NOTDEFINED', INDETERMINATE) +email = IfcActionRequestTypeEnum.EMAIL +fax = IfcActionRequestTypeEnum.FAX +phone = IfcActionRequestTypeEnum.PHONE +post = IfcActionRequestTypeEnum.POST +verbal = IfcActionRequestTypeEnum.VERBAL +userdefined = IfcActionRequestTypeEnum.USERDEFINED +notdefined = IfcActionRequestTypeEnum.NOTDEFINED IfcActionSourceTypeEnum = enum_namespace() -dead_load_g = express_getattr(IfcActionSourceTypeEnum, 'DEAD_LOAD_G', INDETERMINATE) -completion_g1 = express_getattr(IfcActionSourceTypeEnum, 'COMPLETION_G1', INDETERMINATE) -live_load_q = express_getattr(IfcActionSourceTypeEnum, 'LIVE_LOAD_Q', INDETERMINATE) -snow_s = express_getattr(IfcActionSourceTypeEnum, 'SNOW_S', INDETERMINATE) -wind_w = express_getattr(IfcActionSourceTypeEnum, 'WIND_W', INDETERMINATE) -prestressing_p = express_getattr(IfcActionSourceTypeEnum, 'PRESTRESSING_P', INDETERMINATE) -settlement_u = express_getattr(IfcActionSourceTypeEnum, 'SETTLEMENT_U', INDETERMINATE) -temperature_t = express_getattr(IfcActionSourceTypeEnum, 'TEMPERATURE_T', INDETERMINATE) -earthquake_e = express_getattr(IfcActionSourceTypeEnum, 'EARTHQUAKE_E', INDETERMINATE) -fire = express_getattr(IfcActionSourceTypeEnum, 'FIRE', INDETERMINATE) -impulse = express_getattr(IfcActionSourceTypeEnum, 'IMPULSE', INDETERMINATE) -impact = express_getattr(IfcActionSourceTypeEnum, 'IMPACT', INDETERMINATE) -transport = express_getattr(IfcActionSourceTypeEnum, 'TRANSPORT', INDETERMINATE) -erection = express_getattr(IfcActionSourceTypeEnum, 'ERECTION', INDETERMINATE) -propping = express_getattr(IfcActionSourceTypeEnum, 'PROPPING', INDETERMINATE) -system_imperfection = express_getattr(IfcActionSourceTypeEnum, 'SYSTEM_IMPERFECTION', INDETERMINATE) -shrinkage = express_getattr(IfcActionSourceTypeEnum, 'SHRINKAGE', INDETERMINATE) -creep = express_getattr(IfcActionSourceTypeEnum, 'CREEP', INDETERMINATE) -lack_of_fit = express_getattr(IfcActionSourceTypeEnum, 'LACK_OF_FIT', INDETERMINATE) -buoyancy = express_getattr(IfcActionSourceTypeEnum, 'BUOYANCY', INDETERMINATE) -ice = express_getattr(IfcActionSourceTypeEnum, 'ICE', INDETERMINATE) -current = express_getattr(IfcActionSourceTypeEnum, 'CURRENT', INDETERMINATE) -wave = express_getattr(IfcActionSourceTypeEnum, 'WAVE', INDETERMINATE) -rain = express_getattr(IfcActionSourceTypeEnum, 'RAIN', INDETERMINATE) -brakes = express_getattr(IfcActionSourceTypeEnum, 'BRAKES', INDETERMINATE) -userdefined = express_getattr(IfcActionSourceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcActionSourceTypeEnum, 'NOTDEFINED', INDETERMINATE) +dead_load_g = IfcActionSourceTypeEnum.DEAD_LOAD_G +completion_g1 = IfcActionSourceTypeEnum.COMPLETION_G1 +live_load_q = IfcActionSourceTypeEnum.LIVE_LOAD_Q +snow_s = IfcActionSourceTypeEnum.SNOW_S +wind_w = IfcActionSourceTypeEnum.WIND_W +prestressing_p = IfcActionSourceTypeEnum.PRESTRESSING_P +settlement_u = IfcActionSourceTypeEnum.SETTLEMENT_U +temperature_t = IfcActionSourceTypeEnum.TEMPERATURE_T +earthquake_e = IfcActionSourceTypeEnum.EARTHQUAKE_E +fire = IfcActionSourceTypeEnum.FIRE +impulse = IfcActionSourceTypeEnum.IMPULSE +impact = IfcActionSourceTypeEnum.IMPACT +transport = IfcActionSourceTypeEnum.TRANSPORT +erection = IfcActionSourceTypeEnum.ERECTION +propping = IfcActionSourceTypeEnum.PROPPING +system_imperfection = IfcActionSourceTypeEnum.SYSTEM_IMPERFECTION +shrinkage = IfcActionSourceTypeEnum.SHRINKAGE +creep = IfcActionSourceTypeEnum.CREEP +lack_of_fit = IfcActionSourceTypeEnum.LACK_OF_FIT +buoyancy = IfcActionSourceTypeEnum.BUOYANCY +ice = IfcActionSourceTypeEnum.ICE +current = IfcActionSourceTypeEnum.CURRENT +wave = IfcActionSourceTypeEnum.WAVE +rain = IfcActionSourceTypeEnum.RAIN +brakes = IfcActionSourceTypeEnum.BRAKES +userdefined = IfcActionSourceTypeEnum.USERDEFINED +notdefined = IfcActionSourceTypeEnum.NOTDEFINED IfcActionTypeEnum = enum_namespace() -permanent_g = express_getattr(IfcActionTypeEnum, 'PERMANENT_G', INDETERMINATE) -variable_q = express_getattr(IfcActionTypeEnum, 'VARIABLE_Q', INDETERMINATE) -extraordinary_a = express_getattr(IfcActionTypeEnum, 'EXTRAORDINARY_A', INDETERMINATE) -userdefined = express_getattr(IfcActionTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcActionTypeEnum, 'NOTDEFINED', INDETERMINATE) +permanent_g = IfcActionTypeEnum.PERMANENT_G +variable_q = IfcActionTypeEnum.VARIABLE_Q +extraordinary_a = IfcActionTypeEnum.EXTRAORDINARY_A +userdefined = IfcActionTypeEnum.USERDEFINED +notdefined = IfcActionTypeEnum.NOTDEFINED IfcActuatorTypeEnum = enum_namespace() -electricactuator = express_getattr(IfcActuatorTypeEnum, 'ELECTRICACTUATOR', INDETERMINATE) -handoperatedactuator = express_getattr(IfcActuatorTypeEnum, 'HANDOPERATEDACTUATOR', INDETERMINATE) -hydraulicactuator = express_getattr(IfcActuatorTypeEnum, 'HYDRAULICACTUATOR', INDETERMINATE) -pneumaticactuator = express_getattr(IfcActuatorTypeEnum, 'PNEUMATICACTUATOR', INDETERMINATE) -thermostaticactuator = express_getattr(IfcActuatorTypeEnum, 'THERMOSTATICACTUATOR', INDETERMINATE) -userdefined = express_getattr(IfcActuatorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcActuatorTypeEnum, 'NOTDEFINED', INDETERMINATE) +electricactuator = IfcActuatorTypeEnum.ELECTRICACTUATOR +handoperatedactuator = IfcActuatorTypeEnum.HANDOPERATEDACTUATOR +hydraulicactuator = IfcActuatorTypeEnum.HYDRAULICACTUATOR +pneumaticactuator = IfcActuatorTypeEnum.PNEUMATICACTUATOR +thermostaticactuator = IfcActuatorTypeEnum.THERMOSTATICACTUATOR +userdefined = IfcActuatorTypeEnum.USERDEFINED +notdefined = IfcActuatorTypeEnum.NOTDEFINED IfcAddressTypeEnum = enum_namespace() -office = express_getattr(IfcAddressTypeEnum, 'OFFICE', INDETERMINATE) -site = express_getattr(IfcAddressTypeEnum, 'SITE', INDETERMINATE) -home = express_getattr(IfcAddressTypeEnum, 'HOME', INDETERMINATE) -distributionpoint = express_getattr(IfcAddressTypeEnum, 'DISTRIBUTIONPOINT', INDETERMINATE) -userdefined = express_getattr(IfcAddressTypeEnum, 'USERDEFINED', INDETERMINATE) +office = IfcAddressTypeEnum.OFFICE +site = IfcAddressTypeEnum.SITE +home = IfcAddressTypeEnum.HOME +distributionpoint = IfcAddressTypeEnum.DISTRIBUTIONPOINT +userdefined = IfcAddressTypeEnum.USERDEFINED IfcAirTerminalBoxTypeEnum = enum_namespace() -constantflow = express_getattr(IfcAirTerminalBoxTypeEnum, 'CONSTANTFLOW', INDETERMINATE) -variableflowpressuredependant = express_getattr(IfcAirTerminalBoxTypeEnum, 'VARIABLEFLOWPRESSUREDEPENDANT', INDETERMINATE) -variableflowpressureindependant = express_getattr(IfcAirTerminalBoxTypeEnum, 'VARIABLEFLOWPRESSUREINDEPENDANT', INDETERMINATE) -userdefined = express_getattr(IfcAirTerminalBoxTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAirTerminalBoxTypeEnum, 'NOTDEFINED', INDETERMINATE) +constantflow = IfcAirTerminalBoxTypeEnum.CONSTANTFLOW +variableflowpressuredependant = IfcAirTerminalBoxTypeEnum.VARIABLEFLOWPRESSUREDEPENDANT +variableflowpressureindependant = IfcAirTerminalBoxTypeEnum.VARIABLEFLOWPRESSUREINDEPENDANT +userdefined = IfcAirTerminalBoxTypeEnum.USERDEFINED +notdefined = IfcAirTerminalBoxTypeEnum.NOTDEFINED IfcAirTerminalTypeEnum = enum_namespace() -diffuser = express_getattr(IfcAirTerminalTypeEnum, 'DIFFUSER', INDETERMINATE) -grille = express_getattr(IfcAirTerminalTypeEnum, 'GRILLE', INDETERMINATE) -louvre = express_getattr(IfcAirTerminalTypeEnum, 'LOUVRE', INDETERMINATE) -register = express_getattr(IfcAirTerminalTypeEnum, 'REGISTER', INDETERMINATE) -userdefined = express_getattr(IfcAirTerminalTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAirTerminalTypeEnum, 'NOTDEFINED', INDETERMINATE) +diffuser = IfcAirTerminalTypeEnum.DIFFUSER +grille = IfcAirTerminalTypeEnum.GRILLE +louvre = IfcAirTerminalTypeEnum.LOUVRE +register = IfcAirTerminalTypeEnum.REGISTER +userdefined = IfcAirTerminalTypeEnum.USERDEFINED +notdefined = IfcAirTerminalTypeEnum.NOTDEFINED IfcAirToAirHeatRecoveryTypeEnum = enum_namespace() -fixedplatecounterflowexchanger = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'FIXEDPLATECOUNTERFLOWEXCHANGER', INDETERMINATE) -fixedplatecrossflowexchanger = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'FIXEDPLATECROSSFLOWEXCHANGER', INDETERMINATE) -fixedplateparallelflowexchanger = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'FIXEDPLATEPARALLELFLOWEXCHANGER', INDETERMINATE) -rotarywheel = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'ROTARYWHEEL', INDETERMINATE) -runaroundcoilloop = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'RUNAROUNDCOILLOOP', INDETERMINATE) -heatpipe = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'HEATPIPE', INDETERMINATE) -twintowerenthalpyrecoveryloops = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'TWINTOWERENTHALPYRECOVERYLOOPS', INDETERMINATE) -thermosiphonsealedtubeheatexchangers = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'THERMOSIPHONSEALEDTUBEHEATEXCHANGERS', INDETERMINATE) -thermosiphoncoiltypeheatexchangers = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'THERMOSIPHONCOILTYPEHEATEXCHANGERS', INDETERMINATE) -userdefined = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'NOTDEFINED', INDETERMINATE) +fixedplatecounterflowexchanger = IfcAirToAirHeatRecoveryTypeEnum.FIXEDPLATECOUNTERFLOWEXCHANGER +fixedplatecrossflowexchanger = IfcAirToAirHeatRecoveryTypeEnum.FIXEDPLATECROSSFLOWEXCHANGER +fixedplateparallelflowexchanger = IfcAirToAirHeatRecoveryTypeEnum.FIXEDPLATEPARALLELFLOWEXCHANGER +rotarywheel = IfcAirToAirHeatRecoveryTypeEnum.ROTARYWHEEL +runaroundcoilloop = IfcAirToAirHeatRecoveryTypeEnum.RUNAROUNDCOILLOOP +heatpipe = IfcAirToAirHeatRecoveryTypeEnum.HEATPIPE +twintowerenthalpyrecoveryloops = IfcAirToAirHeatRecoveryTypeEnum.TWINTOWERENTHALPYRECOVERYLOOPS +thermosiphonsealedtubeheatexchangers = IfcAirToAirHeatRecoveryTypeEnum.THERMOSIPHONSEALEDTUBEHEATEXCHANGERS +thermosiphoncoiltypeheatexchangers = IfcAirToAirHeatRecoveryTypeEnum.THERMOSIPHONCOILTYPEHEATEXCHANGERS +userdefined = IfcAirToAirHeatRecoveryTypeEnum.USERDEFINED +notdefined = IfcAirToAirHeatRecoveryTypeEnum.NOTDEFINED IfcAlarmTypeEnum = enum_namespace() -bell = express_getattr(IfcAlarmTypeEnum, 'BELL', INDETERMINATE) -breakglassbutton = express_getattr(IfcAlarmTypeEnum, 'BREAKGLASSBUTTON', INDETERMINATE) -light = express_getattr(IfcAlarmTypeEnum, 'LIGHT', INDETERMINATE) -manualpullbox = express_getattr(IfcAlarmTypeEnum, 'MANUALPULLBOX', INDETERMINATE) -siren = express_getattr(IfcAlarmTypeEnum, 'SIREN', INDETERMINATE) -whistle = express_getattr(IfcAlarmTypeEnum, 'WHISTLE', INDETERMINATE) -railwaycrocodile = express_getattr(IfcAlarmTypeEnum, 'RAILWAYCROCODILE', INDETERMINATE) -railwaydetonator = express_getattr(IfcAlarmTypeEnum, 'RAILWAYDETONATOR', INDETERMINATE) -userdefined = express_getattr(IfcAlarmTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAlarmTypeEnum, 'NOTDEFINED', INDETERMINATE) +bell = IfcAlarmTypeEnum.BELL +breakglassbutton = IfcAlarmTypeEnum.BREAKGLASSBUTTON +light = IfcAlarmTypeEnum.LIGHT +manualpullbox = IfcAlarmTypeEnum.MANUALPULLBOX +siren = IfcAlarmTypeEnum.SIREN +whistle = IfcAlarmTypeEnum.WHISTLE +railwaycrocodile = IfcAlarmTypeEnum.RAILWAYCROCODILE +railwaydetonator = IfcAlarmTypeEnum.RAILWAYDETONATOR +userdefined = IfcAlarmTypeEnum.USERDEFINED +notdefined = IfcAlarmTypeEnum.NOTDEFINED IfcAlignmentCantSegmentTypeEnum = enum_namespace() -constantcant = express_getattr(IfcAlignmentCantSegmentTypeEnum, 'CONSTANTCANT', INDETERMINATE) -lineartransition = express_getattr(IfcAlignmentCantSegmentTypeEnum, 'LINEARTRANSITION', INDETERMINATE) -helmertcurve = express_getattr(IfcAlignmentCantSegmentTypeEnum, 'HELMERTCURVE', INDETERMINATE) -blosscurve = express_getattr(IfcAlignmentCantSegmentTypeEnum, 'BLOSSCURVE', INDETERMINATE) -cosinecurve = express_getattr(IfcAlignmentCantSegmentTypeEnum, 'COSINECURVE', INDETERMINATE) -sinecurve = express_getattr(IfcAlignmentCantSegmentTypeEnum, 'SINECURVE', INDETERMINATE) -viennesebend = express_getattr(IfcAlignmentCantSegmentTypeEnum, 'VIENNESEBEND', INDETERMINATE) +constantcant = IfcAlignmentCantSegmentTypeEnum.CONSTANTCANT +lineartransition = IfcAlignmentCantSegmentTypeEnum.LINEARTRANSITION +helmertcurve = IfcAlignmentCantSegmentTypeEnum.HELMERTCURVE +blosscurve = IfcAlignmentCantSegmentTypeEnum.BLOSSCURVE +cosinecurve = IfcAlignmentCantSegmentTypeEnum.COSINECURVE +sinecurve = IfcAlignmentCantSegmentTypeEnum.SINECURVE +viennesebend = IfcAlignmentCantSegmentTypeEnum.VIENNESEBEND IfcAlignmentHorizontalSegmentTypeEnum = enum_namespace() -line = express_getattr(IfcAlignmentHorizontalSegmentTypeEnum, 'LINE', INDETERMINATE) -circulararc = express_getattr(IfcAlignmentHorizontalSegmentTypeEnum, 'CIRCULARARC', INDETERMINATE) -clothoid = express_getattr(IfcAlignmentHorizontalSegmentTypeEnum, 'CLOTHOID', INDETERMINATE) -cubic = express_getattr(IfcAlignmentHorizontalSegmentTypeEnum, 'CUBIC', INDETERMINATE) -helmertcurve = express_getattr(IfcAlignmentHorizontalSegmentTypeEnum, 'HELMERTCURVE', INDETERMINATE) -blosscurve = express_getattr(IfcAlignmentHorizontalSegmentTypeEnum, 'BLOSSCURVE', INDETERMINATE) -cubicspiral = express_getattr(IfcAlignmentHorizontalSegmentTypeEnum, 'CUBICSPIRAL', INDETERMINATE) -cosinecurve = express_getattr(IfcAlignmentHorizontalSegmentTypeEnum, 'COSINECURVE', INDETERMINATE) -sinecurve = express_getattr(IfcAlignmentHorizontalSegmentTypeEnum, 'SINECURVE', INDETERMINATE) -viennesebend = express_getattr(IfcAlignmentHorizontalSegmentTypeEnum, 'VIENNESEBEND', INDETERMINATE) +line = IfcAlignmentHorizontalSegmentTypeEnum.LINE +circulararc = IfcAlignmentHorizontalSegmentTypeEnum.CIRCULARARC +clothoid = IfcAlignmentHorizontalSegmentTypeEnum.CLOTHOID +cubic = IfcAlignmentHorizontalSegmentTypeEnum.CUBIC +helmertcurve = IfcAlignmentHorizontalSegmentTypeEnum.HELMERTCURVE +blosscurve = IfcAlignmentHorizontalSegmentTypeEnum.BLOSSCURVE +cubicspiral = IfcAlignmentHorizontalSegmentTypeEnum.CUBICSPIRAL +cosinecurve = IfcAlignmentHorizontalSegmentTypeEnum.COSINECURVE +sinecurve = IfcAlignmentHorizontalSegmentTypeEnum.SINECURVE +viennesebend = IfcAlignmentHorizontalSegmentTypeEnum.VIENNESEBEND IfcAlignmentTypeEnum = enum_namespace() -userdefined = express_getattr(IfcAlignmentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAlignmentTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcAlignmentTypeEnum.USERDEFINED +notdefined = IfcAlignmentTypeEnum.NOTDEFINED IfcAlignmentVerticalSegmentTypeEnum = enum_namespace() -constantgradient = express_getattr(IfcAlignmentVerticalSegmentTypeEnum, 'CONSTANTGRADIENT', INDETERMINATE) -circulararc = express_getattr(IfcAlignmentVerticalSegmentTypeEnum, 'CIRCULARARC', INDETERMINATE) -parabolicarc = express_getattr(IfcAlignmentVerticalSegmentTypeEnum, 'PARABOLICARC', INDETERMINATE) -clothoid = express_getattr(IfcAlignmentVerticalSegmentTypeEnum, 'CLOTHOID', INDETERMINATE) +constantgradient = IfcAlignmentVerticalSegmentTypeEnum.CONSTANTGRADIENT +circulararc = IfcAlignmentVerticalSegmentTypeEnum.CIRCULARARC +parabolicarc = IfcAlignmentVerticalSegmentTypeEnum.PARABOLICARC +clothoid = IfcAlignmentVerticalSegmentTypeEnum.CLOTHOID IfcAnalysisModelTypeEnum = enum_namespace() -in_plane_loading_2d = express_getattr(IfcAnalysisModelTypeEnum, 'IN_PLANE_LOADING_2D', INDETERMINATE) -out_plane_loading_2d = express_getattr(IfcAnalysisModelTypeEnum, 'OUT_PLANE_LOADING_2D', INDETERMINATE) -loading_3d = express_getattr(IfcAnalysisModelTypeEnum, 'LOADING_3D', INDETERMINATE) -userdefined = express_getattr(IfcAnalysisModelTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAnalysisModelTypeEnum, 'NOTDEFINED', INDETERMINATE) +in_plane_loading_2d = IfcAnalysisModelTypeEnum.IN_PLANE_LOADING_2D +out_plane_loading_2d = IfcAnalysisModelTypeEnum.OUT_PLANE_LOADING_2D +loading_3d = IfcAnalysisModelTypeEnum.LOADING_3D +userdefined = IfcAnalysisModelTypeEnum.USERDEFINED +notdefined = IfcAnalysisModelTypeEnum.NOTDEFINED IfcAnalysisTheoryTypeEnum = enum_namespace() -first_order_theory = express_getattr(IfcAnalysisTheoryTypeEnum, 'FIRST_ORDER_THEORY', INDETERMINATE) -second_order_theory = express_getattr(IfcAnalysisTheoryTypeEnum, 'SECOND_ORDER_THEORY', INDETERMINATE) -third_order_theory = express_getattr(IfcAnalysisTheoryTypeEnum, 'THIRD_ORDER_THEORY', INDETERMINATE) -full_nonlinear_theory = express_getattr(IfcAnalysisTheoryTypeEnum, 'FULL_NONLINEAR_THEORY', INDETERMINATE) -userdefined = express_getattr(IfcAnalysisTheoryTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAnalysisTheoryTypeEnum, 'NOTDEFINED', INDETERMINATE) +first_order_theory = IfcAnalysisTheoryTypeEnum.FIRST_ORDER_THEORY +second_order_theory = IfcAnalysisTheoryTypeEnum.SECOND_ORDER_THEORY +third_order_theory = IfcAnalysisTheoryTypeEnum.THIRD_ORDER_THEORY +full_nonlinear_theory = IfcAnalysisTheoryTypeEnum.FULL_NONLINEAR_THEORY +userdefined = IfcAnalysisTheoryTypeEnum.USERDEFINED +notdefined = IfcAnalysisTheoryTypeEnum.NOTDEFINED IfcAnnotationTypeEnum = enum_namespace() -assumedpoint = express_getattr(IfcAnnotationTypeEnum, 'ASSUMEDPOINT', INDETERMINATE) -asbuiltarea = express_getattr(IfcAnnotationTypeEnum, 'ASBUILTAREA', INDETERMINATE) -asbuiltline = express_getattr(IfcAnnotationTypeEnum, 'ASBUILTLINE', INDETERMINATE) -non_physical_signal = express_getattr(IfcAnnotationTypeEnum, 'NON_PHYSICAL_SIGNAL', INDETERMINATE) -assumedline = express_getattr(IfcAnnotationTypeEnum, 'ASSUMEDLINE', INDETERMINATE) -widthevent = express_getattr(IfcAnnotationTypeEnum, 'WIDTHEVENT', INDETERMINATE) -assumedarea = express_getattr(IfcAnnotationTypeEnum, 'ASSUMEDAREA', INDETERMINATE) -superelevationevent = express_getattr(IfcAnnotationTypeEnum, 'SUPERELEVATIONEVENT', INDETERMINATE) -asbuiltpoint = express_getattr(IfcAnnotationTypeEnum, 'ASBUILTPOINT', INDETERMINATE) -userdefined = express_getattr(IfcAnnotationTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAnnotationTypeEnum, 'NOTDEFINED', INDETERMINATE) +assumedpoint = IfcAnnotationTypeEnum.ASSUMEDPOINT +asbuiltarea = IfcAnnotationTypeEnum.ASBUILTAREA +asbuiltline = IfcAnnotationTypeEnum.ASBUILTLINE +non_physical_signal = IfcAnnotationTypeEnum.NON_PHYSICAL_SIGNAL +assumedline = IfcAnnotationTypeEnum.ASSUMEDLINE +widthevent = IfcAnnotationTypeEnum.WIDTHEVENT +assumedarea = IfcAnnotationTypeEnum.ASSUMEDAREA +superelevationevent = IfcAnnotationTypeEnum.SUPERELEVATIONEVENT +asbuiltpoint = IfcAnnotationTypeEnum.ASBUILTPOINT +userdefined = IfcAnnotationTypeEnum.USERDEFINED +notdefined = IfcAnnotationTypeEnum.NOTDEFINED IfcArithmeticOperatorEnum = enum_namespace() -add = express_getattr(IfcArithmeticOperatorEnum, 'ADD', INDETERMINATE) -divide = express_getattr(IfcArithmeticOperatorEnum, 'DIVIDE', INDETERMINATE) -multiply = express_getattr(IfcArithmeticOperatorEnum, 'MULTIPLY', INDETERMINATE) -subtract = express_getattr(IfcArithmeticOperatorEnum, 'SUBTRACT', INDETERMINATE) +add = IfcArithmeticOperatorEnum.ADD +divide = IfcArithmeticOperatorEnum.DIVIDE +multiply = IfcArithmeticOperatorEnum.MULTIPLY +subtract = IfcArithmeticOperatorEnum.SUBTRACT IfcAssemblyPlaceEnum = enum_namespace() -site = express_getattr(IfcAssemblyPlaceEnum, 'SITE', INDETERMINATE) -factory = express_getattr(IfcAssemblyPlaceEnum, 'FACTORY', INDETERMINATE) -notdefined = express_getattr(IfcAssemblyPlaceEnum, 'NOTDEFINED', INDETERMINATE) +site = IfcAssemblyPlaceEnum.SITE +factory = IfcAssemblyPlaceEnum.FACTORY +notdefined = IfcAssemblyPlaceEnum.NOTDEFINED IfcAudioVisualApplianceTypeEnum = enum_namespace() -amplifier = express_getattr(IfcAudioVisualApplianceTypeEnum, 'AMPLIFIER', INDETERMINATE) -camera = express_getattr(IfcAudioVisualApplianceTypeEnum, 'CAMERA', INDETERMINATE) -display = express_getattr(IfcAudioVisualApplianceTypeEnum, 'DISPLAY', INDETERMINATE) -microphone = express_getattr(IfcAudioVisualApplianceTypeEnum, 'MICROPHONE', INDETERMINATE) -player = express_getattr(IfcAudioVisualApplianceTypeEnum, 'PLAYER', INDETERMINATE) -projector = express_getattr(IfcAudioVisualApplianceTypeEnum, 'PROJECTOR', INDETERMINATE) -receiver = express_getattr(IfcAudioVisualApplianceTypeEnum, 'RECEIVER', INDETERMINATE) -speaker = express_getattr(IfcAudioVisualApplianceTypeEnum, 'SPEAKER', INDETERMINATE) -switcher = express_getattr(IfcAudioVisualApplianceTypeEnum, 'SWITCHER', INDETERMINATE) -telephone = express_getattr(IfcAudioVisualApplianceTypeEnum, 'TELEPHONE', INDETERMINATE) -tuner = express_getattr(IfcAudioVisualApplianceTypeEnum, 'TUNER', INDETERMINATE) -railway_communication_terminal = express_getattr(IfcAudioVisualApplianceTypeEnum, 'RAILWAY_COMMUNICATION_TERMINAL', INDETERMINATE) -userdefined = express_getattr(IfcAudioVisualApplianceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAudioVisualApplianceTypeEnum, 'NOTDEFINED', INDETERMINATE) +amplifier = IfcAudioVisualApplianceTypeEnum.AMPLIFIER +camera = IfcAudioVisualApplianceTypeEnum.CAMERA +display = IfcAudioVisualApplianceTypeEnum.DISPLAY +microphone = IfcAudioVisualApplianceTypeEnum.MICROPHONE +player = IfcAudioVisualApplianceTypeEnum.PLAYER +projector = IfcAudioVisualApplianceTypeEnum.PROJECTOR +receiver = IfcAudioVisualApplianceTypeEnum.RECEIVER +speaker = IfcAudioVisualApplianceTypeEnum.SPEAKER +switcher = IfcAudioVisualApplianceTypeEnum.SWITCHER +telephone = IfcAudioVisualApplianceTypeEnum.TELEPHONE +tuner = IfcAudioVisualApplianceTypeEnum.TUNER +railway_communication_terminal = IfcAudioVisualApplianceTypeEnum.RAILWAY_COMMUNICATION_TERMINAL +userdefined = IfcAudioVisualApplianceTypeEnum.USERDEFINED +notdefined = IfcAudioVisualApplianceTypeEnum.NOTDEFINED IfcBSplineCurveForm = enum_namespace() -polyline_form = express_getattr(IfcBSplineCurveForm, 'POLYLINE_FORM', INDETERMINATE) -circular_arc = express_getattr(IfcBSplineCurveForm, 'CIRCULAR_ARC', INDETERMINATE) -elliptic_arc = express_getattr(IfcBSplineCurveForm, 'ELLIPTIC_ARC', INDETERMINATE) -parabolic_arc = express_getattr(IfcBSplineCurveForm, 'PARABOLIC_ARC', INDETERMINATE) -hyperbolic_arc = express_getattr(IfcBSplineCurveForm, 'HYPERBOLIC_ARC', INDETERMINATE) -unspecified = express_getattr(IfcBSplineCurveForm, 'UNSPECIFIED', INDETERMINATE) +polyline_form = IfcBSplineCurveForm.POLYLINE_FORM +circular_arc = IfcBSplineCurveForm.CIRCULAR_ARC +elliptic_arc = IfcBSplineCurveForm.ELLIPTIC_ARC +parabolic_arc = IfcBSplineCurveForm.PARABOLIC_ARC +hyperbolic_arc = IfcBSplineCurveForm.HYPERBOLIC_ARC +unspecified = IfcBSplineCurveForm.UNSPECIFIED IfcBSplineSurfaceForm = enum_namespace() -plane_surf = express_getattr(IfcBSplineSurfaceForm, 'PLANE_SURF', INDETERMINATE) -cylindrical_surf = express_getattr(IfcBSplineSurfaceForm, 'CYLINDRICAL_SURF', INDETERMINATE) -conical_surf = express_getattr(IfcBSplineSurfaceForm, 'CONICAL_SURF', INDETERMINATE) -spherical_surf = express_getattr(IfcBSplineSurfaceForm, 'SPHERICAL_SURF', INDETERMINATE) -toroidal_surf = express_getattr(IfcBSplineSurfaceForm, 'TOROIDAL_SURF', INDETERMINATE) -surf_of_revolution = express_getattr(IfcBSplineSurfaceForm, 'SURF_OF_REVOLUTION', INDETERMINATE) -ruled_surf = express_getattr(IfcBSplineSurfaceForm, 'RULED_SURF', INDETERMINATE) -generalised_cone = express_getattr(IfcBSplineSurfaceForm, 'GENERALISED_CONE', INDETERMINATE) -quadric_surf = express_getattr(IfcBSplineSurfaceForm, 'QUADRIC_SURF', INDETERMINATE) -surf_of_linear_extrusion = express_getattr(IfcBSplineSurfaceForm, 'SURF_OF_LINEAR_EXTRUSION', INDETERMINATE) -unspecified = express_getattr(IfcBSplineSurfaceForm, 'UNSPECIFIED', INDETERMINATE) +plane_surf = IfcBSplineSurfaceForm.PLANE_SURF +cylindrical_surf = IfcBSplineSurfaceForm.CYLINDRICAL_SURF +conical_surf = IfcBSplineSurfaceForm.CONICAL_SURF +spherical_surf = IfcBSplineSurfaceForm.SPHERICAL_SURF +toroidal_surf = IfcBSplineSurfaceForm.TOROIDAL_SURF +surf_of_revolution = IfcBSplineSurfaceForm.SURF_OF_REVOLUTION +ruled_surf = IfcBSplineSurfaceForm.RULED_SURF +generalised_cone = IfcBSplineSurfaceForm.GENERALISED_CONE +quadric_surf = IfcBSplineSurfaceForm.QUADRIC_SURF +surf_of_linear_extrusion = IfcBSplineSurfaceForm.SURF_OF_LINEAR_EXTRUSION +unspecified = IfcBSplineSurfaceForm.UNSPECIFIED IfcBeamTypeEnum = enum_namespace() -beam = express_getattr(IfcBeamTypeEnum, 'BEAM', INDETERMINATE) -joist = express_getattr(IfcBeamTypeEnum, 'JOIST', INDETERMINATE) -hollowcore = express_getattr(IfcBeamTypeEnum, 'HOLLOWCORE', INDETERMINATE) -lintel = express_getattr(IfcBeamTypeEnum, 'LINTEL', INDETERMINATE) -spandrel = express_getattr(IfcBeamTypeEnum, 'SPANDREL', INDETERMINATE) -t_beam = express_getattr(IfcBeamTypeEnum, 'T_BEAM', INDETERMINATE) -girder_segment = express_getattr(IfcBeamTypeEnum, 'GIRDER_SEGMENT', INDETERMINATE) -diaphragm = express_getattr(IfcBeamTypeEnum, 'DIAPHRAGM', INDETERMINATE) -piercap = express_getattr(IfcBeamTypeEnum, 'PIERCAP', INDETERMINATE) -hatstone = express_getattr(IfcBeamTypeEnum, 'HATSTONE', INDETERMINATE) -cornice = express_getattr(IfcBeamTypeEnum, 'CORNICE', INDETERMINATE) -edgebeam = express_getattr(IfcBeamTypeEnum, 'EDGEBEAM', INDETERMINATE) -userdefined = express_getattr(IfcBeamTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBeamTypeEnum, 'NOTDEFINED', INDETERMINATE) +beam = IfcBeamTypeEnum.BEAM +joist = IfcBeamTypeEnum.JOIST +hollowcore = IfcBeamTypeEnum.HOLLOWCORE +lintel = IfcBeamTypeEnum.LINTEL +spandrel = IfcBeamTypeEnum.SPANDREL +t_beam = IfcBeamTypeEnum.T_BEAM +girder_segment = IfcBeamTypeEnum.GIRDER_SEGMENT +diaphragm = IfcBeamTypeEnum.DIAPHRAGM +piercap = IfcBeamTypeEnum.PIERCAP +hatstone = IfcBeamTypeEnum.HATSTONE +cornice = IfcBeamTypeEnum.CORNICE +edgebeam = IfcBeamTypeEnum.EDGEBEAM +userdefined = IfcBeamTypeEnum.USERDEFINED +notdefined = IfcBeamTypeEnum.NOTDEFINED IfcBearingTypeDisplacementEnum = enum_namespace() -fixed_movement = express_getattr(IfcBearingTypeDisplacementEnum, 'FIXED_MOVEMENT', INDETERMINATE) -guided_longitudinal = express_getattr(IfcBearingTypeDisplacementEnum, 'GUIDED_LONGITUDINAL', INDETERMINATE) -guided_transversal = express_getattr(IfcBearingTypeDisplacementEnum, 'GUIDED_TRANSVERSAL', INDETERMINATE) -free_movement = express_getattr(IfcBearingTypeDisplacementEnum, 'FREE_MOVEMENT', INDETERMINATE) -notdefined = express_getattr(IfcBearingTypeDisplacementEnum, 'NOTDEFINED', INDETERMINATE) +fixed_movement = IfcBearingTypeDisplacementEnum.FIXED_MOVEMENT +guided_longitudinal = IfcBearingTypeDisplacementEnum.GUIDED_LONGITUDINAL +guided_transversal = IfcBearingTypeDisplacementEnum.GUIDED_TRANSVERSAL +free_movement = IfcBearingTypeDisplacementEnum.FREE_MOVEMENT +notdefined = IfcBearingTypeDisplacementEnum.NOTDEFINED IfcBearingTypeEnum = enum_namespace() -cylindrical = express_getattr(IfcBearingTypeEnum, 'CYLINDRICAL', INDETERMINATE) -spherical = express_getattr(IfcBearingTypeEnum, 'SPHERICAL', INDETERMINATE) -elastomeric = express_getattr(IfcBearingTypeEnum, 'ELASTOMERIC', INDETERMINATE) -pot = express_getattr(IfcBearingTypeEnum, 'POT', INDETERMINATE) -guide = express_getattr(IfcBearingTypeEnum, 'GUIDE', INDETERMINATE) -rocker = express_getattr(IfcBearingTypeEnum, 'ROCKER', INDETERMINATE) -roller = express_getattr(IfcBearingTypeEnum, 'ROLLER', INDETERMINATE) -disk = express_getattr(IfcBearingTypeEnum, 'DISK', INDETERMINATE) -userdefined = express_getattr(IfcBearingTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBearingTypeEnum, 'NOTDEFINED', INDETERMINATE) +cylindrical = IfcBearingTypeEnum.CYLINDRICAL +spherical = IfcBearingTypeEnum.SPHERICAL +elastomeric = IfcBearingTypeEnum.ELASTOMERIC +pot = IfcBearingTypeEnum.POT +guide = IfcBearingTypeEnum.GUIDE +rocker = IfcBearingTypeEnum.ROCKER +roller = IfcBearingTypeEnum.ROLLER +disk = IfcBearingTypeEnum.DISK +userdefined = IfcBearingTypeEnum.USERDEFINED +notdefined = IfcBearingTypeEnum.NOTDEFINED IfcBenchmarkEnum = enum_namespace() -greaterthan = express_getattr(IfcBenchmarkEnum, 'GREATERTHAN', INDETERMINATE) -greaterthanorequalto = express_getattr(IfcBenchmarkEnum, 'GREATERTHANOREQUALTO', INDETERMINATE) -lessthan = express_getattr(IfcBenchmarkEnum, 'LESSTHAN', INDETERMINATE) -lessthanorequalto = express_getattr(IfcBenchmarkEnum, 'LESSTHANOREQUALTO', INDETERMINATE) -equalto = express_getattr(IfcBenchmarkEnum, 'EQUALTO', INDETERMINATE) -notequalto = express_getattr(IfcBenchmarkEnum, 'NOTEQUALTO', INDETERMINATE) -includes = express_getattr(IfcBenchmarkEnum, 'INCLUDES', INDETERMINATE) -notincludes = express_getattr(IfcBenchmarkEnum, 'NOTINCLUDES', INDETERMINATE) -includedin = express_getattr(IfcBenchmarkEnum, 'INCLUDEDIN', INDETERMINATE) -notincludedin = express_getattr(IfcBenchmarkEnum, 'NOTINCLUDEDIN', INDETERMINATE) +greaterthan = IfcBenchmarkEnum.GREATERTHAN +greaterthanorequalto = IfcBenchmarkEnum.GREATERTHANOREQUALTO +lessthan = IfcBenchmarkEnum.LESSTHAN +lessthanorequalto = IfcBenchmarkEnum.LESSTHANOREQUALTO +equalto = IfcBenchmarkEnum.EQUALTO +notequalto = IfcBenchmarkEnum.NOTEQUALTO +includes = IfcBenchmarkEnum.INCLUDES +notincludes = IfcBenchmarkEnum.NOTINCLUDES +includedin = IfcBenchmarkEnum.INCLUDEDIN +notincludedin = IfcBenchmarkEnum.NOTINCLUDEDIN IfcBoilerTypeEnum = enum_namespace() -water = express_getattr(IfcBoilerTypeEnum, 'WATER', INDETERMINATE) -steam = express_getattr(IfcBoilerTypeEnum, 'STEAM', INDETERMINATE) -userdefined = express_getattr(IfcBoilerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBoilerTypeEnum, 'NOTDEFINED', INDETERMINATE) +water = IfcBoilerTypeEnum.WATER +steam = IfcBoilerTypeEnum.STEAM +userdefined = IfcBoilerTypeEnum.USERDEFINED +notdefined = IfcBoilerTypeEnum.NOTDEFINED IfcBooleanOperator = enum_namespace() -union = express_getattr(IfcBooleanOperator, 'UNION', INDETERMINATE) -intersection = express_getattr(IfcBooleanOperator, 'INTERSECTION', INDETERMINATE) -difference = express_getattr(IfcBooleanOperator, 'DIFFERENCE', INDETERMINATE) +union = IfcBooleanOperator.UNION +intersection = IfcBooleanOperator.INTERSECTION +difference = IfcBooleanOperator.DIFFERENCE IfcBridgePartTypeEnum = enum_namespace() -abutment = express_getattr(IfcBridgePartTypeEnum, 'ABUTMENT', INDETERMINATE) -deck = express_getattr(IfcBridgePartTypeEnum, 'DECK', INDETERMINATE) -deck_segment = express_getattr(IfcBridgePartTypeEnum, 'DECK_SEGMENT', INDETERMINATE) -foundation = express_getattr(IfcBridgePartTypeEnum, 'FOUNDATION', INDETERMINATE) -pier = express_getattr(IfcBridgePartTypeEnum, 'PIER', INDETERMINATE) -pier_segment = express_getattr(IfcBridgePartTypeEnum, 'PIER_SEGMENT', INDETERMINATE) -pylon = express_getattr(IfcBridgePartTypeEnum, 'PYLON', INDETERMINATE) -substructure = express_getattr(IfcBridgePartTypeEnum, 'SUBSTRUCTURE', INDETERMINATE) -superstructure = express_getattr(IfcBridgePartTypeEnum, 'SUPERSTRUCTURE', INDETERMINATE) -surfacestructure = express_getattr(IfcBridgePartTypeEnum, 'SURFACESTRUCTURE', INDETERMINATE) -userdefined = express_getattr(IfcBridgePartTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBridgePartTypeEnum, 'NOTDEFINED', INDETERMINATE) +abutment = IfcBridgePartTypeEnum.ABUTMENT +deck = IfcBridgePartTypeEnum.DECK +deck_segment = IfcBridgePartTypeEnum.DECK_SEGMENT +foundation = IfcBridgePartTypeEnum.FOUNDATION +pier = IfcBridgePartTypeEnum.PIER +pier_segment = IfcBridgePartTypeEnum.PIER_SEGMENT +pylon = IfcBridgePartTypeEnum.PYLON +substructure = IfcBridgePartTypeEnum.SUBSTRUCTURE +superstructure = IfcBridgePartTypeEnum.SUPERSTRUCTURE +surfacestructure = IfcBridgePartTypeEnum.SURFACESTRUCTURE +userdefined = IfcBridgePartTypeEnum.USERDEFINED +notdefined = IfcBridgePartTypeEnum.NOTDEFINED IfcBridgeTypeEnum = enum_namespace() -arched = express_getattr(IfcBridgeTypeEnum, 'ARCHED', INDETERMINATE) -cable_stayed = express_getattr(IfcBridgeTypeEnum, 'CABLE_STAYED', INDETERMINATE) -cantilever = express_getattr(IfcBridgeTypeEnum, 'CANTILEVER', INDETERMINATE) -culvert = express_getattr(IfcBridgeTypeEnum, 'CULVERT', INDETERMINATE) -framework = express_getattr(IfcBridgeTypeEnum, 'FRAMEWORK', INDETERMINATE) -girder = express_getattr(IfcBridgeTypeEnum, 'GIRDER', INDETERMINATE) -suspension = express_getattr(IfcBridgeTypeEnum, 'SUSPENSION', INDETERMINATE) -truss = express_getattr(IfcBridgeTypeEnum, 'TRUSS', INDETERMINATE) -userdefined = express_getattr(IfcBridgeTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBridgeTypeEnum, 'NOTDEFINED', INDETERMINATE) +arched = IfcBridgeTypeEnum.ARCHED +cable_stayed = IfcBridgeTypeEnum.CABLE_STAYED +cantilever = IfcBridgeTypeEnum.CANTILEVER +culvert = IfcBridgeTypeEnum.CULVERT +framework = IfcBridgeTypeEnum.FRAMEWORK +girder = IfcBridgeTypeEnum.GIRDER +suspension = IfcBridgeTypeEnum.SUSPENSION +truss = IfcBridgeTypeEnum.TRUSS +userdefined = IfcBridgeTypeEnum.USERDEFINED +notdefined = IfcBridgeTypeEnum.NOTDEFINED IfcBuildingElementPartTypeEnum = enum_namespace() -insulation = express_getattr(IfcBuildingElementPartTypeEnum, 'INSULATION', INDETERMINATE) -precastpanel = express_getattr(IfcBuildingElementPartTypeEnum, 'PRECASTPANEL', INDETERMINATE) -apron = express_getattr(IfcBuildingElementPartTypeEnum, 'APRON', INDETERMINATE) -armourunit = express_getattr(IfcBuildingElementPartTypeEnum, 'ARMOURUNIT', INDETERMINATE) -safetycage = express_getattr(IfcBuildingElementPartTypeEnum, 'SAFETYCAGE', INDETERMINATE) -userdefined = express_getattr(IfcBuildingElementPartTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBuildingElementPartTypeEnum, 'NOTDEFINED', INDETERMINATE) +insulation = IfcBuildingElementPartTypeEnum.INSULATION +precastpanel = IfcBuildingElementPartTypeEnum.PRECASTPANEL +apron = IfcBuildingElementPartTypeEnum.APRON +armourunit = IfcBuildingElementPartTypeEnum.ARMOURUNIT +safetycage = IfcBuildingElementPartTypeEnum.SAFETYCAGE +userdefined = IfcBuildingElementPartTypeEnum.USERDEFINED +notdefined = IfcBuildingElementPartTypeEnum.NOTDEFINED IfcBuildingElementProxyTypeEnum = enum_namespace() -complex = express_getattr(IfcBuildingElementProxyTypeEnum, 'COMPLEX', INDETERMINATE) -element = express_getattr(IfcBuildingElementProxyTypeEnum, 'ELEMENT', INDETERMINATE) -partial = express_getattr(IfcBuildingElementProxyTypeEnum, 'PARTIAL', INDETERMINATE) -provisionforvoid = express_getattr(IfcBuildingElementProxyTypeEnum, 'PROVISIONFORVOID', INDETERMINATE) -provisionforspace = express_getattr(IfcBuildingElementProxyTypeEnum, 'PROVISIONFORSPACE', INDETERMINATE) -userdefined = express_getattr(IfcBuildingElementProxyTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBuildingElementProxyTypeEnum, 'NOTDEFINED', INDETERMINATE) +complex = IfcBuildingElementProxyTypeEnum.COMPLEX +element = IfcBuildingElementProxyTypeEnum.ELEMENT +partial = IfcBuildingElementProxyTypeEnum.PARTIAL +provisionforvoid = IfcBuildingElementProxyTypeEnum.PROVISIONFORVOID +provisionforspace = IfcBuildingElementProxyTypeEnum.PROVISIONFORSPACE +userdefined = IfcBuildingElementProxyTypeEnum.USERDEFINED +notdefined = IfcBuildingElementProxyTypeEnum.NOTDEFINED IfcBuildingSystemTypeEnum = enum_namespace() -fenestration = express_getattr(IfcBuildingSystemTypeEnum, 'FENESTRATION', INDETERMINATE) -foundation = express_getattr(IfcBuildingSystemTypeEnum, 'FOUNDATION', INDETERMINATE) -loadbearing = express_getattr(IfcBuildingSystemTypeEnum, 'LOADBEARING', INDETERMINATE) -outershell = express_getattr(IfcBuildingSystemTypeEnum, 'OUTERSHELL', INDETERMINATE) -shading = express_getattr(IfcBuildingSystemTypeEnum, 'SHADING', INDETERMINATE) -transport = express_getattr(IfcBuildingSystemTypeEnum, 'TRANSPORT', INDETERMINATE) -reinforcing = express_getattr(IfcBuildingSystemTypeEnum, 'REINFORCING', INDETERMINATE) -prestressing = express_getattr(IfcBuildingSystemTypeEnum, 'PRESTRESSING', INDETERMINATE) -erosionprevention = express_getattr(IfcBuildingSystemTypeEnum, 'EROSIONPREVENTION', INDETERMINATE) -userdefined = express_getattr(IfcBuildingSystemTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBuildingSystemTypeEnum, 'NOTDEFINED', INDETERMINATE) +fenestration = IfcBuildingSystemTypeEnum.FENESTRATION +foundation = IfcBuildingSystemTypeEnum.FOUNDATION +loadbearing = IfcBuildingSystemTypeEnum.LOADBEARING +outershell = IfcBuildingSystemTypeEnum.OUTERSHELL +shading = IfcBuildingSystemTypeEnum.SHADING +transport = IfcBuildingSystemTypeEnum.TRANSPORT +reinforcing = IfcBuildingSystemTypeEnum.REINFORCING +prestressing = IfcBuildingSystemTypeEnum.PRESTRESSING +erosionprevention = IfcBuildingSystemTypeEnum.EROSIONPREVENTION +userdefined = IfcBuildingSystemTypeEnum.USERDEFINED +notdefined = IfcBuildingSystemTypeEnum.NOTDEFINED IfcBuiltSystemTypeEnum = enum_namespace() -reinforcing = express_getattr(IfcBuiltSystemTypeEnum, 'REINFORCING', INDETERMINATE) -mooring = express_getattr(IfcBuiltSystemTypeEnum, 'MOORING', INDETERMINATE) -outershell = express_getattr(IfcBuiltSystemTypeEnum, 'OUTERSHELL', INDETERMINATE) -trackcircuit = express_getattr(IfcBuiltSystemTypeEnum, 'TRACKCIRCUIT', INDETERMINATE) -erosionprevention = express_getattr(IfcBuiltSystemTypeEnum, 'EROSIONPREVENTION', INDETERMINATE) -foundation = express_getattr(IfcBuiltSystemTypeEnum, 'FOUNDATION', INDETERMINATE) -loadbearing = express_getattr(IfcBuiltSystemTypeEnum, 'LOADBEARING', INDETERMINATE) -shading = express_getattr(IfcBuiltSystemTypeEnum, 'SHADING', INDETERMINATE) -fenestration = express_getattr(IfcBuiltSystemTypeEnum, 'FENESTRATION', INDETERMINATE) -mooringsystem = express_getattr(IfcBuiltSystemTypeEnum, 'MOORINGSYSTEM', INDETERMINATE) -transport = express_getattr(IfcBuiltSystemTypeEnum, 'TRANSPORT', INDETERMINATE) -prestressing = express_getattr(IfcBuiltSystemTypeEnum, 'PRESTRESSING', INDETERMINATE) -userdefined = express_getattr(IfcBuiltSystemTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBuiltSystemTypeEnum, 'NOTDEFINED', INDETERMINATE) +reinforcing = IfcBuiltSystemTypeEnum.REINFORCING +mooring = IfcBuiltSystemTypeEnum.MOORING +outershell = IfcBuiltSystemTypeEnum.OUTERSHELL +trackcircuit = IfcBuiltSystemTypeEnum.TRACKCIRCUIT +erosionprevention = IfcBuiltSystemTypeEnum.EROSIONPREVENTION +foundation = IfcBuiltSystemTypeEnum.FOUNDATION +loadbearing = IfcBuiltSystemTypeEnum.LOADBEARING +shading = IfcBuiltSystemTypeEnum.SHADING +fenestration = IfcBuiltSystemTypeEnum.FENESTRATION +mooringsystem = IfcBuiltSystemTypeEnum.MOORINGSYSTEM +transport = IfcBuiltSystemTypeEnum.TRANSPORT +prestressing = IfcBuiltSystemTypeEnum.PRESTRESSING +userdefined = IfcBuiltSystemTypeEnum.USERDEFINED +notdefined = IfcBuiltSystemTypeEnum.NOTDEFINED IfcBurnerTypeEnum = enum_namespace() -userdefined = express_getattr(IfcBurnerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBurnerTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcBurnerTypeEnum.USERDEFINED +notdefined = IfcBurnerTypeEnum.NOTDEFINED IfcCableCarrierFittingTypeEnum = enum_namespace() -bend = express_getattr(IfcCableCarrierFittingTypeEnum, 'BEND', INDETERMINATE) -cross = express_getattr(IfcCableCarrierFittingTypeEnum, 'CROSS', INDETERMINATE) -reducer = express_getattr(IfcCableCarrierFittingTypeEnum, 'REDUCER', INDETERMINATE) -tee = express_getattr(IfcCableCarrierFittingTypeEnum, 'TEE', INDETERMINATE) -userdefined = express_getattr(IfcCableCarrierFittingTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCableCarrierFittingTypeEnum, 'NOTDEFINED', INDETERMINATE) +bend = IfcCableCarrierFittingTypeEnum.BEND +cross = IfcCableCarrierFittingTypeEnum.CROSS +reducer = IfcCableCarrierFittingTypeEnum.REDUCER +tee = IfcCableCarrierFittingTypeEnum.TEE +userdefined = IfcCableCarrierFittingTypeEnum.USERDEFINED +notdefined = IfcCableCarrierFittingTypeEnum.NOTDEFINED IfcCableCarrierSegmentTypeEnum = enum_namespace() -cableladdersegment = express_getattr(IfcCableCarrierSegmentTypeEnum, 'CABLELADDERSEGMENT', INDETERMINATE) -cabletraysegment = express_getattr(IfcCableCarrierSegmentTypeEnum, 'CABLETRAYSEGMENT', INDETERMINATE) -cabletrunkingsegment = express_getattr(IfcCableCarrierSegmentTypeEnum, 'CABLETRUNKINGSEGMENT', INDETERMINATE) -conduitsegment = express_getattr(IfcCableCarrierSegmentTypeEnum, 'CONDUITSEGMENT', INDETERMINATE) -cablebracket = express_getattr(IfcCableCarrierSegmentTypeEnum, 'CABLEBRACKET', INDETERMINATE) -catenarywire = express_getattr(IfcCableCarrierSegmentTypeEnum, 'CATENARYWIRE', INDETERMINATE) -dropper = express_getattr(IfcCableCarrierSegmentTypeEnum, 'DROPPER', INDETERMINATE) -userdefined = express_getattr(IfcCableCarrierSegmentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCableCarrierSegmentTypeEnum, 'NOTDEFINED', INDETERMINATE) +cableladdersegment = IfcCableCarrierSegmentTypeEnum.CABLELADDERSEGMENT +cabletraysegment = IfcCableCarrierSegmentTypeEnum.CABLETRAYSEGMENT +cabletrunkingsegment = IfcCableCarrierSegmentTypeEnum.CABLETRUNKINGSEGMENT +conduitsegment = IfcCableCarrierSegmentTypeEnum.CONDUITSEGMENT +cablebracket = IfcCableCarrierSegmentTypeEnum.CABLEBRACKET +catenarywire = IfcCableCarrierSegmentTypeEnum.CATENARYWIRE +dropper = IfcCableCarrierSegmentTypeEnum.DROPPER +userdefined = IfcCableCarrierSegmentTypeEnum.USERDEFINED +notdefined = IfcCableCarrierSegmentTypeEnum.NOTDEFINED IfcCableFittingTypeEnum = enum_namespace() -connector = express_getattr(IfcCableFittingTypeEnum, 'CONNECTOR', INDETERMINATE) -entry = express_getattr(IfcCableFittingTypeEnum, 'ENTRY', INDETERMINATE) -exit = express_getattr(IfcCableFittingTypeEnum, 'EXIT', INDETERMINATE) -junction = express_getattr(IfcCableFittingTypeEnum, 'JUNCTION', INDETERMINATE) -transition = express_getattr(IfcCableFittingTypeEnum, 'TRANSITION', INDETERMINATE) -fanout = express_getattr(IfcCableFittingTypeEnum, 'FANOUT', INDETERMINATE) -userdefined = express_getattr(IfcCableFittingTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCableFittingTypeEnum, 'NOTDEFINED', INDETERMINATE) +connector = IfcCableFittingTypeEnum.CONNECTOR +entry = IfcCableFittingTypeEnum.ENTRY +exit = IfcCableFittingTypeEnum.EXIT +junction = IfcCableFittingTypeEnum.JUNCTION +transition = IfcCableFittingTypeEnum.TRANSITION +fanout = IfcCableFittingTypeEnum.FANOUT +userdefined = IfcCableFittingTypeEnum.USERDEFINED +notdefined = IfcCableFittingTypeEnum.NOTDEFINED IfcCableSegmentTypeEnum = enum_namespace() -busbarsegment = express_getattr(IfcCableSegmentTypeEnum, 'BUSBARSEGMENT', INDETERMINATE) -cablesegment = express_getattr(IfcCableSegmentTypeEnum, 'CABLESEGMENT', INDETERMINATE) -conductorsegment = express_getattr(IfcCableSegmentTypeEnum, 'CONDUCTORSEGMENT', INDETERMINATE) -coresegment = express_getattr(IfcCableSegmentTypeEnum, 'CORESEGMENT', INDETERMINATE) -contactwiresegment = express_getattr(IfcCableSegmentTypeEnum, 'CONTACTWIRESEGMENT', INDETERMINATE) -fibersegment = express_getattr(IfcCableSegmentTypeEnum, 'FIBERSEGMENT', INDETERMINATE) -fibertube = express_getattr(IfcCableSegmentTypeEnum, 'FIBERTUBE', INDETERMINATE) -opticalcablesegment = express_getattr(IfcCableSegmentTypeEnum, 'OPTICALCABLESEGMENT', INDETERMINATE) -stitchwire = express_getattr(IfcCableSegmentTypeEnum, 'STITCHWIRE', INDETERMINATE) -wirepairsegment = express_getattr(IfcCableSegmentTypeEnum, 'WIREPAIRSEGMENT', INDETERMINATE) -userdefined = express_getattr(IfcCableSegmentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCableSegmentTypeEnum, 'NOTDEFINED', INDETERMINATE) +busbarsegment = IfcCableSegmentTypeEnum.BUSBARSEGMENT +cablesegment = IfcCableSegmentTypeEnum.CABLESEGMENT +conductorsegment = IfcCableSegmentTypeEnum.CONDUCTORSEGMENT +coresegment = IfcCableSegmentTypeEnum.CORESEGMENT +contactwiresegment = IfcCableSegmentTypeEnum.CONTACTWIRESEGMENT +fibersegment = IfcCableSegmentTypeEnum.FIBERSEGMENT +fibertube = IfcCableSegmentTypeEnum.FIBERTUBE +opticalcablesegment = IfcCableSegmentTypeEnum.OPTICALCABLESEGMENT +stitchwire = IfcCableSegmentTypeEnum.STITCHWIRE +wirepairsegment = IfcCableSegmentTypeEnum.WIREPAIRSEGMENT +userdefined = IfcCableSegmentTypeEnum.USERDEFINED +notdefined = IfcCableSegmentTypeEnum.NOTDEFINED IfcCaissonFoundationTypeEnum = enum_namespace() -well = express_getattr(IfcCaissonFoundationTypeEnum, 'WELL', INDETERMINATE) -caisson = express_getattr(IfcCaissonFoundationTypeEnum, 'CAISSON', INDETERMINATE) -userdefined = express_getattr(IfcCaissonFoundationTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCaissonFoundationTypeEnum, 'NOTDEFINED', INDETERMINATE) +well = IfcCaissonFoundationTypeEnum.WELL +caisson = IfcCaissonFoundationTypeEnum.CAISSON +userdefined = IfcCaissonFoundationTypeEnum.USERDEFINED +notdefined = IfcCaissonFoundationTypeEnum.NOTDEFINED IfcChangeActionEnum = enum_namespace() -nochange = express_getattr(IfcChangeActionEnum, 'NOCHANGE', INDETERMINATE) -modified = express_getattr(IfcChangeActionEnum, 'MODIFIED', INDETERMINATE) -added = express_getattr(IfcChangeActionEnum, 'ADDED', INDETERMINATE) -deleted = express_getattr(IfcChangeActionEnum, 'DELETED', INDETERMINATE) -notdefined = express_getattr(IfcChangeActionEnum, 'NOTDEFINED', INDETERMINATE) +nochange = IfcChangeActionEnum.NOCHANGE +modified = IfcChangeActionEnum.MODIFIED +added = IfcChangeActionEnum.ADDED +deleted = IfcChangeActionEnum.DELETED +notdefined = IfcChangeActionEnum.NOTDEFINED IfcChillerTypeEnum = enum_namespace() -aircooled = express_getattr(IfcChillerTypeEnum, 'AIRCOOLED', INDETERMINATE) -watercooled = express_getattr(IfcChillerTypeEnum, 'WATERCOOLED', INDETERMINATE) -heatrecovery = express_getattr(IfcChillerTypeEnum, 'HEATRECOVERY', INDETERMINATE) -userdefined = express_getattr(IfcChillerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcChillerTypeEnum, 'NOTDEFINED', INDETERMINATE) +aircooled = IfcChillerTypeEnum.AIRCOOLED +watercooled = IfcChillerTypeEnum.WATERCOOLED +heatrecovery = IfcChillerTypeEnum.HEATRECOVERY +userdefined = IfcChillerTypeEnum.USERDEFINED +notdefined = IfcChillerTypeEnum.NOTDEFINED IfcChimneyTypeEnum = enum_namespace() -userdefined = express_getattr(IfcChimneyTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcChimneyTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcChimneyTypeEnum.USERDEFINED +notdefined = IfcChimneyTypeEnum.NOTDEFINED IfcCoilTypeEnum = enum_namespace() -dxcoolingcoil = express_getattr(IfcCoilTypeEnum, 'DXCOOLINGCOIL', INDETERMINATE) -electricheatingcoil = express_getattr(IfcCoilTypeEnum, 'ELECTRICHEATINGCOIL', INDETERMINATE) -gasheatingcoil = express_getattr(IfcCoilTypeEnum, 'GASHEATINGCOIL', INDETERMINATE) -hydroniccoil = express_getattr(IfcCoilTypeEnum, 'HYDRONICCOIL', INDETERMINATE) -steamheatingcoil = express_getattr(IfcCoilTypeEnum, 'STEAMHEATINGCOIL', INDETERMINATE) -watercoolingcoil = express_getattr(IfcCoilTypeEnum, 'WATERCOOLINGCOIL', INDETERMINATE) -waterheatingcoil = express_getattr(IfcCoilTypeEnum, 'WATERHEATINGCOIL', INDETERMINATE) -userdefined = express_getattr(IfcCoilTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCoilTypeEnum, 'NOTDEFINED', INDETERMINATE) +dxcoolingcoil = IfcCoilTypeEnum.DXCOOLINGCOIL +electricheatingcoil = IfcCoilTypeEnum.ELECTRICHEATINGCOIL +gasheatingcoil = IfcCoilTypeEnum.GASHEATINGCOIL +hydroniccoil = IfcCoilTypeEnum.HYDRONICCOIL +steamheatingcoil = IfcCoilTypeEnum.STEAMHEATINGCOIL +watercoolingcoil = IfcCoilTypeEnum.WATERCOOLINGCOIL +waterheatingcoil = IfcCoilTypeEnum.WATERHEATINGCOIL +userdefined = IfcCoilTypeEnum.USERDEFINED +notdefined = IfcCoilTypeEnum.NOTDEFINED IfcColumnTypeEnum = enum_namespace() -column = express_getattr(IfcColumnTypeEnum, 'COLUMN', INDETERMINATE) -pilaster = express_getattr(IfcColumnTypeEnum, 'PILASTER', INDETERMINATE) -pierstem = express_getattr(IfcColumnTypeEnum, 'PIERSTEM', INDETERMINATE) -pierstem_segment = express_getattr(IfcColumnTypeEnum, 'PIERSTEM_SEGMENT', INDETERMINATE) -standcolumn = express_getattr(IfcColumnTypeEnum, 'STANDCOLUMN', INDETERMINATE) -userdefined = express_getattr(IfcColumnTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcColumnTypeEnum, 'NOTDEFINED', INDETERMINATE) +column = IfcColumnTypeEnum.COLUMN +pilaster = IfcColumnTypeEnum.PILASTER +pierstem = IfcColumnTypeEnum.PIERSTEM +pierstem_segment = IfcColumnTypeEnum.PIERSTEM_SEGMENT +standcolumn = IfcColumnTypeEnum.STANDCOLUMN +userdefined = IfcColumnTypeEnum.USERDEFINED +notdefined = IfcColumnTypeEnum.NOTDEFINED IfcCommunicationsApplianceTypeEnum = enum_namespace() -antenna = express_getattr(IfcCommunicationsApplianceTypeEnum, 'ANTENNA', INDETERMINATE) -computer = express_getattr(IfcCommunicationsApplianceTypeEnum, 'COMPUTER', INDETERMINATE) -fax = express_getattr(IfcCommunicationsApplianceTypeEnum, 'FAX', INDETERMINATE) -gateway = express_getattr(IfcCommunicationsApplianceTypeEnum, 'GATEWAY', INDETERMINATE) -modem = express_getattr(IfcCommunicationsApplianceTypeEnum, 'MODEM', INDETERMINATE) -networkappliance = express_getattr(IfcCommunicationsApplianceTypeEnum, 'NETWORKAPPLIANCE', INDETERMINATE) -networkbridge = express_getattr(IfcCommunicationsApplianceTypeEnum, 'NETWORKBRIDGE', INDETERMINATE) -networkhub = express_getattr(IfcCommunicationsApplianceTypeEnum, 'NETWORKHUB', INDETERMINATE) -printer = express_getattr(IfcCommunicationsApplianceTypeEnum, 'PRINTER', INDETERMINATE) -repeater = express_getattr(IfcCommunicationsApplianceTypeEnum, 'REPEATER', INDETERMINATE) -router = express_getattr(IfcCommunicationsApplianceTypeEnum, 'ROUTER', INDETERMINATE) -scanner = express_getattr(IfcCommunicationsApplianceTypeEnum, 'SCANNER', INDETERMINATE) -automaton = express_getattr(IfcCommunicationsApplianceTypeEnum, 'AUTOMATON', INDETERMINATE) -intelligent_peripheral = express_getattr(IfcCommunicationsApplianceTypeEnum, 'INTELLIGENT_PERIPHERAL', INDETERMINATE) -ip_network_equipment = express_getattr(IfcCommunicationsApplianceTypeEnum, 'IP_NETWORK_EQUIPMENT', INDETERMINATE) -optical_network_unit = express_getattr(IfcCommunicationsApplianceTypeEnum, 'OPTICAL_NETWORK_UNIT', INDETERMINATE) -telecommand = express_getattr(IfcCommunicationsApplianceTypeEnum, 'TELECOMMAND', INDETERMINATE) -telephonyexchange = express_getattr(IfcCommunicationsApplianceTypeEnum, 'TELEPHONYEXCHANGE', INDETERMINATE) -transitioncomponent = express_getattr(IfcCommunicationsApplianceTypeEnum, 'TRANSITIONCOMPONENT', INDETERMINATE) -transponder = express_getattr(IfcCommunicationsApplianceTypeEnum, 'TRANSPONDER', INDETERMINATE) -transportequipment = express_getattr(IfcCommunicationsApplianceTypeEnum, 'TRANSPORTEQUIPMENT', INDETERMINATE) -userdefined = express_getattr(IfcCommunicationsApplianceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCommunicationsApplianceTypeEnum, 'NOTDEFINED', INDETERMINATE) +antenna = IfcCommunicationsApplianceTypeEnum.ANTENNA +computer = IfcCommunicationsApplianceTypeEnum.COMPUTER +fax = IfcCommunicationsApplianceTypeEnum.FAX +gateway = IfcCommunicationsApplianceTypeEnum.GATEWAY +modem = IfcCommunicationsApplianceTypeEnum.MODEM +networkappliance = IfcCommunicationsApplianceTypeEnum.NETWORKAPPLIANCE +networkbridge = IfcCommunicationsApplianceTypeEnum.NETWORKBRIDGE +networkhub = IfcCommunicationsApplianceTypeEnum.NETWORKHUB +printer = IfcCommunicationsApplianceTypeEnum.PRINTER +repeater = IfcCommunicationsApplianceTypeEnum.REPEATER +router = IfcCommunicationsApplianceTypeEnum.ROUTER +scanner = IfcCommunicationsApplianceTypeEnum.SCANNER +automaton = IfcCommunicationsApplianceTypeEnum.AUTOMATON +intelligent_peripheral = IfcCommunicationsApplianceTypeEnum.INTELLIGENT_PERIPHERAL +ip_network_equipment = IfcCommunicationsApplianceTypeEnum.IP_NETWORK_EQUIPMENT +optical_network_unit = IfcCommunicationsApplianceTypeEnum.OPTICAL_NETWORK_UNIT +telecommand = IfcCommunicationsApplianceTypeEnum.TELECOMMAND +telephonyexchange = IfcCommunicationsApplianceTypeEnum.TELEPHONYEXCHANGE +transitioncomponent = IfcCommunicationsApplianceTypeEnum.TRANSITIONCOMPONENT +transponder = IfcCommunicationsApplianceTypeEnum.TRANSPONDER +transportequipment = IfcCommunicationsApplianceTypeEnum.TRANSPORTEQUIPMENT +userdefined = IfcCommunicationsApplianceTypeEnum.USERDEFINED +notdefined = IfcCommunicationsApplianceTypeEnum.NOTDEFINED IfcComplexPropertyTemplateTypeEnum = enum_namespace() -p_complex = express_getattr(IfcComplexPropertyTemplateTypeEnum, 'P_COMPLEX', INDETERMINATE) -q_complex = express_getattr(IfcComplexPropertyTemplateTypeEnum, 'Q_COMPLEX', INDETERMINATE) +p_complex = IfcComplexPropertyTemplateTypeEnum.P_COMPLEX +q_complex = IfcComplexPropertyTemplateTypeEnum.Q_COMPLEX IfcCompressorTypeEnum = enum_namespace() -dynamic = express_getattr(IfcCompressorTypeEnum, 'DYNAMIC', INDETERMINATE) -reciprocating = express_getattr(IfcCompressorTypeEnum, 'RECIPROCATING', INDETERMINATE) -rotary = express_getattr(IfcCompressorTypeEnum, 'ROTARY', INDETERMINATE) -scroll = express_getattr(IfcCompressorTypeEnum, 'SCROLL', INDETERMINATE) -trochoidal = express_getattr(IfcCompressorTypeEnum, 'TROCHOIDAL', INDETERMINATE) -singlestage = express_getattr(IfcCompressorTypeEnum, 'SINGLESTAGE', INDETERMINATE) -booster = express_getattr(IfcCompressorTypeEnum, 'BOOSTER', INDETERMINATE) -opentype = express_getattr(IfcCompressorTypeEnum, 'OPENTYPE', INDETERMINATE) -hermetic = express_getattr(IfcCompressorTypeEnum, 'HERMETIC', INDETERMINATE) -semihermetic = express_getattr(IfcCompressorTypeEnum, 'SEMIHERMETIC', INDETERMINATE) -weldedshellhermetic = express_getattr(IfcCompressorTypeEnum, 'WELDEDSHELLHERMETIC', INDETERMINATE) -rollingpiston = express_getattr(IfcCompressorTypeEnum, 'ROLLINGPISTON', INDETERMINATE) -rotaryvane = express_getattr(IfcCompressorTypeEnum, 'ROTARYVANE', INDETERMINATE) -singlescrew = express_getattr(IfcCompressorTypeEnum, 'SINGLESCREW', INDETERMINATE) -twinscrew = express_getattr(IfcCompressorTypeEnum, 'TWINSCREW', INDETERMINATE) -userdefined = express_getattr(IfcCompressorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCompressorTypeEnum, 'NOTDEFINED', INDETERMINATE) +dynamic = IfcCompressorTypeEnum.DYNAMIC +reciprocating = IfcCompressorTypeEnum.RECIPROCATING +rotary = IfcCompressorTypeEnum.ROTARY +scroll = IfcCompressorTypeEnum.SCROLL +trochoidal = IfcCompressorTypeEnum.TROCHOIDAL +singlestage = IfcCompressorTypeEnum.SINGLESTAGE +booster = IfcCompressorTypeEnum.BOOSTER +opentype = IfcCompressorTypeEnum.OPENTYPE +hermetic = IfcCompressorTypeEnum.HERMETIC +semihermetic = IfcCompressorTypeEnum.SEMIHERMETIC +weldedshellhermetic = IfcCompressorTypeEnum.WELDEDSHELLHERMETIC +rollingpiston = IfcCompressorTypeEnum.ROLLINGPISTON +rotaryvane = IfcCompressorTypeEnum.ROTARYVANE +singlescrew = IfcCompressorTypeEnum.SINGLESCREW +twinscrew = IfcCompressorTypeEnum.TWINSCREW +userdefined = IfcCompressorTypeEnum.USERDEFINED +notdefined = IfcCompressorTypeEnum.NOTDEFINED IfcCondenserTypeEnum = enum_namespace() -aircooled = express_getattr(IfcCondenserTypeEnum, 'AIRCOOLED', INDETERMINATE) -evaporativecooled = express_getattr(IfcCondenserTypeEnum, 'EVAPORATIVECOOLED', INDETERMINATE) -watercooled = express_getattr(IfcCondenserTypeEnum, 'WATERCOOLED', INDETERMINATE) -watercooledbrazedplate = express_getattr(IfcCondenserTypeEnum, 'WATERCOOLEDBRAZEDPLATE', INDETERMINATE) -watercooledshellcoil = express_getattr(IfcCondenserTypeEnum, 'WATERCOOLEDSHELLCOIL', INDETERMINATE) -watercooledshelltube = express_getattr(IfcCondenserTypeEnum, 'WATERCOOLEDSHELLTUBE', INDETERMINATE) -watercooledtubeintube = express_getattr(IfcCondenserTypeEnum, 'WATERCOOLEDTUBEINTUBE', INDETERMINATE) -userdefined = express_getattr(IfcCondenserTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCondenserTypeEnum, 'NOTDEFINED', INDETERMINATE) +aircooled = IfcCondenserTypeEnum.AIRCOOLED +evaporativecooled = IfcCondenserTypeEnum.EVAPORATIVECOOLED +watercooled = IfcCondenserTypeEnum.WATERCOOLED +watercooledbrazedplate = IfcCondenserTypeEnum.WATERCOOLEDBRAZEDPLATE +watercooledshellcoil = IfcCondenserTypeEnum.WATERCOOLEDSHELLCOIL +watercooledshelltube = IfcCondenserTypeEnum.WATERCOOLEDSHELLTUBE +watercooledtubeintube = IfcCondenserTypeEnum.WATERCOOLEDTUBEINTUBE +userdefined = IfcCondenserTypeEnum.USERDEFINED +notdefined = IfcCondenserTypeEnum.NOTDEFINED IfcConnectionTypeEnum = enum_namespace() -atpath = express_getattr(IfcConnectionTypeEnum, 'ATPATH', INDETERMINATE) -atstart = express_getattr(IfcConnectionTypeEnum, 'ATSTART', INDETERMINATE) -atend = express_getattr(IfcConnectionTypeEnum, 'ATEND', INDETERMINATE) -notdefined = express_getattr(IfcConnectionTypeEnum, 'NOTDEFINED', INDETERMINATE) +atpath = IfcConnectionTypeEnum.ATPATH +atstart = IfcConnectionTypeEnum.ATSTART +atend = IfcConnectionTypeEnum.ATEND +notdefined = IfcConnectionTypeEnum.NOTDEFINED IfcConstraintEnum = enum_namespace() -hard = express_getattr(IfcConstraintEnum, 'HARD', INDETERMINATE) -soft = express_getattr(IfcConstraintEnum, 'SOFT', INDETERMINATE) -advisory = express_getattr(IfcConstraintEnum, 'ADVISORY', INDETERMINATE) -userdefined = express_getattr(IfcConstraintEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcConstraintEnum, 'NOTDEFINED', INDETERMINATE) +hard = IfcConstraintEnum.HARD +soft = IfcConstraintEnum.SOFT +advisory = IfcConstraintEnum.ADVISORY +userdefined = IfcConstraintEnum.USERDEFINED +notdefined = IfcConstraintEnum.NOTDEFINED IfcConstructionEquipmentResourceTypeEnum = enum_namespace() -demolishing = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'DEMOLISHING', INDETERMINATE) -earthmoving = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'EARTHMOVING', INDETERMINATE) -erecting = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'ERECTING', INDETERMINATE) -heating = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'HEATING', INDETERMINATE) -lighting = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'LIGHTING', INDETERMINATE) -paving = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'PAVING', INDETERMINATE) -pumping = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'PUMPING', INDETERMINATE) -transporting = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'TRANSPORTING', INDETERMINATE) -userdefined = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'NOTDEFINED', INDETERMINATE) +demolishing = IfcConstructionEquipmentResourceTypeEnum.DEMOLISHING +earthmoving = IfcConstructionEquipmentResourceTypeEnum.EARTHMOVING +erecting = IfcConstructionEquipmentResourceTypeEnum.ERECTING +heating = IfcConstructionEquipmentResourceTypeEnum.HEATING +lighting = IfcConstructionEquipmentResourceTypeEnum.LIGHTING +paving = IfcConstructionEquipmentResourceTypeEnum.PAVING +pumping = IfcConstructionEquipmentResourceTypeEnum.PUMPING +transporting = IfcConstructionEquipmentResourceTypeEnum.TRANSPORTING +userdefined = IfcConstructionEquipmentResourceTypeEnum.USERDEFINED +notdefined = IfcConstructionEquipmentResourceTypeEnum.NOTDEFINED IfcConstructionMaterialResourceTypeEnum = enum_namespace() -aggregates = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'AGGREGATES', INDETERMINATE) -concrete = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'CONCRETE', INDETERMINATE) -drywall = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'DRYWALL', INDETERMINATE) -fuel = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'FUEL', INDETERMINATE) -gypsum = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'GYPSUM', INDETERMINATE) -masonry = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'MASONRY', INDETERMINATE) -metal = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'METAL', INDETERMINATE) -plastic = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'PLASTIC', INDETERMINATE) -wood = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'WOOD', INDETERMINATE) -notdefined = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'NOTDEFINED', INDETERMINATE) -userdefined = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'USERDEFINED', INDETERMINATE) +aggregates = IfcConstructionMaterialResourceTypeEnum.AGGREGATES +concrete = IfcConstructionMaterialResourceTypeEnum.CONCRETE +drywall = IfcConstructionMaterialResourceTypeEnum.DRYWALL +fuel = IfcConstructionMaterialResourceTypeEnum.FUEL +gypsum = IfcConstructionMaterialResourceTypeEnum.GYPSUM +masonry = IfcConstructionMaterialResourceTypeEnum.MASONRY +metal = IfcConstructionMaterialResourceTypeEnum.METAL +plastic = IfcConstructionMaterialResourceTypeEnum.PLASTIC +wood = IfcConstructionMaterialResourceTypeEnum.WOOD +notdefined = IfcConstructionMaterialResourceTypeEnum.NOTDEFINED +userdefined = IfcConstructionMaterialResourceTypeEnum.USERDEFINED IfcConstructionProductResourceTypeEnum = enum_namespace() -assembly = express_getattr(IfcConstructionProductResourceTypeEnum, 'ASSEMBLY', INDETERMINATE) -formwork = express_getattr(IfcConstructionProductResourceTypeEnum, 'FORMWORK', INDETERMINATE) -userdefined = express_getattr(IfcConstructionProductResourceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcConstructionProductResourceTypeEnum, 'NOTDEFINED', INDETERMINATE) +assembly = IfcConstructionProductResourceTypeEnum.ASSEMBLY +formwork = IfcConstructionProductResourceTypeEnum.FORMWORK +userdefined = IfcConstructionProductResourceTypeEnum.USERDEFINED +notdefined = IfcConstructionProductResourceTypeEnum.NOTDEFINED IfcControllerTypeEnum = enum_namespace() -floating = express_getattr(IfcControllerTypeEnum, 'FLOATING', INDETERMINATE) -programmable = express_getattr(IfcControllerTypeEnum, 'PROGRAMMABLE', INDETERMINATE) -proportional = express_getattr(IfcControllerTypeEnum, 'PROPORTIONAL', INDETERMINATE) -multiposition = express_getattr(IfcControllerTypeEnum, 'MULTIPOSITION', INDETERMINATE) -twoposition = express_getattr(IfcControllerTypeEnum, 'TWOPOSITION', INDETERMINATE) -userdefined = express_getattr(IfcControllerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcControllerTypeEnum, 'NOTDEFINED', INDETERMINATE) +floating = IfcControllerTypeEnum.FLOATING +programmable = IfcControllerTypeEnum.PROGRAMMABLE +proportional = IfcControllerTypeEnum.PROPORTIONAL +multiposition = IfcControllerTypeEnum.MULTIPOSITION +twoposition = IfcControllerTypeEnum.TWOPOSITION +userdefined = IfcControllerTypeEnum.USERDEFINED +notdefined = IfcControllerTypeEnum.NOTDEFINED IfcConveyorSegmentTypeEnum = enum_namespace() -chuteconveyor = express_getattr(IfcConveyorSegmentTypeEnum, 'CHUTECONVEYOR', INDETERMINATE) -beltconveyor = express_getattr(IfcConveyorSegmentTypeEnum, 'BELTCONVEYOR', INDETERMINATE) -screwconveyor = express_getattr(IfcConveyorSegmentTypeEnum, 'SCREWCONVEYOR', INDETERMINATE) -bucketconveyor = express_getattr(IfcConveyorSegmentTypeEnum, 'BUCKETCONVEYOR', INDETERMINATE) -userdefined = express_getattr(IfcConveyorSegmentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcConveyorSegmentTypeEnum, 'NOTDEFINED', INDETERMINATE) +chuteconveyor = IfcConveyorSegmentTypeEnum.CHUTECONVEYOR +beltconveyor = IfcConveyorSegmentTypeEnum.BELTCONVEYOR +screwconveyor = IfcConveyorSegmentTypeEnum.SCREWCONVEYOR +bucketconveyor = IfcConveyorSegmentTypeEnum.BUCKETCONVEYOR +userdefined = IfcConveyorSegmentTypeEnum.USERDEFINED +notdefined = IfcConveyorSegmentTypeEnum.NOTDEFINED IfcCooledBeamTypeEnum = enum_namespace() -active = express_getattr(IfcCooledBeamTypeEnum, 'ACTIVE', INDETERMINATE) -passive = express_getattr(IfcCooledBeamTypeEnum, 'PASSIVE', INDETERMINATE) -userdefined = express_getattr(IfcCooledBeamTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCooledBeamTypeEnum, 'NOTDEFINED', INDETERMINATE) +active = IfcCooledBeamTypeEnum.ACTIVE +passive = IfcCooledBeamTypeEnum.PASSIVE +userdefined = IfcCooledBeamTypeEnum.USERDEFINED +notdefined = IfcCooledBeamTypeEnum.NOTDEFINED IfcCoolingTowerTypeEnum = enum_namespace() -naturaldraft = express_getattr(IfcCoolingTowerTypeEnum, 'NATURALDRAFT', INDETERMINATE) -mechanicalinduceddraft = express_getattr(IfcCoolingTowerTypeEnum, 'MECHANICALINDUCEDDRAFT', INDETERMINATE) -mechanicalforceddraft = express_getattr(IfcCoolingTowerTypeEnum, 'MECHANICALFORCEDDRAFT', INDETERMINATE) -userdefined = express_getattr(IfcCoolingTowerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCoolingTowerTypeEnum, 'NOTDEFINED', INDETERMINATE) +naturaldraft = IfcCoolingTowerTypeEnum.NATURALDRAFT +mechanicalinduceddraft = IfcCoolingTowerTypeEnum.MECHANICALINDUCEDDRAFT +mechanicalforceddraft = IfcCoolingTowerTypeEnum.MECHANICALFORCEDDRAFT +userdefined = IfcCoolingTowerTypeEnum.USERDEFINED +notdefined = IfcCoolingTowerTypeEnum.NOTDEFINED IfcCostItemTypeEnum = enum_namespace() -userdefined = express_getattr(IfcCostItemTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCostItemTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcCostItemTypeEnum.USERDEFINED +notdefined = IfcCostItemTypeEnum.NOTDEFINED IfcCostScheduleTypeEnum = enum_namespace() -budget = express_getattr(IfcCostScheduleTypeEnum, 'BUDGET', INDETERMINATE) -costplan = express_getattr(IfcCostScheduleTypeEnum, 'COSTPLAN', INDETERMINATE) -estimate = express_getattr(IfcCostScheduleTypeEnum, 'ESTIMATE', INDETERMINATE) -tender = express_getattr(IfcCostScheduleTypeEnum, 'TENDER', INDETERMINATE) -pricedbillofquantities = express_getattr(IfcCostScheduleTypeEnum, 'PRICEDBILLOFQUANTITIES', INDETERMINATE) -unpricedbillofquantities = express_getattr(IfcCostScheduleTypeEnum, 'UNPRICEDBILLOFQUANTITIES', INDETERMINATE) -scheduleofrates = express_getattr(IfcCostScheduleTypeEnum, 'SCHEDULEOFRATES', INDETERMINATE) -userdefined = express_getattr(IfcCostScheduleTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCostScheduleTypeEnum, 'NOTDEFINED', INDETERMINATE) +budget = IfcCostScheduleTypeEnum.BUDGET +costplan = IfcCostScheduleTypeEnum.COSTPLAN +estimate = IfcCostScheduleTypeEnum.ESTIMATE +tender = IfcCostScheduleTypeEnum.TENDER +pricedbillofquantities = IfcCostScheduleTypeEnum.PRICEDBILLOFQUANTITIES +unpricedbillofquantities = IfcCostScheduleTypeEnum.UNPRICEDBILLOFQUANTITIES +scheduleofrates = IfcCostScheduleTypeEnum.SCHEDULEOFRATES +userdefined = IfcCostScheduleTypeEnum.USERDEFINED +notdefined = IfcCostScheduleTypeEnum.NOTDEFINED IfcCourseTypeEnum = enum_namespace() -armour = express_getattr(IfcCourseTypeEnum, 'ARMOUR', INDETERMINATE) -filter = express_getattr(IfcCourseTypeEnum, 'FILTER', INDETERMINATE) -ballastbed = express_getattr(IfcCourseTypeEnum, 'BALLASTBED', INDETERMINATE) -core = express_getattr(IfcCourseTypeEnum, 'CORE', INDETERMINATE) -pavement = express_getattr(IfcCourseTypeEnum, 'PAVEMENT', INDETERMINATE) -protection = express_getattr(IfcCourseTypeEnum, 'PROTECTION', INDETERMINATE) -userdefined = express_getattr(IfcCourseTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCourseTypeEnum, 'NOTDEFINED', INDETERMINATE) +armour = IfcCourseTypeEnum.ARMOUR +filter = IfcCourseTypeEnum.FILTER +ballastbed = IfcCourseTypeEnum.BALLASTBED +core = IfcCourseTypeEnum.CORE +pavement = IfcCourseTypeEnum.PAVEMENT +protection = IfcCourseTypeEnum.PROTECTION +userdefined = IfcCourseTypeEnum.USERDEFINED +notdefined = IfcCourseTypeEnum.NOTDEFINED IfcCoveringTypeEnum = enum_namespace() -ceiling = express_getattr(IfcCoveringTypeEnum, 'CEILING', INDETERMINATE) -flooring = express_getattr(IfcCoveringTypeEnum, 'FLOORING', INDETERMINATE) -cladding = express_getattr(IfcCoveringTypeEnum, 'CLADDING', INDETERMINATE) -roofing = express_getattr(IfcCoveringTypeEnum, 'ROOFING', INDETERMINATE) -molding = express_getattr(IfcCoveringTypeEnum, 'MOLDING', INDETERMINATE) -skirtingboard = express_getattr(IfcCoveringTypeEnum, 'SKIRTINGBOARD', INDETERMINATE) -insulation = express_getattr(IfcCoveringTypeEnum, 'INSULATION', INDETERMINATE) -membrane = express_getattr(IfcCoveringTypeEnum, 'MEMBRANE', INDETERMINATE) -sleeving = express_getattr(IfcCoveringTypeEnum, 'SLEEVING', INDETERMINATE) -wrapping = express_getattr(IfcCoveringTypeEnum, 'WRAPPING', INDETERMINATE) -coping = express_getattr(IfcCoveringTypeEnum, 'COPING', INDETERMINATE) -userdefined = express_getattr(IfcCoveringTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCoveringTypeEnum, 'NOTDEFINED', INDETERMINATE) +ceiling = IfcCoveringTypeEnum.CEILING +flooring = IfcCoveringTypeEnum.FLOORING +cladding = IfcCoveringTypeEnum.CLADDING +roofing = IfcCoveringTypeEnum.ROOFING +molding = IfcCoveringTypeEnum.MOLDING +skirtingboard = IfcCoveringTypeEnum.SKIRTINGBOARD +insulation = IfcCoveringTypeEnum.INSULATION +membrane = IfcCoveringTypeEnum.MEMBRANE +sleeving = IfcCoveringTypeEnum.SLEEVING +wrapping = IfcCoveringTypeEnum.WRAPPING +coping = IfcCoveringTypeEnum.COPING +userdefined = IfcCoveringTypeEnum.USERDEFINED +notdefined = IfcCoveringTypeEnum.NOTDEFINED IfcCrewResourceTypeEnum = enum_namespace() -office = express_getattr(IfcCrewResourceTypeEnum, 'OFFICE', INDETERMINATE) -site = express_getattr(IfcCrewResourceTypeEnum, 'SITE', INDETERMINATE) -userdefined = express_getattr(IfcCrewResourceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCrewResourceTypeEnum, 'NOTDEFINED', INDETERMINATE) +office = IfcCrewResourceTypeEnum.OFFICE +site = IfcCrewResourceTypeEnum.SITE +userdefined = IfcCrewResourceTypeEnum.USERDEFINED +notdefined = IfcCrewResourceTypeEnum.NOTDEFINED IfcCurtainWallTypeEnum = enum_namespace() -userdefined = express_getattr(IfcCurtainWallTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCurtainWallTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcCurtainWallTypeEnum.USERDEFINED +notdefined = IfcCurtainWallTypeEnum.NOTDEFINED IfcCurveInterpolationEnum = enum_namespace() -linear = express_getattr(IfcCurveInterpolationEnum, 'LINEAR', INDETERMINATE) -log_linear = express_getattr(IfcCurveInterpolationEnum, 'LOG_LINEAR', INDETERMINATE) -log_log = express_getattr(IfcCurveInterpolationEnum, 'LOG_LOG', INDETERMINATE) -notdefined = express_getattr(IfcCurveInterpolationEnum, 'NOTDEFINED', INDETERMINATE) +linear = IfcCurveInterpolationEnum.LINEAR +log_linear = IfcCurveInterpolationEnum.LOG_LINEAR +log_log = IfcCurveInterpolationEnum.LOG_LOG +notdefined = IfcCurveInterpolationEnum.NOTDEFINED IfcDamperTypeEnum = enum_namespace() -backdraftdamper = express_getattr(IfcDamperTypeEnum, 'BACKDRAFTDAMPER', INDETERMINATE) -balancingdamper = express_getattr(IfcDamperTypeEnum, 'BALANCINGDAMPER', INDETERMINATE) -blastdamper = express_getattr(IfcDamperTypeEnum, 'BLASTDAMPER', INDETERMINATE) -controldamper = express_getattr(IfcDamperTypeEnum, 'CONTROLDAMPER', INDETERMINATE) -firedamper = express_getattr(IfcDamperTypeEnum, 'FIREDAMPER', INDETERMINATE) -firesmokedamper = express_getattr(IfcDamperTypeEnum, 'FIRESMOKEDAMPER', INDETERMINATE) -fumehoodexhaust = express_getattr(IfcDamperTypeEnum, 'FUMEHOODEXHAUST', INDETERMINATE) -gravitydamper = express_getattr(IfcDamperTypeEnum, 'GRAVITYDAMPER', INDETERMINATE) -gravityreliefdamper = express_getattr(IfcDamperTypeEnum, 'GRAVITYRELIEFDAMPER', INDETERMINATE) -reliefdamper = express_getattr(IfcDamperTypeEnum, 'RELIEFDAMPER', INDETERMINATE) -smokedamper = express_getattr(IfcDamperTypeEnum, 'SMOKEDAMPER', INDETERMINATE) -userdefined = express_getattr(IfcDamperTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDamperTypeEnum, 'NOTDEFINED', INDETERMINATE) +backdraftdamper = IfcDamperTypeEnum.BACKDRAFTDAMPER +balancingdamper = IfcDamperTypeEnum.BALANCINGDAMPER +blastdamper = IfcDamperTypeEnum.BLASTDAMPER +controldamper = IfcDamperTypeEnum.CONTROLDAMPER +firedamper = IfcDamperTypeEnum.FIREDAMPER +firesmokedamper = IfcDamperTypeEnum.FIRESMOKEDAMPER +fumehoodexhaust = IfcDamperTypeEnum.FUMEHOODEXHAUST +gravitydamper = IfcDamperTypeEnum.GRAVITYDAMPER +gravityreliefdamper = IfcDamperTypeEnum.GRAVITYRELIEFDAMPER +reliefdamper = IfcDamperTypeEnum.RELIEFDAMPER +smokedamper = IfcDamperTypeEnum.SMOKEDAMPER +userdefined = IfcDamperTypeEnum.USERDEFINED +notdefined = IfcDamperTypeEnum.NOTDEFINED IfcDataOriginEnum = enum_namespace() -measured = express_getattr(IfcDataOriginEnum, 'MEASURED', INDETERMINATE) -predicted = express_getattr(IfcDataOriginEnum, 'PREDICTED', INDETERMINATE) -simulated = express_getattr(IfcDataOriginEnum, 'SIMULATED', INDETERMINATE) -userdefined = express_getattr(IfcDataOriginEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDataOriginEnum, 'NOTDEFINED', INDETERMINATE) +measured = IfcDataOriginEnum.MEASURED +predicted = IfcDataOriginEnum.PREDICTED +simulated = IfcDataOriginEnum.SIMULATED +userdefined = IfcDataOriginEnum.USERDEFINED +notdefined = IfcDataOriginEnum.NOTDEFINED IfcDerivedUnitEnum = enum_namespace() -angularvelocityunit = express_getattr(IfcDerivedUnitEnum, 'ANGULARVELOCITYUNIT', INDETERMINATE) -areadensityunit = express_getattr(IfcDerivedUnitEnum, 'AREADENSITYUNIT', INDETERMINATE) -compoundplaneangleunit = express_getattr(IfcDerivedUnitEnum, 'COMPOUNDPLANEANGLEUNIT', INDETERMINATE) -dynamicviscosityunit = express_getattr(IfcDerivedUnitEnum, 'DYNAMICVISCOSITYUNIT', INDETERMINATE) -heatfluxdensityunit = express_getattr(IfcDerivedUnitEnum, 'HEATFLUXDENSITYUNIT', INDETERMINATE) -integercountrateunit = express_getattr(IfcDerivedUnitEnum, 'INTEGERCOUNTRATEUNIT', INDETERMINATE) -isothermalmoisturecapacityunit = express_getattr(IfcDerivedUnitEnum, 'ISOTHERMALMOISTURECAPACITYUNIT', INDETERMINATE) -kinematicviscosityunit = express_getattr(IfcDerivedUnitEnum, 'KINEMATICVISCOSITYUNIT', INDETERMINATE) -linearvelocityunit = express_getattr(IfcDerivedUnitEnum, 'LINEARVELOCITYUNIT', INDETERMINATE) -massdensityunit = express_getattr(IfcDerivedUnitEnum, 'MASSDENSITYUNIT', INDETERMINATE) -massflowrateunit = express_getattr(IfcDerivedUnitEnum, 'MASSFLOWRATEUNIT', INDETERMINATE) -moisturediffusivityunit = express_getattr(IfcDerivedUnitEnum, 'MOISTUREDIFFUSIVITYUNIT', INDETERMINATE) -molecularweightunit = express_getattr(IfcDerivedUnitEnum, 'MOLECULARWEIGHTUNIT', INDETERMINATE) -specificheatcapacityunit = express_getattr(IfcDerivedUnitEnum, 'SPECIFICHEATCAPACITYUNIT', INDETERMINATE) -thermaladmittanceunit = express_getattr(IfcDerivedUnitEnum, 'THERMALADMITTANCEUNIT', INDETERMINATE) -thermalconductanceunit = express_getattr(IfcDerivedUnitEnum, 'THERMALCONDUCTANCEUNIT', INDETERMINATE) -thermalresistanceunit = express_getattr(IfcDerivedUnitEnum, 'THERMALRESISTANCEUNIT', INDETERMINATE) -thermaltransmittanceunit = express_getattr(IfcDerivedUnitEnum, 'THERMALTRANSMITTANCEUNIT', INDETERMINATE) -vaporpermeabilityunit = express_getattr(IfcDerivedUnitEnum, 'VAPORPERMEABILITYUNIT', INDETERMINATE) -volumetricflowrateunit = express_getattr(IfcDerivedUnitEnum, 'VOLUMETRICFLOWRATEUNIT', INDETERMINATE) -rotationalfrequencyunit = express_getattr(IfcDerivedUnitEnum, 'ROTATIONALFREQUENCYUNIT', INDETERMINATE) -torqueunit = express_getattr(IfcDerivedUnitEnum, 'TORQUEUNIT', INDETERMINATE) -momentofinertiaunit = express_getattr(IfcDerivedUnitEnum, 'MOMENTOFINERTIAUNIT', INDETERMINATE) -linearmomentunit = express_getattr(IfcDerivedUnitEnum, 'LINEARMOMENTUNIT', INDETERMINATE) -linearforceunit = express_getattr(IfcDerivedUnitEnum, 'LINEARFORCEUNIT', INDETERMINATE) -planarforceunit = express_getattr(IfcDerivedUnitEnum, 'PLANARFORCEUNIT', INDETERMINATE) -modulusofelasticityunit = express_getattr(IfcDerivedUnitEnum, 'MODULUSOFELASTICITYUNIT', INDETERMINATE) -shearmodulusunit = express_getattr(IfcDerivedUnitEnum, 'SHEARMODULUSUNIT', INDETERMINATE) -linearstiffnessunit = express_getattr(IfcDerivedUnitEnum, 'LINEARSTIFFNESSUNIT', INDETERMINATE) -rotationalstiffnessunit = express_getattr(IfcDerivedUnitEnum, 'ROTATIONALSTIFFNESSUNIT', INDETERMINATE) -modulusofsubgradereactionunit = express_getattr(IfcDerivedUnitEnum, 'MODULUSOFSUBGRADEREACTIONUNIT', INDETERMINATE) -accelerationunit = express_getattr(IfcDerivedUnitEnum, 'ACCELERATIONUNIT', INDETERMINATE) -curvatureunit = express_getattr(IfcDerivedUnitEnum, 'CURVATUREUNIT', INDETERMINATE) -heatingvalueunit = express_getattr(IfcDerivedUnitEnum, 'HEATINGVALUEUNIT', INDETERMINATE) -ionconcentrationunit = express_getattr(IfcDerivedUnitEnum, 'IONCONCENTRATIONUNIT', INDETERMINATE) -luminousintensitydistributionunit = express_getattr(IfcDerivedUnitEnum, 'LUMINOUSINTENSITYDISTRIBUTIONUNIT', INDETERMINATE) -massperlengthunit = express_getattr(IfcDerivedUnitEnum, 'MASSPERLENGTHUNIT', INDETERMINATE) -modulusoflinearsubgradereactionunit = express_getattr(IfcDerivedUnitEnum, 'MODULUSOFLINEARSUBGRADEREACTIONUNIT', INDETERMINATE) -modulusofrotationalsubgradereactionunit = express_getattr(IfcDerivedUnitEnum, 'MODULUSOFROTATIONALSUBGRADEREACTIONUNIT', INDETERMINATE) -phunit = express_getattr(IfcDerivedUnitEnum, 'PHUNIT', INDETERMINATE) -rotationalmassunit = express_getattr(IfcDerivedUnitEnum, 'ROTATIONALMASSUNIT', INDETERMINATE) -sectionareaintegralunit = express_getattr(IfcDerivedUnitEnum, 'SECTIONAREAINTEGRALUNIT', INDETERMINATE) -sectionmodulusunit = express_getattr(IfcDerivedUnitEnum, 'SECTIONMODULUSUNIT', INDETERMINATE) -soundpowerlevelunit = express_getattr(IfcDerivedUnitEnum, 'SOUNDPOWERLEVELUNIT', INDETERMINATE) -soundpowerunit = express_getattr(IfcDerivedUnitEnum, 'SOUNDPOWERUNIT', INDETERMINATE) -soundpressurelevelunit = express_getattr(IfcDerivedUnitEnum, 'SOUNDPRESSURELEVELUNIT', INDETERMINATE) -soundpressureunit = express_getattr(IfcDerivedUnitEnum, 'SOUNDPRESSUREUNIT', INDETERMINATE) -temperaturegradientunit = express_getattr(IfcDerivedUnitEnum, 'TEMPERATUREGRADIENTUNIT', INDETERMINATE) -temperaturerateofchangeunit = express_getattr(IfcDerivedUnitEnum, 'TEMPERATURERATEOFCHANGEUNIT', INDETERMINATE) -thermalexpansioncoefficientunit = express_getattr(IfcDerivedUnitEnum, 'THERMALEXPANSIONCOEFFICIENTUNIT', INDETERMINATE) -warpingconstantunit = express_getattr(IfcDerivedUnitEnum, 'WARPINGCONSTANTUNIT', INDETERMINATE) -warpingmomentunit = express_getattr(IfcDerivedUnitEnum, 'WARPINGMOMENTUNIT', INDETERMINATE) -userdefined = express_getattr(IfcDerivedUnitEnum, 'USERDEFINED', INDETERMINATE) +angularvelocityunit = IfcDerivedUnitEnum.ANGULARVELOCITYUNIT +areadensityunit = IfcDerivedUnitEnum.AREADENSITYUNIT +compoundplaneangleunit = IfcDerivedUnitEnum.COMPOUNDPLANEANGLEUNIT +dynamicviscosityunit = IfcDerivedUnitEnum.DYNAMICVISCOSITYUNIT +heatfluxdensityunit = IfcDerivedUnitEnum.HEATFLUXDENSITYUNIT +integercountrateunit = IfcDerivedUnitEnum.INTEGERCOUNTRATEUNIT +isothermalmoisturecapacityunit = IfcDerivedUnitEnum.ISOTHERMALMOISTURECAPACITYUNIT +kinematicviscosityunit = IfcDerivedUnitEnum.KINEMATICVISCOSITYUNIT +linearvelocityunit = IfcDerivedUnitEnum.LINEARVELOCITYUNIT +massdensityunit = IfcDerivedUnitEnum.MASSDENSITYUNIT +massflowrateunit = IfcDerivedUnitEnum.MASSFLOWRATEUNIT +moisturediffusivityunit = IfcDerivedUnitEnum.MOISTUREDIFFUSIVITYUNIT +molecularweightunit = IfcDerivedUnitEnum.MOLECULARWEIGHTUNIT +specificheatcapacityunit = IfcDerivedUnitEnum.SPECIFICHEATCAPACITYUNIT +thermaladmittanceunit = IfcDerivedUnitEnum.THERMALADMITTANCEUNIT +thermalconductanceunit = IfcDerivedUnitEnum.THERMALCONDUCTANCEUNIT +thermalresistanceunit = IfcDerivedUnitEnum.THERMALRESISTANCEUNIT +thermaltransmittanceunit = IfcDerivedUnitEnum.THERMALTRANSMITTANCEUNIT +vaporpermeabilityunit = IfcDerivedUnitEnum.VAPORPERMEABILITYUNIT +volumetricflowrateunit = IfcDerivedUnitEnum.VOLUMETRICFLOWRATEUNIT +rotationalfrequencyunit = IfcDerivedUnitEnum.ROTATIONALFREQUENCYUNIT +torqueunit = IfcDerivedUnitEnum.TORQUEUNIT +momentofinertiaunit = IfcDerivedUnitEnum.MOMENTOFINERTIAUNIT +linearmomentunit = IfcDerivedUnitEnum.LINEARMOMENTUNIT +linearforceunit = IfcDerivedUnitEnum.LINEARFORCEUNIT +planarforceunit = IfcDerivedUnitEnum.PLANARFORCEUNIT +modulusofelasticityunit = IfcDerivedUnitEnum.MODULUSOFELASTICITYUNIT +shearmodulusunit = IfcDerivedUnitEnum.SHEARMODULUSUNIT +linearstiffnessunit = IfcDerivedUnitEnum.LINEARSTIFFNESSUNIT +rotationalstiffnessunit = IfcDerivedUnitEnum.ROTATIONALSTIFFNESSUNIT +modulusofsubgradereactionunit = IfcDerivedUnitEnum.MODULUSOFSUBGRADEREACTIONUNIT +accelerationunit = IfcDerivedUnitEnum.ACCELERATIONUNIT +curvatureunit = IfcDerivedUnitEnum.CURVATUREUNIT +heatingvalueunit = IfcDerivedUnitEnum.HEATINGVALUEUNIT +ionconcentrationunit = IfcDerivedUnitEnum.IONCONCENTRATIONUNIT +luminousintensitydistributionunit = IfcDerivedUnitEnum.LUMINOUSINTENSITYDISTRIBUTIONUNIT +massperlengthunit = IfcDerivedUnitEnum.MASSPERLENGTHUNIT +modulusoflinearsubgradereactionunit = IfcDerivedUnitEnum.MODULUSOFLINEARSUBGRADEREACTIONUNIT +modulusofrotationalsubgradereactionunit = IfcDerivedUnitEnum.MODULUSOFROTATIONALSUBGRADEREACTIONUNIT +phunit = IfcDerivedUnitEnum.PHUNIT +rotationalmassunit = IfcDerivedUnitEnum.ROTATIONALMASSUNIT +sectionareaintegralunit = IfcDerivedUnitEnum.SECTIONAREAINTEGRALUNIT +sectionmodulusunit = IfcDerivedUnitEnum.SECTIONMODULUSUNIT +soundpowerlevelunit = IfcDerivedUnitEnum.SOUNDPOWERLEVELUNIT +soundpowerunit = IfcDerivedUnitEnum.SOUNDPOWERUNIT +soundpressurelevelunit = IfcDerivedUnitEnum.SOUNDPRESSURELEVELUNIT +soundpressureunit = IfcDerivedUnitEnum.SOUNDPRESSUREUNIT +temperaturegradientunit = IfcDerivedUnitEnum.TEMPERATUREGRADIENTUNIT +temperaturerateofchangeunit = IfcDerivedUnitEnum.TEMPERATURERATEOFCHANGEUNIT +thermalexpansioncoefficientunit = IfcDerivedUnitEnum.THERMALEXPANSIONCOEFFICIENTUNIT +warpingconstantunit = IfcDerivedUnitEnum.WARPINGCONSTANTUNIT +warpingmomentunit = IfcDerivedUnitEnum.WARPINGMOMENTUNIT +userdefined = IfcDerivedUnitEnum.USERDEFINED IfcDirectionSenseEnum = enum_namespace() -positive = express_getattr(IfcDirectionSenseEnum, 'POSITIVE', INDETERMINATE) -negative = express_getattr(IfcDirectionSenseEnum, 'NEGATIVE', INDETERMINATE) +positive = IfcDirectionSenseEnum.POSITIVE +negative = IfcDirectionSenseEnum.NEGATIVE IfcDiscreteAccessoryTypeEnum = enum_namespace() -anchorplate = express_getattr(IfcDiscreteAccessoryTypeEnum, 'ANCHORPLATE', INDETERMINATE) -bracket = express_getattr(IfcDiscreteAccessoryTypeEnum, 'BRACKET', INDETERMINATE) -shoe = express_getattr(IfcDiscreteAccessoryTypeEnum, 'SHOE', INDETERMINATE) -expansion_joint_device = express_getattr(IfcDiscreteAccessoryTypeEnum, 'EXPANSION_JOINT_DEVICE', INDETERMINATE) -cablearranger = express_getattr(IfcDiscreteAccessoryTypeEnum, 'CABLEARRANGER', INDETERMINATE) -insulator = express_getattr(IfcDiscreteAccessoryTypeEnum, 'INSULATOR', INDETERMINATE) -lock = express_getattr(IfcDiscreteAccessoryTypeEnum, 'LOCK', INDETERMINATE) -tensioningequipment = express_getattr(IfcDiscreteAccessoryTypeEnum, 'TENSIONINGEQUIPMENT', INDETERMINATE) -railpad = express_getattr(IfcDiscreteAccessoryTypeEnum, 'RAILPAD', INDETERMINATE) -slidingchair = express_getattr(IfcDiscreteAccessoryTypeEnum, 'SLIDINGCHAIR', INDETERMINATE) -rail_lubrication = express_getattr(IfcDiscreteAccessoryTypeEnum, 'RAIL_LUBRICATION', INDETERMINATE) -panel_strengthening = express_getattr(IfcDiscreteAccessoryTypeEnum, 'PANEL_STRENGTHENING', INDETERMINATE) -railbrace = express_getattr(IfcDiscreteAccessoryTypeEnum, 'RAILBRACE', INDETERMINATE) -elastic_cushion = express_getattr(IfcDiscreteAccessoryTypeEnum, 'ELASTIC_CUSHION', INDETERMINATE) -soundabsorption = express_getattr(IfcDiscreteAccessoryTypeEnum, 'SOUNDABSORPTION', INDETERMINATE) -pointmachinemountingdevice = express_getattr(IfcDiscreteAccessoryTypeEnum, 'POINTMACHINEMOUNTINGDEVICE', INDETERMINATE) -point_machine_locking_device = express_getattr(IfcDiscreteAccessoryTypeEnum, 'POINT_MACHINE_LOCKING_DEVICE', INDETERMINATE) -rail_mechanical_equipment = express_getattr(IfcDiscreteAccessoryTypeEnum, 'RAIL_MECHANICAL_EQUIPMENT', INDETERMINATE) -birdprotection = express_getattr(IfcDiscreteAccessoryTypeEnum, 'BIRDPROTECTION', INDETERMINATE) -userdefined = express_getattr(IfcDiscreteAccessoryTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDiscreteAccessoryTypeEnum, 'NOTDEFINED', INDETERMINATE) +anchorplate = IfcDiscreteAccessoryTypeEnum.ANCHORPLATE +bracket = IfcDiscreteAccessoryTypeEnum.BRACKET +shoe = IfcDiscreteAccessoryTypeEnum.SHOE +expansion_joint_device = IfcDiscreteAccessoryTypeEnum.EXPANSION_JOINT_DEVICE +cablearranger = IfcDiscreteAccessoryTypeEnum.CABLEARRANGER +insulator = IfcDiscreteAccessoryTypeEnum.INSULATOR +lock = IfcDiscreteAccessoryTypeEnum.LOCK +tensioningequipment = IfcDiscreteAccessoryTypeEnum.TENSIONINGEQUIPMENT +railpad = IfcDiscreteAccessoryTypeEnum.RAILPAD +slidingchair = IfcDiscreteAccessoryTypeEnum.SLIDINGCHAIR +rail_lubrication = IfcDiscreteAccessoryTypeEnum.RAIL_LUBRICATION +panel_strengthening = IfcDiscreteAccessoryTypeEnum.PANEL_STRENGTHENING +railbrace = IfcDiscreteAccessoryTypeEnum.RAILBRACE +elastic_cushion = IfcDiscreteAccessoryTypeEnum.ELASTIC_CUSHION +soundabsorption = IfcDiscreteAccessoryTypeEnum.SOUNDABSORPTION +pointmachinemountingdevice = IfcDiscreteAccessoryTypeEnum.POINTMACHINEMOUNTINGDEVICE +point_machine_locking_device = IfcDiscreteAccessoryTypeEnum.POINT_MACHINE_LOCKING_DEVICE +rail_mechanical_equipment = IfcDiscreteAccessoryTypeEnum.RAIL_MECHANICAL_EQUIPMENT +birdprotection = IfcDiscreteAccessoryTypeEnum.BIRDPROTECTION +userdefined = IfcDiscreteAccessoryTypeEnum.USERDEFINED +notdefined = IfcDiscreteAccessoryTypeEnum.NOTDEFINED IfcDistributionBoardTypeEnum = enum_namespace() -switchboard = express_getattr(IfcDistributionBoardTypeEnum, 'SWITCHBOARD', INDETERMINATE) -consumerunit = express_getattr(IfcDistributionBoardTypeEnum, 'CONSUMERUNIT', INDETERMINATE) -motorcontrolcentre = express_getattr(IfcDistributionBoardTypeEnum, 'MOTORCONTROLCENTRE', INDETERMINATE) -distributionframe = express_getattr(IfcDistributionBoardTypeEnum, 'DISTRIBUTIONFRAME', INDETERMINATE) -distributionboard = express_getattr(IfcDistributionBoardTypeEnum, 'DISTRIBUTIONBOARD', INDETERMINATE) -userdefined = express_getattr(IfcDistributionBoardTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDistributionBoardTypeEnum, 'NOTDEFINED', INDETERMINATE) +switchboard = IfcDistributionBoardTypeEnum.SWITCHBOARD +consumerunit = IfcDistributionBoardTypeEnum.CONSUMERUNIT +motorcontrolcentre = IfcDistributionBoardTypeEnum.MOTORCONTROLCENTRE +distributionframe = IfcDistributionBoardTypeEnum.DISTRIBUTIONFRAME +distributionboard = IfcDistributionBoardTypeEnum.DISTRIBUTIONBOARD +userdefined = IfcDistributionBoardTypeEnum.USERDEFINED +notdefined = IfcDistributionBoardTypeEnum.NOTDEFINED IfcDistributionChamberElementTypeEnum = enum_namespace() -formedduct = express_getattr(IfcDistributionChamberElementTypeEnum, 'FORMEDDUCT', INDETERMINATE) -inspectionchamber = express_getattr(IfcDistributionChamberElementTypeEnum, 'INSPECTIONCHAMBER', INDETERMINATE) -inspectionpit = express_getattr(IfcDistributionChamberElementTypeEnum, 'INSPECTIONPIT', INDETERMINATE) -manhole = express_getattr(IfcDistributionChamberElementTypeEnum, 'MANHOLE', INDETERMINATE) -meterchamber = express_getattr(IfcDistributionChamberElementTypeEnum, 'METERCHAMBER', INDETERMINATE) -sump = express_getattr(IfcDistributionChamberElementTypeEnum, 'SUMP', INDETERMINATE) -trench = express_getattr(IfcDistributionChamberElementTypeEnum, 'TRENCH', INDETERMINATE) -valvechamber = express_getattr(IfcDistributionChamberElementTypeEnum, 'VALVECHAMBER', INDETERMINATE) -userdefined = express_getattr(IfcDistributionChamberElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDistributionChamberElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +formedduct = IfcDistributionChamberElementTypeEnum.FORMEDDUCT +inspectionchamber = IfcDistributionChamberElementTypeEnum.INSPECTIONCHAMBER +inspectionpit = IfcDistributionChamberElementTypeEnum.INSPECTIONPIT +manhole = IfcDistributionChamberElementTypeEnum.MANHOLE +meterchamber = IfcDistributionChamberElementTypeEnum.METERCHAMBER +sump = IfcDistributionChamberElementTypeEnum.SUMP +trench = IfcDistributionChamberElementTypeEnum.TRENCH +valvechamber = IfcDistributionChamberElementTypeEnum.VALVECHAMBER +userdefined = IfcDistributionChamberElementTypeEnum.USERDEFINED +notdefined = IfcDistributionChamberElementTypeEnum.NOTDEFINED IfcDistributionPortTypeEnum = enum_namespace() -cable = express_getattr(IfcDistributionPortTypeEnum, 'CABLE', INDETERMINATE) -cablecarrier = express_getattr(IfcDistributionPortTypeEnum, 'CABLECARRIER', INDETERMINATE) -duct = express_getattr(IfcDistributionPortTypeEnum, 'DUCT', INDETERMINATE) -pipe = express_getattr(IfcDistributionPortTypeEnum, 'PIPE', INDETERMINATE) -wireless = express_getattr(IfcDistributionPortTypeEnum, 'WIRELESS', INDETERMINATE) -userdefined = express_getattr(IfcDistributionPortTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDistributionPortTypeEnum, 'NOTDEFINED', INDETERMINATE) +cable = IfcDistributionPortTypeEnum.CABLE +cablecarrier = IfcDistributionPortTypeEnum.CABLECARRIER +duct = IfcDistributionPortTypeEnum.DUCT +pipe = IfcDistributionPortTypeEnum.PIPE +wireless = IfcDistributionPortTypeEnum.WIRELESS +userdefined = IfcDistributionPortTypeEnum.USERDEFINED +notdefined = IfcDistributionPortTypeEnum.NOTDEFINED IfcDistributionSystemEnum = enum_namespace() -airconditioning = express_getattr(IfcDistributionSystemEnum, 'AIRCONDITIONING', INDETERMINATE) -audiovisual = express_getattr(IfcDistributionSystemEnum, 'AUDIOVISUAL', INDETERMINATE) -chemical = express_getattr(IfcDistributionSystemEnum, 'CHEMICAL', INDETERMINATE) -chilledwater = express_getattr(IfcDistributionSystemEnum, 'CHILLEDWATER', INDETERMINATE) -communication = express_getattr(IfcDistributionSystemEnum, 'COMMUNICATION', INDETERMINATE) -compressedair = express_getattr(IfcDistributionSystemEnum, 'COMPRESSEDAIR', INDETERMINATE) -condenserwater = express_getattr(IfcDistributionSystemEnum, 'CONDENSERWATER', INDETERMINATE) -control = express_getattr(IfcDistributionSystemEnum, 'CONTROL', INDETERMINATE) -conveying = express_getattr(IfcDistributionSystemEnum, 'CONVEYING', INDETERMINATE) -data = express_getattr(IfcDistributionSystemEnum, 'DATA', INDETERMINATE) -disposal = express_getattr(IfcDistributionSystemEnum, 'DISPOSAL', INDETERMINATE) -domesticcoldwater = express_getattr(IfcDistributionSystemEnum, 'DOMESTICCOLDWATER', INDETERMINATE) -domestichotwater = express_getattr(IfcDistributionSystemEnum, 'DOMESTICHOTWATER', INDETERMINATE) -drainage = express_getattr(IfcDistributionSystemEnum, 'DRAINAGE', INDETERMINATE) -earthing = express_getattr(IfcDistributionSystemEnum, 'EARTHING', INDETERMINATE) -electrical = express_getattr(IfcDistributionSystemEnum, 'ELECTRICAL', INDETERMINATE) -electroacoustic = express_getattr(IfcDistributionSystemEnum, 'ELECTROACOUSTIC', INDETERMINATE) -exhaust = express_getattr(IfcDistributionSystemEnum, 'EXHAUST', INDETERMINATE) -fireprotection = express_getattr(IfcDistributionSystemEnum, 'FIREPROTECTION', INDETERMINATE) -fuel = express_getattr(IfcDistributionSystemEnum, 'FUEL', INDETERMINATE) -gas = express_getattr(IfcDistributionSystemEnum, 'GAS', INDETERMINATE) -hazardous = express_getattr(IfcDistributionSystemEnum, 'HAZARDOUS', INDETERMINATE) -heating = express_getattr(IfcDistributionSystemEnum, 'HEATING', INDETERMINATE) -lighting = express_getattr(IfcDistributionSystemEnum, 'LIGHTING', INDETERMINATE) -lightningprotection = express_getattr(IfcDistributionSystemEnum, 'LIGHTNINGPROTECTION', INDETERMINATE) -municipalsolidwaste = express_getattr(IfcDistributionSystemEnum, 'MUNICIPALSOLIDWASTE', INDETERMINATE) -oil = express_getattr(IfcDistributionSystemEnum, 'OIL', INDETERMINATE) -operational = express_getattr(IfcDistributionSystemEnum, 'OPERATIONAL', INDETERMINATE) -powergeneration = express_getattr(IfcDistributionSystemEnum, 'POWERGENERATION', INDETERMINATE) -rainwater = express_getattr(IfcDistributionSystemEnum, 'RAINWATER', INDETERMINATE) -refrigeration = express_getattr(IfcDistributionSystemEnum, 'REFRIGERATION', INDETERMINATE) -security = express_getattr(IfcDistributionSystemEnum, 'SECURITY', INDETERMINATE) -sewage = express_getattr(IfcDistributionSystemEnum, 'SEWAGE', INDETERMINATE) -signal = express_getattr(IfcDistributionSystemEnum, 'SIGNAL', INDETERMINATE) -stormwater = express_getattr(IfcDistributionSystemEnum, 'STORMWATER', INDETERMINATE) -telephone = express_getattr(IfcDistributionSystemEnum, 'TELEPHONE', INDETERMINATE) -tv = express_getattr(IfcDistributionSystemEnum, 'TV', INDETERMINATE) -vacuum = express_getattr(IfcDistributionSystemEnum, 'VACUUM', INDETERMINATE) -vent = express_getattr(IfcDistributionSystemEnum, 'VENT', INDETERMINATE) -ventilation = express_getattr(IfcDistributionSystemEnum, 'VENTILATION', INDETERMINATE) -wastewater = express_getattr(IfcDistributionSystemEnum, 'WASTEWATER', INDETERMINATE) -watersupply = express_getattr(IfcDistributionSystemEnum, 'WATERSUPPLY', INDETERMINATE) -catenary_system = express_getattr(IfcDistributionSystemEnum, 'CATENARY_SYSTEM', INDETERMINATE) -overhead_contactline_system = express_getattr(IfcDistributionSystemEnum, 'OVERHEAD_CONTACTLINE_SYSTEM', INDETERMINATE) -return_circuit = express_getattr(IfcDistributionSystemEnum, 'RETURN_CIRCUIT', INDETERMINATE) -userdefined = express_getattr(IfcDistributionSystemEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDistributionSystemEnum, 'NOTDEFINED', INDETERMINATE) +airconditioning = IfcDistributionSystemEnum.AIRCONDITIONING +audiovisual = IfcDistributionSystemEnum.AUDIOVISUAL +chemical = IfcDistributionSystemEnum.CHEMICAL +chilledwater = IfcDistributionSystemEnum.CHILLEDWATER +communication = IfcDistributionSystemEnum.COMMUNICATION +compressedair = IfcDistributionSystemEnum.COMPRESSEDAIR +condenserwater = IfcDistributionSystemEnum.CONDENSERWATER +control = IfcDistributionSystemEnum.CONTROL +conveying = IfcDistributionSystemEnum.CONVEYING +data = IfcDistributionSystemEnum.DATA +disposal = IfcDistributionSystemEnum.DISPOSAL +domesticcoldwater = IfcDistributionSystemEnum.DOMESTICCOLDWATER +domestichotwater = IfcDistributionSystemEnum.DOMESTICHOTWATER +drainage = IfcDistributionSystemEnum.DRAINAGE +earthing = IfcDistributionSystemEnum.EARTHING +electrical = IfcDistributionSystemEnum.ELECTRICAL +electroacoustic = IfcDistributionSystemEnum.ELECTROACOUSTIC +exhaust = IfcDistributionSystemEnum.EXHAUST +fireprotection = IfcDistributionSystemEnum.FIREPROTECTION +fuel = IfcDistributionSystemEnum.FUEL +gas = IfcDistributionSystemEnum.GAS +hazardous = IfcDistributionSystemEnum.HAZARDOUS +heating = IfcDistributionSystemEnum.HEATING +lighting = IfcDistributionSystemEnum.LIGHTING +lightningprotection = IfcDistributionSystemEnum.LIGHTNINGPROTECTION +municipalsolidwaste = IfcDistributionSystemEnum.MUNICIPALSOLIDWASTE +oil = IfcDistributionSystemEnum.OIL +operational = IfcDistributionSystemEnum.OPERATIONAL +powergeneration = IfcDistributionSystemEnum.POWERGENERATION +rainwater = IfcDistributionSystemEnum.RAINWATER +refrigeration = IfcDistributionSystemEnum.REFRIGERATION +security = IfcDistributionSystemEnum.SECURITY +sewage = IfcDistributionSystemEnum.SEWAGE +signal = IfcDistributionSystemEnum.SIGNAL +stormwater = IfcDistributionSystemEnum.STORMWATER +telephone = IfcDistributionSystemEnum.TELEPHONE +tv = IfcDistributionSystemEnum.TV +vacuum = IfcDistributionSystemEnum.VACUUM +vent = IfcDistributionSystemEnum.VENT +ventilation = IfcDistributionSystemEnum.VENTILATION +wastewater = IfcDistributionSystemEnum.WASTEWATER +watersupply = IfcDistributionSystemEnum.WATERSUPPLY +catenary_system = IfcDistributionSystemEnum.CATENARY_SYSTEM +overhead_contactline_system = IfcDistributionSystemEnum.OVERHEAD_CONTACTLINE_SYSTEM +return_circuit = IfcDistributionSystemEnum.RETURN_CIRCUIT +userdefined = IfcDistributionSystemEnum.USERDEFINED +notdefined = IfcDistributionSystemEnum.NOTDEFINED IfcDocumentConfidentialityEnum = enum_namespace() -public = express_getattr(IfcDocumentConfidentialityEnum, 'PUBLIC', INDETERMINATE) -restricted = express_getattr(IfcDocumentConfidentialityEnum, 'RESTRICTED', INDETERMINATE) -confidential = express_getattr(IfcDocumentConfidentialityEnum, 'CONFIDENTIAL', INDETERMINATE) -personal = express_getattr(IfcDocumentConfidentialityEnum, 'PERSONAL', INDETERMINATE) -userdefined = express_getattr(IfcDocumentConfidentialityEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDocumentConfidentialityEnum, 'NOTDEFINED', INDETERMINATE) +public = IfcDocumentConfidentialityEnum.PUBLIC +restricted = IfcDocumentConfidentialityEnum.RESTRICTED +confidential = IfcDocumentConfidentialityEnum.CONFIDENTIAL +personal = IfcDocumentConfidentialityEnum.PERSONAL +userdefined = IfcDocumentConfidentialityEnum.USERDEFINED +notdefined = IfcDocumentConfidentialityEnum.NOTDEFINED IfcDocumentStatusEnum = enum_namespace() -draft = express_getattr(IfcDocumentStatusEnum, 'DRAFT', INDETERMINATE) -finaldraft = express_getattr(IfcDocumentStatusEnum, 'FINALDRAFT', INDETERMINATE) -final = express_getattr(IfcDocumentStatusEnum, 'FINAL', INDETERMINATE) -revision = express_getattr(IfcDocumentStatusEnum, 'REVISION', INDETERMINATE) -notdefined = express_getattr(IfcDocumentStatusEnum, 'NOTDEFINED', INDETERMINATE) +draft = IfcDocumentStatusEnum.DRAFT +finaldraft = IfcDocumentStatusEnum.FINALDRAFT +final = IfcDocumentStatusEnum.FINAL +revision = IfcDocumentStatusEnum.REVISION +notdefined = IfcDocumentStatusEnum.NOTDEFINED IfcDoorPanelOperationEnum = enum_namespace() -swinging = express_getattr(IfcDoorPanelOperationEnum, 'SWINGING', INDETERMINATE) -double_acting = express_getattr(IfcDoorPanelOperationEnum, 'DOUBLE_ACTING', INDETERMINATE) -sliding = express_getattr(IfcDoorPanelOperationEnum, 'SLIDING', INDETERMINATE) -folding = express_getattr(IfcDoorPanelOperationEnum, 'FOLDING', INDETERMINATE) -revolving = express_getattr(IfcDoorPanelOperationEnum, 'REVOLVING', INDETERMINATE) -rollingup = express_getattr(IfcDoorPanelOperationEnum, 'ROLLINGUP', INDETERMINATE) -fixedpanel = express_getattr(IfcDoorPanelOperationEnum, 'FIXEDPANEL', INDETERMINATE) -userdefined = express_getattr(IfcDoorPanelOperationEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDoorPanelOperationEnum, 'NOTDEFINED', INDETERMINATE) +swinging = IfcDoorPanelOperationEnum.SWINGING +double_acting = IfcDoorPanelOperationEnum.DOUBLE_ACTING +sliding = IfcDoorPanelOperationEnum.SLIDING +folding = IfcDoorPanelOperationEnum.FOLDING +revolving = IfcDoorPanelOperationEnum.REVOLVING +rollingup = IfcDoorPanelOperationEnum.ROLLINGUP +fixedpanel = IfcDoorPanelOperationEnum.FIXEDPANEL +userdefined = IfcDoorPanelOperationEnum.USERDEFINED +notdefined = IfcDoorPanelOperationEnum.NOTDEFINED IfcDoorPanelPositionEnum = enum_namespace() -left = express_getattr(IfcDoorPanelPositionEnum, 'LEFT', INDETERMINATE) -middle = express_getattr(IfcDoorPanelPositionEnum, 'MIDDLE', INDETERMINATE) -right = express_getattr(IfcDoorPanelPositionEnum, 'RIGHT', INDETERMINATE) -notdefined = express_getattr(IfcDoorPanelPositionEnum, 'NOTDEFINED', INDETERMINATE) +left = IfcDoorPanelPositionEnum.LEFT +middle = IfcDoorPanelPositionEnum.MIDDLE +right = IfcDoorPanelPositionEnum.RIGHT +notdefined = IfcDoorPanelPositionEnum.NOTDEFINED IfcDoorStyleConstructionEnum = enum_namespace() -aluminium = express_getattr(IfcDoorStyleConstructionEnum, 'ALUMINIUM', INDETERMINATE) -high_grade_steel = express_getattr(IfcDoorStyleConstructionEnum, 'HIGH_GRADE_STEEL', INDETERMINATE) -steel = express_getattr(IfcDoorStyleConstructionEnum, 'STEEL', INDETERMINATE) -wood = express_getattr(IfcDoorStyleConstructionEnum, 'WOOD', INDETERMINATE) -aluminium_wood = express_getattr(IfcDoorStyleConstructionEnum, 'ALUMINIUM_WOOD', INDETERMINATE) -aluminium_plastic = express_getattr(IfcDoorStyleConstructionEnum, 'ALUMINIUM_PLASTIC', INDETERMINATE) -plastic = express_getattr(IfcDoorStyleConstructionEnum, 'PLASTIC', INDETERMINATE) -userdefined = express_getattr(IfcDoorStyleConstructionEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDoorStyleConstructionEnum, 'NOTDEFINED', INDETERMINATE) +aluminium = IfcDoorStyleConstructionEnum.ALUMINIUM +high_grade_steel = IfcDoorStyleConstructionEnum.HIGH_GRADE_STEEL +steel = IfcDoorStyleConstructionEnum.STEEL +wood = IfcDoorStyleConstructionEnum.WOOD +aluminium_wood = IfcDoorStyleConstructionEnum.ALUMINIUM_WOOD +aluminium_plastic = IfcDoorStyleConstructionEnum.ALUMINIUM_PLASTIC +plastic = IfcDoorStyleConstructionEnum.PLASTIC +userdefined = IfcDoorStyleConstructionEnum.USERDEFINED +notdefined = IfcDoorStyleConstructionEnum.NOTDEFINED IfcDoorStyleOperationEnum = enum_namespace() -single_swing_left = express_getattr(IfcDoorStyleOperationEnum, 'SINGLE_SWING_LEFT', INDETERMINATE) -single_swing_right = express_getattr(IfcDoorStyleOperationEnum, 'SINGLE_SWING_RIGHT', INDETERMINATE) -double_door_single_swing = express_getattr(IfcDoorStyleOperationEnum, 'DOUBLE_DOOR_SINGLE_SWING', INDETERMINATE) -double_door_single_swing_opposite_left = express_getattr(IfcDoorStyleOperationEnum, 'DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_LEFT', INDETERMINATE) -double_door_single_swing_opposite_right = express_getattr(IfcDoorStyleOperationEnum, 'DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_RIGHT', INDETERMINATE) -double_swing_left = express_getattr(IfcDoorStyleOperationEnum, 'DOUBLE_SWING_LEFT', INDETERMINATE) -double_swing_right = express_getattr(IfcDoorStyleOperationEnum, 'DOUBLE_SWING_RIGHT', INDETERMINATE) -double_door_double_swing = express_getattr(IfcDoorStyleOperationEnum, 'DOUBLE_DOOR_DOUBLE_SWING', INDETERMINATE) -sliding_to_left = express_getattr(IfcDoorStyleOperationEnum, 'SLIDING_TO_LEFT', INDETERMINATE) -sliding_to_right = express_getattr(IfcDoorStyleOperationEnum, 'SLIDING_TO_RIGHT', INDETERMINATE) -double_door_sliding = express_getattr(IfcDoorStyleOperationEnum, 'DOUBLE_DOOR_SLIDING', INDETERMINATE) -folding_to_left = express_getattr(IfcDoorStyleOperationEnum, 'FOLDING_TO_LEFT', INDETERMINATE) -folding_to_right = express_getattr(IfcDoorStyleOperationEnum, 'FOLDING_TO_RIGHT', INDETERMINATE) -double_door_folding = express_getattr(IfcDoorStyleOperationEnum, 'DOUBLE_DOOR_FOLDING', INDETERMINATE) -revolving = express_getattr(IfcDoorStyleOperationEnum, 'REVOLVING', INDETERMINATE) -rollingup = express_getattr(IfcDoorStyleOperationEnum, 'ROLLINGUP', INDETERMINATE) -userdefined = express_getattr(IfcDoorStyleOperationEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDoorStyleOperationEnum, 'NOTDEFINED', INDETERMINATE) +single_swing_left = IfcDoorStyleOperationEnum.SINGLE_SWING_LEFT +single_swing_right = IfcDoorStyleOperationEnum.SINGLE_SWING_RIGHT +double_door_single_swing = IfcDoorStyleOperationEnum.DOUBLE_DOOR_SINGLE_SWING +double_door_single_swing_opposite_left = IfcDoorStyleOperationEnum.DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_LEFT +double_door_single_swing_opposite_right = IfcDoorStyleOperationEnum.DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_RIGHT +double_swing_left = IfcDoorStyleOperationEnum.DOUBLE_SWING_LEFT +double_swing_right = IfcDoorStyleOperationEnum.DOUBLE_SWING_RIGHT +double_door_double_swing = IfcDoorStyleOperationEnum.DOUBLE_DOOR_DOUBLE_SWING +sliding_to_left = IfcDoorStyleOperationEnum.SLIDING_TO_LEFT +sliding_to_right = IfcDoorStyleOperationEnum.SLIDING_TO_RIGHT +double_door_sliding = IfcDoorStyleOperationEnum.DOUBLE_DOOR_SLIDING +folding_to_left = IfcDoorStyleOperationEnum.FOLDING_TO_LEFT +folding_to_right = IfcDoorStyleOperationEnum.FOLDING_TO_RIGHT +double_door_folding = IfcDoorStyleOperationEnum.DOUBLE_DOOR_FOLDING +revolving = IfcDoorStyleOperationEnum.REVOLVING +rollingup = IfcDoorStyleOperationEnum.ROLLINGUP +userdefined = IfcDoorStyleOperationEnum.USERDEFINED +notdefined = IfcDoorStyleOperationEnum.NOTDEFINED IfcDoorTypeEnum = enum_namespace() -door = express_getattr(IfcDoorTypeEnum, 'DOOR', INDETERMINATE) -gate = express_getattr(IfcDoorTypeEnum, 'GATE', INDETERMINATE) -trapdoor = express_getattr(IfcDoorTypeEnum, 'TRAPDOOR', INDETERMINATE) -boom_barrier = express_getattr(IfcDoorTypeEnum, 'BOOM_BARRIER', INDETERMINATE) -turnstile = express_getattr(IfcDoorTypeEnum, 'TURNSTILE', INDETERMINATE) -userdefined = express_getattr(IfcDoorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDoorTypeEnum, 'NOTDEFINED', INDETERMINATE) +door = IfcDoorTypeEnum.DOOR +gate = IfcDoorTypeEnum.GATE +trapdoor = IfcDoorTypeEnum.TRAPDOOR +boom_barrier = IfcDoorTypeEnum.BOOM_BARRIER +turnstile = IfcDoorTypeEnum.TURNSTILE +userdefined = IfcDoorTypeEnum.USERDEFINED +notdefined = IfcDoorTypeEnum.NOTDEFINED IfcDoorTypeOperationEnum = enum_namespace() -single_swing_left = express_getattr(IfcDoorTypeOperationEnum, 'SINGLE_SWING_LEFT', INDETERMINATE) -single_swing_right = express_getattr(IfcDoorTypeOperationEnum, 'SINGLE_SWING_RIGHT', INDETERMINATE) -double_panel_single_swing = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_PANEL_SINGLE_SWING', INDETERMINATE) -double_panel_single_swing_opposite_left = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_PANEL_SINGLE_SWING_OPPOSITE_LEFT', INDETERMINATE) -double_panel_single_swing_opposite_right = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_PANEL_SINGLE_SWING_OPPOSITE_RIGHT', INDETERMINATE) -double_swing_left = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_SWING_LEFT', INDETERMINATE) -double_swing_right = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_SWING_RIGHT', INDETERMINATE) -double_panel_double_swing = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_PANEL_DOUBLE_SWING', INDETERMINATE) -sliding_to_left = express_getattr(IfcDoorTypeOperationEnum, 'SLIDING_TO_LEFT', INDETERMINATE) -sliding_to_right = express_getattr(IfcDoorTypeOperationEnum, 'SLIDING_TO_RIGHT', INDETERMINATE) -double_panel_sliding = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_PANEL_SLIDING', INDETERMINATE) -folding_to_left = express_getattr(IfcDoorTypeOperationEnum, 'FOLDING_TO_LEFT', INDETERMINATE) -folding_to_right = express_getattr(IfcDoorTypeOperationEnum, 'FOLDING_TO_RIGHT', INDETERMINATE) -double_panel_folding = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_PANEL_FOLDING', INDETERMINATE) -revolving_horizontal = express_getattr(IfcDoorTypeOperationEnum, 'REVOLVING_HORIZONTAL', INDETERMINATE) -rollingup = express_getattr(IfcDoorTypeOperationEnum, 'ROLLINGUP', INDETERMINATE) -swing_fixed_left = express_getattr(IfcDoorTypeOperationEnum, 'SWING_FIXED_LEFT', INDETERMINATE) -swing_fixed_right = express_getattr(IfcDoorTypeOperationEnum, 'SWING_FIXED_RIGHT', INDETERMINATE) -double_panel_lifting_vertical = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_PANEL_LIFTING_VERTICAL', INDETERMINATE) -lifting_horizontal = express_getattr(IfcDoorTypeOperationEnum, 'LIFTING_HORIZONTAL', INDETERMINATE) -lifting_vertical_left = express_getattr(IfcDoorTypeOperationEnum, 'LIFTING_VERTICAL_LEFT', INDETERMINATE) -lifting_vertical_right = express_getattr(IfcDoorTypeOperationEnum, 'LIFTING_VERTICAL_RIGHT', INDETERMINATE) -revolving_vertical = express_getattr(IfcDoorTypeOperationEnum, 'REVOLVING_VERTICAL', INDETERMINATE) -userdefined = express_getattr(IfcDoorTypeOperationEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDoorTypeOperationEnum, 'NOTDEFINED', INDETERMINATE) +single_swing_left = IfcDoorTypeOperationEnum.SINGLE_SWING_LEFT +single_swing_right = IfcDoorTypeOperationEnum.SINGLE_SWING_RIGHT +double_panel_single_swing = IfcDoorTypeOperationEnum.DOUBLE_PANEL_SINGLE_SWING +double_panel_single_swing_opposite_left = IfcDoorTypeOperationEnum.DOUBLE_PANEL_SINGLE_SWING_OPPOSITE_LEFT +double_panel_single_swing_opposite_right = IfcDoorTypeOperationEnum.DOUBLE_PANEL_SINGLE_SWING_OPPOSITE_RIGHT +double_swing_left = IfcDoorTypeOperationEnum.DOUBLE_SWING_LEFT +double_swing_right = IfcDoorTypeOperationEnum.DOUBLE_SWING_RIGHT +double_panel_double_swing = IfcDoorTypeOperationEnum.DOUBLE_PANEL_DOUBLE_SWING +sliding_to_left = IfcDoorTypeOperationEnum.SLIDING_TO_LEFT +sliding_to_right = IfcDoorTypeOperationEnum.SLIDING_TO_RIGHT +double_panel_sliding = IfcDoorTypeOperationEnum.DOUBLE_PANEL_SLIDING +folding_to_left = IfcDoorTypeOperationEnum.FOLDING_TO_LEFT +folding_to_right = IfcDoorTypeOperationEnum.FOLDING_TO_RIGHT +double_panel_folding = IfcDoorTypeOperationEnum.DOUBLE_PANEL_FOLDING +revolving_horizontal = IfcDoorTypeOperationEnum.REVOLVING_HORIZONTAL +rollingup = IfcDoorTypeOperationEnum.ROLLINGUP +swing_fixed_left = IfcDoorTypeOperationEnum.SWING_FIXED_LEFT +swing_fixed_right = IfcDoorTypeOperationEnum.SWING_FIXED_RIGHT +double_panel_lifting_vertical = IfcDoorTypeOperationEnum.DOUBLE_PANEL_LIFTING_VERTICAL +lifting_horizontal = IfcDoorTypeOperationEnum.LIFTING_HORIZONTAL +lifting_vertical_left = IfcDoorTypeOperationEnum.LIFTING_VERTICAL_LEFT +lifting_vertical_right = IfcDoorTypeOperationEnum.LIFTING_VERTICAL_RIGHT +revolving_vertical = IfcDoorTypeOperationEnum.REVOLVING_VERTICAL +userdefined = IfcDoorTypeOperationEnum.USERDEFINED +notdefined = IfcDoorTypeOperationEnum.NOTDEFINED IfcDuctFittingTypeEnum = enum_namespace() -bend = express_getattr(IfcDuctFittingTypeEnum, 'BEND', INDETERMINATE) -connector = express_getattr(IfcDuctFittingTypeEnum, 'CONNECTOR', INDETERMINATE) -entry = express_getattr(IfcDuctFittingTypeEnum, 'ENTRY', INDETERMINATE) -exit = express_getattr(IfcDuctFittingTypeEnum, 'EXIT', INDETERMINATE) -junction = express_getattr(IfcDuctFittingTypeEnum, 'JUNCTION', INDETERMINATE) -obstruction = express_getattr(IfcDuctFittingTypeEnum, 'OBSTRUCTION', INDETERMINATE) -transition = express_getattr(IfcDuctFittingTypeEnum, 'TRANSITION', INDETERMINATE) -userdefined = express_getattr(IfcDuctFittingTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDuctFittingTypeEnum, 'NOTDEFINED', INDETERMINATE) +bend = IfcDuctFittingTypeEnum.BEND +connector = IfcDuctFittingTypeEnum.CONNECTOR +entry = IfcDuctFittingTypeEnum.ENTRY +exit = IfcDuctFittingTypeEnum.EXIT +junction = IfcDuctFittingTypeEnum.JUNCTION +obstruction = IfcDuctFittingTypeEnum.OBSTRUCTION +transition = IfcDuctFittingTypeEnum.TRANSITION +userdefined = IfcDuctFittingTypeEnum.USERDEFINED +notdefined = IfcDuctFittingTypeEnum.NOTDEFINED IfcDuctSegmentTypeEnum = enum_namespace() -rigidsegment = express_getattr(IfcDuctSegmentTypeEnum, 'RIGIDSEGMENT', INDETERMINATE) -flexiblesegment = express_getattr(IfcDuctSegmentTypeEnum, 'FLEXIBLESEGMENT', INDETERMINATE) -userdefined = express_getattr(IfcDuctSegmentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDuctSegmentTypeEnum, 'NOTDEFINED', INDETERMINATE) +rigidsegment = IfcDuctSegmentTypeEnum.RIGIDSEGMENT +flexiblesegment = IfcDuctSegmentTypeEnum.FLEXIBLESEGMENT +userdefined = IfcDuctSegmentTypeEnum.USERDEFINED +notdefined = IfcDuctSegmentTypeEnum.NOTDEFINED IfcDuctSilencerTypeEnum = enum_namespace() -flatoval = express_getattr(IfcDuctSilencerTypeEnum, 'FLATOVAL', INDETERMINATE) -rectangular = express_getattr(IfcDuctSilencerTypeEnum, 'RECTANGULAR', INDETERMINATE) -round = express_getattr(IfcDuctSilencerTypeEnum, 'ROUND', INDETERMINATE) -userdefined = express_getattr(IfcDuctSilencerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDuctSilencerTypeEnum, 'NOTDEFINED', INDETERMINATE) +flatoval = IfcDuctSilencerTypeEnum.FLATOVAL +rectangular = IfcDuctSilencerTypeEnum.RECTANGULAR +round = IfcDuctSilencerTypeEnum.ROUND +userdefined = IfcDuctSilencerTypeEnum.USERDEFINED +notdefined = IfcDuctSilencerTypeEnum.NOTDEFINED IfcEarthworksCutTypeEnum = enum_namespace() -trench = express_getattr(IfcEarthworksCutTypeEnum, 'TRENCH', INDETERMINATE) -dredging = express_getattr(IfcEarthworksCutTypeEnum, 'DREDGING', INDETERMINATE) -excavation = express_getattr(IfcEarthworksCutTypeEnum, 'EXCAVATION', INDETERMINATE) -overexcavation = express_getattr(IfcEarthworksCutTypeEnum, 'OVEREXCAVATION', INDETERMINATE) -topsoilremoval = express_getattr(IfcEarthworksCutTypeEnum, 'TOPSOILREMOVAL', INDETERMINATE) -stepexcavation = express_getattr(IfcEarthworksCutTypeEnum, 'STEPEXCAVATION', INDETERMINATE) -pavementmilling = express_getattr(IfcEarthworksCutTypeEnum, 'PAVEMENTMILLING', INDETERMINATE) -cut = express_getattr(IfcEarthworksCutTypeEnum, 'CUT', INDETERMINATE) -base_excavation = express_getattr(IfcEarthworksCutTypeEnum, 'BASE_EXCAVATION', INDETERMINATE) -userdefined = express_getattr(IfcEarthworksCutTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcEarthworksCutTypeEnum, 'NOTDEFINED', INDETERMINATE) +trench = IfcEarthworksCutTypeEnum.TRENCH +dredging = IfcEarthworksCutTypeEnum.DREDGING +excavation = IfcEarthworksCutTypeEnum.EXCAVATION +overexcavation = IfcEarthworksCutTypeEnum.OVEREXCAVATION +topsoilremoval = IfcEarthworksCutTypeEnum.TOPSOILREMOVAL +stepexcavation = IfcEarthworksCutTypeEnum.STEPEXCAVATION +pavementmilling = IfcEarthworksCutTypeEnum.PAVEMENTMILLING +cut = IfcEarthworksCutTypeEnum.CUT +base_excavation = IfcEarthworksCutTypeEnum.BASE_EXCAVATION +userdefined = IfcEarthworksCutTypeEnum.USERDEFINED +notdefined = IfcEarthworksCutTypeEnum.NOTDEFINED IfcEarthworksFillTypeEnum = enum_namespace() -backfill = express_getattr(IfcEarthworksFillTypeEnum, 'BACKFILL', INDETERMINATE) -counterweight = express_getattr(IfcEarthworksFillTypeEnum, 'COUNTERWEIGHT', INDETERMINATE) -subgrade = express_getattr(IfcEarthworksFillTypeEnum, 'SUBGRADE', INDETERMINATE) -embankment = express_getattr(IfcEarthworksFillTypeEnum, 'EMBANKMENT', INDETERMINATE) -transitionsection = express_getattr(IfcEarthworksFillTypeEnum, 'TRANSITIONSECTION', INDETERMINATE) -subgradebed = express_getattr(IfcEarthworksFillTypeEnum, 'SUBGRADEBED', INDETERMINATE) -slopefill = express_getattr(IfcEarthworksFillTypeEnum, 'SLOPEFILL', INDETERMINATE) -userdefined = express_getattr(IfcEarthworksFillTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcEarthworksFillTypeEnum, 'NOTDEFINED', INDETERMINATE) +backfill = IfcEarthworksFillTypeEnum.BACKFILL +counterweight = IfcEarthworksFillTypeEnum.COUNTERWEIGHT +subgrade = IfcEarthworksFillTypeEnum.SUBGRADE +embankment = IfcEarthworksFillTypeEnum.EMBANKMENT +transitionsection = IfcEarthworksFillTypeEnum.TRANSITIONSECTION +subgradebed = IfcEarthworksFillTypeEnum.SUBGRADEBED +slopefill = IfcEarthworksFillTypeEnum.SLOPEFILL +userdefined = IfcEarthworksFillTypeEnum.USERDEFINED +notdefined = IfcEarthworksFillTypeEnum.NOTDEFINED IfcElectricApplianceTypeEnum = enum_namespace() -dishwasher = express_getattr(IfcElectricApplianceTypeEnum, 'DISHWASHER', INDETERMINATE) -electriccooker = express_getattr(IfcElectricApplianceTypeEnum, 'ELECTRICCOOKER', INDETERMINATE) -freestandingelectricheater = express_getattr(IfcElectricApplianceTypeEnum, 'FREESTANDINGELECTRICHEATER', INDETERMINATE) -freestandingfan = express_getattr(IfcElectricApplianceTypeEnum, 'FREESTANDINGFAN', INDETERMINATE) -freestandingwaterheater = express_getattr(IfcElectricApplianceTypeEnum, 'FREESTANDINGWATERHEATER', INDETERMINATE) -freestandingwatercooler = express_getattr(IfcElectricApplianceTypeEnum, 'FREESTANDINGWATERCOOLER', INDETERMINATE) -freezer = express_getattr(IfcElectricApplianceTypeEnum, 'FREEZER', INDETERMINATE) -fridge_freezer = express_getattr(IfcElectricApplianceTypeEnum, 'FRIDGE_FREEZER', INDETERMINATE) -handdryer = express_getattr(IfcElectricApplianceTypeEnum, 'HANDDRYER', INDETERMINATE) -kitchenmachine = express_getattr(IfcElectricApplianceTypeEnum, 'KITCHENMACHINE', INDETERMINATE) -microwave = express_getattr(IfcElectricApplianceTypeEnum, 'MICROWAVE', INDETERMINATE) -photocopier = express_getattr(IfcElectricApplianceTypeEnum, 'PHOTOCOPIER', INDETERMINATE) -refrigerator = express_getattr(IfcElectricApplianceTypeEnum, 'REFRIGERATOR', INDETERMINATE) -tumbledryer = express_getattr(IfcElectricApplianceTypeEnum, 'TUMBLEDRYER', INDETERMINATE) -vendingmachine = express_getattr(IfcElectricApplianceTypeEnum, 'VENDINGMACHINE', INDETERMINATE) -washingmachine = express_getattr(IfcElectricApplianceTypeEnum, 'WASHINGMACHINE', INDETERMINATE) -userdefined = express_getattr(IfcElectricApplianceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcElectricApplianceTypeEnum, 'NOTDEFINED', INDETERMINATE) +dishwasher = IfcElectricApplianceTypeEnum.DISHWASHER +electriccooker = IfcElectricApplianceTypeEnum.ELECTRICCOOKER +freestandingelectricheater = IfcElectricApplianceTypeEnum.FREESTANDINGELECTRICHEATER +freestandingfan = IfcElectricApplianceTypeEnum.FREESTANDINGFAN +freestandingwaterheater = IfcElectricApplianceTypeEnum.FREESTANDINGWATERHEATER +freestandingwatercooler = IfcElectricApplianceTypeEnum.FREESTANDINGWATERCOOLER +freezer = IfcElectricApplianceTypeEnum.FREEZER +fridge_freezer = IfcElectricApplianceTypeEnum.FRIDGE_FREEZER +handdryer = IfcElectricApplianceTypeEnum.HANDDRYER +kitchenmachine = IfcElectricApplianceTypeEnum.KITCHENMACHINE +microwave = IfcElectricApplianceTypeEnum.MICROWAVE +photocopier = IfcElectricApplianceTypeEnum.PHOTOCOPIER +refrigerator = IfcElectricApplianceTypeEnum.REFRIGERATOR +tumbledryer = IfcElectricApplianceTypeEnum.TUMBLEDRYER +vendingmachine = IfcElectricApplianceTypeEnum.VENDINGMACHINE +washingmachine = IfcElectricApplianceTypeEnum.WASHINGMACHINE +userdefined = IfcElectricApplianceTypeEnum.USERDEFINED +notdefined = IfcElectricApplianceTypeEnum.NOTDEFINED IfcElectricDistributionBoardTypeEnum = enum_namespace() -consumerunit = express_getattr(IfcElectricDistributionBoardTypeEnum, 'CONSUMERUNIT', INDETERMINATE) -distributionboard = express_getattr(IfcElectricDistributionBoardTypeEnum, 'DISTRIBUTIONBOARD', INDETERMINATE) -motorcontrolcentre = express_getattr(IfcElectricDistributionBoardTypeEnum, 'MOTORCONTROLCENTRE', INDETERMINATE) -switchboard = express_getattr(IfcElectricDistributionBoardTypeEnum, 'SWITCHBOARD', INDETERMINATE) -userdefined = express_getattr(IfcElectricDistributionBoardTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcElectricDistributionBoardTypeEnum, 'NOTDEFINED', INDETERMINATE) +consumerunit = IfcElectricDistributionBoardTypeEnum.CONSUMERUNIT +distributionboard = IfcElectricDistributionBoardTypeEnum.DISTRIBUTIONBOARD +motorcontrolcentre = IfcElectricDistributionBoardTypeEnum.MOTORCONTROLCENTRE +switchboard = IfcElectricDistributionBoardTypeEnum.SWITCHBOARD +userdefined = IfcElectricDistributionBoardTypeEnum.USERDEFINED +notdefined = IfcElectricDistributionBoardTypeEnum.NOTDEFINED IfcElectricFlowStorageDeviceTypeEnum = enum_namespace() -battery = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'BATTERY', INDETERMINATE) -capacitorbank = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'CAPACITORBANK', INDETERMINATE) -harmonicfilter = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'HARMONICFILTER', INDETERMINATE) -inductorbank = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'INDUCTORBANK', INDETERMINATE) -ups = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'UPS', INDETERMINATE) -capacitor = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'CAPACITOR', INDETERMINATE) -compensator = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'COMPENSATOR', INDETERMINATE) -inductor = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'INDUCTOR', INDETERMINATE) -recharger = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'RECHARGER', INDETERMINATE) -userdefined = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'NOTDEFINED', INDETERMINATE) +battery = IfcElectricFlowStorageDeviceTypeEnum.BATTERY +capacitorbank = IfcElectricFlowStorageDeviceTypeEnum.CAPACITORBANK +harmonicfilter = IfcElectricFlowStorageDeviceTypeEnum.HARMONICFILTER +inductorbank = IfcElectricFlowStorageDeviceTypeEnum.INDUCTORBANK +ups = IfcElectricFlowStorageDeviceTypeEnum.UPS +capacitor = IfcElectricFlowStorageDeviceTypeEnum.CAPACITOR +compensator = IfcElectricFlowStorageDeviceTypeEnum.COMPENSATOR +inductor = IfcElectricFlowStorageDeviceTypeEnum.INDUCTOR +recharger = IfcElectricFlowStorageDeviceTypeEnum.RECHARGER +userdefined = IfcElectricFlowStorageDeviceTypeEnum.USERDEFINED +notdefined = IfcElectricFlowStorageDeviceTypeEnum.NOTDEFINED IfcElectricFlowTreatmentDeviceTypeEnum = enum_namespace() -electronicfilter = express_getattr(IfcElectricFlowTreatmentDeviceTypeEnum, 'ELECTRONICFILTER', INDETERMINATE) -userdefined = express_getattr(IfcElectricFlowTreatmentDeviceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcElectricFlowTreatmentDeviceTypeEnum, 'NOTDEFINED', INDETERMINATE) +electronicfilter = IfcElectricFlowTreatmentDeviceTypeEnum.ELECTRONICFILTER +userdefined = IfcElectricFlowTreatmentDeviceTypeEnum.USERDEFINED +notdefined = IfcElectricFlowTreatmentDeviceTypeEnum.NOTDEFINED IfcElectricGeneratorTypeEnum = enum_namespace() -chp = express_getattr(IfcElectricGeneratorTypeEnum, 'CHP', INDETERMINATE) -enginegenerator = express_getattr(IfcElectricGeneratorTypeEnum, 'ENGINEGENERATOR', INDETERMINATE) -standalone = express_getattr(IfcElectricGeneratorTypeEnum, 'STANDALONE', INDETERMINATE) -userdefined = express_getattr(IfcElectricGeneratorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcElectricGeneratorTypeEnum, 'NOTDEFINED', INDETERMINATE) +chp = IfcElectricGeneratorTypeEnum.CHP +enginegenerator = IfcElectricGeneratorTypeEnum.ENGINEGENERATOR +standalone = IfcElectricGeneratorTypeEnum.STANDALONE +userdefined = IfcElectricGeneratorTypeEnum.USERDEFINED +notdefined = IfcElectricGeneratorTypeEnum.NOTDEFINED IfcElectricMotorTypeEnum = enum_namespace() -dc = express_getattr(IfcElectricMotorTypeEnum, 'DC', INDETERMINATE) -induction = express_getattr(IfcElectricMotorTypeEnum, 'INDUCTION', INDETERMINATE) -polyphase = express_getattr(IfcElectricMotorTypeEnum, 'POLYPHASE', INDETERMINATE) -reluctancesynchronous = express_getattr(IfcElectricMotorTypeEnum, 'RELUCTANCESYNCHRONOUS', INDETERMINATE) -synchronous = express_getattr(IfcElectricMotorTypeEnum, 'SYNCHRONOUS', INDETERMINATE) -userdefined = express_getattr(IfcElectricMotorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcElectricMotorTypeEnum, 'NOTDEFINED', INDETERMINATE) +dc = IfcElectricMotorTypeEnum.DC +induction = IfcElectricMotorTypeEnum.INDUCTION +polyphase = IfcElectricMotorTypeEnum.POLYPHASE +reluctancesynchronous = IfcElectricMotorTypeEnum.RELUCTANCESYNCHRONOUS +synchronous = IfcElectricMotorTypeEnum.SYNCHRONOUS +userdefined = IfcElectricMotorTypeEnum.USERDEFINED +notdefined = IfcElectricMotorTypeEnum.NOTDEFINED IfcElectricTimeControlTypeEnum = enum_namespace() -timeclock = express_getattr(IfcElectricTimeControlTypeEnum, 'TIMECLOCK', INDETERMINATE) -timedelay = express_getattr(IfcElectricTimeControlTypeEnum, 'TIMEDELAY', INDETERMINATE) -relay = express_getattr(IfcElectricTimeControlTypeEnum, 'RELAY', INDETERMINATE) -userdefined = express_getattr(IfcElectricTimeControlTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcElectricTimeControlTypeEnum, 'NOTDEFINED', INDETERMINATE) +timeclock = IfcElectricTimeControlTypeEnum.TIMECLOCK +timedelay = IfcElectricTimeControlTypeEnum.TIMEDELAY +relay = IfcElectricTimeControlTypeEnum.RELAY +userdefined = IfcElectricTimeControlTypeEnum.USERDEFINED +notdefined = IfcElectricTimeControlTypeEnum.NOTDEFINED IfcElementAssemblyTypeEnum = enum_namespace() -accessory_assembly = express_getattr(IfcElementAssemblyTypeEnum, 'ACCESSORY_ASSEMBLY', INDETERMINATE) -arch = express_getattr(IfcElementAssemblyTypeEnum, 'ARCH', INDETERMINATE) -beam_grid = express_getattr(IfcElementAssemblyTypeEnum, 'BEAM_GRID', INDETERMINATE) -braced_frame = express_getattr(IfcElementAssemblyTypeEnum, 'BRACED_FRAME', INDETERMINATE) -girder = express_getattr(IfcElementAssemblyTypeEnum, 'GIRDER', INDETERMINATE) -reinforcement_unit = express_getattr(IfcElementAssemblyTypeEnum, 'REINFORCEMENT_UNIT', INDETERMINATE) -rigid_frame = express_getattr(IfcElementAssemblyTypeEnum, 'RIGID_FRAME', INDETERMINATE) -slab_field = express_getattr(IfcElementAssemblyTypeEnum, 'SLAB_FIELD', INDETERMINATE) -truss = express_getattr(IfcElementAssemblyTypeEnum, 'TRUSS', INDETERMINATE) -abutment = express_getattr(IfcElementAssemblyTypeEnum, 'ABUTMENT', INDETERMINATE) -pier = express_getattr(IfcElementAssemblyTypeEnum, 'PIER', INDETERMINATE) -pylon = express_getattr(IfcElementAssemblyTypeEnum, 'PYLON', INDETERMINATE) -cross_bracing = express_getattr(IfcElementAssemblyTypeEnum, 'CROSS_BRACING', INDETERMINATE) -deck = express_getattr(IfcElementAssemblyTypeEnum, 'DECK', INDETERMINATE) -mast = express_getattr(IfcElementAssemblyTypeEnum, 'MAST', INDETERMINATE) -signalassembly = express_getattr(IfcElementAssemblyTypeEnum, 'SIGNALASSEMBLY', INDETERMINATE) -grid = express_getattr(IfcElementAssemblyTypeEnum, 'GRID', INDETERMINATE) -shelter = express_getattr(IfcElementAssemblyTypeEnum, 'SHELTER', INDETERMINATE) -supportingassembly = express_getattr(IfcElementAssemblyTypeEnum, 'SUPPORTINGASSEMBLY', INDETERMINATE) -suspensionassembly = express_getattr(IfcElementAssemblyTypeEnum, 'SUSPENSIONASSEMBLY', INDETERMINATE) -traction_switching_assembly = express_getattr(IfcElementAssemblyTypeEnum, 'TRACTION_SWITCHING_ASSEMBLY', INDETERMINATE) -trackpanel = express_getattr(IfcElementAssemblyTypeEnum, 'TRACKPANEL', INDETERMINATE) -turnoutpanel = express_getattr(IfcElementAssemblyTypeEnum, 'TURNOUTPANEL', INDETERMINATE) -dilatationpanel = express_getattr(IfcElementAssemblyTypeEnum, 'DILATATIONPANEL', INDETERMINATE) -rail_mechanical_equipment_assembly = express_getattr(IfcElementAssemblyTypeEnum, 'RAIL_MECHANICAL_EQUIPMENT_ASSEMBLY', INDETERMINATE) -entranceworks = express_getattr(IfcElementAssemblyTypeEnum, 'ENTRANCEWORKS', INDETERMINATE) -sumpbuster = express_getattr(IfcElementAssemblyTypeEnum, 'SUMPBUSTER', INDETERMINATE) -traffic_calming_device = express_getattr(IfcElementAssemblyTypeEnum, 'TRAFFIC_CALMING_DEVICE', INDETERMINATE) -userdefined = express_getattr(IfcElementAssemblyTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcElementAssemblyTypeEnum, 'NOTDEFINED', INDETERMINATE) +accessory_assembly = IfcElementAssemblyTypeEnum.ACCESSORY_ASSEMBLY +arch = IfcElementAssemblyTypeEnum.ARCH +beam_grid = IfcElementAssemblyTypeEnum.BEAM_GRID +braced_frame = IfcElementAssemblyTypeEnum.BRACED_FRAME +girder = IfcElementAssemblyTypeEnum.GIRDER +reinforcement_unit = IfcElementAssemblyTypeEnum.REINFORCEMENT_UNIT +rigid_frame = IfcElementAssemblyTypeEnum.RIGID_FRAME +slab_field = IfcElementAssemblyTypeEnum.SLAB_FIELD +truss = IfcElementAssemblyTypeEnum.TRUSS +abutment = IfcElementAssemblyTypeEnum.ABUTMENT +pier = IfcElementAssemblyTypeEnum.PIER +pylon = IfcElementAssemblyTypeEnum.PYLON +cross_bracing = IfcElementAssemblyTypeEnum.CROSS_BRACING +deck = IfcElementAssemblyTypeEnum.DECK +mast = IfcElementAssemblyTypeEnum.MAST +signalassembly = IfcElementAssemblyTypeEnum.SIGNALASSEMBLY +grid = IfcElementAssemblyTypeEnum.GRID +shelter = IfcElementAssemblyTypeEnum.SHELTER +supportingassembly = IfcElementAssemblyTypeEnum.SUPPORTINGASSEMBLY +suspensionassembly = IfcElementAssemblyTypeEnum.SUSPENSIONASSEMBLY +traction_switching_assembly = IfcElementAssemblyTypeEnum.TRACTION_SWITCHING_ASSEMBLY +trackpanel = IfcElementAssemblyTypeEnum.TRACKPANEL +turnoutpanel = IfcElementAssemblyTypeEnum.TURNOUTPANEL +dilatationpanel = IfcElementAssemblyTypeEnum.DILATATIONPANEL +rail_mechanical_equipment_assembly = IfcElementAssemblyTypeEnum.RAIL_MECHANICAL_EQUIPMENT_ASSEMBLY +entranceworks = IfcElementAssemblyTypeEnum.ENTRANCEWORKS +sumpbuster = IfcElementAssemblyTypeEnum.SUMPBUSTER +traffic_calming_device = IfcElementAssemblyTypeEnum.TRAFFIC_CALMING_DEVICE +userdefined = IfcElementAssemblyTypeEnum.USERDEFINED +notdefined = IfcElementAssemblyTypeEnum.NOTDEFINED IfcElementCompositionEnum = enum_namespace() -complex = express_getattr(IfcElementCompositionEnum, 'COMPLEX', INDETERMINATE) -element = express_getattr(IfcElementCompositionEnum, 'ELEMENT', INDETERMINATE) -partial = express_getattr(IfcElementCompositionEnum, 'PARTIAL', INDETERMINATE) +complex = IfcElementCompositionEnum.COMPLEX +element = IfcElementCompositionEnum.ELEMENT +partial = IfcElementCompositionEnum.PARTIAL IfcEngineTypeEnum = enum_namespace() -externalcombustion = express_getattr(IfcEngineTypeEnum, 'EXTERNALCOMBUSTION', INDETERMINATE) -internalcombustion = express_getattr(IfcEngineTypeEnum, 'INTERNALCOMBUSTION', INDETERMINATE) -userdefined = express_getattr(IfcEngineTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcEngineTypeEnum, 'NOTDEFINED', INDETERMINATE) +externalcombustion = IfcEngineTypeEnum.EXTERNALCOMBUSTION +internalcombustion = IfcEngineTypeEnum.INTERNALCOMBUSTION +userdefined = IfcEngineTypeEnum.USERDEFINED +notdefined = IfcEngineTypeEnum.NOTDEFINED IfcEvaporativeCoolerTypeEnum = enum_namespace() -directevaporativerandommediaaircooler = express_getattr(IfcEvaporativeCoolerTypeEnum, 'DIRECTEVAPORATIVERANDOMMEDIAAIRCOOLER', INDETERMINATE) -directevaporativerigidmediaaircooler = express_getattr(IfcEvaporativeCoolerTypeEnum, 'DIRECTEVAPORATIVERIGIDMEDIAAIRCOOLER', INDETERMINATE) -directevaporativeslingerspackagedaircooler = express_getattr(IfcEvaporativeCoolerTypeEnum, 'DIRECTEVAPORATIVESLINGERSPACKAGEDAIRCOOLER', INDETERMINATE) -directevaporativepackagedrotaryaircooler = express_getattr(IfcEvaporativeCoolerTypeEnum, 'DIRECTEVAPORATIVEPACKAGEDROTARYAIRCOOLER', INDETERMINATE) -directevaporativeairwasher = express_getattr(IfcEvaporativeCoolerTypeEnum, 'DIRECTEVAPORATIVEAIRWASHER', INDETERMINATE) -indirectevaporativepackageaircooler = express_getattr(IfcEvaporativeCoolerTypeEnum, 'INDIRECTEVAPORATIVEPACKAGEAIRCOOLER', INDETERMINATE) -indirectevaporativewetcoil = express_getattr(IfcEvaporativeCoolerTypeEnum, 'INDIRECTEVAPORATIVEWETCOIL', INDETERMINATE) -indirectevaporativecoolingtowerorcoilcooler = express_getattr(IfcEvaporativeCoolerTypeEnum, 'INDIRECTEVAPORATIVECOOLINGTOWERORCOILCOOLER', INDETERMINATE) -indirectdirectcombination = express_getattr(IfcEvaporativeCoolerTypeEnum, 'INDIRECTDIRECTCOMBINATION', INDETERMINATE) -userdefined = express_getattr(IfcEvaporativeCoolerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcEvaporativeCoolerTypeEnum, 'NOTDEFINED', INDETERMINATE) +directevaporativerandommediaaircooler = IfcEvaporativeCoolerTypeEnum.DIRECTEVAPORATIVERANDOMMEDIAAIRCOOLER +directevaporativerigidmediaaircooler = IfcEvaporativeCoolerTypeEnum.DIRECTEVAPORATIVERIGIDMEDIAAIRCOOLER +directevaporativeslingerspackagedaircooler = IfcEvaporativeCoolerTypeEnum.DIRECTEVAPORATIVESLINGERSPACKAGEDAIRCOOLER +directevaporativepackagedrotaryaircooler = IfcEvaporativeCoolerTypeEnum.DIRECTEVAPORATIVEPACKAGEDROTARYAIRCOOLER +directevaporativeairwasher = IfcEvaporativeCoolerTypeEnum.DIRECTEVAPORATIVEAIRWASHER +indirectevaporativepackageaircooler = IfcEvaporativeCoolerTypeEnum.INDIRECTEVAPORATIVEPACKAGEAIRCOOLER +indirectevaporativewetcoil = IfcEvaporativeCoolerTypeEnum.INDIRECTEVAPORATIVEWETCOIL +indirectevaporativecoolingtowerorcoilcooler = IfcEvaporativeCoolerTypeEnum.INDIRECTEVAPORATIVECOOLINGTOWERORCOILCOOLER +indirectdirectcombination = IfcEvaporativeCoolerTypeEnum.INDIRECTDIRECTCOMBINATION +userdefined = IfcEvaporativeCoolerTypeEnum.USERDEFINED +notdefined = IfcEvaporativeCoolerTypeEnum.NOTDEFINED IfcEvaporatorTypeEnum = enum_namespace() -directexpansion = express_getattr(IfcEvaporatorTypeEnum, 'DIRECTEXPANSION', INDETERMINATE) -directexpansionshellandtube = express_getattr(IfcEvaporatorTypeEnum, 'DIRECTEXPANSIONSHELLANDTUBE', INDETERMINATE) -directexpansiontubeintube = express_getattr(IfcEvaporatorTypeEnum, 'DIRECTEXPANSIONTUBEINTUBE', INDETERMINATE) -directexpansionbrazedplate = express_getattr(IfcEvaporatorTypeEnum, 'DIRECTEXPANSIONBRAZEDPLATE', INDETERMINATE) -floodedshellandtube = express_getattr(IfcEvaporatorTypeEnum, 'FLOODEDSHELLANDTUBE', INDETERMINATE) -shellandcoil = express_getattr(IfcEvaporatorTypeEnum, 'SHELLANDCOIL', INDETERMINATE) -userdefined = express_getattr(IfcEvaporatorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcEvaporatorTypeEnum, 'NOTDEFINED', INDETERMINATE) +directexpansion = IfcEvaporatorTypeEnum.DIRECTEXPANSION +directexpansionshellandtube = IfcEvaporatorTypeEnum.DIRECTEXPANSIONSHELLANDTUBE +directexpansiontubeintube = IfcEvaporatorTypeEnum.DIRECTEXPANSIONTUBEINTUBE +directexpansionbrazedplate = IfcEvaporatorTypeEnum.DIRECTEXPANSIONBRAZEDPLATE +floodedshellandtube = IfcEvaporatorTypeEnum.FLOODEDSHELLANDTUBE +shellandcoil = IfcEvaporatorTypeEnum.SHELLANDCOIL +userdefined = IfcEvaporatorTypeEnum.USERDEFINED +notdefined = IfcEvaporatorTypeEnum.NOTDEFINED IfcEventTriggerTypeEnum = enum_namespace() -eventrule = express_getattr(IfcEventTriggerTypeEnum, 'EVENTRULE', INDETERMINATE) -eventmessage = express_getattr(IfcEventTriggerTypeEnum, 'EVENTMESSAGE', INDETERMINATE) -eventtime = express_getattr(IfcEventTriggerTypeEnum, 'EVENTTIME', INDETERMINATE) -eventcomplex = express_getattr(IfcEventTriggerTypeEnum, 'EVENTCOMPLEX', INDETERMINATE) -userdefined = express_getattr(IfcEventTriggerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcEventTriggerTypeEnum, 'NOTDEFINED', INDETERMINATE) +eventrule = IfcEventTriggerTypeEnum.EVENTRULE +eventmessage = IfcEventTriggerTypeEnum.EVENTMESSAGE +eventtime = IfcEventTriggerTypeEnum.EVENTTIME +eventcomplex = IfcEventTriggerTypeEnum.EVENTCOMPLEX +userdefined = IfcEventTriggerTypeEnum.USERDEFINED +notdefined = IfcEventTriggerTypeEnum.NOTDEFINED IfcEventTypeEnum = enum_namespace() -startevent = express_getattr(IfcEventTypeEnum, 'STARTEVENT', INDETERMINATE) -endevent = express_getattr(IfcEventTypeEnum, 'ENDEVENT', INDETERMINATE) -intermediateevent = express_getattr(IfcEventTypeEnum, 'INTERMEDIATEEVENT', INDETERMINATE) -userdefined = express_getattr(IfcEventTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcEventTypeEnum, 'NOTDEFINED', INDETERMINATE) +startevent = IfcEventTypeEnum.STARTEVENT +endevent = IfcEventTypeEnum.ENDEVENT +intermediateevent = IfcEventTypeEnum.INTERMEDIATEEVENT +userdefined = IfcEventTypeEnum.USERDEFINED +notdefined = IfcEventTypeEnum.NOTDEFINED IfcExternalSpatialElementTypeEnum = enum_namespace() -external = express_getattr(IfcExternalSpatialElementTypeEnum, 'EXTERNAL', INDETERMINATE) -external_earth = express_getattr(IfcExternalSpatialElementTypeEnum, 'EXTERNAL_EARTH', INDETERMINATE) -external_water = express_getattr(IfcExternalSpatialElementTypeEnum, 'EXTERNAL_WATER', INDETERMINATE) -external_fire = express_getattr(IfcExternalSpatialElementTypeEnum, 'EXTERNAL_FIRE', INDETERMINATE) -userdefined = express_getattr(IfcExternalSpatialElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcExternalSpatialElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +external = IfcExternalSpatialElementTypeEnum.EXTERNAL +external_earth = IfcExternalSpatialElementTypeEnum.EXTERNAL_EARTH +external_water = IfcExternalSpatialElementTypeEnum.EXTERNAL_WATER +external_fire = IfcExternalSpatialElementTypeEnum.EXTERNAL_FIRE +userdefined = IfcExternalSpatialElementTypeEnum.USERDEFINED +notdefined = IfcExternalSpatialElementTypeEnum.NOTDEFINED IfcFacilityPartCommonTypeEnum = enum_namespace() -segment = express_getattr(IfcFacilityPartCommonTypeEnum, 'SEGMENT', INDETERMINATE) -aboveground = express_getattr(IfcFacilityPartCommonTypeEnum, 'ABOVEGROUND', INDETERMINATE) -junction = express_getattr(IfcFacilityPartCommonTypeEnum, 'JUNCTION', INDETERMINATE) -levelcrossing = express_getattr(IfcFacilityPartCommonTypeEnum, 'LEVELCROSSING', INDETERMINATE) -belowground = express_getattr(IfcFacilityPartCommonTypeEnum, 'BELOWGROUND', INDETERMINATE) -substructure = express_getattr(IfcFacilityPartCommonTypeEnum, 'SUBSTRUCTURE', INDETERMINATE) -terminal = express_getattr(IfcFacilityPartCommonTypeEnum, 'TERMINAL', INDETERMINATE) -superstructure = express_getattr(IfcFacilityPartCommonTypeEnum, 'SUPERSTRUCTURE', INDETERMINATE) -userdefined = express_getattr(IfcFacilityPartCommonTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFacilityPartCommonTypeEnum, 'NOTDEFINED', INDETERMINATE) +segment = IfcFacilityPartCommonTypeEnum.SEGMENT +aboveground = IfcFacilityPartCommonTypeEnum.ABOVEGROUND +junction = IfcFacilityPartCommonTypeEnum.JUNCTION +levelcrossing = IfcFacilityPartCommonTypeEnum.LEVELCROSSING +belowground = IfcFacilityPartCommonTypeEnum.BELOWGROUND +substructure = IfcFacilityPartCommonTypeEnum.SUBSTRUCTURE +terminal = IfcFacilityPartCommonTypeEnum.TERMINAL +superstructure = IfcFacilityPartCommonTypeEnum.SUPERSTRUCTURE +userdefined = IfcFacilityPartCommonTypeEnum.USERDEFINED +notdefined = IfcFacilityPartCommonTypeEnum.NOTDEFINED IfcFacilityUsageEnum = enum_namespace() -lateral = express_getattr(IfcFacilityUsageEnum, 'LATERAL', INDETERMINATE) -region = express_getattr(IfcFacilityUsageEnum, 'REGION', INDETERMINATE) -vertical = express_getattr(IfcFacilityUsageEnum, 'VERTICAL', INDETERMINATE) -longitudinal = express_getattr(IfcFacilityUsageEnum, 'LONGITUDINAL', INDETERMINATE) -userdefined = express_getattr(IfcFacilityUsageEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFacilityUsageEnum, 'NOTDEFINED', INDETERMINATE) +lateral = IfcFacilityUsageEnum.LATERAL +region = IfcFacilityUsageEnum.REGION +vertical = IfcFacilityUsageEnum.VERTICAL +longitudinal = IfcFacilityUsageEnum.LONGITUDINAL +userdefined = IfcFacilityUsageEnum.USERDEFINED +notdefined = IfcFacilityUsageEnum.NOTDEFINED IfcFanTypeEnum = enum_namespace() -centrifugalforwardcurved = express_getattr(IfcFanTypeEnum, 'CENTRIFUGALFORWARDCURVED', INDETERMINATE) -centrifugalradial = express_getattr(IfcFanTypeEnum, 'CENTRIFUGALRADIAL', INDETERMINATE) -centrifugalbackwardinclinedcurved = express_getattr(IfcFanTypeEnum, 'CENTRIFUGALBACKWARDINCLINEDCURVED', INDETERMINATE) -centrifugalairfoil = express_getattr(IfcFanTypeEnum, 'CENTRIFUGALAIRFOIL', INDETERMINATE) -tubeaxial = express_getattr(IfcFanTypeEnum, 'TUBEAXIAL', INDETERMINATE) -vaneaxial = express_getattr(IfcFanTypeEnum, 'VANEAXIAL', INDETERMINATE) -propelloraxial = express_getattr(IfcFanTypeEnum, 'PROPELLORAXIAL', INDETERMINATE) -userdefined = express_getattr(IfcFanTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFanTypeEnum, 'NOTDEFINED', INDETERMINATE) +centrifugalforwardcurved = IfcFanTypeEnum.CENTRIFUGALFORWARDCURVED +centrifugalradial = IfcFanTypeEnum.CENTRIFUGALRADIAL +centrifugalbackwardinclinedcurved = IfcFanTypeEnum.CENTRIFUGALBACKWARDINCLINEDCURVED +centrifugalairfoil = IfcFanTypeEnum.CENTRIFUGALAIRFOIL +tubeaxial = IfcFanTypeEnum.TUBEAXIAL +vaneaxial = IfcFanTypeEnum.VANEAXIAL +propelloraxial = IfcFanTypeEnum.PROPELLORAXIAL +userdefined = IfcFanTypeEnum.USERDEFINED +notdefined = IfcFanTypeEnum.NOTDEFINED IfcFastenerTypeEnum = enum_namespace() -glue = express_getattr(IfcFastenerTypeEnum, 'GLUE', INDETERMINATE) -mortar = express_getattr(IfcFastenerTypeEnum, 'MORTAR', INDETERMINATE) -weld = express_getattr(IfcFastenerTypeEnum, 'WELD', INDETERMINATE) -userdefined = express_getattr(IfcFastenerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFastenerTypeEnum, 'NOTDEFINED', INDETERMINATE) +glue = IfcFastenerTypeEnum.GLUE +mortar = IfcFastenerTypeEnum.MORTAR +weld = IfcFastenerTypeEnum.WELD +userdefined = IfcFastenerTypeEnum.USERDEFINED +notdefined = IfcFastenerTypeEnum.NOTDEFINED IfcFilterTypeEnum = enum_namespace() -airparticlefilter = express_getattr(IfcFilterTypeEnum, 'AIRPARTICLEFILTER', INDETERMINATE) -compressedairfilter = express_getattr(IfcFilterTypeEnum, 'COMPRESSEDAIRFILTER', INDETERMINATE) -odorfilter = express_getattr(IfcFilterTypeEnum, 'ODORFILTER', INDETERMINATE) -oilfilter = express_getattr(IfcFilterTypeEnum, 'OILFILTER', INDETERMINATE) -strainer = express_getattr(IfcFilterTypeEnum, 'STRAINER', INDETERMINATE) -waterfilter = express_getattr(IfcFilterTypeEnum, 'WATERFILTER', INDETERMINATE) -userdefined = express_getattr(IfcFilterTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFilterTypeEnum, 'NOTDEFINED', INDETERMINATE) +airparticlefilter = IfcFilterTypeEnum.AIRPARTICLEFILTER +compressedairfilter = IfcFilterTypeEnum.COMPRESSEDAIRFILTER +odorfilter = IfcFilterTypeEnum.ODORFILTER +oilfilter = IfcFilterTypeEnum.OILFILTER +strainer = IfcFilterTypeEnum.STRAINER +waterfilter = IfcFilterTypeEnum.WATERFILTER +userdefined = IfcFilterTypeEnum.USERDEFINED +notdefined = IfcFilterTypeEnum.NOTDEFINED IfcFireSuppressionTerminalTypeEnum = enum_namespace() -breechinginlet = express_getattr(IfcFireSuppressionTerminalTypeEnum, 'BREECHINGINLET', INDETERMINATE) -firehydrant = express_getattr(IfcFireSuppressionTerminalTypeEnum, 'FIREHYDRANT', INDETERMINATE) -hosereel = express_getattr(IfcFireSuppressionTerminalTypeEnum, 'HOSEREEL', INDETERMINATE) -sprinkler = express_getattr(IfcFireSuppressionTerminalTypeEnum, 'SPRINKLER', INDETERMINATE) -sprinklerdeflector = express_getattr(IfcFireSuppressionTerminalTypeEnum, 'SPRINKLERDEFLECTOR', INDETERMINATE) -firemonitor = express_getattr(IfcFireSuppressionTerminalTypeEnum, 'FIREMONITOR', INDETERMINATE) -userdefined = express_getattr(IfcFireSuppressionTerminalTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFireSuppressionTerminalTypeEnum, 'NOTDEFINED', INDETERMINATE) +breechinginlet = IfcFireSuppressionTerminalTypeEnum.BREECHINGINLET +firehydrant = IfcFireSuppressionTerminalTypeEnum.FIREHYDRANT +hosereel = IfcFireSuppressionTerminalTypeEnum.HOSEREEL +sprinkler = IfcFireSuppressionTerminalTypeEnum.SPRINKLER +sprinklerdeflector = IfcFireSuppressionTerminalTypeEnum.SPRINKLERDEFLECTOR +firemonitor = IfcFireSuppressionTerminalTypeEnum.FIREMONITOR +userdefined = IfcFireSuppressionTerminalTypeEnum.USERDEFINED +notdefined = IfcFireSuppressionTerminalTypeEnum.NOTDEFINED IfcFlowDirectionEnum = enum_namespace() -source = express_getattr(IfcFlowDirectionEnum, 'SOURCE', INDETERMINATE) -sink = express_getattr(IfcFlowDirectionEnum, 'SINK', INDETERMINATE) -sourceandsink = express_getattr(IfcFlowDirectionEnum, 'SOURCEANDSINK', INDETERMINATE) -notdefined = express_getattr(IfcFlowDirectionEnum, 'NOTDEFINED', INDETERMINATE) +source = IfcFlowDirectionEnum.SOURCE +sink = IfcFlowDirectionEnum.SINK +sourceandsink = IfcFlowDirectionEnum.SOURCEANDSINK +notdefined = IfcFlowDirectionEnum.NOTDEFINED IfcFlowInstrumentTypeEnum = enum_namespace() -pressuregauge = express_getattr(IfcFlowInstrumentTypeEnum, 'PRESSUREGAUGE', INDETERMINATE) -thermometer = express_getattr(IfcFlowInstrumentTypeEnum, 'THERMOMETER', INDETERMINATE) -ammeter = express_getattr(IfcFlowInstrumentTypeEnum, 'AMMETER', INDETERMINATE) -frequencymeter = express_getattr(IfcFlowInstrumentTypeEnum, 'FREQUENCYMETER', INDETERMINATE) -powerfactormeter = express_getattr(IfcFlowInstrumentTypeEnum, 'POWERFACTORMETER', INDETERMINATE) -phaseanglemeter = express_getattr(IfcFlowInstrumentTypeEnum, 'PHASEANGLEMETER', INDETERMINATE) -voltmeter_peak = express_getattr(IfcFlowInstrumentTypeEnum, 'VOLTMETER_PEAK', INDETERMINATE) -voltmeter_rms = express_getattr(IfcFlowInstrumentTypeEnum, 'VOLTMETER_RMS', INDETERMINATE) -combined = express_getattr(IfcFlowInstrumentTypeEnum, 'COMBINED', INDETERMINATE) -voltmeter = express_getattr(IfcFlowInstrumentTypeEnum, 'VOLTMETER', INDETERMINATE) -userdefined = express_getattr(IfcFlowInstrumentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFlowInstrumentTypeEnum, 'NOTDEFINED', INDETERMINATE) +pressuregauge = IfcFlowInstrumentTypeEnum.PRESSUREGAUGE +thermometer = IfcFlowInstrumentTypeEnum.THERMOMETER +ammeter = IfcFlowInstrumentTypeEnum.AMMETER +frequencymeter = IfcFlowInstrumentTypeEnum.FREQUENCYMETER +powerfactormeter = IfcFlowInstrumentTypeEnum.POWERFACTORMETER +phaseanglemeter = IfcFlowInstrumentTypeEnum.PHASEANGLEMETER +voltmeter_peak = IfcFlowInstrumentTypeEnum.VOLTMETER_PEAK +voltmeter_rms = IfcFlowInstrumentTypeEnum.VOLTMETER_RMS +combined = IfcFlowInstrumentTypeEnum.COMBINED +voltmeter = IfcFlowInstrumentTypeEnum.VOLTMETER +userdefined = IfcFlowInstrumentTypeEnum.USERDEFINED +notdefined = IfcFlowInstrumentTypeEnum.NOTDEFINED IfcFlowMeterTypeEnum = enum_namespace() -energymeter = express_getattr(IfcFlowMeterTypeEnum, 'ENERGYMETER', INDETERMINATE) -gasmeter = express_getattr(IfcFlowMeterTypeEnum, 'GASMETER', INDETERMINATE) -oilmeter = express_getattr(IfcFlowMeterTypeEnum, 'OILMETER', INDETERMINATE) -watermeter = express_getattr(IfcFlowMeterTypeEnum, 'WATERMETER', INDETERMINATE) -userdefined = express_getattr(IfcFlowMeterTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFlowMeterTypeEnum, 'NOTDEFINED', INDETERMINATE) +energymeter = IfcFlowMeterTypeEnum.ENERGYMETER +gasmeter = IfcFlowMeterTypeEnum.GASMETER +oilmeter = IfcFlowMeterTypeEnum.OILMETER +watermeter = IfcFlowMeterTypeEnum.WATERMETER +userdefined = IfcFlowMeterTypeEnum.USERDEFINED +notdefined = IfcFlowMeterTypeEnum.NOTDEFINED IfcFootingTypeEnum = enum_namespace() -caisson_foundation = express_getattr(IfcFootingTypeEnum, 'CAISSON_FOUNDATION', INDETERMINATE) -footing_beam = express_getattr(IfcFootingTypeEnum, 'FOOTING_BEAM', INDETERMINATE) -pad_footing = express_getattr(IfcFootingTypeEnum, 'PAD_FOOTING', INDETERMINATE) -pile_cap = express_getattr(IfcFootingTypeEnum, 'PILE_CAP', INDETERMINATE) -strip_footing = express_getattr(IfcFootingTypeEnum, 'STRIP_FOOTING', INDETERMINATE) -userdefined = express_getattr(IfcFootingTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFootingTypeEnum, 'NOTDEFINED', INDETERMINATE) +caisson_foundation = IfcFootingTypeEnum.CAISSON_FOUNDATION +footing_beam = IfcFootingTypeEnum.FOOTING_BEAM +pad_footing = IfcFootingTypeEnum.PAD_FOOTING +pile_cap = IfcFootingTypeEnum.PILE_CAP +strip_footing = IfcFootingTypeEnum.STRIP_FOOTING +userdefined = IfcFootingTypeEnum.USERDEFINED +notdefined = IfcFootingTypeEnum.NOTDEFINED IfcFurnitureTypeEnum = enum_namespace() -chair = express_getattr(IfcFurnitureTypeEnum, 'CHAIR', INDETERMINATE) -table = express_getattr(IfcFurnitureTypeEnum, 'TABLE', INDETERMINATE) -desk = express_getattr(IfcFurnitureTypeEnum, 'DESK', INDETERMINATE) -bed = express_getattr(IfcFurnitureTypeEnum, 'BED', INDETERMINATE) -filecabinet = express_getattr(IfcFurnitureTypeEnum, 'FILECABINET', INDETERMINATE) -shelf = express_getattr(IfcFurnitureTypeEnum, 'SHELF', INDETERMINATE) -sofa = express_getattr(IfcFurnitureTypeEnum, 'SOFA', INDETERMINATE) -technicalcabinet = express_getattr(IfcFurnitureTypeEnum, 'TECHNICALCABINET', INDETERMINATE) -userdefined = express_getattr(IfcFurnitureTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFurnitureTypeEnum, 'NOTDEFINED', INDETERMINATE) +chair = IfcFurnitureTypeEnum.CHAIR +table = IfcFurnitureTypeEnum.TABLE +desk = IfcFurnitureTypeEnum.DESK +bed = IfcFurnitureTypeEnum.BED +filecabinet = IfcFurnitureTypeEnum.FILECABINET +shelf = IfcFurnitureTypeEnum.SHELF +sofa = IfcFurnitureTypeEnum.SOFA +technicalcabinet = IfcFurnitureTypeEnum.TECHNICALCABINET +userdefined = IfcFurnitureTypeEnum.USERDEFINED +notdefined = IfcFurnitureTypeEnum.NOTDEFINED IfcGeographicElementTypeEnum = enum_namespace() -terrain = express_getattr(IfcGeographicElementTypeEnum, 'TERRAIN', INDETERMINATE) -soil_boring_point = express_getattr(IfcGeographicElementTypeEnum, 'SOIL_BORING_POINT', INDETERMINATE) -userdefined = express_getattr(IfcGeographicElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcGeographicElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +terrain = IfcGeographicElementTypeEnum.TERRAIN +soil_boring_point = IfcGeographicElementTypeEnum.SOIL_BORING_POINT +userdefined = IfcGeographicElementTypeEnum.USERDEFINED +notdefined = IfcGeographicElementTypeEnum.NOTDEFINED IfcGeometricProjectionEnum = enum_namespace() -graph_view = express_getattr(IfcGeometricProjectionEnum, 'GRAPH_VIEW', INDETERMINATE) -sketch_view = express_getattr(IfcGeometricProjectionEnum, 'SKETCH_VIEW', INDETERMINATE) -model_view = express_getattr(IfcGeometricProjectionEnum, 'MODEL_VIEW', INDETERMINATE) -plan_view = express_getattr(IfcGeometricProjectionEnum, 'PLAN_VIEW', INDETERMINATE) -reflected_plan_view = express_getattr(IfcGeometricProjectionEnum, 'REFLECTED_PLAN_VIEW', INDETERMINATE) -section_view = express_getattr(IfcGeometricProjectionEnum, 'SECTION_VIEW', INDETERMINATE) -elevation_view = express_getattr(IfcGeometricProjectionEnum, 'ELEVATION_VIEW', INDETERMINATE) -userdefined = express_getattr(IfcGeometricProjectionEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcGeometricProjectionEnum, 'NOTDEFINED', INDETERMINATE) +graph_view = IfcGeometricProjectionEnum.GRAPH_VIEW +sketch_view = IfcGeometricProjectionEnum.SKETCH_VIEW +model_view = IfcGeometricProjectionEnum.MODEL_VIEW +plan_view = IfcGeometricProjectionEnum.PLAN_VIEW +reflected_plan_view = IfcGeometricProjectionEnum.REFLECTED_PLAN_VIEW +section_view = IfcGeometricProjectionEnum.SECTION_VIEW +elevation_view = IfcGeometricProjectionEnum.ELEVATION_VIEW +userdefined = IfcGeometricProjectionEnum.USERDEFINED +notdefined = IfcGeometricProjectionEnum.NOTDEFINED IfcGlobalOrLocalEnum = enum_namespace() -global_coords = express_getattr(IfcGlobalOrLocalEnum, 'GLOBAL_COORDS', INDETERMINATE) -local_coords = express_getattr(IfcGlobalOrLocalEnum, 'LOCAL_COORDS', INDETERMINATE) +global_coords = IfcGlobalOrLocalEnum.GLOBAL_COORDS +local_coords = IfcGlobalOrLocalEnum.LOCAL_COORDS IfcGridTypeEnum = enum_namespace() -rectangular = express_getattr(IfcGridTypeEnum, 'RECTANGULAR', INDETERMINATE) -radial = express_getattr(IfcGridTypeEnum, 'RADIAL', INDETERMINATE) -triangular = express_getattr(IfcGridTypeEnum, 'TRIANGULAR', INDETERMINATE) -irregular = express_getattr(IfcGridTypeEnum, 'IRREGULAR', INDETERMINATE) -userdefined = express_getattr(IfcGridTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcGridTypeEnum, 'NOTDEFINED', INDETERMINATE) +rectangular = IfcGridTypeEnum.RECTANGULAR +radial = IfcGridTypeEnum.RADIAL +triangular = IfcGridTypeEnum.TRIANGULAR +irregular = IfcGridTypeEnum.IRREGULAR +userdefined = IfcGridTypeEnum.USERDEFINED +notdefined = IfcGridTypeEnum.NOTDEFINED IfcHeatExchangerTypeEnum = enum_namespace() -plate = express_getattr(IfcHeatExchangerTypeEnum, 'PLATE', INDETERMINATE) -shellandtube = express_getattr(IfcHeatExchangerTypeEnum, 'SHELLANDTUBE', INDETERMINATE) -turnoutheating = express_getattr(IfcHeatExchangerTypeEnum, 'TURNOUTHEATING', INDETERMINATE) -userdefined = express_getattr(IfcHeatExchangerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcHeatExchangerTypeEnum, 'NOTDEFINED', INDETERMINATE) +plate = IfcHeatExchangerTypeEnum.PLATE +shellandtube = IfcHeatExchangerTypeEnum.SHELLANDTUBE +turnoutheating = IfcHeatExchangerTypeEnum.TURNOUTHEATING +userdefined = IfcHeatExchangerTypeEnum.USERDEFINED +notdefined = IfcHeatExchangerTypeEnum.NOTDEFINED IfcHumidifierTypeEnum = enum_namespace() -steaminjection = express_getattr(IfcHumidifierTypeEnum, 'STEAMINJECTION', INDETERMINATE) -adiabaticairwasher = express_getattr(IfcHumidifierTypeEnum, 'ADIABATICAIRWASHER', INDETERMINATE) -adiabaticpan = express_getattr(IfcHumidifierTypeEnum, 'ADIABATICPAN', INDETERMINATE) -adiabaticwettedelement = express_getattr(IfcHumidifierTypeEnum, 'ADIABATICWETTEDELEMENT', INDETERMINATE) -adiabaticatomizing = express_getattr(IfcHumidifierTypeEnum, 'ADIABATICATOMIZING', INDETERMINATE) -adiabaticultrasonic = express_getattr(IfcHumidifierTypeEnum, 'ADIABATICULTRASONIC', INDETERMINATE) -adiabaticrigidmedia = express_getattr(IfcHumidifierTypeEnum, 'ADIABATICRIGIDMEDIA', INDETERMINATE) -adiabaticcompressedairnozzle = express_getattr(IfcHumidifierTypeEnum, 'ADIABATICCOMPRESSEDAIRNOZZLE', INDETERMINATE) -assistedelectric = express_getattr(IfcHumidifierTypeEnum, 'ASSISTEDELECTRIC', INDETERMINATE) -assistednaturalgas = express_getattr(IfcHumidifierTypeEnum, 'ASSISTEDNATURALGAS', INDETERMINATE) -assistedpropane = express_getattr(IfcHumidifierTypeEnum, 'ASSISTEDPROPANE', INDETERMINATE) -assistedbutane = express_getattr(IfcHumidifierTypeEnum, 'ASSISTEDBUTANE', INDETERMINATE) -assistedsteam = express_getattr(IfcHumidifierTypeEnum, 'ASSISTEDSTEAM', INDETERMINATE) -userdefined = express_getattr(IfcHumidifierTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcHumidifierTypeEnum, 'NOTDEFINED', INDETERMINATE) +steaminjection = IfcHumidifierTypeEnum.STEAMINJECTION +adiabaticairwasher = IfcHumidifierTypeEnum.ADIABATICAIRWASHER +adiabaticpan = IfcHumidifierTypeEnum.ADIABATICPAN +adiabaticwettedelement = IfcHumidifierTypeEnum.ADIABATICWETTEDELEMENT +adiabaticatomizing = IfcHumidifierTypeEnum.ADIABATICATOMIZING +adiabaticultrasonic = IfcHumidifierTypeEnum.ADIABATICULTRASONIC +adiabaticrigidmedia = IfcHumidifierTypeEnum.ADIABATICRIGIDMEDIA +adiabaticcompressedairnozzle = IfcHumidifierTypeEnum.ADIABATICCOMPRESSEDAIRNOZZLE +assistedelectric = IfcHumidifierTypeEnum.ASSISTEDELECTRIC +assistednaturalgas = IfcHumidifierTypeEnum.ASSISTEDNATURALGAS +assistedpropane = IfcHumidifierTypeEnum.ASSISTEDPROPANE +assistedbutane = IfcHumidifierTypeEnum.ASSISTEDBUTANE +assistedsteam = IfcHumidifierTypeEnum.ASSISTEDSTEAM +userdefined = IfcHumidifierTypeEnum.USERDEFINED +notdefined = IfcHumidifierTypeEnum.NOTDEFINED IfcImpactProtectionDeviceTypeEnum = enum_namespace() -crashcushion = express_getattr(IfcImpactProtectionDeviceTypeEnum, 'CRASHCUSHION', INDETERMINATE) -dampingsystem = express_getattr(IfcImpactProtectionDeviceTypeEnum, 'DAMPINGSYSTEM', INDETERMINATE) -fender = express_getattr(IfcImpactProtectionDeviceTypeEnum, 'FENDER', INDETERMINATE) -bumper = express_getattr(IfcImpactProtectionDeviceTypeEnum, 'BUMPER', INDETERMINATE) -userdefined = express_getattr(IfcImpactProtectionDeviceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcImpactProtectionDeviceTypeEnum, 'NOTDEFINED', INDETERMINATE) +crashcushion = IfcImpactProtectionDeviceTypeEnum.CRASHCUSHION +dampingsystem = IfcImpactProtectionDeviceTypeEnum.DAMPINGSYSTEM +fender = IfcImpactProtectionDeviceTypeEnum.FENDER +bumper = IfcImpactProtectionDeviceTypeEnum.BUMPER +userdefined = IfcImpactProtectionDeviceTypeEnum.USERDEFINED +notdefined = IfcImpactProtectionDeviceTypeEnum.NOTDEFINED IfcInterceptorTypeEnum = enum_namespace() -cyclonic = express_getattr(IfcInterceptorTypeEnum, 'CYCLONIC', INDETERMINATE) -grease = express_getattr(IfcInterceptorTypeEnum, 'GREASE', INDETERMINATE) -oil = express_getattr(IfcInterceptorTypeEnum, 'OIL', INDETERMINATE) -petrol = express_getattr(IfcInterceptorTypeEnum, 'PETROL', INDETERMINATE) -userdefined = express_getattr(IfcInterceptorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcInterceptorTypeEnum, 'NOTDEFINED', INDETERMINATE) +cyclonic = IfcInterceptorTypeEnum.CYCLONIC +grease = IfcInterceptorTypeEnum.GREASE +oil = IfcInterceptorTypeEnum.OIL +petrol = IfcInterceptorTypeEnum.PETROL +userdefined = IfcInterceptorTypeEnum.USERDEFINED +notdefined = IfcInterceptorTypeEnum.NOTDEFINED IfcInternalOrExternalEnum = enum_namespace() -internal = express_getattr(IfcInternalOrExternalEnum, 'INTERNAL', INDETERMINATE) -external = express_getattr(IfcInternalOrExternalEnum, 'EXTERNAL', INDETERMINATE) -external_earth = express_getattr(IfcInternalOrExternalEnum, 'EXTERNAL_EARTH', INDETERMINATE) -external_water = express_getattr(IfcInternalOrExternalEnum, 'EXTERNAL_WATER', INDETERMINATE) -external_fire = express_getattr(IfcInternalOrExternalEnum, 'EXTERNAL_FIRE', INDETERMINATE) -notdefined = express_getattr(IfcInternalOrExternalEnum, 'NOTDEFINED', INDETERMINATE) +internal = IfcInternalOrExternalEnum.INTERNAL +external = IfcInternalOrExternalEnum.EXTERNAL +external_earth = IfcInternalOrExternalEnum.EXTERNAL_EARTH +external_water = IfcInternalOrExternalEnum.EXTERNAL_WATER +external_fire = IfcInternalOrExternalEnum.EXTERNAL_FIRE +notdefined = IfcInternalOrExternalEnum.NOTDEFINED IfcInventoryTypeEnum = enum_namespace() -assetinventory = express_getattr(IfcInventoryTypeEnum, 'ASSETINVENTORY', INDETERMINATE) -spaceinventory = express_getattr(IfcInventoryTypeEnum, 'SPACEINVENTORY', INDETERMINATE) -furnitureinventory = express_getattr(IfcInventoryTypeEnum, 'FURNITUREINVENTORY', INDETERMINATE) -userdefined = express_getattr(IfcInventoryTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcInventoryTypeEnum, 'NOTDEFINED', INDETERMINATE) +assetinventory = IfcInventoryTypeEnum.ASSETINVENTORY +spaceinventory = IfcInventoryTypeEnum.SPACEINVENTORY +furnitureinventory = IfcInventoryTypeEnum.FURNITUREINVENTORY +userdefined = IfcInventoryTypeEnum.USERDEFINED +notdefined = IfcInventoryTypeEnum.NOTDEFINED IfcJunctionBoxTypeEnum = enum_namespace() -data = express_getattr(IfcJunctionBoxTypeEnum, 'DATA', INDETERMINATE) -power = express_getattr(IfcJunctionBoxTypeEnum, 'POWER', INDETERMINATE) -userdefined = express_getattr(IfcJunctionBoxTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcJunctionBoxTypeEnum, 'NOTDEFINED', INDETERMINATE) +data = IfcJunctionBoxTypeEnum.DATA +power = IfcJunctionBoxTypeEnum.POWER +userdefined = IfcJunctionBoxTypeEnum.USERDEFINED +notdefined = IfcJunctionBoxTypeEnum.NOTDEFINED IfcKnotType = enum_namespace() -uniform_knots = express_getattr(IfcKnotType, 'UNIFORM_KNOTS', INDETERMINATE) -quasi_uniform_knots = express_getattr(IfcKnotType, 'QUASI_UNIFORM_KNOTS', INDETERMINATE) -piecewise_bezier_knots = express_getattr(IfcKnotType, 'PIECEWISE_BEZIER_KNOTS', INDETERMINATE) -unspecified = express_getattr(IfcKnotType, 'UNSPECIFIED', INDETERMINATE) +uniform_knots = IfcKnotType.UNIFORM_KNOTS +quasi_uniform_knots = IfcKnotType.QUASI_UNIFORM_KNOTS +piecewise_bezier_knots = IfcKnotType.PIECEWISE_BEZIER_KNOTS +unspecified = IfcKnotType.UNSPECIFIED IfcLaborResourceTypeEnum = enum_namespace() -administration = express_getattr(IfcLaborResourceTypeEnum, 'ADMINISTRATION', INDETERMINATE) -carpentry = express_getattr(IfcLaborResourceTypeEnum, 'CARPENTRY', INDETERMINATE) -cleaning = express_getattr(IfcLaborResourceTypeEnum, 'CLEANING', INDETERMINATE) -concrete = express_getattr(IfcLaborResourceTypeEnum, 'CONCRETE', INDETERMINATE) -drywall = express_getattr(IfcLaborResourceTypeEnum, 'DRYWALL', INDETERMINATE) -electric = express_getattr(IfcLaborResourceTypeEnum, 'ELECTRIC', INDETERMINATE) -finishing = express_getattr(IfcLaborResourceTypeEnum, 'FINISHING', INDETERMINATE) -flooring = express_getattr(IfcLaborResourceTypeEnum, 'FLOORING', INDETERMINATE) -general = express_getattr(IfcLaborResourceTypeEnum, 'GENERAL', INDETERMINATE) -hvac = express_getattr(IfcLaborResourceTypeEnum, 'HVAC', INDETERMINATE) -landscaping = express_getattr(IfcLaborResourceTypeEnum, 'LANDSCAPING', INDETERMINATE) -masonry = express_getattr(IfcLaborResourceTypeEnum, 'MASONRY', INDETERMINATE) -painting = express_getattr(IfcLaborResourceTypeEnum, 'PAINTING', INDETERMINATE) -paving = express_getattr(IfcLaborResourceTypeEnum, 'PAVING', INDETERMINATE) -plumbing = express_getattr(IfcLaborResourceTypeEnum, 'PLUMBING', INDETERMINATE) -roofing = express_getattr(IfcLaborResourceTypeEnum, 'ROOFING', INDETERMINATE) -sitegrading = express_getattr(IfcLaborResourceTypeEnum, 'SITEGRADING', INDETERMINATE) -steelwork = express_getattr(IfcLaborResourceTypeEnum, 'STEELWORK', INDETERMINATE) -surveying = express_getattr(IfcLaborResourceTypeEnum, 'SURVEYING', INDETERMINATE) -userdefined = express_getattr(IfcLaborResourceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcLaborResourceTypeEnum, 'NOTDEFINED', INDETERMINATE) +administration = IfcLaborResourceTypeEnum.ADMINISTRATION +carpentry = IfcLaborResourceTypeEnum.CARPENTRY +cleaning = IfcLaborResourceTypeEnum.CLEANING +concrete = IfcLaborResourceTypeEnum.CONCRETE +drywall = IfcLaborResourceTypeEnum.DRYWALL +electric = IfcLaborResourceTypeEnum.ELECTRIC +finishing = IfcLaborResourceTypeEnum.FINISHING +flooring = IfcLaborResourceTypeEnum.FLOORING +general = IfcLaborResourceTypeEnum.GENERAL +hvac = IfcLaborResourceTypeEnum.HVAC +landscaping = IfcLaborResourceTypeEnum.LANDSCAPING +masonry = IfcLaborResourceTypeEnum.MASONRY +painting = IfcLaborResourceTypeEnum.PAINTING +paving = IfcLaborResourceTypeEnum.PAVING +plumbing = IfcLaborResourceTypeEnum.PLUMBING +roofing = IfcLaborResourceTypeEnum.ROOFING +sitegrading = IfcLaborResourceTypeEnum.SITEGRADING +steelwork = IfcLaborResourceTypeEnum.STEELWORK +surveying = IfcLaborResourceTypeEnum.SURVEYING +userdefined = IfcLaborResourceTypeEnum.USERDEFINED +notdefined = IfcLaborResourceTypeEnum.NOTDEFINED IfcLampTypeEnum = enum_namespace() -compactfluorescent = express_getattr(IfcLampTypeEnum, 'COMPACTFLUORESCENT', INDETERMINATE) -fluorescent = express_getattr(IfcLampTypeEnum, 'FLUORESCENT', INDETERMINATE) -halogen = express_getattr(IfcLampTypeEnum, 'HALOGEN', INDETERMINATE) -highpressuremercury = express_getattr(IfcLampTypeEnum, 'HIGHPRESSUREMERCURY', INDETERMINATE) -highpressuresodium = express_getattr(IfcLampTypeEnum, 'HIGHPRESSURESODIUM', INDETERMINATE) -led = express_getattr(IfcLampTypeEnum, 'LED', INDETERMINATE) -metalhalide = express_getattr(IfcLampTypeEnum, 'METALHALIDE', INDETERMINATE) -oled = express_getattr(IfcLampTypeEnum, 'OLED', INDETERMINATE) -tungstenfilament = express_getattr(IfcLampTypeEnum, 'TUNGSTENFILAMENT', INDETERMINATE) -userdefined = express_getattr(IfcLampTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcLampTypeEnum, 'NOTDEFINED', INDETERMINATE) +compactfluorescent = IfcLampTypeEnum.COMPACTFLUORESCENT +fluorescent = IfcLampTypeEnum.FLUORESCENT +halogen = IfcLampTypeEnum.HALOGEN +highpressuremercury = IfcLampTypeEnum.HIGHPRESSUREMERCURY +highpressuresodium = IfcLampTypeEnum.HIGHPRESSURESODIUM +led = IfcLampTypeEnum.LED +metalhalide = IfcLampTypeEnum.METALHALIDE +oled = IfcLampTypeEnum.OLED +tungstenfilament = IfcLampTypeEnum.TUNGSTENFILAMENT +userdefined = IfcLampTypeEnum.USERDEFINED +notdefined = IfcLampTypeEnum.NOTDEFINED IfcLayerSetDirectionEnum = enum_namespace() -axis1 = express_getattr(IfcLayerSetDirectionEnum, 'AXIS1', INDETERMINATE) -axis2 = express_getattr(IfcLayerSetDirectionEnum, 'AXIS2', INDETERMINATE) -axis3 = express_getattr(IfcLayerSetDirectionEnum, 'AXIS3', INDETERMINATE) +axis1 = IfcLayerSetDirectionEnum.AXIS1 +axis2 = IfcLayerSetDirectionEnum.AXIS2 +axis3 = IfcLayerSetDirectionEnum.AXIS3 IfcLightDistributionCurveEnum = enum_namespace() -type_a = express_getattr(IfcLightDistributionCurveEnum, 'TYPE_A', INDETERMINATE) -type_b = express_getattr(IfcLightDistributionCurveEnum, 'TYPE_B', INDETERMINATE) -type_c = express_getattr(IfcLightDistributionCurveEnum, 'TYPE_C', INDETERMINATE) -notdefined = express_getattr(IfcLightDistributionCurveEnum, 'NOTDEFINED', INDETERMINATE) +type_a = IfcLightDistributionCurveEnum.TYPE_A +type_b = IfcLightDistributionCurveEnum.TYPE_B +type_c = IfcLightDistributionCurveEnum.TYPE_C +notdefined = IfcLightDistributionCurveEnum.NOTDEFINED IfcLightEmissionSourceEnum = enum_namespace() -compactfluorescent = express_getattr(IfcLightEmissionSourceEnum, 'COMPACTFLUORESCENT', INDETERMINATE) -fluorescent = express_getattr(IfcLightEmissionSourceEnum, 'FLUORESCENT', INDETERMINATE) -highpressuremercury = express_getattr(IfcLightEmissionSourceEnum, 'HIGHPRESSUREMERCURY', INDETERMINATE) -highpressuresodium = express_getattr(IfcLightEmissionSourceEnum, 'HIGHPRESSURESODIUM', INDETERMINATE) -lightemittingdiode = express_getattr(IfcLightEmissionSourceEnum, 'LIGHTEMITTINGDIODE', INDETERMINATE) -lowpressuresodium = express_getattr(IfcLightEmissionSourceEnum, 'LOWPRESSURESODIUM', INDETERMINATE) -lowvoltagehalogen = express_getattr(IfcLightEmissionSourceEnum, 'LOWVOLTAGEHALOGEN', INDETERMINATE) -mainvoltagehalogen = express_getattr(IfcLightEmissionSourceEnum, 'MAINVOLTAGEHALOGEN', INDETERMINATE) -metalhalide = express_getattr(IfcLightEmissionSourceEnum, 'METALHALIDE', INDETERMINATE) -tungstenfilament = express_getattr(IfcLightEmissionSourceEnum, 'TUNGSTENFILAMENT', INDETERMINATE) -notdefined = express_getattr(IfcLightEmissionSourceEnum, 'NOTDEFINED', INDETERMINATE) +compactfluorescent = IfcLightEmissionSourceEnum.COMPACTFLUORESCENT +fluorescent = IfcLightEmissionSourceEnum.FLUORESCENT +highpressuremercury = IfcLightEmissionSourceEnum.HIGHPRESSUREMERCURY +highpressuresodium = IfcLightEmissionSourceEnum.HIGHPRESSURESODIUM +lightemittingdiode = IfcLightEmissionSourceEnum.LIGHTEMITTINGDIODE +lowpressuresodium = IfcLightEmissionSourceEnum.LOWPRESSURESODIUM +lowvoltagehalogen = IfcLightEmissionSourceEnum.LOWVOLTAGEHALOGEN +mainvoltagehalogen = IfcLightEmissionSourceEnum.MAINVOLTAGEHALOGEN +metalhalide = IfcLightEmissionSourceEnum.METALHALIDE +tungstenfilament = IfcLightEmissionSourceEnum.TUNGSTENFILAMENT +notdefined = IfcLightEmissionSourceEnum.NOTDEFINED IfcLightFixtureTypeEnum = enum_namespace() -pointsource = express_getattr(IfcLightFixtureTypeEnum, 'POINTSOURCE', INDETERMINATE) -directionsource = express_getattr(IfcLightFixtureTypeEnum, 'DIRECTIONSOURCE', INDETERMINATE) -securitylighting = express_getattr(IfcLightFixtureTypeEnum, 'SECURITYLIGHTING', INDETERMINATE) -userdefined = express_getattr(IfcLightFixtureTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcLightFixtureTypeEnum, 'NOTDEFINED', INDETERMINATE) +pointsource = IfcLightFixtureTypeEnum.POINTSOURCE +directionsource = IfcLightFixtureTypeEnum.DIRECTIONSOURCE +securitylighting = IfcLightFixtureTypeEnum.SECURITYLIGHTING +userdefined = IfcLightFixtureTypeEnum.USERDEFINED +notdefined = IfcLightFixtureTypeEnum.NOTDEFINED IfcLiquidTerminalTypeEnum = enum_namespace() -loadingarm = express_getattr(IfcLiquidTerminalTypeEnum, 'LOADINGARM', INDETERMINATE) -hosereel = express_getattr(IfcLiquidTerminalTypeEnum, 'HOSEREEL', INDETERMINATE) -userdefined = express_getattr(IfcLiquidTerminalTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcLiquidTerminalTypeEnum, 'NOTDEFINED', INDETERMINATE) +loadingarm = IfcLiquidTerminalTypeEnum.LOADINGARM +hosereel = IfcLiquidTerminalTypeEnum.HOSEREEL +userdefined = IfcLiquidTerminalTypeEnum.USERDEFINED +notdefined = IfcLiquidTerminalTypeEnum.NOTDEFINED IfcLoadGroupTypeEnum = enum_namespace() -load_group = express_getattr(IfcLoadGroupTypeEnum, 'LOAD_GROUP', INDETERMINATE) -load_case = express_getattr(IfcLoadGroupTypeEnum, 'LOAD_CASE', INDETERMINATE) -load_combination = express_getattr(IfcLoadGroupTypeEnum, 'LOAD_COMBINATION', INDETERMINATE) -userdefined = express_getattr(IfcLoadGroupTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcLoadGroupTypeEnum, 'NOTDEFINED', INDETERMINATE) +load_group = IfcLoadGroupTypeEnum.LOAD_GROUP +load_case = IfcLoadGroupTypeEnum.LOAD_CASE +load_combination = IfcLoadGroupTypeEnum.LOAD_COMBINATION +userdefined = IfcLoadGroupTypeEnum.USERDEFINED +notdefined = IfcLoadGroupTypeEnum.NOTDEFINED IfcLogicalOperatorEnum = enum_namespace() -logicaland = express_getattr(IfcLogicalOperatorEnum, 'LOGICALAND', INDETERMINATE) -logicalor = express_getattr(IfcLogicalOperatorEnum, 'LOGICALOR', INDETERMINATE) -logicalxor = express_getattr(IfcLogicalOperatorEnum, 'LOGICALXOR', INDETERMINATE) -logicalnotand = express_getattr(IfcLogicalOperatorEnum, 'LOGICALNOTAND', INDETERMINATE) -logicalnotor = express_getattr(IfcLogicalOperatorEnum, 'LOGICALNOTOR', INDETERMINATE) +logicaland = IfcLogicalOperatorEnum.LOGICALAND +logicalor = IfcLogicalOperatorEnum.LOGICALOR +logicalxor = IfcLogicalOperatorEnum.LOGICALXOR +logicalnotand = IfcLogicalOperatorEnum.LOGICALNOTAND +logicalnotor = IfcLogicalOperatorEnum.LOGICALNOTOR IfcMarineFacilityTypeEnum = enum_namespace() -canal = express_getattr(IfcMarineFacilityTypeEnum, 'CANAL', INDETERMINATE) -waterwayshiplift = express_getattr(IfcMarineFacilityTypeEnum, 'WATERWAYSHIPLIFT', INDETERMINATE) -revetment = express_getattr(IfcMarineFacilityTypeEnum, 'REVETMENT', INDETERMINATE) -launchrecovery = express_getattr(IfcMarineFacilityTypeEnum, 'LAUNCHRECOVERY', INDETERMINATE) -marinedefence = express_getattr(IfcMarineFacilityTypeEnum, 'MARINEDEFENCE', INDETERMINATE) -hydrolift = express_getattr(IfcMarineFacilityTypeEnum, 'HYDROLIFT', INDETERMINATE) -shipyard = express_getattr(IfcMarineFacilityTypeEnum, 'SHIPYARD', INDETERMINATE) -shiplift = express_getattr(IfcMarineFacilityTypeEnum, 'SHIPLIFT', INDETERMINATE) -port = express_getattr(IfcMarineFacilityTypeEnum, 'PORT', INDETERMINATE) -quay = express_getattr(IfcMarineFacilityTypeEnum, 'QUAY', INDETERMINATE) -floatingdock = express_getattr(IfcMarineFacilityTypeEnum, 'FLOATINGDOCK', INDETERMINATE) -navigationalchannel = express_getattr(IfcMarineFacilityTypeEnum, 'NAVIGATIONALCHANNEL', INDETERMINATE) -breakwater = express_getattr(IfcMarineFacilityTypeEnum, 'BREAKWATER', INDETERMINATE) -drydock = express_getattr(IfcMarineFacilityTypeEnum, 'DRYDOCK', INDETERMINATE) -jetty = express_getattr(IfcMarineFacilityTypeEnum, 'JETTY', INDETERMINATE) -shiplock = express_getattr(IfcMarineFacilityTypeEnum, 'SHIPLOCK', INDETERMINATE) -barrierbeach = express_getattr(IfcMarineFacilityTypeEnum, 'BARRIERBEACH', INDETERMINATE) -slipway = express_getattr(IfcMarineFacilityTypeEnum, 'SLIPWAY', INDETERMINATE) -waterway = express_getattr(IfcMarineFacilityTypeEnum, 'WATERWAY', INDETERMINATE) -userdefined = express_getattr(IfcMarineFacilityTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcMarineFacilityTypeEnum, 'NOTDEFINED', INDETERMINATE) +canal = IfcMarineFacilityTypeEnum.CANAL +waterwayshiplift = IfcMarineFacilityTypeEnum.WATERWAYSHIPLIFT +revetment = IfcMarineFacilityTypeEnum.REVETMENT +launchrecovery = IfcMarineFacilityTypeEnum.LAUNCHRECOVERY +marinedefence = IfcMarineFacilityTypeEnum.MARINEDEFENCE +hydrolift = IfcMarineFacilityTypeEnum.HYDROLIFT +shipyard = IfcMarineFacilityTypeEnum.SHIPYARD +shiplift = IfcMarineFacilityTypeEnum.SHIPLIFT +port = IfcMarineFacilityTypeEnum.PORT +quay = IfcMarineFacilityTypeEnum.QUAY +floatingdock = IfcMarineFacilityTypeEnum.FLOATINGDOCK +navigationalchannel = IfcMarineFacilityTypeEnum.NAVIGATIONALCHANNEL +breakwater = IfcMarineFacilityTypeEnum.BREAKWATER +drydock = IfcMarineFacilityTypeEnum.DRYDOCK +jetty = IfcMarineFacilityTypeEnum.JETTY +shiplock = IfcMarineFacilityTypeEnum.SHIPLOCK +barrierbeach = IfcMarineFacilityTypeEnum.BARRIERBEACH +slipway = IfcMarineFacilityTypeEnum.SLIPWAY +waterway = IfcMarineFacilityTypeEnum.WATERWAY +userdefined = IfcMarineFacilityTypeEnum.USERDEFINED +notdefined = IfcMarineFacilityTypeEnum.NOTDEFINED IfcMarinePartTypeEnum = enum_namespace() -crest = express_getattr(IfcMarinePartTypeEnum, 'CREST', INDETERMINATE) -manufacturing = express_getattr(IfcMarinePartTypeEnum, 'MANUFACTURING', INDETERMINATE) -lowwaterline = express_getattr(IfcMarinePartTypeEnum, 'LOWWATERLINE', INDETERMINATE) -core = express_getattr(IfcMarinePartTypeEnum, 'CORE', INDETERMINATE) -waterfield = express_getattr(IfcMarinePartTypeEnum, 'WATERFIELD', INDETERMINATE) -cill_level = express_getattr(IfcMarinePartTypeEnum, 'CILL_LEVEL', INDETERMINATE) -berthingstructure = express_getattr(IfcMarinePartTypeEnum, 'BERTHINGSTRUCTURE', INDETERMINATE) -copelevel = express_getattr(IfcMarinePartTypeEnum, 'COPELEVEL', INDETERMINATE) -chamber = express_getattr(IfcMarinePartTypeEnum, 'CHAMBER', INDETERMINATE) -storage = express_getattr(IfcMarinePartTypeEnum, 'STORAGE', INDETERMINATE) -approachchannel = express_getattr(IfcMarinePartTypeEnum, 'APPROACHCHANNEL', INDETERMINATE) -vehicleservicing = express_getattr(IfcMarinePartTypeEnum, 'VEHICLESERVICING', INDETERMINATE) -shiptransfer = express_getattr(IfcMarinePartTypeEnum, 'SHIPTRANSFER', INDETERMINATE) -gatehead = express_getattr(IfcMarinePartTypeEnum, 'GATEHEAD', INDETERMINATE) -gudingstructure = express_getattr(IfcMarinePartTypeEnum, 'GUDINGSTRUCTURE', INDETERMINATE) -belowwaterline = express_getattr(IfcMarinePartTypeEnum, 'BELOWWATERLINE', INDETERMINATE) -weatherside = express_getattr(IfcMarinePartTypeEnum, 'WEATHERSIDE', INDETERMINATE) -landfield = express_getattr(IfcMarinePartTypeEnum, 'LANDFIELD', INDETERMINATE) -protection = express_getattr(IfcMarinePartTypeEnum, 'PROTECTION', INDETERMINATE) -leewardside = express_getattr(IfcMarinePartTypeEnum, 'LEEWARDSIDE', INDETERMINATE) -abovewaterline = express_getattr(IfcMarinePartTypeEnum, 'ABOVEWATERLINE', INDETERMINATE) -anchorage = express_getattr(IfcMarinePartTypeEnum, 'ANCHORAGE', INDETERMINATE) -navigationalarea = express_getattr(IfcMarinePartTypeEnum, 'NAVIGATIONALAREA', INDETERMINATE) -highwaterline = express_getattr(IfcMarinePartTypeEnum, 'HIGHWATERLINE', INDETERMINATE) -userdefined = express_getattr(IfcMarinePartTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcMarinePartTypeEnum, 'NOTDEFINED', INDETERMINATE) +crest = IfcMarinePartTypeEnum.CREST +manufacturing = IfcMarinePartTypeEnum.MANUFACTURING +lowwaterline = IfcMarinePartTypeEnum.LOWWATERLINE +core = IfcMarinePartTypeEnum.CORE +waterfield = IfcMarinePartTypeEnum.WATERFIELD +cill_level = IfcMarinePartTypeEnum.CILL_LEVEL +berthingstructure = IfcMarinePartTypeEnum.BERTHINGSTRUCTURE +copelevel = IfcMarinePartTypeEnum.COPELEVEL +chamber = IfcMarinePartTypeEnum.CHAMBER +storage = IfcMarinePartTypeEnum.STORAGE +approachchannel = IfcMarinePartTypeEnum.APPROACHCHANNEL +vehicleservicing = IfcMarinePartTypeEnum.VEHICLESERVICING +shiptransfer = IfcMarinePartTypeEnum.SHIPTRANSFER +gatehead = IfcMarinePartTypeEnum.GATEHEAD +gudingstructure = IfcMarinePartTypeEnum.GUDINGSTRUCTURE +belowwaterline = IfcMarinePartTypeEnum.BELOWWATERLINE +weatherside = IfcMarinePartTypeEnum.WEATHERSIDE +landfield = IfcMarinePartTypeEnum.LANDFIELD +protection = IfcMarinePartTypeEnum.PROTECTION +leewardside = IfcMarinePartTypeEnum.LEEWARDSIDE +abovewaterline = IfcMarinePartTypeEnum.ABOVEWATERLINE +anchorage = IfcMarinePartTypeEnum.ANCHORAGE +navigationalarea = IfcMarinePartTypeEnum.NAVIGATIONALAREA +highwaterline = IfcMarinePartTypeEnum.HIGHWATERLINE +userdefined = IfcMarinePartTypeEnum.USERDEFINED +notdefined = IfcMarinePartTypeEnum.NOTDEFINED IfcMechanicalFastenerTypeEnum = enum_namespace() -anchorbolt = express_getattr(IfcMechanicalFastenerTypeEnum, 'ANCHORBOLT', INDETERMINATE) -bolt = express_getattr(IfcMechanicalFastenerTypeEnum, 'BOLT', INDETERMINATE) -dowel = express_getattr(IfcMechanicalFastenerTypeEnum, 'DOWEL', INDETERMINATE) -nail = express_getattr(IfcMechanicalFastenerTypeEnum, 'NAIL', INDETERMINATE) -nailplate = express_getattr(IfcMechanicalFastenerTypeEnum, 'NAILPLATE', INDETERMINATE) -rivet = express_getattr(IfcMechanicalFastenerTypeEnum, 'RIVET', INDETERMINATE) -screw = express_getattr(IfcMechanicalFastenerTypeEnum, 'SCREW', INDETERMINATE) -shearconnector = express_getattr(IfcMechanicalFastenerTypeEnum, 'SHEARCONNECTOR', INDETERMINATE) -staple = express_getattr(IfcMechanicalFastenerTypeEnum, 'STAPLE', INDETERMINATE) -studshearconnector = express_getattr(IfcMechanicalFastenerTypeEnum, 'STUDSHEARCONNECTOR', INDETERMINATE) -coupler = express_getattr(IfcMechanicalFastenerTypeEnum, 'COUPLER', INDETERMINATE) -railjoint = express_getattr(IfcMechanicalFastenerTypeEnum, 'RAILJOINT', INDETERMINATE) -railfastening = express_getattr(IfcMechanicalFastenerTypeEnum, 'RAILFASTENING', INDETERMINATE) -chain = express_getattr(IfcMechanicalFastenerTypeEnum, 'CHAIN', INDETERMINATE) -rope = express_getattr(IfcMechanicalFastenerTypeEnum, 'ROPE', INDETERMINATE) -userdefined = express_getattr(IfcMechanicalFastenerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcMechanicalFastenerTypeEnum, 'NOTDEFINED', INDETERMINATE) +anchorbolt = IfcMechanicalFastenerTypeEnum.ANCHORBOLT +bolt = IfcMechanicalFastenerTypeEnum.BOLT +dowel = IfcMechanicalFastenerTypeEnum.DOWEL +nail = IfcMechanicalFastenerTypeEnum.NAIL +nailplate = IfcMechanicalFastenerTypeEnum.NAILPLATE +rivet = IfcMechanicalFastenerTypeEnum.RIVET +screw = IfcMechanicalFastenerTypeEnum.SCREW +shearconnector = IfcMechanicalFastenerTypeEnum.SHEARCONNECTOR +staple = IfcMechanicalFastenerTypeEnum.STAPLE +studshearconnector = IfcMechanicalFastenerTypeEnum.STUDSHEARCONNECTOR +coupler = IfcMechanicalFastenerTypeEnum.COUPLER +railjoint = IfcMechanicalFastenerTypeEnum.RAILJOINT +railfastening = IfcMechanicalFastenerTypeEnum.RAILFASTENING +chain = IfcMechanicalFastenerTypeEnum.CHAIN +rope = IfcMechanicalFastenerTypeEnum.ROPE +userdefined = IfcMechanicalFastenerTypeEnum.USERDEFINED +notdefined = IfcMechanicalFastenerTypeEnum.NOTDEFINED IfcMedicalDeviceTypeEnum = enum_namespace() -airstation = express_getattr(IfcMedicalDeviceTypeEnum, 'AIRSTATION', INDETERMINATE) -feedairunit = express_getattr(IfcMedicalDeviceTypeEnum, 'FEEDAIRUNIT', INDETERMINATE) -oxygengenerator = express_getattr(IfcMedicalDeviceTypeEnum, 'OXYGENGENERATOR', INDETERMINATE) -oxygenplant = express_getattr(IfcMedicalDeviceTypeEnum, 'OXYGENPLANT', INDETERMINATE) -vacuumstation = express_getattr(IfcMedicalDeviceTypeEnum, 'VACUUMSTATION', INDETERMINATE) -userdefined = express_getattr(IfcMedicalDeviceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcMedicalDeviceTypeEnum, 'NOTDEFINED', INDETERMINATE) +airstation = IfcMedicalDeviceTypeEnum.AIRSTATION +feedairunit = IfcMedicalDeviceTypeEnum.FEEDAIRUNIT +oxygengenerator = IfcMedicalDeviceTypeEnum.OXYGENGENERATOR +oxygenplant = IfcMedicalDeviceTypeEnum.OXYGENPLANT +vacuumstation = IfcMedicalDeviceTypeEnum.VACUUMSTATION +userdefined = IfcMedicalDeviceTypeEnum.USERDEFINED +notdefined = IfcMedicalDeviceTypeEnum.NOTDEFINED IfcMemberTypeEnum = enum_namespace() -brace = express_getattr(IfcMemberTypeEnum, 'BRACE', INDETERMINATE) -chord = express_getattr(IfcMemberTypeEnum, 'CHORD', INDETERMINATE) -collar = express_getattr(IfcMemberTypeEnum, 'COLLAR', INDETERMINATE) -member = express_getattr(IfcMemberTypeEnum, 'MEMBER', INDETERMINATE) -mullion = express_getattr(IfcMemberTypeEnum, 'MULLION', INDETERMINATE) -plate = express_getattr(IfcMemberTypeEnum, 'PLATE', INDETERMINATE) -post = express_getattr(IfcMemberTypeEnum, 'POST', INDETERMINATE) -purlin = express_getattr(IfcMemberTypeEnum, 'PURLIN', INDETERMINATE) -rafter = express_getattr(IfcMemberTypeEnum, 'RAFTER', INDETERMINATE) -stringer = express_getattr(IfcMemberTypeEnum, 'STRINGER', INDETERMINATE) -strut = express_getattr(IfcMemberTypeEnum, 'STRUT', INDETERMINATE) -stud = express_getattr(IfcMemberTypeEnum, 'STUD', INDETERMINATE) -stiffening_rib = express_getattr(IfcMemberTypeEnum, 'STIFFENING_RIB', INDETERMINATE) -arch_segment = express_getattr(IfcMemberTypeEnum, 'ARCH_SEGMENT', INDETERMINATE) -suspension_cable = express_getattr(IfcMemberTypeEnum, 'SUSPENSION_CABLE', INDETERMINATE) -suspender = express_getattr(IfcMemberTypeEnum, 'SUSPENDER', INDETERMINATE) -stay_cable = express_getattr(IfcMemberTypeEnum, 'STAY_CABLE', INDETERMINATE) -structuralcable = express_getattr(IfcMemberTypeEnum, 'STRUCTURALCABLE', INDETERMINATE) -tiebar = express_getattr(IfcMemberTypeEnum, 'TIEBAR', INDETERMINATE) -userdefined = express_getattr(IfcMemberTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcMemberTypeEnum, 'NOTDEFINED', INDETERMINATE) +brace = IfcMemberTypeEnum.BRACE +chord = IfcMemberTypeEnum.CHORD +collar = IfcMemberTypeEnum.COLLAR +member = IfcMemberTypeEnum.MEMBER +mullion = IfcMemberTypeEnum.MULLION +plate = IfcMemberTypeEnum.PLATE +post = IfcMemberTypeEnum.POST +purlin = IfcMemberTypeEnum.PURLIN +rafter = IfcMemberTypeEnum.RAFTER +stringer = IfcMemberTypeEnum.STRINGER +strut = IfcMemberTypeEnum.STRUT +stud = IfcMemberTypeEnum.STUD +stiffening_rib = IfcMemberTypeEnum.STIFFENING_RIB +arch_segment = IfcMemberTypeEnum.ARCH_SEGMENT +suspension_cable = IfcMemberTypeEnum.SUSPENSION_CABLE +suspender = IfcMemberTypeEnum.SUSPENDER +stay_cable = IfcMemberTypeEnum.STAY_CABLE +structuralcable = IfcMemberTypeEnum.STRUCTURALCABLE +tiebar = IfcMemberTypeEnum.TIEBAR +userdefined = IfcMemberTypeEnum.USERDEFINED +notdefined = IfcMemberTypeEnum.NOTDEFINED IfcMobileTelecommunicationsApplianceTypeEnum = enum_namespace() -e_utran_node_b = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'E_UTRAN_NODE_B', INDETERMINATE) -remote_radio_unit = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'REMOTE_RADIO_UNIT', INDETERMINATE) -accesspoint = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'ACCESSPOINT', INDETERMINATE) -basetransceiverstation = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'BASETRANSCEIVERSTATION', INDETERMINATE) -remoteunit = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'REMOTEUNIT', INDETERMINATE) -basebandunit = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'BASEBANDUNIT', INDETERMINATE) -masterunit = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'MASTERUNIT', INDETERMINATE) -userdefined = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'NOTDEFINED', INDETERMINATE) +e_utran_node_b = IfcMobileTelecommunicationsApplianceTypeEnum.E_UTRAN_NODE_B +remote_radio_unit = IfcMobileTelecommunicationsApplianceTypeEnum.REMOTE_RADIO_UNIT +accesspoint = IfcMobileTelecommunicationsApplianceTypeEnum.ACCESSPOINT +basetransceiverstation = IfcMobileTelecommunicationsApplianceTypeEnum.BASETRANSCEIVERSTATION +remoteunit = IfcMobileTelecommunicationsApplianceTypeEnum.REMOTEUNIT +basebandunit = IfcMobileTelecommunicationsApplianceTypeEnum.BASEBANDUNIT +masterunit = IfcMobileTelecommunicationsApplianceTypeEnum.MASTERUNIT +userdefined = IfcMobileTelecommunicationsApplianceTypeEnum.USERDEFINED +notdefined = IfcMobileTelecommunicationsApplianceTypeEnum.NOTDEFINED IfcMooringDeviceTypeEnum = enum_namespace() -linetensioner = express_getattr(IfcMooringDeviceTypeEnum, 'LINETENSIONER', INDETERMINATE) -magneticdevice = express_getattr(IfcMooringDeviceTypeEnum, 'MAGNETICDEVICE', INDETERMINATE) -mooringhooks = express_getattr(IfcMooringDeviceTypeEnum, 'MOORINGHOOKS', INDETERMINATE) -vacuumdevice = express_getattr(IfcMooringDeviceTypeEnum, 'VACUUMDEVICE', INDETERMINATE) -bollard = express_getattr(IfcMooringDeviceTypeEnum, 'BOLLARD', INDETERMINATE) -userdefined = express_getattr(IfcMooringDeviceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcMooringDeviceTypeEnum, 'NOTDEFINED', INDETERMINATE) +linetensioner = IfcMooringDeviceTypeEnum.LINETENSIONER +magneticdevice = IfcMooringDeviceTypeEnum.MAGNETICDEVICE +mooringhooks = IfcMooringDeviceTypeEnum.MOORINGHOOKS +vacuumdevice = IfcMooringDeviceTypeEnum.VACUUMDEVICE +bollard = IfcMooringDeviceTypeEnum.BOLLARD +userdefined = IfcMooringDeviceTypeEnum.USERDEFINED +notdefined = IfcMooringDeviceTypeEnum.NOTDEFINED IfcMotorConnectionTypeEnum = enum_namespace() -beltdrive = express_getattr(IfcMotorConnectionTypeEnum, 'BELTDRIVE', INDETERMINATE) -coupling = express_getattr(IfcMotorConnectionTypeEnum, 'COUPLING', INDETERMINATE) -directdrive = express_getattr(IfcMotorConnectionTypeEnum, 'DIRECTDRIVE', INDETERMINATE) -userdefined = express_getattr(IfcMotorConnectionTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcMotorConnectionTypeEnum, 'NOTDEFINED', INDETERMINATE) +beltdrive = IfcMotorConnectionTypeEnum.BELTDRIVE +coupling = IfcMotorConnectionTypeEnum.COUPLING +directdrive = IfcMotorConnectionTypeEnum.DIRECTDRIVE +userdefined = IfcMotorConnectionTypeEnum.USERDEFINED +notdefined = IfcMotorConnectionTypeEnum.NOTDEFINED IfcNavigationElementTypeEnum = enum_namespace() -beacon = express_getattr(IfcNavigationElementTypeEnum, 'BEACON', INDETERMINATE) -buoy = express_getattr(IfcNavigationElementTypeEnum, 'BUOY', INDETERMINATE) -userdefined = express_getattr(IfcNavigationElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcNavigationElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +beacon = IfcNavigationElementTypeEnum.BEACON +buoy = IfcNavigationElementTypeEnum.BUOY +userdefined = IfcNavigationElementTypeEnum.USERDEFINED +notdefined = IfcNavigationElementTypeEnum.NOTDEFINED IfcObjectTypeEnum = enum_namespace() -product = express_getattr(IfcObjectTypeEnum, 'PRODUCT', INDETERMINATE) -process = express_getattr(IfcObjectTypeEnum, 'PROCESS', INDETERMINATE) -control = express_getattr(IfcObjectTypeEnum, 'CONTROL', INDETERMINATE) -resource = express_getattr(IfcObjectTypeEnum, 'RESOURCE', INDETERMINATE) -actor = express_getattr(IfcObjectTypeEnum, 'ACTOR', INDETERMINATE) -group = express_getattr(IfcObjectTypeEnum, 'GROUP', INDETERMINATE) -project = express_getattr(IfcObjectTypeEnum, 'PROJECT', INDETERMINATE) -notdefined = express_getattr(IfcObjectTypeEnum, 'NOTDEFINED', INDETERMINATE) +product = IfcObjectTypeEnum.PRODUCT +process = IfcObjectTypeEnum.PROCESS +control = IfcObjectTypeEnum.CONTROL +resource = IfcObjectTypeEnum.RESOURCE +actor = IfcObjectTypeEnum.ACTOR +group = IfcObjectTypeEnum.GROUP +project = IfcObjectTypeEnum.PROJECT +notdefined = IfcObjectTypeEnum.NOTDEFINED IfcObjectiveEnum = enum_namespace() -codecompliance = express_getattr(IfcObjectiveEnum, 'CODECOMPLIANCE', INDETERMINATE) -codewaiver = express_getattr(IfcObjectiveEnum, 'CODEWAIVER', INDETERMINATE) -designintent = express_getattr(IfcObjectiveEnum, 'DESIGNINTENT', INDETERMINATE) -external = express_getattr(IfcObjectiveEnum, 'EXTERNAL', INDETERMINATE) -healthandsafety = express_getattr(IfcObjectiveEnum, 'HEALTHANDSAFETY', INDETERMINATE) -mergeconflict = express_getattr(IfcObjectiveEnum, 'MERGECONFLICT', INDETERMINATE) -modelview = express_getattr(IfcObjectiveEnum, 'MODELVIEW', INDETERMINATE) -parameter = express_getattr(IfcObjectiveEnum, 'PARAMETER', INDETERMINATE) -requirement = express_getattr(IfcObjectiveEnum, 'REQUIREMENT', INDETERMINATE) -specification = express_getattr(IfcObjectiveEnum, 'SPECIFICATION', INDETERMINATE) -triggercondition = express_getattr(IfcObjectiveEnum, 'TRIGGERCONDITION', INDETERMINATE) -userdefined = express_getattr(IfcObjectiveEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcObjectiveEnum, 'NOTDEFINED', INDETERMINATE) +codecompliance = IfcObjectiveEnum.CODECOMPLIANCE +codewaiver = IfcObjectiveEnum.CODEWAIVER +designintent = IfcObjectiveEnum.DESIGNINTENT +external = IfcObjectiveEnum.EXTERNAL +healthandsafety = IfcObjectiveEnum.HEALTHANDSAFETY +mergeconflict = IfcObjectiveEnum.MERGECONFLICT +modelview = IfcObjectiveEnum.MODELVIEW +parameter = IfcObjectiveEnum.PARAMETER +requirement = IfcObjectiveEnum.REQUIREMENT +specification = IfcObjectiveEnum.SPECIFICATION +triggercondition = IfcObjectiveEnum.TRIGGERCONDITION +userdefined = IfcObjectiveEnum.USERDEFINED +notdefined = IfcObjectiveEnum.NOTDEFINED IfcOccupantTypeEnum = enum_namespace() -assignee = express_getattr(IfcOccupantTypeEnum, 'ASSIGNEE', INDETERMINATE) -assignor = express_getattr(IfcOccupantTypeEnum, 'ASSIGNOR', INDETERMINATE) -lessee = express_getattr(IfcOccupantTypeEnum, 'LESSEE', INDETERMINATE) -lessor = express_getattr(IfcOccupantTypeEnum, 'LESSOR', INDETERMINATE) -lettingagent = express_getattr(IfcOccupantTypeEnum, 'LETTINGAGENT', INDETERMINATE) -owner = express_getattr(IfcOccupantTypeEnum, 'OWNER', INDETERMINATE) -tenant = express_getattr(IfcOccupantTypeEnum, 'TENANT', INDETERMINATE) -userdefined = express_getattr(IfcOccupantTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcOccupantTypeEnum, 'NOTDEFINED', INDETERMINATE) +assignee = IfcOccupantTypeEnum.ASSIGNEE +assignor = IfcOccupantTypeEnum.ASSIGNOR +lessee = IfcOccupantTypeEnum.LESSEE +lessor = IfcOccupantTypeEnum.LESSOR +lettingagent = IfcOccupantTypeEnum.LETTINGAGENT +owner = IfcOccupantTypeEnum.OWNER +tenant = IfcOccupantTypeEnum.TENANT +userdefined = IfcOccupantTypeEnum.USERDEFINED +notdefined = IfcOccupantTypeEnum.NOTDEFINED IfcOpeningElementTypeEnum = enum_namespace() -opening = express_getattr(IfcOpeningElementTypeEnum, 'OPENING', INDETERMINATE) -recess = express_getattr(IfcOpeningElementTypeEnum, 'RECESS', INDETERMINATE) -userdefined = express_getattr(IfcOpeningElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcOpeningElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +opening = IfcOpeningElementTypeEnum.OPENING +recess = IfcOpeningElementTypeEnum.RECESS +userdefined = IfcOpeningElementTypeEnum.USERDEFINED +notdefined = IfcOpeningElementTypeEnum.NOTDEFINED IfcOutletTypeEnum = enum_namespace() -audiovisualoutlet = express_getattr(IfcOutletTypeEnum, 'AUDIOVISUALOUTLET', INDETERMINATE) -communicationsoutlet = express_getattr(IfcOutletTypeEnum, 'COMMUNICATIONSOUTLET', INDETERMINATE) -poweroutlet = express_getattr(IfcOutletTypeEnum, 'POWEROUTLET', INDETERMINATE) -dataoutlet = express_getattr(IfcOutletTypeEnum, 'DATAOUTLET', INDETERMINATE) -telephoneoutlet = express_getattr(IfcOutletTypeEnum, 'TELEPHONEOUTLET', INDETERMINATE) -userdefined = express_getattr(IfcOutletTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcOutletTypeEnum, 'NOTDEFINED', INDETERMINATE) +audiovisualoutlet = IfcOutletTypeEnum.AUDIOVISUALOUTLET +communicationsoutlet = IfcOutletTypeEnum.COMMUNICATIONSOUTLET +poweroutlet = IfcOutletTypeEnum.POWEROUTLET +dataoutlet = IfcOutletTypeEnum.DATAOUTLET +telephoneoutlet = IfcOutletTypeEnum.TELEPHONEOUTLET +userdefined = IfcOutletTypeEnum.USERDEFINED +notdefined = IfcOutletTypeEnum.NOTDEFINED IfcPavementTypeEnum = enum_namespace() -flexible = express_getattr(IfcPavementTypeEnum, 'FLEXIBLE', INDETERMINATE) -rigid = express_getattr(IfcPavementTypeEnum, 'RIGID', INDETERMINATE) -userdefined = express_getattr(IfcPavementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPavementTypeEnum, 'NOTDEFINED', INDETERMINATE) +flexible = IfcPavementTypeEnum.FLEXIBLE +rigid = IfcPavementTypeEnum.RIGID +userdefined = IfcPavementTypeEnum.USERDEFINED +notdefined = IfcPavementTypeEnum.NOTDEFINED IfcPerformanceHistoryTypeEnum = enum_namespace() -userdefined = express_getattr(IfcPerformanceHistoryTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPerformanceHistoryTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcPerformanceHistoryTypeEnum.USERDEFINED +notdefined = IfcPerformanceHistoryTypeEnum.NOTDEFINED IfcPermeableCoveringOperationEnum = enum_namespace() -grill = express_getattr(IfcPermeableCoveringOperationEnum, 'GRILL', INDETERMINATE) -louver = express_getattr(IfcPermeableCoveringOperationEnum, 'LOUVER', INDETERMINATE) -screen = express_getattr(IfcPermeableCoveringOperationEnum, 'SCREEN', INDETERMINATE) -userdefined = express_getattr(IfcPermeableCoveringOperationEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPermeableCoveringOperationEnum, 'NOTDEFINED', INDETERMINATE) +grill = IfcPermeableCoveringOperationEnum.GRILL +louver = IfcPermeableCoveringOperationEnum.LOUVER +screen = IfcPermeableCoveringOperationEnum.SCREEN +userdefined = IfcPermeableCoveringOperationEnum.USERDEFINED +notdefined = IfcPermeableCoveringOperationEnum.NOTDEFINED IfcPermitTypeEnum = enum_namespace() -access = express_getattr(IfcPermitTypeEnum, 'ACCESS', INDETERMINATE) -building = express_getattr(IfcPermitTypeEnum, 'BUILDING', INDETERMINATE) -work = express_getattr(IfcPermitTypeEnum, 'WORK', INDETERMINATE) -userdefined = express_getattr(IfcPermitTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPermitTypeEnum, 'NOTDEFINED', INDETERMINATE) +access = IfcPermitTypeEnum.ACCESS +building = IfcPermitTypeEnum.BUILDING +work = IfcPermitTypeEnum.WORK +userdefined = IfcPermitTypeEnum.USERDEFINED +notdefined = IfcPermitTypeEnum.NOTDEFINED IfcPhysicalOrVirtualEnum = enum_namespace() -physical = express_getattr(IfcPhysicalOrVirtualEnum, 'PHYSICAL', INDETERMINATE) -virtual = express_getattr(IfcPhysicalOrVirtualEnum, 'VIRTUAL', INDETERMINATE) -notdefined = express_getattr(IfcPhysicalOrVirtualEnum, 'NOTDEFINED', INDETERMINATE) +physical = IfcPhysicalOrVirtualEnum.PHYSICAL +virtual = IfcPhysicalOrVirtualEnum.VIRTUAL +notdefined = IfcPhysicalOrVirtualEnum.NOTDEFINED IfcPileConstructionEnum = enum_namespace() -cast_in_place = express_getattr(IfcPileConstructionEnum, 'CAST_IN_PLACE', INDETERMINATE) -composite = express_getattr(IfcPileConstructionEnum, 'COMPOSITE', INDETERMINATE) -precast_concrete = express_getattr(IfcPileConstructionEnum, 'PRECAST_CONCRETE', INDETERMINATE) -prefab_steel = express_getattr(IfcPileConstructionEnum, 'PREFAB_STEEL', INDETERMINATE) -userdefined = express_getattr(IfcPileConstructionEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPileConstructionEnum, 'NOTDEFINED', INDETERMINATE) +cast_in_place = IfcPileConstructionEnum.CAST_IN_PLACE +composite = IfcPileConstructionEnum.COMPOSITE +precast_concrete = IfcPileConstructionEnum.PRECAST_CONCRETE +prefab_steel = IfcPileConstructionEnum.PREFAB_STEEL +userdefined = IfcPileConstructionEnum.USERDEFINED +notdefined = IfcPileConstructionEnum.NOTDEFINED IfcPileTypeEnum = enum_namespace() -bored = express_getattr(IfcPileTypeEnum, 'BORED', INDETERMINATE) -driven = express_getattr(IfcPileTypeEnum, 'DRIVEN', INDETERMINATE) -jetgrouting = express_getattr(IfcPileTypeEnum, 'JETGROUTING', INDETERMINATE) -cohesion = express_getattr(IfcPileTypeEnum, 'COHESION', INDETERMINATE) -friction = express_getattr(IfcPileTypeEnum, 'FRICTION', INDETERMINATE) -support = express_getattr(IfcPileTypeEnum, 'SUPPORT', INDETERMINATE) -userdefined = express_getattr(IfcPileTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPileTypeEnum, 'NOTDEFINED', INDETERMINATE) +bored = IfcPileTypeEnum.BORED +driven = IfcPileTypeEnum.DRIVEN +jetgrouting = IfcPileTypeEnum.JETGROUTING +cohesion = IfcPileTypeEnum.COHESION +friction = IfcPileTypeEnum.FRICTION +support = IfcPileTypeEnum.SUPPORT +userdefined = IfcPileTypeEnum.USERDEFINED +notdefined = IfcPileTypeEnum.NOTDEFINED IfcPipeFittingTypeEnum = enum_namespace() -bend = express_getattr(IfcPipeFittingTypeEnum, 'BEND', INDETERMINATE) -connector = express_getattr(IfcPipeFittingTypeEnum, 'CONNECTOR', INDETERMINATE) -entry = express_getattr(IfcPipeFittingTypeEnum, 'ENTRY', INDETERMINATE) -exit = express_getattr(IfcPipeFittingTypeEnum, 'EXIT', INDETERMINATE) -junction = express_getattr(IfcPipeFittingTypeEnum, 'JUNCTION', INDETERMINATE) -obstruction = express_getattr(IfcPipeFittingTypeEnum, 'OBSTRUCTION', INDETERMINATE) -transition = express_getattr(IfcPipeFittingTypeEnum, 'TRANSITION', INDETERMINATE) -userdefined = express_getattr(IfcPipeFittingTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPipeFittingTypeEnum, 'NOTDEFINED', INDETERMINATE) +bend = IfcPipeFittingTypeEnum.BEND +connector = IfcPipeFittingTypeEnum.CONNECTOR +entry = IfcPipeFittingTypeEnum.ENTRY +exit = IfcPipeFittingTypeEnum.EXIT +junction = IfcPipeFittingTypeEnum.JUNCTION +obstruction = IfcPipeFittingTypeEnum.OBSTRUCTION +transition = IfcPipeFittingTypeEnum.TRANSITION +userdefined = IfcPipeFittingTypeEnum.USERDEFINED +notdefined = IfcPipeFittingTypeEnum.NOTDEFINED IfcPipeSegmentTypeEnum = enum_namespace() -culvert = express_getattr(IfcPipeSegmentTypeEnum, 'CULVERT', INDETERMINATE) -flexiblesegment = express_getattr(IfcPipeSegmentTypeEnum, 'FLEXIBLESEGMENT', INDETERMINATE) -rigidsegment = express_getattr(IfcPipeSegmentTypeEnum, 'RIGIDSEGMENT', INDETERMINATE) -gutter = express_getattr(IfcPipeSegmentTypeEnum, 'GUTTER', INDETERMINATE) -spool = express_getattr(IfcPipeSegmentTypeEnum, 'SPOOL', INDETERMINATE) -userdefined = express_getattr(IfcPipeSegmentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPipeSegmentTypeEnum, 'NOTDEFINED', INDETERMINATE) +culvert = IfcPipeSegmentTypeEnum.CULVERT +flexiblesegment = IfcPipeSegmentTypeEnum.FLEXIBLESEGMENT +rigidsegment = IfcPipeSegmentTypeEnum.RIGIDSEGMENT +gutter = IfcPipeSegmentTypeEnum.GUTTER +spool = IfcPipeSegmentTypeEnum.SPOOL +userdefined = IfcPipeSegmentTypeEnum.USERDEFINED +notdefined = IfcPipeSegmentTypeEnum.NOTDEFINED IfcPlateTypeEnum = enum_namespace() -curtain_panel = express_getattr(IfcPlateTypeEnum, 'CURTAIN_PANEL', INDETERMINATE) -sheet = express_getattr(IfcPlateTypeEnum, 'SHEET', INDETERMINATE) -flange_plate = express_getattr(IfcPlateTypeEnum, 'FLANGE_PLATE', INDETERMINATE) -web_plate = express_getattr(IfcPlateTypeEnum, 'WEB_PLATE', INDETERMINATE) -stiffener_plate = express_getattr(IfcPlateTypeEnum, 'STIFFENER_PLATE', INDETERMINATE) -gusset_plate = express_getattr(IfcPlateTypeEnum, 'GUSSET_PLATE', INDETERMINATE) -cover_plate = express_getattr(IfcPlateTypeEnum, 'COVER_PLATE', INDETERMINATE) -splice_plate = express_getattr(IfcPlateTypeEnum, 'SPLICE_PLATE', INDETERMINATE) -base_plate = express_getattr(IfcPlateTypeEnum, 'BASE_PLATE', INDETERMINATE) -userdefined = express_getattr(IfcPlateTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPlateTypeEnum, 'NOTDEFINED', INDETERMINATE) +curtain_panel = IfcPlateTypeEnum.CURTAIN_PANEL +sheet = IfcPlateTypeEnum.SHEET +flange_plate = IfcPlateTypeEnum.FLANGE_PLATE +web_plate = IfcPlateTypeEnum.WEB_PLATE +stiffener_plate = IfcPlateTypeEnum.STIFFENER_PLATE +gusset_plate = IfcPlateTypeEnum.GUSSET_PLATE +cover_plate = IfcPlateTypeEnum.COVER_PLATE +splice_plate = IfcPlateTypeEnum.SPLICE_PLATE +base_plate = IfcPlateTypeEnum.BASE_PLATE +userdefined = IfcPlateTypeEnum.USERDEFINED +notdefined = IfcPlateTypeEnum.NOTDEFINED IfcPreferredSurfaceCurveRepresentation = enum_namespace() -curve3d = express_getattr(IfcPreferredSurfaceCurveRepresentation, 'CURVE3D', INDETERMINATE) -pcurve_s1 = express_getattr(IfcPreferredSurfaceCurveRepresentation, 'PCURVE_S1', INDETERMINATE) -pcurve_s2 = express_getattr(IfcPreferredSurfaceCurveRepresentation, 'PCURVE_S2', INDETERMINATE) +curve3d = IfcPreferredSurfaceCurveRepresentation.CURVE3D +pcurve_s1 = IfcPreferredSurfaceCurveRepresentation.PCURVE_S1 +pcurve_s2 = IfcPreferredSurfaceCurveRepresentation.PCURVE_S2 IfcProcedureTypeEnum = enum_namespace() -advice_caution = express_getattr(IfcProcedureTypeEnum, 'ADVICE_CAUTION', INDETERMINATE) -advice_note = express_getattr(IfcProcedureTypeEnum, 'ADVICE_NOTE', INDETERMINATE) -advice_warning = express_getattr(IfcProcedureTypeEnum, 'ADVICE_WARNING', INDETERMINATE) -calibration = express_getattr(IfcProcedureTypeEnum, 'CALIBRATION', INDETERMINATE) -diagnostic = express_getattr(IfcProcedureTypeEnum, 'DIAGNOSTIC', INDETERMINATE) -shutdown = express_getattr(IfcProcedureTypeEnum, 'SHUTDOWN', INDETERMINATE) -startup = express_getattr(IfcProcedureTypeEnum, 'STARTUP', INDETERMINATE) -userdefined = express_getattr(IfcProcedureTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcProcedureTypeEnum, 'NOTDEFINED', INDETERMINATE) +advice_caution = IfcProcedureTypeEnum.ADVICE_CAUTION +advice_note = IfcProcedureTypeEnum.ADVICE_NOTE +advice_warning = IfcProcedureTypeEnum.ADVICE_WARNING +calibration = IfcProcedureTypeEnum.CALIBRATION +diagnostic = IfcProcedureTypeEnum.DIAGNOSTIC +shutdown = IfcProcedureTypeEnum.SHUTDOWN +startup = IfcProcedureTypeEnum.STARTUP +userdefined = IfcProcedureTypeEnum.USERDEFINED +notdefined = IfcProcedureTypeEnum.NOTDEFINED IfcProfileTypeEnum = enum_namespace() -curve = express_getattr(IfcProfileTypeEnum, 'CURVE', INDETERMINATE) -area = express_getattr(IfcProfileTypeEnum, 'AREA', INDETERMINATE) +curve = IfcProfileTypeEnum.CURVE +area = IfcProfileTypeEnum.AREA IfcProjectOrderTypeEnum = enum_namespace() -changeorder = express_getattr(IfcProjectOrderTypeEnum, 'CHANGEORDER', INDETERMINATE) -maintenanceworkorder = express_getattr(IfcProjectOrderTypeEnum, 'MAINTENANCEWORKORDER', INDETERMINATE) -moveorder = express_getattr(IfcProjectOrderTypeEnum, 'MOVEORDER', INDETERMINATE) -purchaseorder = express_getattr(IfcProjectOrderTypeEnum, 'PURCHASEORDER', INDETERMINATE) -workorder = express_getattr(IfcProjectOrderTypeEnum, 'WORKORDER', INDETERMINATE) -userdefined = express_getattr(IfcProjectOrderTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcProjectOrderTypeEnum, 'NOTDEFINED', INDETERMINATE) +changeorder = IfcProjectOrderTypeEnum.CHANGEORDER +maintenanceworkorder = IfcProjectOrderTypeEnum.MAINTENANCEWORKORDER +moveorder = IfcProjectOrderTypeEnum.MOVEORDER +purchaseorder = IfcProjectOrderTypeEnum.PURCHASEORDER +workorder = IfcProjectOrderTypeEnum.WORKORDER +userdefined = IfcProjectOrderTypeEnum.USERDEFINED +notdefined = IfcProjectOrderTypeEnum.NOTDEFINED IfcProjectedOrTrueLengthEnum = enum_namespace() -projected_length = express_getattr(IfcProjectedOrTrueLengthEnum, 'PROJECTED_LENGTH', INDETERMINATE) -true_length = express_getattr(IfcProjectedOrTrueLengthEnum, 'TRUE_LENGTH', INDETERMINATE) +projected_length = IfcProjectedOrTrueLengthEnum.PROJECTED_LENGTH +true_length = IfcProjectedOrTrueLengthEnum.TRUE_LENGTH IfcProjectionElementTypeEnum = enum_namespace() -blister = express_getattr(IfcProjectionElementTypeEnum, 'BLISTER', INDETERMINATE) -deviator = express_getattr(IfcProjectionElementTypeEnum, 'DEVIATOR', INDETERMINATE) -userdefined = express_getattr(IfcProjectionElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcProjectionElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +blister = IfcProjectionElementTypeEnum.BLISTER +deviator = IfcProjectionElementTypeEnum.DEVIATOR +userdefined = IfcProjectionElementTypeEnum.USERDEFINED +notdefined = IfcProjectionElementTypeEnum.NOTDEFINED IfcPropertySetTemplateTypeEnum = enum_namespace() -pset_typedrivenonly = express_getattr(IfcPropertySetTemplateTypeEnum, 'PSET_TYPEDRIVENONLY', INDETERMINATE) -pset_typedrivenoverride = express_getattr(IfcPropertySetTemplateTypeEnum, 'PSET_TYPEDRIVENOVERRIDE', INDETERMINATE) -pset_occurrencedriven = express_getattr(IfcPropertySetTemplateTypeEnum, 'PSET_OCCURRENCEDRIVEN', INDETERMINATE) -pset_performancedriven = express_getattr(IfcPropertySetTemplateTypeEnum, 'PSET_PERFORMANCEDRIVEN', INDETERMINATE) -qto_typedrivenonly = express_getattr(IfcPropertySetTemplateTypeEnum, 'QTO_TYPEDRIVENONLY', INDETERMINATE) -qto_typedrivenoverride = express_getattr(IfcPropertySetTemplateTypeEnum, 'QTO_TYPEDRIVENOVERRIDE', INDETERMINATE) -qto_occurrencedriven = express_getattr(IfcPropertySetTemplateTypeEnum, 'QTO_OCCURRENCEDRIVEN', INDETERMINATE) -notdefined = express_getattr(IfcPropertySetTemplateTypeEnum, 'NOTDEFINED', INDETERMINATE) +pset_typedrivenonly = IfcPropertySetTemplateTypeEnum.PSET_TYPEDRIVENONLY +pset_typedrivenoverride = IfcPropertySetTemplateTypeEnum.PSET_TYPEDRIVENOVERRIDE +pset_occurrencedriven = IfcPropertySetTemplateTypeEnum.PSET_OCCURRENCEDRIVEN +pset_performancedriven = IfcPropertySetTemplateTypeEnum.PSET_PERFORMANCEDRIVEN +qto_typedrivenonly = IfcPropertySetTemplateTypeEnum.QTO_TYPEDRIVENONLY +qto_typedrivenoverride = IfcPropertySetTemplateTypeEnum.QTO_TYPEDRIVENOVERRIDE +qto_occurrencedriven = IfcPropertySetTemplateTypeEnum.QTO_OCCURRENCEDRIVEN +notdefined = IfcPropertySetTemplateTypeEnum.NOTDEFINED IfcProtectiveDeviceTrippingUnitTypeEnum = enum_namespace() -electronic = express_getattr(IfcProtectiveDeviceTrippingUnitTypeEnum, 'ELECTRONIC', INDETERMINATE) -electromagnetic = express_getattr(IfcProtectiveDeviceTrippingUnitTypeEnum, 'ELECTROMAGNETIC', INDETERMINATE) -residualcurrent = express_getattr(IfcProtectiveDeviceTrippingUnitTypeEnum, 'RESIDUALCURRENT', INDETERMINATE) -thermal = express_getattr(IfcProtectiveDeviceTrippingUnitTypeEnum, 'THERMAL', INDETERMINATE) -userdefined = express_getattr(IfcProtectiveDeviceTrippingUnitTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcProtectiveDeviceTrippingUnitTypeEnum, 'NOTDEFINED', INDETERMINATE) +electronic = IfcProtectiveDeviceTrippingUnitTypeEnum.ELECTRONIC +electromagnetic = IfcProtectiveDeviceTrippingUnitTypeEnum.ELECTROMAGNETIC +residualcurrent = IfcProtectiveDeviceTrippingUnitTypeEnum.RESIDUALCURRENT +thermal = IfcProtectiveDeviceTrippingUnitTypeEnum.THERMAL +userdefined = IfcProtectiveDeviceTrippingUnitTypeEnum.USERDEFINED +notdefined = IfcProtectiveDeviceTrippingUnitTypeEnum.NOTDEFINED IfcProtectiveDeviceTypeEnum = enum_namespace() -circuitbreaker = express_getattr(IfcProtectiveDeviceTypeEnum, 'CIRCUITBREAKER', INDETERMINATE) -earthleakagecircuitbreaker = express_getattr(IfcProtectiveDeviceTypeEnum, 'EARTHLEAKAGECIRCUITBREAKER', INDETERMINATE) -earthingswitch = express_getattr(IfcProtectiveDeviceTypeEnum, 'EARTHINGSWITCH', INDETERMINATE) -fusedisconnector = express_getattr(IfcProtectiveDeviceTypeEnum, 'FUSEDISCONNECTOR', INDETERMINATE) -residualcurrentcircuitbreaker = express_getattr(IfcProtectiveDeviceTypeEnum, 'RESIDUALCURRENTCIRCUITBREAKER', INDETERMINATE) -residualcurrentswitch = express_getattr(IfcProtectiveDeviceTypeEnum, 'RESIDUALCURRENTSWITCH', INDETERMINATE) -varistor = express_getattr(IfcProtectiveDeviceTypeEnum, 'VARISTOR', INDETERMINATE) -anti_arcing_device = express_getattr(IfcProtectiveDeviceTypeEnum, 'ANTI_ARCING_DEVICE', INDETERMINATE) -sparkgap = express_getattr(IfcProtectiveDeviceTypeEnum, 'SPARKGAP', INDETERMINATE) -voltagelimiter = express_getattr(IfcProtectiveDeviceTypeEnum, 'VOLTAGELIMITER', INDETERMINATE) -userdefined = express_getattr(IfcProtectiveDeviceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcProtectiveDeviceTypeEnum, 'NOTDEFINED', INDETERMINATE) +circuitbreaker = IfcProtectiveDeviceTypeEnum.CIRCUITBREAKER +earthleakagecircuitbreaker = IfcProtectiveDeviceTypeEnum.EARTHLEAKAGECIRCUITBREAKER +earthingswitch = IfcProtectiveDeviceTypeEnum.EARTHINGSWITCH +fusedisconnector = IfcProtectiveDeviceTypeEnum.FUSEDISCONNECTOR +residualcurrentcircuitbreaker = IfcProtectiveDeviceTypeEnum.RESIDUALCURRENTCIRCUITBREAKER +residualcurrentswitch = IfcProtectiveDeviceTypeEnum.RESIDUALCURRENTSWITCH +varistor = IfcProtectiveDeviceTypeEnum.VARISTOR +anti_arcing_device = IfcProtectiveDeviceTypeEnum.ANTI_ARCING_DEVICE +sparkgap = IfcProtectiveDeviceTypeEnum.SPARKGAP +voltagelimiter = IfcProtectiveDeviceTypeEnum.VOLTAGELIMITER +userdefined = IfcProtectiveDeviceTypeEnum.USERDEFINED +notdefined = IfcProtectiveDeviceTypeEnum.NOTDEFINED IfcPumpTypeEnum = enum_namespace() -circulator = express_getattr(IfcPumpTypeEnum, 'CIRCULATOR', INDETERMINATE) -endsuction = express_getattr(IfcPumpTypeEnum, 'ENDSUCTION', INDETERMINATE) -splitcase = express_getattr(IfcPumpTypeEnum, 'SPLITCASE', INDETERMINATE) -submersiblepump = express_getattr(IfcPumpTypeEnum, 'SUBMERSIBLEPUMP', INDETERMINATE) -sumppump = express_getattr(IfcPumpTypeEnum, 'SUMPPUMP', INDETERMINATE) -verticalinline = express_getattr(IfcPumpTypeEnum, 'VERTICALINLINE', INDETERMINATE) -verticalturbine = express_getattr(IfcPumpTypeEnum, 'VERTICALTURBINE', INDETERMINATE) -userdefined = express_getattr(IfcPumpTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPumpTypeEnum, 'NOTDEFINED', INDETERMINATE) +circulator = IfcPumpTypeEnum.CIRCULATOR +endsuction = IfcPumpTypeEnum.ENDSUCTION +splitcase = IfcPumpTypeEnum.SPLITCASE +submersiblepump = IfcPumpTypeEnum.SUBMERSIBLEPUMP +sumppump = IfcPumpTypeEnum.SUMPPUMP +verticalinline = IfcPumpTypeEnum.VERTICALINLINE +verticalturbine = IfcPumpTypeEnum.VERTICALTURBINE +userdefined = IfcPumpTypeEnum.USERDEFINED +notdefined = IfcPumpTypeEnum.NOTDEFINED IfcRailTypeEnum = enum_namespace() -rackrail = express_getattr(IfcRailTypeEnum, 'RACKRAIL', INDETERMINATE) -blade = express_getattr(IfcRailTypeEnum, 'BLADE', INDETERMINATE) -guardrail = express_getattr(IfcRailTypeEnum, 'GUARDRAIL', INDETERMINATE) -stockrail = express_getattr(IfcRailTypeEnum, 'STOCKRAIL', INDETERMINATE) -checkrail = express_getattr(IfcRailTypeEnum, 'CHECKRAIL', INDETERMINATE) -rail = express_getattr(IfcRailTypeEnum, 'RAIL', INDETERMINATE) -userdefined = express_getattr(IfcRailTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcRailTypeEnum, 'NOTDEFINED', INDETERMINATE) +rackrail = IfcRailTypeEnum.RACKRAIL +blade = IfcRailTypeEnum.BLADE +guardrail = IfcRailTypeEnum.GUARDRAIL +stockrail = IfcRailTypeEnum.STOCKRAIL +checkrail = IfcRailTypeEnum.CHECKRAIL +rail = IfcRailTypeEnum.RAIL +userdefined = IfcRailTypeEnum.USERDEFINED +notdefined = IfcRailTypeEnum.NOTDEFINED IfcRailingTypeEnum = enum_namespace() -handrail = express_getattr(IfcRailingTypeEnum, 'HANDRAIL', INDETERMINATE) -guardrail = express_getattr(IfcRailingTypeEnum, 'GUARDRAIL', INDETERMINATE) -balustrade = express_getattr(IfcRailingTypeEnum, 'BALUSTRADE', INDETERMINATE) -fence = express_getattr(IfcRailingTypeEnum, 'FENCE', INDETERMINATE) -userdefined = express_getattr(IfcRailingTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcRailingTypeEnum, 'NOTDEFINED', INDETERMINATE) +handrail = IfcRailingTypeEnum.HANDRAIL +guardrail = IfcRailingTypeEnum.GUARDRAIL +balustrade = IfcRailingTypeEnum.BALUSTRADE +fence = IfcRailingTypeEnum.FENCE +userdefined = IfcRailingTypeEnum.USERDEFINED +notdefined = IfcRailingTypeEnum.NOTDEFINED IfcRailwayPartTypeEnum = enum_namespace() -trackstructure = express_getattr(IfcRailwayPartTypeEnum, 'TRACKSTRUCTURE', INDETERMINATE) -trackstructurepart = express_getattr(IfcRailwayPartTypeEnum, 'TRACKSTRUCTUREPART', INDETERMINATE) -linesidestructurepart = express_getattr(IfcRailwayPartTypeEnum, 'LINESIDESTRUCTUREPART', INDETERMINATE) -dilatationsuperstructure = express_getattr(IfcRailwayPartTypeEnum, 'DILATATIONSUPERSTRUCTURE', INDETERMINATE) -plaintracksupestructure = express_getattr(IfcRailwayPartTypeEnum, 'PLAINTRACKSUPESTRUCTURE', INDETERMINATE) -linesidestructure = express_getattr(IfcRailwayPartTypeEnum, 'LINESIDESTRUCTURE', INDETERMINATE) -superstructure = express_getattr(IfcRailwayPartTypeEnum, 'SUPERSTRUCTURE', INDETERMINATE) -turnoutsuperstructure = express_getattr(IfcRailwayPartTypeEnum, 'TURNOUTSUPERSTRUCTURE', INDETERMINATE) -userdefined = express_getattr(IfcRailwayPartTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcRailwayPartTypeEnum, 'NOTDEFINED', INDETERMINATE) +trackstructure = IfcRailwayPartTypeEnum.TRACKSTRUCTURE +trackstructurepart = IfcRailwayPartTypeEnum.TRACKSTRUCTUREPART +linesidestructurepart = IfcRailwayPartTypeEnum.LINESIDESTRUCTUREPART +dilatationsuperstructure = IfcRailwayPartTypeEnum.DILATATIONSUPERSTRUCTURE +plaintracksupestructure = IfcRailwayPartTypeEnum.PLAINTRACKSUPESTRUCTURE +linesidestructure = IfcRailwayPartTypeEnum.LINESIDESTRUCTURE +superstructure = IfcRailwayPartTypeEnum.SUPERSTRUCTURE +turnoutsuperstructure = IfcRailwayPartTypeEnum.TURNOUTSUPERSTRUCTURE +userdefined = IfcRailwayPartTypeEnum.USERDEFINED +notdefined = IfcRailwayPartTypeEnum.NOTDEFINED IfcRailwayTypeEnum = enum_namespace() -userdefined = express_getattr(IfcRailwayTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcRailwayTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcRailwayTypeEnum.USERDEFINED +notdefined = IfcRailwayTypeEnum.NOTDEFINED IfcRampFlightTypeEnum = enum_namespace() -straight = express_getattr(IfcRampFlightTypeEnum, 'STRAIGHT', INDETERMINATE) -spiral = express_getattr(IfcRampFlightTypeEnum, 'SPIRAL', INDETERMINATE) -userdefined = express_getattr(IfcRampFlightTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcRampFlightTypeEnum, 'NOTDEFINED', INDETERMINATE) +straight = IfcRampFlightTypeEnum.STRAIGHT +spiral = IfcRampFlightTypeEnum.SPIRAL +userdefined = IfcRampFlightTypeEnum.USERDEFINED +notdefined = IfcRampFlightTypeEnum.NOTDEFINED IfcRampTypeEnum = enum_namespace() -straight_run_ramp = express_getattr(IfcRampTypeEnum, 'STRAIGHT_RUN_RAMP', INDETERMINATE) -two_straight_run_ramp = express_getattr(IfcRampTypeEnum, 'TWO_STRAIGHT_RUN_RAMP', INDETERMINATE) -quarter_turn_ramp = express_getattr(IfcRampTypeEnum, 'QUARTER_TURN_RAMP', INDETERMINATE) -two_quarter_turn_ramp = express_getattr(IfcRampTypeEnum, 'TWO_QUARTER_TURN_RAMP', INDETERMINATE) -half_turn_ramp = express_getattr(IfcRampTypeEnum, 'HALF_TURN_RAMP', INDETERMINATE) -spiral_ramp = express_getattr(IfcRampTypeEnum, 'SPIRAL_RAMP', INDETERMINATE) -userdefined = express_getattr(IfcRampTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcRampTypeEnum, 'NOTDEFINED', INDETERMINATE) +straight_run_ramp = IfcRampTypeEnum.STRAIGHT_RUN_RAMP +two_straight_run_ramp = IfcRampTypeEnum.TWO_STRAIGHT_RUN_RAMP +quarter_turn_ramp = IfcRampTypeEnum.QUARTER_TURN_RAMP +two_quarter_turn_ramp = IfcRampTypeEnum.TWO_QUARTER_TURN_RAMP +half_turn_ramp = IfcRampTypeEnum.HALF_TURN_RAMP +spiral_ramp = IfcRampTypeEnum.SPIRAL_RAMP +userdefined = IfcRampTypeEnum.USERDEFINED +notdefined = IfcRampTypeEnum.NOTDEFINED IfcRecurrenceTypeEnum = enum_namespace() -daily = express_getattr(IfcRecurrenceTypeEnum, 'DAILY', INDETERMINATE) -weekly = express_getattr(IfcRecurrenceTypeEnum, 'WEEKLY', INDETERMINATE) -monthly_by_day_of_month = express_getattr(IfcRecurrenceTypeEnum, 'MONTHLY_BY_DAY_OF_MONTH', INDETERMINATE) -monthly_by_position = express_getattr(IfcRecurrenceTypeEnum, 'MONTHLY_BY_POSITION', INDETERMINATE) -by_day_count = express_getattr(IfcRecurrenceTypeEnum, 'BY_DAY_COUNT', INDETERMINATE) -by_weekday_count = express_getattr(IfcRecurrenceTypeEnum, 'BY_WEEKDAY_COUNT', INDETERMINATE) -yearly_by_day_of_month = express_getattr(IfcRecurrenceTypeEnum, 'YEARLY_BY_DAY_OF_MONTH', INDETERMINATE) -yearly_by_position = express_getattr(IfcRecurrenceTypeEnum, 'YEARLY_BY_POSITION', INDETERMINATE) +daily = IfcRecurrenceTypeEnum.DAILY +weekly = IfcRecurrenceTypeEnum.WEEKLY +monthly_by_day_of_month = IfcRecurrenceTypeEnum.MONTHLY_BY_DAY_OF_MONTH +monthly_by_position = IfcRecurrenceTypeEnum.MONTHLY_BY_POSITION +by_day_count = IfcRecurrenceTypeEnum.BY_DAY_COUNT +by_weekday_count = IfcRecurrenceTypeEnum.BY_WEEKDAY_COUNT +yearly_by_day_of_month = IfcRecurrenceTypeEnum.YEARLY_BY_DAY_OF_MONTH +yearly_by_position = IfcRecurrenceTypeEnum.YEARLY_BY_POSITION IfcReferentTypeEnum = enum_namespace() -kilopoint = express_getattr(IfcReferentTypeEnum, 'KILOPOINT', INDETERMINATE) -milepoint = express_getattr(IfcReferentTypeEnum, 'MILEPOINT', INDETERMINATE) -station = express_getattr(IfcReferentTypeEnum, 'STATION', INDETERMINATE) -referencemarker = express_getattr(IfcReferentTypeEnum, 'REFERENCEMARKER', INDETERMINATE) -userdefined = express_getattr(IfcReferentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcReferentTypeEnum, 'NOTDEFINED', INDETERMINATE) +kilopoint = IfcReferentTypeEnum.KILOPOINT +milepoint = IfcReferentTypeEnum.MILEPOINT +station = IfcReferentTypeEnum.STATION +referencemarker = IfcReferentTypeEnum.REFERENCEMARKER +userdefined = IfcReferentTypeEnum.USERDEFINED +notdefined = IfcReferentTypeEnum.NOTDEFINED IfcReflectanceMethodEnum = enum_namespace() -blinn = express_getattr(IfcReflectanceMethodEnum, 'BLINN', INDETERMINATE) -flat = express_getattr(IfcReflectanceMethodEnum, 'FLAT', INDETERMINATE) -glass = express_getattr(IfcReflectanceMethodEnum, 'GLASS', INDETERMINATE) -matt = express_getattr(IfcReflectanceMethodEnum, 'MATT', INDETERMINATE) -metal = express_getattr(IfcReflectanceMethodEnum, 'METAL', INDETERMINATE) -mirror = express_getattr(IfcReflectanceMethodEnum, 'MIRROR', INDETERMINATE) -phong = express_getattr(IfcReflectanceMethodEnum, 'PHONG', INDETERMINATE) -plastic = express_getattr(IfcReflectanceMethodEnum, 'PLASTIC', INDETERMINATE) -strauss = express_getattr(IfcReflectanceMethodEnum, 'STRAUSS', INDETERMINATE) -notdefined = express_getattr(IfcReflectanceMethodEnum, 'NOTDEFINED', INDETERMINATE) +blinn = IfcReflectanceMethodEnum.BLINN +flat = IfcReflectanceMethodEnum.FLAT +glass = IfcReflectanceMethodEnum.GLASS +matt = IfcReflectanceMethodEnum.MATT +metal = IfcReflectanceMethodEnum.METAL +mirror = IfcReflectanceMethodEnum.MIRROR +phong = IfcReflectanceMethodEnum.PHONG +plastic = IfcReflectanceMethodEnum.PLASTIC +strauss = IfcReflectanceMethodEnum.STRAUSS +notdefined = IfcReflectanceMethodEnum.NOTDEFINED IfcReinforcedSoilTypeEnum = enum_namespace() -surchargepreloaded = express_getattr(IfcReinforcedSoilTypeEnum, 'SURCHARGEPRELOADED', INDETERMINATE) -verticallydrained = express_getattr(IfcReinforcedSoilTypeEnum, 'VERTICALLYDRAINED', INDETERMINATE) -dynamicallycompacted = express_getattr(IfcReinforcedSoilTypeEnum, 'DYNAMICALLYCOMPACTED', INDETERMINATE) -replaced = express_getattr(IfcReinforcedSoilTypeEnum, 'REPLACED', INDETERMINATE) -rollercompacted = express_getattr(IfcReinforcedSoilTypeEnum, 'ROLLERCOMPACTED', INDETERMINATE) -grouted = express_getattr(IfcReinforcedSoilTypeEnum, 'GROUTED', INDETERMINATE) -userdefined = express_getattr(IfcReinforcedSoilTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcReinforcedSoilTypeEnum, 'NOTDEFINED', INDETERMINATE) +surchargepreloaded = IfcReinforcedSoilTypeEnum.SURCHARGEPRELOADED +verticallydrained = IfcReinforcedSoilTypeEnum.VERTICALLYDRAINED +dynamicallycompacted = IfcReinforcedSoilTypeEnum.DYNAMICALLYCOMPACTED +replaced = IfcReinforcedSoilTypeEnum.REPLACED +rollercompacted = IfcReinforcedSoilTypeEnum.ROLLERCOMPACTED +grouted = IfcReinforcedSoilTypeEnum.GROUTED +userdefined = IfcReinforcedSoilTypeEnum.USERDEFINED +notdefined = IfcReinforcedSoilTypeEnum.NOTDEFINED IfcReinforcingBarRoleEnum = enum_namespace() -main = express_getattr(IfcReinforcingBarRoleEnum, 'MAIN', INDETERMINATE) -shear = express_getattr(IfcReinforcingBarRoleEnum, 'SHEAR', INDETERMINATE) -ligature = express_getattr(IfcReinforcingBarRoleEnum, 'LIGATURE', INDETERMINATE) -stud = express_getattr(IfcReinforcingBarRoleEnum, 'STUD', INDETERMINATE) -punching = express_getattr(IfcReinforcingBarRoleEnum, 'PUNCHING', INDETERMINATE) -edge = express_getattr(IfcReinforcingBarRoleEnum, 'EDGE', INDETERMINATE) -ring = express_getattr(IfcReinforcingBarRoleEnum, 'RING', INDETERMINATE) -anchoring = express_getattr(IfcReinforcingBarRoleEnum, 'ANCHORING', INDETERMINATE) -userdefined = express_getattr(IfcReinforcingBarRoleEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcReinforcingBarRoleEnum, 'NOTDEFINED', INDETERMINATE) +main = IfcReinforcingBarRoleEnum.MAIN +shear = IfcReinforcingBarRoleEnum.SHEAR +ligature = IfcReinforcingBarRoleEnum.LIGATURE +stud = IfcReinforcingBarRoleEnum.STUD +punching = IfcReinforcingBarRoleEnum.PUNCHING +edge = IfcReinforcingBarRoleEnum.EDGE +ring = IfcReinforcingBarRoleEnum.RING +anchoring = IfcReinforcingBarRoleEnum.ANCHORING +userdefined = IfcReinforcingBarRoleEnum.USERDEFINED +notdefined = IfcReinforcingBarRoleEnum.NOTDEFINED IfcReinforcingBarSurfaceEnum = enum_namespace() -plain = express_getattr(IfcReinforcingBarSurfaceEnum, 'PLAIN', INDETERMINATE) -textured = express_getattr(IfcReinforcingBarSurfaceEnum, 'TEXTURED', INDETERMINATE) +plain = IfcReinforcingBarSurfaceEnum.PLAIN +textured = IfcReinforcingBarSurfaceEnum.TEXTURED IfcReinforcingBarTypeEnum = enum_namespace() -anchoring = express_getattr(IfcReinforcingBarTypeEnum, 'ANCHORING', INDETERMINATE) -edge = express_getattr(IfcReinforcingBarTypeEnum, 'EDGE', INDETERMINATE) -ligature = express_getattr(IfcReinforcingBarTypeEnum, 'LIGATURE', INDETERMINATE) -main = express_getattr(IfcReinforcingBarTypeEnum, 'MAIN', INDETERMINATE) -punching = express_getattr(IfcReinforcingBarTypeEnum, 'PUNCHING', INDETERMINATE) -ring = express_getattr(IfcReinforcingBarTypeEnum, 'RING', INDETERMINATE) -shear = express_getattr(IfcReinforcingBarTypeEnum, 'SHEAR', INDETERMINATE) -stud = express_getattr(IfcReinforcingBarTypeEnum, 'STUD', INDETERMINATE) -spacebar = express_getattr(IfcReinforcingBarTypeEnum, 'SPACEBAR', INDETERMINATE) -userdefined = express_getattr(IfcReinforcingBarTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcReinforcingBarTypeEnum, 'NOTDEFINED', INDETERMINATE) +anchoring = IfcReinforcingBarTypeEnum.ANCHORING +edge = IfcReinforcingBarTypeEnum.EDGE +ligature = IfcReinforcingBarTypeEnum.LIGATURE +main = IfcReinforcingBarTypeEnum.MAIN +punching = IfcReinforcingBarTypeEnum.PUNCHING +ring = IfcReinforcingBarTypeEnum.RING +shear = IfcReinforcingBarTypeEnum.SHEAR +stud = IfcReinforcingBarTypeEnum.STUD +spacebar = IfcReinforcingBarTypeEnum.SPACEBAR +userdefined = IfcReinforcingBarTypeEnum.USERDEFINED +notdefined = IfcReinforcingBarTypeEnum.NOTDEFINED IfcReinforcingMeshTypeEnum = enum_namespace() -userdefined = express_getattr(IfcReinforcingMeshTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcReinforcingMeshTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcReinforcingMeshTypeEnum.USERDEFINED +notdefined = IfcReinforcingMeshTypeEnum.NOTDEFINED IfcRoadPartTypeEnum = enum_namespace() -roadsidepart = express_getattr(IfcRoadPartTypeEnum, 'ROADSIDEPART', INDETERMINATE) -bus_stop = express_getattr(IfcRoadPartTypeEnum, 'BUS_STOP', INDETERMINATE) -hardshoulder = express_getattr(IfcRoadPartTypeEnum, 'HARDSHOULDER', INDETERMINATE) -intersection = express_getattr(IfcRoadPartTypeEnum, 'INTERSECTION', INDETERMINATE) -passingbay = express_getattr(IfcRoadPartTypeEnum, 'PASSINGBAY', INDETERMINATE) -roadwayplateau = express_getattr(IfcRoadPartTypeEnum, 'ROADWAYPLATEAU', INDETERMINATE) -roadside = express_getattr(IfcRoadPartTypeEnum, 'ROADSIDE', INDETERMINATE) -refugeisland = express_getattr(IfcRoadPartTypeEnum, 'REFUGEISLAND', INDETERMINATE) -tollplaza = express_getattr(IfcRoadPartTypeEnum, 'TOLLPLAZA', INDETERMINATE) -centralreserve = express_getattr(IfcRoadPartTypeEnum, 'CENTRALRESERVE', INDETERMINATE) -sidewalk = express_getattr(IfcRoadPartTypeEnum, 'SIDEWALK', INDETERMINATE) -parkingbay = express_getattr(IfcRoadPartTypeEnum, 'PARKINGBAY', INDETERMINATE) -railwaycrossing = express_getattr(IfcRoadPartTypeEnum, 'RAILWAYCROSSING', INDETERMINATE) -pedestrian_crossing = express_getattr(IfcRoadPartTypeEnum, 'PEDESTRIAN_CROSSING', INDETERMINATE) -softshoulder = express_getattr(IfcRoadPartTypeEnum, 'SOFTSHOULDER', INDETERMINATE) -bicyclecrossing = express_getattr(IfcRoadPartTypeEnum, 'BICYCLECROSSING', INDETERMINATE) -centralisland = express_getattr(IfcRoadPartTypeEnum, 'CENTRALISLAND', INDETERMINATE) -shoulder = express_getattr(IfcRoadPartTypeEnum, 'SHOULDER', INDETERMINATE) -trafficlane = express_getattr(IfcRoadPartTypeEnum, 'TRAFFICLANE', INDETERMINATE) -roadsegment = express_getattr(IfcRoadPartTypeEnum, 'ROADSEGMENT', INDETERMINATE) -roundabout = express_getattr(IfcRoadPartTypeEnum, 'ROUNDABOUT', INDETERMINATE) -layby = express_getattr(IfcRoadPartTypeEnum, 'LAYBY', INDETERMINATE) -carriageway = express_getattr(IfcRoadPartTypeEnum, 'CARRIAGEWAY', INDETERMINATE) -trafficisland = express_getattr(IfcRoadPartTypeEnum, 'TRAFFICISLAND', INDETERMINATE) -userdefined = express_getattr(IfcRoadPartTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcRoadPartTypeEnum, 'NOTDEFINED', INDETERMINATE) +roadsidepart = IfcRoadPartTypeEnum.ROADSIDEPART +bus_stop = IfcRoadPartTypeEnum.BUS_STOP +hardshoulder = IfcRoadPartTypeEnum.HARDSHOULDER +intersection = IfcRoadPartTypeEnum.INTERSECTION +passingbay = IfcRoadPartTypeEnum.PASSINGBAY +roadwayplateau = IfcRoadPartTypeEnum.ROADWAYPLATEAU +roadside = IfcRoadPartTypeEnum.ROADSIDE +refugeisland = IfcRoadPartTypeEnum.REFUGEISLAND +tollplaza = IfcRoadPartTypeEnum.TOLLPLAZA +centralreserve = IfcRoadPartTypeEnum.CENTRALRESERVE +sidewalk = IfcRoadPartTypeEnum.SIDEWALK +parkingbay = IfcRoadPartTypeEnum.PARKINGBAY +railwaycrossing = IfcRoadPartTypeEnum.RAILWAYCROSSING +pedestrian_crossing = IfcRoadPartTypeEnum.PEDESTRIAN_CROSSING +softshoulder = IfcRoadPartTypeEnum.SOFTSHOULDER +bicyclecrossing = IfcRoadPartTypeEnum.BICYCLECROSSING +centralisland = IfcRoadPartTypeEnum.CENTRALISLAND +shoulder = IfcRoadPartTypeEnum.SHOULDER +trafficlane = IfcRoadPartTypeEnum.TRAFFICLANE +roadsegment = IfcRoadPartTypeEnum.ROADSEGMENT +roundabout = IfcRoadPartTypeEnum.ROUNDABOUT +layby = IfcRoadPartTypeEnum.LAYBY +carriageway = IfcRoadPartTypeEnum.CARRIAGEWAY +trafficisland = IfcRoadPartTypeEnum.TRAFFICISLAND +userdefined = IfcRoadPartTypeEnum.USERDEFINED +notdefined = IfcRoadPartTypeEnum.NOTDEFINED IfcRoadTypeEnum = enum_namespace() -userdefined = express_getattr(IfcRoadTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcRoadTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcRoadTypeEnum.USERDEFINED +notdefined = IfcRoadTypeEnum.NOTDEFINED IfcRoleEnum = enum_namespace() -supplier = express_getattr(IfcRoleEnum, 'SUPPLIER', INDETERMINATE) -manufacturer = express_getattr(IfcRoleEnum, 'MANUFACTURER', INDETERMINATE) -contractor = express_getattr(IfcRoleEnum, 'CONTRACTOR', INDETERMINATE) -subcontractor = express_getattr(IfcRoleEnum, 'SUBCONTRACTOR', INDETERMINATE) -architect = express_getattr(IfcRoleEnum, 'ARCHITECT', INDETERMINATE) -structuralengineer = express_getattr(IfcRoleEnum, 'STRUCTURALENGINEER', INDETERMINATE) -costengineer = express_getattr(IfcRoleEnum, 'COSTENGINEER', INDETERMINATE) -client = express_getattr(IfcRoleEnum, 'CLIENT', INDETERMINATE) -buildingowner = express_getattr(IfcRoleEnum, 'BUILDINGOWNER', INDETERMINATE) -buildingoperator = express_getattr(IfcRoleEnum, 'BUILDINGOPERATOR', INDETERMINATE) -mechanicalengineer = express_getattr(IfcRoleEnum, 'MECHANICALENGINEER', INDETERMINATE) -electricalengineer = express_getattr(IfcRoleEnum, 'ELECTRICALENGINEER', INDETERMINATE) -projectmanager = express_getattr(IfcRoleEnum, 'PROJECTMANAGER', INDETERMINATE) -facilitiesmanager = express_getattr(IfcRoleEnum, 'FACILITIESMANAGER', INDETERMINATE) -civilengineer = express_getattr(IfcRoleEnum, 'CIVILENGINEER', INDETERMINATE) -commissioningengineer = express_getattr(IfcRoleEnum, 'COMMISSIONINGENGINEER', INDETERMINATE) -engineer = express_getattr(IfcRoleEnum, 'ENGINEER', INDETERMINATE) -owner = express_getattr(IfcRoleEnum, 'OWNER', INDETERMINATE) -consultant = express_getattr(IfcRoleEnum, 'CONSULTANT', INDETERMINATE) -constructionmanager = express_getattr(IfcRoleEnum, 'CONSTRUCTIONMANAGER', INDETERMINATE) -fieldconstructionmanager = express_getattr(IfcRoleEnum, 'FIELDCONSTRUCTIONMANAGER', INDETERMINATE) -reseller = express_getattr(IfcRoleEnum, 'RESELLER', INDETERMINATE) -userdefined = express_getattr(IfcRoleEnum, 'USERDEFINED', INDETERMINATE) +supplier = IfcRoleEnum.SUPPLIER +manufacturer = IfcRoleEnum.MANUFACTURER +contractor = IfcRoleEnum.CONTRACTOR +subcontractor = IfcRoleEnum.SUBCONTRACTOR +architect = IfcRoleEnum.ARCHITECT +structuralengineer = IfcRoleEnum.STRUCTURALENGINEER +costengineer = IfcRoleEnum.COSTENGINEER +client = IfcRoleEnum.CLIENT +buildingowner = IfcRoleEnum.BUILDINGOWNER +buildingoperator = IfcRoleEnum.BUILDINGOPERATOR +mechanicalengineer = IfcRoleEnum.MECHANICALENGINEER +electricalengineer = IfcRoleEnum.ELECTRICALENGINEER +projectmanager = IfcRoleEnum.PROJECTMANAGER +facilitiesmanager = IfcRoleEnum.FACILITIESMANAGER +civilengineer = IfcRoleEnum.CIVILENGINEER +commissioningengineer = IfcRoleEnum.COMMISSIONINGENGINEER +engineer = IfcRoleEnum.ENGINEER +owner = IfcRoleEnum.OWNER +consultant = IfcRoleEnum.CONSULTANT +constructionmanager = IfcRoleEnum.CONSTRUCTIONMANAGER +fieldconstructionmanager = IfcRoleEnum.FIELDCONSTRUCTIONMANAGER +reseller = IfcRoleEnum.RESELLER +userdefined = IfcRoleEnum.USERDEFINED IfcRoofTypeEnum = enum_namespace() -flat_roof = express_getattr(IfcRoofTypeEnum, 'FLAT_ROOF', INDETERMINATE) -shed_roof = express_getattr(IfcRoofTypeEnum, 'SHED_ROOF', INDETERMINATE) -gable_roof = express_getattr(IfcRoofTypeEnum, 'GABLE_ROOF', INDETERMINATE) -hip_roof = express_getattr(IfcRoofTypeEnum, 'HIP_ROOF', INDETERMINATE) -hipped_gable_roof = express_getattr(IfcRoofTypeEnum, 'HIPPED_GABLE_ROOF', INDETERMINATE) -gambrel_roof = express_getattr(IfcRoofTypeEnum, 'GAMBREL_ROOF', INDETERMINATE) -mansard_roof = express_getattr(IfcRoofTypeEnum, 'MANSARD_ROOF', INDETERMINATE) -barrel_roof = express_getattr(IfcRoofTypeEnum, 'BARREL_ROOF', INDETERMINATE) -rainbow_roof = express_getattr(IfcRoofTypeEnum, 'RAINBOW_ROOF', INDETERMINATE) -butterfly_roof = express_getattr(IfcRoofTypeEnum, 'BUTTERFLY_ROOF', INDETERMINATE) -pavilion_roof = express_getattr(IfcRoofTypeEnum, 'PAVILION_ROOF', INDETERMINATE) -dome_roof = express_getattr(IfcRoofTypeEnum, 'DOME_ROOF', INDETERMINATE) -freeform = express_getattr(IfcRoofTypeEnum, 'FREEFORM', INDETERMINATE) -userdefined = express_getattr(IfcRoofTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcRoofTypeEnum, 'NOTDEFINED', INDETERMINATE) +flat_roof = IfcRoofTypeEnum.FLAT_ROOF +shed_roof = IfcRoofTypeEnum.SHED_ROOF +gable_roof = IfcRoofTypeEnum.GABLE_ROOF +hip_roof = IfcRoofTypeEnum.HIP_ROOF +hipped_gable_roof = IfcRoofTypeEnum.HIPPED_GABLE_ROOF +gambrel_roof = IfcRoofTypeEnum.GAMBREL_ROOF +mansard_roof = IfcRoofTypeEnum.MANSARD_ROOF +barrel_roof = IfcRoofTypeEnum.BARREL_ROOF +rainbow_roof = IfcRoofTypeEnum.RAINBOW_ROOF +butterfly_roof = IfcRoofTypeEnum.BUTTERFLY_ROOF +pavilion_roof = IfcRoofTypeEnum.PAVILION_ROOF +dome_roof = IfcRoofTypeEnum.DOME_ROOF +freeform = IfcRoofTypeEnum.FREEFORM +userdefined = IfcRoofTypeEnum.USERDEFINED +notdefined = IfcRoofTypeEnum.NOTDEFINED IfcSIPrefix = enum_namespace() -exa = express_getattr(IfcSIPrefix, 'EXA', INDETERMINATE) -peta = express_getattr(IfcSIPrefix, 'PETA', INDETERMINATE) -tera = express_getattr(IfcSIPrefix, 'TERA', INDETERMINATE) -giga = express_getattr(IfcSIPrefix, 'GIGA', INDETERMINATE) -mega = express_getattr(IfcSIPrefix, 'MEGA', INDETERMINATE) -kilo = express_getattr(IfcSIPrefix, 'KILO', INDETERMINATE) -hecto = express_getattr(IfcSIPrefix, 'HECTO', INDETERMINATE) -deca = express_getattr(IfcSIPrefix, 'DECA', INDETERMINATE) -deci = express_getattr(IfcSIPrefix, 'DECI', INDETERMINATE) -centi = express_getattr(IfcSIPrefix, 'CENTI', INDETERMINATE) -milli = express_getattr(IfcSIPrefix, 'MILLI', INDETERMINATE) -micro = express_getattr(IfcSIPrefix, 'MICRO', INDETERMINATE) -nano = express_getattr(IfcSIPrefix, 'NANO', INDETERMINATE) -pico = express_getattr(IfcSIPrefix, 'PICO', INDETERMINATE) -femto = express_getattr(IfcSIPrefix, 'FEMTO', INDETERMINATE) -atto = express_getattr(IfcSIPrefix, 'ATTO', INDETERMINATE) +exa = IfcSIPrefix.EXA +peta = IfcSIPrefix.PETA +tera = IfcSIPrefix.TERA +giga = IfcSIPrefix.GIGA +mega = IfcSIPrefix.MEGA +kilo = IfcSIPrefix.KILO +hecto = IfcSIPrefix.HECTO +deca = IfcSIPrefix.DECA +deci = IfcSIPrefix.DECI +centi = IfcSIPrefix.CENTI +milli = IfcSIPrefix.MILLI +micro = IfcSIPrefix.MICRO +nano = IfcSIPrefix.NANO +pico = IfcSIPrefix.PICO +femto = IfcSIPrefix.FEMTO +atto = IfcSIPrefix.ATTO IfcSIUnitName = enum_namespace() -ampere = express_getattr(IfcSIUnitName, 'AMPERE', INDETERMINATE) -becquerel = express_getattr(IfcSIUnitName, 'BECQUEREL', INDETERMINATE) -candela = express_getattr(IfcSIUnitName, 'CANDELA', INDETERMINATE) -coulomb = express_getattr(IfcSIUnitName, 'COULOMB', INDETERMINATE) -cubic_metre = express_getattr(IfcSIUnitName, 'CUBIC_METRE', INDETERMINATE) -degree_celsius = express_getattr(IfcSIUnitName, 'DEGREE_CELSIUS', INDETERMINATE) -farad = express_getattr(IfcSIUnitName, 'FARAD', INDETERMINATE) -gram = express_getattr(IfcSIUnitName, 'GRAM', INDETERMINATE) -gray = express_getattr(IfcSIUnitName, 'GRAY', INDETERMINATE) -henry = express_getattr(IfcSIUnitName, 'HENRY', INDETERMINATE) -hertz = express_getattr(IfcSIUnitName, 'HERTZ', INDETERMINATE) -joule = express_getattr(IfcSIUnitName, 'JOULE', INDETERMINATE) -kelvin = express_getattr(IfcSIUnitName, 'KELVIN', INDETERMINATE) -lumen = express_getattr(IfcSIUnitName, 'LUMEN', INDETERMINATE) -lux = express_getattr(IfcSIUnitName, 'LUX', INDETERMINATE) -metre = express_getattr(IfcSIUnitName, 'METRE', INDETERMINATE) -mole = express_getattr(IfcSIUnitName, 'MOLE', INDETERMINATE) -newton = express_getattr(IfcSIUnitName, 'NEWTON', INDETERMINATE) -ohm = express_getattr(IfcSIUnitName, 'OHM', INDETERMINATE) -pascal = express_getattr(IfcSIUnitName, 'PASCAL', INDETERMINATE) -radian = express_getattr(IfcSIUnitName, 'RADIAN', INDETERMINATE) -second = express_getattr(IfcSIUnitName, 'SECOND', INDETERMINATE) -siemens = express_getattr(IfcSIUnitName, 'SIEMENS', INDETERMINATE) -sievert = express_getattr(IfcSIUnitName, 'SIEVERT', INDETERMINATE) -square_metre = express_getattr(IfcSIUnitName, 'SQUARE_METRE', INDETERMINATE) -steradian = express_getattr(IfcSIUnitName, 'STERADIAN', INDETERMINATE) -tesla = express_getattr(IfcSIUnitName, 'TESLA', INDETERMINATE) -volt = express_getattr(IfcSIUnitName, 'VOLT', INDETERMINATE) -watt = express_getattr(IfcSIUnitName, 'WATT', INDETERMINATE) -weber = express_getattr(IfcSIUnitName, 'WEBER', INDETERMINATE) +ampere = IfcSIUnitName.AMPERE +becquerel = IfcSIUnitName.BECQUEREL +candela = IfcSIUnitName.CANDELA +coulomb = IfcSIUnitName.COULOMB +cubic_metre = IfcSIUnitName.CUBIC_METRE +degree_celsius = IfcSIUnitName.DEGREE_CELSIUS +farad = IfcSIUnitName.FARAD +gram = IfcSIUnitName.GRAM +gray = IfcSIUnitName.GRAY +henry = IfcSIUnitName.HENRY +hertz = IfcSIUnitName.HERTZ +joule = IfcSIUnitName.JOULE +kelvin = IfcSIUnitName.KELVIN +lumen = IfcSIUnitName.LUMEN +lux = IfcSIUnitName.LUX +metre = IfcSIUnitName.METRE +mole = IfcSIUnitName.MOLE +newton = IfcSIUnitName.NEWTON +ohm = IfcSIUnitName.OHM +pascal = IfcSIUnitName.PASCAL +radian = IfcSIUnitName.RADIAN +second = IfcSIUnitName.SECOND +siemens = IfcSIUnitName.SIEMENS +sievert = IfcSIUnitName.SIEVERT +square_metre = IfcSIUnitName.SQUARE_METRE +steradian = IfcSIUnitName.STERADIAN +tesla = IfcSIUnitName.TESLA +volt = IfcSIUnitName.VOLT +watt = IfcSIUnitName.WATT +weber = IfcSIUnitName.WEBER IfcSanitaryTerminalTypeEnum = enum_namespace() -bath = express_getattr(IfcSanitaryTerminalTypeEnum, 'BATH', INDETERMINATE) -bidet = express_getattr(IfcSanitaryTerminalTypeEnum, 'BIDET', INDETERMINATE) -cistern = express_getattr(IfcSanitaryTerminalTypeEnum, 'CISTERN', INDETERMINATE) -shower = express_getattr(IfcSanitaryTerminalTypeEnum, 'SHOWER', INDETERMINATE) -sink = express_getattr(IfcSanitaryTerminalTypeEnum, 'SINK', INDETERMINATE) -sanitaryfountain = express_getattr(IfcSanitaryTerminalTypeEnum, 'SANITARYFOUNTAIN', INDETERMINATE) -toiletpan = express_getattr(IfcSanitaryTerminalTypeEnum, 'TOILETPAN', INDETERMINATE) -urinal = express_getattr(IfcSanitaryTerminalTypeEnum, 'URINAL', INDETERMINATE) -washhandbasin = express_getattr(IfcSanitaryTerminalTypeEnum, 'WASHHANDBASIN', INDETERMINATE) -wcseat = express_getattr(IfcSanitaryTerminalTypeEnum, 'WCSEAT', INDETERMINATE) -userdefined = express_getattr(IfcSanitaryTerminalTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSanitaryTerminalTypeEnum, 'NOTDEFINED', INDETERMINATE) +bath = IfcSanitaryTerminalTypeEnum.BATH +bidet = IfcSanitaryTerminalTypeEnum.BIDET +cistern = IfcSanitaryTerminalTypeEnum.CISTERN +shower = IfcSanitaryTerminalTypeEnum.SHOWER +sink = IfcSanitaryTerminalTypeEnum.SINK +sanitaryfountain = IfcSanitaryTerminalTypeEnum.SANITARYFOUNTAIN +toiletpan = IfcSanitaryTerminalTypeEnum.TOILETPAN +urinal = IfcSanitaryTerminalTypeEnum.URINAL +washhandbasin = IfcSanitaryTerminalTypeEnum.WASHHANDBASIN +wcseat = IfcSanitaryTerminalTypeEnum.WCSEAT +userdefined = IfcSanitaryTerminalTypeEnum.USERDEFINED +notdefined = IfcSanitaryTerminalTypeEnum.NOTDEFINED IfcSectionTypeEnum = enum_namespace() -uniform = express_getattr(IfcSectionTypeEnum, 'UNIFORM', INDETERMINATE) -tapered = express_getattr(IfcSectionTypeEnum, 'TAPERED', INDETERMINATE) +uniform = IfcSectionTypeEnum.UNIFORM +tapered = IfcSectionTypeEnum.TAPERED IfcSensorTypeEnum = enum_namespace() -cosensor = express_getattr(IfcSensorTypeEnum, 'COSENSOR', INDETERMINATE) -co2sensor = express_getattr(IfcSensorTypeEnum, 'CO2SENSOR', INDETERMINATE) -conductancesensor = express_getattr(IfcSensorTypeEnum, 'CONDUCTANCESENSOR', INDETERMINATE) -contactsensor = express_getattr(IfcSensorTypeEnum, 'CONTACTSENSOR', INDETERMINATE) -firesensor = express_getattr(IfcSensorTypeEnum, 'FIRESENSOR', INDETERMINATE) -flowsensor = express_getattr(IfcSensorTypeEnum, 'FLOWSENSOR', INDETERMINATE) -frostsensor = express_getattr(IfcSensorTypeEnum, 'FROSTSENSOR', INDETERMINATE) -gassensor = express_getattr(IfcSensorTypeEnum, 'GASSENSOR', INDETERMINATE) -heatsensor = express_getattr(IfcSensorTypeEnum, 'HEATSENSOR', INDETERMINATE) -humiditysensor = express_getattr(IfcSensorTypeEnum, 'HUMIDITYSENSOR', INDETERMINATE) -identifiersensor = express_getattr(IfcSensorTypeEnum, 'IDENTIFIERSENSOR', INDETERMINATE) -ionconcentrationsensor = express_getattr(IfcSensorTypeEnum, 'IONCONCENTRATIONSENSOR', INDETERMINATE) -levelsensor = express_getattr(IfcSensorTypeEnum, 'LEVELSENSOR', INDETERMINATE) -lightsensor = express_getattr(IfcSensorTypeEnum, 'LIGHTSENSOR', INDETERMINATE) -moisturesensor = express_getattr(IfcSensorTypeEnum, 'MOISTURESENSOR', INDETERMINATE) -movementsensor = express_getattr(IfcSensorTypeEnum, 'MOVEMENTSENSOR', INDETERMINATE) -phsensor = express_getattr(IfcSensorTypeEnum, 'PHSENSOR', INDETERMINATE) -pressuresensor = express_getattr(IfcSensorTypeEnum, 'PRESSURESENSOR', INDETERMINATE) -radiationsensor = express_getattr(IfcSensorTypeEnum, 'RADIATIONSENSOR', INDETERMINATE) -radioactivitysensor = express_getattr(IfcSensorTypeEnum, 'RADIOACTIVITYSENSOR', INDETERMINATE) -smokesensor = express_getattr(IfcSensorTypeEnum, 'SMOKESENSOR', INDETERMINATE) -soundsensor = express_getattr(IfcSensorTypeEnum, 'SOUNDSENSOR', INDETERMINATE) -temperaturesensor = express_getattr(IfcSensorTypeEnum, 'TEMPERATURESENSOR', INDETERMINATE) -windsensor = express_getattr(IfcSensorTypeEnum, 'WINDSENSOR', INDETERMINATE) -earthquakesensor = express_getattr(IfcSensorTypeEnum, 'EARTHQUAKESENSOR', INDETERMINATE) -foreignobjectdetectionsensor = express_getattr(IfcSensorTypeEnum, 'FOREIGNOBJECTDETECTIONSENSOR', INDETERMINATE) -obstaclesensor = express_getattr(IfcSensorTypeEnum, 'OBSTACLESENSOR', INDETERMINATE) -rainsensor = express_getattr(IfcSensorTypeEnum, 'RAINSENSOR', INDETERMINATE) -snowdepthsensor = express_getattr(IfcSensorTypeEnum, 'SNOWDEPTHSENSOR', INDETERMINATE) -trainsensor = express_getattr(IfcSensorTypeEnum, 'TRAINSENSOR', INDETERMINATE) -turnoutclosuresensor = express_getattr(IfcSensorTypeEnum, 'TURNOUTCLOSURESENSOR', INDETERMINATE) -wheelsensor = express_getattr(IfcSensorTypeEnum, 'WHEELSENSOR', INDETERMINATE) -userdefined = express_getattr(IfcSensorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSensorTypeEnum, 'NOTDEFINED', INDETERMINATE) +cosensor = IfcSensorTypeEnum.COSENSOR +co2sensor = IfcSensorTypeEnum.CO2SENSOR +conductancesensor = IfcSensorTypeEnum.CONDUCTANCESENSOR +contactsensor = IfcSensorTypeEnum.CONTACTSENSOR +firesensor = IfcSensorTypeEnum.FIRESENSOR +flowsensor = IfcSensorTypeEnum.FLOWSENSOR +frostsensor = IfcSensorTypeEnum.FROSTSENSOR +gassensor = IfcSensorTypeEnum.GASSENSOR +heatsensor = IfcSensorTypeEnum.HEATSENSOR +humiditysensor = IfcSensorTypeEnum.HUMIDITYSENSOR +identifiersensor = IfcSensorTypeEnum.IDENTIFIERSENSOR +ionconcentrationsensor = IfcSensorTypeEnum.IONCONCENTRATIONSENSOR +levelsensor = IfcSensorTypeEnum.LEVELSENSOR +lightsensor = IfcSensorTypeEnum.LIGHTSENSOR +moisturesensor = IfcSensorTypeEnum.MOISTURESENSOR +movementsensor = IfcSensorTypeEnum.MOVEMENTSENSOR +phsensor = IfcSensorTypeEnum.PHSENSOR +pressuresensor = IfcSensorTypeEnum.PRESSURESENSOR +radiationsensor = IfcSensorTypeEnum.RADIATIONSENSOR +radioactivitysensor = IfcSensorTypeEnum.RADIOACTIVITYSENSOR +smokesensor = IfcSensorTypeEnum.SMOKESENSOR +soundsensor = IfcSensorTypeEnum.SOUNDSENSOR +temperaturesensor = IfcSensorTypeEnum.TEMPERATURESENSOR +windsensor = IfcSensorTypeEnum.WINDSENSOR +earthquakesensor = IfcSensorTypeEnum.EARTHQUAKESENSOR +foreignobjectdetectionsensor = IfcSensorTypeEnum.FOREIGNOBJECTDETECTIONSENSOR +obstaclesensor = IfcSensorTypeEnum.OBSTACLESENSOR +rainsensor = IfcSensorTypeEnum.RAINSENSOR +snowdepthsensor = IfcSensorTypeEnum.SNOWDEPTHSENSOR +trainsensor = IfcSensorTypeEnum.TRAINSENSOR +turnoutclosuresensor = IfcSensorTypeEnum.TURNOUTCLOSURESENSOR +wheelsensor = IfcSensorTypeEnum.WHEELSENSOR +userdefined = IfcSensorTypeEnum.USERDEFINED +notdefined = IfcSensorTypeEnum.NOTDEFINED IfcSequenceEnum = enum_namespace() -start_start = express_getattr(IfcSequenceEnum, 'START_START', INDETERMINATE) -start_finish = express_getattr(IfcSequenceEnum, 'START_FINISH', INDETERMINATE) -finish_start = express_getattr(IfcSequenceEnum, 'FINISH_START', INDETERMINATE) -finish_finish = express_getattr(IfcSequenceEnum, 'FINISH_FINISH', INDETERMINATE) -userdefined = express_getattr(IfcSequenceEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSequenceEnum, 'NOTDEFINED', INDETERMINATE) +start_start = IfcSequenceEnum.START_START +start_finish = IfcSequenceEnum.START_FINISH +finish_start = IfcSequenceEnum.FINISH_START +finish_finish = IfcSequenceEnum.FINISH_FINISH +userdefined = IfcSequenceEnum.USERDEFINED +notdefined = IfcSequenceEnum.NOTDEFINED IfcShadingDeviceTypeEnum = enum_namespace() -jalousie = express_getattr(IfcShadingDeviceTypeEnum, 'JALOUSIE', INDETERMINATE) -shutter = express_getattr(IfcShadingDeviceTypeEnum, 'SHUTTER', INDETERMINATE) -awning = express_getattr(IfcShadingDeviceTypeEnum, 'AWNING', INDETERMINATE) -userdefined = express_getattr(IfcShadingDeviceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcShadingDeviceTypeEnum, 'NOTDEFINED', INDETERMINATE) +jalousie = IfcShadingDeviceTypeEnum.JALOUSIE +shutter = IfcShadingDeviceTypeEnum.SHUTTER +awning = IfcShadingDeviceTypeEnum.AWNING +userdefined = IfcShadingDeviceTypeEnum.USERDEFINED +notdefined = IfcShadingDeviceTypeEnum.NOTDEFINED IfcSignTypeEnum = enum_namespace() -marker = express_getattr(IfcSignTypeEnum, 'MARKER', INDETERMINATE) -pictoral = express_getattr(IfcSignTypeEnum, 'PICTORAL', INDETERMINATE) -mirror = express_getattr(IfcSignTypeEnum, 'MIRROR', INDETERMINATE) -userdefined = express_getattr(IfcSignTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSignTypeEnum, 'NOTDEFINED', INDETERMINATE) +marker = IfcSignTypeEnum.MARKER +pictoral = IfcSignTypeEnum.PICTORAL +mirror = IfcSignTypeEnum.MIRROR +userdefined = IfcSignTypeEnum.USERDEFINED +notdefined = IfcSignTypeEnum.NOTDEFINED IfcSignalTypeEnum = enum_namespace() -visual = express_getattr(IfcSignalTypeEnum, 'VISUAL', INDETERMINATE) -audio = express_getattr(IfcSignalTypeEnum, 'AUDIO', INDETERMINATE) -mixed = express_getattr(IfcSignalTypeEnum, 'MIXED', INDETERMINATE) -userdefined = express_getattr(IfcSignalTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSignalTypeEnum, 'NOTDEFINED', INDETERMINATE) +visual = IfcSignalTypeEnum.VISUAL +audio = IfcSignalTypeEnum.AUDIO +mixed = IfcSignalTypeEnum.MIXED +userdefined = IfcSignalTypeEnum.USERDEFINED +notdefined = IfcSignalTypeEnum.NOTDEFINED IfcSimplePropertyTemplateTypeEnum = enum_namespace() -p_singlevalue = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'P_SINGLEVALUE', INDETERMINATE) -p_enumeratedvalue = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'P_ENUMERATEDVALUE', INDETERMINATE) -p_boundedvalue = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'P_BOUNDEDVALUE', INDETERMINATE) -p_listvalue = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'P_LISTVALUE', INDETERMINATE) -p_tablevalue = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'P_TABLEVALUE', INDETERMINATE) -p_referencevalue = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'P_REFERENCEVALUE', INDETERMINATE) -q_length = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'Q_LENGTH', INDETERMINATE) -q_area = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'Q_AREA', INDETERMINATE) -q_volume = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'Q_VOLUME', INDETERMINATE) -q_count = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'Q_COUNT', INDETERMINATE) -q_weight = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'Q_WEIGHT', INDETERMINATE) -q_time = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'Q_TIME', INDETERMINATE) +p_singlevalue = IfcSimplePropertyTemplateTypeEnum.P_SINGLEVALUE +p_enumeratedvalue = IfcSimplePropertyTemplateTypeEnum.P_ENUMERATEDVALUE +p_boundedvalue = IfcSimplePropertyTemplateTypeEnum.P_BOUNDEDVALUE +p_listvalue = IfcSimplePropertyTemplateTypeEnum.P_LISTVALUE +p_tablevalue = IfcSimplePropertyTemplateTypeEnum.P_TABLEVALUE +p_referencevalue = IfcSimplePropertyTemplateTypeEnum.P_REFERENCEVALUE +q_length = IfcSimplePropertyTemplateTypeEnum.Q_LENGTH +q_area = IfcSimplePropertyTemplateTypeEnum.Q_AREA +q_volume = IfcSimplePropertyTemplateTypeEnum.Q_VOLUME +q_count = IfcSimplePropertyTemplateTypeEnum.Q_COUNT +q_weight = IfcSimplePropertyTemplateTypeEnum.Q_WEIGHT +q_time = IfcSimplePropertyTemplateTypeEnum.Q_TIME IfcSlabTypeEnum = enum_namespace() -floor = express_getattr(IfcSlabTypeEnum, 'FLOOR', INDETERMINATE) -roof = express_getattr(IfcSlabTypeEnum, 'ROOF', INDETERMINATE) -landing = express_getattr(IfcSlabTypeEnum, 'LANDING', INDETERMINATE) -baseslab = express_getattr(IfcSlabTypeEnum, 'BASESLAB', INDETERMINATE) -approach_slab = express_getattr(IfcSlabTypeEnum, 'APPROACH_SLAB', INDETERMINATE) -paving = express_getattr(IfcSlabTypeEnum, 'PAVING', INDETERMINATE) -wearing = express_getattr(IfcSlabTypeEnum, 'WEARING', INDETERMINATE) -sidewalk = express_getattr(IfcSlabTypeEnum, 'SIDEWALK', INDETERMINATE) -trackslab = express_getattr(IfcSlabTypeEnum, 'TRACKSLAB', INDETERMINATE) -userdefined = express_getattr(IfcSlabTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSlabTypeEnum, 'NOTDEFINED', INDETERMINATE) +floor = IfcSlabTypeEnum.FLOOR +roof = IfcSlabTypeEnum.ROOF +landing = IfcSlabTypeEnum.LANDING +baseslab = IfcSlabTypeEnum.BASESLAB +approach_slab = IfcSlabTypeEnum.APPROACH_SLAB +paving = IfcSlabTypeEnum.PAVING +wearing = IfcSlabTypeEnum.WEARING +sidewalk = IfcSlabTypeEnum.SIDEWALK +trackslab = IfcSlabTypeEnum.TRACKSLAB +userdefined = IfcSlabTypeEnum.USERDEFINED +notdefined = IfcSlabTypeEnum.NOTDEFINED IfcSolarDeviceTypeEnum = enum_namespace() -solarcollector = express_getattr(IfcSolarDeviceTypeEnum, 'SOLARCOLLECTOR', INDETERMINATE) -solarpanel = express_getattr(IfcSolarDeviceTypeEnum, 'SOLARPANEL', INDETERMINATE) -userdefined = express_getattr(IfcSolarDeviceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSolarDeviceTypeEnum, 'NOTDEFINED', INDETERMINATE) +solarcollector = IfcSolarDeviceTypeEnum.SOLARCOLLECTOR +solarpanel = IfcSolarDeviceTypeEnum.SOLARPANEL +userdefined = IfcSolarDeviceTypeEnum.USERDEFINED +notdefined = IfcSolarDeviceTypeEnum.NOTDEFINED IfcSpaceHeaterTypeEnum = enum_namespace() -convector = express_getattr(IfcSpaceHeaterTypeEnum, 'CONVECTOR', INDETERMINATE) -radiator = express_getattr(IfcSpaceHeaterTypeEnum, 'RADIATOR', INDETERMINATE) -userdefined = express_getattr(IfcSpaceHeaterTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSpaceHeaterTypeEnum, 'NOTDEFINED', INDETERMINATE) +convector = IfcSpaceHeaterTypeEnum.CONVECTOR +radiator = IfcSpaceHeaterTypeEnum.RADIATOR +userdefined = IfcSpaceHeaterTypeEnum.USERDEFINED +notdefined = IfcSpaceHeaterTypeEnum.NOTDEFINED IfcSpaceTypeEnum = enum_namespace() -space = express_getattr(IfcSpaceTypeEnum, 'SPACE', INDETERMINATE) -parking = express_getattr(IfcSpaceTypeEnum, 'PARKING', INDETERMINATE) -gfa = express_getattr(IfcSpaceTypeEnum, 'GFA', INDETERMINATE) -internal = express_getattr(IfcSpaceTypeEnum, 'INTERNAL', INDETERMINATE) -external = express_getattr(IfcSpaceTypeEnum, 'EXTERNAL', INDETERMINATE) -berth = express_getattr(IfcSpaceTypeEnum, 'BERTH', INDETERMINATE) -userdefined = express_getattr(IfcSpaceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSpaceTypeEnum, 'NOTDEFINED', INDETERMINATE) +space = IfcSpaceTypeEnum.SPACE +parking = IfcSpaceTypeEnum.PARKING +gfa = IfcSpaceTypeEnum.GFA +internal = IfcSpaceTypeEnum.INTERNAL +external = IfcSpaceTypeEnum.EXTERNAL +berth = IfcSpaceTypeEnum.BERTH +userdefined = IfcSpaceTypeEnum.USERDEFINED +notdefined = IfcSpaceTypeEnum.NOTDEFINED IfcSpatialZoneTypeEnum = enum_namespace() -construction = express_getattr(IfcSpatialZoneTypeEnum, 'CONSTRUCTION', INDETERMINATE) -firesafety = express_getattr(IfcSpatialZoneTypeEnum, 'FIRESAFETY', INDETERMINATE) -lighting = express_getattr(IfcSpatialZoneTypeEnum, 'LIGHTING', INDETERMINATE) -occupancy = express_getattr(IfcSpatialZoneTypeEnum, 'OCCUPANCY', INDETERMINATE) -security = express_getattr(IfcSpatialZoneTypeEnum, 'SECURITY', INDETERMINATE) -thermal = express_getattr(IfcSpatialZoneTypeEnum, 'THERMAL', INDETERMINATE) -transport = express_getattr(IfcSpatialZoneTypeEnum, 'TRANSPORT', INDETERMINATE) -ventilation = express_getattr(IfcSpatialZoneTypeEnum, 'VENTILATION', INDETERMINATE) -reservation = express_getattr(IfcSpatialZoneTypeEnum, 'RESERVATION', INDETERMINATE) -userdefined = express_getattr(IfcSpatialZoneTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSpatialZoneTypeEnum, 'NOTDEFINED', INDETERMINATE) +construction = IfcSpatialZoneTypeEnum.CONSTRUCTION +firesafety = IfcSpatialZoneTypeEnum.FIRESAFETY +lighting = IfcSpatialZoneTypeEnum.LIGHTING +occupancy = IfcSpatialZoneTypeEnum.OCCUPANCY +security = IfcSpatialZoneTypeEnum.SECURITY +thermal = IfcSpatialZoneTypeEnum.THERMAL +transport = IfcSpatialZoneTypeEnum.TRANSPORT +ventilation = IfcSpatialZoneTypeEnum.VENTILATION +reservation = IfcSpatialZoneTypeEnum.RESERVATION +userdefined = IfcSpatialZoneTypeEnum.USERDEFINED +notdefined = IfcSpatialZoneTypeEnum.NOTDEFINED IfcStackTerminalTypeEnum = enum_namespace() -birdcage = express_getattr(IfcStackTerminalTypeEnum, 'BIRDCAGE', INDETERMINATE) -cowl = express_getattr(IfcStackTerminalTypeEnum, 'COWL', INDETERMINATE) -rainwaterhopper = express_getattr(IfcStackTerminalTypeEnum, 'RAINWATERHOPPER', INDETERMINATE) -userdefined = express_getattr(IfcStackTerminalTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcStackTerminalTypeEnum, 'NOTDEFINED', INDETERMINATE) +birdcage = IfcStackTerminalTypeEnum.BIRDCAGE +cowl = IfcStackTerminalTypeEnum.COWL +rainwaterhopper = IfcStackTerminalTypeEnum.RAINWATERHOPPER +userdefined = IfcStackTerminalTypeEnum.USERDEFINED +notdefined = IfcStackTerminalTypeEnum.NOTDEFINED IfcStairFlightTypeEnum = enum_namespace() -straight = express_getattr(IfcStairFlightTypeEnum, 'STRAIGHT', INDETERMINATE) -winder = express_getattr(IfcStairFlightTypeEnum, 'WINDER', INDETERMINATE) -spiral = express_getattr(IfcStairFlightTypeEnum, 'SPIRAL', INDETERMINATE) -curved = express_getattr(IfcStairFlightTypeEnum, 'CURVED', INDETERMINATE) -freeform = express_getattr(IfcStairFlightTypeEnum, 'FREEFORM', INDETERMINATE) -userdefined = express_getattr(IfcStairFlightTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcStairFlightTypeEnum, 'NOTDEFINED', INDETERMINATE) +straight = IfcStairFlightTypeEnum.STRAIGHT +winder = IfcStairFlightTypeEnum.WINDER +spiral = IfcStairFlightTypeEnum.SPIRAL +curved = IfcStairFlightTypeEnum.CURVED +freeform = IfcStairFlightTypeEnum.FREEFORM +userdefined = IfcStairFlightTypeEnum.USERDEFINED +notdefined = IfcStairFlightTypeEnum.NOTDEFINED IfcStairTypeEnum = enum_namespace() -straight_run_stair = express_getattr(IfcStairTypeEnum, 'STRAIGHT_RUN_STAIR', INDETERMINATE) -two_straight_run_stair = express_getattr(IfcStairTypeEnum, 'TWO_STRAIGHT_RUN_STAIR', INDETERMINATE) -quarter_winding_stair = express_getattr(IfcStairTypeEnum, 'QUARTER_WINDING_STAIR', INDETERMINATE) -quarter_turn_stair = express_getattr(IfcStairTypeEnum, 'QUARTER_TURN_STAIR', INDETERMINATE) -half_winding_stair = express_getattr(IfcStairTypeEnum, 'HALF_WINDING_STAIR', INDETERMINATE) -half_turn_stair = express_getattr(IfcStairTypeEnum, 'HALF_TURN_STAIR', INDETERMINATE) -two_quarter_winding_stair = express_getattr(IfcStairTypeEnum, 'TWO_QUARTER_WINDING_STAIR', INDETERMINATE) -two_quarter_turn_stair = express_getattr(IfcStairTypeEnum, 'TWO_QUARTER_TURN_STAIR', INDETERMINATE) -three_quarter_winding_stair = express_getattr(IfcStairTypeEnum, 'THREE_QUARTER_WINDING_STAIR', INDETERMINATE) -three_quarter_turn_stair = express_getattr(IfcStairTypeEnum, 'THREE_QUARTER_TURN_STAIR', INDETERMINATE) -spiral_stair = express_getattr(IfcStairTypeEnum, 'SPIRAL_STAIR', INDETERMINATE) -double_return_stair = express_getattr(IfcStairTypeEnum, 'DOUBLE_RETURN_STAIR', INDETERMINATE) -curved_run_stair = express_getattr(IfcStairTypeEnum, 'CURVED_RUN_STAIR', INDETERMINATE) -two_curved_run_stair = express_getattr(IfcStairTypeEnum, 'TWO_CURVED_RUN_STAIR', INDETERMINATE) -ladder = express_getattr(IfcStairTypeEnum, 'LADDER', INDETERMINATE) -userdefined = express_getattr(IfcStairTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcStairTypeEnum, 'NOTDEFINED', INDETERMINATE) +straight_run_stair = IfcStairTypeEnum.STRAIGHT_RUN_STAIR +two_straight_run_stair = IfcStairTypeEnum.TWO_STRAIGHT_RUN_STAIR +quarter_winding_stair = IfcStairTypeEnum.QUARTER_WINDING_STAIR +quarter_turn_stair = IfcStairTypeEnum.QUARTER_TURN_STAIR +half_winding_stair = IfcStairTypeEnum.HALF_WINDING_STAIR +half_turn_stair = IfcStairTypeEnum.HALF_TURN_STAIR +two_quarter_winding_stair = IfcStairTypeEnum.TWO_QUARTER_WINDING_STAIR +two_quarter_turn_stair = IfcStairTypeEnum.TWO_QUARTER_TURN_STAIR +three_quarter_winding_stair = IfcStairTypeEnum.THREE_QUARTER_WINDING_STAIR +three_quarter_turn_stair = IfcStairTypeEnum.THREE_QUARTER_TURN_STAIR +spiral_stair = IfcStairTypeEnum.SPIRAL_STAIR +double_return_stair = IfcStairTypeEnum.DOUBLE_RETURN_STAIR +curved_run_stair = IfcStairTypeEnum.CURVED_RUN_STAIR +two_curved_run_stair = IfcStairTypeEnum.TWO_CURVED_RUN_STAIR +ladder = IfcStairTypeEnum.LADDER +userdefined = IfcStairTypeEnum.USERDEFINED +notdefined = IfcStairTypeEnum.NOTDEFINED IfcStateEnum = enum_namespace() -readwrite = express_getattr(IfcStateEnum, 'READWRITE', INDETERMINATE) -readonly = express_getattr(IfcStateEnum, 'READONLY', INDETERMINATE) -locked = express_getattr(IfcStateEnum, 'LOCKED', INDETERMINATE) -readwritelocked = express_getattr(IfcStateEnum, 'READWRITELOCKED', INDETERMINATE) -readonlylocked = express_getattr(IfcStateEnum, 'READONLYLOCKED', INDETERMINATE) +readwrite = IfcStateEnum.READWRITE +readonly = IfcStateEnum.READONLY +locked = IfcStateEnum.LOCKED +readwritelocked = IfcStateEnum.READWRITELOCKED +readonlylocked = IfcStateEnum.READONLYLOCKED IfcStructuralCurveActivityTypeEnum = enum_namespace() -const = express_getattr(IfcStructuralCurveActivityTypeEnum, 'CONST', INDETERMINATE) -linear = express_getattr(IfcStructuralCurveActivityTypeEnum, 'LINEAR', INDETERMINATE) -polygonal = express_getattr(IfcStructuralCurveActivityTypeEnum, 'POLYGONAL', INDETERMINATE) -equidistant = express_getattr(IfcStructuralCurveActivityTypeEnum, 'EQUIDISTANT', INDETERMINATE) -sinus = express_getattr(IfcStructuralCurveActivityTypeEnum, 'SINUS', INDETERMINATE) -parabola = express_getattr(IfcStructuralCurveActivityTypeEnum, 'PARABOLA', INDETERMINATE) -discrete = express_getattr(IfcStructuralCurveActivityTypeEnum, 'DISCRETE', INDETERMINATE) -userdefined = express_getattr(IfcStructuralCurveActivityTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcStructuralCurveActivityTypeEnum, 'NOTDEFINED', INDETERMINATE) +const = IfcStructuralCurveActivityTypeEnum.CONST +linear = IfcStructuralCurveActivityTypeEnum.LINEAR +polygonal = IfcStructuralCurveActivityTypeEnum.POLYGONAL +equidistant = IfcStructuralCurveActivityTypeEnum.EQUIDISTANT +sinus = IfcStructuralCurveActivityTypeEnum.SINUS +parabola = IfcStructuralCurveActivityTypeEnum.PARABOLA +discrete = IfcStructuralCurveActivityTypeEnum.DISCRETE +userdefined = IfcStructuralCurveActivityTypeEnum.USERDEFINED +notdefined = IfcStructuralCurveActivityTypeEnum.NOTDEFINED IfcStructuralCurveMemberTypeEnum = enum_namespace() -rigid_joined_member = express_getattr(IfcStructuralCurveMemberTypeEnum, 'RIGID_JOINED_MEMBER', INDETERMINATE) -pin_joined_member = express_getattr(IfcStructuralCurveMemberTypeEnum, 'PIN_JOINED_MEMBER', INDETERMINATE) -cable = express_getattr(IfcStructuralCurveMemberTypeEnum, 'CABLE', INDETERMINATE) -tension_member = express_getattr(IfcStructuralCurveMemberTypeEnum, 'TENSION_MEMBER', INDETERMINATE) -compression_member = express_getattr(IfcStructuralCurveMemberTypeEnum, 'COMPRESSION_MEMBER', INDETERMINATE) -userdefined = express_getattr(IfcStructuralCurveMemberTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcStructuralCurveMemberTypeEnum, 'NOTDEFINED', INDETERMINATE) +rigid_joined_member = IfcStructuralCurveMemberTypeEnum.RIGID_JOINED_MEMBER +pin_joined_member = IfcStructuralCurveMemberTypeEnum.PIN_JOINED_MEMBER +cable = IfcStructuralCurveMemberTypeEnum.CABLE +tension_member = IfcStructuralCurveMemberTypeEnum.TENSION_MEMBER +compression_member = IfcStructuralCurveMemberTypeEnum.COMPRESSION_MEMBER +userdefined = IfcStructuralCurveMemberTypeEnum.USERDEFINED +notdefined = IfcStructuralCurveMemberTypeEnum.NOTDEFINED IfcStructuralSurfaceActivityTypeEnum = enum_namespace() -const = express_getattr(IfcStructuralSurfaceActivityTypeEnum, 'CONST', INDETERMINATE) -bilinear = express_getattr(IfcStructuralSurfaceActivityTypeEnum, 'BILINEAR', INDETERMINATE) -discrete = express_getattr(IfcStructuralSurfaceActivityTypeEnum, 'DISCRETE', INDETERMINATE) -isocontour = express_getattr(IfcStructuralSurfaceActivityTypeEnum, 'ISOCONTOUR', INDETERMINATE) -userdefined = express_getattr(IfcStructuralSurfaceActivityTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcStructuralSurfaceActivityTypeEnum, 'NOTDEFINED', INDETERMINATE) +const = IfcStructuralSurfaceActivityTypeEnum.CONST +bilinear = IfcStructuralSurfaceActivityTypeEnum.BILINEAR +discrete = IfcStructuralSurfaceActivityTypeEnum.DISCRETE +isocontour = IfcStructuralSurfaceActivityTypeEnum.ISOCONTOUR +userdefined = IfcStructuralSurfaceActivityTypeEnum.USERDEFINED +notdefined = IfcStructuralSurfaceActivityTypeEnum.NOTDEFINED IfcStructuralSurfaceMemberTypeEnum = enum_namespace() -bending_element = express_getattr(IfcStructuralSurfaceMemberTypeEnum, 'BENDING_ELEMENT', INDETERMINATE) -membrane_element = express_getattr(IfcStructuralSurfaceMemberTypeEnum, 'MEMBRANE_ELEMENT', INDETERMINATE) -shell = express_getattr(IfcStructuralSurfaceMemberTypeEnum, 'SHELL', INDETERMINATE) -userdefined = express_getattr(IfcStructuralSurfaceMemberTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcStructuralSurfaceMemberTypeEnum, 'NOTDEFINED', INDETERMINATE) +bending_element = IfcStructuralSurfaceMemberTypeEnum.BENDING_ELEMENT +membrane_element = IfcStructuralSurfaceMemberTypeEnum.MEMBRANE_ELEMENT +shell = IfcStructuralSurfaceMemberTypeEnum.SHELL +userdefined = IfcStructuralSurfaceMemberTypeEnum.USERDEFINED +notdefined = IfcStructuralSurfaceMemberTypeEnum.NOTDEFINED IfcSubContractResourceTypeEnum = enum_namespace() -purchase = express_getattr(IfcSubContractResourceTypeEnum, 'PURCHASE', INDETERMINATE) -work = express_getattr(IfcSubContractResourceTypeEnum, 'WORK', INDETERMINATE) -userdefined = express_getattr(IfcSubContractResourceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSubContractResourceTypeEnum, 'NOTDEFINED', INDETERMINATE) +purchase = IfcSubContractResourceTypeEnum.PURCHASE +work = IfcSubContractResourceTypeEnum.WORK +userdefined = IfcSubContractResourceTypeEnum.USERDEFINED +notdefined = IfcSubContractResourceTypeEnum.NOTDEFINED IfcSurfaceFeatureTypeEnum = enum_namespace() -mark = express_getattr(IfcSurfaceFeatureTypeEnum, 'MARK', INDETERMINATE) -tag = express_getattr(IfcSurfaceFeatureTypeEnum, 'TAG', INDETERMINATE) -treatment = express_getattr(IfcSurfaceFeatureTypeEnum, 'TREATMENT', INDETERMINATE) -defect = express_getattr(IfcSurfaceFeatureTypeEnum, 'DEFECT', INDETERMINATE) -hatchmarking = express_getattr(IfcSurfaceFeatureTypeEnum, 'HATCHMARKING', INDETERMINATE) -linemarking = express_getattr(IfcSurfaceFeatureTypeEnum, 'LINEMARKING', INDETERMINATE) -pavementsurfacemarking = express_getattr(IfcSurfaceFeatureTypeEnum, 'PAVEMENTSURFACEMARKING', INDETERMINATE) -symbolmarking = express_getattr(IfcSurfaceFeatureTypeEnum, 'SYMBOLMARKING', INDETERMINATE) -nonskidsurfacing = express_getattr(IfcSurfaceFeatureTypeEnum, 'NONSKIDSURFACING', INDETERMINATE) -rumblestrip = express_getattr(IfcSurfaceFeatureTypeEnum, 'RUMBLESTRIP', INDETERMINATE) -transverserumblestrip = express_getattr(IfcSurfaceFeatureTypeEnum, 'TRANSVERSERUMBLESTRIP', INDETERMINATE) -userdefined = express_getattr(IfcSurfaceFeatureTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSurfaceFeatureTypeEnum, 'NOTDEFINED', INDETERMINATE) +mark = IfcSurfaceFeatureTypeEnum.MARK +tag = IfcSurfaceFeatureTypeEnum.TAG +treatment = IfcSurfaceFeatureTypeEnum.TREATMENT +defect = IfcSurfaceFeatureTypeEnum.DEFECT +hatchmarking = IfcSurfaceFeatureTypeEnum.HATCHMARKING +linemarking = IfcSurfaceFeatureTypeEnum.LINEMARKING +pavementsurfacemarking = IfcSurfaceFeatureTypeEnum.PAVEMENTSURFACEMARKING +symbolmarking = IfcSurfaceFeatureTypeEnum.SYMBOLMARKING +nonskidsurfacing = IfcSurfaceFeatureTypeEnum.NONSKIDSURFACING +rumblestrip = IfcSurfaceFeatureTypeEnum.RUMBLESTRIP +transverserumblestrip = IfcSurfaceFeatureTypeEnum.TRANSVERSERUMBLESTRIP +userdefined = IfcSurfaceFeatureTypeEnum.USERDEFINED +notdefined = IfcSurfaceFeatureTypeEnum.NOTDEFINED IfcSurfaceSide = enum_namespace() -positive = express_getattr(IfcSurfaceSide, 'POSITIVE', INDETERMINATE) -negative = express_getattr(IfcSurfaceSide, 'NEGATIVE', INDETERMINATE) -both = express_getattr(IfcSurfaceSide, 'BOTH', INDETERMINATE) +positive = IfcSurfaceSide.POSITIVE +negative = IfcSurfaceSide.NEGATIVE +both = IfcSurfaceSide.BOTH IfcSwitchingDeviceTypeEnum = enum_namespace() -contactor = express_getattr(IfcSwitchingDeviceTypeEnum, 'CONTACTOR', INDETERMINATE) -dimmerswitch = express_getattr(IfcSwitchingDeviceTypeEnum, 'DIMMERSWITCH', INDETERMINATE) -emergencystop = express_getattr(IfcSwitchingDeviceTypeEnum, 'EMERGENCYSTOP', INDETERMINATE) -keypad = express_getattr(IfcSwitchingDeviceTypeEnum, 'KEYPAD', INDETERMINATE) -momentaryswitch = express_getattr(IfcSwitchingDeviceTypeEnum, 'MOMENTARYSWITCH', INDETERMINATE) -selectorswitch = express_getattr(IfcSwitchingDeviceTypeEnum, 'SELECTORSWITCH', INDETERMINATE) -starter = express_getattr(IfcSwitchingDeviceTypeEnum, 'STARTER', INDETERMINATE) -switchdisconnector = express_getattr(IfcSwitchingDeviceTypeEnum, 'SWITCHDISCONNECTOR', INDETERMINATE) -toggleswitch = express_getattr(IfcSwitchingDeviceTypeEnum, 'TOGGLESWITCH', INDETERMINATE) -relay = express_getattr(IfcSwitchingDeviceTypeEnum, 'RELAY', INDETERMINATE) -start_and_stop_equipment = express_getattr(IfcSwitchingDeviceTypeEnum, 'START_AND_STOP_EQUIPMENT', INDETERMINATE) -userdefined = express_getattr(IfcSwitchingDeviceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSwitchingDeviceTypeEnum, 'NOTDEFINED', INDETERMINATE) +contactor = IfcSwitchingDeviceTypeEnum.CONTACTOR +dimmerswitch = IfcSwitchingDeviceTypeEnum.DIMMERSWITCH +emergencystop = IfcSwitchingDeviceTypeEnum.EMERGENCYSTOP +keypad = IfcSwitchingDeviceTypeEnum.KEYPAD +momentaryswitch = IfcSwitchingDeviceTypeEnum.MOMENTARYSWITCH +selectorswitch = IfcSwitchingDeviceTypeEnum.SELECTORSWITCH +starter = IfcSwitchingDeviceTypeEnum.STARTER +switchdisconnector = IfcSwitchingDeviceTypeEnum.SWITCHDISCONNECTOR +toggleswitch = IfcSwitchingDeviceTypeEnum.TOGGLESWITCH +relay = IfcSwitchingDeviceTypeEnum.RELAY +start_and_stop_equipment = IfcSwitchingDeviceTypeEnum.START_AND_STOP_EQUIPMENT +userdefined = IfcSwitchingDeviceTypeEnum.USERDEFINED +notdefined = IfcSwitchingDeviceTypeEnum.NOTDEFINED IfcSystemFurnitureElementTypeEnum = enum_namespace() -panel = express_getattr(IfcSystemFurnitureElementTypeEnum, 'PANEL', INDETERMINATE) -worksurface = express_getattr(IfcSystemFurnitureElementTypeEnum, 'WORKSURFACE', INDETERMINATE) -subrack = express_getattr(IfcSystemFurnitureElementTypeEnum, 'SUBRACK', INDETERMINATE) -userdefined = express_getattr(IfcSystemFurnitureElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSystemFurnitureElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +panel = IfcSystemFurnitureElementTypeEnum.PANEL +worksurface = IfcSystemFurnitureElementTypeEnum.WORKSURFACE +subrack = IfcSystemFurnitureElementTypeEnum.SUBRACK +userdefined = IfcSystemFurnitureElementTypeEnum.USERDEFINED +notdefined = IfcSystemFurnitureElementTypeEnum.NOTDEFINED IfcTankTypeEnum = enum_namespace() -basin = express_getattr(IfcTankTypeEnum, 'BASIN', INDETERMINATE) -breakpressure = express_getattr(IfcTankTypeEnum, 'BREAKPRESSURE', INDETERMINATE) -expansion = express_getattr(IfcTankTypeEnum, 'EXPANSION', INDETERMINATE) -feedandexpansion = express_getattr(IfcTankTypeEnum, 'FEEDANDEXPANSION', INDETERMINATE) -pressurevessel = express_getattr(IfcTankTypeEnum, 'PRESSUREVESSEL', INDETERMINATE) -storage = express_getattr(IfcTankTypeEnum, 'STORAGE', INDETERMINATE) -vessel = express_getattr(IfcTankTypeEnum, 'VESSEL', INDETERMINATE) -oilretentiontray = express_getattr(IfcTankTypeEnum, 'OILRETENTIONTRAY', INDETERMINATE) -userdefined = express_getattr(IfcTankTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTankTypeEnum, 'NOTDEFINED', INDETERMINATE) +basin = IfcTankTypeEnum.BASIN +breakpressure = IfcTankTypeEnum.BREAKPRESSURE +expansion = IfcTankTypeEnum.EXPANSION +feedandexpansion = IfcTankTypeEnum.FEEDANDEXPANSION +pressurevessel = IfcTankTypeEnum.PRESSUREVESSEL +storage = IfcTankTypeEnum.STORAGE +vessel = IfcTankTypeEnum.VESSEL +oilretentiontray = IfcTankTypeEnum.OILRETENTIONTRAY +userdefined = IfcTankTypeEnum.USERDEFINED +notdefined = IfcTankTypeEnum.NOTDEFINED IfcTaskDurationEnum = enum_namespace() -elapsedtime = express_getattr(IfcTaskDurationEnum, 'ELAPSEDTIME', INDETERMINATE) -worktime = express_getattr(IfcTaskDurationEnum, 'WORKTIME', INDETERMINATE) -notdefined = express_getattr(IfcTaskDurationEnum, 'NOTDEFINED', INDETERMINATE) +elapsedtime = IfcTaskDurationEnum.ELAPSEDTIME +worktime = IfcTaskDurationEnum.WORKTIME +notdefined = IfcTaskDurationEnum.NOTDEFINED IfcTaskTypeEnum = enum_namespace() -attendance = express_getattr(IfcTaskTypeEnum, 'ATTENDANCE', INDETERMINATE) -construction = express_getattr(IfcTaskTypeEnum, 'CONSTRUCTION', INDETERMINATE) -demolition = express_getattr(IfcTaskTypeEnum, 'DEMOLITION', INDETERMINATE) -dismantle = express_getattr(IfcTaskTypeEnum, 'DISMANTLE', INDETERMINATE) -disposal = express_getattr(IfcTaskTypeEnum, 'DISPOSAL', INDETERMINATE) -installation = express_getattr(IfcTaskTypeEnum, 'INSTALLATION', INDETERMINATE) -logistic = express_getattr(IfcTaskTypeEnum, 'LOGISTIC', INDETERMINATE) -maintenance = express_getattr(IfcTaskTypeEnum, 'MAINTENANCE', INDETERMINATE) -move = express_getattr(IfcTaskTypeEnum, 'MOVE', INDETERMINATE) -operation = express_getattr(IfcTaskTypeEnum, 'OPERATION', INDETERMINATE) -removal = express_getattr(IfcTaskTypeEnum, 'REMOVAL', INDETERMINATE) -renovation = express_getattr(IfcTaskTypeEnum, 'RENOVATION', INDETERMINATE) -userdefined = express_getattr(IfcTaskTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTaskTypeEnum, 'NOTDEFINED', INDETERMINATE) +attendance = IfcTaskTypeEnum.ATTENDANCE +construction = IfcTaskTypeEnum.CONSTRUCTION +demolition = IfcTaskTypeEnum.DEMOLITION +dismantle = IfcTaskTypeEnum.DISMANTLE +disposal = IfcTaskTypeEnum.DISPOSAL +installation = IfcTaskTypeEnum.INSTALLATION +logistic = IfcTaskTypeEnum.LOGISTIC +maintenance = IfcTaskTypeEnum.MAINTENANCE +move = IfcTaskTypeEnum.MOVE +operation = IfcTaskTypeEnum.OPERATION +removal = IfcTaskTypeEnum.REMOVAL +renovation = IfcTaskTypeEnum.RENOVATION +userdefined = IfcTaskTypeEnum.USERDEFINED +notdefined = IfcTaskTypeEnum.NOTDEFINED IfcTendonAnchorTypeEnum = enum_namespace() -coupler = express_getattr(IfcTendonAnchorTypeEnum, 'COUPLER', INDETERMINATE) -fixed_end = express_getattr(IfcTendonAnchorTypeEnum, 'FIXED_END', INDETERMINATE) -tensioning_end = express_getattr(IfcTendonAnchorTypeEnum, 'TENSIONING_END', INDETERMINATE) -userdefined = express_getattr(IfcTendonAnchorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTendonAnchorTypeEnum, 'NOTDEFINED', INDETERMINATE) +coupler = IfcTendonAnchorTypeEnum.COUPLER +fixed_end = IfcTendonAnchorTypeEnum.FIXED_END +tensioning_end = IfcTendonAnchorTypeEnum.TENSIONING_END +userdefined = IfcTendonAnchorTypeEnum.USERDEFINED +notdefined = IfcTendonAnchorTypeEnum.NOTDEFINED IfcTendonConduitTypeEnum = enum_namespace() -duct = express_getattr(IfcTendonConduitTypeEnum, 'DUCT', INDETERMINATE) -coupler = express_getattr(IfcTendonConduitTypeEnum, 'COUPLER', INDETERMINATE) -grouting_duct = express_getattr(IfcTendonConduitTypeEnum, 'GROUTING_DUCT', INDETERMINATE) -trumpet = express_getattr(IfcTendonConduitTypeEnum, 'TRUMPET', INDETERMINATE) -diabolo = express_getattr(IfcTendonConduitTypeEnum, 'DIABOLO', INDETERMINATE) -userdefined = express_getattr(IfcTendonConduitTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTendonConduitTypeEnum, 'NOTDEFINED', INDETERMINATE) +duct = IfcTendonConduitTypeEnum.DUCT +coupler = IfcTendonConduitTypeEnum.COUPLER +grouting_duct = IfcTendonConduitTypeEnum.GROUTING_DUCT +trumpet = IfcTendonConduitTypeEnum.TRUMPET +diabolo = IfcTendonConduitTypeEnum.DIABOLO +userdefined = IfcTendonConduitTypeEnum.USERDEFINED +notdefined = IfcTendonConduitTypeEnum.NOTDEFINED IfcTendonTypeEnum = enum_namespace() -bar = express_getattr(IfcTendonTypeEnum, 'BAR', INDETERMINATE) -coated = express_getattr(IfcTendonTypeEnum, 'COATED', INDETERMINATE) -strand = express_getattr(IfcTendonTypeEnum, 'STRAND', INDETERMINATE) -wire = express_getattr(IfcTendonTypeEnum, 'WIRE', INDETERMINATE) -userdefined = express_getattr(IfcTendonTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTendonTypeEnum, 'NOTDEFINED', INDETERMINATE) +bar = IfcTendonTypeEnum.BAR +coated = IfcTendonTypeEnum.COATED +strand = IfcTendonTypeEnum.STRAND +wire = IfcTendonTypeEnum.WIRE +userdefined = IfcTendonTypeEnum.USERDEFINED +notdefined = IfcTendonTypeEnum.NOTDEFINED IfcTextPath = enum_namespace() -left = express_getattr(IfcTextPath, 'LEFT', INDETERMINATE) -right = express_getattr(IfcTextPath, 'RIGHT', INDETERMINATE) -up = express_getattr(IfcTextPath, 'UP', INDETERMINATE) -down = express_getattr(IfcTextPath, 'DOWN', INDETERMINATE) +left = IfcTextPath.LEFT +right = IfcTextPath.RIGHT +up = IfcTextPath.UP +down = IfcTextPath.DOWN IfcTimeSeriesDataTypeEnum = enum_namespace() -continuous = express_getattr(IfcTimeSeriesDataTypeEnum, 'CONTINUOUS', INDETERMINATE) -discrete = express_getattr(IfcTimeSeriesDataTypeEnum, 'DISCRETE', INDETERMINATE) -discretebinary = express_getattr(IfcTimeSeriesDataTypeEnum, 'DISCRETEBINARY', INDETERMINATE) -piecewisebinary = express_getattr(IfcTimeSeriesDataTypeEnum, 'PIECEWISEBINARY', INDETERMINATE) -piecewiseconstant = express_getattr(IfcTimeSeriesDataTypeEnum, 'PIECEWISECONSTANT', INDETERMINATE) -piecewisecontinuous = express_getattr(IfcTimeSeriesDataTypeEnum, 'PIECEWISECONTINUOUS', INDETERMINATE) -notdefined = express_getattr(IfcTimeSeriesDataTypeEnum, 'NOTDEFINED', INDETERMINATE) +continuous = IfcTimeSeriesDataTypeEnum.CONTINUOUS +discrete = IfcTimeSeriesDataTypeEnum.DISCRETE +discretebinary = IfcTimeSeriesDataTypeEnum.DISCRETEBINARY +piecewisebinary = IfcTimeSeriesDataTypeEnum.PIECEWISEBINARY +piecewiseconstant = IfcTimeSeriesDataTypeEnum.PIECEWISECONSTANT +piecewisecontinuous = IfcTimeSeriesDataTypeEnum.PIECEWISECONTINUOUS +notdefined = IfcTimeSeriesDataTypeEnum.NOTDEFINED IfcTrackElementTypeEnum = enum_namespace() -trackendofalignment = express_getattr(IfcTrackElementTypeEnum, 'TRACKENDOFALIGNMENT', INDETERMINATE) -blockingdevice = express_getattr(IfcTrackElementTypeEnum, 'BLOCKINGDEVICE', INDETERMINATE) -vehiclestop = express_getattr(IfcTrackElementTypeEnum, 'VEHICLESTOP', INDETERMINATE) -sleeper = express_getattr(IfcTrackElementTypeEnum, 'SLEEPER', INDETERMINATE) -half_set_of_blades = express_getattr(IfcTrackElementTypeEnum, 'HALF_SET_OF_BLADES', INDETERMINATE) -speedregulator = express_getattr(IfcTrackElementTypeEnum, 'SPEEDREGULATOR', INDETERMINATE) -derailer = express_getattr(IfcTrackElementTypeEnum, 'DERAILER', INDETERMINATE) -frog = express_getattr(IfcTrackElementTypeEnum, 'FROG', INDETERMINATE) -userdefined = express_getattr(IfcTrackElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTrackElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +trackendofalignment = IfcTrackElementTypeEnum.TRACKENDOFALIGNMENT +blockingdevice = IfcTrackElementTypeEnum.BLOCKINGDEVICE +vehiclestop = IfcTrackElementTypeEnum.VEHICLESTOP +sleeper = IfcTrackElementTypeEnum.SLEEPER +half_set_of_blades = IfcTrackElementTypeEnum.HALF_SET_OF_BLADES +speedregulator = IfcTrackElementTypeEnum.SPEEDREGULATOR +derailer = IfcTrackElementTypeEnum.DERAILER +frog = IfcTrackElementTypeEnum.FROG +userdefined = IfcTrackElementTypeEnum.USERDEFINED +notdefined = IfcTrackElementTypeEnum.NOTDEFINED IfcTransformerTypeEnum = enum_namespace() -current = express_getattr(IfcTransformerTypeEnum, 'CURRENT', INDETERMINATE) -frequency = express_getattr(IfcTransformerTypeEnum, 'FREQUENCY', INDETERMINATE) -inverter = express_getattr(IfcTransformerTypeEnum, 'INVERTER', INDETERMINATE) -rectifier = express_getattr(IfcTransformerTypeEnum, 'RECTIFIER', INDETERMINATE) -voltage = express_getattr(IfcTransformerTypeEnum, 'VOLTAGE', INDETERMINATE) -chopper = express_getattr(IfcTransformerTypeEnum, 'CHOPPER', INDETERMINATE) -combined = express_getattr(IfcTransformerTypeEnum, 'COMBINED', INDETERMINATE) -userdefined = express_getattr(IfcTransformerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTransformerTypeEnum, 'NOTDEFINED', INDETERMINATE) +current = IfcTransformerTypeEnum.CURRENT +frequency = IfcTransformerTypeEnum.FREQUENCY +inverter = IfcTransformerTypeEnum.INVERTER +rectifier = IfcTransformerTypeEnum.RECTIFIER +voltage = IfcTransformerTypeEnum.VOLTAGE +chopper = IfcTransformerTypeEnum.CHOPPER +combined = IfcTransformerTypeEnum.COMBINED +userdefined = IfcTransformerTypeEnum.USERDEFINED +notdefined = IfcTransformerTypeEnum.NOTDEFINED IfcTransitionCode = enum_namespace() -discontinuous = express_getattr(IfcTransitionCode, 'DISCONTINUOUS', INDETERMINATE) -continuous = express_getattr(IfcTransitionCode, 'CONTINUOUS', INDETERMINATE) -contsamegradient = express_getattr(IfcTransitionCode, 'CONTSAMEGRADIENT', INDETERMINATE) -contsamegradientsamecurvature = express_getattr(IfcTransitionCode, 'CONTSAMEGRADIENTSAMECURVATURE', INDETERMINATE) +discontinuous = IfcTransitionCode.DISCONTINUOUS +continuous = IfcTransitionCode.CONTINUOUS +contsamegradient = IfcTransitionCode.CONTSAMEGRADIENT +contsamegradientsamecurvature = IfcTransitionCode.CONTSAMEGRADIENTSAMECURVATURE IfcTransportElementFixedTypeEnum = enum_namespace() -elevator = express_getattr(IfcTransportElementFixedTypeEnum, 'ELEVATOR', INDETERMINATE) -escalator = express_getattr(IfcTransportElementFixedTypeEnum, 'ESCALATOR', INDETERMINATE) -movingwalkway = express_getattr(IfcTransportElementFixedTypeEnum, 'MOVINGWALKWAY', INDETERMINATE) -craneway = express_getattr(IfcTransportElementFixedTypeEnum, 'CRANEWAY', INDETERMINATE) -liftinggear = express_getattr(IfcTransportElementFixedTypeEnum, 'LIFTINGGEAR', INDETERMINATE) -haulinggear = express_getattr(IfcTransportElementFixedTypeEnum, 'HAULINGGEAR', INDETERMINATE) -userdefined = express_getattr(IfcTransportElementFixedTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTransportElementFixedTypeEnum, 'NOTDEFINED', INDETERMINATE) +elevator = IfcTransportElementFixedTypeEnum.ELEVATOR +escalator = IfcTransportElementFixedTypeEnum.ESCALATOR +movingwalkway = IfcTransportElementFixedTypeEnum.MOVINGWALKWAY +craneway = IfcTransportElementFixedTypeEnum.CRANEWAY +liftinggear = IfcTransportElementFixedTypeEnum.LIFTINGGEAR +haulinggear = IfcTransportElementFixedTypeEnum.HAULINGGEAR +userdefined = IfcTransportElementFixedTypeEnum.USERDEFINED +notdefined = IfcTransportElementFixedTypeEnum.NOTDEFINED IfcTransportElementNonFixedTypeEnum = enum_namespace() -vehicle = express_getattr(IfcTransportElementNonFixedTypeEnum, 'VEHICLE', INDETERMINATE) -vehicletracked = express_getattr(IfcTransportElementNonFixedTypeEnum, 'VEHICLETRACKED', INDETERMINATE) -rollingstock = express_getattr(IfcTransportElementNonFixedTypeEnum, 'ROLLINGSTOCK', INDETERMINATE) -vehiclewheeled = express_getattr(IfcTransportElementNonFixedTypeEnum, 'VEHICLEWHEELED', INDETERMINATE) -vehicleair = express_getattr(IfcTransportElementNonFixedTypeEnum, 'VEHICLEAIR', INDETERMINATE) -cargo = express_getattr(IfcTransportElementNonFixedTypeEnum, 'CARGO', INDETERMINATE) -vehiclemarine = express_getattr(IfcTransportElementNonFixedTypeEnum, 'VEHICLEMARINE', INDETERMINATE) -userdefined = express_getattr(IfcTransportElementNonFixedTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTransportElementNonFixedTypeEnum, 'NOTDEFINED', INDETERMINATE) +vehicle = IfcTransportElementNonFixedTypeEnum.VEHICLE +vehicletracked = IfcTransportElementNonFixedTypeEnum.VEHICLETRACKED +rollingstock = IfcTransportElementNonFixedTypeEnum.ROLLINGSTOCK +vehiclewheeled = IfcTransportElementNonFixedTypeEnum.VEHICLEWHEELED +vehicleair = IfcTransportElementNonFixedTypeEnum.VEHICLEAIR +cargo = IfcTransportElementNonFixedTypeEnum.CARGO +vehiclemarine = IfcTransportElementNonFixedTypeEnum.VEHICLEMARINE +userdefined = IfcTransportElementNonFixedTypeEnum.USERDEFINED +notdefined = IfcTransportElementNonFixedTypeEnum.NOTDEFINED IfcTrimmingPreference = enum_namespace() -cartesian = express_getattr(IfcTrimmingPreference, 'CARTESIAN', INDETERMINATE) -parameter = express_getattr(IfcTrimmingPreference, 'PARAMETER', INDETERMINATE) -unspecified = express_getattr(IfcTrimmingPreference, 'UNSPECIFIED', INDETERMINATE) +cartesian = IfcTrimmingPreference.CARTESIAN +parameter = IfcTrimmingPreference.PARAMETER +unspecified = IfcTrimmingPreference.UNSPECIFIED IfcTubeBundleTypeEnum = enum_namespace() -finned = express_getattr(IfcTubeBundleTypeEnum, 'FINNED', INDETERMINATE) -userdefined = express_getattr(IfcTubeBundleTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTubeBundleTypeEnum, 'NOTDEFINED', INDETERMINATE) +finned = IfcTubeBundleTypeEnum.FINNED +userdefined = IfcTubeBundleTypeEnum.USERDEFINED +notdefined = IfcTubeBundleTypeEnum.NOTDEFINED IfcUnitEnum = enum_namespace() -absorbeddoseunit = express_getattr(IfcUnitEnum, 'ABSORBEDDOSEUNIT', INDETERMINATE) -amountofsubstanceunit = express_getattr(IfcUnitEnum, 'AMOUNTOFSUBSTANCEUNIT', INDETERMINATE) -areaunit = express_getattr(IfcUnitEnum, 'AREAUNIT', INDETERMINATE) -doseequivalentunit = express_getattr(IfcUnitEnum, 'DOSEEQUIVALENTUNIT', INDETERMINATE) -electriccapacitanceunit = express_getattr(IfcUnitEnum, 'ELECTRICCAPACITANCEUNIT', INDETERMINATE) -electricchargeunit = express_getattr(IfcUnitEnum, 'ELECTRICCHARGEUNIT', INDETERMINATE) -electricconductanceunit = express_getattr(IfcUnitEnum, 'ELECTRICCONDUCTANCEUNIT', INDETERMINATE) -electriccurrentunit = express_getattr(IfcUnitEnum, 'ELECTRICCURRENTUNIT', INDETERMINATE) -electricresistanceunit = express_getattr(IfcUnitEnum, 'ELECTRICRESISTANCEUNIT', INDETERMINATE) -electricvoltageunit = express_getattr(IfcUnitEnum, 'ELECTRICVOLTAGEUNIT', INDETERMINATE) -energyunit = express_getattr(IfcUnitEnum, 'ENERGYUNIT', INDETERMINATE) -forceunit = express_getattr(IfcUnitEnum, 'FORCEUNIT', INDETERMINATE) -frequencyunit = express_getattr(IfcUnitEnum, 'FREQUENCYUNIT', INDETERMINATE) -illuminanceunit = express_getattr(IfcUnitEnum, 'ILLUMINANCEUNIT', INDETERMINATE) -inductanceunit = express_getattr(IfcUnitEnum, 'INDUCTANCEUNIT', INDETERMINATE) -lengthunit = express_getattr(IfcUnitEnum, 'LENGTHUNIT', INDETERMINATE) -luminousfluxunit = express_getattr(IfcUnitEnum, 'LUMINOUSFLUXUNIT', INDETERMINATE) -luminousintensityunit = express_getattr(IfcUnitEnum, 'LUMINOUSINTENSITYUNIT', INDETERMINATE) -magneticfluxdensityunit = express_getattr(IfcUnitEnum, 'MAGNETICFLUXDENSITYUNIT', INDETERMINATE) -magneticfluxunit = express_getattr(IfcUnitEnum, 'MAGNETICFLUXUNIT', INDETERMINATE) -massunit = express_getattr(IfcUnitEnum, 'MASSUNIT', INDETERMINATE) -planeangleunit = express_getattr(IfcUnitEnum, 'PLANEANGLEUNIT', INDETERMINATE) -powerunit = express_getattr(IfcUnitEnum, 'POWERUNIT', INDETERMINATE) -pressureunit = express_getattr(IfcUnitEnum, 'PRESSUREUNIT', INDETERMINATE) -radioactivityunit = express_getattr(IfcUnitEnum, 'RADIOACTIVITYUNIT', INDETERMINATE) -solidangleunit = express_getattr(IfcUnitEnum, 'SOLIDANGLEUNIT', INDETERMINATE) -thermodynamictemperatureunit = express_getattr(IfcUnitEnum, 'THERMODYNAMICTEMPERATUREUNIT', INDETERMINATE) -timeunit = express_getattr(IfcUnitEnum, 'TIMEUNIT', INDETERMINATE) -volumeunit = express_getattr(IfcUnitEnum, 'VOLUMEUNIT', INDETERMINATE) -userdefined = express_getattr(IfcUnitEnum, 'USERDEFINED', INDETERMINATE) +absorbeddoseunit = IfcUnitEnum.ABSORBEDDOSEUNIT +amountofsubstanceunit = IfcUnitEnum.AMOUNTOFSUBSTANCEUNIT +areaunit = IfcUnitEnum.AREAUNIT +doseequivalentunit = IfcUnitEnum.DOSEEQUIVALENTUNIT +electriccapacitanceunit = IfcUnitEnum.ELECTRICCAPACITANCEUNIT +electricchargeunit = IfcUnitEnum.ELECTRICCHARGEUNIT +electricconductanceunit = IfcUnitEnum.ELECTRICCONDUCTANCEUNIT +electriccurrentunit = IfcUnitEnum.ELECTRICCURRENTUNIT +electricresistanceunit = IfcUnitEnum.ELECTRICRESISTANCEUNIT +electricvoltageunit = IfcUnitEnum.ELECTRICVOLTAGEUNIT +energyunit = IfcUnitEnum.ENERGYUNIT +forceunit = IfcUnitEnum.FORCEUNIT +frequencyunit = IfcUnitEnum.FREQUENCYUNIT +illuminanceunit = IfcUnitEnum.ILLUMINANCEUNIT +inductanceunit = IfcUnitEnum.INDUCTANCEUNIT +lengthunit = IfcUnitEnum.LENGTHUNIT +luminousfluxunit = IfcUnitEnum.LUMINOUSFLUXUNIT +luminousintensityunit = IfcUnitEnum.LUMINOUSINTENSITYUNIT +magneticfluxdensityunit = IfcUnitEnum.MAGNETICFLUXDENSITYUNIT +magneticfluxunit = IfcUnitEnum.MAGNETICFLUXUNIT +massunit = IfcUnitEnum.MASSUNIT +planeangleunit = IfcUnitEnum.PLANEANGLEUNIT +powerunit = IfcUnitEnum.POWERUNIT +pressureunit = IfcUnitEnum.PRESSUREUNIT +radioactivityunit = IfcUnitEnum.RADIOACTIVITYUNIT +solidangleunit = IfcUnitEnum.SOLIDANGLEUNIT +thermodynamictemperatureunit = IfcUnitEnum.THERMODYNAMICTEMPERATUREUNIT +timeunit = IfcUnitEnum.TIMEUNIT +volumeunit = IfcUnitEnum.VOLUMEUNIT +userdefined = IfcUnitEnum.USERDEFINED IfcUnitaryControlElementTypeEnum = enum_namespace() -alarmpanel = express_getattr(IfcUnitaryControlElementTypeEnum, 'ALARMPANEL', INDETERMINATE) -controlpanel = express_getattr(IfcUnitaryControlElementTypeEnum, 'CONTROLPANEL', INDETERMINATE) -gasdetectionpanel = express_getattr(IfcUnitaryControlElementTypeEnum, 'GASDETECTIONPANEL', INDETERMINATE) -indicatorpanel = express_getattr(IfcUnitaryControlElementTypeEnum, 'INDICATORPANEL', INDETERMINATE) -mimicpanel = express_getattr(IfcUnitaryControlElementTypeEnum, 'MIMICPANEL', INDETERMINATE) -humidistat = express_getattr(IfcUnitaryControlElementTypeEnum, 'HUMIDISTAT', INDETERMINATE) -thermostat = express_getattr(IfcUnitaryControlElementTypeEnum, 'THERMOSTAT', INDETERMINATE) -weatherstation = express_getattr(IfcUnitaryControlElementTypeEnum, 'WEATHERSTATION', INDETERMINATE) -combined = express_getattr(IfcUnitaryControlElementTypeEnum, 'COMBINED', INDETERMINATE) -userdefined = express_getattr(IfcUnitaryControlElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcUnitaryControlElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +alarmpanel = IfcUnitaryControlElementTypeEnum.ALARMPANEL +controlpanel = IfcUnitaryControlElementTypeEnum.CONTROLPANEL +gasdetectionpanel = IfcUnitaryControlElementTypeEnum.GASDETECTIONPANEL +indicatorpanel = IfcUnitaryControlElementTypeEnum.INDICATORPANEL +mimicpanel = IfcUnitaryControlElementTypeEnum.MIMICPANEL +humidistat = IfcUnitaryControlElementTypeEnum.HUMIDISTAT +thermostat = IfcUnitaryControlElementTypeEnum.THERMOSTAT +weatherstation = IfcUnitaryControlElementTypeEnum.WEATHERSTATION +combined = IfcUnitaryControlElementTypeEnum.COMBINED +userdefined = IfcUnitaryControlElementTypeEnum.USERDEFINED +notdefined = IfcUnitaryControlElementTypeEnum.NOTDEFINED IfcUnitaryEquipmentTypeEnum = enum_namespace() -airhandler = express_getattr(IfcUnitaryEquipmentTypeEnum, 'AIRHANDLER', INDETERMINATE) -airconditioningunit = express_getattr(IfcUnitaryEquipmentTypeEnum, 'AIRCONDITIONINGUNIT', INDETERMINATE) -dehumidifier = express_getattr(IfcUnitaryEquipmentTypeEnum, 'DEHUMIDIFIER', INDETERMINATE) -splitsystem = express_getattr(IfcUnitaryEquipmentTypeEnum, 'SPLITSYSTEM', INDETERMINATE) -rooftopunit = express_getattr(IfcUnitaryEquipmentTypeEnum, 'ROOFTOPUNIT', INDETERMINATE) -userdefined = express_getattr(IfcUnitaryEquipmentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcUnitaryEquipmentTypeEnum, 'NOTDEFINED', INDETERMINATE) +airhandler = IfcUnitaryEquipmentTypeEnum.AIRHANDLER +airconditioningunit = IfcUnitaryEquipmentTypeEnum.AIRCONDITIONINGUNIT +dehumidifier = IfcUnitaryEquipmentTypeEnum.DEHUMIDIFIER +splitsystem = IfcUnitaryEquipmentTypeEnum.SPLITSYSTEM +rooftopunit = IfcUnitaryEquipmentTypeEnum.ROOFTOPUNIT +userdefined = IfcUnitaryEquipmentTypeEnum.USERDEFINED +notdefined = IfcUnitaryEquipmentTypeEnum.NOTDEFINED IfcValveTypeEnum = enum_namespace() -airrelease = express_getattr(IfcValveTypeEnum, 'AIRRELEASE', INDETERMINATE) -antivacuum = express_getattr(IfcValveTypeEnum, 'ANTIVACUUM', INDETERMINATE) -changeover = express_getattr(IfcValveTypeEnum, 'CHANGEOVER', INDETERMINATE) -check = express_getattr(IfcValveTypeEnum, 'CHECK', INDETERMINATE) -commissioning = express_getattr(IfcValveTypeEnum, 'COMMISSIONING', INDETERMINATE) -diverting = express_getattr(IfcValveTypeEnum, 'DIVERTING', INDETERMINATE) -drawoffcock = express_getattr(IfcValveTypeEnum, 'DRAWOFFCOCK', INDETERMINATE) -doublecheck = express_getattr(IfcValveTypeEnum, 'DOUBLECHECK', INDETERMINATE) -doubleregulating = express_getattr(IfcValveTypeEnum, 'DOUBLEREGULATING', INDETERMINATE) -faucet = express_getattr(IfcValveTypeEnum, 'FAUCET', INDETERMINATE) -flushing = express_getattr(IfcValveTypeEnum, 'FLUSHING', INDETERMINATE) -gascock = express_getattr(IfcValveTypeEnum, 'GASCOCK', INDETERMINATE) -gastap = express_getattr(IfcValveTypeEnum, 'GASTAP', INDETERMINATE) -isolating = express_getattr(IfcValveTypeEnum, 'ISOLATING', INDETERMINATE) -mixing = express_getattr(IfcValveTypeEnum, 'MIXING', INDETERMINATE) -pressurereducing = express_getattr(IfcValveTypeEnum, 'PRESSUREREDUCING', INDETERMINATE) -pressurerelief = express_getattr(IfcValveTypeEnum, 'PRESSURERELIEF', INDETERMINATE) -regulating = express_getattr(IfcValveTypeEnum, 'REGULATING', INDETERMINATE) -safetycutoff = express_getattr(IfcValveTypeEnum, 'SAFETYCUTOFF', INDETERMINATE) -steamtrap = express_getattr(IfcValveTypeEnum, 'STEAMTRAP', INDETERMINATE) -stopcock = express_getattr(IfcValveTypeEnum, 'STOPCOCK', INDETERMINATE) -userdefined = express_getattr(IfcValveTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcValveTypeEnum, 'NOTDEFINED', INDETERMINATE) +airrelease = IfcValveTypeEnum.AIRRELEASE +antivacuum = IfcValveTypeEnum.ANTIVACUUM +changeover = IfcValveTypeEnum.CHANGEOVER +check = IfcValveTypeEnum.CHECK +commissioning = IfcValveTypeEnum.COMMISSIONING +diverting = IfcValveTypeEnum.DIVERTING +drawoffcock = IfcValveTypeEnum.DRAWOFFCOCK +doublecheck = IfcValveTypeEnum.DOUBLECHECK +doubleregulating = IfcValveTypeEnum.DOUBLEREGULATING +faucet = IfcValveTypeEnum.FAUCET +flushing = IfcValveTypeEnum.FLUSHING +gascock = IfcValveTypeEnum.GASCOCK +gastap = IfcValveTypeEnum.GASTAP +isolating = IfcValveTypeEnum.ISOLATING +mixing = IfcValveTypeEnum.MIXING +pressurereducing = IfcValveTypeEnum.PRESSUREREDUCING +pressurerelief = IfcValveTypeEnum.PRESSURERELIEF +regulating = IfcValveTypeEnum.REGULATING +safetycutoff = IfcValveTypeEnum.SAFETYCUTOFF +steamtrap = IfcValveTypeEnum.STEAMTRAP +stopcock = IfcValveTypeEnum.STOPCOCK +userdefined = IfcValveTypeEnum.USERDEFINED +notdefined = IfcValveTypeEnum.NOTDEFINED IfcVibrationDamperTypeEnum = enum_namespace() -bending_yield = express_getattr(IfcVibrationDamperTypeEnum, 'BENDING_YIELD', INDETERMINATE) -shear_yield = express_getattr(IfcVibrationDamperTypeEnum, 'SHEAR_YIELD', INDETERMINATE) -axial_yield = express_getattr(IfcVibrationDamperTypeEnum, 'AXIAL_YIELD', INDETERMINATE) -friction = express_getattr(IfcVibrationDamperTypeEnum, 'FRICTION', INDETERMINATE) -viscous = express_getattr(IfcVibrationDamperTypeEnum, 'VISCOUS', INDETERMINATE) -rubber = express_getattr(IfcVibrationDamperTypeEnum, 'RUBBER', INDETERMINATE) -userdefined = express_getattr(IfcVibrationDamperTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcVibrationDamperTypeEnum, 'NOTDEFINED', INDETERMINATE) +bending_yield = IfcVibrationDamperTypeEnum.BENDING_YIELD +shear_yield = IfcVibrationDamperTypeEnum.SHEAR_YIELD +axial_yield = IfcVibrationDamperTypeEnum.AXIAL_YIELD +friction = IfcVibrationDamperTypeEnum.FRICTION +viscous = IfcVibrationDamperTypeEnum.VISCOUS +rubber = IfcVibrationDamperTypeEnum.RUBBER +userdefined = IfcVibrationDamperTypeEnum.USERDEFINED +notdefined = IfcVibrationDamperTypeEnum.NOTDEFINED IfcVibrationIsolatorTypeEnum = enum_namespace() -compression = express_getattr(IfcVibrationIsolatorTypeEnum, 'COMPRESSION', INDETERMINATE) -spring = express_getattr(IfcVibrationIsolatorTypeEnum, 'SPRING', INDETERMINATE) -base = express_getattr(IfcVibrationIsolatorTypeEnum, 'BASE', INDETERMINATE) -userdefined = express_getattr(IfcVibrationIsolatorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcVibrationIsolatorTypeEnum, 'NOTDEFINED', INDETERMINATE) +compression = IfcVibrationIsolatorTypeEnum.COMPRESSION +spring = IfcVibrationIsolatorTypeEnum.SPRING +base = IfcVibrationIsolatorTypeEnum.BASE +userdefined = IfcVibrationIsolatorTypeEnum.USERDEFINED +notdefined = IfcVibrationIsolatorTypeEnum.NOTDEFINED IfcVoidingFeatureTypeEnum = enum_namespace() -cutout = express_getattr(IfcVoidingFeatureTypeEnum, 'CUTOUT', INDETERMINATE) -notch = express_getattr(IfcVoidingFeatureTypeEnum, 'NOTCH', INDETERMINATE) -hole = express_getattr(IfcVoidingFeatureTypeEnum, 'HOLE', INDETERMINATE) -miter = express_getattr(IfcVoidingFeatureTypeEnum, 'MITER', INDETERMINATE) -chamfer = express_getattr(IfcVoidingFeatureTypeEnum, 'CHAMFER', INDETERMINATE) -edge = express_getattr(IfcVoidingFeatureTypeEnum, 'EDGE', INDETERMINATE) -userdefined = express_getattr(IfcVoidingFeatureTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcVoidingFeatureTypeEnum, 'NOTDEFINED', INDETERMINATE) +cutout = IfcVoidingFeatureTypeEnum.CUTOUT +notch = IfcVoidingFeatureTypeEnum.NOTCH +hole = IfcVoidingFeatureTypeEnum.HOLE +miter = IfcVoidingFeatureTypeEnum.MITER +chamfer = IfcVoidingFeatureTypeEnum.CHAMFER +edge = IfcVoidingFeatureTypeEnum.EDGE +userdefined = IfcVoidingFeatureTypeEnum.USERDEFINED +notdefined = IfcVoidingFeatureTypeEnum.NOTDEFINED IfcWallTypeEnum = enum_namespace() -movable = express_getattr(IfcWallTypeEnum, 'MOVABLE', INDETERMINATE) -parapet = express_getattr(IfcWallTypeEnum, 'PARAPET', INDETERMINATE) -partitioning = express_getattr(IfcWallTypeEnum, 'PARTITIONING', INDETERMINATE) -plumbingwall = express_getattr(IfcWallTypeEnum, 'PLUMBINGWALL', INDETERMINATE) -shear = express_getattr(IfcWallTypeEnum, 'SHEAR', INDETERMINATE) -solidwall = express_getattr(IfcWallTypeEnum, 'SOLIDWALL', INDETERMINATE) -standard = express_getattr(IfcWallTypeEnum, 'STANDARD', INDETERMINATE) -polygonal = express_getattr(IfcWallTypeEnum, 'POLYGONAL', INDETERMINATE) -elementedwall = express_getattr(IfcWallTypeEnum, 'ELEMENTEDWALL', INDETERMINATE) -retainingwall = express_getattr(IfcWallTypeEnum, 'RETAININGWALL', INDETERMINATE) -wavewall = express_getattr(IfcWallTypeEnum, 'WAVEWALL', INDETERMINATE) -userdefined = express_getattr(IfcWallTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcWallTypeEnum, 'NOTDEFINED', INDETERMINATE) +movable = IfcWallTypeEnum.MOVABLE +parapet = IfcWallTypeEnum.PARAPET +partitioning = IfcWallTypeEnum.PARTITIONING +plumbingwall = IfcWallTypeEnum.PLUMBINGWALL +shear = IfcWallTypeEnum.SHEAR +solidwall = IfcWallTypeEnum.SOLIDWALL +standard = IfcWallTypeEnum.STANDARD +polygonal = IfcWallTypeEnum.POLYGONAL +elementedwall = IfcWallTypeEnum.ELEMENTEDWALL +retainingwall = IfcWallTypeEnum.RETAININGWALL +wavewall = IfcWallTypeEnum.WAVEWALL +userdefined = IfcWallTypeEnum.USERDEFINED +notdefined = IfcWallTypeEnum.NOTDEFINED IfcWasteTerminalTypeEnum = enum_namespace() -floortrap = express_getattr(IfcWasteTerminalTypeEnum, 'FLOORTRAP', INDETERMINATE) -floorwaste = express_getattr(IfcWasteTerminalTypeEnum, 'FLOORWASTE', INDETERMINATE) -gullysump = express_getattr(IfcWasteTerminalTypeEnum, 'GULLYSUMP', INDETERMINATE) -gullytrap = express_getattr(IfcWasteTerminalTypeEnum, 'GULLYTRAP', INDETERMINATE) -roofdrain = express_getattr(IfcWasteTerminalTypeEnum, 'ROOFDRAIN', INDETERMINATE) -wastedisposalunit = express_getattr(IfcWasteTerminalTypeEnum, 'WASTEDISPOSALUNIT', INDETERMINATE) -wastetrap = express_getattr(IfcWasteTerminalTypeEnum, 'WASTETRAP', INDETERMINATE) -userdefined = express_getattr(IfcWasteTerminalTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcWasteTerminalTypeEnum, 'NOTDEFINED', INDETERMINATE) +floortrap = IfcWasteTerminalTypeEnum.FLOORTRAP +floorwaste = IfcWasteTerminalTypeEnum.FLOORWASTE +gullysump = IfcWasteTerminalTypeEnum.GULLYSUMP +gullytrap = IfcWasteTerminalTypeEnum.GULLYTRAP +roofdrain = IfcWasteTerminalTypeEnum.ROOFDRAIN +wastedisposalunit = IfcWasteTerminalTypeEnum.WASTEDISPOSALUNIT +wastetrap = IfcWasteTerminalTypeEnum.WASTETRAP +userdefined = IfcWasteTerminalTypeEnum.USERDEFINED +notdefined = IfcWasteTerminalTypeEnum.NOTDEFINED IfcWindowPanelOperationEnum = enum_namespace() -sidehungrighthand = express_getattr(IfcWindowPanelOperationEnum, 'SIDEHUNGRIGHTHAND', INDETERMINATE) -sidehunglefthand = express_getattr(IfcWindowPanelOperationEnum, 'SIDEHUNGLEFTHAND', INDETERMINATE) -tiltandturnrighthand = express_getattr(IfcWindowPanelOperationEnum, 'TILTANDTURNRIGHTHAND', INDETERMINATE) -tiltandturnlefthand = express_getattr(IfcWindowPanelOperationEnum, 'TILTANDTURNLEFTHAND', INDETERMINATE) -tophung = express_getattr(IfcWindowPanelOperationEnum, 'TOPHUNG', INDETERMINATE) -bottomhung = express_getattr(IfcWindowPanelOperationEnum, 'BOTTOMHUNG', INDETERMINATE) -pivothorizontal = express_getattr(IfcWindowPanelOperationEnum, 'PIVOTHORIZONTAL', INDETERMINATE) -pivotvertical = express_getattr(IfcWindowPanelOperationEnum, 'PIVOTVERTICAL', INDETERMINATE) -slidinghorizontal = express_getattr(IfcWindowPanelOperationEnum, 'SLIDINGHORIZONTAL', INDETERMINATE) -slidingvertical = express_getattr(IfcWindowPanelOperationEnum, 'SLIDINGVERTICAL', INDETERMINATE) -removablecasement = express_getattr(IfcWindowPanelOperationEnum, 'REMOVABLECASEMENT', INDETERMINATE) -fixedcasement = express_getattr(IfcWindowPanelOperationEnum, 'FIXEDCASEMENT', INDETERMINATE) -otheroperation = express_getattr(IfcWindowPanelOperationEnum, 'OTHEROPERATION', INDETERMINATE) -notdefined = express_getattr(IfcWindowPanelOperationEnum, 'NOTDEFINED', INDETERMINATE) +sidehungrighthand = IfcWindowPanelOperationEnum.SIDEHUNGRIGHTHAND +sidehunglefthand = IfcWindowPanelOperationEnum.SIDEHUNGLEFTHAND +tiltandturnrighthand = IfcWindowPanelOperationEnum.TILTANDTURNRIGHTHAND +tiltandturnlefthand = IfcWindowPanelOperationEnum.TILTANDTURNLEFTHAND +tophung = IfcWindowPanelOperationEnum.TOPHUNG +bottomhung = IfcWindowPanelOperationEnum.BOTTOMHUNG +pivothorizontal = IfcWindowPanelOperationEnum.PIVOTHORIZONTAL +pivotvertical = IfcWindowPanelOperationEnum.PIVOTVERTICAL +slidinghorizontal = IfcWindowPanelOperationEnum.SLIDINGHORIZONTAL +slidingvertical = IfcWindowPanelOperationEnum.SLIDINGVERTICAL +removablecasement = IfcWindowPanelOperationEnum.REMOVABLECASEMENT +fixedcasement = IfcWindowPanelOperationEnum.FIXEDCASEMENT +otheroperation = IfcWindowPanelOperationEnum.OTHEROPERATION +notdefined = IfcWindowPanelOperationEnum.NOTDEFINED IfcWindowPanelPositionEnum = enum_namespace() -left = express_getattr(IfcWindowPanelPositionEnum, 'LEFT', INDETERMINATE) -middle = express_getattr(IfcWindowPanelPositionEnum, 'MIDDLE', INDETERMINATE) -right = express_getattr(IfcWindowPanelPositionEnum, 'RIGHT', INDETERMINATE) -bottom = express_getattr(IfcWindowPanelPositionEnum, 'BOTTOM', INDETERMINATE) -top = express_getattr(IfcWindowPanelPositionEnum, 'TOP', INDETERMINATE) -notdefined = express_getattr(IfcWindowPanelPositionEnum, 'NOTDEFINED', INDETERMINATE) +left = IfcWindowPanelPositionEnum.LEFT +middle = IfcWindowPanelPositionEnum.MIDDLE +right = IfcWindowPanelPositionEnum.RIGHT +bottom = IfcWindowPanelPositionEnum.BOTTOM +top = IfcWindowPanelPositionEnum.TOP +notdefined = IfcWindowPanelPositionEnum.NOTDEFINED IfcWindowStyleConstructionEnum = enum_namespace() -aluminium = express_getattr(IfcWindowStyleConstructionEnum, 'ALUMINIUM', INDETERMINATE) -high_grade_steel = express_getattr(IfcWindowStyleConstructionEnum, 'HIGH_GRADE_STEEL', INDETERMINATE) -steel = express_getattr(IfcWindowStyleConstructionEnum, 'STEEL', INDETERMINATE) -wood = express_getattr(IfcWindowStyleConstructionEnum, 'WOOD', INDETERMINATE) -aluminium_wood = express_getattr(IfcWindowStyleConstructionEnum, 'ALUMINIUM_WOOD', INDETERMINATE) -plastic = express_getattr(IfcWindowStyleConstructionEnum, 'PLASTIC', INDETERMINATE) -other_construction = express_getattr(IfcWindowStyleConstructionEnum, 'OTHER_CONSTRUCTION', INDETERMINATE) -notdefined = express_getattr(IfcWindowStyleConstructionEnum, 'NOTDEFINED', INDETERMINATE) +aluminium = IfcWindowStyleConstructionEnum.ALUMINIUM +high_grade_steel = IfcWindowStyleConstructionEnum.HIGH_GRADE_STEEL +steel = IfcWindowStyleConstructionEnum.STEEL +wood = IfcWindowStyleConstructionEnum.WOOD +aluminium_wood = IfcWindowStyleConstructionEnum.ALUMINIUM_WOOD +plastic = IfcWindowStyleConstructionEnum.PLASTIC +other_construction = IfcWindowStyleConstructionEnum.OTHER_CONSTRUCTION +notdefined = IfcWindowStyleConstructionEnum.NOTDEFINED IfcWindowStyleOperationEnum = enum_namespace() -single_panel = express_getattr(IfcWindowStyleOperationEnum, 'SINGLE_PANEL', INDETERMINATE) -double_panel_vertical = express_getattr(IfcWindowStyleOperationEnum, 'DOUBLE_PANEL_VERTICAL', INDETERMINATE) -double_panel_horizontal = express_getattr(IfcWindowStyleOperationEnum, 'DOUBLE_PANEL_HORIZONTAL', INDETERMINATE) -triple_panel_vertical = express_getattr(IfcWindowStyleOperationEnum, 'TRIPLE_PANEL_VERTICAL', INDETERMINATE) -triple_panel_bottom = express_getattr(IfcWindowStyleOperationEnum, 'TRIPLE_PANEL_BOTTOM', INDETERMINATE) -triple_panel_top = express_getattr(IfcWindowStyleOperationEnum, 'TRIPLE_PANEL_TOP', INDETERMINATE) -triple_panel_left = express_getattr(IfcWindowStyleOperationEnum, 'TRIPLE_PANEL_LEFT', INDETERMINATE) -triple_panel_right = express_getattr(IfcWindowStyleOperationEnum, 'TRIPLE_PANEL_RIGHT', INDETERMINATE) -triple_panel_horizontal = express_getattr(IfcWindowStyleOperationEnum, 'TRIPLE_PANEL_HORIZONTAL', INDETERMINATE) -userdefined = express_getattr(IfcWindowStyleOperationEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcWindowStyleOperationEnum, 'NOTDEFINED', INDETERMINATE) +single_panel = IfcWindowStyleOperationEnum.SINGLE_PANEL +double_panel_vertical = IfcWindowStyleOperationEnum.DOUBLE_PANEL_VERTICAL +double_panel_horizontal = IfcWindowStyleOperationEnum.DOUBLE_PANEL_HORIZONTAL +triple_panel_vertical = IfcWindowStyleOperationEnum.TRIPLE_PANEL_VERTICAL +triple_panel_bottom = IfcWindowStyleOperationEnum.TRIPLE_PANEL_BOTTOM +triple_panel_top = IfcWindowStyleOperationEnum.TRIPLE_PANEL_TOP +triple_panel_left = IfcWindowStyleOperationEnum.TRIPLE_PANEL_LEFT +triple_panel_right = IfcWindowStyleOperationEnum.TRIPLE_PANEL_RIGHT +triple_panel_horizontal = IfcWindowStyleOperationEnum.TRIPLE_PANEL_HORIZONTAL +userdefined = IfcWindowStyleOperationEnum.USERDEFINED +notdefined = IfcWindowStyleOperationEnum.NOTDEFINED IfcWindowTypeEnum = enum_namespace() -window = express_getattr(IfcWindowTypeEnum, 'WINDOW', INDETERMINATE) -skylight = express_getattr(IfcWindowTypeEnum, 'SKYLIGHT', INDETERMINATE) -lightdome = express_getattr(IfcWindowTypeEnum, 'LIGHTDOME', INDETERMINATE) -userdefined = express_getattr(IfcWindowTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcWindowTypeEnum, 'NOTDEFINED', INDETERMINATE) +window = IfcWindowTypeEnum.WINDOW +skylight = IfcWindowTypeEnum.SKYLIGHT +lightdome = IfcWindowTypeEnum.LIGHTDOME +userdefined = IfcWindowTypeEnum.USERDEFINED +notdefined = IfcWindowTypeEnum.NOTDEFINED IfcWindowTypePartitioningEnum = enum_namespace() -single_panel = express_getattr(IfcWindowTypePartitioningEnum, 'SINGLE_PANEL', INDETERMINATE) -double_panel_vertical = express_getattr(IfcWindowTypePartitioningEnum, 'DOUBLE_PANEL_VERTICAL', INDETERMINATE) -double_panel_horizontal = express_getattr(IfcWindowTypePartitioningEnum, 'DOUBLE_PANEL_HORIZONTAL', INDETERMINATE) -triple_panel_vertical = express_getattr(IfcWindowTypePartitioningEnum, 'TRIPLE_PANEL_VERTICAL', INDETERMINATE) -triple_panel_bottom = express_getattr(IfcWindowTypePartitioningEnum, 'TRIPLE_PANEL_BOTTOM', INDETERMINATE) -triple_panel_top = express_getattr(IfcWindowTypePartitioningEnum, 'TRIPLE_PANEL_TOP', INDETERMINATE) -triple_panel_left = express_getattr(IfcWindowTypePartitioningEnum, 'TRIPLE_PANEL_LEFT', INDETERMINATE) -triple_panel_right = express_getattr(IfcWindowTypePartitioningEnum, 'TRIPLE_PANEL_RIGHT', INDETERMINATE) -triple_panel_horizontal = express_getattr(IfcWindowTypePartitioningEnum, 'TRIPLE_PANEL_HORIZONTAL', INDETERMINATE) -userdefined = express_getattr(IfcWindowTypePartitioningEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcWindowTypePartitioningEnum, 'NOTDEFINED', INDETERMINATE) +single_panel = IfcWindowTypePartitioningEnum.SINGLE_PANEL +double_panel_vertical = IfcWindowTypePartitioningEnum.DOUBLE_PANEL_VERTICAL +double_panel_horizontal = IfcWindowTypePartitioningEnum.DOUBLE_PANEL_HORIZONTAL +triple_panel_vertical = IfcWindowTypePartitioningEnum.TRIPLE_PANEL_VERTICAL +triple_panel_bottom = IfcWindowTypePartitioningEnum.TRIPLE_PANEL_BOTTOM +triple_panel_top = IfcWindowTypePartitioningEnum.TRIPLE_PANEL_TOP +triple_panel_left = IfcWindowTypePartitioningEnum.TRIPLE_PANEL_LEFT +triple_panel_right = IfcWindowTypePartitioningEnum.TRIPLE_PANEL_RIGHT +triple_panel_horizontal = IfcWindowTypePartitioningEnum.TRIPLE_PANEL_HORIZONTAL +userdefined = IfcWindowTypePartitioningEnum.USERDEFINED +notdefined = IfcWindowTypePartitioningEnum.NOTDEFINED IfcWorkCalendarTypeEnum = enum_namespace() -firstshift = express_getattr(IfcWorkCalendarTypeEnum, 'FIRSTSHIFT', INDETERMINATE) -secondshift = express_getattr(IfcWorkCalendarTypeEnum, 'SECONDSHIFT', INDETERMINATE) -thirdshift = express_getattr(IfcWorkCalendarTypeEnum, 'THIRDSHIFT', INDETERMINATE) -userdefined = express_getattr(IfcWorkCalendarTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcWorkCalendarTypeEnum, 'NOTDEFINED', INDETERMINATE) +firstshift = IfcWorkCalendarTypeEnum.FIRSTSHIFT +secondshift = IfcWorkCalendarTypeEnum.SECONDSHIFT +thirdshift = IfcWorkCalendarTypeEnum.THIRDSHIFT +userdefined = IfcWorkCalendarTypeEnum.USERDEFINED +notdefined = IfcWorkCalendarTypeEnum.NOTDEFINED IfcWorkPlanTypeEnum = enum_namespace() -actual = express_getattr(IfcWorkPlanTypeEnum, 'ACTUAL', INDETERMINATE) -baseline = express_getattr(IfcWorkPlanTypeEnum, 'BASELINE', INDETERMINATE) -planned = express_getattr(IfcWorkPlanTypeEnum, 'PLANNED', INDETERMINATE) -userdefined = express_getattr(IfcWorkPlanTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcWorkPlanTypeEnum, 'NOTDEFINED', INDETERMINATE) +actual = IfcWorkPlanTypeEnum.ACTUAL +baseline = IfcWorkPlanTypeEnum.BASELINE +planned = IfcWorkPlanTypeEnum.PLANNED +userdefined = IfcWorkPlanTypeEnum.USERDEFINED +notdefined = IfcWorkPlanTypeEnum.NOTDEFINED IfcWorkScheduleTypeEnum = enum_namespace() -actual = express_getattr(IfcWorkScheduleTypeEnum, 'ACTUAL', INDETERMINATE) -baseline = express_getattr(IfcWorkScheduleTypeEnum, 'BASELINE', INDETERMINATE) -planned = express_getattr(IfcWorkScheduleTypeEnum, 'PLANNED', INDETERMINATE) -userdefined = express_getattr(IfcWorkScheduleTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcWorkScheduleTypeEnum, 'NOTDEFINED', INDETERMINATE) +actual = IfcWorkScheduleTypeEnum.ACTUAL +baseline = IfcWorkScheduleTypeEnum.BASELINE +planned = IfcWorkScheduleTypeEnum.PLANNED +userdefined = IfcWorkScheduleTypeEnum.USERDEFINED +notdefined = IfcWorkScheduleTypeEnum.NOTDEFINED def IfcActionRequest(*args, **kwargs): return ifcopenshell.create_entity('IfcActionRequest', 'IFC4X3_RC3', *args, **kwargs) diff --git a/src/ifcopenshell-python/ifcopenshell/express/rules/IFC4X3_RC4.py b/src/ifcopenshell-python/ifcopenshell/express/rules/IFC4X3_RC4.py index c83c75b94a2..1a0dbfb756f 100644 --- a/src/ifcopenshell-python/ifcopenshell/express/rules/IFC4X3_RC4.py +++ b/src/ifcopenshell-python/ifcopenshell/express/rules/IFC4X3_RC4.py @@ -1,5 +1,8 @@ import ifcopenshell +def is_indeterminate(v): + return v is None or type(v).__name__ == 'indeterminate_type' + def exists(v): if callable(v): try: @@ -7,10 +10,10 @@ def exists(v): except IndexError as e: return False else: - return v is not None + return not is_indeterminate(v) def nvl(v, default): - return v if v is not None else default + return v if not is_indeterminate(v) else default def is_entity(inst): if isinstance(inst, ifcopenshell.entity_instance): @@ -22,13 +25,13 @@ def is_entity(inst): def express_len(v): if isinstance(v, ifcopenshell.entity_instance) and (not is_entity(v)): v = v[0] - elif v is None or v is INDETERMINATE: + elif is_indeterminate(v): return INDETERMINATE return len(v) old_range = range def range(*args): - if INDETERMINATE in args: + if any(map(is_indeterminate, args)): return yield from old_range(*args) sizeof = express_len @@ -149,2392 +152,2392 @@ class enum_namespace: def __getattr__(self, k): return express_getattr(k, 'upper', INDETERMINATE)() IfcActionRequestTypeEnum = enum_namespace() -email = express_getattr(IfcActionRequestTypeEnum, 'EMAIL', INDETERMINATE) -fax = express_getattr(IfcActionRequestTypeEnum, 'FAX', INDETERMINATE) -phone = express_getattr(IfcActionRequestTypeEnum, 'PHONE', INDETERMINATE) -post = express_getattr(IfcActionRequestTypeEnum, 'POST', INDETERMINATE) -verbal = express_getattr(IfcActionRequestTypeEnum, 'VERBAL', INDETERMINATE) -userdefined = express_getattr(IfcActionRequestTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcActionRequestTypeEnum, 'NOTDEFINED', INDETERMINATE) +email = IfcActionRequestTypeEnum.EMAIL +fax = IfcActionRequestTypeEnum.FAX +phone = IfcActionRequestTypeEnum.PHONE +post = IfcActionRequestTypeEnum.POST +verbal = IfcActionRequestTypeEnum.VERBAL +userdefined = IfcActionRequestTypeEnum.USERDEFINED +notdefined = IfcActionRequestTypeEnum.NOTDEFINED IfcActionSourceTypeEnum = enum_namespace() -dead_load_g = express_getattr(IfcActionSourceTypeEnum, 'DEAD_LOAD_G', INDETERMINATE) -completion_g1 = express_getattr(IfcActionSourceTypeEnum, 'COMPLETION_G1', INDETERMINATE) -live_load_q = express_getattr(IfcActionSourceTypeEnum, 'LIVE_LOAD_Q', INDETERMINATE) -snow_s = express_getattr(IfcActionSourceTypeEnum, 'SNOW_S', INDETERMINATE) -wind_w = express_getattr(IfcActionSourceTypeEnum, 'WIND_W', INDETERMINATE) -prestressing_p = express_getattr(IfcActionSourceTypeEnum, 'PRESTRESSING_P', INDETERMINATE) -settlement_u = express_getattr(IfcActionSourceTypeEnum, 'SETTLEMENT_U', INDETERMINATE) -temperature_t = express_getattr(IfcActionSourceTypeEnum, 'TEMPERATURE_T', INDETERMINATE) -earthquake_e = express_getattr(IfcActionSourceTypeEnum, 'EARTHQUAKE_E', INDETERMINATE) -fire = express_getattr(IfcActionSourceTypeEnum, 'FIRE', INDETERMINATE) -impulse = express_getattr(IfcActionSourceTypeEnum, 'IMPULSE', INDETERMINATE) -impact = express_getattr(IfcActionSourceTypeEnum, 'IMPACT', INDETERMINATE) -transport = express_getattr(IfcActionSourceTypeEnum, 'TRANSPORT', INDETERMINATE) -erection = express_getattr(IfcActionSourceTypeEnum, 'ERECTION', INDETERMINATE) -propping = express_getattr(IfcActionSourceTypeEnum, 'PROPPING', INDETERMINATE) -system_imperfection = express_getattr(IfcActionSourceTypeEnum, 'SYSTEM_IMPERFECTION', INDETERMINATE) -shrinkage = express_getattr(IfcActionSourceTypeEnum, 'SHRINKAGE', INDETERMINATE) -creep = express_getattr(IfcActionSourceTypeEnum, 'CREEP', INDETERMINATE) -lack_of_fit = express_getattr(IfcActionSourceTypeEnum, 'LACK_OF_FIT', INDETERMINATE) -buoyancy = express_getattr(IfcActionSourceTypeEnum, 'BUOYANCY', INDETERMINATE) -ice = express_getattr(IfcActionSourceTypeEnum, 'ICE', INDETERMINATE) -current = express_getattr(IfcActionSourceTypeEnum, 'CURRENT', INDETERMINATE) -wave = express_getattr(IfcActionSourceTypeEnum, 'WAVE', INDETERMINATE) -rain = express_getattr(IfcActionSourceTypeEnum, 'RAIN', INDETERMINATE) -brakes = express_getattr(IfcActionSourceTypeEnum, 'BRAKES', INDETERMINATE) -userdefined = express_getattr(IfcActionSourceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcActionSourceTypeEnum, 'NOTDEFINED', INDETERMINATE) +dead_load_g = IfcActionSourceTypeEnum.DEAD_LOAD_G +completion_g1 = IfcActionSourceTypeEnum.COMPLETION_G1 +live_load_q = IfcActionSourceTypeEnum.LIVE_LOAD_Q +snow_s = IfcActionSourceTypeEnum.SNOW_S +wind_w = IfcActionSourceTypeEnum.WIND_W +prestressing_p = IfcActionSourceTypeEnum.PRESTRESSING_P +settlement_u = IfcActionSourceTypeEnum.SETTLEMENT_U +temperature_t = IfcActionSourceTypeEnum.TEMPERATURE_T +earthquake_e = IfcActionSourceTypeEnum.EARTHQUAKE_E +fire = IfcActionSourceTypeEnum.FIRE +impulse = IfcActionSourceTypeEnum.IMPULSE +impact = IfcActionSourceTypeEnum.IMPACT +transport = IfcActionSourceTypeEnum.TRANSPORT +erection = IfcActionSourceTypeEnum.ERECTION +propping = IfcActionSourceTypeEnum.PROPPING +system_imperfection = IfcActionSourceTypeEnum.SYSTEM_IMPERFECTION +shrinkage = IfcActionSourceTypeEnum.SHRINKAGE +creep = IfcActionSourceTypeEnum.CREEP +lack_of_fit = IfcActionSourceTypeEnum.LACK_OF_FIT +buoyancy = IfcActionSourceTypeEnum.BUOYANCY +ice = IfcActionSourceTypeEnum.ICE +current = IfcActionSourceTypeEnum.CURRENT +wave = IfcActionSourceTypeEnum.WAVE +rain = IfcActionSourceTypeEnum.RAIN +brakes = IfcActionSourceTypeEnum.BRAKES +userdefined = IfcActionSourceTypeEnum.USERDEFINED +notdefined = IfcActionSourceTypeEnum.NOTDEFINED IfcActionTypeEnum = enum_namespace() -permanent_g = express_getattr(IfcActionTypeEnum, 'PERMANENT_G', INDETERMINATE) -variable_q = express_getattr(IfcActionTypeEnum, 'VARIABLE_Q', INDETERMINATE) -extraordinary_a = express_getattr(IfcActionTypeEnum, 'EXTRAORDINARY_A', INDETERMINATE) -userdefined = express_getattr(IfcActionTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcActionTypeEnum, 'NOTDEFINED', INDETERMINATE) +permanent_g = IfcActionTypeEnum.PERMANENT_G +variable_q = IfcActionTypeEnum.VARIABLE_Q +extraordinary_a = IfcActionTypeEnum.EXTRAORDINARY_A +userdefined = IfcActionTypeEnum.USERDEFINED +notdefined = IfcActionTypeEnum.NOTDEFINED IfcActuatorTypeEnum = enum_namespace() -electricactuator = express_getattr(IfcActuatorTypeEnum, 'ELECTRICACTUATOR', INDETERMINATE) -handoperatedactuator = express_getattr(IfcActuatorTypeEnum, 'HANDOPERATEDACTUATOR', INDETERMINATE) -hydraulicactuator = express_getattr(IfcActuatorTypeEnum, 'HYDRAULICACTUATOR', INDETERMINATE) -pneumaticactuator = express_getattr(IfcActuatorTypeEnum, 'PNEUMATICACTUATOR', INDETERMINATE) -thermostaticactuator = express_getattr(IfcActuatorTypeEnum, 'THERMOSTATICACTUATOR', INDETERMINATE) -userdefined = express_getattr(IfcActuatorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcActuatorTypeEnum, 'NOTDEFINED', INDETERMINATE) +electricactuator = IfcActuatorTypeEnum.ELECTRICACTUATOR +handoperatedactuator = IfcActuatorTypeEnum.HANDOPERATEDACTUATOR +hydraulicactuator = IfcActuatorTypeEnum.HYDRAULICACTUATOR +pneumaticactuator = IfcActuatorTypeEnum.PNEUMATICACTUATOR +thermostaticactuator = IfcActuatorTypeEnum.THERMOSTATICACTUATOR +userdefined = IfcActuatorTypeEnum.USERDEFINED +notdefined = IfcActuatorTypeEnum.NOTDEFINED IfcAddressTypeEnum = enum_namespace() -office = express_getattr(IfcAddressTypeEnum, 'OFFICE', INDETERMINATE) -site = express_getattr(IfcAddressTypeEnum, 'SITE', INDETERMINATE) -home = express_getattr(IfcAddressTypeEnum, 'HOME', INDETERMINATE) -distributionpoint = express_getattr(IfcAddressTypeEnum, 'DISTRIBUTIONPOINT', INDETERMINATE) -userdefined = express_getattr(IfcAddressTypeEnum, 'USERDEFINED', INDETERMINATE) +office = IfcAddressTypeEnum.OFFICE +site = IfcAddressTypeEnum.SITE +home = IfcAddressTypeEnum.HOME +distributionpoint = IfcAddressTypeEnum.DISTRIBUTIONPOINT +userdefined = IfcAddressTypeEnum.USERDEFINED IfcAirTerminalBoxTypeEnum = enum_namespace() -constantflow = express_getattr(IfcAirTerminalBoxTypeEnum, 'CONSTANTFLOW', INDETERMINATE) -variableflowpressuredependant = express_getattr(IfcAirTerminalBoxTypeEnum, 'VARIABLEFLOWPRESSUREDEPENDANT', INDETERMINATE) -variableflowpressureindependant = express_getattr(IfcAirTerminalBoxTypeEnum, 'VARIABLEFLOWPRESSUREINDEPENDANT', INDETERMINATE) -userdefined = express_getattr(IfcAirTerminalBoxTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAirTerminalBoxTypeEnum, 'NOTDEFINED', INDETERMINATE) +constantflow = IfcAirTerminalBoxTypeEnum.CONSTANTFLOW +variableflowpressuredependant = IfcAirTerminalBoxTypeEnum.VARIABLEFLOWPRESSUREDEPENDANT +variableflowpressureindependant = IfcAirTerminalBoxTypeEnum.VARIABLEFLOWPRESSUREINDEPENDANT +userdefined = IfcAirTerminalBoxTypeEnum.USERDEFINED +notdefined = IfcAirTerminalBoxTypeEnum.NOTDEFINED IfcAirTerminalTypeEnum = enum_namespace() -diffuser = express_getattr(IfcAirTerminalTypeEnum, 'DIFFUSER', INDETERMINATE) -grille = express_getattr(IfcAirTerminalTypeEnum, 'GRILLE', INDETERMINATE) -louvre = express_getattr(IfcAirTerminalTypeEnum, 'LOUVRE', INDETERMINATE) -register = express_getattr(IfcAirTerminalTypeEnum, 'REGISTER', INDETERMINATE) -userdefined = express_getattr(IfcAirTerminalTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAirTerminalTypeEnum, 'NOTDEFINED', INDETERMINATE) +diffuser = IfcAirTerminalTypeEnum.DIFFUSER +grille = IfcAirTerminalTypeEnum.GRILLE +louvre = IfcAirTerminalTypeEnum.LOUVRE +register = IfcAirTerminalTypeEnum.REGISTER +userdefined = IfcAirTerminalTypeEnum.USERDEFINED +notdefined = IfcAirTerminalTypeEnum.NOTDEFINED IfcAirToAirHeatRecoveryTypeEnum = enum_namespace() -fixedplatecounterflowexchanger = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'FIXEDPLATECOUNTERFLOWEXCHANGER', INDETERMINATE) -fixedplatecrossflowexchanger = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'FIXEDPLATECROSSFLOWEXCHANGER', INDETERMINATE) -fixedplateparallelflowexchanger = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'FIXEDPLATEPARALLELFLOWEXCHANGER', INDETERMINATE) -rotarywheel = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'ROTARYWHEEL', INDETERMINATE) -runaroundcoilloop = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'RUNAROUNDCOILLOOP', INDETERMINATE) -heatpipe = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'HEATPIPE', INDETERMINATE) -twintowerenthalpyrecoveryloops = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'TWINTOWERENTHALPYRECOVERYLOOPS', INDETERMINATE) -thermosiphonsealedtubeheatexchangers = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'THERMOSIPHONSEALEDTUBEHEATEXCHANGERS', INDETERMINATE) -thermosiphoncoiltypeheatexchangers = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'THERMOSIPHONCOILTYPEHEATEXCHANGERS', INDETERMINATE) -userdefined = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'NOTDEFINED', INDETERMINATE) +fixedplatecounterflowexchanger = IfcAirToAirHeatRecoveryTypeEnum.FIXEDPLATECOUNTERFLOWEXCHANGER +fixedplatecrossflowexchanger = IfcAirToAirHeatRecoveryTypeEnum.FIXEDPLATECROSSFLOWEXCHANGER +fixedplateparallelflowexchanger = IfcAirToAirHeatRecoveryTypeEnum.FIXEDPLATEPARALLELFLOWEXCHANGER +rotarywheel = IfcAirToAirHeatRecoveryTypeEnum.ROTARYWHEEL +runaroundcoilloop = IfcAirToAirHeatRecoveryTypeEnum.RUNAROUNDCOILLOOP +heatpipe = IfcAirToAirHeatRecoveryTypeEnum.HEATPIPE +twintowerenthalpyrecoveryloops = IfcAirToAirHeatRecoveryTypeEnum.TWINTOWERENTHALPYRECOVERYLOOPS +thermosiphonsealedtubeheatexchangers = IfcAirToAirHeatRecoveryTypeEnum.THERMOSIPHONSEALEDTUBEHEATEXCHANGERS +thermosiphoncoiltypeheatexchangers = IfcAirToAirHeatRecoveryTypeEnum.THERMOSIPHONCOILTYPEHEATEXCHANGERS +userdefined = IfcAirToAirHeatRecoveryTypeEnum.USERDEFINED +notdefined = IfcAirToAirHeatRecoveryTypeEnum.NOTDEFINED IfcAlarmTypeEnum = enum_namespace() -bell = express_getattr(IfcAlarmTypeEnum, 'BELL', INDETERMINATE) -breakglassbutton = express_getattr(IfcAlarmTypeEnum, 'BREAKGLASSBUTTON', INDETERMINATE) -light = express_getattr(IfcAlarmTypeEnum, 'LIGHT', INDETERMINATE) -manualpullbox = express_getattr(IfcAlarmTypeEnum, 'MANUALPULLBOX', INDETERMINATE) -siren = express_getattr(IfcAlarmTypeEnum, 'SIREN', INDETERMINATE) -whistle = express_getattr(IfcAlarmTypeEnum, 'WHISTLE', INDETERMINATE) -railwaycrocodile = express_getattr(IfcAlarmTypeEnum, 'RAILWAYCROCODILE', INDETERMINATE) -railwaydetonator = express_getattr(IfcAlarmTypeEnum, 'RAILWAYDETONATOR', INDETERMINATE) -userdefined = express_getattr(IfcAlarmTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAlarmTypeEnum, 'NOTDEFINED', INDETERMINATE) +bell = IfcAlarmTypeEnum.BELL +breakglassbutton = IfcAlarmTypeEnum.BREAKGLASSBUTTON +light = IfcAlarmTypeEnum.LIGHT +manualpullbox = IfcAlarmTypeEnum.MANUALPULLBOX +siren = IfcAlarmTypeEnum.SIREN +whistle = IfcAlarmTypeEnum.WHISTLE +railwaycrocodile = IfcAlarmTypeEnum.RAILWAYCROCODILE +railwaydetonator = IfcAlarmTypeEnum.RAILWAYDETONATOR +userdefined = IfcAlarmTypeEnum.USERDEFINED +notdefined = IfcAlarmTypeEnum.NOTDEFINED IfcAlignmentCantSegmentTypeEnum = enum_namespace() -blosscurve = express_getattr(IfcAlignmentCantSegmentTypeEnum, 'BLOSSCURVE', INDETERMINATE) -constantcant = express_getattr(IfcAlignmentCantSegmentTypeEnum, 'CONSTANTCANT', INDETERMINATE) -cosinecurve = express_getattr(IfcAlignmentCantSegmentTypeEnum, 'COSINECURVE', INDETERMINATE) -helmertcurve = express_getattr(IfcAlignmentCantSegmentTypeEnum, 'HELMERTCURVE', INDETERMINATE) -lineartransition = express_getattr(IfcAlignmentCantSegmentTypeEnum, 'LINEARTRANSITION', INDETERMINATE) -sinecurve = express_getattr(IfcAlignmentCantSegmentTypeEnum, 'SINECURVE', INDETERMINATE) -viennesebend = express_getattr(IfcAlignmentCantSegmentTypeEnum, 'VIENNESEBEND', INDETERMINATE) +blosscurve = IfcAlignmentCantSegmentTypeEnum.BLOSSCURVE +constantcant = IfcAlignmentCantSegmentTypeEnum.CONSTANTCANT +cosinecurve = IfcAlignmentCantSegmentTypeEnum.COSINECURVE +helmertcurve = IfcAlignmentCantSegmentTypeEnum.HELMERTCURVE +lineartransition = IfcAlignmentCantSegmentTypeEnum.LINEARTRANSITION +sinecurve = IfcAlignmentCantSegmentTypeEnum.SINECURVE +viennesebend = IfcAlignmentCantSegmentTypeEnum.VIENNESEBEND IfcAlignmentHorizontalSegmentTypeEnum = enum_namespace() -line = express_getattr(IfcAlignmentHorizontalSegmentTypeEnum, 'LINE', INDETERMINATE) -circulararc = express_getattr(IfcAlignmentHorizontalSegmentTypeEnum, 'CIRCULARARC', INDETERMINATE) -clothoid = express_getattr(IfcAlignmentHorizontalSegmentTypeEnum, 'CLOTHOID', INDETERMINATE) -cubic = express_getattr(IfcAlignmentHorizontalSegmentTypeEnum, 'CUBIC', INDETERMINATE) -helmertcurve = express_getattr(IfcAlignmentHorizontalSegmentTypeEnum, 'HELMERTCURVE', INDETERMINATE) -blosscurve = express_getattr(IfcAlignmentHorizontalSegmentTypeEnum, 'BLOSSCURVE', INDETERMINATE) -cosinecurve = express_getattr(IfcAlignmentHorizontalSegmentTypeEnum, 'COSINECURVE', INDETERMINATE) -sinecurve = express_getattr(IfcAlignmentHorizontalSegmentTypeEnum, 'SINECURVE', INDETERMINATE) -viennesebend = express_getattr(IfcAlignmentHorizontalSegmentTypeEnum, 'VIENNESEBEND', INDETERMINATE) +line = IfcAlignmentHorizontalSegmentTypeEnum.LINE +circulararc = IfcAlignmentHorizontalSegmentTypeEnum.CIRCULARARC +clothoid = IfcAlignmentHorizontalSegmentTypeEnum.CLOTHOID +cubic = IfcAlignmentHorizontalSegmentTypeEnum.CUBIC +helmertcurve = IfcAlignmentHorizontalSegmentTypeEnum.HELMERTCURVE +blosscurve = IfcAlignmentHorizontalSegmentTypeEnum.BLOSSCURVE +cosinecurve = IfcAlignmentHorizontalSegmentTypeEnum.COSINECURVE +sinecurve = IfcAlignmentHorizontalSegmentTypeEnum.SINECURVE +viennesebend = IfcAlignmentHorizontalSegmentTypeEnum.VIENNESEBEND IfcAlignmentTypeEnum = enum_namespace() -userdefined = express_getattr(IfcAlignmentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAlignmentTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcAlignmentTypeEnum.USERDEFINED +notdefined = IfcAlignmentTypeEnum.NOTDEFINED IfcAlignmentVerticalSegmentTypeEnum = enum_namespace() -constantgradient = express_getattr(IfcAlignmentVerticalSegmentTypeEnum, 'CONSTANTGRADIENT', INDETERMINATE) -circulararc = express_getattr(IfcAlignmentVerticalSegmentTypeEnum, 'CIRCULARARC', INDETERMINATE) -parabolicarc = express_getattr(IfcAlignmentVerticalSegmentTypeEnum, 'PARABOLICARC', INDETERMINATE) -clothoid = express_getattr(IfcAlignmentVerticalSegmentTypeEnum, 'CLOTHOID', INDETERMINATE) +constantgradient = IfcAlignmentVerticalSegmentTypeEnum.CONSTANTGRADIENT +circulararc = IfcAlignmentVerticalSegmentTypeEnum.CIRCULARARC +parabolicarc = IfcAlignmentVerticalSegmentTypeEnum.PARABOLICARC +clothoid = IfcAlignmentVerticalSegmentTypeEnum.CLOTHOID IfcAnalysisModelTypeEnum = enum_namespace() -in_plane_loading_2d = express_getattr(IfcAnalysisModelTypeEnum, 'IN_PLANE_LOADING_2D', INDETERMINATE) -out_plane_loading_2d = express_getattr(IfcAnalysisModelTypeEnum, 'OUT_PLANE_LOADING_2D', INDETERMINATE) -loading_3d = express_getattr(IfcAnalysisModelTypeEnum, 'LOADING_3D', INDETERMINATE) -userdefined = express_getattr(IfcAnalysisModelTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAnalysisModelTypeEnum, 'NOTDEFINED', INDETERMINATE) +in_plane_loading_2d = IfcAnalysisModelTypeEnum.IN_PLANE_LOADING_2D +out_plane_loading_2d = IfcAnalysisModelTypeEnum.OUT_PLANE_LOADING_2D +loading_3d = IfcAnalysisModelTypeEnum.LOADING_3D +userdefined = IfcAnalysisModelTypeEnum.USERDEFINED +notdefined = IfcAnalysisModelTypeEnum.NOTDEFINED IfcAnalysisTheoryTypeEnum = enum_namespace() -first_order_theory = express_getattr(IfcAnalysisTheoryTypeEnum, 'FIRST_ORDER_THEORY', INDETERMINATE) -second_order_theory = express_getattr(IfcAnalysisTheoryTypeEnum, 'SECOND_ORDER_THEORY', INDETERMINATE) -third_order_theory = express_getattr(IfcAnalysisTheoryTypeEnum, 'THIRD_ORDER_THEORY', INDETERMINATE) -full_nonlinear_theory = express_getattr(IfcAnalysisTheoryTypeEnum, 'FULL_NONLINEAR_THEORY', INDETERMINATE) -userdefined = express_getattr(IfcAnalysisTheoryTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAnalysisTheoryTypeEnum, 'NOTDEFINED', INDETERMINATE) +first_order_theory = IfcAnalysisTheoryTypeEnum.FIRST_ORDER_THEORY +second_order_theory = IfcAnalysisTheoryTypeEnum.SECOND_ORDER_THEORY +third_order_theory = IfcAnalysisTheoryTypeEnum.THIRD_ORDER_THEORY +full_nonlinear_theory = IfcAnalysisTheoryTypeEnum.FULL_NONLINEAR_THEORY +userdefined = IfcAnalysisTheoryTypeEnum.USERDEFINED +notdefined = IfcAnalysisTheoryTypeEnum.NOTDEFINED IfcAnnotationTypeEnum = enum_namespace() -assumedpoint = express_getattr(IfcAnnotationTypeEnum, 'ASSUMEDPOINT', INDETERMINATE) -asbuiltarea = express_getattr(IfcAnnotationTypeEnum, 'ASBUILTAREA', INDETERMINATE) -asbuiltline = express_getattr(IfcAnnotationTypeEnum, 'ASBUILTLINE', INDETERMINATE) -non_physical_signal = express_getattr(IfcAnnotationTypeEnum, 'NON_PHYSICAL_SIGNAL', INDETERMINATE) -assumedline = express_getattr(IfcAnnotationTypeEnum, 'ASSUMEDLINE', INDETERMINATE) -widthevent = express_getattr(IfcAnnotationTypeEnum, 'WIDTHEVENT', INDETERMINATE) -assumedarea = express_getattr(IfcAnnotationTypeEnum, 'ASSUMEDAREA', INDETERMINATE) -superelevationevent = express_getattr(IfcAnnotationTypeEnum, 'SUPERELEVATIONEVENT', INDETERMINATE) -asbuiltpoint = express_getattr(IfcAnnotationTypeEnum, 'ASBUILTPOINT', INDETERMINATE) -userdefined = express_getattr(IfcAnnotationTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAnnotationTypeEnum, 'NOTDEFINED', INDETERMINATE) +assumedpoint = IfcAnnotationTypeEnum.ASSUMEDPOINT +asbuiltarea = IfcAnnotationTypeEnum.ASBUILTAREA +asbuiltline = IfcAnnotationTypeEnum.ASBUILTLINE +non_physical_signal = IfcAnnotationTypeEnum.NON_PHYSICAL_SIGNAL +assumedline = IfcAnnotationTypeEnum.ASSUMEDLINE +widthevent = IfcAnnotationTypeEnum.WIDTHEVENT +assumedarea = IfcAnnotationTypeEnum.ASSUMEDAREA +superelevationevent = IfcAnnotationTypeEnum.SUPERELEVATIONEVENT +asbuiltpoint = IfcAnnotationTypeEnum.ASBUILTPOINT +userdefined = IfcAnnotationTypeEnum.USERDEFINED +notdefined = IfcAnnotationTypeEnum.NOTDEFINED IfcArithmeticOperatorEnum = enum_namespace() -add = express_getattr(IfcArithmeticOperatorEnum, 'ADD', INDETERMINATE) -divide = express_getattr(IfcArithmeticOperatorEnum, 'DIVIDE', INDETERMINATE) -multiply = express_getattr(IfcArithmeticOperatorEnum, 'MULTIPLY', INDETERMINATE) -subtract = express_getattr(IfcArithmeticOperatorEnum, 'SUBTRACT', INDETERMINATE) +add = IfcArithmeticOperatorEnum.ADD +divide = IfcArithmeticOperatorEnum.DIVIDE +multiply = IfcArithmeticOperatorEnum.MULTIPLY +subtract = IfcArithmeticOperatorEnum.SUBTRACT IfcAssemblyPlaceEnum = enum_namespace() -site = express_getattr(IfcAssemblyPlaceEnum, 'SITE', INDETERMINATE) -factory = express_getattr(IfcAssemblyPlaceEnum, 'FACTORY', INDETERMINATE) -notdefined = express_getattr(IfcAssemblyPlaceEnum, 'NOTDEFINED', INDETERMINATE) +site = IfcAssemblyPlaceEnum.SITE +factory = IfcAssemblyPlaceEnum.FACTORY +notdefined = IfcAssemblyPlaceEnum.NOTDEFINED IfcAudioVisualApplianceTypeEnum = enum_namespace() -amplifier = express_getattr(IfcAudioVisualApplianceTypeEnum, 'AMPLIFIER', INDETERMINATE) -camera = express_getattr(IfcAudioVisualApplianceTypeEnum, 'CAMERA', INDETERMINATE) -display = express_getattr(IfcAudioVisualApplianceTypeEnum, 'DISPLAY', INDETERMINATE) -microphone = express_getattr(IfcAudioVisualApplianceTypeEnum, 'MICROPHONE', INDETERMINATE) -player = express_getattr(IfcAudioVisualApplianceTypeEnum, 'PLAYER', INDETERMINATE) -projector = express_getattr(IfcAudioVisualApplianceTypeEnum, 'PROJECTOR', INDETERMINATE) -receiver = express_getattr(IfcAudioVisualApplianceTypeEnum, 'RECEIVER', INDETERMINATE) -speaker = express_getattr(IfcAudioVisualApplianceTypeEnum, 'SPEAKER', INDETERMINATE) -switcher = express_getattr(IfcAudioVisualApplianceTypeEnum, 'SWITCHER', INDETERMINATE) -telephone = express_getattr(IfcAudioVisualApplianceTypeEnum, 'TELEPHONE', INDETERMINATE) -tuner = express_getattr(IfcAudioVisualApplianceTypeEnum, 'TUNER', INDETERMINATE) -communicationterminal = express_getattr(IfcAudioVisualApplianceTypeEnum, 'COMMUNICATIONTERMINAL', INDETERMINATE) -recordingequipment = express_getattr(IfcAudioVisualApplianceTypeEnum, 'RECORDINGEQUIPMENT', INDETERMINATE) -userdefined = express_getattr(IfcAudioVisualApplianceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAudioVisualApplianceTypeEnum, 'NOTDEFINED', INDETERMINATE) +amplifier = IfcAudioVisualApplianceTypeEnum.AMPLIFIER +camera = IfcAudioVisualApplianceTypeEnum.CAMERA +display = IfcAudioVisualApplianceTypeEnum.DISPLAY +microphone = IfcAudioVisualApplianceTypeEnum.MICROPHONE +player = IfcAudioVisualApplianceTypeEnum.PLAYER +projector = IfcAudioVisualApplianceTypeEnum.PROJECTOR +receiver = IfcAudioVisualApplianceTypeEnum.RECEIVER +speaker = IfcAudioVisualApplianceTypeEnum.SPEAKER +switcher = IfcAudioVisualApplianceTypeEnum.SWITCHER +telephone = IfcAudioVisualApplianceTypeEnum.TELEPHONE +tuner = IfcAudioVisualApplianceTypeEnum.TUNER +communicationterminal = IfcAudioVisualApplianceTypeEnum.COMMUNICATIONTERMINAL +recordingequipment = IfcAudioVisualApplianceTypeEnum.RECORDINGEQUIPMENT +userdefined = IfcAudioVisualApplianceTypeEnum.USERDEFINED +notdefined = IfcAudioVisualApplianceTypeEnum.NOTDEFINED IfcBSplineCurveForm = enum_namespace() -polyline_form = express_getattr(IfcBSplineCurveForm, 'POLYLINE_FORM', INDETERMINATE) -circular_arc = express_getattr(IfcBSplineCurveForm, 'CIRCULAR_ARC', INDETERMINATE) -elliptic_arc = express_getattr(IfcBSplineCurveForm, 'ELLIPTIC_ARC', INDETERMINATE) -parabolic_arc = express_getattr(IfcBSplineCurveForm, 'PARABOLIC_ARC', INDETERMINATE) -hyperbolic_arc = express_getattr(IfcBSplineCurveForm, 'HYPERBOLIC_ARC', INDETERMINATE) -unspecified = express_getattr(IfcBSplineCurveForm, 'UNSPECIFIED', INDETERMINATE) +polyline_form = IfcBSplineCurveForm.POLYLINE_FORM +circular_arc = IfcBSplineCurveForm.CIRCULAR_ARC +elliptic_arc = IfcBSplineCurveForm.ELLIPTIC_ARC +parabolic_arc = IfcBSplineCurveForm.PARABOLIC_ARC +hyperbolic_arc = IfcBSplineCurveForm.HYPERBOLIC_ARC +unspecified = IfcBSplineCurveForm.UNSPECIFIED IfcBSplineSurfaceForm = enum_namespace() -plane_surf = express_getattr(IfcBSplineSurfaceForm, 'PLANE_SURF', INDETERMINATE) -cylindrical_surf = express_getattr(IfcBSplineSurfaceForm, 'CYLINDRICAL_SURF', INDETERMINATE) -conical_surf = express_getattr(IfcBSplineSurfaceForm, 'CONICAL_SURF', INDETERMINATE) -spherical_surf = express_getattr(IfcBSplineSurfaceForm, 'SPHERICAL_SURF', INDETERMINATE) -toroidal_surf = express_getattr(IfcBSplineSurfaceForm, 'TOROIDAL_SURF', INDETERMINATE) -surf_of_revolution = express_getattr(IfcBSplineSurfaceForm, 'SURF_OF_REVOLUTION', INDETERMINATE) -ruled_surf = express_getattr(IfcBSplineSurfaceForm, 'RULED_SURF', INDETERMINATE) -generalised_cone = express_getattr(IfcBSplineSurfaceForm, 'GENERALISED_CONE', INDETERMINATE) -quadric_surf = express_getattr(IfcBSplineSurfaceForm, 'QUADRIC_SURF', INDETERMINATE) -surf_of_linear_extrusion = express_getattr(IfcBSplineSurfaceForm, 'SURF_OF_LINEAR_EXTRUSION', INDETERMINATE) -unspecified = express_getattr(IfcBSplineSurfaceForm, 'UNSPECIFIED', INDETERMINATE) +plane_surf = IfcBSplineSurfaceForm.PLANE_SURF +cylindrical_surf = IfcBSplineSurfaceForm.CYLINDRICAL_SURF +conical_surf = IfcBSplineSurfaceForm.CONICAL_SURF +spherical_surf = IfcBSplineSurfaceForm.SPHERICAL_SURF +toroidal_surf = IfcBSplineSurfaceForm.TOROIDAL_SURF +surf_of_revolution = IfcBSplineSurfaceForm.SURF_OF_REVOLUTION +ruled_surf = IfcBSplineSurfaceForm.RULED_SURF +generalised_cone = IfcBSplineSurfaceForm.GENERALISED_CONE +quadric_surf = IfcBSplineSurfaceForm.QUADRIC_SURF +surf_of_linear_extrusion = IfcBSplineSurfaceForm.SURF_OF_LINEAR_EXTRUSION +unspecified = IfcBSplineSurfaceForm.UNSPECIFIED IfcBeamTypeEnum = enum_namespace() -beam = express_getattr(IfcBeamTypeEnum, 'BEAM', INDETERMINATE) -joist = express_getattr(IfcBeamTypeEnum, 'JOIST', INDETERMINATE) -hollowcore = express_getattr(IfcBeamTypeEnum, 'HOLLOWCORE', INDETERMINATE) -lintel = express_getattr(IfcBeamTypeEnum, 'LINTEL', INDETERMINATE) -spandrel = express_getattr(IfcBeamTypeEnum, 'SPANDREL', INDETERMINATE) -t_beam = express_getattr(IfcBeamTypeEnum, 'T_BEAM', INDETERMINATE) -girder_segment = express_getattr(IfcBeamTypeEnum, 'GIRDER_SEGMENT', INDETERMINATE) -diaphragm = express_getattr(IfcBeamTypeEnum, 'DIAPHRAGM', INDETERMINATE) -piercap = express_getattr(IfcBeamTypeEnum, 'PIERCAP', INDETERMINATE) -hatstone = express_getattr(IfcBeamTypeEnum, 'HATSTONE', INDETERMINATE) -cornice = express_getattr(IfcBeamTypeEnum, 'CORNICE', INDETERMINATE) -edgebeam = express_getattr(IfcBeamTypeEnum, 'EDGEBEAM', INDETERMINATE) -userdefined = express_getattr(IfcBeamTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBeamTypeEnum, 'NOTDEFINED', INDETERMINATE) +beam = IfcBeamTypeEnum.BEAM +joist = IfcBeamTypeEnum.JOIST +hollowcore = IfcBeamTypeEnum.HOLLOWCORE +lintel = IfcBeamTypeEnum.LINTEL +spandrel = IfcBeamTypeEnum.SPANDREL +t_beam = IfcBeamTypeEnum.T_BEAM +girder_segment = IfcBeamTypeEnum.GIRDER_SEGMENT +diaphragm = IfcBeamTypeEnum.DIAPHRAGM +piercap = IfcBeamTypeEnum.PIERCAP +hatstone = IfcBeamTypeEnum.HATSTONE +cornice = IfcBeamTypeEnum.CORNICE +edgebeam = IfcBeamTypeEnum.EDGEBEAM +userdefined = IfcBeamTypeEnum.USERDEFINED +notdefined = IfcBeamTypeEnum.NOTDEFINED IfcBearingTypeDisplacementEnum = enum_namespace() -fixed_movement = express_getattr(IfcBearingTypeDisplacementEnum, 'FIXED_MOVEMENT', INDETERMINATE) -guided_longitudinal = express_getattr(IfcBearingTypeDisplacementEnum, 'GUIDED_LONGITUDINAL', INDETERMINATE) -guided_transversal = express_getattr(IfcBearingTypeDisplacementEnum, 'GUIDED_TRANSVERSAL', INDETERMINATE) -free_movement = express_getattr(IfcBearingTypeDisplacementEnum, 'FREE_MOVEMENT', INDETERMINATE) -notdefined = express_getattr(IfcBearingTypeDisplacementEnum, 'NOTDEFINED', INDETERMINATE) +fixed_movement = IfcBearingTypeDisplacementEnum.FIXED_MOVEMENT +guided_longitudinal = IfcBearingTypeDisplacementEnum.GUIDED_LONGITUDINAL +guided_transversal = IfcBearingTypeDisplacementEnum.GUIDED_TRANSVERSAL +free_movement = IfcBearingTypeDisplacementEnum.FREE_MOVEMENT +notdefined = IfcBearingTypeDisplacementEnum.NOTDEFINED IfcBearingTypeEnum = enum_namespace() -cylindrical = express_getattr(IfcBearingTypeEnum, 'CYLINDRICAL', INDETERMINATE) -spherical = express_getattr(IfcBearingTypeEnum, 'SPHERICAL', INDETERMINATE) -elastomeric = express_getattr(IfcBearingTypeEnum, 'ELASTOMERIC', INDETERMINATE) -pot = express_getattr(IfcBearingTypeEnum, 'POT', INDETERMINATE) -guide = express_getattr(IfcBearingTypeEnum, 'GUIDE', INDETERMINATE) -rocker = express_getattr(IfcBearingTypeEnum, 'ROCKER', INDETERMINATE) -roller = express_getattr(IfcBearingTypeEnum, 'ROLLER', INDETERMINATE) -disk = express_getattr(IfcBearingTypeEnum, 'DISK', INDETERMINATE) -userdefined = express_getattr(IfcBearingTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBearingTypeEnum, 'NOTDEFINED', INDETERMINATE) +cylindrical = IfcBearingTypeEnum.CYLINDRICAL +spherical = IfcBearingTypeEnum.SPHERICAL +elastomeric = IfcBearingTypeEnum.ELASTOMERIC +pot = IfcBearingTypeEnum.POT +guide = IfcBearingTypeEnum.GUIDE +rocker = IfcBearingTypeEnum.ROCKER +roller = IfcBearingTypeEnum.ROLLER +disk = IfcBearingTypeEnum.DISK +userdefined = IfcBearingTypeEnum.USERDEFINED +notdefined = IfcBearingTypeEnum.NOTDEFINED IfcBenchmarkEnum = enum_namespace() -greaterthan = express_getattr(IfcBenchmarkEnum, 'GREATERTHAN', INDETERMINATE) -greaterthanorequalto = express_getattr(IfcBenchmarkEnum, 'GREATERTHANOREQUALTO', INDETERMINATE) -lessthan = express_getattr(IfcBenchmarkEnum, 'LESSTHAN', INDETERMINATE) -lessthanorequalto = express_getattr(IfcBenchmarkEnum, 'LESSTHANOREQUALTO', INDETERMINATE) -equalto = express_getattr(IfcBenchmarkEnum, 'EQUALTO', INDETERMINATE) -notequalto = express_getattr(IfcBenchmarkEnum, 'NOTEQUALTO', INDETERMINATE) -includes = express_getattr(IfcBenchmarkEnum, 'INCLUDES', INDETERMINATE) -notincludes = express_getattr(IfcBenchmarkEnum, 'NOTINCLUDES', INDETERMINATE) -includedin = express_getattr(IfcBenchmarkEnum, 'INCLUDEDIN', INDETERMINATE) -notincludedin = express_getattr(IfcBenchmarkEnum, 'NOTINCLUDEDIN', INDETERMINATE) +greaterthan = IfcBenchmarkEnum.GREATERTHAN +greaterthanorequalto = IfcBenchmarkEnum.GREATERTHANOREQUALTO +lessthan = IfcBenchmarkEnum.LESSTHAN +lessthanorequalto = IfcBenchmarkEnum.LESSTHANOREQUALTO +equalto = IfcBenchmarkEnum.EQUALTO +notequalto = IfcBenchmarkEnum.NOTEQUALTO +includes = IfcBenchmarkEnum.INCLUDES +notincludes = IfcBenchmarkEnum.NOTINCLUDES +includedin = IfcBenchmarkEnum.INCLUDEDIN +notincludedin = IfcBenchmarkEnum.NOTINCLUDEDIN IfcBoilerTypeEnum = enum_namespace() -water = express_getattr(IfcBoilerTypeEnum, 'WATER', INDETERMINATE) -steam = express_getattr(IfcBoilerTypeEnum, 'STEAM', INDETERMINATE) -userdefined = express_getattr(IfcBoilerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBoilerTypeEnum, 'NOTDEFINED', INDETERMINATE) +water = IfcBoilerTypeEnum.WATER +steam = IfcBoilerTypeEnum.STEAM +userdefined = IfcBoilerTypeEnum.USERDEFINED +notdefined = IfcBoilerTypeEnum.NOTDEFINED IfcBooleanOperator = enum_namespace() -union = express_getattr(IfcBooleanOperator, 'UNION', INDETERMINATE) -intersection = express_getattr(IfcBooleanOperator, 'INTERSECTION', INDETERMINATE) -difference = express_getattr(IfcBooleanOperator, 'DIFFERENCE', INDETERMINATE) +union = IfcBooleanOperator.UNION +intersection = IfcBooleanOperator.INTERSECTION +difference = IfcBooleanOperator.DIFFERENCE IfcBridgePartTypeEnum = enum_namespace() -abutment = express_getattr(IfcBridgePartTypeEnum, 'ABUTMENT', INDETERMINATE) -deck = express_getattr(IfcBridgePartTypeEnum, 'DECK', INDETERMINATE) -deck_segment = express_getattr(IfcBridgePartTypeEnum, 'DECK_SEGMENT', INDETERMINATE) -foundation = express_getattr(IfcBridgePartTypeEnum, 'FOUNDATION', INDETERMINATE) -pier = express_getattr(IfcBridgePartTypeEnum, 'PIER', INDETERMINATE) -pier_segment = express_getattr(IfcBridgePartTypeEnum, 'PIER_SEGMENT', INDETERMINATE) -pylon = express_getattr(IfcBridgePartTypeEnum, 'PYLON', INDETERMINATE) -substructure = express_getattr(IfcBridgePartTypeEnum, 'SUBSTRUCTURE', INDETERMINATE) -superstructure = express_getattr(IfcBridgePartTypeEnum, 'SUPERSTRUCTURE', INDETERMINATE) -surfacestructure = express_getattr(IfcBridgePartTypeEnum, 'SURFACESTRUCTURE', INDETERMINATE) -userdefined = express_getattr(IfcBridgePartTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBridgePartTypeEnum, 'NOTDEFINED', INDETERMINATE) +abutment = IfcBridgePartTypeEnum.ABUTMENT +deck = IfcBridgePartTypeEnum.DECK +deck_segment = IfcBridgePartTypeEnum.DECK_SEGMENT +foundation = IfcBridgePartTypeEnum.FOUNDATION +pier = IfcBridgePartTypeEnum.PIER +pier_segment = IfcBridgePartTypeEnum.PIER_SEGMENT +pylon = IfcBridgePartTypeEnum.PYLON +substructure = IfcBridgePartTypeEnum.SUBSTRUCTURE +superstructure = IfcBridgePartTypeEnum.SUPERSTRUCTURE +surfacestructure = IfcBridgePartTypeEnum.SURFACESTRUCTURE +userdefined = IfcBridgePartTypeEnum.USERDEFINED +notdefined = IfcBridgePartTypeEnum.NOTDEFINED IfcBridgeTypeEnum = enum_namespace() -arched = express_getattr(IfcBridgeTypeEnum, 'ARCHED', INDETERMINATE) -cable_stayed = express_getattr(IfcBridgeTypeEnum, 'CABLE_STAYED', INDETERMINATE) -cantilever = express_getattr(IfcBridgeTypeEnum, 'CANTILEVER', INDETERMINATE) -culvert = express_getattr(IfcBridgeTypeEnum, 'CULVERT', INDETERMINATE) -framework = express_getattr(IfcBridgeTypeEnum, 'FRAMEWORK', INDETERMINATE) -girder = express_getattr(IfcBridgeTypeEnum, 'GIRDER', INDETERMINATE) -suspension = express_getattr(IfcBridgeTypeEnum, 'SUSPENSION', INDETERMINATE) -truss = express_getattr(IfcBridgeTypeEnum, 'TRUSS', INDETERMINATE) -userdefined = express_getattr(IfcBridgeTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBridgeTypeEnum, 'NOTDEFINED', INDETERMINATE) +arched = IfcBridgeTypeEnum.ARCHED +cable_stayed = IfcBridgeTypeEnum.CABLE_STAYED +cantilever = IfcBridgeTypeEnum.CANTILEVER +culvert = IfcBridgeTypeEnum.CULVERT +framework = IfcBridgeTypeEnum.FRAMEWORK +girder = IfcBridgeTypeEnum.GIRDER +suspension = IfcBridgeTypeEnum.SUSPENSION +truss = IfcBridgeTypeEnum.TRUSS +userdefined = IfcBridgeTypeEnum.USERDEFINED +notdefined = IfcBridgeTypeEnum.NOTDEFINED IfcBuildingElementPartTypeEnum = enum_namespace() -insulation = express_getattr(IfcBuildingElementPartTypeEnum, 'INSULATION', INDETERMINATE) -precastpanel = express_getattr(IfcBuildingElementPartTypeEnum, 'PRECASTPANEL', INDETERMINATE) -apron = express_getattr(IfcBuildingElementPartTypeEnum, 'APRON', INDETERMINATE) -armourunit = express_getattr(IfcBuildingElementPartTypeEnum, 'ARMOURUNIT', INDETERMINATE) -safetycage = express_getattr(IfcBuildingElementPartTypeEnum, 'SAFETYCAGE', INDETERMINATE) -userdefined = express_getattr(IfcBuildingElementPartTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBuildingElementPartTypeEnum, 'NOTDEFINED', INDETERMINATE) +insulation = IfcBuildingElementPartTypeEnum.INSULATION +precastpanel = IfcBuildingElementPartTypeEnum.PRECASTPANEL +apron = IfcBuildingElementPartTypeEnum.APRON +armourunit = IfcBuildingElementPartTypeEnum.ARMOURUNIT +safetycage = IfcBuildingElementPartTypeEnum.SAFETYCAGE +userdefined = IfcBuildingElementPartTypeEnum.USERDEFINED +notdefined = IfcBuildingElementPartTypeEnum.NOTDEFINED IfcBuildingElementProxyTypeEnum = enum_namespace() -complex = express_getattr(IfcBuildingElementProxyTypeEnum, 'COMPLEX', INDETERMINATE) -element = express_getattr(IfcBuildingElementProxyTypeEnum, 'ELEMENT', INDETERMINATE) -partial = express_getattr(IfcBuildingElementProxyTypeEnum, 'PARTIAL', INDETERMINATE) -provisionforvoid = express_getattr(IfcBuildingElementProxyTypeEnum, 'PROVISIONFORVOID', INDETERMINATE) -provisionforspace = express_getattr(IfcBuildingElementProxyTypeEnum, 'PROVISIONFORSPACE', INDETERMINATE) -userdefined = express_getattr(IfcBuildingElementProxyTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBuildingElementProxyTypeEnum, 'NOTDEFINED', INDETERMINATE) +complex = IfcBuildingElementProxyTypeEnum.COMPLEX +element = IfcBuildingElementProxyTypeEnum.ELEMENT +partial = IfcBuildingElementProxyTypeEnum.PARTIAL +provisionforvoid = IfcBuildingElementProxyTypeEnum.PROVISIONFORVOID +provisionforspace = IfcBuildingElementProxyTypeEnum.PROVISIONFORSPACE +userdefined = IfcBuildingElementProxyTypeEnum.USERDEFINED +notdefined = IfcBuildingElementProxyTypeEnum.NOTDEFINED IfcBuildingSystemTypeEnum = enum_namespace() -fenestration = express_getattr(IfcBuildingSystemTypeEnum, 'FENESTRATION', INDETERMINATE) -foundation = express_getattr(IfcBuildingSystemTypeEnum, 'FOUNDATION', INDETERMINATE) -loadbearing = express_getattr(IfcBuildingSystemTypeEnum, 'LOADBEARING', INDETERMINATE) -outershell = express_getattr(IfcBuildingSystemTypeEnum, 'OUTERSHELL', INDETERMINATE) -shading = express_getattr(IfcBuildingSystemTypeEnum, 'SHADING', INDETERMINATE) -transport = express_getattr(IfcBuildingSystemTypeEnum, 'TRANSPORT', INDETERMINATE) -reinforcing = express_getattr(IfcBuildingSystemTypeEnum, 'REINFORCING', INDETERMINATE) -prestressing = express_getattr(IfcBuildingSystemTypeEnum, 'PRESTRESSING', INDETERMINATE) -erosionprevention = express_getattr(IfcBuildingSystemTypeEnum, 'EROSIONPREVENTION', INDETERMINATE) -userdefined = express_getattr(IfcBuildingSystemTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBuildingSystemTypeEnum, 'NOTDEFINED', INDETERMINATE) +fenestration = IfcBuildingSystemTypeEnum.FENESTRATION +foundation = IfcBuildingSystemTypeEnum.FOUNDATION +loadbearing = IfcBuildingSystemTypeEnum.LOADBEARING +outershell = IfcBuildingSystemTypeEnum.OUTERSHELL +shading = IfcBuildingSystemTypeEnum.SHADING +transport = IfcBuildingSystemTypeEnum.TRANSPORT +reinforcing = IfcBuildingSystemTypeEnum.REINFORCING +prestressing = IfcBuildingSystemTypeEnum.PRESTRESSING +erosionprevention = IfcBuildingSystemTypeEnum.EROSIONPREVENTION +userdefined = IfcBuildingSystemTypeEnum.USERDEFINED +notdefined = IfcBuildingSystemTypeEnum.NOTDEFINED IfcBuiltSystemTypeEnum = enum_namespace() -reinforcing = express_getattr(IfcBuiltSystemTypeEnum, 'REINFORCING', INDETERMINATE) -mooring = express_getattr(IfcBuiltSystemTypeEnum, 'MOORING', INDETERMINATE) -outershell = express_getattr(IfcBuiltSystemTypeEnum, 'OUTERSHELL', INDETERMINATE) -trackcircuit = express_getattr(IfcBuiltSystemTypeEnum, 'TRACKCIRCUIT', INDETERMINATE) -erosionprevention = express_getattr(IfcBuiltSystemTypeEnum, 'EROSIONPREVENTION', INDETERMINATE) -foundation = express_getattr(IfcBuiltSystemTypeEnum, 'FOUNDATION', INDETERMINATE) -loadbearing = express_getattr(IfcBuiltSystemTypeEnum, 'LOADBEARING', INDETERMINATE) -shading = express_getattr(IfcBuiltSystemTypeEnum, 'SHADING', INDETERMINATE) -fenestration = express_getattr(IfcBuiltSystemTypeEnum, 'FENESTRATION', INDETERMINATE) -transport = express_getattr(IfcBuiltSystemTypeEnum, 'TRANSPORT', INDETERMINATE) -prestressing = express_getattr(IfcBuiltSystemTypeEnum, 'PRESTRESSING', INDETERMINATE) -userdefined = express_getattr(IfcBuiltSystemTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBuiltSystemTypeEnum, 'NOTDEFINED', INDETERMINATE) +reinforcing = IfcBuiltSystemTypeEnum.REINFORCING +mooring = IfcBuiltSystemTypeEnum.MOORING +outershell = IfcBuiltSystemTypeEnum.OUTERSHELL +trackcircuit = IfcBuiltSystemTypeEnum.TRACKCIRCUIT +erosionprevention = IfcBuiltSystemTypeEnum.EROSIONPREVENTION +foundation = IfcBuiltSystemTypeEnum.FOUNDATION +loadbearing = IfcBuiltSystemTypeEnum.LOADBEARING +shading = IfcBuiltSystemTypeEnum.SHADING +fenestration = IfcBuiltSystemTypeEnum.FENESTRATION +transport = IfcBuiltSystemTypeEnum.TRANSPORT +prestressing = IfcBuiltSystemTypeEnum.PRESTRESSING +userdefined = IfcBuiltSystemTypeEnum.USERDEFINED +notdefined = IfcBuiltSystemTypeEnum.NOTDEFINED IfcBurnerTypeEnum = enum_namespace() -userdefined = express_getattr(IfcBurnerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBurnerTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcBurnerTypeEnum.USERDEFINED +notdefined = IfcBurnerTypeEnum.NOTDEFINED IfcCableCarrierFittingTypeEnum = enum_namespace() -bend = express_getattr(IfcCableCarrierFittingTypeEnum, 'BEND', INDETERMINATE) -cross = express_getattr(IfcCableCarrierFittingTypeEnum, 'CROSS', INDETERMINATE) -reducer = express_getattr(IfcCableCarrierFittingTypeEnum, 'REDUCER', INDETERMINATE) -tee = express_getattr(IfcCableCarrierFittingTypeEnum, 'TEE', INDETERMINATE) -userdefined = express_getattr(IfcCableCarrierFittingTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCableCarrierFittingTypeEnum, 'NOTDEFINED', INDETERMINATE) +bend = IfcCableCarrierFittingTypeEnum.BEND +cross = IfcCableCarrierFittingTypeEnum.CROSS +reducer = IfcCableCarrierFittingTypeEnum.REDUCER +tee = IfcCableCarrierFittingTypeEnum.TEE +userdefined = IfcCableCarrierFittingTypeEnum.USERDEFINED +notdefined = IfcCableCarrierFittingTypeEnum.NOTDEFINED IfcCableCarrierSegmentTypeEnum = enum_namespace() -cableladdersegment = express_getattr(IfcCableCarrierSegmentTypeEnum, 'CABLELADDERSEGMENT', INDETERMINATE) -cabletraysegment = express_getattr(IfcCableCarrierSegmentTypeEnum, 'CABLETRAYSEGMENT', INDETERMINATE) -cabletrunkingsegment = express_getattr(IfcCableCarrierSegmentTypeEnum, 'CABLETRUNKINGSEGMENT', INDETERMINATE) -conduitsegment = express_getattr(IfcCableCarrierSegmentTypeEnum, 'CONDUITSEGMENT', INDETERMINATE) -cablebracket = express_getattr(IfcCableCarrierSegmentTypeEnum, 'CABLEBRACKET', INDETERMINATE) -catenarywire = express_getattr(IfcCableCarrierSegmentTypeEnum, 'CATENARYWIRE', INDETERMINATE) -dropper = express_getattr(IfcCableCarrierSegmentTypeEnum, 'DROPPER', INDETERMINATE) -userdefined = express_getattr(IfcCableCarrierSegmentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCableCarrierSegmentTypeEnum, 'NOTDEFINED', INDETERMINATE) +cableladdersegment = IfcCableCarrierSegmentTypeEnum.CABLELADDERSEGMENT +cabletraysegment = IfcCableCarrierSegmentTypeEnum.CABLETRAYSEGMENT +cabletrunkingsegment = IfcCableCarrierSegmentTypeEnum.CABLETRUNKINGSEGMENT +conduitsegment = IfcCableCarrierSegmentTypeEnum.CONDUITSEGMENT +cablebracket = IfcCableCarrierSegmentTypeEnum.CABLEBRACKET +catenarywire = IfcCableCarrierSegmentTypeEnum.CATENARYWIRE +dropper = IfcCableCarrierSegmentTypeEnum.DROPPER +userdefined = IfcCableCarrierSegmentTypeEnum.USERDEFINED +notdefined = IfcCableCarrierSegmentTypeEnum.NOTDEFINED IfcCableFittingTypeEnum = enum_namespace() -connector = express_getattr(IfcCableFittingTypeEnum, 'CONNECTOR', INDETERMINATE) -entry = express_getattr(IfcCableFittingTypeEnum, 'ENTRY', INDETERMINATE) -exit = express_getattr(IfcCableFittingTypeEnum, 'EXIT', INDETERMINATE) -junction = express_getattr(IfcCableFittingTypeEnum, 'JUNCTION', INDETERMINATE) -transition = express_getattr(IfcCableFittingTypeEnum, 'TRANSITION', INDETERMINATE) -fanout = express_getattr(IfcCableFittingTypeEnum, 'FANOUT', INDETERMINATE) -userdefined = express_getattr(IfcCableFittingTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCableFittingTypeEnum, 'NOTDEFINED', INDETERMINATE) +connector = IfcCableFittingTypeEnum.CONNECTOR +entry = IfcCableFittingTypeEnum.ENTRY +exit = IfcCableFittingTypeEnum.EXIT +junction = IfcCableFittingTypeEnum.JUNCTION +transition = IfcCableFittingTypeEnum.TRANSITION +fanout = IfcCableFittingTypeEnum.FANOUT +userdefined = IfcCableFittingTypeEnum.USERDEFINED +notdefined = IfcCableFittingTypeEnum.NOTDEFINED IfcCableSegmentTypeEnum = enum_namespace() -busbarsegment = express_getattr(IfcCableSegmentTypeEnum, 'BUSBARSEGMENT', INDETERMINATE) -cablesegment = express_getattr(IfcCableSegmentTypeEnum, 'CABLESEGMENT', INDETERMINATE) -conductorsegment = express_getattr(IfcCableSegmentTypeEnum, 'CONDUCTORSEGMENT', INDETERMINATE) -coresegment = express_getattr(IfcCableSegmentTypeEnum, 'CORESEGMENT', INDETERMINATE) -contactwiresegment = express_getattr(IfcCableSegmentTypeEnum, 'CONTACTWIRESEGMENT', INDETERMINATE) -fibersegment = express_getattr(IfcCableSegmentTypeEnum, 'FIBERSEGMENT', INDETERMINATE) -fibertube = express_getattr(IfcCableSegmentTypeEnum, 'FIBERTUBE', INDETERMINATE) -opticalcablesegment = express_getattr(IfcCableSegmentTypeEnum, 'OPTICALCABLESEGMENT', INDETERMINATE) -stitchwire = express_getattr(IfcCableSegmentTypeEnum, 'STITCHWIRE', INDETERMINATE) -wirepairsegment = express_getattr(IfcCableSegmentTypeEnum, 'WIREPAIRSEGMENT', INDETERMINATE) -userdefined = express_getattr(IfcCableSegmentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCableSegmentTypeEnum, 'NOTDEFINED', INDETERMINATE) +busbarsegment = IfcCableSegmentTypeEnum.BUSBARSEGMENT +cablesegment = IfcCableSegmentTypeEnum.CABLESEGMENT +conductorsegment = IfcCableSegmentTypeEnum.CONDUCTORSEGMENT +coresegment = IfcCableSegmentTypeEnum.CORESEGMENT +contactwiresegment = IfcCableSegmentTypeEnum.CONTACTWIRESEGMENT +fibersegment = IfcCableSegmentTypeEnum.FIBERSEGMENT +fibertube = IfcCableSegmentTypeEnum.FIBERTUBE +opticalcablesegment = IfcCableSegmentTypeEnum.OPTICALCABLESEGMENT +stitchwire = IfcCableSegmentTypeEnum.STITCHWIRE +wirepairsegment = IfcCableSegmentTypeEnum.WIREPAIRSEGMENT +userdefined = IfcCableSegmentTypeEnum.USERDEFINED +notdefined = IfcCableSegmentTypeEnum.NOTDEFINED IfcCaissonFoundationTypeEnum = enum_namespace() -well = express_getattr(IfcCaissonFoundationTypeEnum, 'WELL', INDETERMINATE) -caisson = express_getattr(IfcCaissonFoundationTypeEnum, 'CAISSON', INDETERMINATE) -userdefined = express_getattr(IfcCaissonFoundationTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCaissonFoundationTypeEnum, 'NOTDEFINED', INDETERMINATE) +well = IfcCaissonFoundationTypeEnum.WELL +caisson = IfcCaissonFoundationTypeEnum.CAISSON +userdefined = IfcCaissonFoundationTypeEnum.USERDEFINED +notdefined = IfcCaissonFoundationTypeEnum.NOTDEFINED IfcChangeActionEnum = enum_namespace() -nochange = express_getattr(IfcChangeActionEnum, 'NOCHANGE', INDETERMINATE) -modified = express_getattr(IfcChangeActionEnum, 'MODIFIED', INDETERMINATE) -added = express_getattr(IfcChangeActionEnum, 'ADDED', INDETERMINATE) -deleted = express_getattr(IfcChangeActionEnum, 'DELETED', INDETERMINATE) -notdefined = express_getattr(IfcChangeActionEnum, 'NOTDEFINED', INDETERMINATE) +nochange = IfcChangeActionEnum.NOCHANGE +modified = IfcChangeActionEnum.MODIFIED +added = IfcChangeActionEnum.ADDED +deleted = IfcChangeActionEnum.DELETED +notdefined = IfcChangeActionEnum.NOTDEFINED IfcChillerTypeEnum = enum_namespace() -aircooled = express_getattr(IfcChillerTypeEnum, 'AIRCOOLED', INDETERMINATE) -watercooled = express_getattr(IfcChillerTypeEnum, 'WATERCOOLED', INDETERMINATE) -heatrecovery = express_getattr(IfcChillerTypeEnum, 'HEATRECOVERY', INDETERMINATE) -userdefined = express_getattr(IfcChillerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcChillerTypeEnum, 'NOTDEFINED', INDETERMINATE) +aircooled = IfcChillerTypeEnum.AIRCOOLED +watercooled = IfcChillerTypeEnum.WATERCOOLED +heatrecovery = IfcChillerTypeEnum.HEATRECOVERY +userdefined = IfcChillerTypeEnum.USERDEFINED +notdefined = IfcChillerTypeEnum.NOTDEFINED IfcChimneyTypeEnum = enum_namespace() -userdefined = express_getattr(IfcChimneyTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcChimneyTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcChimneyTypeEnum.USERDEFINED +notdefined = IfcChimneyTypeEnum.NOTDEFINED IfcCoilTypeEnum = enum_namespace() -dxcoolingcoil = express_getattr(IfcCoilTypeEnum, 'DXCOOLINGCOIL', INDETERMINATE) -electricheatingcoil = express_getattr(IfcCoilTypeEnum, 'ELECTRICHEATINGCOIL', INDETERMINATE) -gasheatingcoil = express_getattr(IfcCoilTypeEnum, 'GASHEATINGCOIL', INDETERMINATE) -hydroniccoil = express_getattr(IfcCoilTypeEnum, 'HYDRONICCOIL', INDETERMINATE) -steamheatingcoil = express_getattr(IfcCoilTypeEnum, 'STEAMHEATINGCOIL', INDETERMINATE) -watercoolingcoil = express_getattr(IfcCoilTypeEnum, 'WATERCOOLINGCOIL', INDETERMINATE) -waterheatingcoil = express_getattr(IfcCoilTypeEnum, 'WATERHEATINGCOIL', INDETERMINATE) -userdefined = express_getattr(IfcCoilTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCoilTypeEnum, 'NOTDEFINED', INDETERMINATE) +dxcoolingcoil = IfcCoilTypeEnum.DXCOOLINGCOIL +electricheatingcoil = IfcCoilTypeEnum.ELECTRICHEATINGCOIL +gasheatingcoil = IfcCoilTypeEnum.GASHEATINGCOIL +hydroniccoil = IfcCoilTypeEnum.HYDRONICCOIL +steamheatingcoil = IfcCoilTypeEnum.STEAMHEATINGCOIL +watercoolingcoil = IfcCoilTypeEnum.WATERCOOLINGCOIL +waterheatingcoil = IfcCoilTypeEnum.WATERHEATINGCOIL +userdefined = IfcCoilTypeEnum.USERDEFINED +notdefined = IfcCoilTypeEnum.NOTDEFINED IfcColumnTypeEnum = enum_namespace() -column = express_getattr(IfcColumnTypeEnum, 'COLUMN', INDETERMINATE) -pilaster = express_getattr(IfcColumnTypeEnum, 'PILASTER', INDETERMINATE) -pierstem = express_getattr(IfcColumnTypeEnum, 'PIERSTEM', INDETERMINATE) -pierstem_segment = express_getattr(IfcColumnTypeEnum, 'PIERSTEM_SEGMENT', INDETERMINATE) -standcolumn = express_getattr(IfcColumnTypeEnum, 'STANDCOLUMN', INDETERMINATE) -userdefined = express_getattr(IfcColumnTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcColumnTypeEnum, 'NOTDEFINED', INDETERMINATE) +column = IfcColumnTypeEnum.COLUMN +pilaster = IfcColumnTypeEnum.PILASTER +pierstem = IfcColumnTypeEnum.PIERSTEM +pierstem_segment = IfcColumnTypeEnum.PIERSTEM_SEGMENT +standcolumn = IfcColumnTypeEnum.STANDCOLUMN +userdefined = IfcColumnTypeEnum.USERDEFINED +notdefined = IfcColumnTypeEnum.NOTDEFINED IfcCommunicationsApplianceTypeEnum = enum_namespace() -antenna = express_getattr(IfcCommunicationsApplianceTypeEnum, 'ANTENNA', INDETERMINATE) -computer = express_getattr(IfcCommunicationsApplianceTypeEnum, 'COMPUTER', INDETERMINATE) -fax = express_getattr(IfcCommunicationsApplianceTypeEnum, 'FAX', INDETERMINATE) -gateway = express_getattr(IfcCommunicationsApplianceTypeEnum, 'GATEWAY', INDETERMINATE) -modem = express_getattr(IfcCommunicationsApplianceTypeEnum, 'MODEM', INDETERMINATE) -networkappliance = express_getattr(IfcCommunicationsApplianceTypeEnum, 'NETWORKAPPLIANCE', INDETERMINATE) -networkbridge = express_getattr(IfcCommunicationsApplianceTypeEnum, 'NETWORKBRIDGE', INDETERMINATE) -networkhub = express_getattr(IfcCommunicationsApplianceTypeEnum, 'NETWORKHUB', INDETERMINATE) -printer = express_getattr(IfcCommunicationsApplianceTypeEnum, 'PRINTER', INDETERMINATE) -repeater = express_getattr(IfcCommunicationsApplianceTypeEnum, 'REPEATER', INDETERMINATE) -router = express_getattr(IfcCommunicationsApplianceTypeEnum, 'ROUTER', INDETERMINATE) -scanner = express_getattr(IfcCommunicationsApplianceTypeEnum, 'SCANNER', INDETERMINATE) -automaton = express_getattr(IfcCommunicationsApplianceTypeEnum, 'AUTOMATON', INDETERMINATE) -intelligentperipheral = express_getattr(IfcCommunicationsApplianceTypeEnum, 'INTELLIGENTPERIPHERAL', INDETERMINATE) -ipnetworkequipment = express_getattr(IfcCommunicationsApplianceTypeEnum, 'IPNETWORKEQUIPMENT', INDETERMINATE) -opticalnetworkunit = express_getattr(IfcCommunicationsApplianceTypeEnum, 'OPTICALNETWORKUNIT', INDETERMINATE) -telecommand = express_getattr(IfcCommunicationsApplianceTypeEnum, 'TELECOMMAND', INDETERMINATE) -telephonyexchange = express_getattr(IfcCommunicationsApplianceTypeEnum, 'TELEPHONYEXCHANGE', INDETERMINATE) -transitioncomponent = express_getattr(IfcCommunicationsApplianceTypeEnum, 'TRANSITIONCOMPONENT', INDETERMINATE) -transponder = express_getattr(IfcCommunicationsApplianceTypeEnum, 'TRANSPONDER', INDETERMINATE) -transportequipment = express_getattr(IfcCommunicationsApplianceTypeEnum, 'TRANSPORTEQUIPMENT', INDETERMINATE) -opticallineterminal = express_getattr(IfcCommunicationsApplianceTypeEnum, 'OPTICALLINETERMINAL', INDETERMINATE) -linesideelectronicunit = express_getattr(IfcCommunicationsApplianceTypeEnum, 'LINESIDEELECTRONICUNIT', INDETERMINATE) -radioblockcenter = express_getattr(IfcCommunicationsApplianceTypeEnum, 'RADIOBLOCKCENTER', INDETERMINATE) -userdefined = express_getattr(IfcCommunicationsApplianceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCommunicationsApplianceTypeEnum, 'NOTDEFINED', INDETERMINATE) +antenna = IfcCommunicationsApplianceTypeEnum.ANTENNA +computer = IfcCommunicationsApplianceTypeEnum.COMPUTER +fax = IfcCommunicationsApplianceTypeEnum.FAX +gateway = IfcCommunicationsApplianceTypeEnum.GATEWAY +modem = IfcCommunicationsApplianceTypeEnum.MODEM +networkappliance = IfcCommunicationsApplianceTypeEnum.NETWORKAPPLIANCE +networkbridge = IfcCommunicationsApplianceTypeEnum.NETWORKBRIDGE +networkhub = IfcCommunicationsApplianceTypeEnum.NETWORKHUB +printer = IfcCommunicationsApplianceTypeEnum.PRINTER +repeater = IfcCommunicationsApplianceTypeEnum.REPEATER +router = IfcCommunicationsApplianceTypeEnum.ROUTER +scanner = IfcCommunicationsApplianceTypeEnum.SCANNER +automaton = IfcCommunicationsApplianceTypeEnum.AUTOMATON +intelligentperipheral = IfcCommunicationsApplianceTypeEnum.INTELLIGENTPERIPHERAL +ipnetworkequipment = IfcCommunicationsApplianceTypeEnum.IPNETWORKEQUIPMENT +opticalnetworkunit = IfcCommunicationsApplianceTypeEnum.OPTICALNETWORKUNIT +telecommand = IfcCommunicationsApplianceTypeEnum.TELECOMMAND +telephonyexchange = IfcCommunicationsApplianceTypeEnum.TELEPHONYEXCHANGE +transitioncomponent = IfcCommunicationsApplianceTypeEnum.TRANSITIONCOMPONENT +transponder = IfcCommunicationsApplianceTypeEnum.TRANSPONDER +transportequipment = IfcCommunicationsApplianceTypeEnum.TRANSPORTEQUIPMENT +opticallineterminal = IfcCommunicationsApplianceTypeEnum.OPTICALLINETERMINAL +linesideelectronicunit = IfcCommunicationsApplianceTypeEnum.LINESIDEELECTRONICUNIT +radioblockcenter = IfcCommunicationsApplianceTypeEnum.RADIOBLOCKCENTER +userdefined = IfcCommunicationsApplianceTypeEnum.USERDEFINED +notdefined = IfcCommunicationsApplianceTypeEnum.NOTDEFINED IfcComplexPropertyTemplateTypeEnum = enum_namespace() -p_complex = express_getattr(IfcComplexPropertyTemplateTypeEnum, 'P_COMPLEX', INDETERMINATE) -q_complex = express_getattr(IfcComplexPropertyTemplateTypeEnum, 'Q_COMPLEX', INDETERMINATE) +p_complex = IfcComplexPropertyTemplateTypeEnum.P_COMPLEX +q_complex = IfcComplexPropertyTemplateTypeEnum.Q_COMPLEX IfcCompressorTypeEnum = enum_namespace() -dynamic = express_getattr(IfcCompressorTypeEnum, 'DYNAMIC', INDETERMINATE) -reciprocating = express_getattr(IfcCompressorTypeEnum, 'RECIPROCATING', INDETERMINATE) -rotary = express_getattr(IfcCompressorTypeEnum, 'ROTARY', INDETERMINATE) -scroll = express_getattr(IfcCompressorTypeEnum, 'SCROLL', INDETERMINATE) -trochoidal = express_getattr(IfcCompressorTypeEnum, 'TROCHOIDAL', INDETERMINATE) -singlestage = express_getattr(IfcCompressorTypeEnum, 'SINGLESTAGE', INDETERMINATE) -booster = express_getattr(IfcCompressorTypeEnum, 'BOOSTER', INDETERMINATE) -opentype = express_getattr(IfcCompressorTypeEnum, 'OPENTYPE', INDETERMINATE) -hermetic = express_getattr(IfcCompressorTypeEnum, 'HERMETIC', INDETERMINATE) -semihermetic = express_getattr(IfcCompressorTypeEnum, 'SEMIHERMETIC', INDETERMINATE) -weldedshellhermetic = express_getattr(IfcCompressorTypeEnum, 'WELDEDSHELLHERMETIC', INDETERMINATE) -rollingpiston = express_getattr(IfcCompressorTypeEnum, 'ROLLINGPISTON', INDETERMINATE) -rotaryvane = express_getattr(IfcCompressorTypeEnum, 'ROTARYVANE', INDETERMINATE) -singlescrew = express_getattr(IfcCompressorTypeEnum, 'SINGLESCREW', INDETERMINATE) -twinscrew = express_getattr(IfcCompressorTypeEnum, 'TWINSCREW', INDETERMINATE) -userdefined = express_getattr(IfcCompressorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCompressorTypeEnum, 'NOTDEFINED', INDETERMINATE) +dynamic = IfcCompressorTypeEnum.DYNAMIC +reciprocating = IfcCompressorTypeEnum.RECIPROCATING +rotary = IfcCompressorTypeEnum.ROTARY +scroll = IfcCompressorTypeEnum.SCROLL +trochoidal = IfcCompressorTypeEnum.TROCHOIDAL +singlestage = IfcCompressorTypeEnum.SINGLESTAGE +booster = IfcCompressorTypeEnum.BOOSTER +opentype = IfcCompressorTypeEnum.OPENTYPE +hermetic = IfcCompressorTypeEnum.HERMETIC +semihermetic = IfcCompressorTypeEnum.SEMIHERMETIC +weldedshellhermetic = IfcCompressorTypeEnum.WELDEDSHELLHERMETIC +rollingpiston = IfcCompressorTypeEnum.ROLLINGPISTON +rotaryvane = IfcCompressorTypeEnum.ROTARYVANE +singlescrew = IfcCompressorTypeEnum.SINGLESCREW +twinscrew = IfcCompressorTypeEnum.TWINSCREW +userdefined = IfcCompressorTypeEnum.USERDEFINED +notdefined = IfcCompressorTypeEnum.NOTDEFINED IfcCondenserTypeEnum = enum_namespace() -aircooled = express_getattr(IfcCondenserTypeEnum, 'AIRCOOLED', INDETERMINATE) -evaporativecooled = express_getattr(IfcCondenserTypeEnum, 'EVAPORATIVECOOLED', INDETERMINATE) -watercooled = express_getattr(IfcCondenserTypeEnum, 'WATERCOOLED', INDETERMINATE) -watercooledbrazedplate = express_getattr(IfcCondenserTypeEnum, 'WATERCOOLEDBRAZEDPLATE', INDETERMINATE) -watercooledshellcoil = express_getattr(IfcCondenserTypeEnum, 'WATERCOOLEDSHELLCOIL', INDETERMINATE) -watercooledshelltube = express_getattr(IfcCondenserTypeEnum, 'WATERCOOLEDSHELLTUBE', INDETERMINATE) -watercooledtubeintube = express_getattr(IfcCondenserTypeEnum, 'WATERCOOLEDTUBEINTUBE', INDETERMINATE) -userdefined = express_getattr(IfcCondenserTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCondenserTypeEnum, 'NOTDEFINED', INDETERMINATE) +aircooled = IfcCondenserTypeEnum.AIRCOOLED +evaporativecooled = IfcCondenserTypeEnum.EVAPORATIVECOOLED +watercooled = IfcCondenserTypeEnum.WATERCOOLED +watercooledbrazedplate = IfcCondenserTypeEnum.WATERCOOLEDBRAZEDPLATE +watercooledshellcoil = IfcCondenserTypeEnum.WATERCOOLEDSHELLCOIL +watercooledshelltube = IfcCondenserTypeEnum.WATERCOOLEDSHELLTUBE +watercooledtubeintube = IfcCondenserTypeEnum.WATERCOOLEDTUBEINTUBE +userdefined = IfcCondenserTypeEnum.USERDEFINED +notdefined = IfcCondenserTypeEnum.NOTDEFINED IfcConnectionTypeEnum = enum_namespace() -atpath = express_getattr(IfcConnectionTypeEnum, 'ATPATH', INDETERMINATE) -atstart = express_getattr(IfcConnectionTypeEnum, 'ATSTART', INDETERMINATE) -atend = express_getattr(IfcConnectionTypeEnum, 'ATEND', INDETERMINATE) -notdefined = express_getattr(IfcConnectionTypeEnum, 'NOTDEFINED', INDETERMINATE) +atpath = IfcConnectionTypeEnum.ATPATH +atstart = IfcConnectionTypeEnum.ATSTART +atend = IfcConnectionTypeEnum.ATEND +notdefined = IfcConnectionTypeEnum.NOTDEFINED IfcConstraintEnum = enum_namespace() -hard = express_getattr(IfcConstraintEnum, 'HARD', INDETERMINATE) -soft = express_getattr(IfcConstraintEnum, 'SOFT', INDETERMINATE) -advisory = express_getattr(IfcConstraintEnum, 'ADVISORY', INDETERMINATE) -userdefined = express_getattr(IfcConstraintEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcConstraintEnum, 'NOTDEFINED', INDETERMINATE) +hard = IfcConstraintEnum.HARD +soft = IfcConstraintEnum.SOFT +advisory = IfcConstraintEnum.ADVISORY +userdefined = IfcConstraintEnum.USERDEFINED +notdefined = IfcConstraintEnum.NOTDEFINED IfcConstructionEquipmentResourceTypeEnum = enum_namespace() -demolishing = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'DEMOLISHING', INDETERMINATE) -earthmoving = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'EARTHMOVING', INDETERMINATE) -erecting = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'ERECTING', INDETERMINATE) -heating = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'HEATING', INDETERMINATE) -lighting = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'LIGHTING', INDETERMINATE) -paving = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'PAVING', INDETERMINATE) -pumping = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'PUMPING', INDETERMINATE) -transporting = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'TRANSPORTING', INDETERMINATE) -userdefined = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'NOTDEFINED', INDETERMINATE) +demolishing = IfcConstructionEquipmentResourceTypeEnum.DEMOLISHING +earthmoving = IfcConstructionEquipmentResourceTypeEnum.EARTHMOVING +erecting = IfcConstructionEquipmentResourceTypeEnum.ERECTING +heating = IfcConstructionEquipmentResourceTypeEnum.HEATING +lighting = IfcConstructionEquipmentResourceTypeEnum.LIGHTING +paving = IfcConstructionEquipmentResourceTypeEnum.PAVING +pumping = IfcConstructionEquipmentResourceTypeEnum.PUMPING +transporting = IfcConstructionEquipmentResourceTypeEnum.TRANSPORTING +userdefined = IfcConstructionEquipmentResourceTypeEnum.USERDEFINED +notdefined = IfcConstructionEquipmentResourceTypeEnum.NOTDEFINED IfcConstructionMaterialResourceTypeEnum = enum_namespace() -aggregates = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'AGGREGATES', INDETERMINATE) -concrete = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'CONCRETE', INDETERMINATE) -drywall = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'DRYWALL', INDETERMINATE) -fuel = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'FUEL', INDETERMINATE) -gypsum = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'GYPSUM', INDETERMINATE) -masonry = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'MASONRY', INDETERMINATE) -metal = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'METAL', INDETERMINATE) -plastic = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'PLASTIC', INDETERMINATE) -wood = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'WOOD', INDETERMINATE) -notdefined = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'NOTDEFINED', INDETERMINATE) -userdefined = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'USERDEFINED', INDETERMINATE) +aggregates = IfcConstructionMaterialResourceTypeEnum.AGGREGATES +concrete = IfcConstructionMaterialResourceTypeEnum.CONCRETE +drywall = IfcConstructionMaterialResourceTypeEnum.DRYWALL +fuel = IfcConstructionMaterialResourceTypeEnum.FUEL +gypsum = IfcConstructionMaterialResourceTypeEnum.GYPSUM +masonry = IfcConstructionMaterialResourceTypeEnum.MASONRY +metal = IfcConstructionMaterialResourceTypeEnum.METAL +plastic = IfcConstructionMaterialResourceTypeEnum.PLASTIC +wood = IfcConstructionMaterialResourceTypeEnum.WOOD +notdefined = IfcConstructionMaterialResourceTypeEnum.NOTDEFINED +userdefined = IfcConstructionMaterialResourceTypeEnum.USERDEFINED IfcConstructionProductResourceTypeEnum = enum_namespace() -assembly = express_getattr(IfcConstructionProductResourceTypeEnum, 'ASSEMBLY', INDETERMINATE) -formwork = express_getattr(IfcConstructionProductResourceTypeEnum, 'FORMWORK', INDETERMINATE) -userdefined = express_getattr(IfcConstructionProductResourceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcConstructionProductResourceTypeEnum, 'NOTDEFINED', INDETERMINATE) +assembly = IfcConstructionProductResourceTypeEnum.ASSEMBLY +formwork = IfcConstructionProductResourceTypeEnum.FORMWORK +userdefined = IfcConstructionProductResourceTypeEnum.USERDEFINED +notdefined = IfcConstructionProductResourceTypeEnum.NOTDEFINED IfcControllerTypeEnum = enum_namespace() -floating = express_getattr(IfcControllerTypeEnum, 'FLOATING', INDETERMINATE) -programmable = express_getattr(IfcControllerTypeEnum, 'PROGRAMMABLE', INDETERMINATE) -proportional = express_getattr(IfcControllerTypeEnum, 'PROPORTIONAL', INDETERMINATE) -multiposition = express_getattr(IfcControllerTypeEnum, 'MULTIPOSITION', INDETERMINATE) -twoposition = express_getattr(IfcControllerTypeEnum, 'TWOPOSITION', INDETERMINATE) -userdefined = express_getattr(IfcControllerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcControllerTypeEnum, 'NOTDEFINED', INDETERMINATE) +floating = IfcControllerTypeEnum.FLOATING +programmable = IfcControllerTypeEnum.PROGRAMMABLE +proportional = IfcControllerTypeEnum.PROPORTIONAL +multiposition = IfcControllerTypeEnum.MULTIPOSITION +twoposition = IfcControllerTypeEnum.TWOPOSITION +userdefined = IfcControllerTypeEnum.USERDEFINED +notdefined = IfcControllerTypeEnum.NOTDEFINED IfcConveyorSegmentTypeEnum = enum_namespace() -chuteconveyor = express_getattr(IfcConveyorSegmentTypeEnum, 'CHUTECONVEYOR', INDETERMINATE) -beltconveyor = express_getattr(IfcConveyorSegmentTypeEnum, 'BELTCONVEYOR', INDETERMINATE) -screwconveyor = express_getattr(IfcConveyorSegmentTypeEnum, 'SCREWCONVEYOR', INDETERMINATE) -bucketconveyor = express_getattr(IfcConveyorSegmentTypeEnum, 'BUCKETCONVEYOR', INDETERMINATE) -userdefined = express_getattr(IfcConveyorSegmentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcConveyorSegmentTypeEnum, 'NOTDEFINED', INDETERMINATE) +chuteconveyor = IfcConveyorSegmentTypeEnum.CHUTECONVEYOR +beltconveyor = IfcConveyorSegmentTypeEnum.BELTCONVEYOR +screwconveyor = IfcConveyorSegmentTypeEnum.SCREWCONVEYOR +bucketconveyor = IfcConveyorSegmentTypeEnum.BUCKETCONVEYOR +userdefined = IfcConveyorSegmentTypeEnum.USERDEFINED +notdefined = IfcConveyorSegmentTypeEnum.NOTDEFINED IfcCooledBeamTypeEnum = enum_namespace() -active = express_getattr(IfcCooledBeamTypeEnum, 'ACTIVE', INDETERMINATE) -passive = express_getattr(IfcCooledBeamTypeEnum, 'PASSIVE', INDETERMINATE) -userdefined = express_getattr(IfcCooledBeamTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCooledBeamTypeEnum, 'NOTDEFINED', INDETERMINATE) +active = IfcCooledBeamTypeEnum.ACTIVE +passive = IfcCooledBeamTypeEnum.PASSIVE +userdefined = IfcCooledBeamTypeEnum.USERDEFINED +notdefined = IfcCooledBeamTypeEnum.NOTDEFINED IfcCoolingTowerTypeEnum = enum_namespace() -naturaldraft = express_getattr(IfcCoolingTowerTypeEnum, 'NATURALDRAFT', INDETERMINATE) -mechanicalinduceddraft = express_getattr(IfcCoolingTowerTypeEnum, 'MECHANICALINDUCEDDRAFT', INDETERMINATE) -mechanicalforceddraft = express_getattr(IfcCoolingTowerTypeEnum, 'MECHANICALFORCEDDRAFT', INDETERMINATE) -userdefined = express_getattr(IfcCoolingTowerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCoolingTowerTypeEnum, 'NOTDEFINED', INDETERMINATE) +naturaldraft = IfcCoolingTowerTypeEnum.NATURALDRAFT +mechanicalinduceddraft = IfcCoolingTowerTypeEnum.MECHANICALINDUCEDDRAFT +mechanicalforceddraft = IfcCoolingTowerTypeEnum.MECHANICALFORCEDDRAFT +userdefined = IfcCoolingTowerTypeEnum.USERDEFINED +notdefined = IfcCoolingTowerTypeEnum.NOTDEFINED IfcCostItemTypeEnum = enum_namespace() -userdefined = express_getattr(IfcCostItemTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCostItemTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcCostItemTypeEnum.USERDEFINED +notdefined = IfcCostItemTypeEnum.NOTDEFINED IfcCostScheduleTypeEnum = enum_namespace() -budget = express_getattr(IfcCostScheduleTypeEnum, 'BUDGET', INDETERMINATE) -costplan = express_getattr(IfcCostScheduleTypeEnum, 'COSTPLAN', INDETERMINATE) -estimate = express_getattr(IfcCostScheduleTypeEnum, 'ESTIMATE', INDETERMINATE) -tender = express_getattr(IfcCostScheduleTypeEnum, 'TENDER', INDETERMINATE) -pricedbillofquantities = express_getattr(IfcCostScheduleTypeEnum, 'PRICEDBILLOFQUANTITIES', INDETERMINATE) -unpricedbillofquantities = express_getattr(IfcCostScheduleTypeEnum, 'UNPRICEDBILLOFQUANTITIES', INDETERMINATE) -scheduleofrates = express_getattr(IfcCostScheduleTypeEnum, 'SCHEDULEOFRATES', INDETERMINATE) -userdefined = express_getattr(IfcCostScheduleTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCostScheduleTypeEnum, 'NOTDEFINED', INDETERMINATE) +budget = IfcCostScheduleTypeEnum.BUDGET +costplan = IfcCostScheduleTypeEnum.COSTPLAN +estimate = IfcCostScheduleTypeEnum.ESTIMATE +tender = IfcCostScheduleTypeEnum.TENDER +pricedbillofquantities = IfcCostScheduleTypeEnum.PRICEDBILLOFQUANTITIES +unpricedbillofquantities = IfcCostScheduleTypeEnum.UNPRICEDBILLOFQUANTITIES +scheduleofrates = IfcCostScheduleTypeEnum.SCHEDULEOFRATES +userdefined = IfcCostScheduleTypeEnum.USERDEFINED +notdefined = IfcCostScheduleTypeEnum.NOTDEFINED IfcCourseTypeEnum = enum_namespace() -armour = express_getattr(IfcCourseTypeEnum, 'ARMOUR', INDETERMINATE) -filter = express_getattr(IfcCourseTypeEnum, 'FILTER', INDETERMINATE) -ballastbed = express_getattr(IfcCourseTypeEnum, 'BALLASTBED', INDETERMINATE) -core = express_getattr(IfcCourseTypeEnum, 'CORE', INDETERMINATE) -pavement = express_getattr(IfcCourseTypeEnum, 'PAVEMENT', INDETERMINATE) -protection = express_getattr(IfcCourseTypeEnum, 'PROTECTION', INDETERMINATE) -userdefined = express_getattr(IfcCourseTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCourseTypeEnum, 'NOTDEFINED', INDETERMINATE) +armour = IfcCourseTypeEnum.ARMOUR +filter = IfcCourseTypeEnum.FILTER +ballastbed = IfcCourseTypeEnum.BALLASTBED +core = IfcCourseTypeEnum.CORE +pavement = IfcCourseTypeEnum.PAVEMENT +protection = IfcCourseTypeEnum.PROTECTION +userdefined = IfcCourseTypeEnum.USERDEFINED +notdefined = IfcCourseTypeEnum.NOTDEFINED IfcCoveringTypeEnum = enum_namespace() -ceiling = express_getattr(IfcCoveringTypeEnum, 'CEILING', INDETERMINATE) -flooring = express_getattr(IfcCoveringTypeEnum, 'FLOORING', INDETERMINATE) -cladding = express_getattr(IfcCoveringTypeEnum, 'CLADDING', INDETERMINATE) -roofing = express_getattr(IfcCoveringTypeEnum, 'ROOFING', INDETERMINATE) -molding = express_getattr(IfcCoveringTypeEnum, 'MOLDING', INDETERMINATE) -skirtingboard = express_getattr(IfcCoveringTypeEnum, 'SKIRTINGBOARD', INDETERMINATE) -insulation = express_getattr(IfcCoveringTypeEnum, 'INSULATION', INDETERMINATE) -membrane = express_getattr(IfcCoveringTypeEnum, 'MEMBRANE', INDETERMINATE) -sleeving = express_getattr(IfcCoveringTypeEnum, 'SLEEVING', INDETERMINATE) -wrapping = express_getattr(IfcCoveringTypeEnum, 'WRAPPING', INDETERMINATE) -coping = express_getattr(IfcCoveringTypeEnum, 'COPING', INDETERMINATE) -userdefined = express_getattr(IfcCoveringTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCoveringTypeEnum, 'NOTDEFINED', INDETERMINATE) +ceiling = IfcCoveringTypeEnum.CEILING +flooring = IfcCoveringTypeEnum.FLOORING +cladding = IfcCoveringTypeEnum.CLADDING +roofing = IfcCoveringTypeEnum.ROOFING +molding = IfcCoveringTypeEnum.MOLDING +skirtingboard = IfcCoveringTypeEnum.SKIRTINGBOARD +insulation = IfcCoveringTypeEnum.INSULATION +membrane = IfcCoveringTypeEnum.MEMBRANE +sleeving = IfcCoveringTypeEnum.SLEEVING +wrapping = IfcCoveringTypeEnum.WRAPPING +coping = IfcCoveringTypeEnum.COPING +userdefined = IfcCoveringTypeEnum.USERDEFINED +notdefined = IfcCoveringTypeEnum.NOTDEFINED IfcCrewResourceTypeEnum = enum_namespace() -office = express_getattr(IfcCrewResourceTypeEnum, 'OFFICE', INDETERMINATE) -site = express_getattr(IfcCrewResourceTypeEnum, 'SITE', INDETERMINATE) -userdefined = express_getattr(IfcCrewResourceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCrewResourceTypeEnum, 'NOTDEFINED', INDETERMINATE) +office = IfcCrewResourceTypeEnum.OFFICE +site = IfcCrewResourceTypeEnum.SITE +userdefined = IfcCrewResourceTypeEnum.USERDEFINED +notdefined = IfcCrewResourceTypeEnum.NOTDEFINED IfcCurtainWallTypeEnum = enum_namespace() -userdefined = express_getattr(IfcCurtainWallTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCurtainWallTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcCurtainWallTypeEnum.USERDEFINED +notdefined = IfcCurtainWallTypeEnum.NOTDEFINED IfcCurveInterpolationEnum = enum_namespace() -linear = express_getattr(IfcCurveInterpolationEnum, 'LINEAR', INDETERMINATE) -log_linear = express_getattr(IfcCurveInterpolationEnum, 'LOG_LINEAR', INDETERMINATE) -log_log = express_getattr(IfcCurveInterpolationEnum, 'LOG_LOG', INDETERMINATE) -notdefined = express_getattr(IfcCurveInterpolationEnum, 'NOTDEFINED', INDETERMINATE) +linear = IfcCurveInterpolationEnum.LINEAR +log_linear = IfcCurveInterpolationEnum.LOG_LINEAR +log_log = IfcCurveInterpolationEnum.LOG_LOG +notdefined = IfcCurveInterpolationEnum.NOTDEFINED IfcDamperTypeEnum = enum_namespace() -backdraftdamper = express_getattr(IfcDamperTypeEnum, 'BACKDRAFTDAMPER', INDETERMINATE) -balancingdamper = express_getattr(IfcDamperTypeEnum, 'BALANCINGDAMPER', INDETERMINATE) -blastdamper = express_getattr(IfcDamperTypeEnum, 'BLASTDAMPER', INDETERMINATE) -controldamper = express_getattr(IfcDamperTypeEnum, 'CONTROLDAMPER', INDETERMINATE) -firedamper = express_getattr(IfcDamperTypeEnum, 'FIREDAMPER', INDETERMINATE) -firesmokedamper = express_getattr(IfcDamperTypeEnum, 'FIRESMOKEDAMPER', INDETERMINATE) -fumehoodexhaust = express_getattr(IfcDamperTypeEnum, 'FUMEHOODEXHAUST', INDETERMINATE) -gravitydamper = express_getattr(IfcDamperTypeEnum, 'GRAVITYDAMPER', INDETERMINATE) -gravityreliefdamper = express_getattr(IfcDamperTypeEnum, 'GRAVITYRELIEFDAMPER', INDETERMINATE) -reliefdamper = express_getattr(IfcDamperTypeEnum, 'RELIEFDAMPER', INDETERMINATE) -smokedamper = express_getattr(IfcDamperTypeEnum, 'SMOKEDAMPER', INDETERMINATE) -userdefined = express_getattr(IfcDamperTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDamperTypeEnum, 'NOTDEFINED', INDETERMINATE) +backdraftdamper = IfcDamperTypeEnum.BACKDRAFTDAMPER +balancingdamper = IfcDamperTypeEnum.BALANCINGDAMPER +blastdamper = IfcDamperTypeEnum.BLASTDAMPER +controldamper = IfcDamperTypeEnum.CONTROLDAMPER +firedamper = IfcDamperTypeEnum.FIREDAMPER +firesmokedamper = IfcDamperTypeEnum.FIRESMOKEDAMPER +fumehoodexhaust = IfcDamperTypeEnum.FUMEHOODEXHAUST +gravitydamper = IfcDamperTypeEnum.GRAVITYDAMPER +gravityreliefdamper = IfcDamperTypeEnum.GRAVITYRELIEFDAMPER +reliefdamper = IfcDamperTypeEnum.RELIEFDAMPER +smokedamper = IfcDamperTypeEnum.SMOKEDAMPER +userdefined = IfcDamperTypeEnum.USERDEFINED +notdefined = IfcDamperTypeEnum.NOTDEFINED IfcDataOriginEnum = enum_namespace() -measured = express_getattr(IfcDataOriginEnum, 'MEASURED', INDETERMINATE) -predicted = express_getattr(IfcDataOriginEnum, 'PREDICTED', INDETERMINATE) -simulated = express_getattr(IfcDataOriginEnum, 'SIMULATED', INDETERMINATE) -userdefined = express_getattr(IfcDataOriginEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDataOriginEnum, 'NOTDEFINED', INDETERMINATE) +measured = IfcDataOriginEnum.MEASURED +predicted = IfcDataOriginEnum.PREDICTED +simulated = IfcDataOriginEnum.SIMULATED +userdefined = IfcDataOriginEnum.USERDEFINED +notdefined = IfcDataOriginEnum.NOTDEFINED IfcDerivedUnitEnum = enum_namespace() -angularvelocityunit = express_getattr(IfcDerivedUnitEnum, 'ANGULARVELOCITYUNIT', INDETERMINATE) -areadensityunit = express_getattr(IfcDerivedUnitEnum, 'AREADENSITYUNIT', INDETERMINATE) -compoundplaneangleunit = express_getattr(IfcDerivedUnitEnum, 'COMPOUNDPLANEANGLEUNIT', INDETERMINATE) -dynamicviscosityunit = express_getattr(IfcDerivedUnitEnum, 'DYNAMICVISCOSITYUNIT', INDETERMINATE) -heatfluxdensityunit = express_getattr(IfcDerivedUnitEnum, 'HEATFLUXDENSITYUNIT', INDETERMINATE) -integercountrateunit = express_getattr(IfcDerivedUnitEnum, 'INTEGERCOUNTRATEUNIT', INDETERMINATE) -isothermalmoisturecapacityunit = express_getattr(IfcDerivedUnitEnum, 'ISOTHERMALMOISTURECAPACITYUNIT', INDETERMINATE) -kinematicviscosityunit = express_getattr(IfcDerivedUnitEnum, 'KINEMATICVISCOSITYUNIT', INDETERMINATE) -linearvelocityunit = express_getattr(IfcDerivedUnitEnum, 'LINEARVELOCITYUNIT', INDETERMINATE) -massdensityunit = express_getattr(IfcDerivedUnitEnum, 'MASSDENSITYUNIT', INDETERMINATE) -massflowrateunit = express_getattr(IfcDerivedUnitEnum, 'MASSFLOWRATEUNIT', INDETERMINATE) -moisturediffusivityunit = express_getattr(IfcDerivedUnitEnum, 'MOISTUREDIFFUSIVITYUNIT', INDETERMINATE) -molecularweightunit = express_getattr(IfcDerivedUnitEnum, 'MOLECULARWEIGHTUNIT', INDETERMINATE) -specificheatcapacityunit = express_getattr(IfcDerivedUnitEnum, 'SPECIFICHEATCAPACITYUNIT', INDETERMINATE) -thermaladmittanceunit = express_getattr(IfcDerivedUnitEnum, 'THERMALADMITTANCEUNIT', INDETERMINATE) -thermalconductanceunit = express_getattr(IfcDerivedUnitEnum, 'THERMALCONDUCTANCEUNIT', INDETERMINATE) -thermalresistanceunit = express_getattr(IfcDerivedUnitEnum, 'THERMALRESISTANCEUNIT', INDETERMINATE) -thermaltransmittanceunit = express_getattr(IfcDerivedUnitEnum, 'THERMALTRANSMITTANCEUNIT', INDETERMINATE) -vaporpermeabilityunit = express_getattr(IfcDerivedUnitEnum, 'VAPORPERMEABILITYUNIT', INDETERMINATE) -volumetricflowrateunit = express_getattr(IfcDerivedUnitEnum, 'VOLUMETRICFLOWRATEUNIT', INDETERMINATE) -rotationalfrequencyunit = express_getattr(IfcDerivedUnitEnum, 'ROTATIONALFREQUENCYUNIT', INDETERMINATE) -torqueunit = express_getattr(IfcDerivedUnitEnum, 'TORQUEUNIT', INDETERMINATE) -momentofinertiaunit = express_getattr(IfcDerivedUnitEnum, 'MOMENTOFINERTIAUNIT', INDETERMINATE) -linearmomentunit = express_getattr(IfcDerivedUnitEnum, 'LINEARMOMENTUNIT', INDETERMINATE) -linearforceunit = express_getattr(IfcDerivedUnitEnum, 'LINEARFORCEUNIT', INDETERMINATE) -planarforceunit = express_getattr(IfcDerivedUnitEnum, 'PLANARFORCEUNIT', INDETERMINATE) -modulusofelasticityunit = express_getattr(IfcDerivedUnitEnum, 'MODULUSOFELASTICITYUNIT', INDETERMINATE) -shearmodulusunit = express_getattr(IfcDerivedUnitEnum, 'SHEARMODULUSUNIT', INDETERMINATE) -linearstiffnessunit = express_getattr(IfcDerivedUnitEnum, 'LINEARSTIFFNESSUNIT', INDETERMINATE) -rotationalstiffnessunit = express_getattr(IfcDerivedUnitEnum, 'ROTATIONALSTIFFNESSUNIT', INDETERMINATE) -modulusofsubgradereactionunit = express_getattr(IfcDerivedUnitEnum, 'MODULUSOFSUBGRADEREACTIONUNIT', INDETERMINATE) -accelerationunit = express_getattr(IfcDerivedUnitEnum, 'ACCELERATIONUNIT', INDETERMINATE) -curvatureunit = express_getattr(IfcDerivedUnitEnum, 'CURVATUREUNIT', INDETERMINATE) -heatingvalueunit = express_getattr(IfcDerivedUnitEnum, 'HEATINGVALUEUNIT', INDETERMINATE) -ionconcentrationunit = express_getattr(IfcDerivedUnitEnum, 'IONCONCENTRATIONUNIT', INDETERMINATE) -luminousintensitydistributionunit = express_getattr(IfcDerivedUnitEnum, 'LUMINOUSINTENSITYDISTRIBUTIONUNIT', INDETERMINATE) -massperlengthunit = express_getattr(IfcDerivedUnitEnum, 'MASSPERLENGTHUNIT', INDETERMINATE) -modulusoflinearsubgradereactionunit = express_getattr(IfcDerivedUnitEnum, 'MODULUSOFLINEARSUBGRADEREACTIONUNIT', INDETERMINATE) -modulusofrotationalsubgradereactionunit = express_getattr(IfcDerivedUnitEnum, 'MODULUSOFROTATIONALSUBGRADEREACTIONUNIT', INDETERMINATE) -phunit = express_getattr(IfcDerivedUnitEnum, 'PHUNIT', INDETERMINATE) -rotationalmassunit = express_getattr(IfcDerivedUnitEnum, 'ROTATIONALMASSUNIT', INDETERMINATE) -sectionareaintegralunit = express_getattr(IfcDerivedUnitEnum, 'SECTIONAREAINTEGRALUNIT', INDETERMINATE) -sectionmodulusunit = express_getattr(IfcDerivedUnitEnum, 'SECTIONMODULUSUNIT', INDETERMINATE) -soundpowerlevelunit = express_getattr(IfcDerivedUnitEnum, 'SOUNDPOWERLEVELUNIT', INDETERMINATE) -soundpowerunit = express_getattr(IfcDerivedUnitEnum, 'SOUNDPOWERUNIT', INDETERMINATE) -soundpressurelevelunit = express_getattr(IfcDerivedUnitEnum, 'SOUNDPRESSURELEVELUNIT', INDETERMINATE) -soundpressureunit = express_getattr(IfcDerivedUnitEnum, 'SOUNDPRESSUREUNIT', INDETERMINATE) -temperaturegradientunit = express_getattr(IfcDerivedUnitEnum, 'TEMPERATUREGRADIENTUNIT', INDETERMINATE) -temperaturerateofchangeunit = express_getattr(IfcDerivedUnitEnum, 'TEMPERATURERATEOFCHANGEUNIT', INDETERMINATE) -thermalexpansioncoefficientunit = express_getattr(IfcDerivedUnitEnum, 'THERMALEXPANSIONCOEFFICIENTUNIT', INDETERMINATE) -warpingconstantunit = express_getattr(IfcDerivedUnitEnum, 'WARPINGCONSTANTUNIT', INDETERMINATE) -warpingmomentunit = express_getattr(IfcDerivedUnitEnum, 'WARPINGMOMENTUNIT', INDETERMINATE) -userdefined = express_getattr(IfcDerivedUnitEnum, 'USERDEFINED', INDETERMINATE) +angularvelocityunit = IfcDerivedUnitEnum.ANGULARVELOCITYUNIT +areadensityunit = IfcDerivedUnitEnum.AREADENSITYUNIT +compoundplaneangleunit = IfcDerivedUnitEnum.COMPOUNDPLANEANGLEUNIT +dynamicviscosityunit = IfcDerivedUnitEnum.DYNAMICVISCOSITYUNIT +heatfluxdensityunit = IfcDerivedUnitEnum.HEATFLUXDENSITYUNIT +integercountrateunit = IfcDerivedUnitEnum.INTEGERCOUNTRATEUNIT +isothermalmoisturecapacityunit = IfcDerivedUnitEnum.ISOTHERMALMOISTURECAPACITYUNIT +kinematicviscosityunit = IfcDerivedUnitEnum.KINEMATICVISCOSITYUNIT +linearvelocityunit = IfcDerivedUnitEnum.LINEARVELOCITYUNIT +massdensityunit = IfcDerivedUnitEnum.MASSDENSITYUNIT +massflowrateunit = IfcDerivedUnitEnum.MASSFLOWRATEUNIT +moisturediffusivityunit = IfcDerivedUnitEnum.MOISTUREDIFFUSIVITYUNIT +molecularweightunit = IfcDerivedUnitEnum.MOLECULARWEIGHTUNIT +specificheatcapacityunit = IfcDerivedUnitEnum.SPECIFICHEATCAPACITYUNIT +thermaladmittanceunit = IfcDerivedUnitEnum.THERMALADMITTANCEUNIT +thermalconductanceunit = IfcDerivedUnitEnum.THERMALCONDUCTANCEUNIT +thermalresistanceunit = IfcDerivedUnitEnum.THERMALRESISTANCEUNIT +thermaltransmittanceunit = IfcDerivedUnitEnum.THERMALTRANSMITTANCEUNIT +vaporpermeabilityunit = IfcDerivedUnitEnum.VAPORPERMEABILITYUNIT +volumetricflowrateunit = IfcDerivedUnitEnum.VOLUMETRICFLOWRATEUNIT +rotationalfrequencyunit = IfcDerivedUnitEnum.ROTATIONALFREQUENCYUNIT +torqueunit = IfcDerivedUnitEnum.TORQUEUNIT +momentofinertiaunit = IfcDerivedUnitEnum.MOMENTOFINERTIAUNIT +linearmomentunit = IfcDerivedUnitEnum.LINEARMOMENTUNIT +linearforceunit = IfcDerivedUnitEnum.LINEARFORCEUNIT +planarforceunit = IfcDerivedUnitEnum.PLANARFORCEUNIT +modulusofelasticityunit = IfcDerivedUnitEnum.MODULUSOFELASTICITYUNIT +shearmodulusunit = IfcDerivedUnitEnum.SHEARMODULUSUNIT +linearstiffnessunit = IfcDerivedUnitEnum.LINEARSTIFFNESSUNIT +rotationalstiffnessunit = IfcDerivedUnitEnum.ROTATIONALSTIFFNESSUNIT +modulusofsubgradereactionunit = IfcDerivedUnitEnum.MODULUSOFSUBGRADEREACTIONUNIT +accelerationunit = IfcDerivedUnitEnum.ACCELERATIONUNIT +curvatureunit = IfcDerivedUnitEnum.CURVATUREUNIT +heatingvalueunit = IfcDerivedUnitEnum.HEATINGVALUEUNIT +ionconcentrationunit = IfcDerivedUnitEnum.IONCONCENTRATIONUNIT +luminousintensitydistributionunit = IfcDerivedUnitEnum.LUMINOUSINTENSITYDISTRIBUTIONUNIT +massperlengthunit = IfcDerivedUnitEnum.MASSPERLENGTHUNIT +modulusoflinearsubgradereactionunit = IfcDerivedUnitEnum.MODULUSOFLINEARSUBGRADEREACTIONUNIT +modulusofrotationalsubgradereactionunit = IfcDerivedUnitEnum.MODULUSOFROTATIONALSUBGRADEREACTIONUNIT +phunit = IfcDerivedUnitEnum.PHUNIT +rotationalmassunit = IfcDerivedUnitEnum.ROTATIONALMASSUNIT +sectionareaintegralunit = IfcDerivedUnitEnum.SECTIONAREAINTEGRALUNIT +sectionmodulusunit = IfcDerivedUnitEnum.SECTIONMODULUSUNIT +soundpowerlevelunit = IfcDerivedUnitEnum.SOUNDPOWERLEVELUNIT +soundpowerunit = IfcDerivedUnitEnum.SOUNDPOWERUNIT +soundpressurelevelunit = IfcDerivedUnitEnum.SOUNDPRESSURELEVELUNIT +soundpressureunit = IfcDerivedUnitEnum.SOUNDPRESSUREUNIT +temperaturegradientunit = IfcDerivedUnitEnum.TEMPERATUREGRADIENTUNIT +temperaturerateofchangeunit = IfcDerivedUnitEnum.TEMPERATURERATEOFCHANGEUNIT +thermalexpansioncoefficientunit = IfcDerivedUnitEnum.THERMALEXPANSIONCOEFFICIENTUNIT +warpingconstantunit = IfcDerivedUnitEnum.WARPINGCONSTANTUNIT +warpingmomentunit = IfcDerivedUnitEnum.WARPINGMOMENTUNIT +userdefined = IfcDerivedUnitEnum.USERDEFINED IfcDirectionSenseEnum = enum_namespace() -positive = express_getattr(IfcDirectionSenseEnum, 'POSITIVE', INDETERMINATE) -negative = express_getattr(IfcDirectionSenseEnum, 'NEGATIVE', INDETERMINATE) +positive = IfcDirectionSenseEnum.POSITIVE +negative = IfcDirectionSenseEnum.NEGATIVE IfcDiscreteAccessoryTypeEnum = enum_namespace() -anchorplate = express_getattr(IfcDiscreteAccessoryTypeEnum, 'ANCHORPLATE', INDETERMINATE) -bracket = express_getattr(IfcDiscreteAccessoryTypeEnum, 'BRACKET', INDETERMINATE) -shoe = express_getattr(IfcDiscreteAccessoryTypeEnum, 'SHOE', INDETERMINATE) -expansion_joint_device = express_getattr(IfcDiscreteAccessoryTypeEnum, 'EXPANSION_JOINT_DEVICE', INDETERMINATE) -cablearranger = express_getattr(IfcDiscreteAccessoryTypeEnum, 'CABLEARRANGER', INDETERMINATE) -insulator = express_getattr(IfcDiscreteAccessoryTypeEnum, 'INSULATOR', INDETERMINATE) -lock = express_getattr(IfcDiscreteAccessoryTypeEnum, 'LOCK', INDETERMINATE) -tensioningequipment = express_getattr(IfcDiscreteAccessoryTypeEnum, 'TENSIONINGEQUIPMENT', INDETERMINATE) -railpad = express_getattr(IfcDiscreteAccessoryTypeEnum, 'RAILPAD', INDETERMINATE) -slidingchair = express_getattr(IfcDiscreteAccessoryTypeEnum, 'SLIDINGCHAIR', INDETERMINATE) -rail_lubrication = express_getattr(IfcDiscreteAccessoryTypeEnum, 'RAIL_LUBRICATION', INDETERMINATE) -panel_strengthening = express_getattr(IfcDiscreteAccessoryTypeEnum, 'PANEL_STRENGTHENING', INDETERMINATE) -railbrace = express_getattr(IfcDiscreteAccessoryTypeEnum, 'RAILBRACE', INDETERMINATE) -elastic_cushion = express_getattr(IfcDiscreteAccessoryTypeEnum, 'ELASTIC_CUSHION', INDETERMINATE) -soundabsorption = express_getattr(IfcDiscreteAccessoryTypeEnum, 'SOUNDABSORPTION', INDETERMINATE) -pointmachinemountingdevice = express_getattr(IfcDiscreteAccessoryTypeEnum, 'POINTMACHINEMOUNTINGDEVICE', INDETERMINATE) -point_machine_locking_device = express_getattr(IfcDiscreteAccessoryTypeEnum, 'POINT_MACHINE_LOCKING_DEVICE', INDETERMINATE) -rail_mechanical_equipment = express_getattr(IfcDiscreteAccessoryTypeEnum, 'RAIL_MECHANICAL_EQUIPMENT', INDETERMINATE) -birdprotection = express_getattr(IfcDiscreteAccessoryTypeEnum, 'BIRDPROTECTION', INDETERMINATE) -userdefined = express_getattr(IfcDiscreteAccessoryTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDiscreteAccessoryTypeEnum, 'NOTDEFINED', INDETERMINATE) +anchorplate = IfcDiscreteAccessoryTypeEnum.ANCHORPLATE +bracket = IfcDiscreteAccessoryTypeEnum.BRACKET +shoe = IfcDiscreteAccessoryTypeEnum.SHOE +expansion_joint_device = IfcDiscreteAccessoryTypeEnum.EXPANSION_JOINT_DEVICE +cablearranger = IfcDiscreteAccessoryTypeEnum.CABLEARRANGER +insulator = IfcDiscreteAccessoryTypeEnum.INSULATOR +lock = IfcDiscreteAccessoryTypeEnum.LOCK +tensioningequipment = IfcDiscreteAccessoryTypeEnum.TENSIONINGEQUIPMENT +railpad = IfcDiscreteAccessoryTypeEnum.RAILPAD +slidingchair = IfcDiscreteAccessoryTypeEnum.SLIDINGCHAIR +rail_lubrication = IfcDiscreteAccessoryTypeEnum.RAIL_LUBRICATION +panel_strengthening = IfcDiscreteAccessoryTypeEnum.PANEL_STRENGTHENING +railbrace = IfcDiscreteAccessoryTypeEnum.RAILBRACE +elastic_cushion = IfcDiscreteAccessoryTypeEnum.ELASTIC_CUSHION +soundabsorption = IfcDiscreteAccessoryTypeEnum.SOUNDABSORPTION +pointmachinemountingdevice = IfcDiscreteAccessoryTypeEnum.POINTMACHINEMOUNTINGDEVICE +point_machine_locking_device = IfcDiscreteAccessoryTypeEnum.POINT_MACHINE_LOCKING_DEVICE +rail_mechanical_equipment = IfcDiscreteAccessoryTypeEnum.RAIL_MECHANICAL_EQUIPMENT +birdprotection = IfcDiscreteAccessoryTypeEnum.BIRDPROTECTION +userdefined = IfcDiscreteAccessoryTypeEnum.USERDEFINED +notdefined = IfcDiscreteAccessoryTypeEnum.NOTDEFINED IfcDistributionBoardTypeEnum = enum_namespace() -switchboard = express_getattr(IfcDistributionBoardTypeEnum, 'SWITCHBOARD', INDETERMINATE) -consumerunit = express_getattr(IfcDistributionBoardTypeEnum, 'CONSUMERUNIT', INDETERMINATE) -motorcontrolcentre = express_getattr(IfcDistributionBoardTypeEnum, 'MOTORCONTROLCENTRE', INDETERMINATE) -distributionframe = express_getattr(IfcDistributionBoardTypeEnum, 'DISTRIBUTIONFRAME', INDETERMINATE) -distributionboard = express_getattr(IfcDistributionBoardTypeEnum, 'DISTRIBUTIONBOARD', INDETERMINATE) -dispatchingboard = express_getattr(IfcDistributionBoardTypeEnum, 'DISPATCHINGBOARD', INDETERMINATE) -userdefined = express_getattr(IfcDistributionBoardTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDistributionBoardTypeEnum, 'NOTDEFINED', INDETERMINATE) +switchboard = IfcDistributionBoardTypeEnum.SWITCHBOARD +consumerunit = IfcDistributionBoardTypeEnum.CONSUMERUNIT +motorcontrolcentre = IfcDistributionBoardTypeEnum.MOTORCONTROLCENTRE +distributionframe = IfcDistributionBoardTypeEnum.DISTRIBUTIONFRAME +distributionboard = IfcDistributionBoardTypeEnum.DISTRIBUTIONBOARD +dispatchingboard = IfcDistributionBoardTypeEnum.DISPATCHINGBOARD +userdefined = IfcDistributionBoardTypeEnum.USERDEFINED +notdefined = IfcDistributionBoardTypeEnum.NOTDEFINED IfcDistributionChamberElementTypeEnum = enum_namespace() -formedduct = express_getattr(IfcDistributionChamberElementTypeEnum, 'FORMEDDUCT', INDETERMINATE) -inspectionchamber = express_getattr(IfcDistributionChamberElementTypeEnum, 'INSPECTIONCHAMBER', INDETERMINATE) -inspectionpit = express_getattr(IfcDistributionChamberElementTypeEnum, 'INSPECTIONPIT', INDETERMINATE) -manhole = express_getattr(IfcDistributionChamberElementTypeEnum, 'MANHOLE', INDETERMINATE) -meterchamber = express_getattr(IfcDistributionChamberElementTypeEnum, 'METERCHAMBER', INDETERMINATE) -sump = express_getattr(IfcDistributionChamberElementTypeEnum, 'SUMP', INDETERMINATE) -trench = express_getattr(IfcDistributionChamberElementTypeEnum, 'TRENCH', INDETERMINATE) -valvechamber = express_getattr(IfcDistributionChamberElementTypeEnum, 'VALVECHAMBER', INDETERMINATE) -userdefined = express_getattr(IfcDistributionChamberElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDistributionChamberElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +formedduct = IfcDistributionChamberElementTypeEnum.FORMEDDUCT +inspectionchamber = IfcDistributionChamberElementTypeEnum.INSPECTIONCHAMBER +inspectionpit = IfcDistributionChamberElementTypeEnum.INSPECTIONPIT +manhole = IfcDistributionChamberElementTypeEnum.MANHOLE +meterchamber = IfcDistributionChamberElementTypeEnum.METERCHAMBER +sump = IfcDistributionChamberElementTypeEnum.SUMP +trench = IfcDistributionChamberElementTypeEnum.TRENCH +valvechamber = IfcDistributionChamberElementTypeEnum.VALVECHAMBER +userdefined = IfcDistributionChamberElementTypeEnum.USERDEFINED +notdefined = IfcDistributionChamberElementTypeEnum.NOTDEFINED IfcDistributionPortTypeEnum = enum_namespace() -cable = express_getattr(IfcDistributionPortTypeEnum, 'CABLE', INDETERMINATE) -cablecarrier = express_getattr(IfcDistributionPortTypeEnum, 'CABLECARRIER', INDETERMINATE) -duct = express_getattr(IfcDistributionPortTypeEnum, 'DUCT', INDETERMINATE) -pipe = express_getattr(IfcDistributionPortTypeEnum, 'PIPE', INDETERMINATE) -wireless = express_getattr(IfcDistributionPortTypeEnum, 'WIRELESS', INDETERMINATE) -userdefined = express_getattr(IfcDistributionPortTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDistributionPortTypeEnum, 'NOTDEFINED', INDETERMINATE) +cable = IfcDistributionPortTypeEnum.CABLE +cablecarrier = IfcDistributionPortTypeEnum.CABLECARRIER +duct = IfcDistributionPortTypeEnum.DUCT +pipe = IfcDistributionPortTypeEnum.PIPE +wireless = IfcDistributionPortTypeEnum.WIRELESS +userdefined = IfcDistributionPortTypeEnum.USERDEFINED +notdefined = IfcDistributionPortTypeEnum.NOTDEFINED IfcDistributionSystemEnum = enum_namespace() -airconditioning = express_getattr(IfcDistributionSystemEnum, 'AIRCONDITIONING', INDETERMINATE) -audiovisual = express_getattr(IfcDistributionSystemEnum, 'AUDIOVISUAL', INDETERMINATE) -chemical = express_getattr(IfcDistributionSystemEnum, 'CHEMICAL', INDETERMINATE) -chilledwater = express_getattr(IfcDistributionSystemEnum, 'CHILLEDWATER', INDETERMINATE) -communication = express_getattr(IfcDistributionSystemEnum, 'COMMUNICATION', INDETERMINATE) -compressedair = express_getattr(IfcDistributionSystemEnum, 'COMPRESSEDAIR', INDETERMINATE) -condenserwater = express_getattr(IfcDistributionSystemEnum, 'CONDENSERWATER', INDETERMINATE) -control = express_getattr(IfcDistributionSystemEnum, 'CONTROL', INDETERMINATE) -conveying = express_getattr(IfcDistributionSystemEnum, 'CONVEYING', INDETERMINATE) -data = express_getattr(IfcDistributionSystemEnum, 'DATA', INDETERMINATE) -disposal = express_getattr(IfcDistributionSystemEnum, 'DISPOSAL', INDETERMINATE) -domesticcoldwater = express_getattr(IfcDistributionSystemEnum, 'DOMESTICCOLDWATER', INDETERMINATE) -domestichotwater = express_getattr(IfcDistributionSystemEnum, 'DOMESTICHOTWATER', INDETERMINATE) -drainage = express_getattr(IfcDistributionSystemEnum, 'DRAINAGE', INDETERMINATE) -earthing = express_getattr(IfcDistributionSystemEnum, 'EARTHING', INDETERMINATE) -electrical = express_getattr(IfcDistributionSystemEnum, 'ELECTRICAL', INDETERMINATE) -electroacoustic = express_getattr(IfcDistributionSystemEnum, 'ELECTROACOUSTIC', INDETERMINATE) -exhaust = express_getattr(IfcDistributionSystemEnum, 'EXHAUST', INDETERMINATE) -fireprotection = express_getattr(IfcDistributionSystemEnum, 'FIREPROTECTION', INDETERMINATE) -fuel = express_getattr(IfcDistributionSystemEnum, 'FUEL', INDETERMINATE) -gas = express_getattr(IfcDistributionSystemEnum, 'GAS', INDETERMINATE) -hazardous = express_getattr(IfcDistributionSystemEnum, 'HAZARDOUS', INDETERMINATE) -heating = express_getattr(IfcDistributionSystemEnum, 'HEATING', INDETERMINATE) -lighting = express_getattr(IfcDistributionSystemEnum, 'LIGHTING', INDETERMINATE) -lightningprotection = express_getattr(IfcDistributionSystemEnum, 'LIGHTNINGPROTECTION', INDETERMINATE) -municipalsolidwaste = express_getattr(IfcDistributionSystemEnum, 'MUNICIPALSOLIDWASTE', INDETERMINATE) -oil = express_getattr(IfcDistributionSystemEnum, 'OIL', INDETERMINATE) -operational = express_getattr(IfcDistributionSystemEnum, 'OPERATIONAL', INDETERMINATE) -powergeneration = express_getattr(IfcDistributionSystemEnum, 'POWERGENERATION', INDETERMINATE) -rainwater = express_getattr(IfcDistributionSystemEnum, 'RAINWATER', INDETERMINATE) -refrigeration = express_getattr(IfcDistributionSystemEnum, 'REFRIGERATION', INDETERMINATE) -security = express_getattr(IfcDistributionSystemEnum, 'SECURITY', INDETERMINATE) -sewage = express_getattr(IfcDistributionSystemEnum, 'SEWAGE', INDETERMINATE) -signal = express_getattr(IfcDistributionSystemEnum, 'SIGNAL', INDETERMINATE) -stormwater = express_getattr(IfcDistributionSystemEnum, 'STORMWATER', INDETERMINATE) -telephone = express_getattr(IfcDistributionSystemEnum, 'TELEPHONE', INDETERMINATE) -tv = express_getattr(IfcDistributionSystemEnum, 'TV', INDETERMINATE) -vacuum = express_getattr(IfcDistributionSystemEnum, 'VACUUM', INDETERMINATE) -vent = express_getattr(IfcDistributionSystemEnum, 'VENT', INDETERMINATE) -ventilation = express_getattr(IfcDistributionSystemEnum, 'VENTILATION', INDETERMINATE) -wastewater = express_getattr(IfcDistributionSystemEnum, 'WASTEWATER', INDETERMINATE) -watersupply = express_getattr(IfcDistributionSystemEnum, 'WATERSUPPLY', INDETERMINATE) -catenary_system = express_getattr(IfcDistributionSystemEnum, 'CATENARY_SYSTEM', INDETERMINATE) -overhead_contactline_system = express_getattr(IfcDistributionSystemEnum, 'OVERHEAD_CONTACTLINE_SYSTEM', INDETERMINATE) -return_circuit = express_getattr(IfcDistributionSystemEnum, 'RETURN_CIRCUIT', INDETERMINATE) -fixedtransmissionnetwork = express_getattr(IfcDistributionSystemEnum, 'FIXEDTRANSMISSIONNETWORK', INDETERMINATE) -operationaltelephonysystem = express_getattr(IfcDistributionSystemEnum, 'OPERATIONALTELEPHONYSYSTEM', INDETERMINATE) -mobilenetwork = express_getattr(IfcDistributionSystemEnum, 'MOBILENETWORK', INDETERMINATE) -monitoringsystem = express_getattr(IfcDistributionSystemEnum, 'MONITORINGSYSTEM', INDETERMINATE) -userdefined = express_getattr(IfcDistributionSystemEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDistributionSystemEnum, 'NOTDEFINED', INDETERMINATE) +airconditioning = IfcDistributionSystemEnum.AIRCONDITIONING +audiovisual = IfcDistributionSystemEnum.AUDIOVISUAL +chemical = IfcDistributionSystemEnum.CHEMICAL +chilledwater = IfcDistributionSystemEnum.CHILLEDWATER +communication = IfcDistributionSystemEnum.COMMUNICATION +compressedair = IfcDistributionSystemEnum.COMPRESSEDAIR +condenserwater = IfcDistributionSystemEnum.CONDENSERWATER +control = IfcDistributionSystemEnum.CONTROL +conveying = IfcDistributionSystemEnum.CONVEYING +data = IfcDistributionSystemEnum.DATA +disposal = IfcDistributionSystemEnum.DISPOSAL +domesticcoldwater = IfcDistributionSystemEnum.DOMESTICCOLDWATER +domestichotwater = IfcDistributionSystemEnum.DOMESTICHOTWATER +drainage = IfcDistributionSystemEnum.DRAINAGE +earthing = IfcDistributionSystemEnum.EARTHING +electrical = IfcDistributionSystemEnum.ELECTRICAL +electroacoustic = IfcDistributionSystemEnum.ELECTROACOUSTIC +exhaust = IfcDistributionSystemEnum.EXHAUST +fireprotection = IfcDistributionSystemEnum.FIREPROTECTION +fuel = IfcDistributionSystemEnum.FUEL +gas = IfcDistributionSystemEnum.GAS +hazardous = IfcDistributionSystemEnum.HAZARDOUS +heating = IfcDistributionSystemEnum.HEATING +lighting = IfcDistributionSystemEnum.LIGHTING +lightningprotection = IfcDistributionSystemEnum.LIGHTNINGPROTECTION +municipalsolidwaste = IfcDistributionSystemEnum.MUNICIPALSOLIDWASTE +oil = IfcDistributionSystemEnum.OIL +operational = IfcDistributionSystemEnum.OPERATIONAL +powergeneration = IfcDistributionSystemEnum.POWERGENERATION +rainwater = IfcDistributionSystemEnum.RAINWATER +refrigeration = IfcDistributionSystemEnum.REFRIGERATION +security = IfcDistributionSystemEnum.SECURITY +sewage = IfcDistributionSystemEnum.SEWAGE +signal = IfcDistributionSystemEnum.SIGNAL +stormwater = IfcDistributionSystemEnum.STORMWATER +telephone = IfcDistributionSystemEnum.TELEPHONE +tv = IfcDistributionSystemEnum.TV +vacuum = IfcDistributionSystemEnum.VACUUM +vent = IfcDistributionSystemEnum.VENT +ventilation = IfcDistributionSystemEnum.VENTILATION +wastewater = IfcDistributionSystemEnum.WASTEWATER +watersupply = IfcDistributionSystemEnum.WATERSUPPLY +catenary_system = IfcDistributionSystemEnum.CATENARY_SYSTEM +overhead_contactline_system = IfcDistributionSystemEnum.OVERHEAD_CONTACTLINE_SYSTEM +return_circuit = IfcDistributionSystemEnum.RETURN_CIRCUIT +fixedtransmissionnetwork = IfcDistributionSystemEnum.FIXEDTRANSMISSIONNETWORK +operationaltelephonysystem = IfcDistributionSystemEnum.OPERATIONALTELEPHONYSYSTEM +mobilenetwork = IfcDistributionSystemEnum.MOBILENETWORK +monitoringsystem = IfcDistributionSystemEnum.MONITORINGSYSTEM +userdefined = IfcDistributionSystemEnum.USERDEFINED +notdefined = IfcDistributionSystemEnum.NOTDEFINED IfcDocumentConfidentialityEnum = enum_namespace() -public = express_getattr(IfcDocumentConfidentialityEnum, 'PUBLIC', INDETERMINATE) -restricted = express_getattr(IfcDocumentConfidentialityEnum, 'RESTRICTED', INDETERMINATE) -confidential = express_getattr(IfcDocumentConfidentialityEnum, 'CONFIDENTIAL', INDETERMINATE) -personal = express_getattr(IfcDocumentConfidentialityEnum, 'PERSONAL', INDETERMINATE) -userdefined = express_getattr(IfcDocumentConfidentialityEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDocumentConfidentialityEnum, 'NOTDEFINED', INDETERMINATE) +public = IfcDocumentConfidentialityEnum.PUBLIC +restricted = IfcDocumentConfidentialityEnum.RESTRICTED +confidential = IfcDocumentConfidentialityEnum.CONFIDENTIAL +personal = IfcDocumentConfidentialityEnum.PERSONAL +userdefined = IfcDocumentConfidentialityEnum.USERDEFINED +notdefined = IfcDocumentConfidentialityEnum.NOTDEFINED IfcDocumentStatusEnum = enum_namespace() -draft = express_getattr(IfcDocumentStatusEnum, 'DRAFT', INDETERMINATE) -finaldraft = express_getattr(IfcDocumentStatusEnum, 'FINALDRAFT', INDETERMINATE) -final = express_getattr(IfcDocumentStatusEnum, 'FINAL', INDETERMINATE) -revision = express_getattr(IfcDocumentStatusEnum, 'REVISION', INDETERMINATE) -notdefined = express_getattr(IfcDocumentStatusEnum, 'NOTDEFINED', INDETERMINATE) +draft = IfcDocumentStatusEnum.DRAFT +finaldraft = IfcDocumentStatusEnum.FINALDRAFT +final = IfcDocumentStatusEnum.FINAL +revision = IfcDocumentStatusEnum.REVISION +notdefined = IfcDocumentStatusEnum.NOTDEFINED IfcDoorPanelOperationEnum = enum_namespace() -swinging = express_getattr(IfcDoorPanelOperationEnum, 'SWINGING', INDETERMINATE) -double_acting = express_getattr(IfcDoorPanelOperationEnum, 'DOUBLE_ACTING', INDETERMINATE) -sliding = express_getattr(IfcDoorPanelOperationEnum, 'SLIDING', INDETERMINATE) -folding = express_getattr(IfcDoorPanelOperationEnum, 'FOLDING', INDETERMINATE) -revolving = express_getattr(IfcDoorPanelOperationEnum, 'REVOLVING', INDETERMINATE) -rollingup = express_getattr(IfcDoorPanelOperationEnum, 'ROLLINGUP', INDETERMINATE) -fixedpanel = express_getattr(IfcDoorPanelOperationEnum, 'FIXEDPANEL', INDETERMINATE) -userdefined = express_getattr(IfcDoorPanelOperationEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDoorPanelOperationEnum, 'NOTDEFINED', INDETERMINATE) +swinging = IfcDoorPanelOperationEnum.SWINGING +double_acting = IfcDoorPanelOperationEnum.DOUBLE_ACTING +sliding = IfcDoorPanelOperationEnum.SLIDING +folding = IfcDoorPanelOperationEnum.FOLDING +revolving = IfcDoorPanelOperationEnum.REVOLVING +rollingup = IfcDoorPanelOperationEnum.ROLLINGUP +fixedpanel = IfcDoorPanelOperationEnum.FIXEDPANEL +userdefined = IfcDoorPanelOperationEnum.USERDEFINED +notdefined = IfcDoorPanelOperationEnum.NOTDEFINED IfcDoorPanelPositionEnum = enum_namespace() -left = express_getattr(IfcDoorPanelPositionEnum, 'LEFT', INDETERMINATE) -middle = express_getattr(IfcDoorPanelPositionEnum, 'MIDDLE', INDETERMINATE) -right = express_getattr(IfcDoorPanelPositionEnum, 'RIGHT', INDETERMINATE) -notdefined = express_getattr(IfcDoorPanelPositionEnum, 'NOTDEFINED', INDETERMINATE) +left = IfcDoorPanelPositionEnum.LEFT +middle = IfcDoorPanelPositionEnum.MIDDLE +right = IfcDoorPanelPositionEnum.RIGHT +notdefined = IfcDoorPanelPositionEnum.NOTDEFINED IfcDoorStyleConstructionEnum = enum_namespace() -aluminium = express_getattr(IfcDoorStyleConstructionEnum, 'ALUMINIUM', INDETERMINATE) -high_grade_steel = express_getattr(IfcDoorStyleConstructionEnum, 'HIGH_GRADE_STEEL', INDETERMINATE) -steel = express_getattr(IfcDoorStyleConstructionEnum, 'STEEL', INDETERMINATE) -wood = express_getattr(IfcDoorStyleConstructionEnum, 'WOOD', INDETERMINATE) -aluminium_wood = express_getattr(IfcDoorStyleConstructionEnum, 'ALUMINIUM_WOOD', INDETERMINATE) -aluminium_plastic = express_getattr(IfcDoorStyleConstructionEnum, 'ALUMINIUM_PLASTIC', INDETERMINATE) -plastic = express_getattr(IfcDoorStyleConstructionEnum, 'PLASTIC', INDETERMINATE) -userdefined = express_getattr(IfcDoorStyleConstructionEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDoorStyleConstructionEnum, 'NOTDEFINED', INDETERMINATE) +aluminium = IfcDoorStyleConstructionEnum.ALUMINIUM +high_grade_steel = IfcDoorStyleConstructionEnum.HIGH_GRADE_STEEL +steel = IfcDoorStyleConstructionEnum.STEEL +wood = IfcDoorStyleConstructionEnum.WOOD +aluminium_wood = IfcDoorStyleConstructionEnum.ALUMINIUM_WOOD +aluminium_plastic = IfcDoorStyleConstructionEnum.ALUMINIUM_PLASTIC +plastic = IfcDoorStyleConstructionEnum.PLASTIC +userdefined = IfcDoorStyleConstructionEnum.USERDEFINED +notdefined = IfcDoorStyleConstructionEnum.NOTDEFINED IfcDoorStyleOperationEnum = enum_namespace() -single_swing_left = express_getattr(IfcDoorStyleOperationEnum, 'SINGLE_SWING_LEFT', INDETERMINATE) -single_swing_right = express_getattr(IfcDoorStyleOperationEnum, 'SINGLE_SWING_RIGHT', INDETERMINATE) -double_door_single_swing = express_getattr(IfcDoorStyleOperationEnum, 'DOUBLE_DOOR_SINGLE_SWING', INDETERMINATE) -double_door_single_swing_opposite_left = express_getattr(IfcDoorStyleOperationEnum, 'DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_LEFT', INDETERMINATE) -double_door_single_swing_opposite_right = express_getattr(IfcDoorStyleOperationEnum, 'DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_RIGHT', INDETERMINATE) -double_swing_left = express_getattr(IfcDoorStyleOperationEnum, 'DOUBLE_SWING_LEFT', INDETERMINATE) -double_swing_right = express_getattr(IfcDoorStyleOperationEnum, 'DOUBLE_SWING_RIGHT', INDETERMINATE) -double_door_double_swing = express_getattr(IfcDoorStyleOperationEnum, 'DOUBLE_DOOR_DOUBLE_SWING', INDETERMINATE) -sliding_to_left = express_getattr(IfcDoorStyleOperationEnum, 'SLIDING_TO_LEFT', INDETERMINATE) -sliding_to_right = express_getattr(IfcDoorStyleOperationEnum, 'SLIDING_TO_RIGHT', INDETERMINATE) -double_door_sliding = express_getattr(IfcDoorStyleOperationEnum, 'DOUBLE_DOOR_SLIDING', INDETERMINATE) -folding_to_left = express_getattr(IfcDoorStyleOperationEnum, 'FOLDING_TO_LEFT', INDETERMINATE) -folding_to_right = express_getattr(IfcDoorStyleOperationEnum, 'FOLDING_TO_RIGHT', INDETERMINATE) -double_door_folding = express_getattr(IfcDoorStyleOperationEnum, 'DOUBLE_DOOR_FOLDING', INDETERMINATE) -revolving = express_getattr(IfcDoorStyleOperationEnum, 'REVOLVING', INDETERMINATE) -rollingup = express_getattr(IfcDoorStyleOperationEnum, 'ROLLINGUP', INDETERMINATE) -userdefined = express_getattr(IfcDoorStyleOperationEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDoorStyleOperationEnum, 'NOTDEFINED', INDETERMINATE) +single_swing_left = IfcDoorStyleOperationEnum.SINGLE_SWING_LEFT +single_swing_right = IfcDoorStyleOperationEnum.SINGLE_SWING_RIGHT +double_door_single_swing = IfcDoorStyleOperationEnum.DOUBLE_DOOR_SINGLE_SWING +double_door_single_swing_opposite_left = IfcDoorStyleOperationEnum.DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_LEFT +double_door_single_swing_opposite_right = IfcDoorStyleOperationEnum.DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_RIGHT +double_swing_left = IfcDoorStyleOperationEnum.DOUBLE_SWING_LEFT +double_swing_right = IfcDoorStyleOperationEnum.DOUBLE_SWING_RIGHT +double_door_double_swing = IfcDoorStyleOperationEnum.DOUBLE_DOOR_DOUBLE_SWING +sliding_to_left = IfcDoorStyleOperationEnum.SLIDING_TO_LEFT +sliding_to_right = IfcDoorStyleOperationEnum.SLIDING_TO_RIGHT +double_door_sliding = IfcDoorStyleOperationEnum.DOUBLE_DOOR_SLIDING +folding_to_left = IfcDoorStyleOperationEnum.FOLDING_TO_LEFT +folding_to_right = IfcDoorStyleOperationEnum.FOLDING_TO_RIGHT +double_door_folding = IfcDoorStyleOperationEnum.DOUBLE_DOOR_FOLDING +revolving = IfcDoorStyleOperationEnum.REVOLVING +rollingup = IfcDoorStyleOperationEnum.ROLLINGUP +userdefined = IfcDoorStyleOperationEnum.USERDEFINED +notdefined = IfcDoorStyleOperationEnum.NOTDEFINED IfcDoorTypeEnum = enum_namespace() -door = express_getattr(IfcDoorTypeEnum, 'DOOR', INDETERMINATE) -gate = express_getattr(IfcDoorTypeEnum, 'GATE', INDETERMINATE) -trapdoor = express_getattr(IfcDoorTypeEnum, 'TRAPDOOR', INDETERMINATE) -boom_barrier = express_getattr(IfcDoorTypeEnum, 'BOOM_BARRIER', INDETERMINATE) -turnstile = express_getattr(IfcDoorTypeEnum, 'TURNSTILE', INDETERMINATE) -userdefined = express_getattr(IfcDoorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDoorTypeEnum, 'NOTDEFINED', INDETERMINATE) +door = IfcDoorTypeEnum.DOOR +gate = IfcDoorTypeEnum.GATE +trapdoor = IfcDoorTypeEnum.TRAPDOOR +boom_barrier = IfcDoorTypeEnum.BOOM_BARRIER +turnstile = IfcDoorTypeEnum.TURNSTILE +userdefined = IfcDoorTypeEnum.USERDEFINED +notdefined = IfcDoorTypeEnum.NOTDEFINED IfcDoorTypeOperationEnum = enum_namespace() -single_swing_left = express_getattr(IfcDoorTypeOperationEnum, 'SINGLE_SWING_LEFT', INDETERMINATE) -single_swing_right = express_getattr(IfcDoorTypeOperationEnum, 'SINGLE_SWING_RIGHT', INDETERMINATE) -double_panel_single_swing = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_PANEL_SINGLE_SWING', INDETERMINATE) -double_panel_single_swing_opposite_left = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_PANEL_SINGLE_SWING_OPPOSITE_LEFT', INDETERMINATE) -double_panel_single_swing_opposite_right = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_PANEL_SINGLE_SWING_OPPOSITE_RIGHT', INDETERMINATE) -double_swing_left = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_SWING_LEFT', INDETERMINATE) -double_swing_right = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_SWING_RIGHT', INDETERMINATE) -double_panel_double_swing = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_PANEL_DOUBLE_SWING', INDETERMINATE) -sliding_to_left = express_getattr(IfcDoorTypeOperationEnum, 'SLIDING_TO_LEFT', INDETERMINATE) -sliding_to_right = express_getattr(IfcDoorTypeOperationEnum, 'SLIDING_TO_RIGHT', INDETERMINATE) -double_panel_sliding = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_PANEL_SLIDING', INDETERMINATE) -folding_to_left = express_getattr(IfcDoorTypeOperationEnum, 'FOLDING_TO_LEFT', INDETERMINATE) -folding_to_right = express_getattr(IfcDoorTypeOperationEnum, 'FOLDING_TO_RIGHT', INDETERMINATE) -double_panel_folding = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_PANEL_FOLDING', INDETERMINATE) -revolving_horizontal = express_getattr(IfcDoorTypeOperationEnum, 'REVOLVING_HORIZONTAL', INDETERMINATE) -rollingup = express_getattr(IfcDoorTypeOperationEnum, 'ROLLINGUP', INDETERMINATE) -swing_fixed_left = express_getattr(IfcDoorTypeOperationEnum, 'SWING_FIXED_LEFT', INDETERMINATE) -swing_fixed_right = express_getattr(IfcDoorTypeOperationEnum, 'SWING_FIXED_RIGHT', INDETERMINATE) -double_panel_lifting_vertical = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_PANEL_LIFTING_VERTICAL', INDETERMINATE) -lifting_horizontal = express_getattr(IfcDoorTypeOperationEnum, 'LIFTING_HORIZONTAL', INDETERMINATE) -lifting_vertical_left = express_getattr(IfcDoorTypeOperationEnum, 'LIFTING_VERTICAL_LEFT', INDETERMINATE) -lifting_vertical_right = express_getattr(IfcDoorTypeOperationEnum, 'LIFTING_VERTICAL_RIGHT', INDETERMINATE) -revolving_vertical = express_getattr(IfcDoorTypeOperationEnum, 'REVOLVING_VERTICAL', INDETERMINATE) -userdefined = express_getattr(IfcDoorTypeOperationEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDoorTypeOperationEnum, 'NOTDEFINED', INDETERMINATE) +single_swing_left = IfcDoorTypeOperationEnum.SINGLE_SWING_LEFT +single_swing_right = IfcDoorTypeOperationEnum.SINGLE_SWING_RIGHT +double_panel_single_swing = IfcDoorTypeOperationEnum.DOUBLE_PANEL_SINGLE_SWING +double_panel_single_swing_opposite_left = IfcDoorTypeOperationEnum.DOUBLE_PANEL_SINGLE_SWING_OPPOSITE_LEFT +double_panel_single_swing_opposite_right = IfcDoorTypeOperationEnum.DOUBLE_PANEL_SINGLE_SWING_OPPOSITE_RIGHT +double_swing_left = IfcDoorTypeOperationEnum.DOUBLE_SWING_LEFT +double_swing_right = IfcDoorTypeOperationEnum.DOUBLE_SWING_RIGHT +double_panel_double_swing = IfcDoorTypeOperationEnum.DOUBLE_PANEL_DOUBLE_SWING +sliding_to_left = IfcDoorTypeOperationEnum.SLIDING_TO_LEFT +sliding_to_right = IfcDoorTypeOperationEnum.SLIDING_TO_RIGHT +double_panel_sliding = IfcDoorTypeOperationEnum.DOUBLE_PANEL_SLIDING +folding_to_left = IfcDoorTypeOperationEnum.FOLDING_TO_LEFT +folding_to_right = IfcDoorTypeOperationEnum.FOLDING_TO_RIGHT +double_panel_folding = IfcDoorTypeOperationEnum.DOUBLE_PANEL_FOLDING +revolving_horizontal = IfcDoorTypeOperationEnum.REVOLVING_HORIZONTAL +rollingup = IfcDoorTypeOperationEnum.ROLLINGUP +swing_fixed_left = IfcDoorTypeOperationEnum.SWING_FIXED_LEFT +swing_fixed_right = IfcDoorTypeOperationEnum.SWING_FIXED_RIGHT +double_panel_lifting_vertical = IfcDoorTypeOperationEnum.DOUBLE_PANEL_LIFTING_VERTICAL +lifting_horizontal = IfcDoorTypeOperationEnum.LIFTING_HORIZONTAL +lifting_vertical_left = IfcDoorTypeOperationEnum.LIFTING_VERTICAL_LEFT +lifting_vertical_right = IfcDoorTypeOperationEnum.LIFTING_VERTICAL_RIGHT +revolving_vertical = IfcDoorTypeOperationEnum.REVOLVING_VERTICAL +userdefined = IfcDoorTypeOperationEnum.USERDEFINED +notdefined = IfcDoorTypeOperationEnum.NOTDEFINED IfcDuctFittingTypeEnum = enum_namespace() -bend = express_getattr(IfcDuctFittingTypeEnum, 'BEND', INDETERMINATE) -connector = express_getattr(IfcDuctFittingTypeEnum, 'CONNECTOR', INDETERMINATE) -entry = express_getattr(IfcDuctFittingTypeEnum, 'ENTRY', INDETERMINATE) -exit = express_getattr(IfcDuctFittingTypeEnum, 'EXIT', INDETERMINATE) -junction = express_getattr(IfcDuctFittingTypeEnum, 'JUNCTION', INDETERMINATE) -obstruction = express_getattr(IfcDuctFittingTypeEnum, 'OBSTRUCTION', INDETERMINATE) -transition = express_getattr(IfcDuctFittingTypeEnum, 'TRANSITION', INDETERMINATE) -userdefined = express_getattr(IfcDuctFittingTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDuctFittingTypeEnum, 'NOTDEFINED', INDETERMINATE) +bend = IfcDuctFittingTypeEnum.BEND +connector = IfcDuctFittingTypeEnum.CONNECTOR +entry = IfcDuctFittingTypeEnum.ENTRY +exit = IfcDuctFittingTypeEnum.EXIT +junction = IfcDuctFittingTypeEnum.JUNCTION +obstruction = IfcDuctFittingTypeEnum.OBSTRUCTION +transition = IfcDuctFittingTypeEnum.TRANSITION +userdefined = IfcDuctFittingTypeEnum.USERDEFINED +notdefined = IfcDuctFittingTypeEnum.NOTDEFINED IfcDuctSegmentTypeEnum = enum_namespace() -rigidsegment = express_getattr(IfcDuctSegmentTypeEnum, 'RIGIDSEGMENT', INDETERMINATE) -flexiblesegment = express_getattr(IfcDuctSegmentTypeEnum, 'FLEXIBLESEGMENT', INDETERMINATE) -userdefined = express_getattr(IfcDuctSegmentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDuctSegmentTypeEnum, 'NOTDEFINED', INDETERMINATE) +rigidsegment = IfcDuctSegmentTypeEnum.RIGIDSEGMENT +flexiblesegment = IfcDuctSegmentTypeEnum.FLEXIBLESEGMENT +userdefined = IfcDuctSegmentTypeEnum.USERDEFINED +notdefined = IfcDuctSegmentTypeEnum.NOTDEFINED IfcDuctSilencerTypeEnum = enum_namespace() -flatoval = express_getattr(IfcDuctSilencerTypeEnum, 'FLATOVAL', INDETERMINATE) -rectangular = express_getattr(IfcDuctSilencerTypeEnum, 'RECTANGULAR', INDETERMINATE) -round = express_getattr(IfcDuctSilencerTypeEnum, 'ROUND', INDETERMINATE) -userdefined = express_getattr(IfcDuctSilencerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDuctSilencerTypeEnum, 'NOTDEFINED', INDETERMINATE) +flatoval = IfcDuctSilencerTypeEnum.FLATOVAL +rectangular = IfcDuctSilencerTypeEnum.RECTANGULAR +round = IfcDuctSilencerTypeEnum.ROUND +userdefined = IfcDuctSilencerTypeEnum.USERDEFINED +notdefined = IfcDuctSilencerTypeEnum.NOTDEFINED IfcEarthworksCutTypeEnum = enum_namespace() -trench = express_getattr(IfcEarthworksCutTypeEnum, 'TRENCH', INDETERMINATE) -dredging = express_getattr(IfcEarthworksCutTypeEnum, 'DREDGING', INDETERMINATE) -excavation = express_getattr(IfcEarthworksCutTypeEnum, 'EXCAVATION', INDETERMINATE) -overexcavation = express_getattr(IfcEarthworksCutTypeEnum, 'OVEREXCAVATION', INDETERMINATE) -topsoilremoval = express_getattr(IfcEarthworksCutTypeEnum, 'TOPSOILREMOVAL', INDETERMINATE) -stepexcavation = express_getattr(IfcEarthworksCutTypeEnum, 'STEPEXCAVATION', INDETERMINATE) -pavementmilling = express_getattr(IfcEarthworksCutTypeEnum, 'PAVEMENTMILLING', INDETERMINATE) -cut = express_getattr(IfcEarthworksCutTypeEnum, 'CUT', INDETERMINATE) -base_excavation = express_getattr(IfcEarthworksCutTypeEnum, 'BASE_EXCAVATION', INDETERMINATE) -userdefined = express_getattr(IfcEarthworksCutTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcEarthworksCutTypeEnum, 'NOTDEFINED', INDETERMINATE) +trench = IfcEarthworksCutTypeEnum.TRENCH +dredging = IfcEarthworksCutTypeEnum.DREDGING +excavation = IfcEarthworksCutTypeEnum.EXCAVATION +overexcavation = IfcEarthworksCutTypeEnum.OVEREXCAVATION +topsoilremoval = IfcEarthworksCutTypeEnum.TOPSOILREMOVAL +stepexcavation = IfcEarthworksCutTypeEnum.STEPEXCAVATION +pavementmilling = IfcEarthworksCutTypeEnum.PAVEMENTMILLING +cut = IfcEarthworksCutTypeEnum.CUT +base_excavation = IfcEarthworksCutTypeEnum.BASE_EXCAVATION +userdefined = IfcEarthworksCutTypeEnum.USERDEFINED +notdefined = IfcEarthworksCutTypeEnum.NOTDEFINED IfcEarthworksFillTypeEnum = enum_namespace() -backfill = express_getattr(IfcEarthworksFillTypeEnum, 'BACKFILL', INDETERMINATE) -counterweight = express_getattr(IfcEarthworksFillTypeEnum, 'COUNTERWEIGHT', INDETERMINATE) -subgrade = express_getattr(IfcEarthworksFillTypeEnum, 'SUBGRADE', INDETERMINATE) -embankment = express_getattr(IfcEarthworksFillTypeEnum, 'EMBANKMENT', INDETERMINATE) -transitionsection = express_getattr(IfcEarthworksFillTypeEnum, 'TRANSITIONSECTION', INDETERMINATE) -subgradebed = express_getattr(IfcEarthworksFillTypeEnum, 'SUBGRADEBED', INDETERMINATE) -slopefill = express_getattr(IfcEarthworksFillTypeEnum, 'SLOPEFILL', INDETERMINATE) -userdefined = express_getattr(IfcEarthworksFillTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcEarthworksFillTypeEnum, 'NOTDEFINED', INDETERMINATE) +backfill = IfcEarthworksFillTypeEnum.BACKFILL +counterweight = IfcEarthworksFillTypeEnum.COUNTERWEIGHT +subgrade = IfcEarthworksFillTypeEnum.SUBGRADE +embankment = IfcEarthworksFillTypeEnum.EMBANKMENT +transitionsection = IfcEarthworksFillTypeEnum.TRANSITIONSECTION +subgradebed = IfcEarthworksFillTypeEnum.SUBGRADEBED +slopefill = IfcEarthworksFillTypeEnum.SLOPEFILL +userdefined = IfcEarthworksFillTypeEnum.USERDEFINED +notdefined = IfcEarthworksFillTypeEnum.NOTDEFINED IfcElectricApplianceTypeEnum = enum_namespace() -dishwasher = express_getattr(IfcElectricApplianceTypeEnum, 'DISHWASHER', INDETERMINATE) -electriccooker = express_getattr(IfcElectricApplianceTypeEnum, 'ELECTRICCOOKER', INDETERMINATE) -freestandingelectricheater = express_getattr(IfcElectricApplianceTypeEnum, 'FREESTANDINGELECTRICHEATER', INDETERMINATE) -freestandingfan = express_getattr(IfcElectricApplianceTypeEnum, 'FREESTANDINGFAN', INDETERMINATE) -freestandingwaterheater = express_getattr(IfcElectricApplianceTypeEnum, 'FREESTANDINGWATERHEATER', INDETERMINATE) -freestandingwatercooler = express_getattr(IfcElectricApplianceTypeEnum, 'FREESTANDINGWATERCOOLER', INDETERMINATE) -freezer = express_getattr(IfcElectricApplianceTypeEnum, 'FREEZER', INDETERMINATE) -fridge_freezer = express_getattr(IfcElectricApplianceTypeEnum, 'FRIDGE_FREEZER', INDETERMINATE) -handdryer = express_getattr(IfcElectricApplianceTypeEnum, 'HANDDRYER', INDETERMINATE) -kitchenmachine = express_getattr(IfcElectricApplianceTypeEnum, 'KITCHENMACHINE', INDETERMINATE) -microwave = express_getattr(IfcElectricApplianceTypeEnum, 'MICROWAVE', INDETERMINATE) -photocopier = express_getattr(IfcElectricApplianceTypeEnum, 'PHOTOCOPIER', INDETERMINATE) -refrigerator = express_getattr(IfcElectricApplianceTypeEnum, 'REFRIGERATOR', INDETERMINATE) -tumbledryer = express_getattr(IfcElectricApplianceTypeEnum, 'TUMBLEDRYER', INDETERMINATE) -vendingmachine = express_getattr(IfcElectricApplianceTypeEnum, 'VENDINGMACHINE', INDETERMINATE) -washingmachine = express_getattr(IfcElectricApplianceTypeEnum, 'WASHINGMACHINE', INDETERMINATE) -userdefined = express_getattr(IfcElectricApplianceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcElectricApplianceTypeEnum, 'NOTDEFINED', INDETERMINATE) +dishwasher = IfcElectricApplianceTypeEnum.DISHWASHER +electriccooker = IfcElectricApplianceTypeEnum.ELECTRICCOOKER +freestandingelectricheater = IfcElectricApplianceTypeEnum.FREESTANDINGELECTRICHEATER +freestandingfan = IfcElectricApplianceTypeEnum.FREESTANDINGFAN +freestandingwaterheater = IfcElectricApplianceTypeEnum.FREESTANDINGWATERHEATER +freestandingwatercooler = IfcElectricApplianceTypeEnum.FREESTANDINGWATERCOOLER +freezer = IfcElectricApplianceTypeEnum.FREEZER +fridge_freezer = IfcElectricApplianceTypeEnum.FRIDGE_FREEZER +handdryer = IfcElectricApplianceTypeEnum.HANDDRYER +kitchenmachine = IfcElectricApplianceTypeEnum.KITCHENMACHINE +microwave = IfcElectricApplianceTypeEnum.MICROWAVE +photocopier = IfcElectricApplianceTypeEnum.PHOTOCOPIER +refrigerator = IfcElectricApplianceTypeEnum.REFRIGERATOR +tumbledryer = IfcElectricApplianceTypeEnum.TUMBLEDRYER +vendingmachine = IfcElectricApplianceTypeEnum.VENDINGMACHINE +washingmachine = IfcElectricApplianceTypeEnum.WASHINGMACHINE +userdefined = IfcElectricApplianceTypeEnum.USERDEFINED +notdefined = IfcElectricApplianceTypeEnum.NOTDEFINED IfcElectricDistributionBoardTypeEnum = enum_namespace() -consumerunit = express_getattr(IfcElectricDistributionBoardTypeEnum, 'CONSUMERUNIT', INDETERMINATE) -distributionboard = express_getattr(IfcElectricDistributionBoardTypeEnum, 'DISTRIBUTIONBOARD', INDETERMINATE) -motorcontrolcentre = express_getattr(IfcElectricDistributionBoardTypeEnum, 'MOTORCONTROLCENTRE', INDETERMINATE) -switchboard = express_getattr(IfcElectricDistributionBoardTypeEnum, 'SWITCHBOARD', INDETERMINATE) -userdefined = express_getattr(IfcElectricDistributionBoardTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcElectricDistributionBoardTypeEnum, 'NOTDEFINED', INDETERMINATE) +consumerunit = IfcElectricDistributionBoardTypeEnum.CONSUMERUNIT +distributionboard = IfcElectricDistributionBoardTypeEnum.DISTRIBUTIONBOARD +motorcontrolcentre = IfcElectricDistributionBoardTypeEnum.MOTORCONTROLCENTRE +switchboard = IfcElectricDistributionBoardTypeEnum.SWITCHBOARD +userdefined = IfcElectricDistributionBoardTypeEnum.USERDEFINED +notdefined = IfcElectricDistributionBoardTypeEnum.NOTDEFINED IfcElectricFlowStorageDeviceTypeEnum = enum_namespace() -battery = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'BATTERY', INDETERMINATE) -capacitorbank = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'CAPACITORBANK', INDETERMINATE) -harmonicfilter = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'HARMONICFILTER', INDETERMINATE) -inductorbank = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'INDUCTORBANK', INDETERMINATE) -ups = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'UPS', INDETERMINATE) -capacitor = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'CAPACITOR', INDETERMINATE) -compensator = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'COMPENSATOR', INDETERMINATE) -inductor = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'INDUCTOR', INDETERMINATE) -recharger = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'RECHARGER', INDETERMINATE) -userdefined = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'NOTDEFINED', INDETERMINATE) +battery = IfcElectricFlowStorageDeviceTypeEnum.BATTERY +capacitorbank = IfcElectricFlowStorageDeviceTypeEnum.CAPACITORBANK +harmonicfilter = IfcElectricFlowStorageDeviceTypeEnum.HARMONICFILTER +inductorbank = IfcElectricFlowStorageDeviceTypeEnum.INDUCTORBANK +ups = IfcElectricFlowStorageDeviceTypeEnum.UPS +capacitor = IfcElectricFlowStorageDeviceTypeEnum.CAPACITOR +compensator = IfcElectricFlowStorageDeviceTypeEnum.COMPENSATOR +inductor = IfcElectricFlowStorageDeviceTypeEnum.INDUCTOR +recharger = IfcElectricFlowStorageDeviceTypeEnum.RECHARGER +userdefined = IfcElectricFlowStorageDeviceTypeEnum.USERDEFINED +notdefined = IfcElectricFlowStorageDeviceTypeEnum.NOTDEFINED IfcElectricFlowTreatmentDeviceTypeEnum = enum_namespace() -electronicfilter = express_getattr(IfcElectricFlowTreatmentDeviceTypeEnum, 'ELECTRONICFILTER', INDETERMINATE) -userdefined = express_getattr(IfcElectricFlowTreatmentDeviceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcElectricFlowTreatmentDeviceTypeEnum, 'NOTDEFINED', INDETERMINATE) +electronicfilter = IfcElectricFlowTreatmentDeviceTypeEnum.ELECTRONICFILTER +userdefined = IfcElectricFlowTreatmentDeviceTypeEnum.USERDEFINED +notdefined = IfcElectricFlowTreatmentDeviceTypeEnum.NOTDEFINED IfcElectricGeneratorTypeEnum = enum_namespace() -chp = express_getattr(IfcElectricGeneratorTypeEnum, 'CHP', INDETERMINATE) -enginegenerator = express_getattr(IfcElectricGeneratorTypeEnum, 'ENGINEGENERATOR', INDETERMINATE) -standalone = express_getattr(IfcElectricGeneratorTypeEnum, 'STANDALONE', INDETERMINATE) -userdefined = express_getattr(IfcElectricGeneratorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcElectricGeneratorTypeEnum, 'NOTDEFINED', INDETERMINATE) +chp = IfcElectricGeneratorTypeEnum.CHP +enginegenerator = IfcElectricGeneratorTypeEnum.ENGINEGENERATOR +standalone = IfcElectricGeneratorTypeEnum.STANDALONE +userdefined = IfcElectricGeneratorTypeEnum.USERDEFINED +notdefined = IfcElectricGeneratorTypeEnum.NOTDEFINED IfcElectricMotorTypeEnum = enum_namespace() -dc = express_getattr(IfcElectricMotorTypeEnum, 'DC', INDETERMINATE) -induction = express_getattr(IfcElectricMotorTypeEnum, 'INDUCTION', INDETERMINATE) -polyphase = express_getattr(IfcElectricMotorTypeEnum, 'POLYPHASE', INDETERMINATE) -reluctancesynchronous = express_getattr(IfcElectricMotorTypeEnum, 'RELUCTANCESYNCHRONOUS', INDETERMINATE) -synchronous = express_getattr(IfcElectricMotorTypeEnum, 'SYNCHRONOUS', INDETERMINATE) -userdefined = express_getattr(IfcElectricMotorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcElectricMotorTypeEnum, 'NOTDEFINED', INDETERMINATE) +dc = IfcElectricMotorTypeEnum.DC +induction = IfcElectricMotorTypeEnum.INDUCTION +polyphase = IfcElectricMotorTypeEnum.POLYPHASE +reluctancesynchronous = IfcElectricMotorTypeEnum.RELUCTANCESYNCHRONOUS +synchronous = IfcElectricMotorTypeEnum.SYNCHRONOUS +userdefined = IfcElectricMotorTypeEnum.USERDEFINED +notdefined = IfcElectricMotorTypeEnum.NOTDEFINED IfcElectricTimeControlTypeEnum = enum_namespace() -timeclock = express_getattr(IfcElectricTimeControlTypeEnum, 'TIMECLOCK', INDETERMINATE) -timedelay = express_getattr(IfcElectricTimeControlTypeEnum, 'TIMEDELAY', INDETERMINATE) -relay = express_getattr(IfcElectricTimeControlTypeEnum, 'RELAY', INDETERMINATE) -userdefined = express_getattr(IfcElectricTimeControlTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcElectricTimeControlTypeEnum, 'NOTDEFINED', INDETERMINATE) +timeclock = IfcElectricTimeControlTypeEnum.TIMECLOCK +timedelay = IfcElectricTimeControlTypeEnum.TIMEDELAY +relay = IfcElectricTimeControlTypeEnum.RELAY +userdefined = IfcElectricTimeControlTypeEnum.USERDEFINED +notdefined = IfcElectricTimeControlTypeEnum.NOTDEFINED IfcElementAssemblyTypeEnum = enum_namespace() -accessory_assembly = express_getattr(IfcElementAssemblyTypeEnum, 'ACCESSORY_ASSEMBLY', INDETERMINATE) -arch = express_getattr(IfcElementAssemblyTypeEnum, 'ARCH', INDETERMINATE) -beam_grid = express_getattr(IfcElementAssemblyTypeEnum, 'BEAM_GRID', INDETERMINATE) -braced_frame = express_getattr(IfcElementAssemblyTypeEnum, 'BRACED_FRAME', INDETERMINATE) -girder = express_getattr(IfcElementAssemblyTypeEnum, 'GIRDER', INDETERMINATE) -reinforcement_unit = express_getattr(IfcElementAssemblyTypeEnum, 'REINFORCEMENT_UNIT', INDETERMINATE) -rigid_frame = express_getattr(IfcElementAssemblyTypeEnum, 'RIGID_FRAME', INDETERMINATE) -slab_field = express_getattr(IfcElementAssemblyTypeEnum, 'SLAB_FIELD', INDETERMINATE) -truss = express_getattr(IfcElementAssemblyTypeEnum, 'TRUSS', INDETERMINATE) -abutment = express_getattr(IfcElementAssemblyTypeEnum, 'ABUTMENT', INDETERMINATE) -pier = express_getattr(IfcElementAssemblyTypeEnum, 'PIER', INDETERMINATE) -pylon = express_getattr(IfcElementAssemblyTypeEnum, 'PYLON', INDETERMINATE) -cross_bracing = express_getattr(IfcElementAssemblyTypeEnum, 'CROSS_BRACING', INDETERMINATE) -deck = express_getattr(IfcElementAssemblyTypeEnum, 'DECK', INDETERMINATE) -mast = express_getattr(IfcElementAssemblyTypeEnum, 'MAST', INDETERMINATE) -signalassembly = express_getattr(IfcElementAssemblyTypeEnum, 'SIGNALASSEMBLY', INDETERMINATE) -grid = express_getattr(IfcElementAssemblyTypeEnum, 'GRID', INDETERMINATE) -shelter = express_getattr(IfcElementAssemblyTypeEnum, 'SHELTER', INDETERMINATE) -supportingassembly = express_getattr(IfcElementAssemblyTypeEnum, 'SUPPORTINGASSEMBLY', INDETERMINATE) -suspensionassembly = express_getattr(IfcElementAssemblyTypeEnum, 'SUSPENSIONASSEMBLY', INDETERMINATE) -traction_switching_assembly = express_getattr(IfcElementAssemblyTypeEnum, 'TRACTION_SWITCHING_ASSEMBLY', INDETERMINATE) -trackpanel = express_getattr(IfcElementAssemblyTypeEnum, 'TRACKPANEL', INDETERMINATE) -turnoutpanel = express_getattr(IfcElementAssemblyTypeEnum, 'TURNOUTPANEL', INDETERMINATE) -dilatationpanel = express_getattr(IfcElementAssemblyTypeEnum, 'DILATATIONPANEL', INDETERMINATE) -rail_mechanical_equipment_assembly = express_getattr(IfcElementAssemblyTypeEnum, 'RAIL_MECHANICAL_EQUIPMENT_ASSEMBLY', INDETERMINATE) -entranceworks = express_getattr(IfcElementAssemblyTypeEnum, 'ENTRANCEWORKS', INDETERMINATE) -sumpbuster = express_getattr(IfcElementAssemblyTypeEnum, 'SUMPBUSTER', INDETERMINATE) -traffic_calming_device = express_getattr(IfcElementAssemblyTypeEnum, 'TRAFFIC_CALMING_DEVICE', INDETERMINATE) -userdefined = express_getattr(IfcElementAssemblyTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcElementAssemblyTypeEnum, 'NOTDEFINED', INDETERMINATE) +accessory_assembly = IfcElementAssemblyTypeEnum.ACCESSORY_ASSEMBLY +arch = IfcElementAssemblyTypeEnum.ARCH +beam_grid = IfcElementAssemblyTypeEnum.BEAM_GRID +braced_frame = IfcElementAssemblyTypeEnum.BRACED_FRAME +girder = IfcElementAssemblyTypeEnum.GIRDER +reinforcement_unit = IfcElementAssemblyTypeEnum.REINFORCEMENT_UNIT +rigid_frame = IfcElementAssemblyTypeEnum.RIGID_FRAME +slab_field = IfcElementAssemblyTypeEnum.SLAB_FIELD +truss = IfcElementAssemblyTypeEnum.TRUSS +abutment = IfcElementAssemblyTypeEnum.ABUTMENT +pier = IfcElementAssemblyTypeEnum.PIER +pylon = IfcElementAssemblyTypeEnum.PYLON +cross_bracing = IfcElementAssemblyTypeEnum.CROSS_BRACING +deck = IfcElementAssemblyTypeEnum.DECK +mast = IfcElementAssemblyTypeEnum.MAST +signalassembly = IfcElementAssemblyTypeEnum.SIGNALASSEMBLY +grid = IfcElementAssemblyTypeEnum.GRID +shelter = IfcElementAssemblyTypeEnum.SHELTER +supportingassembly = IfcElementAssemblyTypeEnum.SUPPORTINGASSEMBLY +suspensionassembly = IfcElementAssemblyTypeEnum.SUSPENSIONASSEMBLY +traction_switching_assembly = IfcElementAssemblyTypeEnum.TRACTION_SWITCHING_ASSEMBLY +trackpanel = IfcElementAssemblyTypeEnum.TRACKPANEL +turnoutpanel = IfcElementAssemblyTypeEnum.TURNOUTPANEL +dilatationpanel = IfcElementAssemblyTypeEnum.DILATATIONPANEL +rail_mechanical_equipment_assembly = IfcElementAssemblyTypeEnum.RAIL_MECHANICAL_EQUIPMENT_ASSEMBLY +entranceworks = IfcElementAssemblyTypeEnum.ENTRANCEWORKS +sumpbuster = IfcElementAssemblyTypeEnum.SUMPBUSTER +traffic_calming_device = IfcElementAssemblyTypeEnum.TRAFFIC_CALMING_DEVICE +userdefined = IfcElementAssemblyTypeEnum.USERDEFINED +notdefined = IfcElementAssemblyTypeEnum.NOTDEFINED IfcElementCompositionEnum = enum_namespace() -complex = express_getattr(IfcElementCompositionEnum, 'COMPLEX', INDETERMINATE) -element = express_getattr(IfcElementCompositionEnum, 'ELEMENT', INDETERMINATE) -partial = express_getattr(IfcElementCompositionEnum, 'PARTIAL', INDETERMINATE) +complex = IfcElementCompositionEnum.COMPLEX +element = IfcElementCompositionEnum.ELEMENT +partial = IfcElementCompositionEnum.PARTIAL IfcEngineTypeEnum = enum_namespace() -externalcombustion = express_getattr(IfcEngineTypeEnum, 'EXTERNALCOMBUSTION', INDETERMINATE) -internalcombustion = express_getattr(IfcEngineTypeEnum, 'INTERNALCOMBUSTION', INDETERMINATE) -userdefined = express_getattr(IfcEngineTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcEngineTypeEnum, 'NOTDEFINED', INDETERMINATE) +externalcombustion = IfcEngineTypeEnum.EXTERNALCOMBUSTION +internalcombustion = IfcEngineTypeEnum.INTERNALCOMBUSTION +userdefined = IfcEngineTypeEnum.USERDEFINED +notdefined = IfcEngineTypeEnum.NOTDEFINED IfcEvaporativeCoolerTypeEnum = enum_namespace() -directevaporativerandommediaaircooler = express_getattr(IfcEvaporativeCoolerTypeEnum, 'DIRECTEVAPORATIVERANDOMMEDIAAIRCOOLER', INDETERMINATE) -directevaporativerigidmediaaircooler = express_getattr(IfcEvaporativeCoolerTypeEnum, 'DIRECTEVAPORATIVERIGIDMEDIAAIRCOOLER', INDETERMINATE) -directevaporativeslingerspackagedaircooler = express_getattr(IfcEvaporativeCoolerTypeEnum, 'DIRECTEVAPORATIVESLINGERSPACKAGEDAIRCOOLER', INDETERMINATE) -directevaporativepackagedrotaryaircooler = express_getattr(IfcEvaporativeCoolerTypeEnum, 'DIRECTEVAPORATIVEPACKAGEDROTARYAIRCOOLER', INDETERMINATE) -directevaporativeairwasher = express_getattr(IfcEvaporativeCoolerTypeEnum, 'DIRECTEVAPORATIVEAIRWASHER', INDETERMINATE) -indirectevaporativepackageaircooler = express_getattr(IfcEvaporativeCoolerTypeEnum, 'INDIRECTEVAPORATIVEPACKAGEAIRCOOLER', INDETERMINATE) -indirectevaporativewetcoil = express_getattr(IfcEvaporativeCoolerTypeEnum, 'INDIRECTEVAPORATIVEWETCOIL', INDETERMINATE) -indirectevaporativecoolingtowerorcoilcooler = express_getattr(IfcEvaporativeCoolerTypeEnum, 'INDIRECTEVAPORATIVECOOLINGTOWERORCOILCOOLER', INDETERMINATE) -indirectdirectcombination = express_getattr(IfcEvaporativeCoolerTypeEnum, 'INDIRECTDIRECTCOMBINATION', INDETERMINATE) -userdefined = express_getattr(IfcEvaporativeCoolerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcEvaporativeCoolerTypeEnum, 'NOTDEFINED', INDETERMINATE) +directevaporativerandommediaaircooler = IfcEvaporativeCoolerTypeEnum.DIRECTEVAPORATIVERANDOMMEDIAAIRCOOLER +directevaporativerigidmediaaircooler = IfcEvaporativeCoolerTypeEnum.DIRECTEVAPORATIVERIGIDMEDIAAIRCOOLER +directevaporativeslingerspackagedaircooler = IfcEvaporativeCoolerTypeEnum.DIRECTEVAPORATIVESLINGERSPACKAGEDAIRCOOLER +directevaporativepackagedrotaryaircooler = IfcEvaporativeCoolerTypeEnum.DIRECTEVAPORATIVEPACKAGEDROTARYAIRCOOLER +directevaporativeairwasher = IfcEvaporativeCoolerTypeEnum.DIRECTEVAPORATIVEAIRWASHER +indirectevaporativepackageaircooler = IfcEvaporativeCoolerTypeEnum.INDIRECTEVAPORATIVEPACKAGEAIRCOOLER +indirectevaporativewetcoil = IfcEvaporativeCoolerTypeEnum.INDIRECTEVAPORATIVEWETCOIL +indirectevaporativecoolingtowerorcoilcooler = IfcEvaporativeCoolerTypeEnum.INDIRECTEVAPORATIVECOOLINGTOWERORCOILCOOLER +indirectdirectcombination = IfcEvaporativeCoolerTypeEnum.INDIRECTDIRECTCOMBINATION +userdefined = IfcEvaporativeCoolerTypeEnum.USERDEFINED +notdefined = IfcEvaporativeCoolerTypeEnum.NOTDEFINED IfcEvaporatorTypeEnum = enum_namespace() -directexpansion = express_getattr(IfcEvaporatorTypeEnum, 'DIRECTEXPANSION', INDETERMINATE) -directexpansionshellandtube = express_getattr(IfcEvaporatorTypeEnum, 'DIRECTEXPANSIONSHELLANDTUBE', INDETERMINATE) -directexpansiontubeintube = express_getattr(IfcEvaporatorTypeEnum, 'DIRECTEXPANSIONTUBEINTUBE', INDETERMINATE) -directexpansionbrazedplate = express_getattr(IfcEvaporatorTypeEnum, 'DIRECTEXPANSIONBRAZEDPLATE', INDETERMINATE) -floodedshellandtube = express_getattr(IfcEvaporatorTypeEnum, 'FLOODEDSHELLANDTUBE', INDETERMINATE) -shellandcoil = express_getattr(IfcEvaporatorTypeEnum, 'SHELLANDCOIL', INDETERMINATE) -userdefined = express_getattr(IfcEvaporatorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcEvaporatorTypeEnum, 'NOTDEFINED', INDETERMINATE) +directexpansion = IfcEvaporatorTypeEnum.DIRECTEXPANSION +directexpansionshellandtube = IfcEvaporatorTypeEnum.DIRECTEXPANSIONSHELLANDTUBE +directexpansiontubeintube = IfcEvaporatorTypeEnum.DIRECTEXPANSIONTUBEINTUBE +directexpansionbrazedplate = IfcEvaporatorTypeEnum.DIRECTEXPANSIONBRAZEDPLATE +floodedshellandtube = IfcEvaporatorTypeEnum.FLOODEDSHELLANDTUBE +shellandcoil = IfcEvaporatorTypeEnum.SHELLANDCOIL +userdefined = IfcEvaporatorTypeEnum.USERDEFINED +notdefined = IfcEvaporatorTypeEnum.NOTDEFINED IfcEventTriggerTypeEnum = enum_namespace() -eventrule = express_getattr(IfcEventTriggerTypeEnum, 'EVENTRULE', INDETERMINATE) -eventmessage = express_getattr(IfcEventTriggerTypeEnum, 'EVENTMESSAGE', INDETERMINATE) -eventtime = express_getattr(IfcEventTriggerTypeEnum, 'EVENTTIME', INDETERMINATE) -eventcomplex = express_getattr(IfcEventTriggerTypeEnum, 'EVENTCOMPLEX', INDETERMINATE) -userdefined = express_getattr(IfcEventTriggerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcEventTriggerTypeEnum, 'NOTDEFINED', INDETERMINATE) +eventrule = IfcEventTriggerTypeEnum.EVENTRULE +eventmessage = IfcEventTriggerTypeEnum.EVENTMESSAGE +eventtime = IfcEventTriggerTypeEnum.EVENTTIME +eventcomplex = IfcEventTriggerTypeEnum.EVENTCOMPLEX +userdefined = IfcEventTriggerTypeEnum.USERDEFINED +notdefined = IfcEventTriggerTypeEnum.NOTDEFINED IfcEventTypeEnum = enum_namespace() -startevent = express_getattr(IfcEventTypeEnum, 'STARTEVENT', INDETERMINATE) -endevent = express_getattr(IfcEventTypeEnum, 'ENDEVENT', INDETERMINATE) -intermediateevent = express_getattr(IfcEventTypeEnum, 'INTERMEDIATEEVENT', INDETERMINATE) -userdefined = express_getattr(IfcEventTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcEventTypeEnum, 'NOTDEFINED', INDETERMINATE) +startevent = IfcEventTypeEnum.STARTEVENT +endevent = IfcEventTypeEnum.ENDEVENT +intermediateevent = IfcEventTypeEnum.INTERMEDIATEEVENT +userdefined = IfcEventTypeEnum.USERDEFINED +notdefined = IfcEventTypeEnum.NOTDEFINED IfcExternalSpatialElementTypeEnum = enum_namespace() -external = express_getattr(IfcExternalSpatialElementTypeEnum, 'EXTERNAL', INDETERMINATE) -external_earth = express_getattr(IfcExternalSpatialElementTypeEnum, 'EXTERNAL_EARTH', INDETERMINATE) -external_water = express_getattr(IfcExternalSpatialElementTypeEnum, 'EXTERNAL_WATER', INDETERMINATE) -external_fire = express_getattr(IfcExternalSpatialElementTypeEnum, 'EXTERNAL_FIRE', INDETERMINATE) -userdefined = express_getattr(IfcExternalSpatialElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcExternalSpatialElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +external = IfcExternalSpatialElementTypeEnum.EXTERNAL +external_earth = IfcExternalSpatialElementTypeEnum.EXTERNAL_EARTH +external_water = IfcExternalSpatialElementTypeEnum.EXTERNAL_WATER +external_fire = IfcExternalSpatialElementTypeEnum.EXTERNAL_FIRE +userdefined = IfcExternalSpatialElementTypeEnum.USERDEFINED +notdefined = IfcExternalSpatialElementTypeEnum.NOTDEFINED IfcFacilityPartCommonTypeEnum = enum_namespace() -segment = express_getattr(IfcFacilityPartCommonTypeEnum, 'SEGMENT', INDETERMINATE) -aboveground = express_getattr(IfcFacilityPartCommonTypeEnum, 'ABOVEGROUND', INDETERMINATE) -junction = express_getattr(IfcFacilityPartCommonTypeEnum, 'JUNCTION', INDETERMINATE) -levelcrossing = express_getattr(IfcFacilityPartCommonTypeEnum, 'LEVELCROSSING', INDETERMINATE) -belowground = express_getattr(IfcFacilityPartCommonTypeEnum, 'BELOWGROUND', INDETERMINATE) -substructure = express_getattr(IfcFacilityPartCommonTypeEnum, 'SUBSTRUCTURE', INDETERMINATE) -terminal = express_getattr(IfcFacilityPartCommonTypeEnum, 'TERMINAL', INDETERMINATE) -superstructure = express_getattr(IfcFacilityPartCommonTypeEnum, 'SUPERSTRUCTURE', INDETERMINATE) -userdefined = express_getattr(IfcFacilityPartCommonTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFacilityPartCommonTypeEnum, 'NOTDEFINED', INDETERMINATE) +segment = IfcFacilityPartCommonTypeEnum.SEGMENT +aboveground = IfcFacilityPartCommonTypeEnum.ABOVEGROUND +junction = IfcFacilityPartCommonTypeEnum.JUNCTION +levelcrossing = IfcFacilityPartCommonTypeEnum.LEVELCROSSING +belowground = IfcFacilityPartCommonTypeEnum.BELOWGROUND +substructure = IfcFacilityPartCommonTypeEnum.SUBSTRUCTURE +terminal = IfcFacilityPartCommonTypeEnum.TERMINAL +superstructure = IfcFacilityPartCommonTypeEnum.SUPERSTRUCTURE +userdefined = IfcFacilityPartCommonTypeEnum.USERDEFINED +notdefined = IfcFacilityPartCommonTypeEnum.NOTDEFINED IfcFacilityUsageEnum = enum_namespace() -lateral = express_getattr(IfcFacilityUsageEnum, 'LATERAL', INDETERMINATE) -region = express_getattr(IfcFacilityUsageEnum, 'REGION', INDETERMINATE) -vertical = express_getattr(IfcFacilityUsageEnum, 'VERTICAL', INDETERMINATE) -longitudinal = express_getattr(IfcFacilityUsageEnum, 'LONGITUDINAL', INDETERMINATE) -userdefined = express_getattr(IfcFacilityUsageEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFacilityUsageEnum, 'NOTDEFINED', INDETERMINATE) +lateral = IfcFacilityUsageEnum.LATERAL +region = IfcFacilityUsageEnum.REGION +vertical = IfcFacilityUsageEnum.VERTICAL +longitudinal = IfcFacilityUsageEnum.LONGITUDINAL +userdefined = IfcFacilityUsageEnum.USERDEFINED +notdefined = IfcFacilityUsageEnum.NOTDEFINED IfcFanTypeEnum = enum_namespace() -centrifugalforwardcurved = express_getattr(IfcFanTypeEnum, 'CENTRIFUGALFORWARDCURVED', INDETERMINATE) -centrifugalradial = express_getattr(IfcFanTypeEnum, 'CENTRIFUGALRADIAL', INDETERMINATE) -centrifugalbackwardinclinedcurved = express_getattr(IfcFanTypeEnum, 'CENTRIFUGALBACKWARDINCLINEDCURVED', INDETERMINATE) -centrifugalairfoil = express_getattr(IfcFanTypeEnum, 'CENTRIFUGALAIRFOIL', INDETERMINATE) -tubeaxial = express_getattr(IfcFanTypeEnum, 'TUBEAXIAL', INDETERMINATE) -vaneaxial = express_getattr(IfcFanTypeEnum, 'VANEAXIAL', INDETERMINATE) -propelloraxial = express_getattr(IfcFanTypeEnum, 'PROPELLORAXIAL', INDETERMINATE) -userdefined = express_getattr(IfcFanTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFanTypeEnum, 'NOTDEFINED', INDETERMINATE) +centrifugalforwardcurved = IfcFanTypeEnum.CENTRIFUGALFORWARDCURVED +centrifugalradial = IfcFanTypeEnum.CENTRIFUGALRADIAL +centrifugalbackwardinclinedcurved = IfcFanTypeEnum.CENTRIFUGALBACKWARDINCLINEDCURVED +centrifugalairfoil = IfcFanTypeEnum.CENTRIFUGALAIRFOIL +tubeaxial = IfcFanTypeEnum.TUBEAXIAL +vaneaxial = IfcFanTypeEnum.VANEAXIAL +propelloraxial = IfcFanTypeEnum.PROPELLORAXIAL +userdefined = IfcFanTypeEnum.USERDEFINED +notdefined = IfcFanTypeEnum.NOTDEFINED IfcFastenerTypeEnum = enum_namespace() -glue = express_getattr(IfcFastenerTypeEnum, 'GLUE', INDETERMINATE) -mortar = express_getattr(IfcFastenerTypeEnum, 'MORTAR', INDETERMINATE) -weld = express_getattr(IfcFastenerTypeEnum, 'WELD', INDETERMINATE) -userdefined = express_getattr(IfcFastenerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFastenerTypeEnum, 'NOTDEFINED', INDETERMINATE) +glue = IfcFastenerTypeEnum.GLUE +mortar = IfcFastenerTypeEnum.MORTAR +weld = IfcFastenerTypeEnum.WELD +userdefined = IfcFastenerTypeEnum.USERDEFINED +notdefined = IfcFastenerTypeEnum.NOTDEFINED IfcFilterTypeEnum = enum_namespace() -airparticlefilter = express_getattr(IfcFilterTypeEnum, 'AIRPARTICLEFILTER', INDETERMINATE) -compressedairfilter = express_getattr(IfcFilterTypeEnum, 'COMPRESSEDAIRFILTER', INDETERMINATE) -odorfilter = express_getattr(IfcFilterTypeEnum, 'ODORFILTER', INDETERMINATE) -oilfilter = express_getattr(IfcFilterTypeEnum, 'OILFILTER', INDETERMINATE) -strainer = express_getattr(IfcFilterTypeEnum, 'STRAINER', INDETERMINATE) -waterfilter = express_getattr(IfcFilterTypeEnum, 'WATERFILTER', INDETERMINATE) -userdefined = express_getattr(IfcFilterTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFilterTypeEnum, 'NOTDEFINED', INDETERMINATE) +airparticlefilter = IfcFilterTypeEnum.AIRPARTICLEFILTER +compressedairfilter = IfcFilterTypeEnum.COMPRESSEDAIRFILTER +odorfilter = IfcFilterTypeEnum.ODORFILTER +oilfilter = IfcFilterTypeEnum.OILFILTER +strainer = IfcFilterTypeEnum.STRAINER +waterfilter = IfcFilterTypeEnum.WATERFILTER +userdefined = IfcFilterTypeEnum.USERDEFINED +notdefined = IfcFilterTypeEnum.NOTDEFINED IfcFireSuppressionTerminalTypeEnum = enum_namespace() -breechinginlet = express_getattr(IfcFireSuppressionTerminalTypeEnum, 'BREECHINGINLET', INDETERMINATE) -firehydrant = express_getattr(IfcFireSuppressionTerminalTypeEnum, 'FIREHYDRANT', INDETERMINATE) -hosereel = express_getattr(IfcFireSuppressionTerminalTypeEnum, 'HOSEREEL', INDETERMINATE) -sprinkler = express_getattr(IfcFireSuppressionTerminalTypeEnum, 'SPRINKLER', INDETERMINATE) -sprinklerdeflector = express_getattr(IfcFireSuppressionTerminalTypeEnum, 'SPRINKLERDEFLECTOR', INDETERMINATE) -firemonitor = express_getattr(IfcFireSuppressionTerminalTypeEnum, 'FIREMONITOR', INDETERMINATE) -userdefined = express_getattr(IfcFireSuppressionTerminalTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFireSuppressionTerminalTypeEnum, 'NOTDEFINED', INDETERMINATE) +breechinginlet = IfcFireSuppressionTerminalTypeEnum.BREECHINGINLET +firehydrant = IfcFireSuppressionTerminalTypeEnum.FIREHYDRANT +hosereel = IfcFireSuppressionTerminalTypeEnum.HOSEREEL +sprinkler = IfcFireSuppressionTerminalTypeEnum.SPRINKLER +sprinklerdeflector = IfcFireSuppressionTerminalTypeEnum.SPRINKLERDEFLECTOR +firemonitor = IfcFireSuppressionTerminalTypeEnum.FIREMONITOR +userdefined = IfcFireSuppressionTerminalTypeEnum.USERDEFINED +notdefined = IfcFireSuppressionTerminalTypeEnum.NOTDEFINED IfcFlowDirectionEnum = enum_namespace() -source = express_getattr(IfcFlowDirectionEnum, 'SOURCE', INDETERMINATE) -sink = express_getattr(IfcFlowDirectionEnum, 'SINK', INDETERMINATE) -sourceandsink = express_getattr(IfcFlowDirectionEnum, 'SOURCEANDSINK', INDETERMINATE) -notdefined = express_getattr(IfcFlowDirectionEnum, 'NOTDEFINED', INDETERMINATE) +source = IfcFlowDirectionEnum.SOURCE +sink = IfcFlowDirectionEnum.SINK +sourceandsink = IfcFlowDirectionEnum.SOURCEANDSINK +notdefined = IfcFlowDirectionEnum.NOTDEFINED IfcFlowInstrumentTypeEnum = enum_namespace() -pressuregauge = express_getattr(IfcFlowInstrumentTypeEnum, 'PRESSUREGAUGE', INDETERMINATE) -thermometer = express_getattr(IfcFlowInstrumentTypeEnum, 'THERMOMETER', INDETERMINATE) -ammeter = express_getattr(IfcFlowInstrumentTypeEnum, 'AMMETER', INDETERMINATE) -frequencymeter = express_getattr(IfcFlowInstrumentTypeEnum, 'FREQUENCYMETER', INDETERMINATE) -powerfactormeter = express_getattr(IfcFlowInstrumentTypeEnum, 'POWERFACTORMETER', INDETERMINATE) -phaseanglemeter = express_getattr(IfcFlowInstrumentTypeEnum, 'PHASEANGLEMETER', INDETERMINATE) -voltmeter_peak = express_getattr(IfcFlowInstrumentTypeEnum, 'VOLTMETER_PEAK', INDETERMINATE) -voltmeter_rms = express_getattr(IfcFlowInstrumentTypeEnum, 'VOLTMETER_RMS', INDETERMINATE) -combined = express_getattr(IfcFlowInstrumentTypeEnum, 'COMBINED', INDETERMINATE) -voltmeter = express_getattr(IfcFlowInstrumentTypeEnum, 'VOLTMETER', INDETERMINATE) -userdefined = express_getattr(IfcFlowInstrumentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFlowInstrumentTypeEnum, 'NOTDEFINED', INDETERMINATE) +pressuregauge = IfcFlowInstrumentTypeEnum.PRESSUREGAUGE +thermometer = IfcFlowInstrumentTypeEnum.THERMOMETER +ammeter = IfcFlowInstrumentTypeEnum.AMMETER +frequencymeter = IfcFlowInstrumentTypeEnum.FREQUENCYMETER +powerfactormeter = IfcFlowInstrumentTypeEnum.POWERFACTORMETER +phaseanglemeter = IfcFlowInstrumentTypeEnum.PHASEANGLEMETER +voltmeter_peak = IfcFlowInstrumentTypeEnum.VOLTMETER_PEAK +voltmeter_rms = IfcFlowInstrumentTypeEnum.VOLTMETER_RMS +combined = IfcFlowInstrumentTypeEnum.COMBINED +voltmeter = IfcFlowInstrumentTypeEnum.VOLTMETER +userdefined = IfcFlowInstrumentTypeEnum.USERDEFINED +notdefined = IfcFlowInstrumentTypeEnum.NOTDEFINED IfcFlowMeterTypeEnum = enum_namespace() -energymeter = express_getattr(IfcFlowMeterTypeEnum, 'ENERGYMETER', INDETERMINATE) -gasmeter = express_getattr(IfcFlowMeterTypeEnum, 'GASMETER', INDETERMINATE) -oilmeter = express_getattr(IfcFlowMeterTypeEnum, 'OILMETER', INDETERMINATE) -watermeter = express_getattr(IfcFlowMeterTypeEnum, 'WATERMETER', INDETERMINATE) -userdefined = express_getattr(IfcFlowMeterTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFlowMeterTypeEnum, 'NOTDEFINED', INDETERMINATE) +energymeter = IfcFlowMeterTypeEnum.ENERGYMETER +gasmeter = IfcFlowMeterTypeEnum.GASMETER +oilmeter = IfcFlowMeterTypeEnum.OILMETER +watermeter = IfcFlowMeterTypeEnum.WATERMETER +userdefined = IfcFlowMeterTypeEnum.USERDEFINED +notdefined = IfcFlowMeterTypeEnum.NOTDEFINED IfcFootingTypeEnum = enum_namespace() -caisson_foundation = express_getattr(IfcFootingTypeEnum, 'CAISSON_FOUNDATION', INDETERMINATE) -footing_beam = express_getattr(IfcFootingTypeEnum, 'FOOTING_BEAM', INDETERMINATE) -pad_footing = express_getattr(IfcFootingTypeEnum, 'PAD_FOOTING', INDETERMINATE) -pile_cap = express_getattr(IfcFootingTypeEnum, 'PILE_CAP', INDETERMINATE) -strip_footing = express_getattr(IfcFootingTypeEnum, 'STRIP_FOOTING', INDETERMINATE) -userdefined = express_getattr(IfcFootingTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFootingTypeEnum, 'NOTDEFINED', INDETERMINATE) +caisson_foundation = IfcFootingTypeEnum.CAISSON_FOUNDATION +footing_beam = IfcFootingTypeEnum.FOOTING_BEAM +pad_footing = IfcFootingTypeEnum.PAD_FOOTING +pile_cap = IfcFootingTypeEnum.PILE_CAP +strip_footing = IfcFootingTypeEnum.STRIP_FOOTING +userdefined = IfcFootingTypeEnum.USERDEFINED +notdefined = IfcFootingTypeEnum.NOTDEFINED IfcFurnitureTypeEnum = enum_namespace() -chair = express_getattr(IfcFurnitureTypeEnum, 'CHAIR', INDETERMINATE) -table = express_getattr(IfcFurnitureTypeEnum, 'TABLE', INDETERMINATE) -desk = express_getattr(IfcFurnitureTypeEnum, 'DESK', INDETERMINATE) -bed = express_getattr(IfcFurnitureTypeEnum, 'BED', INDETERMINATE) -filecabinet = express_getattr(IfcFurnitureTypeEnum, 'FILECABINET', INDETERMINATE) -shelf = express_getattr(IfcFurnitureTypeEnum, 'SHELF', INDETERMINATE) -sofa = express_getattr(IfcFurnitureTypeEnum, 'SOFA', INDETERMINATE) -technicalcabinet = express_getattr(IfcFurnitureTypeEnum, 'TECHNICALCABINET', INDETERMINATE) -userdefined = express_getattr(IfcFurnitureTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFurnitureTypeEnum, 'NOTDEFINED', INDETERMINATE) +chair = IfcFurnitureTypeEnum.CHAIR +table = IfcFurnitureTypeEnum.TABLE +desk = IfcFurnitureTypeEnum.DESK +bed = IfcFurnitureTypeEnum.BED +filecabinet = IfcFurnitureTypeEnum.FILECABINET +shelf = IfcFurnitureTypeEnum.SHELF +sofa = IfcFurnitureTypeEnum.SOFA +technicalcabinet = IfcFurnitureTypeEnum.TECHNICALCABINET +userdefined = IfcFurnitureTypeEnum.USERDEFINED +notdefined = IfcFurnitureTypeEnum.NOTDEFINED IfcGeographicElementTypeEnum = enum_namespace() -terrain = express_getattr(IfcGeographicElementTypeEnum, 'TERRAIN', INDETERMINATE) -soil_boring_point = express_getattr(IfcGeographicElementTypeEnum, 'SOIL_BORING_POINT', INDETERMINATE) -userdefined = express_getattr(IfcGeographicElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcGeographicElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +terrain = IfcGeographicElementTypeEnum.TERRAIN +soil_boring_point = IfcGeographicElementTypeEnum.SOIL_BORING_POINT +userdefined = IfcGeographicElementTypeEnum.USERDEFINED +notdefined = IfcGeographicElementTypeEnum.NOTDEFINED IfcGeometricProjectionEnum = enum_namespace() -graph_view = express_getattr(IfcGeometricProjectionEnum, 'GRAPH_VIEW', INDETERMINATE) -sketch_view = express_getattr(IfcGeometricProjectionEnum, 'SKETCH_VIEW', INDETERMINATE) -model_view = express_getattr(IfcGeometricProjectionEnum, 'MODEL_VIEW', INDETERMINATE) -plan_view = express_getattr(IfcGeometricProjectionEnum, 'PLAN_VIEW', INDETERMINATE) -reflected_plan_view = express_getattr(IfcGeometricProjectionEnum, 'REFLECTED_PLAN_VIEW', INDETERMINATE) -section_view = express_getattr(IfcGeometricProjectionEnum, 'SECTION_VIEW', INDETERMINATE) -elevation_view = express_getattr(IfcGeometricProjectionEnum, 'ELEVATION_VIEW', INDETERMINATE) -userdefined = express_getattr(IfcGeometricProjectionEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcGeometricProjectionEnum, 'NOTDEFINED', INDETERMINATE) +graph_view = IfcGeometricProjectionEnum.GRAPH_VIEW +sketch_view = IfcGeometricProjectionEnum.SKETCH_VIEW +model_view = IfcGeometricProjectionEnum.MODEL_VIEW +plan_view = IfcGeometricProjectionEnum.PLAN_VIEW +reflected_plan_view = IfcGeometricProjectionEnum.REFLECTED_PLAN_VIEW +section_view = IfcGeometricProjectionEnum.SECTION_VIEW +elevation_view = IfcGeometricProjectionEnum.ELEVATION_VIEW +userdefined = IfcGeometricProjectionEnum.USERDEFINED +notdefined = IfcGeometricProjectionEnum.NOTDEFINED IfcGlobalOrLocalEnum = enum_namespace() -global_coords = express_getattr(IfcGlobalOrLocalEnum, 'GLOBAL_COORDS', INDETERMINATE) -local_coords = express_getattr(IfcGlobalOrLocalEnum, 'LOCAL_COORDS', INDETERMINATE) +global_coords = IfcGlobalOrLocalEnum.GLOBAL_COORDS +local_coords = IfcGlobalOrLocalEnum.LOCAL_COORDS IfcGridTypeEnum = enum_namespace() -rectangular = express_getattr(IfcGridTypeEnum, 'RECTANGULAR', INDETERMINATE) -radial = express_getattr(IfcGridTypeEnum, 'RADIAL', INDETERMINATE) -triangular = express_getattr(IfcGridTypeEnum, 'TRIANGULAR', INDETERMINATE) -irregular = express_getattr(IfcGridTypeEnum, 'IRREGULAR', INDETERMINATE) -userdefined = express_getattr(IfcGridTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcGridTypeEnum, 'NOTDEFINED', INDETERMINATE) +rectangular = IfcGridTypeEnum.RECTANGULAR +radial = IfcGridTypeEnum.RADIAL +triangular = IfcGridTypeEnum.TRIANGULAR +irregular = IfcGridTypeEnum.IRREGULAR +userdefined = IfcGridTypeEnum.USERDEFINED +notdefined = IfcGridTypeEnum.NOTDEFINED IfcHeatExchangerTypeEnum = enum_namespace() -plate = express_getattr(IfcHeatExchangerTypeEnum, 'PLATE', INDETERMINATE) -shellandtube = express_getattr(IfcHeatExchangerTypeEnum, 'SHELLANDTUBE', INDETERMINATE) -turnoutheating = express_getattr(IfcHeatExchangerTypeEnum, 'TURNOUTHEATING', INDETERMINATE) -userdefined = express_getattr(IfcHeatExchangerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcHeatExchangerTypeEnum, 'NOTDEFINED', INDETERMINATE) +plate = IfcHeatExchangerTypeEnum.PLATE +shellandtube = IfcHeatExchangerTypeEnum.SHELLANDTUBE +turnoutheating = IfcHeatExchangerTypeEnum.TURNOUTHEATING +userdefined = IfcHeatExchangerTypeEnum.USERDEFINED +notdefined = IfcHeatExchangerTypeEnum.NOTDEFINED IfcHumidifierTypeEnum = enum_namespace() -steaminjection = express_getattr(IfcHumidifierTypeEnum, 'STEAMINJECTION', INDETERMINATE) -adiabaticairwasher = express_getattr(IfcHumidifierTypeEnum, 'ADIABATICAIRWASHER', INDETERMINATE) -adiabaticpan = express_getattr(IfcHumidifierTypeEnum, 'ADIABATICPAN', INDETERMINATE) -adiabaticwettedelement = express_getattr(IfcHumidifierTypeEnum, 'ADIABATICWETTEDELEMENT', INDETERMINATE) -adiabaticatomizing = express_getattr(IfcHumidifierTypeEnum, 'ADIABATICATOMIZING', INDETERMINATE) -adiabaticultrasonic = express_getattr(IfcHumidifierTypeEnum, 'ADIABATICULTRASONIC', INDETERMINATE) -adiabaticrigidmedia = express_getattr(IfcHumidifierTypeEnum, 'ADIABATICRIGIDMEDIA', INDETERMINATE) -adiabaticcompressedairnozzle = express_getattr(IfcHumidifierTypeEnum, 'ADIABATICCOMPRESSEDAIRNOZZLE', INDETERMINATE) -assistedelectric = express_getattr(IfcHumidifierTypeEnum, 'ASSISTEDELECTRIC', INDETERMINATE) -assistednaturalgas = express_getattr(IfcHumidifierTypeEnum, 'ASSISTEDNATURALGAS', INDETERMINATE) -assistedpropane = express_getattr(IfcHumidifierTypeEnum, 'ASSISTEDPROPANE', INDETERMINATE) -assistedbutane = express_getattr(IfcHumidifierTypeEnum, 'ASSISTEDBUTANE', INDETERMINATE) -assistedsteam = express_getattr(IfcHumidifierTypeEnum, 'ASSISTEDSTEAM', INDETERMINATE) -userdefined = express_getattr(IfcHumidifierTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcHumidifierTypeEnum, 'NOTDEFINED', INDETERMINATE) +steaminjection = IfcHumidifierTypeEnum.STEAMINJECTION +adiabaticairwasher = IfcHumidifierTypeEnum.ADIABATICAIRWASHER +adiabaticpan = IfcHumidifierTypeEnum.ADIABATICPAN +adiabaticwettedelement = IfcHumidifierTypeEnum.ADIABATICWETTEDELEMENT +adiabaticatomizing = IfcHumidifierTypeEnum.ADIABATICATOMIZING +adiabaticultrasonic = IfcHumidifierTypeEnum.ADIABATICULTRASONIC +adiabaticrigidmedia = IfcHumidifierTypeEnum.ADIABATICRIGIDMEDIA +adiabaticcompressedairnozzle = IfcHumidifierTypeEnum.ADIABATICCOMPRESSEDAIRNOZZLE +assistedelectric = IfcHumidifierTypeEnum.ASSISTEDELECTRIC +assistednaturalgas = IfcHumidifierTypeEnum.ASSISTEDNATURALGAS +assistedpropane = IfcHumidifierTypeEnum.ASSISTEDPROPANE +assistedbutane = IfcHumidifierTypeEnum.ASSISTEDBUTANE +assistedsteam = IfcHumidifierTypeEnum.ASSISTEDSTEAM +userdefined = IfcHumidifierTypeEnum.USERDEFINED +notdefined = IfcHumidifierTypeEnum.NOTDEFINED IfcImpactProtectionDeviceTypeEnum = enum_namespace() -crashcushion = express_getattr(IfcImpactProtectionDeviceTypeEnum, 'CRASHCUSHION', INDETERMINATE) -dampingsystem = express_getattr(IfcImpactProtectionDeviceTypeEnum, 'DAMPINGSYSTEM', INDETERMINATE) -fender = express_getattr(IfcImpactProtectionDeviceTypeEnum, 'FENDER', INDETERMINATE) -bumper = express_getattr(IfcImpactProtectionDeviceTypeEnum, 'BUMPER', INDETERMINATE) -userdefined = express_getattr(IfcImpactProtectionDeviceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcImpactProtectionDeviceTypeEnum, 'NOTDEFINED', INDETERMINATE) +crashcushion = IfcImpactProtectionDeviceTypeEnum.CRASHCUSHION +dampingsystem = IfcImpactProtectionDeviceTypeEnum.DAMPINGSYSTEM +fender = IfcImpactProtectionDeviceTypeEnum.FENDER +bumper = IfcImpactProtectionDeviceTypeEnum.BUMPER +userdefined = IfcImpactProtectionDeviceTypeEnum.USERDEFINED +notdefined = IfcImpactProtectionDeviceTypeEnum.NOTDEFINED IfcInterceptorTypeEnum = enum_namespace() -cyclonic = express_getattr(IfcInterceptorTypeEnum, 'CYCLONIC', INDETERMINATE) -grease = express_getattr(IfcInterceptorTypeEnum, 'GREASE', INDETERMINATE) -oil = express_getattr(IfcInterceptorTypeEnum, 'OIL', INDETERMINATE) -petrol = express_getattr(IfcInterceptorTypeEnum, 'PETROL', INDETERMINATE) -userdefined = express_getattr(IfcInterceptorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcInterceptorTypeEnum, 'NOTDEFINED', INDETERMINATE) +cyclonic = IfcInterceptorTypeEnum.CYCLONIC +grease = IfcInterceptorTypeEnum.GREASE +oil = IfcInterceptorTypeEnum.OIL +petrol = IfcInterceptorTypeEnum.PETROL +userdefined = IfcInterceptorTypeEnum.USERDEFINED +notdefined = IfcInterceptorTypeEnum.NOTDEFINED IfcInternalOrExternalEnum = enum_namespace() -internal = express_getattr(IfcInternalOrExternalEnum, 'INTERNAL', INDETERMINATE) -external = express_getattr(IfcInternalOrExternalEnum, 'EXTERNAL', INDETERMINATE) -external_earth = express_getattr(IfcInternalOrExternalEnum, 'EXTERNAL_EARTH', INDETERMINATE) -external_water = express_getattr(IfcInternalOrExternalEnum, 'EXTERNAL_WATER', INDETERMINATE) -external_fire = express_getattr(IfcInternalOrExternalEnum, 'EXTERNAL_FIRE', INDETERMINATE) -notdefined = express_getattr(IfcInternalOrExternalEnum, 'NOTDEFINED', INDETERMINATE) +internal = IfcInternalOrExternalEnum.INTERNAL +external = IfcInternalOrExternalEnum.EXTERNAL +external_earth = IfcInternalOrExternalEnum.EXTERNAL_EARTH +external_water = IfcInternalOrExternalEnum.EXTERNAL_WATER +external_fire = IfcInternalOrExternalEnum.EXTERNAL_FIRE +notdefined = IfcInternalOrExternalEnum.NOTDEFINED IfcInventoryTypeEnum = enum_namespace() -assetinventory = express_getattr(IfcInventoryTypeEnum, 'ASSETINVENTORY', INDETERMINATE) -spaceinventory = express_getattr(IfcInventoryTypeEnum, 'SPACEINVENTORY', INDETERMINATE) -furnitureinventory = express_getattr(IfcInventoryTypeEnum, 'FURNITUREINVENTORY', INDETERMINATE) -userdefined = express_getattr(IfcInventoryTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcInventoryTypeEnum, 'NOTDEFINED', INDETERMINATE) +assetinventory = IfcInventoryTypeEnum.ASSETINVENTORY +spaceinventory = IfcInventoryTypeEnum.SPACEINVENTORY +furnitureinventory = IfcInventoryTypeEnum.FURNITUREINVENTORY +userdefined = IfcInventoryTypeEnum.USERDEFINED +notdefined = IfcInventoryTypeEnum.NOTDEFINED IfcJunctionBoxTypeEnum = enum_namespace() -data = express_getattr(IfcJunctionBoxTypeEnum, 'DATA', INDETERMINATE) -power = express_getattr(IfcJunctionBoxTypeEnum, 'POWER', INDETERMINATE) -userdefined = express_getattr(IfcJunctionBoxTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcJunctionBoxTypeEnum, 'NOTDEFINED', INDETERMINATE) +data = IfcJunctionBoxTypeEnum.DATA +power = IfcJunctionBoxTypeEnum.POWER +userdefined = IfcJunctionBoxTypeEnum.USERDEFINED +notdefined = IfcJunctionBoxTypeEnum.NOTDEFINED IfcKnotType = enum_namespace() -uniform_knots = express_getattr(IfcKnotType, 'UNIFORM_KNOTS', INDETERMINATE) -quasi_uniform_knots = express_getattr(IfcKnotType, 'QUASI_UNIFORM_KNOTS', INDETERMINATE) -piecewise_bezier_knots = express_getattr(IfcKnotType, 'PIECEWISE_BEZIER_KNOTS', INDETERMINATE) -unspecified = express_getattr(IfcKnotType, 'UNSPECIFIED', INDETERMINATE) +uniform_knots = IfcKnotType.UNIFORM_KNOTS +quasi_uniform_knots = IfcKnotType.QUASI_UNIFORM_KNOTS +piecewise_bezier_knots = IfcKnotType.PIECEWISE_BEZIER_KNOTS +unspecified = IfcKnotType.UNSPECIFIED IfcLaborResourceTypeEnum = enum_namespace() -administration = express_getattr(IfcLaborResourceTypeEnum, 'ADMINISTRATION', INDETERMINATE) -carpentry = express_getattr(IfcLaborResourceTypeEnum, 'CARPENTRY', INDETERMINATE) -cleaning = express_getattr(IfcLaborResourceTypeEnum, 'CLEANING', INDETERMINATE) -concrete = express_getattr(IfcLaborResourceTypeEnum, 'CONCRETE', INDETERMINATE) -drywall = express_getattr(IfcLaborResourceTypeEnum, 'DRYWALL', INDETERMINATE) -electric = express_getattr(IfcLaborResourceTypeEnum, 'ELECTRIC', INDETERMINATE) -finishing = express_getattr(IfcLaborResourceTypeEnum, 'FINISHING', INDETERMINATE) -flooring = express_getattr(IfcLaborResourceTypeEnum, 'FLOORING', INDETERMINATE) -general = express_getattr(IfcLaborResourceTypeEnum, 'GENERAL', INDETERMINATE) -hvac = express_getattr(IfcLaborResourceTypeEnum, 'HVAC', INDETERMINATE) -landscaping = express_getattr(IfcLaborResourceTypeEnum, 'LANDSCAPING', INDETERMINATE) -masonry = express_getattr(IfcLaborResourceTypeEnum, 'MASONRY', INDETERMINATE) -painting = express_getattr(IfcLaborResourceTypeEnum, 'PAINTING', INDETERMINATE) -paving = express_getattr(IfcLaborResourceTypeEnum, 'PAVING', INDETERMINATE) -plumbing = express_getattr(IfcLaborResourceTypeEnum, 'PLUMBING', INDETERMINATE) -roofing = express_getattr(IfcLaborResourceTypeEnum, 'ROOFING', INDETERMINATE) -sitegrading = express_getattr(IfcLaborResourceTypeEnum, 'SITEGRADING', INDETERMINATE) -steelwork = express_getattr(IfcLaborResourceTypeEnum, 'STEELWORK', INDETERMINATE) -surveying = express_getattr(IfcLaborResourceTypeEnum, 'SURVEYING', INDETERMINATE) -userdefined = express_getattr(IfcLaborResourceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcLaborResourceTypeEnum, 'NOTDEFINED', INDETERMINATE) +administration = IfcLaborResourceTypeEnum.ADMINISTRATION +carpentry = IfcLaborResourceTypeEnum.CARPENTRY +cleaning = IfcLaborResourceTypeEnum.CLEANING +concrete = IfcLaborResourceTypeEnum.CONCRETE +drywall = IfcLaborResourceTypeEnum.DRYWALL +electric = IfcLaborResourceTypeEnum.ELECTRIC +finishing = IfcLaborResourceTypeEnum.FINISHING +flooring = IfcLaborResourceTypeEnum.FLOORING +general = IfcLaborResourceTypeEnum.GENERAL +hvac = IfcLaborResourceTypeEnum.HVAC +landscaping = IfcLaborResourceTypeEnum.LANDSCAPING +masonry = IfcLaborResourceTypeEnum.MASONRY +painting = IfcLaborResourceTypeEnum.PAINTING +paving = IfcLaborResourceTypeEnum.PAVING +plumbing = IfcLaborResourceTypeEnum.PLUMBING +roofing = IfcLaborResourceTypeEnum.ROOFING +sitegrading = IfcLaborResourceTypeEnum.SITEGRADING +steelwork = IfcLaborResourceTypeEnum.STEELWORK +surveying = IfcLaborResourceTypeEnum.SURVEYING +userdefined = IfcLaborResourceTypeEnum.USERDEFINED +notdefined = IfcLaborResourceTypeEnum.NOTDEFINED IfcLampTypeEnum = enum_namespace() -compactfluorescent = express_getattr(IfcLampTypeEnum, 'COMPACTFLUORESCENT', INDETERMINATE) -fluorescent = express_getattr(IfcLampTypeEnum, 'FLUORESCENT', INDETERMINATE) -halogen = express_getattr(IfcLampTypeEnum, 'HALOGEN', INDETERMINATE) -highpressuremercury = express_getattr(IfcLampTypeEnum, 'HIGHPRESSUREMERCURY', INDETERMINATE) -highpressuresodium = express_getattr(IfcLampTypeEnum, 'HIGHPRESSURESODIUM', INDETERMINATE) -led = express_getattr(IfcLampTypeEnum, 'LED', INDETERMINATE) -metalhalide = express_getattr(IfcLampTypeEnum, 'METALHALIDE', INDETERMINATE) -oled = express_getattr(IfcLampTypeEnum, 'OLED', INDETERMINATE) -tungstenfilament = express_getattr(IfcLampTypeEnum, 'TUNGSTENFILAMENT', INDETERMINATE) -userdefined = express_getattr(IfcLampTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcLampTypeEnum, 'NOTDEFINED', INDETERMINATE) +compactfluorescent = IfcLampTypeEnum.COMPACTFLUORESCENT +fluorescent = IfcLampTypeEnum.FLUORESCENT +halogen = IfcLampTypeEnum.HALOGEN +highpressuremercury = IfcLampTypeEnum.HIGHPRESSUREMERCURY +highpressuresodium = IfcLampTypeEnum.HIGHPRESSURESODIUM +led = IfcLampTypeEnum.LED +metalhalide = IfcLampTypeEnum.METALHALIDE +oled = IfcLampTypeEnum.OLED +tungstenfilament = IfcLampTypeEnum.TUNGSTENFILAMENT +userdefined = IfcLampTypeEnum.USERDEFINED +notdefined = IfcLampTypeEnum.NOTDEFINED IfcLayerSetDirectionEnum = enum_namespace() -axis1 = express_getattr(IfcLayerSetDirectionEnum, 'AXIS1', INDETERMINATE) -axis2 = express_getattr(IfcLayerSetDirectionEnum, 'AXIS2', INDETERMINATE) -axis3 = express_getattr(IfcLayerSetDirectionEnum, 'AXIS3', INDETERMINATE) +axis1 = IfcLayerSetDirectionEnum.AXIS1 +axis2 = IfcLayerSetDirectionEnum.AXIS2 +axis3 = IfcLayerSetDirectionEnum.AXIS3 IfcLightDistributionCurveEnum = enum_namespace() -type_a = express_getattr(IfcLightDistributionCurveEnum, 'TYPE_A', INDETERMINATE) -type_b = express_getattr(IfcLightDistributionCurveEnum, 'TYPE_B', INDETERMINATE) -type_c = express_getattr(IfcLightDistributionCurveEnum, 'TYPE_C', INDETERMINATE) -notdefined = express_getattr(IfcLightDistributionCurveEnum, 'NOTDEFINED', INDETERMINATE) +type_a = IfcLightDistributionCurveEnum.TYPE_A +type_b = IfcLightDistributionCurveEnum.TYPE_B +type_c = IfcLightDistributionCurveEnum.TYPE_C +notdefined = IfcLightDistributionCurveEnum.NOTDEFINED IfcLightEmissionSourceEnum = enum_namespace() -compactfluorescent = express_getattr(IfcLightEmissionSourceEnum, 'COMPACTFLUORESCENT', INDETERMINATE) -fluorescent = express_getattr(IfcLightEmissionSourceEnum, 'FLUORESCENT', INDETERMINATE) -highpressuremercury = express_getattr(IfcLightEmissionSourceEnum, 'HIGHPRESSUREMERCURY', INDETERMINATE) -highpressuresodium = express_getattr(IfcLightEmissionSourceEnum, 'HIGHPRESSURESODIUM', INDETERMINATE) -lightemittingdiode = express_getattr(IfcLightEmissionSourceEnum, 'LIGHTEMITTINGDIODE', INDETERMINATE) -lowpressuresodium = express_getattr(IfcLightEmissionSourceEnum, 'LOWPRESSURESODIUM', INDETERMINATE) -lowvoltagehalogen = express_getattr(IfcLightEmissionSourceEnum, 'LOWVOLTAGEHALOGEN', INDETERMINATE) -mainvoltagehalogen = express_getattr(IfcLightEmissionSourceEnum, 'MAINVOLTAGEHALOGEN', INDETERMINATE) -metalhalide = express_getattr(IfcLightEmissionSourceEnum, 'METALHALIDE', INDETERMINATE) -tungstenfilament = express_getattr(IfcLightEmissionSourceEnum, 'TUNGSTENFILAMENT', INDETERMINATE) -notdefined = express_getattr(IfcLightEmissionSourceEnum, 'NOTDEFINED', INDETERMINATE) +compactfluorescent = IfcLightEmissionSourceEnum.COMPACTFLUORESCENT +fluorescent = IfcLightEmissionSourceEnum.FLUORESCENT +highpressuremercury = IfcLightEmissionSourceEnum.HIGHPRESSUREMERCURY +highpressuresodium = IfcLightEmissionSourceEnum.HIGHPRESSURESODIUM +lightemittingdiode = IfcLightEmissionSourceEnum.LIGHTEMITTINGDIODE +lowpressuresodium = IfcLightEmissionSourceEnum.LOWPRESSURESODIUM +lowvoltagehalogen = IfcLightEmissionSourceEnum.LOWVOLTAGEHALOGEN +mainvoltagehalogen = IfcLightEmissionSourceEnum.MAINVOLTAGEHALOGEN +metalhalide = IfcLightEmissionSourceEnum.METALHALIDE +tungstenfilament = IfcLightEmissionSourceEnum.TUNGSTENFILAMENT +notdefined = IfcLightEmissionSourceEnum.NOTDEFINED IfcLightFixtureTypeEnum = enum_namespace() -pointsource = express_getattr(IfcLightFixtureTypeEnum, 'POINTSOURCE', INDETERMINATE) -directionsource = express_getattr(IfcLightFixtureTypeEnum, 'DIRECTIONSOURCE', INDETERMINATE) -securitylighting = express_getattr(IfcLightFixtureTypeEnum, 'SECURITYLIGHTING', INDETERMINATE) -userdefined = express_getattr(IfcLightFixtureTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcLightFixtureTypeEnum, 'NOTDEFINED', INDETERMINATE) +pointsource = IfcLightFixtureTypeEnum.POINTSOURCE +directionsource = IfcLightFixtureTypeEnum.DIRECTIONSOURCE +securitylighting = IfcLightFixtureTypeEnum.SECURITYLIGHTING +userdefined = IfcLightFixtureTypeEnum.USERDEFINED +notdefined = IfcLightFixtureTypeEnum.NOTDEFINED IfcLiquidTerminalTypeEnum = enum_namespace() -loadingarm = express_getattr(IfcLiquidTerminalTypeEnum, 'LOADINGARM', INDETERMINATE) -hosereel = express_getattr(IfcLiquidTerminalTypeEnum, 'HOSEREEL', INDETERMINATE) -userdefined = express_getattr(IfcLiquidTerminalTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcLiquidTerminalTypeEnum, 'NOTDEFINED', INDETERMINATE) +loadingarm = IfcLiquidTerminalTypeEnum.LOADINGARM +hosereel = IfcLiquidTerminalTypeEnum.HOSEREEL +userdefined = IfcLiquidTerminalTypeEnum.USERDEFINED +notdefined = IfcLiquidTerminalTypeEnum.NOTDEFINED IfcLoadGroupTypeEnum = enum_namespace() -load_group = express_getattr(IfcLoadGroupTypeEnum, 'LOAD_GROUP', INDETERMINATE) -load_case = express_getattr(IfcLoadGroupTypeEnum, 'LOAD_CASE', INDETERMINATE) -load_combination = express_getattr(IfcLoadGroupTypeEnum, 'LOAD_COMBINATION', INDETERMINATE) -userdefined = express_getattr(IfcLoadGroupTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcLoadGroupTypeEnum, 'NOTDEFINED', INDETERMINATE) +load_group = IfcLoadGroupTypeEnum.LOAD_GROUP +load_case = IfcLoadGroupTypeEnum.LOAD_CASE +load_combination = IfcLoadGroupTypeEnum.LOAD_COMBINATION +userdefined = IfcLoadGroupTypeEnum.USERDEFINED +notdefined = IfcLoadGroupTypeEnum.NOTDEFINED IfcLogicalOperatorEnum = enum_namespace() -logicaland = express_getattr(IfcLogicalOperatorEnum, 'LOGICALAND', INDETERMINATE) -logicalor = express_getattr(IfcLogicalOperatorEnum, 'LOGICALOR', INDETERMINATE) -logicalxor = express_getattr(IfcLogicalOperatorEnum, 'LOGICALXOR', INDETERMINATE) -logicalnotand = express_getattr(IfcLogicalOperatorEnum, 'LOGICALNOTAND', INDETERMINATE) -logicalnotor = express_getattr(IfcLogicalOperatorEnum, 'LOGICALNOTOR', INDETERMINATE) +logicaland = IfcLogicalOperatorEnum.LOGICALAND +logicalor = IfcLogicalOperatorEnum.LOGICALOR +logicalxor = IfcLogicalOperatorEnum.LOGICALXOR +logicalnotand = IfcLogicalOperatorEnum.LOGICALNOTAND +logicalnotor = IfcLogicalOperatorEnum.LOGICALNOTOR IfcMarineFacilityTypeEnum = enum_namespace() -canal = express_getattr(IfcMarineFacilityTypeEnum, 'CANAL', INDETERMINATE) -waterwayshiplift = express_getattr(IfcMarineFacilityTypeEnum, 'WATERWAYSHIPLIFT', INDETERMINATE) -revetment = express_getattr(IfcMarineFacilityTypeEnum, 'REVETMENT', INDETERMINATE) -launchrecovery = express_getattr(IfcMarineFacilityTypeEnum, 'LAUNCHRECOVERY', INDETERMINATE) -marinedefence = express_getattr(IfcMarineFacilityTypeEnum, 'MARINEDEFENCE', INDETERMINATE) -hydrolift = express_getattr(IfcMarineFacilityTypeEnum, 'HYDROLIFT', INDETERMINATE) -shipyard = express_getattr(IfcMarineFacilityTypeEnum, 'SHIPYARD', INDETERMINATE) -shiplift = express_getattr(IfcMarineFacilityTypeEnum, 'SHIPLIFT', INDETERMINATE) -port = express_getattr(IfcMarineFacilityTypeEnum, 'PORT', INDETERMINATE) -quay = express_getattr(IfcMarineFacilityTypeEnum, 'QUAY', INDETERMINATE) -floatingdock = express_getattr(IfcMarineFacilityTypeEnum, 'FLOATINGDOCK', INDETERMINATE) -navigationalchannel = express_getattr(IfcMarineFacilityTypeEnum, 'NAVIGATIONALCHANNEL', INDETERMINATE) -breakwater = express_getattr(IfcMarineFacilityTypeEnum, 'BREAKWATER', INDETERMINATE) -drydock = express_getattr(IfcMarineFacilityTypeEnum, 'DRYDOCK', INDETERMINATE) -jetty = express_getattr(IfcMarineFacilityTypeEnum, 'JETTY', INDETERMINATE) -shiplock = express_getattr(IfcMarineFacilityTypeEnum, 'SHIPLOCK', INDETERMINATE) -barrierbeach = express_getattr(IfcMarineFacilityTypeEnum, 'BARRIERBEACH', INDETERMINATE) -slipway = express_getattr(IfcMarineFacilityTypeEnum, 'SLIPWAY', INDETERMINATE) -waterway = express_getattr(IfcMarineFacilityTypeEnum, 'WATERWAY', INDETERMINATE) -userdefined = express_getattr(IfcMarineFacilityTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcMarineFacilityTypeEnum, 'NOTDEFINED', INDETERMINATE) +canal = IfcMarineFacilityTypeEnum.CANAL +waterwayshiplift = IfcMarineFacilityTypeEnum.WATERWAYSHIPLIFT +revetment = IfcMarineFacilityTypeEnum.REVETMENT +launchrecovery = IfcMarineFacilityTypeEnum.LAUNCHRECOVERY +marinedefence = IfcMarineFacilityTypeEnum.MARINEDEFENCE +hydrolift = IfcMarineFacilityTypeEnum.HYDROLIFT +shipyard = IfcMarineFacilityTypeEnum.SHIPYARD +shiplift = IfcMarineFacilityTypeEnum.SHIPLIFT +port = IfcMarineFacilityTypeEnum.PORT +quay = IfcMarineFacilityTypeEnum.QUAY +floatingdock = IfcMarineFacilityTypeEnum.FLOATINGDOCK +navigationalchannel = IfcMarineFacilityTypeEnum.NAVIGATIONALCHANNEL +breakwater = IfcMarineFacilityTypeEnum.BREAKWATER +drydock = IfcMarineFacilityTypeEnum.DRYDOCK +jetty = IfcMarineFacilityTypeEnum.JETTY +shiplock = IfcMarineFacilityTypeEnum.SHIPLOCK +barrierbeach = IfcMarineFacilityTypeEnum.BARRIERBEACH +slipway = IfcMarineFacilityTypeEnum.SLIPWAY +waterway = IfcMarineFacilityTypeEnum.WATERWAY +userdefined = IfcMarineFacilityTypeEnum.USERDEFINED +notdefined = IfcMarineFacilityTypeEnum.NOTDEFINED IfcMarinePartTypeEnum = enum_namespace() -crest = express_getattr(IfcMarinePartTypeEnum, 'CREST', INDETERMINATE) -manufacturing = express_getattr(IfcMarinePartTypeEnum, 'MANUFACTURING', INDETERMINATE) -lowwaterline = express_getattr(IfcMarinePartTypeEnum, 'LOWWATERLINE', INDETERMINATE) -core = express_getattr(IfcMarinePartTypeEnum, 'CORE', INDETERMINATE) -waterfield = express_getattr(IfcMarinePartTypeEnum, 'WATERFIELD', INDETERMINATE) -cill_level = express_getattr(IfcMarinePartTypeEnum, 'CILL_LEVEL', INDETERMINATE) -berthingstructure = express_getattr(IfcMarinePartTypeEnum, 'BERTHINGSTRUCTURE', INDETERMINATE) -copelevel = express_getattr(IfcMarinePartTypeEnum, 'COPELEVEL', INDETERMINATE) -chamber = express_getattr(IfcMarinePartTypeEnum, 'CHAMBER', INDETERMINATE) -storagearea = express_getattr(IfcMarinePartTypeEnum, 'STORAGEAREA', INDETERMINATE) -approachchannel = express_getattr(IfcMarinePartTypeEnum, 'APPROACHCHANNEL', INDETERMINATE) -vehicleservicing = express_getattr(IfcMarinePartTypeEnum, 'VEHICLESERVICING', INDETERMINATE) -shiptransfer = express_getattr(IfcMarinePartTypeEnum, 'SHIPTRANSFER', INDETERMINATE) -gatehead = express_getattr(IfcMarinePartTypeEnum, 'GATEHEAD', INDETERMINATE) -gudingstructure = express_getattr(IfcMarinePartTypeEnum, 'GUDINGSTRUCTURE', INDETERMINATE) -belowwaterline = express_getattr(IfcMarinePartTypeEnum, 'BELOWWATERLINE', INDETERMINATE) -weatherside = express_getattr(IfcMarinePartTypeEnum, 'WEATHERSIDE', INDETERMINATE) -landfield = express_getattr(IfcMarinePartTypeEnum, 'LANDFIELD', INDETERMINATE) -protection = express_getattr(IfcMarinePartTypeEnum, 'PROTECTION', INDETERMINATE) -leewardside = express_getattr(IfcMarinePartTypeEnum, 'LEEWARDSIDE', INDETERMINATE) -abovewaterline = express_getattr(IfcMarinePartTypeEnum, 'ABOVEWATERLINE', INDETERMINATE) -anchorage = express_getattr(IfcMarinePartTypeEnum, 'ANCHORAGE', INDETERMINATE) -navigationalarea = express_getattr(IfcMarinePartTypeEnum, 'NAVIGATIONALAREA', INDETERMINATE) -highwaterline = express_getattr(IfcMarinePartTypeEnum, 'HIGHWATERLINE', INDETERMINATE) -userdefined = express_getattr(IfcMarinePartTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcMarinePartTypeEnum, 'NOTDEFINED', INDETERMINATE) +crest = IfcMarinePartTypeEnum.CREST +manufacturing = IfcMarinePartTypeEnum.MANUFACTURING +lowwaterline = IfcMarinePartTypeEnum.LOWWATERLINE +core = IfcMarinePartTypeEnum.CORE +waterfield = IfcMarinePartTypeEnum.WATERFIELD +cill_level = IfcMarinePartTypeEnum.CILL_LEVEL +berthingstructure = IfcMarinePartTypeEnum.BERTHINGSTRUCTURE +copelevel = IfcMarinePartTypeEnum.COPELEVEL +chamber = IfcMarinePartTypeEnum.CHAMBER +storagearea = IfcMarinePartTypeEnum.STORAGEAREA +approachchannel = IfcMarinePartTypeEnum.APPROACHCHANNEL +vehicleservicing = IfcMarinePartTypeEnum.VEHICLESERVICING +shiptransfer = IfcMarinePartTypeEnum.SHIPTRANSFER +gatehead = IfcMarinePartTypeEnum.GATEHEAD +gudingstructure = IfcMarinePartTypeEnum.GUDINGSTRUCTURE +belowwaterline = IfcMarinePartTypeEnum.BELOWWATERLINE +weatherside = IfcMarinePartTypeEnum.WEATHERSIDE +landfield = IfcMarinePartTypeEnum.LANDFIELD +protection = IfcMarinePartTypeEnum.PROTECTION +leewardside = IfcMarinePartTypeEnum.LEEWARDSIDE +abovewaterline = IfcMarinePartTypeEnum.ABOVEWATERLINE +anchorage = IfcMarinePartTypeEnum.ANCHORAGE +navigationalarea = IfcMarinePartTypeEnum.NAVIGATIONALAREA +highwaterline = IfcMarinePartTypeEnum.HIGHWATERLINE +userdefined = IfcMarinePartTypeEnum.USERDEFINED +notdefined = IfcMarinePartTypeEnum.NOTDEFINED IfcMechanicalFastenerTypeEnum = enum_namespace() -anchorbolt = express_getattr(IfcMechanicalFastenerTypeEnum, 'ANCHORBOLT', INDETERMINATE) -bolt = express_getattr(IfcMechanicalFastenerTypeEnum, 'BOLT', INDETERMINATE) -dowel = express_getattr(IfcMechanicalFastenerTypeEnum, 'DOWEL', INDETERMINATE) -nail = express_getattr(IfcMechanicalFastenerTypeEnum, 'NAIL', INDETERMINATE) -nailplate = express_getattr(IfcMechanicalFastenerTypeEnum, 'NAILPLATE', INDETERMINATE) -rivet = express_getattr(IfcMechanicalFastenerTypeEnum, 'RIVET', INDETERMINATE) -screw = express_getattr(IfcMechanicalFastenerTypeEnum, 'SCREW', INDETERMINATE) -shearconnector = express_getattr(IfcMechanicalFastenerTypeEnum, 'SHEARCONNECTOR', INDETERMINATE) -staple = express_getattr(IfcMechanicalFastenerTypeEnum, 'STAPLE', INDETERMINATE) -studshearconnector = express_getattr(IfcMechanicalFastenerTypeEnum, 'STUDSHEARCONNECTOR', INDETERMINATE) -coupler = express_getattr(IfcMechanicalFastenerTypeEnum, 'COUPLER', INDETERMINATE) -railjoint = express_getattr(IfcMechanicalFastenerTypeEnum, 'RAILJOINT', INDETERMINATE) -railfastening = express_getattr(IfcMechanicalFastenerTypeEnum, 'RAILFASTENING', INDETERMINATE) -chain = express_getattr(IfcMechanicalFastenerTypeEnum, 'CHAIN', INDETERMINATE) -rope = express_getattr(IfcMechanicalFastenerTypeEnum, 'ROPE', INDETERMINATE) -userdefined = express_getattr(IfcMechanicalFastenerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcMechanicalFastenerTypeEnum, 'NOTDEFINED', INDETERMINATE) +anchorbolt = IfcMechanicalFastenerTypeEnum.ANCHORBOLT +bolt = IfcMechanicalFastenerTypeEnum.BOLT +dowel = IfcMechanicalFastenerTypeEnum.DOWEL +nail = IfcMechanicalFastenerTypeEnum.NAIL +nailplate = IfcMechanicalFastenerTypeEnum.NAILPLATE +rivet = IfcMechanicalFastenerTypeEnum.RIVET +screw = IfcMechanicalFastenerTypeEnum.SCREW +shearconnector = IfcMechanicalFastenerTypeEnum.SHEARCONNECTOR +staple = IfcMechanicalFastenerTypeEnum.STAPLE +studshearconnector = IfcMechanicalFastenerTypeEnum.STUDSHEARCONNECTOR +coupler = IfcMechanicalFastenerTypeEnum.COUPLER +railjoint = IfcMechanicalFastenerTypeEnum.RAILJOINT +railfastening = IfcMechanicalFastenerTypeEnum.RAILFASTENING +chain = IfcMechanicalFastenerTypeEnum.CHAIN +rope = IfcMechanicalFastenerTypeEnum.ROPE +userdefined = IfcMechanicalFastenerTypeEnum.USERDEFINED +notdefined = IfcMechanicalFastenerTypeEnum.NOTDEFINED IfcMedicalDeviceTypeEnum = enum_namespace() -airstation = express_getattr(IfcMedicalDeviceTypeEnum, 'AIRSTATION', INDETERMINATE) -feedairunit = express_getattr(IfcMedicalDeviceTypeEnum, 'FEEDAIRUNIT', INDETERMINATE) -oxygengenerator = express_getattr(IfcMedicalDeviceTypeEnum, 'OXYGENGENERATOR', INDETERMINATE) -oxygenplant = express_getattr(IfcMedicalDeviceTypeEnum, 'OXYGENPLANT', INDETERMINATE) -vacuumstation = express_getattr(IfcMedicalDeviceTypeEnum, 'VACUUMSTATION', INDETERMINATE) -userdefined = express_getattr(IfcMedicalDeviceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcMedicalDeviceTypeEnum, 'NOTDEFINED', INDETERMINATE) +airstation = IfcMedicalDeviceTypeEnum.AIRSTATION +feedairunit = IfcMedicalDeviceTypeEnum.FEEDAIRUNIT +oxygengenerator = IfcMedicalDeviceTypeEnum.OXYGENGENERATOR +oxygenplant = IfcMedicalDeviceTypeEnum.OXYGENPLANT +vacuumstation = IfcMedicalDeviceTypeEnum.VACUUMSTATION +userdefined = IfcMedicalDeviceTypeEnum.USERDEFINED +notdefined = IfcMedicalDeviceTypeEnum.NOTDEFINED IfcMemberTypeEnum = enum_namespace() -brace = express_getattr(IfcMemberTypeEnum, 'BRACE', INDETERMINATE) -chord = express_getattr(IfcMemberTypeEnum, 'CHORD', INDETERMINATE) -collar = express_getattr(IfcMemberTypeEnum, 'COLLAR', INDETERMINATE) -member = express_getattr(IfcMemberTypeEnum, 'MEMBER', INDETERMINATE) -mullion = express_getattr(IfcMemberTypeEnum, 'MULLION', INDETERMINATE) -plate = express_getattr(IfcMemberTypeEnum, 'PLATE', INDETERMINATE) -post = express_getattr(IfcMemberTypeEnum, 'POST', INDETERMINATE) -purlin = express_getattr(IfcMemberTypeEnum, 'PURLIN', INDETERMINATE) -rafter = express_getattr(IfcMemberTypeEnum, 'RAFTER', INDETERMINATE) -stringer = express_getattr(IfcMemberTypeEnum, 'STRINGER', INDETERMINATE) -strut = express_getattr(IfcMemberTypeEnum, 'STRUT', INDETERMINATE) -stud = express_getattr(IfcMemberTypeEnum, 'STUD', INDETERMINATE) -stiffening_rib = express_getattr(IfcMemberTypeEnum, 'STIFFENING_RIB', INDETERMINATE) -arch_segment = express_getattr(IfcMemberTypeEnum, 'ARCH_SEGMENT', INDETERMINATE) -suspension_cable = express_getattr(IfcMemberTypeEnum, 'SUSPENSION_CABLE', INDETERMINATE) -suspender = express_getattr(IfcMemberTypeEnum, 'SUSPENDER', INDETERMINATE) -stay_cable = express_getattr(IfcMemberTypeEnum, 'STAY_CABLE', INDETERMINATE) -structuralcable = express_getattr(IfcMemberTypeEnum, 'STRUCTURALCABLE', INDETERMINATE) -tiebar = express_getattr(IfcMemberTypeEnum, 'TIEBAR', INDETERMINATE) -userdefined = express_getattr(IfcMemberTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcMemberTypeEnum, 'NOTDEFINED', INDETERMINATE) +brace = IfcMemberTypeEnum.BRACE +chord = IfcMemberTypeEnum.CHORD +collar = IfcMemberTypeEnum.COLLAR +member = IfcMemberTypeEnum.MEMBER +mullion = IfcMemberTypeEnum.MULLION +plate = IfcMemberTypeEnum.PLATE +post = IfcMemberTypeEnum.POST +purlin = IfcMemberTypeEnum.PURLIN +rafter = IfcMemberTypeEnum.RAFTER +stringer = IfcMemberTypeEnum.STRINGER +strut = IfcMemberTypeEnum.STRUT +stud = IfcMemberTypeEnum.STUD +stiffening_rib = IfcMemberTypeEnum.STIFFENING_RIB +arch_segment = IfcMemberTypeEnum.ARCH_SEGMENT +suspension_cable = IfcMemberTypeEnum.SUSPENSION_CABLE +suspender = IfcMemberTypeEnum.SUSPENDER +stay_cable = IfcMemberTypeEnum.STAY_CABLE +structuralcable = IfcMemberTypeEnum.STRUCTURALCABLE +tiebar = IfcMemberTypeEnum.TIEBAR +userdefined = IfcMemberTypeEnum.USERDEFINED +notdefined = IfcMemberTypeEnum.NOTDEFINED IfcMobileTelecommunicationsApplianceTypeEnum = enum_namespace() -e_utran_node_b = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'E_UTRAN_NODE_B', INDETERMINATE) -remoteradiounit = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'REMOTERADIOUNIT', INDETERMINATE) -accesspoint = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'ACCESSPOINT', INDETERMINATE) -basetransceiverstation = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'BASETRANSCEIVERSTATION', INDETERMINATE) -remoteunit = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'REMOTEUNIT', INDETERMINATE) -basebandunit = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'BASEBANDUNIT', INDETERMINATE) -masterunit = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'MASTERUNIT', INDETERMINATE) -gateway_gprs_support_node = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'GATEWAY_GPRS_SUPPORT_NODE', INDETERMINATE) -subscriberserver = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'SUBSCRIBERSERVER', INDETERMINATE) -mobileswitchingcenter = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'MOBILESWITCHINGCENTER', INDETERMINATE) -mscserver = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'MSCSERVER', INDETERMINATE) -packetcontrolunit = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'PACKETCONTROLUNIT', INDETERMINATE) -service_gprs_support_node = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'SERVICE_GPRS_SUPPORT_NODE', INDETERMINATE) -userdefined = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'NOTDEFINED', INDETERMINATE) +e_utran_node_b = IfcMobileTelecommunicationsApplianceTypeEnum.E_UTRAN_NODE_B +remoteradiounit = IfcMobileTelecommunicationsApplianceTypeEnum.REMOTERADIOUNIT +accesspoint = IfcMobileTelecommunicationsApplianceTypeEnum.ACCESSPOINT +basetransceiverstation = IfcMobileTelecommunicationsApplianceTypeEnum.BASETRANSCEIVERSTATION +remoteunit = IfcMobileTelecommunicationsApplianceTypeEnum.REMOTEUNIT +basebandunit = IfcMobileTelecommunicationsApplianceTypeEnum.BASEBANDUNIT +masterunit = IfcMobileTelecommunicationsApplianceTypeEnum.MASTERUNIT +gateway_gprs_support_node = IfcMobileTelecommunicationsApplianceTypeEnum.GATEWAY_GPRS_SUPPORT_NODE +subscriberserver = IfcMobileTelecommunicationsApplianceTypeEnum.SUBSCRIBERSERVER +mobileswitchingcenter = IfcMobileTelecommunicationsApplianceTypeEnum.MOBILESWITCHINGCENTER +mscserver = IfcMobileTelecommunicationsApplianceTypeEnum.MSCSERVER +packetcontrolunit = IfcMobileTelecommunicationsApplianceTypeEnum.PACKETCONTROLUNIT +service_gprs_support_node = IfcMobileTelecommunicationsApplianceTypeEnum.SERVICE_GPRS_SUPPORT_NODE +userdefined = IfcMobileTelecommunicationsApplianceTypeEnum.USERDEFINED +notdefined = IfcMobileTelecommunicationsApplianceTypeEnum.NOTDEFINED IfcMooringDeviceTypeEnum = enum_namespace() -linetensioner = express_getattr(IfcMooringDeviceTypeEnum, 'LINETENSIONER', INDETERMINATE) -magneticdevice = express_getattr(IfcMooringDeviceTypeEnum, 'MAGNETICDEVICE', INDETERMINATE) -mooringhooks = express_getattr(IfcMooringDeviceTypeEnum, 'MOORINGHOOKS', INDETERMINATE) -vacuumdevice = express_getattr(IfcMooringDeviceTypeEnum, 'VACUUMDEVICE', INDETERMINATE) -bollard = express_getattr(IfcMooringDeviceTypeEnum, 'BOLLARD', INDETERMINATE) -userdefined = express_getattr(IfcMooringDeviceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcMooringDeviceTypeEnum, 'NOTDEFINED', INDETERMINATE) +linetensioner = IfcMooringDeviceTypeEnum.LINETENSIONER +magneticdevice = IfcMooringDeviceTypeEnum.MAGNETICDEVICE +mooringhooks = IfcMooringDeviceTypeEnum.MOORINGHOOKS +vacuumdevice = IfcMooringDeviceTypeEnum.VACUUMDEVICE +bollard = IfcMooringDeviceTypeEnum.BOLLARD +userdefined = IfcMooringDeviceTypeEnum.USERDEFINED +notdefined = IfcMooringDeviceTypeEnum.NOTDEFINED IfcMotorConnectionTypeEnum = enum_namespace() -beltdrive = express_getattr(IfcMotorConnectionTypeEnum, 'BELTDRIVE', INDETERMINATE) -coupling = express_getattr(IfcMotorConnectionTypeEnum, 'COUPLING', INDETERMINATE) -directdrive = express_getattr(IfcMotorConnectionTypeEnum, 'DIRECTDRIVE', INDETERMINATE) -userdefined = express_getattr(IfcMotorConnectionTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcMotorConnectionTypeEnum, 'NOTDEFINED', INDETERMINATE) +beltdrive = IfcMotorConnectionTypeEnum.BELTDRIVE +coupling = IfcMotorConnectionTypeEnum.COUPLING +directdrive = IfcMotorConnectionTypeEnum.DIRECTDRIVE +userdefined = IfcMotorConnectionTypeEnum.USERDEFINED +notdefined = IfcMotorConnectionTypeEnum.NOTDEFINED IfcNavigationElementTypeEnum = enum_namespace() -beacon = express_getattr(IfcNavigationElementTypeEnum, 'BEACON', INDETERMINATE) -buoy = express_getattr(IfcNavigationElementTypeEnum, 'BUOY', INDETERMINATE) -userdefined = express_getattr(IfcNavigationElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcNavigationElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +beacon = IfcNavigationElementTypeEnum.BEACON +buoy = IfcNavigationElementTypeEnum.BUOY +userdefined = IfcNavigationElementTypeEnum.USERDEFINED +notdefined = IfcNavigationElementTypeEnum.NOTDEFINED IfcObjectTypeEnum = enum_namespace() -product = express_getattr(IfcObjectTypeEnum, 'PRODUCT', INDETERMINATE) -process = express_getattr(IfcObjectTypeEnum, 'PROCESS', INDETERMINATE) -control = express_getattr(IfcObjectTypeEnum, 'CONTROL', INDETERMINATE) -resource = express_getattr(IfcObjectTypeEnum, 'RESOURCE', INDETERMINATE) -actor = express_getattr(IfcObjectTypeEnum, 'ACTOR', INDETERMINATE) -group = express_getattr(IfcObjectTypeEnum, 'GROUP', INDETERMINATE) -project = express_getattr(IfcObjectTypeEnum, 'PROJECT', INDETERMINATE) -notdefined = express_getattr(IfcObjectTypeEnum, 'NOTDEFINED', INDETERMINATE) +product = IfcObjectTypeEnum.PRODUCT +process = IfcObjectTypeEnum.PROCESS +control = IfcObjectTypeEnum.CONTROL +resource = IfcObjectTypeEnum.RESOURCE +actor = IfcObjectTypeEnum.ACTOR +group = IfcObjectTypeEnum.GROUP +project = IfcObjectTypeEnum.PROJECT +notdefined = IfcObjectTypeEnum.NOTDEFINED IfcObjectiveEnum = enum_namespace() -codecompliance = express_getattr(IfcObjectiveEnum, 'CODECOMPLIANCE', INDETERMINATE) -codewaiver = express_getattr(IfcObjectiveEnum, 'CODEWAIVER', INDETERMINATE) -designintent = express_getattr(IfcObjectiveEnum, 'DESIGNINTENT', INDETERMINATE) -external = express_getattr(IfcObjectiveEnum, 'EXTERNAL', INDETERMINATE) -healthandsafety = express_getattr(IfcObjectiveEnum, 'HEALTHANDSAFETY', INDETERMINATE) -mergeconflict = express_getattr(IfcObjectiveEnum, 'MERGECONFLICT', INDETERMINATE) -modelview = express_getattr(IfcObjectiveEnum, 'MODELVIEW', INDETERMINATE) -parameter = express_getattr(IfcObjectiveEnum, 'PARAMETER', INDETERMINATE) -requirement = express_getattr(IfcObjectiveEnum, 'REQUIREMENT', INDETERMINATE) -specification = express_getattr(IfcObjectiveEnum, 'SPECIFICATION', INDETERMINATE) -triggercondition = express_getattr(IfcObjectiveEnum, 'TRIGGERCONDITION', INDETERMINATE) -userdefined = express_getattr(IfcObjectiveEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcObjectiveEnum, 'NOTDEFINED', INDETERMINATE) +codecompliance = IfcObjectiveEnum.CODECOMPLIANCE +codewaiver = IfcObjectiveEnum.CODEWAIVER +designintent = IfcObjectiveEnum.DESIGNINTENT +external = IfcObjectiveEnum.EXTERNAL +healthandsafety = IfcObjectiveEnum.HEALTHANDSAFETY +mergeconflict = IfcObjectiveEnum.MERGECONFLICT +modelview = IfcObjectiveEnum.MODELVIEW +parameter = IfcObjectiveEnum.PARAMETER +requirement = IfcObjectiveEnum.REQUIREMENT +specification = IfcObjectiveEnum.SPECIFICATION +triggercondition = IfcObjectiveEnum.TRIGGERCONDITION +userdefined = IfcObjectiveEnum.USERDEFINED +notdefined = IfcObjectiveEnum.NOTDEFINED IfcOccupantTypeEnum = enum_namespace() -assignee = express_getattr(IfcOccupantTypeEnum, 'ASSIGNEE', INDETERMINATE) -assignor = express_getattr(IfcOccupantTypeEnum, 'ASSIGNOR', INDETERMINATE) -lessee = express_getattr(IfcOccupantTypeEnum, 'LESSEE', INDETERMINATE) -lessor = express_getattr(IfcOccupantTypeEnum, 'LESSOR', INDETERMINATE) -lettingagent = express_getattr(IfcOccupantTypeEnum, 'LETTINGAGENT', INDETERMINATE) -owner = express_getattr(IfcOccupantTypeEnum, 'OWNER', INDETERMINATE) -tenant = express_getattr(IfcOccupantTypeEnum, 'TENANT', INDETERMINATE) -userdefined = express_getattr(IfcOccupantTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcOccupantTypeEnum, 'NOTDEFINED', INDETERMINATE) +assignee = IfcOccupantTypeEnum.ASSIGNEE +assignor = IfcOccupantTypeEnum.ASSIGNOR +lessee = IfcOccupantTypeEnum.LESSEE +lessor = IfcOccupantTypeEnum.LESSOR +lettingagent = IfcOccupantTypeEnum.LETTINGAGENT +owner = IfcOccupantTypeEnum.OWNER +tenant = IfcOccupantTypeEnum.TENANT +userdefined = IfcOccupantTypeEnum.USERDEFINED +notdefined = IfcOccupantTypeEnum.NOTDEFINED IfcOpeningElementTypeEnum = enum_namespace() -opening = express_getattr(IfcOpeningElementTypeEnum, 'OPENING', INDETERMINATE) -recess = express_getattr(IfcOpeningElementTypeEnum, 'RECESS', INDETERMINATE) -userdefined = express_getattr(IfcOpeningElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcOpeningElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +opening = IfcOpeningElementTypeEnum.OPENING +recess = IfcOpeningElementTypeEnum.RECESS +userdefined = IfcOpeningElementTypeEnum.USERDEFINED +notdefined = IfcOpeningElementTypeEnum.NOTDEFINED IfcOutletTypeEnum = enum_namespace() -audiovisualoutlet = express_getattr(IfcOutletTypeEnum, 'AUDIOVISUALOUTLET', INDETERMINATE) -communicationsoutlet = express_getattr(IfcOutletTypeEnum, 'COMMUNICATIONSOUTLET', INDETERMINATE) -poweroutlet = express_getattr(IfcOutletTypeEnum, 'POWEROUTLET', INDETERMINATE) -dataoutlet = express_getattr(IfcOutletTypeEnum, 'DATAOUTLET', INDETERMINATE) -telephoneoutlet = express_getattr(IfcOutletTypeEnum, 'TELEPHONEOUTLET', INDETERMINATE) -userdefined = express_getattr(IfcOutletTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcOutletTypeEnum, 'NOTDEFINED', INDETERMINATE) +audiovisualoutlet = IfcOutletTypeEnum.AUDIOVISUALOUTLET +communicationsoutlet = IfcOutletTypeEnum.COMMUNICATIONSOUTLET +poweroutlet = IfcOutletTypeEnum.POWEROUTLET +dataoutlet = IfcOutletTypeEnum.DATAOUTLET +telephoneoutlet = IfcOutletTypeEnum.TELEPHONEOUTLET +userdefined = IfcOutletTypeEnum.USERDEFINED +notdefined = IfcOutletTypeEnum.NOTDEFINED IfcPavementTypeEnum = enum_namespace() -flexible = express_getattr(IfcPavementTypeEnum, 'FLEXIBLE', INDETERMINATE) -rigid = express_getattr(IfcPavementTypeEnum, 'RIGID', INDETERMINATE) -userdefined = express_getattr(IfcPavementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPavementTypeEnum, 'NOTDEFINED', INDETERMINATE) +flexible = IfcPavementTypeEnum.FLEXIBLE +rigid = IfcPavementTypeEnum.RIGID +userdefined = IfcPavementTypeEnum.USERDEFINED +notdefined = IfcPavementTypeEnum.NOTDEFINED IfcPerformanceHistoryTypeEnum = enum_namespace() -userdefined = express_getattr(IfcPerformanceHistoryTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPerformanceHistoryTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcPerformanceHistoryTypeEnum.USERDEFINED +notdefined = IfcPerformanceHistoryTypeEnum.NOTDEFINED IfcPermeableCoveringOperationEnum = enum_namespace() -grill = express_getattr(IfcPermeableCoveringOperationEnum, 'GRILL', INDETERMINATE) -louver = express_getattr(IfcPermeableCoveringOperationEnum, 'LOUVER', INDETERMINATE) -screen = express_getattr(IfcPermeableCoveringOperationEnum, 'SCREEN', INDETERMINATE) -userdefined = express_getattr(IfcPermeableCoveringOperationEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPermeableCoveringOperationEnum, 'NOTDEFINED', INDETERMINATE) +grill = IfcPermeableCoveringOperationEnum.GRILL +louver = IfcPermeableCoveringOperationEnum.LOUVER +screen = IfcPermeableCoveringOperationEnum.SCREEN +userdefined = IfcPermeableCoveringOperationEnum.USERDEFINED +notdefined = IfcPermeableCoveringOperationEnum.NOTDEFINED IfcPermitTypeEnum = enum_namespace() -access = express_getattr(IfcPermitTypeEnum, 'ACCESS', INDETERMINATE) -building = express_getattr(IfcPermitTypeEnum, 'BUILDING', INDETERMINATE) -work = express_getattr(IfcPermitTypeEnum, 'WORK', INDETERMINATE) -userdefined = express_getattr(IfcPermitTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPermitTypeEnum, 'NOTDEFINED', INDETERMINATE) +access = IfcPermitTypeEnum.ACCESS +building = IfcPermitTypeEnum.BUILDING +work = IfcPermitTypeEnum.WORK +userdefined = IfcPermitTypeEnum.USERDEFINED +notdefined = IfcPermitTypeEnum.NOTDEFINED IfcPhysicalOrVirtualEnum = enum_namespace() -physical = express_getattr(IfcPhysicalOrVirtualEnum, 'PHYSICAL', INDETERMINATE) -virtual = express_getattr(IfcPhysicalOrVirtualEnum, 'VIRTUAL', INDETERMINATE) -notdefined = express_getattr(IfcPhysicalOrVirtualEnum, 'NOTDEFINED', INDETERMINATE) +physical = IfcPhysicalOrVirtualEnum.PHYSICAL +virtual = IfcPhysicalOrVirtualEnum.VIRTUAL +notdefined = IfcPhysicalOrVirtualEnum.NOTDEFINED IfcPileConstructionEnum = enum_namespace() -cast_in_place = express_getattr(IfcPileConstructionEnum, 'CAST_IN_PLACE', INDETERMINATE) -composite = express_getattr(IfcPileConstructionEnum, 'COMPOSITE', INDETERMINATE) -precast_concrete = express_getattr(IfcPileConstructionEnum, 'PRECAST_CONCRETE', INDETERMINATE) -prefab_steel = express_getattr(IfcPileConstructionEnum, 'PREFAB_STEEL', INDETERMINATE) -userdefined = express_getattr(IfcPileConstructionEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPileConstructionEnum, 'NOTDEFINED', INDETERMINATE) +cast_in_place = IfcPileConstructionEnum.CAST_IN_PLACE +composite = IfcPileConstructionEnum.COMPOSITE +precast_concrete = IfcPileConstructionEnum.PRECAST_CONCRETE +prefab_steel = IfcPileConstructionEnum.PREFAB_STEEL +userdefined = IfcPileConstructionEnum.USERDEFINED +notdefined = IfcPileConstructionEnum.NOTDEFINED IfcPileTypeEnum = enum_namespace() -bored = express_getattr(IfcPileTypeEnum, 'BORED', INDETERMINATE) -driven = express_getattr(IfcPileTypeEnum, 'DRIVEN', INDETERMINATE) -jetgrouting = express_getattr(IfcPileTypeEnum, 'JETGROUTING', INDETERMINATE) -cohesion = express_getattr(IfcPileTypeEnum, 'COHESION', INDETERMINATE) -friction = express_getattr(IfcPileTypeEnum, 'FRICTION', INDETERMINATE) -support = express_getattr(IfcPileTypeEnum, 'SUPPORT', INDETERMINATE) -userdefined = express_getattr(IfcPileTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPileTypeEnum, 'NOTDEFINED', INDETERMINATE) +bored = IfcPileTypeEnum.BORED +driven = IfcPileTypeEnum.DRIVEN +jetgrouting = IfcPileTypeEnum.JETGROUTING +cohesion = IfcPileTypeEnum.COHESION +friction = IfcPileTypeEnum.FRICTION +support = IfcPileTypeEnum.SUPPORT +userdefined = IfcPileTypeEnum.USERDEFINED +notdefined = IfcPileTypeEnum.NOTDEFINED IfcPipeFittingTypeEnum = enum_namespace() -bend = express_getattr(IfcPipeFittingTypeEnum, 'BEND', INDETERMINATE) -connector = express_getattr(IfcPipeFittingTypeEnum, 'CONNECTOR', INDETERMINATE) -entry = express_getattr(IfcPipeFittingTypeEnum, 'ENTRY', INDETERMINATE) -exit = express_getattr(IfcPipeFittingTypeEnum, 'EXIT', INDETERMINATE) -junction = express_getattr(IfcPipeFittingTypeEnum, 'JUNCTION', INDETERMINATE) -obstruction = express_getattr(IfcPipeFittingTypeEnum, 'OBSTRUCTION', INDETERMINATE) -transition = express_getattr(IfcPipeFittingTypeEnum, 'TRANSITION', INDETERMINATE) -userdefined = express_getattr(IfcPipeFittingTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPipeFittingTypeEnum, 'NOTDEFINED', INDETERMINATE) +bend = IfcPipeFittingTypeEnum.BEND +connector = IfcPipeFittingTypeEnum.CONNECTOR +entry = IfcPipeFittingTypeEnum.ENTRY +exit = IfcPipeFittingTypeEnum.EXIT +junction = IfcPipeFittingTypeEnum.JUNCTION +obstruction = IfcPipeFittingTypeEnum.OBSTRUCTION +transition = IfcPipeFittingTypeEnum.TRANSITION +userdefined = IfcPipeFittingTypeEnum.USERDEFINED +notdefined = IfcPipeFittingTypeEnum.NOTDEFINED IfcPipeSegmentTypeEnum = enum_namespace() -culvert = express_getattr(IfcPipeSegmentTypeEnum, 'CULVERT', INDETERMINATE) -flexiblesegment = express_getattr(IfcPipeSegmentTypeEnum, 'FLEXIBLESEGMENT', INDETERMINATE) -rigidsegment = express_getattr(IfcPipeSegmentTypeEnum, 'RIGIDSEGMENT', INDETERMINATE) -gutter = express_getattr(IfcPipeSegmentTypeEnum, 'GUTTER', INDETERMINATE) -spool = express_getattr(IfcPipeSegmentTypeEnum, 'SPOOL', INDETERMINATE) -userdefined = express_getattr(IfcPipeSegmentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPipeSegmentTypeEnum, 'NOTDEFINED', INDETERMINATE) +culvert = IfcPipeSegmentTypeEnum.CULVERT +flexiblesegment = IfcPipeSegmentTypeEnum.FLEXIBLESEGMENT +rigidsegment = IfcPipeSegmentTypeEnum.RIGIDSEGMENT +gutter = IfcPipeSegmentTypeEnum.GUTTER +spool = IfcPipeSegmentTypeEnum.SPOOL +userdefined = IfcPipeSegmentTypeEnum.USERDEFINED +notdefined = IfcPipeSegmentTypeEnum.NOTDEFINED IfcPlateTypeEnum = enum_namespace() -curtain_panel = express_getattr(IfcPlateTypeEnum, 'CURTAIN_PANEL', INDETERMINATE) -sheet = express_getattr(IfcPlateTypeEnum, 'SHEET', INDETERMINATE) -flange_plate = express_getattr(IfcPlateTypeEnum, 'FLANGE_PLATE', INDETERMINATE) -web_plate = express_getattr(IfcPlateTypeEnum, 'WEB_PLATE', INDETERMINATE) -stiffener_plate = express_getattr(IfcPlateTypeEnum, 'STIFFENER_PLATE', INDETERMINATE) -gusset_plate = express_getattr(IfcPlateTypeEnum, 'GUSSET_PLATE', INDETERMINATE) -cover_plate = express_getattr(IfcPlateTypeEnum, 'COVER_PLATE', INDETERMINATE) -splice_plate = express_getattr(IfcPlateTypeEnum, 'SPLICE_PLATE', INDETERMINATE) -base_plate = express_getattr(IfcPlateTypeEnum, 'BASE_PLATE', INDETERMINATE) -userdefined = express_getattr(IfcPlateTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPlateTypeEnum, 'NOTDEFINED', INDETERMINATE) +curtain_panel = IfcPlateTypeEnum.CURTAIN_PANEL +sheet = IfcPlateTypeEnum.SHEET +flange_plate = IfcPlateTypeEnum.FLANGE_PLATE +web_plate = IfcPlateTypeEnum.WEB_PLATE +stiffener_plate = IfcPlateTypeEnum.STIFFENER_PLATE +gusset_plate = IfcPlateTypeEnum.GUSSET_PLATE +cover_plate = IfcPlateTypeEnum.COVER_PLATE +splice_plate = IfcPlateTypeEnum.SPLICE_PLATE +base_plate = IfcPlateTypeEnum.BASE_PLATE +userdefined = IfcPlateTypeEnum.USERDEFINED +notdefined = IfcPlateTypeEnum.NOTDEFINED IfcPreferredSurfaceCurveRepresentation = enum_namespace() -curve3d = express_getattr(IfcPreferredSurfaceCurveRepresentation, 'CURVE3D', INDETERMINATE) -pcurve_s1 = express_getattr(IfcPreferredSurfaceCurveRepresentation, 'PCURVE_S1', INDETERMINATE) -pcurve_s2 = express_getattr(IfcPreferredSurfaceCurveRepresentation, 'PCURVE_S2', INDETERMINATE) +curve3d = IfcPreferredSurfaceCurveRepresentation.CURVE3D +pcurve_s1 = IfcPreferredSurfaceCurveRepresentation.PCURVE_S1 +pcurve_s2 = IfcPreferredSurfaceCurveRepresentation.PCURVE_S2 IfcProcedureTypeEnum = enum_namespace() -advice_caution = express_getattr(IfcProcedureTypeEnum, 'ADVICE_CAUTION', INDETERMINATE) -advice_note = express_getattr(IfcProcedureTypeEnum, 'ADVICE_NOTE', INDETERMINATE) -advice_warning = express_getattr(IfcProcedureTypeEnum, 'ADVICE_WARNING', INDETERMINATE) -calibration = express_getattr(IfcProcedureTypeEnum, 'CALIBRATION', INDETERMINATE) -diagnostic = express_getattr(IfcProcedureTypeEnum, 'DIAGNOSTIC', INDETERMINATE) -shutdown = express_getattr(IfcProcedureTypeEnum, 'SHUTDOWN', INDETERMINATE) -startup = express_getattr(IfcProcedureTypeEnum, 'STARTUP', INDETERMINATE) -userdefined = express_getattr(IfcProcedureTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcProcedureTypeEnum, 'NOTDEFINED', INDETERMINATE) +advice_caution = IfcProcedureTypeEnum.ADVICE_CAUTION +advice_note = IfcProcedureTypeEnum.ADVICE_NOTE +advice_warning = IfcProcedureTypeEnum.ADVICE_WARNING +calibration = IfcProcedureTypeEnum.CALIBRATION +diagnostic = IfcProcedureTypeEnum.DIAGNOSTIC +shutdown = IfcProcedureTypeEnum.SHUTDOWN +startup = IfcProcedureTypeEnum.STARTUP +userdefined = IfcProcedureTypeEnum.USERDEFINED +notdefined = IfcProcedureTypeEnum.NOTDEFINED IfcProfileTypeEnum = enum_namespace() -curve = express_getattr(IfcProfileTypeEnum, 'CURVE', INDETERMINATE) -area = express_getattr(IfcProfileTypeEnum, 'AREA', INDETERMINATE) +curve = IfcProfileTypeEnum.CURVE +area = IfcProfileTypeEnum.AREA IfcProjectOrderTypeEnum = enum_namespace() -changeorder = express_getattr(IfcProjectOrderTypeEnum, 'CHANGEORDER', INDETERMINATE) -maintenanceworkorder = express_getattr(IfcProjectOrderTypeEnum, 'MAINTENANCEWORKORDER', INDETERMINATE) -moveorder = express_getattr(IfcProjectOrderTypeEnum, 'MOVEORDER', INDETERMINATE) -purchaseorder = express_getattr(IfcProjectOrderTypeEnum, 'PURCHASEORDER', INDETERMINATE) -workorder = express_getattr(IfcProjectOrderTypeEnum, 'WORKORDER', INDETERMINATE) -userdefined = express_getattr(IfcProjectOrderTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcProjectOrderTypeEnum, 'NOTDEFINED', INDETERMINATE) +changeorder = IfcProjectOrderTypeEnum.CHANGEORDER +maintenanceworkorder = IfcProjectOrderTypeEnum.MAINTENANCEWORKORDER +moveorder = IfcProjectOrderTypeEnum.MOVEORDER +purchaseorder = IfcProjectOrderTypeEnum.PURCHASEORDER +workorder = IfcProjectOrderTypeEnum.WORKORDER +userdefined = IfcProjectOrderTypeEnum.USERDEFINED +notdefined = IfcProjectOrderTypeEnum.NOTDEFINED IfcProjectedOrTrueLengthEnum = enum_namespace() -projected_length = express_getattr(IfcProjectedOrTrueLengthEnum, 'PROJECTED_LENGTH', INDETERMINATE) -true_length = express_getattr(IfcProjectedOrTrueLengthEnum, 'TRUE_LENGTH', INDETERMINATE) +projected_length = IfcProjectedOrTrueLengthEnum.PROJECTED_LENGTH +true_length = IfcProjectedOrTrueLengthEnum.TRUE_LENGTH IfcProjectionElementTypeEnum = enum_namespace() -blister = express_getattr(IfcProjectionElementTypeEnum, 'BLISTER', INDETERMINATE) -deviator = express_getattr(IfcProjectionElementTypeEnum, 'DEVIATOR', INDETERMINATE) -userdefined = express_getattr(IfcProjectionElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcProjectionElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +blister = IfcProjectionElementTypeEnum.BLISTER +deviator = IfcProjectionElementTypeEnum.DEVIATOR +userdefined = IfcProjectionElementTypeEnum.USERDEFINED +notdefined = IfcProjectionElementTypeEnum.NOTDEFINED IfcPropertySetTemplateTypeEnum = enum_namespace() -pset_typedrivenonly = express_getattr(IfcPropertySetTemplateTypeEnum, 'PSET_TYPEDRIVENONLY', INDETERMINATE) -pset_typedrivenoverride = express_getattr(IfcPropertySetTemplateTypeEnum, 'PSET_TYPEDRIVENOVERRIDE', INDETERMINATE) -pset_occurrencedriven = express_getattr(IfcPropertySetTemplateTypeEnum, 'PSET_OCCURRENCEDRIVEN', INDETERMINATE) -pset_performancedriven = express_getattr(IfcPropertySetTemplateTypeEnum, 'PSET_PERFORMANCEDRIVEN', INDETERMINATE) -qto_typedrivenonly = express_getattr(IfcPropertySetTemplateTypeEnum, 'QTO_TYPEDRIVENONLY', INDETERMINATE) -qto_typedrivenoverride = express_getattr(IfcPropertySetTemplateTypeEnum, 'QTO_TYPEDRIVENOVERRIDE', INDETERMINATE) -qto_occurrencedriven = express_getattr(IfcPropertySetTemplateTypeEnum, 'QTO_OCCURRENCEDRIVEN', INDETERMINATE) -notdefined = express_getattr(IfcPropertySetTemplateTypeEnum, 'NOTDEFINED', INDETERMINATE) +pset_typedrivenonly = IfcPropertySetTemplateTypeEnum.PSET_TYPEDRIVENONLY +pset_typedrivenoverride = IfcPropertySetTemplateTypeEnum.PSET_TYPEDRIVENOVERRIDE +pset_occurrencedriven = IfcPropertySetTemplateTypeEnum.PSET_OCCURRENCEDRIVEN +pset_performancedriven = IfcPropertySetTemplateTypeEnum.PSET_PERFORMANCEDRIVEN +qto_typedrivenonly = IfcPropertySetTemplateTypeEnum.QTO_TYPEDRIVENONLY +qto_typedrivenoverride = IfcPropertySetTemplateTypeEnum.QTO_TYPEDRIVENOVERRIDE +qto_occurrencedriven = IfcPropertySetTemplateTypeEnum.QTO_OCCURRENCEDRIVEN +notdefined = IfcPropertySetTemplateTypeEnum.NOTDEFINED IfcProtectiveDeviceTrippingUnitTypeEnum = enum_namespace() -electronic = express_getattr(IfcProtectiveDeviceTrippingUnitTypeEnum, 'ELECTRONIC', INDETERMINATE) -electromagnetic = express_getattr(IfcProtectiveDeviceTrippingUnitTypeEnum, 'ELECTROMAGNETIC', INDETERMINATE) -residualcurrent = express_getattr(IfcProtectiveDeviceTrippingUnitTypeEnum, 'RESIDUALCURRENT', INDETERMINATE) -thermal = express_getattr(IfcProtectiveDeviceTrippingUnitTypeEnum, 'THERMAL', INDETERMINATE) -userdefined = express_getattr(IfcProtectiveDeviceTrippingUnitTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcProtectiveDeviceTrippingUnitTypeEnum, 'NOTDEFINED', INDETERMINATE) +electronic = IfcProtectiveDeviceTrippingUnitTypeEnum.ELECTRONIC +electromagnetic = IfcProtectiveDeviceTrippingUnitTypeEnum.ELECTROMAGNETIC +residualcurrent = IfcProtectiveDeviceTrippingUnitTypeEnum.RESIDUALCURRENT +thermal = IfcProtectiveDeviceTrippingUnitTypeEnum.THERMAL +userdefined = IfcProtectiveDeviceTrippingUnitTypeEnum.USERDEFINED +notdefined = IfcProtectiveDeviceTrippingUnitTypeEnum.NOTDEFINED IfcProtectiveDeviceTypeEnum = enum_namespace() -circuitbreaker = express_getattr(IfcProtectiveDeviceTypeEnum, 'CIRCUITBREAKER', INDETERMINATE) -earthleakagecircuitbreaker = express_getattr(IfcProtectiveDeviceTypeEnum, 'EARTHLEAKAGECIRCUITBREAKER', INDETERMINATE) -earthingswitch = express_getattr(IfcProtectiveDeviceTypeEnum, 'EARTHINGSWITCH', INDETERMINATE) -fusedisconnector = express_getattr(IfcProtectiveDeviceTypeEnum, 'FUSEDISCONNECTOR', INDETERMINATE) -residualcurrentcircuitbreaker = express_getattr(IfcProtectiveDeviceTypeEnum, 'RESIDUALCURRENTCIRCUITBREAKER', INDETERMINATE) -residualcurrentswitch = express_getattr(IfcProtectiveDeviceTypeEnum, 'RESIDUALCURRENTSWITCH', INDETERMINATE) -varistor = express_getattr(IfcProtectiveDeviceTypeEnum, 'VARISTOR', INDETERMINATE) -anti_arcing_device = express_getattr(IfcProtectiveDeviceTypeEnum, 'ANTI_ARCING_DEVICE', INDETERMINATE) -sparkgap = express_getattr(IfcProtectiveDeviceTypeEnum, 'SPARKGAP', INDETERMINATE) -voltagelimiter = express_getattr(IfcProtectiveDeviceTypeEnum, 'VOLTAGELIMITER', INDETERMINATE) -userdefined = express_getattr(IfcProtectiveDeviceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcProtectiveDeviceTypeEnum, 'NOTDEFINED', INDETERMINATE) +circuitbreaker = IfcProtectiveDeviceTypeEnum.CIRCUITBREAKER +earthleakagecircuitbreaker = IfcProtectiveDeviceTypeEnum.EARTHLEAKAGECIRCUITBREAKER +earthingswitch = IfcProtectiveDeviceTypeEnum.EARTHINGSWITCH +fusedisconnector = IfcProtectiveDeviceTypeEnum.FUSEDISCONNECTOR +residualcurrentcircuitbreaker = IfcProtectiveDeviceTypeEnum.RESIDUALCURRENTCIRCUITBREAKER +residualcurrentswitch = IfcProtectiveDeviceTypeEnum.RESIDUALCURRENTSWITCH +varistor = IfcProtectiveDeviceTypeEnum.VARISTOR +anti_arcing_device = IfcProtectiveDeviceTypeEnum.ANTI_ARCING_DEVICE +sparkgap = IfcProtectiveDeviceTypeEnum.SPARKGAP +voltagelimiter = IfcProtectiveDeviceTypeEnum.VOLTAGELIMITER +userdefined = IfcProtectiveDeviceTypeEnum.USERDEFINED +notdefined = IfcProtectiveDeviceTypeEnum.NOTDEFINED IfcPumpTypeEnum = enum_namespace() -circulator = express_getattr(IfcPumpTypeEnum, 'CIRCULATOR', INDETERMINATE) -endsuction = express_getattr(IfcPumpTypeEnum, 'ENDSUCTION', INDETERMINATE) -splitcase = express_getattr(IfcPumpTypeEnum, 'SPLITCASE', INDETERMINATE) -submersiblepump = express_getattr(IfcPumpTypeEnum, 'SUBMERSIBLEPUMP', INDETERMINATE) -sumppump = express_getattr(IfcPumpTypeEnum, 'SUMPPUMP', INDETERMINATE) -verticalinline = express_getattr(IfcPumpTypeEnum, 'VERTICALINLINE', INDETERMINATE) -verticalturbine = express_getattr(IfcPumpTypeEnum, 'VERTICALTURBINE', INDETERMINATE) -userdefined = express_getattr(IfcPumpTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPumpTypeEnum, 'NOTDEFINED', INDETERMINATE) +circulator = IfcPumpTypeEnum.CIRCULATOR +endsuction = IfcPumpTypeEnum.ENDSUCTION +splitcase = IfcPumpTypeEnum.SPLITCASE +submersiblepump = IfcPumpTypeEnum.SUBMERSIBLEPUMP +sumppump = IfcPumpTypeEnum.SUMPPUMP +verticalinline = IfcPumpTypeEnum.VERTICALINLINE +verticalturbine = IfcPumpTypeEnum.VERTICALTURBINE +userdefined = IfcPumpTypeEnum.USERDEFINED +notdefined = IfcPumpTypeEnum.NOTDEFINED IfcRailTypeEnum = enum_namespace() -rackrail = express_getattr(IfcRailTypeEnum, 'RACKRAIL', INDETERMINATE) -blade = express_getattr(IfcRailTypeEnum, 'BLADE', INDETERMINATE) -guardrail = express_getattr(IfcRailTypeEnum, 'GUARDRAIL', INDETERMINATE) -stockrail = express_getattr(IfcRailTypeEnum, 'STOCKRAIL', INDETERMINATE) -checkrail = express_getattr(IfcRailTypeEnum, 'CHECKRAIL', INDETERMINATE) -rail = express_getattr(IfcRailTypeEnum, 'RAIL', INDETERMINATE) -userdefined = express_getattr(IfcRailTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcRailTypeEnum, 'NOTDEFINED', INDETERMINATE) +rackrail = IfcRailTypeEnum.RACKRAIL +blade = IfcRailTypeEnum.BLADE +guardrail = IfcRailTypeEnum.GUARDRAIL +stockrail = IfcRailTypeEnum.STOCKRAIL +checkrail = IfcRailTypeEnum.CHECKRAIL +rail = IfcRailTypeEnum.RAIL +userdefined = IfcRailTypeEnum.USERDEFINED +notdefined = IfcRailTypeEnum.NOTDEFINED IfcRailingTypeEnum = enum_namespace() -handrail = express_getattr(IfcRailingTypeEnum, 'HANDRAIL', INDETERMINATE) -guardrail = express_getattr(IfcRailingTypeEnum, 'GUARDRAIL', INDETERMINATE) -balustrade = express_getattr(IfcRailingTypeEnum, 'BALUSTRADE', INDETERMINATE) -fence = express_getattr(IfcRailingTypeEnum, 'FENCE', INDETERMINATE) -userdefined = express_getattr(IfcRailingTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcRailingTypeEnum, 'NOTDEFINED', INDETERMINATE) +handrail = IfcRailingTypeEnum.HANDRAIL +guardrail = IfcRailingTypeEnum.GUARDRAIL +balustrade = IfcRailingTypeEnum.BALUSTRADE +fence = IfcRailingTypeEnum.FENCE +userdefined = IfcRailingTypeEnum.USERDEFINED +notdefined = IfcRailingTypeEnum.NOTDEFINED IfcRailwayPartTypeEnum = enum_namespace() -trackstructure = express_getattr(IfcRailwayPartTypeEnum, 'TRACKSTRUCTURE', INDETERMINATE) -trackstructurepart = express_getattr(IfcRailwayPartTypeEnum, 'TRACKSTRUCTUREPART', INDETERMINATE) -linesidestructurepart = express_getattr(IfcRailwayPartTypeEnum, 'LINESIDESTRUCTUREPART', INDETERMINATE) -dilatationsuperstructure = express_getattr(IfcRailwayPartTypeEnum, 'DILATATIONSUPERSTRUCTURE', INDETERMINATE) -plaintracksupestructure = express_getattr(IfcRailwayPartTypeEnum, 'PLAINTRACKSUPESTRUCTURE', INDETERMINATE) -linesidestructure = express_getattr(IfcRailwayPartTypeEnum, 'LINESIDESTRUCTURE', INDETERMINATE) -superstructure = express_getattr(IfcRailwayPartTypeEnum, 'SUPERSTRUCTURE', INDETERMINATE) -turnoutsuperstructure = express_getattr(IfcRailwayPartTypeEnum, 'TURNOUTSUPERSTRUCTURE', INDETERMINATE) -userdefined = express_getattr(IfcRailwayPartTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcRailwayPartTypeEnum, 'NOTDEFINED', INDETERMINATE) +trackstructure = IfcRailwayPartTypeEnum.TRACKSTRUCTURE +trackstructurepart = IfcRailwayPartTypeEnum.TRACKSTRUCTUREPART +linesidestructurepart = IfcRailwayPartTypeEnum.LINESIDESTRUCTUREPART +dilatationsuperstructure = IfcRailwayPartTypeEnum.DILATATIONSUPERSTRUCTURE +plaintracksupestructure = IfcRailwayPartTypeEnum.PLAINTRACKSUPESTRUCTURE +linesidestructure = IfcRailwayPartTypeEnum.LINESIDESTRUCTURE +superstructure = IfcRailwayPartTypeEnum.SUPERSTRUCTURE +turnoutsuperstructure = IfcRailwayPartTypeEnum.TURNOUTSUPERSTRUCTURE +userdefined = IfcRailwayPartTypeEnum.USERDEFINED +notdefined = IfcRailwayPartTypeEnum.NOTDEFINED IfcRailwayTypeEnum = enum_namespace() -userdefined = express_getattr(IfcRailwayTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcRailwayTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcRailwayTypeEnum.USERDEFINED +notdefined = IfcRailwayTypeEnum.NOTDEFINED IfcRampFlightTypeEnum = enum_namespace() -straight = express_getattr(IfcRampFlightTypeEnum, 'STRAIGHT', INDETERMINATE) -spiral = express_getattr(IfcRampFlightTypeEnum, 'SPIRAL', INDETERMINATE) -userdefined = express_getattr(IfcRampFlightTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcRampFlightTypeEnum, 'NOTDEFINED', INDETERMINATE) +straight = IfcRampFlightTypeEnum.STRAIGHT +spiral = IfcRampFlightTypeEnum.SPIRAL +userdefined = IfcRampFlightTypeEnum.USERDEFINED +notdefined = IfcRampFlightTypeEnum.NOTDEFINED IfcRampTypeEnum = enum_namespace() -straight_run_ramp = express_getattr(IfcRampTypeEnum, 'STRAIGHT_RUN_RAMP', INDETERMINATE) -two_straight_run_ramp = express_getattr(IfcRampTypeEnum, 'TWO_STRAIGHT_RUN_RAMP', INDETERMINATE) -quarter_turn_ramp = express_getattr(IfcRampTypeEnum, 'QUARTER_TURN_RAMP', INDETERMINATE) -two_quarter_turn_ramp = express_getattr(IfcRampTypeEnum, 'TWO_QUARTER_TURN_RAMP', INDETERMINATE) -half_turn_ramp = express_getattr(IfcRampTypeEnum, 'HALF_TURN_RAMP', INDETERMINATE) -spiral_ramp = express_getattr(IfcRampTypeEnum, 'SPIRAL_RAMP', INDETERMINATE) -userdefined = express_getattr(IfcRampTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcRampTypeEnum, 'NOTDEFINED', INDETERMINATE) +straight_run_ramp = IfcRampTypeEnum.STRAIGHT_RUN_RAMP +two_straight_run_ramp = IfcRampTypeEnum.TWO_STRAIGHT_RUN_RAMP +quarter_turn_ramp = IfcRampTypeEnum.QUARTER_TURN_RAMP +two_quarter_turn_ramp = IfcRampTypeEnum.TWO_QUARTER_TURN_RAMP +half_turn_ramp = IfcRampTypeEnum.HALF_TURN_RAMP +spiral_ramp = IfcRampTypeEnum.SPIRAL_RAMP +userdefined = IfcRampTypeEnum.USERDEFINED +notdefined = IfcRampTypeEnum.NOTDEFINED IfcRecurrenceTypeEnum = enum_namespace() -daily = express_getattr(IfcRecurrenceTypeEnum, 'DAILY', INDETERMINATE) -weekly = express_getattr(IfcRecurrenceTypeEnum, 'WEEKLY', INDETERMINATE) -monthly_by_day_of_month = express_getattr(IfcRecurrenceTypeEnum, 'MONTHLY_BY_DAY_OF_MONTH', INDETERMINATE) -monthly_by_position = express_getattr(IfcRecurrenceTypeEnum, 'MONTHLY_BY_POSITION', INDETERMINATE) -by_day_count = express_getattr(IfcRecurrenceTypeEnum, 'BY_DAY_COUNT', INDETERMINATE) -by_weekday_count = express_getattr(IfcRecurrenceTypeEnum, 'BY_WEEKDAY_COUNT', INDETERMINATE) -yearly_by_day_of_month = express_getattr(IfcRecurrenceTypeEnum, 'YEARLY_BY_DAY_OF_MONTH', INDETERMINATE) -yearly_by_position = express_getattr(IfcRecurrenceTypeEnum, 'YEARLY_BY_POSITION', INDETERMINATE) +daily = IfcRecurrenceTypeEnum.DAILY +weekly = IfcRecurrenceTypeEnum.WEEKLY +monthly_by_day_of_month = IfcRecurrenceTypeEnum.MONTHLY_BY_DAY_OF_MONTH +monthly_by_position = IfcRecurrenceTypeEnum.MONTHLY_BY_POSITION +by_day_count = IfcRecurrenceTypeEnum.BY_DAY_COUNT +by_weekday_count = IfcRecurrenceTypeEnum.BY_WEEKDAY_COUNT +yearly_by_day_of_month = IfcRecurrenceTypeEnum.YEARLY_BY_DAY_OF_MONTH +yearly_by_position = IfcRecurrenceTypeEnum.YEARLY_BY_POSITION IfcReferentTypeEnum = enum_namespace() -kilopoint = express_getattr(IfcReferentTypeEnum, 'KILOPOINT', INDETERMINATE) -milepoint = express_getattr(IfcReferentTypeEnum, 'MILEPOINT', INDETERMINATE) -station = express_getattr(IfcReferentTypeEnum, 'STATION', INDETERMINATE) -referencemarker = express_getattr(IfcReferentTypeEnum, 'REFERENCEMARKER', INDETERMINATE) -landmark = express_getattr(IfcReferentTypeEnum, 'LANDMARK', INDETERMINATE) -boundary = express_getattr(IfcReferentTypeEnum, 'BOUNDARY', INDETERMINATE) -intersection = express_getattr(IfcReferentTypeEnum, 'INTERSECTION', INDETERMINATE) -position = express_getattr(IfcReferentTypeEnum, 'POSITION', INDETERMINATE) -userdefined = express_getattr(IfcReferentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcReferentTypeEnum, 'NOTDEFINED', INDETERMINATE) +kilopoint = IfcReferentTypeEnum.KILOPOINT +milepoint = IfcReferentTypeEnum.MILEPOINT +station = IfcReferentTypeEnum.STATION +referencemarker = IfcReferentTypeEnum.REFERENCEMARKER +landmark = IfcReferentTypeEnum.LANDMARK +boundary = IfcReferentTypeEnum.BOUNDARY +intersection = IfcReferentTypeEnum.INTERSECTION +position = IfcReferentTypeEnum.POSITION +userdefined = IfcReferentTypeEnum.USERDEFINED +notdefined = IfcReferentTypeEnum.NOTDEFINED IfcReflectanceMethodEnum = enum_namespace() -blinn = express_getattr(IfcReflectanceMethodEnum, 'BLINN', INDETERMINATE) -flat = express_getattr(IfcReflectanceMethodEnum, 'FLAT', INDETERMINATE) -glass = express_getattr(IfcReflectanceMethodEnum, 'GLASS', INDETERMINATE) -matt = express_getattr(IfcReflectanceMethodEnum, 'MATT', INDETERMINATE) -metal = express_getattr(IfcReflectanceMethodEnum, 'METAL', INDETERMINATE) -mirror = express_getattr(IfcReflectanceMethodEnum, 'MIRROR', INDETERMINATE) -phong = express_getattr(IfcReflectanceMethodEnum, 'PHONG', INDETERMINATE) -plastic = express_getattr(IfcReflectanceMethodEnum, 'PLASTIC', INDETERMINATE) -strauss = express_getattr(IfcReflectanceMethodEnum, 'STRAUSS', INDETERMINATE) -notdefined = express_getattr(IfcReflectanceMethodEnum, 'NOTDEFINED', INDETERMINATE) +blinn = IfcReflectanceMethodEnum.BLINN +flat = IfcReflectanceMethodEnum.FLAT +glass = IfcReflectanceMethodEnum.GLASS +matt = IfcReflectanceMethodEnum.MATT +metal = IfcReflectanceMethodEnum.METAL +mirror = IfcReflectanceMethodEnum.MIRROR +phong = IfcReflectanceMethodEnum.PHONG +plastic = IfcReflectanceMethodEnum.PLASTIC +strauss = IfcReflectanceMethodEnum.STRAUSS +notdefined = IfcReflectanceMethodEnum.NOTDEFINED IfcReinforcedSoilTypeEnum = enum_namespace() -surchargepreloaded = express_getattr(IfcReinforcedSoilTypeEnum, 'SURCHARGEPRELOADED', INDETERMINATE) -verticallydrained = express_getattr(IfcReinforcedSoilTypeEnum, 'VERTICALLYDRAINED', INDETERMINATE) -dynamicallycompacted = express_getattr(IfcReinforcedSoilTypeEnum, 'DYNAMICALLYCOMPACTED', INDETERMINATE) -replaced = express_getattr(IfcReinforcedSoilTypeEnum, 'REPLACED', INDETERMINATE) -rollercompacted = express_getattr(IfcReinforcedSoilTypeEnum, 'ROLLERCOMPACTED', INDETERMINATE) -grouted = express_getattr(IfcReinforcedSoilTypeEnum, 'GROUTED', INDETERMINATE) -userdefined = express_getattr(IfcReinforcedSoilTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcReinforcedSoilTypeEnum, 'NOTDEFINED', INDETERMINATE) +surchargepreloaded = IfcReinforcedSoilTypeEnum.SURCHARGEPRELOADED +verticallydrained = IfcReinforcedSoilTypeEnum.VERTICALLYDRAINED +dynamicallycompacted = IfcReinforcedSoilTypeEnum.DYNAMICALLYCOMPACTED +replaced = IfcReinforcedSoilTypeEnum.REPLACED +rollercompacted = IfcReinforcedSoilTypeEnum.ROLLERCOMPACTED +grouted = IfcReinforcedSoilTypeEnum.GROUTED +userdefined = IfcReinforcedSoilTypeEnum.USERDEFINED +notdefined = IfcReinforcedSoilTypeEnum.NOTDEFINED IfcReinforcingBarRoleEnum = enum_namespace() -main = express_getattr(IfcReinforcingBarRoleEnum, 'MAIN', INDETERMINATE) -shear = express_getattr(IfcReinforcingBarRoleEnum, 'SHEAR', INDETERMINATE) -ligature = express_getattr(IfcReinforcingBarRoleEnum, 'LIGATURE', INDETERMINATE) -stud = express_getattr(IfcReinforcingBarRoleEnum, 'STUD', INDETERMINATE) -punching = express_getattr(IfcReinforcingBarRoleEnum, 'PUNCHING', INDETERMINATE) -edge = express_getattr(IfcReinforcingBarRoleEnum, 'EDGE', INDETERMINATE) -ring = express_getattr(IfcReinforcingBarRoleEnum, 'RING', INDETERMINATE) -anchoring = express_getattr(IfcReinforcingBarRoleEnum, 'ANCHORING', INDETERMINATE) -userdefined = express_getattr(IfcReinforcingBarRoleEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcReinforcingBarRoleEnum, 'NOTDEFINED', INDETERMINATE) +main = IfcReinforcingBarRoleEnum.MAIN +shear = IfcReinforcingBarRoleEnum.SHEAR +ligature = IfcReinforcingBarRoleEnum.LIGATURE +stud = IfcReinforcingBarRoleEnum.STUD +punching = IfcReinforcingBarRoleEnum.PUNCHING +edge = IfcReinforcingBarRoleEnum.EDGE +ring = IfcReinforcingBarRoleEnum.RING +anchoring = IfcReinforcingBarRoleEnum.ANCHORING +userdefined = IfcReinforcingBarRoleEnum.USERDEFINED +notdefined = IfcReinforcingBarRoleEnum.NOTDEFINED IfcReinforcingBarSurfaceEnum = enum_namespace() -plain = express_getattr(IfcReinforcingBarSurfaceEnum, 'PLAIN', INDETERMINATE) -textured = express_getattr(IfcReinforcingBarSurfaceEnum, 'TEXTURED', INDETERMINATE) +plain = IfcReinforcingBarSurfaceEnum.PLAIN +textured = IfcReinforcingBarSurfaceEnum.TEXTURED IfcReinforcingBarTypeEnum = enum_namespace() -anchoring = express_getattr(IfcReinforcingBarTypeEnum, 'ANCHORING', INDETERMINATE) -edge = express_getattr(IfcReinforcingBarTypeEnum, 'EDGE', INDETERMINATE) -ligature = express_getattr(IfcReinforcingBarTypeEnum, 'LIGATURE', INDETERMINATE) -main = express_getattr(IfcReinforcingBarTypeEnum, 'MAIN', INDETERMINATE) -punching = express_getattr(IfcReinforcingBarTypeEnum, 'PUNCHING', INDETERMINATE) -ring = express_getattr(IfcReinforcingBarTypeEnum, 'RING', INDETERMINATE) -shear = express_getattr(IfcReinforcingBarTypeEnum, 'SHEAR', INDETERMINATE) -stud = express_getattr(IfcReinforcingBarTypeEnum, 'STUD', INDETERMINATE) -spacebar = express_getattr(IfcReinforcingBarTypeEnum, 'SPACEBAR', INDETERMINATE) -userdefined = express_getattr(IfcReinforcingBarTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcReinforcingBarTypeEnum, 'NOTDEFINED', INDETERMINATE) +anchoring = IfcReinforcingBarTypeEnum.ANCHORING +edge = IfcReinforcingBarTypeEnum.EDGE +ligature = IfcReinforcingBarTypeEnum.LIGATURE +main = IfcReinforcingBarTypeEnum.MAIN +punching = IfcReinforcingBarTypeEnum.PUNCHING +ring = IfcReinforcingBarTypeEnum.RING +shear = IfcReinforcingBarTypeEnum.SHEAR +stud = IfcReinforcingBarTypeEnum.STUD +spacebar = IfcReinforcingBarTypeEnum.SPACEBAR +userdefined = IfcReinforcingBarTypeEnum.USERDEFINED +notdefined = IfcReinforcingBarTypeEnum.NOTDEFINED IfcReinforcingMeshTypeEnum = enum_namespace() -userdefined = express_getattr(IfcReinforcingMeshTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcReinforcingMeshTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcReinforcingMeshTypeEnum.USERDEFINED +notdefined = IfcReinforcingMeshTypeEnum.NOTDEFINED IfcRoadPartTypeEnum = enum_namespace() -roadsidepart = express_getattr(IfcRoadPartTypeEnum, 'ROADSIDEPART', INDETERMINATE) -bus_stop = express_getattr(IfcRoadPartTypeEnum, 'BUS_STOP', INDETERMINATE) -hardshoulder = express_getattr(IfcRoadPartTypeEnum, 'HARDSHOULDER', INDETERMINATE) -intersection = express_getattr(IfcRoadPartTypeEnum, 'INTERSECTION', INDETERMINATE) -passingbay = express_getattr(IfcRoadPartTypeEnum, 'PASSINGBAY', INDETERMINATE) -roadwayplateau = express_getattr(IfcRoadPartTypeEnum, 'ROADWAYPLATEAU', INDETERMINATE) -roadside = express_getattr(IfcRoadPartTypeEnum, 'ROADSIDE', INDETERMINATE) -refugeisland = express_getattr(IfcRoadPartTypeEnum, 'REFUGEISLAND', INDETERMINATE) -tollplaza = express_getattr(IfcRoadPartTypeEnum, 'TOLLPLAZA', INDETERMINATE) -centralreserve = express_getattr(IfcRoadPartTypeEnum, 'CENTRALRESERVE', INDETERMINATE) -sidewalk = express_getattr(IfcRoadPartTypeEnum, 'SIDEWALK', INDETERMINATE) -parkingbay = express_getattr(IfcRoadPartTypeEnum, 'PARKINGBAY', INDETERMINATE) -railwaycrossing = express_getattr(IfcRoadPartTypeEnum, 'RAILWAYCROSSING', INDETERMINATE) -pedestrian_crossing = express_getattr(IfcRoadPartTypeEnum, 'PEDESTRIAN_CROSSING', INDETERMINATE) -softshoulder = express_getattr(IfcRoadPartTypeEnum, 'SOFTSHOULDER', INDETERMINATE) -bicyclecrossing = express_getattr(IfcRoadPartTypeEnum, 'BICYCLECROSSING', INDETERMINATE) -centralisland = express_getattr(IfcRoadPartTypeEnum, 'CENTRALISLAND', INDETERMINATE) -shoulder = express_getattr(IfcRoadPartTypeEnum, 'SHOULDER', INDETERMINATE) -trafficlane = express_getattr(IfcRoadPartTypeEnum, 'TRAFFICLANE', INDETERMINATE) -roadsegment = express_getattr(IfcRoadPartTypeEnum, 'ROADSEGMENT', INDETERMINATE) -roundabout = express_getattr(IfcRoadPartTypeEnum, 'ROUNDABOUT', INDETERMINATE) -layby = express_getattr(IfcRoadPartTypeEnum, 'LAYBY', INDETERMINATE) -carriageway = express_getattr(IfcRoadPartTypeEnum, 'CARRIAGEWAY', INDETERMINATE) -trafficisland = express_getattr(IfcRoadPartTypeEnum, 'TRAFFICISLAND', INDETERMINATE) -userdefined = express_getattr(IfcRoadPartTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcRoadPartTypeEnum, 'NOTDEFINED', INDETERMINATE) +roadsidepart = IfcRoadPartTypeEnum.ROADSIDEPART +bus_stop = IfcRoadPartTypeEnum.BUS_STOP +hardshoulder = IfcRoadPartTypeEnum.HARDSHOULDER +intersection = IfcRoadPartTypeEnum.INTERSECTION +passingbay = IfcRoadPartTypeEnum.PASSINGBAY +roadwayplateau = IfcRoadPartTypeEnum.ROADWAYPLATEAU +roadside = IfcRoadPartTypeEnum.ROADSIDE +refugeisland = IfcRoadPartTypeEnum.REFUGEISLAND +tollplaza = IfcRoadPartTypeEnum.TOLLPLAZA +centralreserve = IfcRoadPartTypeEnum.CENTRALRESERVE +sidewalk = IfcRoadPartTypeEnum.SIDEWALK +parkingbay = IfcRoadPartTypeEnum.PARKINGBAY +railwaycrossing = IfcRoadPartTypeEnum.RAILWAYCROSSING +pedestrian_crossing = IfcRoadPartTypeEnum.PEDESTRIAN_CROSSING +softshoulder = IfcRoadPartTypeEnum.SOFTSHOULDER +bicyclecrossing = IfcRoadPartTypeEnum.BICYCLECROSSING +centralisland = IfcRoadPartTypeEnum.CENTRALISLAND +shoulder = IfcRoadPartTypeEnum.SHOULDER +trafficlane = IfcRoadPartTypeEnum.TRAFFICLANE +roadsegment = IfcRoadPartTypeEnum.ROADSEGMENT +roundabout = IfcRoadPartTypeEnum.ROUNDABOUT +layby = IfcRoadPartTypeEnum.LAYBY +carriageway = IfcRoadPartTypeEnum.CARRIAGEWAY +trafficisland = IfcRoadPartTypeEnum.TRAFFICISLAND +userdefined = IfcRoadPartTypeEnum.USERDEFINED +notdefined = IfcRoadPartTypeEnum.NOTDEFINED IfcRoadTypeEnum = enum_namespace() -userdefined = express_getattr(IfcRoadTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcRoadTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcRoadTypeEnum.USERDEFINED +notdefined = IfcRoadTypeEnum.NOTDEFINED IfcRoleEnum = enum_namespace() -supplier = express_getattr(IfcRoleEnum, 'SUPPLIER', INDETERMINATE) -manufacturer = express_getattr(IfcRoleEnum, 'MANUFACTURER', INDETERMINATE) -contractor = express_getattr(IfcRoleEnum, 'CONTRACTOR', INDETERMINATE) -subcontractor = express_getattr(IfcRoleEnum, 'SUBCONTRACTOR', INDETERMINATE) -architect = express_getattr(IfcRoleEnum, 'ARCHITECT', INDETERMINATE) -structuralengineer = express_getattr(IfcRoleEnum, 'STRUCTURALENGINEER', INDETERMINATE) -costengineer = express_getattr(IfcRoleEnum, 'COSTENGINEER', INDETERMINATE) -client = express_getattr(IfcRoleEnum, 'CLIENT', INDETERMINATE) -buildingowner = express_getattr(IfcRoleEnum, 'BUILDINGOWNER', INDETERMINATE) -buildingoperator = express_getattr(IfcRoleEnum, 'BUILDINGOPERATOR', INDETERMINATE) -mechanicalengineer = express_getattr(IfcRoleEnum, 'MECHANICALENGINEER', INDETERMINATE) -electricalengineer = express_getattr(IfcRoleEnum, 'ELECTRICALENGINEER', INDETERMINATE) -projectmanager = express_getattr(IfcRoleEnum, 'PROJECTMANAGER', INDETERMINATE) -facilitiesmanager = express_getattr(IfcRoleEnum, 'FACILITIESMANAGER', INDETERMINATE) -civilengineer = express_getattr(IfcRoleEnum, 'CIVILENGINEER', INDETERMINATE) -commissioningengineer = express_getattr(IfcRoleEnum, 'COMMISSIONINGENGINEER', INDETERMINATE) -engineer = express_getattr(IfcRoleEnum, 'ENGINEER', INDETERMINATE) -owner = express_getattr(IfcRoleEnum, 'OWNER', INDETERMINATE) -consultant = express_getattr(IfcRoleEnum, 'CONSULTANT', INDETERMINATE) -constructionmanager = express_getattr(IfcRoleEnum, 'CONSTRUCTIONMANAGER', INDETERMINATE) -fieldconstructionmanager = express_getattr(IfcRoleEnum, 'FIELDCONSTRUCTIONMANAGER', INDETERMINATE) -reseller = express_getattr(IfcRoleEnum, 'RESELLER', INDETERMINATE) -userdefined = express_getattr(IfcRoleEnum, 'USERDEFINED', INDETERMINATE) +supplier = IfcRoleEnum.SUPPLIER +manufacturer = IfcRoleEnum.MANUFACTURER +contractor = IfcRoleEnum.CONTRACTOR +subcontractor = IfcRoleEnum.SUBCONTRACTOR +architect = IfcRoleEnum.ARCHITECT +structuralengineer = IfcRoleEnum.STRUCTURALENGINEER +costengineer = IfcRoleEnum.COSTENGINEER +client = IfcRoleEnum.CLIENT +buildingowner = IfcRoleEnum.BUILDINGOWNER +buildingoperator = IfcRoleEnum.BUILDINGOPERATOR +mechanicalengineer = IfcRoleEnum.MECHANICALENGINEER +electricalengineer = IfcRoleEnum.ELECTRICALENGINEER +projectmanager = IfcRoleEnum.PROJECTMANAGER +facilitiesmanager = IfcRoleEnum.FACILITIESMANAGER +civilengineer = IfcRoleEnum.CIVILENGINEER +commissioningengineer = IfcRoleEnum.COMMISSIONINGENGINEER +engineer = IfcRoleEnum.ENGINEER +owner = IfcRoleEnum.OWNER +consultant = IfcRoleEnum.CONSULTANT +constructionmanager = IfcRoleEnum.CONSTRUCTIONMANAGER +fieldconstructionmanager = IfcRoleEnum.FIELDCONSTRUCTIONMANAGER +reseller = IfcRoleEnum.RESELLER +userdefined = IfcRoleEnum.USERDEFINED IfcRoofTypeEnum = enum_namespace() -flat_roof = express_getattr(IfcRoofTypeEnum, 'FLAT_ROOF', INDETERMINATE) -shed_roof = express_getattr(IfcRoofTypeEnum, 'SHED_ROOF', INDETERMINATE) -gable_roof = express_getattr(IfcRoofTypeEnum, 'GABLE_ROOF', INDETERMINATE) -hip_roof = express_getattr(IfcRoofTypeEnum, 'HIP_ROOF', INDETERMINATE) -hipped_gable_roof = express_getattr(IfcRoofTypeEnum, 'HIPPED_GABLE_ROOF', INDETERMINATE) -gambrel_roof = express_getattr(IfcRoofTypeEnum, 'GAMBREL_ROOF', INDETERMINATE) -mansard_roof = express_getattr(IfcRoofTypeEnum, 'MANSARD_ROOF', INDETERMINATE) -barrel_roof = express_getattr(IfcRoofTypeEnum, 'BARREL_ROOF', INDETERMINATE) -rainbow_roof = express_getattr(IfcRoofTypeEnum, 'RAINBOW_ROOF', INDETERMINATE) -butterfly_roof = express_getattr(IfcRoofTypeEnum, 'BUTTERFLY_ROOF', INDETERMINATE) -pavilion_roof = express_getattr(IfcRoofTypeEnum, 'PAVILION_ROOF', INDETERMINATE) -dome_roof = express_getattr(IfcRoofTypeEnum, 'DOME_ROOF', INDETERMINATE) -freeform = express_getattr(IfcRoofTypeEnum, 'FREEFORM', INDETERMINATE) -userdefined = express_getattr(IfcRoofTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcRoofTypeEnum, 'NOTDEFINED', INDETERMINATE) +flat_roof = IfcRoofTypeEnum.FLAT_ROOF +shed_roof = IfcRoofTypeEnum.SHED_ROOF +gable_roof = IfcRoofTypeEnum.GABLE_ROOF +hip_roof = IfcRoofTypeEnum.HIP_ROOF +hipped_gable_roof = IfcRoofTypeEnum.HIPPED_GABLE_ROOF +gambrel_roof = IfcRoofTypeEnum.GAMBREL_ROOF +mansard_roof = IfcRoofTypeEnum.MANSARD_ROOF +barrel_roof = IfcRoofTypeEnum.BARREL_ROOF +rainbow_roof = IfcRoofTypeEnum.RAINBOW_ROOF +butterfly_roof = IfcRoofTypeEnum.BUTTERFLY_ROOF +pavilion_roof = IfcRoofTypeEnum.PAVILION_ROOF +dome_roof = IfcRoofTypeEnum.DOME_ROOF +freeform = IfcRoofTypeEnum.FREEFORM +userdefined = IfcRoofTypeEnum.USERDEFINED +notdefined = IfcRoofTypeEnum.NOTDEFINED IfcSIPrefix = enum_namespace() -exa = express_getattr(IfcSIPrefix, 'EXA', INDETERMINATE) -peta = express_getattr(IfcSIPrefix, 'PETA', INDETERMINATE) -tera = express_getattr(IfcSIPrefix, 'TERA', INDETERMINATE) -giga = express_getattr(IfcSIPrefix, 'GIGA', INDETERMINATE) -mega = express_getattr(IfcSIPrefix, 'MEGA', INDETERMINATE) -kilo = express_getattr(IfcSIPrefix, 'KILO', INDETERMINATE) -hecto = express_getattr(IfcSIPrefix, 'HECTO', INDETERMINATE) -deca = express_getattr(IfcSIPrefix, 'DECA', INDETERMINATE) -deci = express_getattr(IfcSIPrefix, 'DECI', INDETERMINATE) -centi = express_getattr(IfcSIPrefix, 'CENTI', INDETERMINATE) -milli = express_getattr(IfcSIPrefix, 'MILLI', INDETERMINATE) -micro = express_getattr(IfcSIPrefix, 'MICRO', INDETERMINATE) -nano = express_getattr(IfcSIPrefix, 'NANO', INDETERMINATE) -pico = express_getattr(IfcSIPrefix, 'PICO', INDETERMINATE) -femto = express_getattr(IfcSIPrefix, 'FEMTO', INDETERMINATE) -atto = express_getattr(IfcSIPrefix, 'ATTO', INDETERMINATE) +exa = IfcSIPrefix.EXA +peta = IfcSIPrefix.PETA +tera = IfcSIPrefix.TERA +giga = IfcSIPrefix.GIGA +mega = IfcSIPrefix.MEGA +kilo = IfcSIPrefix.KILO +hecto = IfcSIPrefix.HECTO +deca = IfcSIPrefix.DECA +deci = IfcSIPrefix.DECI +centi = IfcSIPrefix.CENTI +milli = IfcSIPrefix.MILLI +micro = IfcSIPrefix.MICRO +nano = IfcSIPrefix.NANO +pico = IfcSIPrefix.PICO +femto = IfcSIPrefix.FEMTO +atto = IfcSIPrefix.ATTO IfcSIUnitName = enum_namespace() -ampere = express_getattr(IfcSIUnitName, 'AMPERE', INDETERMINATE) -becquerel = express_getattr(IfcSIUnitName, 'BECQUEREL', INDETERMINATE) -candela = express_getattr(IfcSIUnitName, 'CANDELA', INDETERMINATE) -coulomb = express_getattr(IfcSIUnitName, 'COULOMB', INDETERMINATE) -cubic_metre = express_getattr(IfcSIUnitName, 'CUBIC_METRE', INDETERMINATE) -degree_celsius = express_getattr(IfcSIUnitName, 'DEGREE_CELSIUS', INDETERMINATE) -farad = express_getattr(IfcSIUnitName, 'FARAD', INDETERMINATE) -gram = express_getattr(IfcSIUnitName, 'GRAM', INDETERMINATE) -gray = express_getattr(IfcSIUnitName, 'GRAY', INDETERMINATE) -henry = express_getattr(IfcSIUnitName, 'HENRY', INDETERMINATE) -hertz = express_getattr(IfcSIUnitName, 'HERTZ', INDETERMINATE) -joule = express_getattr(IfcSIUnitName, 'JOULE', INDETERMINATE) -kelvin = express_getattr(IfcSIUnitName, 'KELVIN', INDETERMINATE) -lumen = express_getattr(IfcSIUnitName, 'LUMEN', INDETERMINATE) -lux = express_getattr(IfcSIUnitName, 'LUX', INDETERMINATE) -metre = express_getattr(IfcSIUnitName, 'METRE', INDETERMINATE) -mole = express_getattr(IfcSIUnitName, 'MOLE', INDETERMINATE) -newton = express_getattr(IfcSIUnitName, 'NEWTON', INDETERMINATE) -ohm = express_getattr(IfcSIUnitName, 'OHM', INDETERMINATE) -pascal = express_getattr(IfcSIUnitName, 'PASCAL', INDETERMINATE) -radian = express_getattr(IfcSIUnitName, 'RADIAN', INDETERMINATE) -second = express_getattr(IfcSIUnitName, 'SECOND', INDETERMINATE) -siemens = express_getattr(IfcSIUnitName, 'SIEMENS', INDETERMINATE) -sievert = express_getattr(IfcSIUnitName, 'SIEVERT', INDETERMINATE) -square_metre = express_getattr(IfcSIUnitName, 'SQUARE_METRE', INDETERMINATE) -steradian = express_getattr(IfcSIUnitName, 'STERADIAN', INDETERMINATE) -tesla = express_getattr(IfcSIUnitName, 'TESLA', INDETERMINATE) -volt = express_getattr(IfcSIUnitName, 'VOLT', INDETERMINATE) -watt = express_getattr(IfcSIUnitName, 'WATT', INDETERMINATE) -weber = express_getattr(IfcSIUnitName, 'WEBER', INDETERMINATE) +ampere = IfcSIUnitName.AMPERE +becquerel = IfcSIUnitName.BECQUEREL +candela = IfcSIUnitName.CANDELA +coulomb = IfcSIUnitName.COULOMB +cubic_metre = IfcSIUnitName.CUBIC_METRE +degree_celsius = IfcSIUnitName.DEGREE_CELSIUS +farad = IfcSIUnitName.FARAD +gram = IfcSIUnitName.GRAM +gray = IfcSIUnitName.GRAY +henry = IfcSIUnitName.HENRY +hertz = IfcSIUnitName.HERTZ +joule = IfcSIUnitName.JOULE +kelvin = IfcSIUnitName.KELVIN +lumen = IfcSIUnitName.LUMEN +lux = IfcSIUnitName.LUX +metre = IfcSIUnitName.METRE +mole = IfcSIUnitName.MOLE +newton = IfcSIUnitName.NEWTON +ohm = IfcSIUnitName.OHM +pascal = IfcSIUnitName.PASCAL +radian = IfcSIUnitName.RADIAN +second = IfcSIUnitName.SECOND +siemens = IfcSIUnitName.SIEMENS +sievert = IfcSIUnitName.SIEVERT +square_metre = IfcSIUnitName.SQUARE_METRE +steradian = IfcSIUnitName.STERADIAN +tesla = IfcSIUnitName.TESLA +volt = IfcSIUnitName.VOLT +watt = IfcSIUnitName.WATT +weber = IfcSIUnitName.WEBER IfcSanitaryTerminalTypeEnum = enum_namespace() -bath = express_getattr(IfcSanitaryTerminalTypeEnum, 'BATH', INDETERMINATE) -bidet = express_getattr(IfcSanitaryTerminalTypeEnum, 'BIDET', INDETERMINATE) -cistern = express_getattr(IfcSanitaryTerminalTypeEnum, 'CISTERN', INDETERMINATE) -shower = express_getattr(IfcSanitaryTerminalTypeEnum, 'SHOWER', INDETERMINATE) -sink = express_getattr(IfcSanitaryTerminalTypeEnum, 'SINK', INDETERMINATE) -sanitaryfountain = express_getattr(IfcSanitaryTerminalTypeEnum, 'SANITARYFOUNTAIN', INDETERMINATE) -toiletpan = express_getattr(IfcSanitaryTerminalTypeEnum, 'TOILETPAN', INDETERMINATE) -urinal = express_getattr(IfcSanitaryTerminalTypeEnum, 'URINAL', INDETERMINATE) -washhandbasin = express_getattr(IfcSanitaryTerminalTypeEnum, 'WASHHANDBASIN', INDETERMINATE) -wcseat = express_getattr(IfcSanitaryTerminalTypeEnum, 'WCSEAT', INDETERMINATE) -userdefined = express_getattr(IfcSanitaryTerminalTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSanitaryTerminalTypeEnum, 'NOTDEFINED', INDETERMINATE) +bath = IfcSanitaryTerminalTypeEnum.BATH +bidet = IfcSanitaryTerminalTypeEnum.BIDET +cistern = IfcSanitaryTerminalTypeEnum.CISTERN +shower = IfcSanitaryTerminalTypeEnum.SHOWER +sink = IfcSanitaryTerminalTypeEnum.SINK +sanitaryfountain = IfcSanitaryTerminalTypeEnum.SANITARYFOUNTAIN +toiletpan = IfcSanitaryTerminalTypeEnum.TOILETPAN +urinal = IfcSanitaryTerminalTypeEnum.URINAL +washhandbasin = IfcSanitaryTerminalTypeEnum.WASHHANDBASIN +wcseat = IfcSanitaryTerminalTypeEnum.WCSEAT +userdefined = IfcSanitaryTerminalTypeEnum.USERDEFINED +notdefined = IfcSanitaryTerminalTypeEnum.NOTDEFINED IfcSectionTypeEnum = enum_namespace() -uniform = express_getattr(IfcSectionTypeEnum, 'UNIFORM', INDETERMINATE) -tapered = express_getattr(IfcSectionTypeEnum, 'TAPERED', INDETERMINATE) +uniform = IfcSectionTypeEnum.UNIFORM +tapered = IfcSectionTypeEnum.TAPERED IfcSensorTypeEnum = enum_namespace() -cosensor = express_getattr(IfcSensorTypeEnum, 'COSENSOR', INDETERMINATE) -co2sensor = express_getattr(IfcSensorTypeEnum, 'CO2SENSOR', INDETERMINATE) -conductancesensor = express_getattr(IfcSensorTypeEnum, 'CONDUCTANCESENSOR', INDETERMINATE) -contactsensor = express_getattr(IfcSensorTypeEnum, 'CONTACTSENSOR', INDETERMINATE) -firesensor = express_getattr(IfcSensorTypeEnum, 'FIRESENSOR', INDETERMINATE) -flowsensor = express_getattr(IfcSensorTypeEnum, 'FLOWSENSOR', INDETERMINATE) -frostsensor = express_getattr(IfcSensorTypeEnum, 'FROSTSENSOR', INDETERMINATE) -gassensor = express_getattr(IfcSensorTypeEnum, 'GASSENSOR', INDETERMINATE) -heatsensor = express_getattr(IfcSensorTypeEnum, 'HEATSENSOR', INDETERMINATE) -humiditysensor = express_getattr(IfcSensorTypeEnum, 'HUMIDITYSENSOR', INDETERMINATE) -identifiersensor = express_getattr(IfcSensorTypeEnum, 'IDENTIFIERSENSOR', INDETERMINATE) -ionconcentrationsensor = express_getattr(IfcSensorTypeEnum, 'IONCONCENTRATIONSENSOR', INDETERMINATE) -levelsensor = express_getattr(IfcSensorTypeEnum, 'LEVELSENSOR', INDETERMINATE) -lightsensor = express_getattr(IfcSensorTypeEnum, 'LIGHTSENSOR', INDETERMINATE) -moisturesensor = express_getattr(IfcSensorTypeEnum, 'MOISTURESENSOR', INDETERMINATE) -movementsensor = express_getattr(IfcSensorTypeEnum, 'MOVEMENTSENSOR', INDETERMINATE) -phsensor = express_getattr(IfcSensorTypeEnum, 'PHSENSOR', INDETERMINATE) -pressuresensor = express_getattr(IfcSensorTypeEnum, 'PRESSURESENSOR', INDETERMINATE) -radiationsensor = express_getattr(IfcSensorTypeEnum, 'RADIATIONSENSOR', INDETERMINATE) -radioactivitysensor = express_getattr(IfcSensorTypeEnum, 'RADIOACTIVITYSENSOR', INDETERMINATE) -smokesensor = express_getattr(IfcSensorTypeEnum, 'SMOKESENSOR', INDETERMINATE) -soundsensor = express_getattr(IfcSensorTypeEnum, 'SOUNDSENSOR', INDETERMINATE) -temperaturesensor = express_getattr(IfcSensorTypeEnum, 'TEMPERATURESENSOR', INDETERMINATE) -windsensor = express_getattr(IfcSensorTypeEnum, 'WINDSENSOR', INDETERMINATE) -earthquakesensor = express_getattr(IfcSensorTypeEnum, 'EARTHQUAKESENSOR', INDETERMINATE) -foreignobjectdetectionsensor = express_getattr(IfcSensorTypeEnum, 'FOREIGNOBJECTDETECTIONSENSOR', INDETERMINATE) -obstaclesensor = express_getattr(IfcSensorTypeEnum, 'OBSTACLESENSOR', INDETERMINATE) -rainsensor = express_getattr(IfcSensorTypeEnum, 'RAINSENSOR', INDETERMINATE) -snowdepthsensor = express_getattr(IfcSensorTypeEnum, 'SNOWDEPTHSENSOR', INDETERMINATE) -trainsensor = express_getattr(IfcSensorTypeEnum, 'TRAINSENSOR', INDETERMINATE) -turnoutclosuresensor = express_getattr(IfcSensorTypeEnum, 'TURNOUTCLOSURESENSOR', INDETERMINATE) -wheelsensor = express_getattr(IfcSensorTypeEnum, 'WHEELSENSOR', INDETERMINATE) -userdefined = express_getattr(IfcSensorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSensorTypeEnum, 'NOTDEFINED', INDETERMINATE) +cosensor = IfcSensorTypeEnum.COSENSOR +co2sensor = IfcSensorTypeEnum.CO2SENSOR +conductancesensor = IfcSensorTypeEnum.CONDUCTANCESENSOR +contactsensor = IfcSensorTypeEnum.CONTACTSENSOR +firesensor = IfcSensorTypeEnum.FIRESENSOR +flowsensor = IfcSensorTypeEnum.FLOWSENSOR +frostsensor = IfcSensorTypeEnum.FROSTSENSOR +gassensor = IfcSensorTypeEnum.GASSENSOR +heatsensor = IfcSensorTypeEnum.HEATSENSOR +humiditysensor = IfcSensorTypeEnum.HUMIDITYSENSOR +identifiersensor = IfcSensorTypeEnum.IDENTIFIERSENSOR +ionconcentrationsensor = IfcSensorTypeEnum.IONCONCENTRATIONSENSOR +levelsensor = IfcSensorTypeEnum.LEVELSENSOR +lightsensor = IfcSensorTypeEnum.LIGHTSENSOR +moisturesensor = IfcSensorTypeEnum.MOISTURESENSOR +movementsensor = IfcSensorTypeEnum.MOVEMENTSENSOR +phsensor = IfcSensorTypeEnum.PHSENSOR +pressuresensor = IfcSensorTypeEnum.PRESSURESENSOR +radiationsensor = IfcSensorTypeEnum.RADIATIONSENSOR +radioactivitysensor = IfcSensorTypeEnum.RADIOACTIVITYSENSOR +smokesensor = IfcSensorTypeEnum.SMOKESENSOR +soundsensor = IfcSensorTypeEnum.SOUNDSENSOR +temperaturesensor = IfcSensorTypeEnum.TEMPERATURESENSOR +windsensor = IfcSensorTypeEnum.WINDSENSOR +earthquakesensor = IfcSensorTypeEnum.EARTHQUAKESENSOR +foreignobjectdetectionsensor = IfcSensorTypeEnum.FOREIGNOBJECTDETECTIONSENSOR +obstaclesensor = IfcSensorTypeEnum.OBSTACLESENSOR +rainsensor = IfcSensorTypeEnum.RAINSENSOR +snowdepthsensor = IfcSensorTypeEnum.SNOWDEPTHSENSOR +trainsensor = IfcSensorTypeEnum.TRAINSENSOR +turnoutclosuresensor = IfcSensorTypeEnum.TURNOUTCLOSURESENSOR +wheelsensor = IfcSensorTypeEnum.WHEELSENSOR +userdefined = IfcSensorTypeEnum.USERDEFINED +notdefined = IfcSensorTypeEnum.NOTDEFINED IfcSequenceEnum = enum_namespace() -start_start = express_getattr(IfcSequenceEnum, 'START_START', INDETERMINATE) -start_finish = express_getattr(IfcSequenceEnum, 'START_FINISH', INDETERMINATE) -finish_start = express_getattr(IfcSequenceEnum, 'FINISH_START', INDETERMINATE) -finish_finish = express_getattr(IfcSequenceEnum, 'FINISH_FINISH', INDETERMINATE) -userdefined = express_getattr(IfcSequenceEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSequenceEnum, 'NOTDEFINED', INDETERMINATE) +start_start = IfcSequenceEnum.START_START +start_finish = IfcSequenceEnum.START_FINISH +finish_start = IfcSequenceEnum.FINISH_START +finish_finish = IfcSequenceEnum.FINISH_FINISH +userdefined = IfcSequenceEnum.USERDEFINED +notdefined = IfcSequenceEnum.NOTDEFINED IfcShadingDeviceTypeEnum = enum_namespace() -jalousie = express_getattr(IfcShadingDeviceTypeEnum, 'JALOUSIE', INDETERMINATE) -shutter = express_getattr(IfcShadingDeviceTypeEnum, 'SHUTTER', INDETERMINATE) -awning = express_getattr(IfcShadingDeviceTypeEnum, 'AWNING', INDETERMINATE) -userdefined = express_getattr(IfcShadingDeviceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcShadingDeviceTypeEnum, 'NOTDEFINED', INDETERMINATE) +jalousie = IfcShadingDeviceTypeEnum.JALOUSIE +shutter = IfcShadingDeviceTypeEnum.SHUTTER +awning = IfcShadingDeviceTypeEnum.AWNING +userdefined = IfcShadingDeviceTypeEnum.USERDEFINED +notdefined = IfcShadingDeviceTypeEnum.NOTDEFINED IfcSignTypeEnum = enum_namespace() -marker = express_getattr(IfcSignTypeEnum, 'MARKER', INDETERMINATE) -pictoral = express_getattr(IfcSignTypeEnum, 'PICTORAL', INDETERMINATE) -mirror = express_getattr(IfcSignTypeEnum, 'MIRROR', INDETERMINATE) -userdefined = express_getattr(IfcSignTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSignTypeEnum, 'NOTDEFINED', INDETERMINATE) +marker = IfcSignTypeEnum.MARKER +pictoral = IfcSignTypeEnum.PICTORAL +mirror = IfcSignTypeEnum.MIRROR +userdefined = IfcSignTypeEnum.USERDEFINED +notdefined = IfcSignTypeEnum.NOTDEFINED IfcSignalTypeEnum = enum_namespace() -visual = express_getattr(IfcSignalTypeEnum, 'VISUAL', INDETERMINATE) -audio = express_getattr(IfcSignalTypeEnum, 'AUDIO', INDETERMINATE) -mixed = express_getattr(IfcSignalTypeEnum, 'MIXED', INDETERMINATE) -userdefined = express_getattr(IfcSignalTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSignalTypeEnum, 'NOTDEFINED', INDETERMINATE) +visual = IfcSignalTypeEnum.VISUAL +audio = IfcSignalTypeEnum.AUDIO +mixed = IfcSignalTypeEnum.MIXED +userdefined = IfcSignalTypeEnum.USERDEFINED +notdefined = IfcSignalTypeEnum.NOTDEFINED IfcSimplePropertyTemplateTypeEnum = enum_namespace() -p_singlevalue = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'P_SINGLEVALUE', INDETERMINATE) -p_enumeratedvalue = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'P_ENUMERATEDVALUE', INDETERMINATE) -p_boundedvalue = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'P_BOUNDEDVALUE', INDETERMINATE) -p_listvalue = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'P_LISTVALUE', INDETERMINATE) -p_tablevalue = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'P_TABLEVALUE', INDETERMINATE) -p_referencevalue = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'P_REFERENCEVALUE', INDETERMINATE) -q_length = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'Q_LENGTH', INDETERMINATE) -q_area = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'Q_AREA', INDETERMINATE) -q_volume = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'Q_VOLUME', INDETERMINATE) -q_count = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'Q_COUNT', INDETERMINATE) -q_weight = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'Q_WEIGHT', INDETERMINATE) -q_time = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'Q_TIME', INDETERMINATE) +p_singlevalue = IfcSimplePropertyTemplateTypeEnum.P_SINGLEVALUE +p_enumeratedvalue = IfcSimplePropertyTemplateTypeEnum.P_ENUMERATEDVALUE +p_boundedvalue = IfcSimplePropertyTemplateTypeEnum.P_BOUNDEDVALUE +p_listvalue = IfcSimplePropertyTemplateTypeEnum.P_LISTVALUE +p_tablevalue = IfcSimplePropertyTemplateTypeEnum.P_TABLEVALUE +p_referencevalue = IfcSimplePropertyTemplateTypeEnum.P_REFERENCEVALUE +q_length = IfcSimplePropertyTemplateTypeEnum.Q_LENGTH +q_area = IfcSimplePropertyTemplateTypeEnum.Q_AREA +q_volume = IfcSimplePropertyTemplateTypeEnum.Q_VOLUME +q_count = IfcSimplePropertyTemplateTypeEnum.Q_COUNT +q_weight = IfcSimplePropertyTemplateTypeEnum.Q_WEIGHT +q_time = IfcSimplePropertyTemplateTypeEnum.Q_TIME IfcSlabTypeEnum = enum_namespace() -floor = express_getattr(IfcSlabTypeEnum, 'FLOOR', INDETERMINATE) -roof = express_getattr(IfcSlabTypeEnum, 'ROOF', INDETERMINATE) -landing = express_getattr(IfcSlabTypeEnum, 'LANDING', INDETERMINATE) -baseslab = express_getattr(IfcSlabTypeEnum, 'BASESLAB', INDETERMINATE) -approach_slab = express_getattr(IfcSlabTypeEnum, 'APPROACH_SLAB', INDETERMINATE) -paving = express_getattr(IfcSlabTypeEnum, 'PAVING', INDETERMINATE) -wearing = express_getattr(IfcSlabTypeEnum, 'WEARING', INDETERMINATE) -sidewalk = express_getattr(IfcSlabTypeEnum, 'SIDEWALK', INDETERMINATE) -trackslab = express_getattr(IfcSlabTypeEnum, 'TRACKSLAB', INDETERMINATE) -userdefined = express_getattr(IfcSlabTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSlabTypeEnum, 'NOTDEFINED', INDETERMINATE) +floor = IfcSlabTypeEnum.FLOOR +roof = IfcSlabTypeEnum.ROOF +landing = IfcSlabTypeEnum.LANDING +baseslab = IfcSlabTypeEnum.BASESLAB +approach_slab = IfcSlabTypeEnum.APPROACH_SLAB +paving = IfcSlabTypeEnum.PAVING +wearing = IfcSlabTypeEnum.WEARING +sidewalk = IfcSlabTypeEnum.SIDEWALK +trackslab = IfcSlabTypeEnum.TRACKSLAB +userdefined = IfcSlabTypeEnum.USERDEFINED +notdefined = IfcSlabTypeEnum.NOTDEFINED IfcSolarDeviceTypeEnum = enum_namespace() -solarcollector = express_getattr(IfcSolarDeviceTypeEnum, 'SOLARCOLLECTOR', INDETERMINATE) -solarpanel = express_getattr(IfcSolarDeviceTypeEnum, 'SOLARPANEL', INDETERMINATE) -userdefined = express_getattr(IfcSolarDeviceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSolarDeviceTypeEnum, 'NOTDEFINED', INDETERMINATE) +solarcollector = IfcSolarDeviceTypeEnum.SOLARCOLLECTOR +solarpanel = IfcSolarDeviceTypeEnum.SOLARPANEL +userdefined = IfcSolarDeviceTypeEnum.USERDEFINED +notdefined = IfcSolarDeviceTypeEnum.NOTDEFINED IfcSpaceHeaterTypeEnum = enum_namespace() -convector = express_getattr(IfcSpaceHeaterTypeEnum, 'CONVECTOR', INDETERMINATE) -radiator = express_getattr(IfcSpaceHeaterTypeEnum, 'RADIATOR', INDETERMINATE) -userdefined = express_getattr(IfcSpaceHeaterTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSpaceHeaterTypeEnum, 'NOTDEFINED', INDETERMINATE) +convector = IfcSpaceHeaterTypeEnum.CONVECTOR +radiator = IfcSpaceHeaterTypeEnum.RADIATOR +userdefined = IfcSpaceHeaterTypeEnum.USERDEFINED +notdefined = IfcSpaceHeaterTypeEnum.NOTDEFINED IfcSpaceTypeEnum = enum_namespace() -space = express_getattr(IfcSpaceTypeEnum, 'SPACE', INDETERMINATE) -parking = express_getattr(IfcSpaceTypeEnum, 'PARKING', INDETERMINATE) -gfa = express_getattr(IfcSpaceTypeEnum, 'GFA', INDETERMINATE) -internal = express_getattr(IfcSpaceTypeEnum, 'INTERNAL', INDETERMINATE) -external = express_getattr(IfcSpaceTypeEnum, 'EXTERNAL', INDETERMINATE) -berth = express_getattr(IfcSpaceTypeEnum, 'BERTH', INDETERMINATE) -userdefined = express_getattr(IfcSpaceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSpaceTypeEnum, 'NOTDEFINED', INDETERMINATE) +space = IfcSpaceTypeEnum.SPACE +parking = IfcSpaceTypeEnum.PARKING +gfa = IfcSpaceTypeEnum.GFA +internal = IfcSpaceTypeEnum.INTERNAL +external = IfcSpaceTypeEnum.EXTERNAL +berth = IfcSpaceTypeEnum.BERTH +userdefined = IfcSpaceTypeEnum.USERDEFINED +notdefined = IfcSpaceTypeEnum.NOTDEFINED IfcSpatialZoneTypeEnum = enum_namespace() -construction = express_getattr(IfcSpatialZoneTypeEnum, 'CONSTRUCTION', INDETERMINATE) -firesafety = express_getattr(IfcSpatialZoneTypeEnum, 'FIRESAFETY', INDETERMINATE) -lighting = express_getattr(IfcSpatialZoneTypeEnum, 'LIGHTING', INDETERMINATE) -occupancy = express_getattr(IfcSpatialZoneTypeEnum, 'OCCUPANCY', INDETERMINATE) -security = express_getattr(IfcSpatialZoneTypeEnum, 'SECURITY', INDETERMINATE) -thermal = express_getattr(IfcSpatialZoneTypeEnum, 'THERMAL', INDETERMINATE) -transport = express_getattr(IfcSpatialZoneTypeEnum, 'TRANSPORT', INDETERMINATE) -ventilation = express_getattr(IfcSpatialZoneTypeEnum, 'VENTILATION', INDETERMINATE) -reservation = express_getattr(IfcSpatialZoneTypeEnum, 'RESERVATION', INDETERMINATE) -interference = express_getattr(IfcSpatialZoneTypeEnum, 'INTERFERENCE', INDETERMINATE) -userdefined = express_getattr(IfcSpatialZoneTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSpatialZoneTypeEnum, 'NOTDEFINED', INDETERMINATE) +construction = IfcSpatialZoneTypeEnum.CONSTRUCTION +firesafety = IfcSpatialZoneTypeEnum.FIRESAFETY +lighting = IfcSpatialZoneTypeEnum.LIGHTING +occupancy = IfcSpatialZoneTypeEnum.OCCUPANCY +security = IfcSpatialZoneTypeEnum.SECURITY +thermal = IfcSpatialZoneTypeEnum.THERMAL +transport = IfcSpatialZoneTypeEnum.TRANSPORT +ventilation = IfcSpatialZoneTypeEnum.VENTILATION +reservation = IfcSpatialZoneTypeEnum.RESERVATION +interference = IfcSpatialZoneTypeEnum.INTERFERENCE +userdefined = IfcSpatialZoneTypeEnum.USERDEFINED +notdefined = IfcSpatialZoneTypeEnum.NOTDEFINED IfcStackTerminalTypeEnum = enum_namespace() -birdcage = express_getattr(IfcStackTerminalTypeEnum, 'BIRDCAGE', INDETERMINATE) -cowl = express_getattr(IfcStackTerminalTypeEnum, 'COWL', INDETERMINATE) -rainwaterhopper = express_getattr(IfcStackTerminalTypeEnum, 'RAINWATERHOPPER', INDETERMINATE) -userdefined = express_getattr(IfcStackTerminalTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcStackTerminalTypeEnum, 'NOTDEFINED', INDETERMINATE) +birdcage = IfcStackTerminalTypeEnum.BIRDCAGE +cowl = IfcStackTerminalTypeEnum.COWL +rainwaterhopper = IfcStackTerminalTypeEnum.RAINWATERHOPPER +userdefined = IfcStackTerminalTypeEnum.USERDEFINED +notdefined = IfcStackTerminalTypeEnum.NOTDEFINED IfcStairFlightTypeEnum = enum_namespace() -straight = express_getattr(IfcStairFlightTypeEnum, 'STRAIGHT', INDETERMINATE) -winder = express_getattr(IfcStairFlightTypeEnum, 'WINDER', INDETERMINATE) -spiral = express_getattr(IfcStairFlightTypeEnum, 'SPIRAL', INDETERMINATE) -curved = express_getattr(IfcStairFlightTypeEnum, 'CURVED', INDETERMINATE) -freeform = express_getattr(IfcStairFlightTypeEnum, 'FREEFORM', INDETERMINATE) -userdefined = express_getattr(IfcStairFlightTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcStairFlightTypeEnum, 'NOTDEFINED', INDETERMINATE) +straight = IfcStairFlightTypeEnum.STRAIGHT +winder = IfcStairFlightTypeEnum.WINDER +spiral = IfcStairFlightTypeEnum.SPIRAL +curved = IfcStairFlightTypeEnum.CURVED +freeform = IfcStairFlightTypeEnum.FREEFORM +userdefined = IfcStairFlightTypeEnum.USERDEFINED +notdefined = IfcStairFlightTypeEnum.NOTDEFINED IfcStairTypeEnum = enum_namespace() -straight_run_stair = express_getattr(IfcStairTypeEnum, 'STRAIGHT_RUN_STAIR', INDETERMINATE) -two_straight_run_stair = express_getattr(IfcStairTypeEnum, 'TWO_STRAIGHT_RUN_STAIR', INDETERMINATE) -quarter_winding_stair = express_getattr(IfcStairTypeEnum, 'QUARTER_WINDING_STAIR', INDETERMINATE) -quarter_turn_stair = express_getattr(IfcStairTypeEnum, 'QUARTER_TURN_STAIR', INDETERMINATE) -half_winding_stair = express_getattr(IfcStairTypeEnum, 'HALF_WINDING_STAIR', INDETERMINATE) -half_turn_stair = express_getattr(IfcStairTypeEnum, 'HALF_TURN_STAIR', INDETERMINATE) -two_quarter_winding_stair = express_getattr(IfcStairTypeEnum, 'TWO_QUARTER_WINDING_STAIR', INDETERMINATE) -two_quarter_turn_stair = express_getattr(IfcStairTypeEnum, 'TWO_QUARTER_TURN_STAIR', INDETERMINATE) -three_quarter_winding_stair = express_getattr(IfcStairTypeEnum, 'THREE_QUARTER_WINDING_STAIR', INDETERMINATE) -three_quarter_turn_stair = express_getattr(IfcStairTypeEnum, 'THREE_QUARTER_TURN_STAIR', INDETERMINATE) -spiral_stair = express_getattr(IfcStairTypeEnum, 'SPIRAL_STAIR', INDETERMINATE) -double_return_stair = express_getattr(IfcStairTypeEnum, 'DOUBLE_RETURN_STAIR', INDETERMINATE) -curved_run_stair = express_getattr(IfcStairTypeEnum, 'CURVED_RUN_STAIR', INDETERMINATE) -two_curved_run_stair = express_getattr(IfcStairTypeEnum, 'TWO_CURVED_RUN_STAIR', INDETERMINATE) -ladder = express_getattr(IfcStairTypeEnum, 'LADDER', INDETERMINATE) -userdefined = express_getattr(IfcStairTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcStairTypeEnum, 'NOTDEFINED', INDETERMINATE) +straight_run_stair = IfcStairTypeEnum.STRAIGHT_RUN_STAIR +two_straight_run_stair = IfcStairTypeEnum.TWO_STRAIGHT_RUN_STAIR +quarter_winding_stair = IfcStairTypeEnum.QUARTER_WINDING_STAIR +quarter_turn_stair = IfcStairTypeEnum.QUARTER_TURN_STAIR +half_winding_stair = IfcStairTypeEnum.HALF_WINDING_STAIR +half_turn_stair = IfcStairTypeEnum.HALF_TURN_STAIR +two_quarter_winding_stair = IfcStairTypeEnum.TWO_QUARTER_WINDING_STAIR +two_quarter_turn_stair = IfcStairTypeEnum.TWO_QUARTER_TURN_STAIR +three_quarter_winding_stair = IfcStairTypeEnum.THREE_QUARTER_WINDING_STAIR +three_quarter_turn_stair = IfcStairTypeEnum.THREE_QUARTER_TURN_STAIR +spiral_stair = IfcStairTypeEnum.SPIRAL_STAIR +double_return_stair = IfcStairTypeEnum.DOUBLE_RETURN_STAIR +curved_run_stair = IfcStairTypeEnum.CURVED_RUN_STAIR +two_curved_run_stair = IfcStairTypeEnum.TWO_CURVED_RUN_STAIR +ladder = IfcStairTypeEnum.LADDER +userdefined = IfcStairTypeEnum.USERDEFINED +notdefined = IfcStairTypeEnum.NOTDEFINED IfcStateEnum = enum_namespace() -readwrite = express_getattr(IfcStateEnum, 'READWRITE', INDETERMINATE) -readonly = express_getattr(IfcStateEnum, 'READONLY', INDETERMINATE) -locked = express_getattr(IfcStateEnum, 'LOCKED', INDETERMINATE) -readwritelocked = express_getattr(IfcStateEnum, 'READWRITELOCKED', INDETERMINATE) -readonlylocked = express_getattr(IfcStateEnum, 'READONLYLOCKED', INDETERMINATE) +readwrite = IfcStateEnum.READWRITE +readonly = IfcStateEnum.READONLY +locked = IfcStateEnum.LOCKED +readwritelocked = IfcStateEnum.READWRITELOCKED +readonlylocked = IfcStateEnum.READONLYLOCKED IfcStructuralCurveActivityTypeEnum = enum_namespace() -const = express_getattr(IfcStructuralCurveActivityTypeEnum, 'CONST', INDETERMINATE) -linear = express_getattr(IfcStructuralCurveActivityTypeEnum, 'LINEAR', INDETERMINATE) -polygonal = express_getattr(IfcStructuralCurveActivityTypeEnum, 'POLYGONAL', INDETERMINATE) -equidistant = express_getattr(IfcStructuralCurveActivityTypeEnum, 'EQUIDISTANT', INDETERMINATE) -sinus = express_getattr(IfcStructuralCurveActivityTypeEnum, 'SINUS', INDETERMINATE) -parabola = express_getattr(IfcStructuralCurveActivityTypeEnum, 'PARABOLA', INDETERMINATE) -discrete = express_getattr(IfcStructuralCurveActivityTypeEnum, 'DISCRETE', INDETERMINATE) -userdefined = express_getattr(IfcStructuralCurveActivityTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcStructuralCurveActivityTypeEnum, 'NOTDEFINED', INDETERMINATE) +const = IfcStructuralCurveActivityTypeEnum.CONST +linear = IfcStructuralCurveActivityTypeEnum.LINEAR +polygonal = IfcStructuralCurveActivityTypeEnum.POLYGONAL +equidistant = IfcStructuralCurveActivityTypeEnum.EQUIDISTANT +sinus = IfcStructuralCurveActivityTypeEnum.SINUS +parabola = IfcStructuralCurveActivityTypeEnum.PARABOLA +discrete = IfcStructuralCurveActivityTypeEnum.DISCRETE +userdefined = IfcStructuralCurveActivityTypeEnum.USERDEFINED +notdefined = IfcStructuralCurveActivityTypeEnum.NOTDEFINED IfcStructuralCurveMemberTypeEnum = enum_namespace() -rigid_joined_member = express_getattr(IfcStructuralCurveMemberTypeEnum, 'RIGID_JOINED_MEMBER', INDETERMINATE) -pin_joined_member = express_getattr(IfcStructuralCurveMemberTypeEnum, 'PIN_JOINED_MEMBER', INDETERMINATE) -cable = express_getattr(IfcStructuralCurveMemberTypeEnum, 'CABLE', INDETERMINATE) -tension_member = express_getattr(IfcStructuralCurveMemberTypeEnum, 'TENSION_MEMBER', INDETERMINATE) -compression_member = express_getattr(IfcStructuralCurveMemberTypeEnum, 'COMPRESSION_MEMBER', INDETERMINATE) -userdefined = express_getattr(IfcStructuralCurveMemberTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcStructuralCurveMemberTypeEnum, 'NOTDEFINED', INDETERMINATE) +rigid_joined_member = IfcStructuralCurveMemberTypeEnum.RIGID_JOINED_MEMBER +pin_joined_member = IfcStructuralCurveMemberTypeEnum.PIN_JOINED_MEMBER +cable = IfcStructuralCurveMemberTypeEnum.CABLE +tension_member = IfcStructuralCurveMemberTypeEnum.TENSION_MEMBER +compression_member = IfcStructuralCurveMemberTypeEnum.COMPRESSION_MEMBER +userdefined = IfcStructuralCurveMemberTypeEnum.USERDEFINED +notdefined = IfcStructuralCurveMemberTypeEnum.NOTDEFINED IfcStructuralSurfaceActivityTypeEnum = enum_namespace() -const = express_getattr(IfcStructuralSurfaceActivityTypeEnum, 'CONST', INDETERMINATE) -bilinear = express_getattr(IfcStructuralSurfaceActivityTypeEnum, 'BILINEAR', INDETERMINATE) -discrete = express_getattr(IfcStructuralSurfaceActivityTypeEnum, 'DISCRETE', INDETERMINATE) -isocontour = express_getattr(IfcStructuralSurfaceActivityTypeEnum, 'ISOCONTOUR', INDETERMINATE) -userdefined = express_getattr(IfcStructuralSurfaceActivityTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcStructuralSurfaceActivityTypeEnum, 'NOTDEFINED', INDETERMINATE) +const = IfcStructuralSurfaceActivityTypeEnum.CONST +bilinear = IfcStructuralSurfaceActivityTypeEnum.BILINEAR +discrete = IfcStructuralSurfaceActivityTypeEnum.DISCRETE +isocontour = IfcStructuralSurfaceActivityTypeEnum.ISOCONTOUR +userdefined = IfcStructuralSurfaceActivityTypeEnum.USERDEFINED +notdefined = IfcStructuralSurfaceActivityTypeEnum.NOTDEFINED IfcStructuralSurfaceMemberTypeEnum = enum_namespace() -bending_element = express_getattr(IfcStructuralSurfaceMemberTypeEnum, 'BENDING_ELEMENT', INDETERMINATE) -membrane_element = express_getattr(IfcStructuralSurfaceMemberTypeEnum, 'MEMBRANE_ELEMENT', INDETERMINATE) -shell = express_getattr(IfcStructuralSurfaceMemberTypeEnum, 'SHELL', INDETERMINATE) -userdefined = express_getattr(IfcStructuralSurfaceMemberTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcStructuralSurfaceMemberTypeEnum, 'NOTDEFINED', INDETERMINATE) +bending_element = IfcStructuralSurfaceMemberTypeEnum.BENDING_ELEMENT +membrane_element = IfcStructuralSurfaceMemberTypeEnum.MEMBRANE_ELEMENT +shell = IfcStructuralSurfaceMemberTypeEnum.SHELL +userdefined = IfcStructuralSurfaceMemberTypeEnum.USERDEFINED +notdefined = IfcStructuralSurfaceMemberTypeEnum.NOTDEFINED IfcSubContractResourceTypeEnum = enum_namespace() -purchase = express_getattr(IfcSubContractResourceTypeEnum, 'PURCHASE', INDETERMINATE) -work = express_getattr(IfcSubContractResourceTypeEnum, 'WORK', INDETERMINATE) -userdefined = express_getattr(IfcSubContractResourceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSubContractResourceTypeEnum, 'NOTDEFINED', INDETERMINATE) +purchase = IfcSubContractResourceTypeEnum.PURCHASE +work = IfcSubContractResourceTypeEnum.WORK +userdefined = IfcSubContractResourceTypeEnum.USERDEFINED +notdefined = IfcSubContractResourceTypeEnum.NOTDEFINED IfcSurfaceFeatureTypeEnum = enum_namespace() -mark = express_getattr(IfcSurfaceFeatureTypeEnum, 'MARK', INDETERMINATE) -tag = express_getattr(IfcSurfaceFeatureTypeEnum, 'TAG', INDETERMINATE) -treatment = express_getattr(IfcSurfaceFeatureTypeEnum, 'TREATMENT', INDETERMINATE) -defect = express_getattr(IfcSurfaceFeatureTypeEnum, 'DEFECT', INDETERMINATE) -hatchmarking = express_getattr(IfcSurfaceFeatureTypeEnum, 'HATCHMARKING', INDETERMINATE) -linemarking = express_getattr(IfcSurfaceFeatureTypeEnum, 'LINEMARKING', INDETERMINATE) -pavementsurfacemarking = express_getattr(IfcSurfaceFeatureTypeEnum, 'PAVEMENTSURFACEMARKING', INDETERMINATE) -symbolmarking = express_getattr(IfcSurfaceFeatureTypeEnum, 'SYMBOLMARKING', INDETERMINATE) -nonskidsurfacing = express_getattr(IfcSurfaceFeatureTypeEnum, 'NONSKIDSURFACING', INDETERMINATE) -rumblestrip = express_getattr(IfcSurfaceFeatureTypeEnum, 'RUMBLESTRIP', INDETERMINATE) -transverserumblestrip = express_getattr(IfcSurfaceFeatureTypeEnum, 'TRANSVERSERUMBLESTRIP', INDETERMINATE) -userdefined = express_getattr(IfcSurfaceFeatureTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSurfaceFeatureTypeEnum, 'NOTDEFINED', INDETERMINATE) +mark = IfcSurfaceFeatureTypeEnum.MARK +tag = IfcSurfaceFeatureTypeEnum.TAG +treatment = IfcSurfaceFeatureTypeEnum.TREATMENT +defect = IfcSurfaceFeatureTypeEnum.DEFECT +hatchmarking = IfcSurfaceFeatureTypeEnum.HATCHMARKING +linemarking = IfcSurfaceFeatureTypeEnum.LINEMARKING +pavementsurfacemarking = IfcSurfaceFeatureTypeEnum.PAVEMENTSURFACEMARKING +symbolmarking = IfcSurfaceFeatureTypeEnum.SYMBOLMARKING +nonskidsurfacing = IfcSurfaceFeatureTypeEnum.NONSKIDSURFACING +rumblestrip = IfcSurfaceFeatureTypeEnum.RUMBLESTRIP +transverserumblestrip = IfcSurfaceFeatureTypeEnum.TRANSVERSERUMBLESTRIP +userdefined = IfcSurfaceFeatureTypeEnum.USERDEFINED +notdefined = IfcSurfaceFeatureTypeEnum.NOTDEFINED IfcSurfaceSide = enum_namespace() -positive = express_getattr(IfcSurfaceSide, 'POSITIVE', INDETERMINATE) -negative = express_getattr(IfcSurfaceSide, 'NEGATIVE', INDETERMINATE) -both = express_getattr(IfcSurfaceSide, 'BOTH', INDETERMINATE) +positive = IfcSurfaceSide.POSITIVE +negative = IfcSurfaceSide.NEGATIVE +both = IfcSurfaceSide.BOTH IfcSwitchingDeviceTypeEnum = enum_namespace() -contactor = express_getattr(IfcSwitchingDeviceTypeEnum, 'CONTACTOR', INDETERMINATE) -dimmerswitch = express_getattr(IfcSwitchingDeviceTypeEnum, 'DIMMERSWITCH', INDETERMINATE) -emergencystop = express_getattr(IfcSwitchingDeviceTypeEnum, 'EMERGENCYSTOP', INDETERMINATE) -keypad = express_getattr(IfcSwitchingDeviceTypeEnum, 'KEYPAD', INDETERMINATE) -momentaryswitch = express_getattr(IfcSwitchingDeviceTypeEnum, 'MOMENTARYSWITCH', INDETERMINATE) -selectorswitch = express_getattr(IfcSwitchingDeviceTypeEnum, 'SELECTORSWITCH', INDETERMINATE) -starter = express_getattr(IfcSwitchingDeviceTypeEnum, 'STARTER', INDETERMINATE) -switchdisconnector = express_getattr(IfcSwitchingDeviceTypeEnum, 'SWITCHDISCONNECTOR', INDETERMINATE) -toggleswitch = express_getattr(IfcSwitchingDeviceTypeEnum, 'TOGGLESWITCH', INDETERMINATE) -relay = express_getattr(IfcSwitchingDeviceTypeEnum, 'RELAY', INDETERMINATE) -start_and_stop_equipment = express_getattr(IfcSwitchingDeviceTypeEnum, 'START_AND_STOP_EQUIPMENT', INDETERMINATE) -userdefined = express_getattr(IfcSwitchingDeviceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSwitchingDeviceTypeEnum, 'NOTDEFINED', INDETERMINATE) +contactor = IfcSwitchingDeviceTypeEnum.CONTACTOR +dimmerswitch = IfcSwitchingDeviceTypeEnum.DIMMERSWITCH +emergencystop = IfcSwitchingDeviceTypeEnum.EMERGENCYSTOP +keypad = IfcSwitchingDeviceTypeEnum.KEYPAD +momentaryswitch = IfcSwitchingDeviceTypeEnum.MOMENTARYSWITCH +selectorswitch = IfcSwitchingDeviceTypeEnum.SELECTORSWITCH +starter = IfcSwitchingDeviceTypeEnum.STARTER +switchdisconnector = IfcSwitchingDeviceTypeEnum.SWITCHDISCONNECTOR +toggleswitch = IfcSwitchingDeviceTypeEnum.TOGGLESWITCH +relay = IfcSwitchingDeviceTypeEnum.RELAY +start_and_stop_equipment = IfcSwitchingDeviceTypeEnum.START_AND_STOP_EQUIPMENT +userdefined = IfcSwitchingDeviceTypeEnum.USERDEFINED +notdefined = IfcSwitchingDeviceTypeEnum.NOTDEFINED IfcSystemFurnitureElementTypeEnum = enum_namespace() -panel = express_getattr(IfcSystemFurnitureElementTypeEnum, 'PANEL', INDETERMINATE) -worksurface = express_getattr(IfcSystemFurnitureElementTypeEnum, 'WORKSURFACE', INDETERMINATE) -subrack = express_getattr(IfcSystemFurnitureElementTypeEnum, 'SUBRACK', INDETERMINATE) -userdefined = express_getattr(IfcSystemFurnitureElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSystemFurnitureElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +panel = IfcSystemFurnitureElementTypeEnum.PANEL +worksurface = IfcSystemFurnitureElementTypeEnum.WORKSURFACE +subrack = IfcSystemFurnitureElementTypeEnum.SUBRACK +userdefined = IfcSystemFurnitureElementTypeEnum.USERDEFINED +notdefined = IfcSystemFurnitureElementTypeEnum.NOTDEFINED IfcTankTypeEnum = enum_namespace() -basin = express_getattr(IfcTankTypeEnum, 'BASIN', INDETERMINATE) -breakpressure = express_getattr(IfcTankTypeEnum, 'BREAKPRESSURE', INDETERMINATE) -expansion = express_getattr(IfcTankTypeEnum, 'EXPANSION', INDETERMINATE) -feedandexpansion = express_getattr(IfcTankTypeEnum, 'FEEDANDEXPANSION', INDETERMINATE) -pressurevessel = express_getattr(IfcTankTypeEnum, 'PRESSUREVESSEL', INDETERMINATE) -storage = express_getattr(IfcTankTypeEnum, 'STORAGE', INDETERMINATE) -vessel = express_getattr(IfcTankTypeEnum, 'VESSEL', INDETERMINATE) -oilretentiontray = express_getattr(IfcTankTypeEnum, 'OILRETENTIONTRAY', INDETERMINATE) -userdefined = express_getattr(IfcTankTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTankTypeEnum, 'NOTDEFINED', INDETERMINATE) +basin = IfcTankTypeEnum.BASIN +breakpressure = IfcTankTypeEnum.BREAKPRESSURE +expansion = IfcTankTypeEnum.EXPANSION +feedandexpansion = IfcTankTypeEnum.FEEDANDEXPANSION +pressurevessel = IfcTankTypeEnum.PRESSUREVESSEL +storage = IfcTankTypeEnum.STORAGE +vessel = IfcTankTypeEnum.VESSEL +oilretentiontray = IfcTankTypeEnum.OILRETENTIONTRAY +userdefined = IfcTankTypeEnum.USERDEFINED +notdefined = IfcTankTypeEnum.NOTDEFINED IfcTaskDurationEnum = enum_namespace() -elapsedtime = express_getattr(IfcTaskDurationEnum, 'ELAPSEDTIME', INDETERMINATE) -worktime = express_getattr(IfcTaskDurationEnum, 'WORKTIME', INDETERMINATE) -notdefined = express_getattr(IfcTaskDurationEnum, 'NOTDEFINED', INDETERMINATE) +elapsedtime = IfcTaskDurationEnum.ELAPSEDTIME +worktime = IfcTaskDurationEnum.WORKTIME +notdefined = IfcTaskDurationEnum.NOTDEFINED IfcTaskTypeEnum = enum_namespace() -attendance = express_getattr(IfcTaskTypeEnum, 'ATTENDANCE', INDETERMINATE) -construction = express_getattr(IfcTaskTypeEnum, 'CONSTRUCTION', INDETERMINATE) -demolition = express_getattr(IfcTaskTypeEnum, 'DEMOLITION', INDETERMINATE) -dismantle = express_getattr(IfcTaskTypeEnum, 'DISMANTLE', INDETERMINATE) -disposal = express_getattr(IfcTaskTypeEnum, 'DISPOSAL', INDETERMINATE) -installation = express_getattr(IfcTaskTypeEnum, 'INSTALLATION', INDETERMINATE) -logistic = express_getattr(IfcTaskTypeEnum, 'LOGISTIC', INDETERMINATE) -maintenance = express_getattr(IfcTaskTypeEnum, 'MAINTENANCE', INDETERMINATE) -move = express_getattr(IfcTaskTypeEnum, 'MOVE', INDETERMINATE) -operation = express_getattr(IfcTaskTypeEnum, 'OPERATION', INDETERMINATE) -removal = express_getattr(IfcTaskTypeEnum, 'REMOVAL', INDETERMINATE) -renovation = express_getattr(IfcTaskTypeEnum, 'RENOVATION', INDETERMINATE) -userdefined = express_getattr(IfcTaskTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTaskTypeEnum, 'NOTDEFINED', INDETERMINATE) +attendance = IfcTaskTypeEnum.ATTENDANCE +construction = IfcTaskTypeEnum.CONSTRUCTION +demolition = IfcTaskTypeEnum.DEMOLITION +dismantle = IfcTaskTypeEnum.DISMANTLE +disposal = IfcTaskTypeEnum.DISPOSAL +installation = IfcTaskTypeEnum.INSTALLATION +logistic = IfcTaskTypeEnum.LOGISTIC +maintenance = IfcTaskTypeEnum.MAINTENANCE +move = IfcTaskTypeEnum.MOVE +operation = IfcTaskTypeEnum.OPERATION +removal = IfcTaskTypeEnum.REMOVAL +renovation = IfcTaskTypeEnum.RENOVATION +userdefined = IfcTaskTypeEnum.USERDEFINED +notdefined = IfcTaskTypeEnum.NOTDEFINED IfcTendonAnchorTypeEnum = enum_namespace() -coupler = express_getattr(IfcTendonAnchorTypeEnum, 'COUPLER', INDETERMINATE) -fixed_end = express_getattr(IfcTendonAnchorTypeEnum, 'FIXED_END', INDETERMINATE) -tensioning_end = express_getattr(IfcTendonAnchorTypeEnum, 'TENSIONING_END', INDETERMINATE) -userdefined = express_getattr(IfcTendonAnchorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTendonAnchorTypeEnum, 'NOTDEFINED', INDETERMINATE) +coupler = IfcTendonAnchorTypeEnum.COUPLER +fixed_end = IfcTendonAnchorTypeEnum.FIXED_END +tensioning_end = IfcTendonAnchorTypeEnum.TENSIONING_END +userdefined = IfcTendonAnchorTypeEnum.USERDEFINED +notdefined = IfcTendonAnchorTypeEnum.NOTDEFINED IfcTendonConduitTypeEnum = enum_namespace() -duct = express_getattr(IfcTendonConduitTypeEnum, 'DUCT', INDETERMINATE) -coupler = express_getattr(IfcTendonConduitTypeEnum, 'COUPLER', INDETERMINATE) -grouting_duct = express_getattr(IfcTendonConduitTypeEnum, 'GROUTING_DUCT', INDETERMINATE) -trumpet = express_getattr(IfcTendonConduitTypeEnum, 'TRUMPET', INDETERMINATE) -diabolo = express_getattr(IfcTendonConduitTypeEnum, 'DIABOLO', INDETERMINATE) -userdefined = express_getattr(IfcTendonConduitTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTendonConduitTypeEnum, 'NOTDEFINED', INDETERMINATE) +duct = IfcTendonConduitTypeEnum.DUCT +coupler = IfcTendonConduitTypeEnum.COUPLER +grouting_duct = IfcTendonConduitTypeEnum.GROUTING_DUCT +trumpet = IfcTendonConduitTypeEnum.TRUMPET +diabolo = IfcTendonConduitTypeEnum.DIABOLO +userdefined = IfcTendonConduitTypeEnum.USERDEFINED +notdefined = IfcTendonConduitTypeEnum.NOTDEFINED IfcTendonTypeEnum = enum_namespace() -bar = express_getattr(IfcTendonTypeEnum, 'BAR', INDETERMINATE) -coated = express_getattr(IfcTendonTypeEnum, 'COATED', INDETERMINATE) -strand = express_getattr(IfcTendonTypeEnum, 'STRAND', INDETERMINATE) -wire = express_getattr(IfcTendonTypeEnum, 'WIRE', INDETERMINATE) -userdefined = express_getattr(IfcTendonTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTendonTypeEnum, 'NOTDEFINED', INDETERMINATE) +bar = IfcTendonTypeEnum.BAR +coated = IfcTendonTypeEnum.COATED +strand = IfcTendonTypeEnum.STRAND +wire = IfcTendonTypeEnum.WIRE +userdefined = IfcTendonTypeEnum.USERDEFINED +notdefined = IfcTendonTypeEnum.NOTDEFINED IfcTextPath = enum_namespace() -left = express_getattr(IfcTextPath, 'LEFT', INDETERMINATE) -right = express_getattr(IfcTextPath, 'RIGHT', INDETERMINATE) -up = express_getattr(IfcTextPath, 'UP', INDETERMINATE) -down = express_getattr(IfcTextPath, 'DOWN', INDETERMINATE) +left = IfcTextPath.LEFT +right = IfcTextPath.RIGHT +up = IfcTextPath.UP +down = IfcTextPath.DOWN IfcTimeSeriesDataTypeEnum = enum_namespace() -continuous = express_getattr(IfcTimeSeriesDataTypeEnum, 'CONTINUOUS', INDETERMINATE) -discrete = express_getattr(IfcTimeSeriesDataTypeEnum, 'DISCRETE', INDETERMINATE) -discretebinary = express_getattr(IfcTimeSeriesDataTypeEnum, 'DISCRETEBINARY', INDETERMINATE) -piecewisebinary = express_getattr(IfcTimeSeriesDataTypeEnum, 'PIECEWISEBINARY', INDETERMINATE) -piecewiseconstant = express_getattr(IfcTimeSeriesDataTypeEnum, 'PIECEWISECONSTANT', INDETERMINATE) -piecewisecontinuous = express_getattr(IfcTimeSeriesDataTypeEnum, 'PIECEWISECONTINUOUS', INDETERMINATE) -notdefined = express_getattr(IfcTimeSeriesDataTypeEnum, 'NOTDEFINED', INDETERMINATE) +continuous = IfcTimeSeriesDataTypeEnum.CONTINUOUS +discrete = IfcTimeSeriesDataTypeEnum.DISCRETE +discretebinary = IfcTimeSeriesDataTypeEnum.DISCRETEBINARY +piecewisebinary = IfcTimeSeriesDataTypeEnum.PIECEWISEBINARY +piecewiseconstant = IfcTimeSeriesDataTypeEnum.PIECEWISECONSTANT +piecewisecontinuous = IfcTimeSeriesDataTypeEnum.PIECEWISECONTINUOUS +notdefined = IfcTimeSeriesDataTypeEnum.NOTDEFINED IfcTrackElementTypeEnum = enum_namespace() -trackendofalignment = express_getattr(IfcTrackElementTypeEnum, 'TRACKENDOFALIGNMENT', INDETERMINATE) -blockingdevice = express_getattr(IfcTrackElementTypeEnum, 'BLOCKINGDEVICE', INDETERMINATE) -vehiclestop = express_getattr(IfcTrackElementTypeEnum, 'VEHICLESTOP', INDETERMINATE) -sleeper = express_getattr(IfcTrackElementTypeEnum, 'SLEEPER', INDETERMINATE) -half_set_of_blades = express_getattr(IfcTrackElementTypeEnum, 'HALF_SET_OF_BLADES', INDETERMINATE) -speedregulator = express_getattr(IfcTrackElementTypeEnum, 'SPEEDREGULATOR', INDETERMINATE) -derailer = express_getattr(IfcTrackElementTypeEnum, 'DERAILER', INDETERMINATE) -frog = express_getattr(IfcTrackElementTypeEnum, 'FROG', INDETERMINATE) -userdefined = express_getattr(IfcTrackElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTrackElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +trackendofalignment = IfcTrackElementTypeEnum.TRACKENDOFALIGNMENT +blockingdevice = IfcTrackElementTypeEnum.BLOCKINGDEVICE +vehiclestop = IfcTrackElementTypeEnum.VEHICLESTOP +sleeper = IfcTrackElementTypeEnum.SLEEPER +half_set_of_blades = IfcTrackElementTypeEnum.HALF_SET_OF_BLADES +speedregulator = IfcTrackElementTypeEnum.SPEEDREGULATOR +derailer = IfcTrackElementTypeEnum.DERAILER +frog = IfcTrackElementTypeEnum.FROG +userdefined = IfcTrackElementTypeEnum.USERDEFINED +notdefined = IfcTrackElementTypeEnum.NOTDEFINED IfcTransformerTypeEnum = enum_namespace() -current = express_getattr(IfcTransformerTypeEnum, 'CURRENT', INDETERMINATE) -frequency = express_getattr(IfcTransformerTypeEnum, 'FREQUENCY', INDETERMINATE) -inverter = express_getattr(IfcTransformerTypeEnum, 'INVERTER', INDETERMINATE) -rectifier = express_getattr(IfcTransformerTypeEnum, 'RECTIFIER', INDETERMINATE) -voltage = express_getattr(IfcTransformerTypeEnum, 'VOLTAGE', INDETERMINATE) -chopper = express_getattr(IfcTransformerTypeEnum, 'CHOPPER', INDETERMINATE) -combined = express_getattr(IfcTransformerTypeEnum, 'COMBINED', INDETERMINATE) -userdefined = express_getattr(IfcTransformerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTransformerTypeEnum, 'NOTDEFINED', INDETERMINATE) +current = IfcTransformerTypeEnum.CURRENT +frequency = IfcTransformerTypeEnum.FREQUENCY +inverter = IfcTransformerTypeEnum.INVERTER +rectifier = IfcTransformerTypeEnum.RECTIFIER +voltage = IfcTransformerTypeEnum.VOLTAGE +chopper = IfcTransformerTypeEnum.CHOPPER +combined = IfcTransformerTypeEnum.COMBINED +userdefined = IfcTransformerTypeEnum.USERDEFINED +notdefined = IfcTransformerTypeEnum.NOTDEFINED IfcTransitionCode = enum_namespace() -discontinuous = express_getattr(IfcTransitionCode, 'DISCONTINUOUS', INDETERMINATE) -continuous = express_getattr(IfcTransitionCode, 'CONTINUOUS', INDETERMINATE) -contsamegradient = express_getattr(IfcTransitionCode, 'CONTSAMEGRADIENT', INDETERMINATE) -contsamegradientsamecurvature = express_getattr(IfcTransitionCode, 'CONTSAMEGRADIENTSAMECURVATURE', INDETERMINATE) +discontinuous = IfcTransitionCode.DISCONTINUOUS +continuous = IfcTransitionCode.CONTINUOUS +contsamegradient = IfcTransitionCode.CONTSAMEGRADIENT +contsamegradientsamecurvature = IfcTransitionCode.CONTSAMEGRADIENTSAMECURVATURE IfcTransportElementFixedTypeEnum = enum_namespace() -elevator = express_getattr(IfcTransportElementFixedTypeEnum, 'ELEVATOR', INDETERMINATE) -escalator = express_getattr(IfcTransportElementFixedTypeEnum, 'ESCALATOR', INDETERMINATE) -movingwalkway = express_getattr(IfcTransportElementFixedTypeEnum, 'MOVINGWALKWAY', INDETERMINATE) -craneway = express_getattr(IfcTransportElementFixedTypeEnum, 'CRANEWAY', INDETERMINATE) -liftinggear = express_getattr(IfcTransportElementFixedTypeEnum, 'LIFTINGGEAR', INDETERMINATE) -haulinggear = express_getattr(IfcTransportElementFixedTypeEnum, 'HAULINGGEAR', INDETERMINATE) -userdefined = express_getattr(IfcTransportElementFixedTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTransportElementFixedTypeEnum, 'NOTDEFINED', INDETERMINATE) +elevator = IfcTransportElementFixedTypeEnum.ELEVATOR +escalator = IfcTransportElementFixedTypeEnum.ESCALATOR +movingwalkway = IfcTransportElementFixedTypeEnum.MOVINGWALKWAY +craneway = IfcTransportElementFixedTypeEnum.CRANEWAY +liftinggear = IfcTransportElementFixedTypeEnum.LIFTINGGEAR +haulinggear = IfcTransportElementFixedTypeEnum.HAULINGGEAR +userdefined = IfcTransportElementFixedTypeEnum.USERDEFINED +notdefined = IfcTransportElementFixedTypeEnum.NOTDEFINED IfcTransportElementNonFixedTypeEnum = enum_namespace() -vehicle = express_getattr(IfcTransportElementNonFixedTypeEnum, 'VEHICLE', INDETERMINATE) -vehicletracked = express_getattr(IfcTransportElementNonFixedTypeEnum, 'VEHICLETRACKED', INDETERMINATE) -rollingstock = express_getattr(IfcTransportElementNonFixedTypeEnum, 'ROLLINGSTOCK', INDETERMINATE) -vehiclewheeled = express_getattr(IfcTransportElementNonFixedTypeEnum, 'VEHICLEWHEELED', INDETERMINATE) -vehicleair = express_getattr(IfcTransportElementNonFixedTypeEnum, 'VEHICLEAIR', INDETERMINATE) -cargo = express_getattr(IfcTransportElementNonFixedTypeEnum, 'CARGO', INDETERMINATE) -vehiclemarine = express_getattr(IfcTransportElementNonFixedTypeEnum, 'VEHICLEMARINE', INDETERMINATE) -userdefined = express_getattr(IfcTransportElementNonFixedTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTransportElementNonFixedTypeEnum, 'NOTDEFINED', INDETERMINATE) +vehicle = IfcTransportElementNonFixedTypeEnum.VEHICLE +vehicletracked = IfcTransportElementNonFixedTypeEnum.VEHICLETRACKED +rollingstock = IfcTransportElementNonFixedTypeEnum.ROLLINGSTOCK +vehiclewheeled = IfcTransportElementNonFixedTypeEnum.VEHICLEWHEELED +vehicleair = IfcTransportElementNonFixedTypeEnum.VEHICLEAIR +cargo = IfcTransportElementNonFixedTypeEnum.CARGO +vehiclemarine = IfcTransportElementNonFixedTypeEnum.VEHICLEMARINE +userdefined = IfcTransportElementNonFixedTypeEnum.USERDEFINED +notdefined = IfcTransportElementNonFixedTypeEnum.NOTDEFINED IfcTrimmingPreference = enum_namespace() -cartesian = express_getattr(IfcTrimmingPreference, 'CARTESIAN', INDETERMINATE) -parameter = express_getattr(IfcTrimmingPreference, 'PARAMETER', INDETERMINATE) -unspecified = express_getattr(IfcTrimmingPreference, 'UNSPECIFIED', INDETERMINATE) +cartesian = IfcTrimmingPreference.CARTESIAN +parameter = IfcTrimmingPreference.PARAMETER +unspecified = IfcTrimmingPreference.UNSPECIFIED IfcTubeBundleTypeEnum = enum_namespace() -finned = express_getattr(IfcTubeBundleTypeEnum, 'FINNED', INDETERMINATE) -userdefined = express_getattr(IfcTubeBundleTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTubeBundleTypeEnum, 'NOTDEFINED', INDETERMINATE) +finned = IfcTubeBundleTypeEnum.FINNED +userdefined = IfcTubeBundleTypeEnum.USERDEFINED +notdefined = IfcTubeBundleTypeEnum.NOTDEFINED IfcUnitEnum = enum_namespace() -absorbeddoseunit = express_getattr(IfcUnitEnum, 'ABSORBEDDOSEUNIT', INDETERMINATE) -amountofsubstanceunit = express_getattr(IfcUnitEnum, 'AMOUNTOFSUBSTANCEUNIT', INDETERMINATE) -areaunit = express_getattr(IfcUnitEnum, 'AREAUNIT', INDETERMINATE) -doseequivalentunit = express_getattr(IfcUnitEnum, 'DOSEEQUIVALENTUNIT', INDETERMINATE) -electriccapacitanceunit = express_getattr(IfcUnitEnum, 'ELECTRICCAPACITANCEUNIT', INDETERMINATE) -electricchargeunit = express_getattr(IfcUnitEnum, 'ELECTRICCHARGEUNIT', INDETERMINATE) -electricconductanceunit = express_getattr(IfcUnitEnum, 'ELECTRICCONDUCTANCEUNIT', INDETERMINATE) -electriccurrentunit = express_getattr(IfcUnitEnum, 'ELECTRICCURRENTUNIT', INDETERMINATE) -electricresistanceunit = express_getattr(IfcUnitEnum, 'ELECTRICRESISTANCEUNIT', INDETERMINATE) -electricvoltageunit = express_getattr(IfcUnitEnum, 'ELECTRICVOLTAGEUNIT', INDETERMINATE) -energyunit = express_getattr(IfcUnitEnum, 'ENERGYUNIT', INDETERMINATE) -forceunit = express_getattr(IfcUnitEnum, 'FORCEUNIT', INDETERMINATE) -frequencyunit = express_getattr(IfcUnitEnum, 'FREQUENCYUNIT', INDETERMINATE) -illuminanceunit = express_getattr(IfcUnitEnum, 'ILLUMINANCEUNIT', INDETERMINATE) -inductanceunit = express_getattr(IfcUnitEnum, 'INDUCTANCEUNIT', INDETERMINATE) -lengthunit = express_getattr(IfcUnitEnum, 'LENGTHUNIT', INDETERMINATE) -luminousfluxunit = express_getattr(IfcUnitEnum, 'LUMINOUSFLUXUNIT', INDETERMINATE) -luminousintensityunit = express_getattr(IfcUnitEnum, 'LUMINOUSINTENSITYUNIT', INDETERMINATE) -magneticfluxdensityunit = express_getattr(IfcUnitEnum, 'MAGNETICFLUXDENSITYUNIT', INDETERMINATE) -magneticfluxunit = express_getattr(IfcUnitEnum, 'MAGNETICFLUXUNIT', INDETERMINATE) -massunit = express_getattr(IfcUnitEnum, 'MASSUNIT', INDETERMINATE) -planeangleunit = express_getattr(IfcUnitEnum, 'PLANEANGLEUNIT', INDETERMINATE) -powerunit = express_getattr(IfcUnitEnum, 'POWERUNIT', INDETERMINATE) -pressureunit = express_getattr(IfcUnitEnum, 'PRESSUREUNIT', INDETERMINATE) -radioactivityunit = express_getattr(IfcUnitEnum, 'RADIOACTIVITYUNIT', INDETERMINATE) -solidangleunit = express_getattr(IfcUnitEnum, 'SOLIDANGLEUNIT', INDETERMINATE) -thermodynamictemperatureunit = express_getattr(IfcUnitEnum, 'THERMODYNAMICTEMPERATUREUNIT', INDETERMINATE) -timeunit = express_getattr(IfcUnitEnum, 'TIMEUNIT', INDETERMINATE) -volumeunit = express_getattr(IfcUnitEnum, 'VOLUMEUNIT', INDETERMINATE) -userdefined = express_getattr(IfcUnitEnum, 'USERDEFINED', INDETERMINATE) +absorbeddoseunit = IfcUnitEnum.ABSORBEDDOSEUNIT +amountofsubstanceunit = IfcUnitEnum.AMOUNTOFSUBSTANCEUNIT +areaunit = IfcUnitEnum.AREAUNIT +doseequivalentunit = IfcUnitEnum.DOSEEQUIVALENTUNIT +electriccapacitanceunit = IfcUnitEnum.ELECTRICCAPACITANCEUNIT +electricchargeunit = IfcUnitEnum.ELECTRICCHARGEUNIT +electricconductanceunit = IfcUnitEnum.ELECTRICCONDUCTANCEUNIT +electriccurrentunit = IfcUnitEnum.ELECTRICCURRENTUNIT +electricresistanceunit = IfcUnitEnum.ELECTRICRESISTANCEUNIT +electricvoltageunit = IfcUnitEnum.ELECTRICVOLTAGEUNIT +energyunit = IfcUnitEnum.ENERGYUNIT +forceunit = IfcUnitEnum.FORCEUNIT +frequencyunit = IfcUnitEnum.FREQUENCYUNIT +illuminanceunit = IfcUnitEnum.ILLUMINANCEUNIT +inductanceunit = IfcUnitEnum.INDUCTANCEUNIT +lengthunit = IfcUnitEnum.LENGTHUNIT +luminousfluxunit = IfcUnitEnum.LUMINOUSFLUXUNIT +luminousintensityunit = IfcUnitEnum.LUMINOUSINTENSITYUNIT +magneticfluxdensityunit = IfcUnitEnum.MAGNETICFLUXDENSITYUNIT +magneticfluxunit = IfcUnitEnum.MAGNETICFLUXUNIT +massunit = IfcUnitEnum.MASSUNIT +planeangleunit = IfcUnitEnum.PLANEANGLEUNIT +powerunit = IfcUnitEnum.POWERUNIT +pressureunit = IfcUnitEnum.PRESSUREUNIT +radioactivityunit = IfcUnitEnum.RADIOACTIVITYUNIT +solidangleunit = IfcUnitEnum.SOLIDANGLEUNIT +thermodynamictemperatureunit = IfcUnitEnum.THERMODYNAMICTEMPERATUREUNIT +timeunit = IfcUnitEnum.TIMEUNIT +volumeunit = IfcUnitEnum.VOLUMEUNIT +userdefined = IfcUnitEnum.USERDEFINED IfcUnitaryControlElementTypeEnum = enum_namespace() -alarmpanel = express_getattr(IfcUnitaryControlElementTypeEnum, 'ALARMPANEL', INDETERMINATE) -controlpanel = express_getattr(IfcUnitaryControlElementTypeEnum, 'CONTROLPANEL', INDETERMINATE) -gasdetectionpanel = express_getattr(IfcUnitaryControlElementTypeEnum, 'GASDETECTIONPANEL', INDETERMINATE) -indicatorpanel = express_getattr(IfcUnitaryControlElementTypeEnum, 'INDICATORPANEL', INDETERMINATE) -mimicpanel = express_getattr(IfcUnitaryControlElementTypeEnum, 'MIMICPANEL', INDETERMINATE) -humidistat = express_getattr(IfcUnitaryControlElementTypeEnum, 'HUMIDISTAT', INDETERMINATE) -thermostat = express_getattr(IfcUnitaryControlElementTypeEnum, 'THERMOSTAT', INDETERMINATE) -weatherstation = express_getattr(IfcUnitaryControlElementTypeEnum, 'WEATHERSTATION', INDETERMINATE) -combined = express_getattr(IfcUnitaryControlElementTypeEnum, 'COMBINED', INDETERMINATE) -basestationcontroller = express_getattr(IfcUnitaryControlElementTypeEnum, 'BASESTATIONCONTROLLER', INDETERMINATE) -userdefined = express_getattr(IfcUnitaryControlElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcUnitaryControlElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +alarmpanel = IfcUnitaryControlElementTypeEnum.ALARMPANEL +controlpanel = IfcUnitaryControlElementTypeEnum.CONTROLPANEL +gasdetectionpanel = IfcUnitaryControlElementTypeEnum.GASDETECTIONPANEL +indicatorpanel = IfcUnitaryControlElementTypeEnum.INDICATORPANEL +mimicpanel = IfcUnitaryControlElementTypeEnum.MIMICPANEL +humidistat = IfcUnitaryControlElementTypeEnum.HUMIDISTAT +thermostat = IfcUnitaryControlElementTypeEnum.THERMOSTAT +weatherstation = IfcUnitaryControlElementTypeEnum.WEATHERSTATION +combined = IfcUnitaryControlElementTypeEnum.COMBINED +basestationcontroller = IfcUnitaryControlElementTypeEnum.BASESTATIONCONTROLLER +userdefined = IfcUnitaryControlElementTypeEnum.USERDEFINED +notdefined = IfcUnitaryControlElementTypeEnum.NOTDEFINED IfcUnitaryEquipmentTypeEnum = enum_namespace() -airhandler = express_getattr(IfcUnitaryEquipmentTypeEnum, 'AIRHANDLER', INDETERMINATE) -airconditioningunit = express_getattr(IfcUnitaryEquipmentTypeEnum, 'AIRCONDITIONINGUNIT', INDETERMINATE) -dehumidifier = express_getattr(IfcUnitaryEquipmentTypeEnum, 'DEHUMIDIFIER', INDETERMINATE) -splitsystem = express_getattr(IfcUnitaryEquipmentTypeEnum, 'SPLITSYSTEM', INDETERMINATE) -rooftopunit = express_getattr(IfcUnitaryEquipmentTypeEnum, 'ROOFTOPUNIT', INDETERMINATE) -userdefined = express_getattr(IfcUnitaryEquipmentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcUnitaryEquipmentTypeEnum, 'NOTDEFINED', INDETERMINATE) +airhandler = IfcUnitaryEquipmentTypeEnum.AIRHANDLER +airconditioningunit = IfcUnitaryEquipmentTypeEnum.AIRCONDITIONINGUNIT +dehumidifier = IfcUnitaryEquipmentTypeEnum.DEHUMIDIFIER +splitsystem = IfcUnitaryEquipmentTypeEnum.SPLITSYSTEM +rooftopunit = IfcUnitaryEquipmentTypeEnum.ROOFTOPUNIT +userdefined = IfcUnitaryEquipmentTypeEnum.USERDEFINED +notdefined = IfcUnitaryEquipmentTypeEnum.NOTDEFINED IfcValveTypeEnum = enum_namespace() -airrelease = express_getattr(IfcValveTypeEnum, 'AIRRELEASE', INDETERMINATE) -antivacuum = express_getattr(IfcValveTypeEnum, 'ANTIVACUUM', INDETERMINATE) -changeover = express_getattr(IfcValveTypeEnum, 'CHANGEOVER', INDETERMINATE) -check = express_getattr(IfcValveTypeEnum, 'CHECK', INDETERMINATE) -commissioning = express_getattr(IfcValveTypeEnum, 'COMMISSIONING', INDETERMINATE) -diverting = express_getattr(IfcValveTypeEnum, 'DIVERTING', INDETERMINATE) -drawoffcock = express_getattr(IfcValveTypeEnum, 'DRAWOFFCOCK', INDETERMINATE) -doublecheck = express_getattr(IfcValveTypeEnum, 'DOUBLECHECK', INDETERMINATE) -doubleregulating = express_getattr(IfcValveTypeEnum, 'DOUBLEREGULATING', INDETERMINATE) -faucet = express_getattr(IfcValveTypeEnum, 'FAUCET', INDETERMINATE) -flushing = express_getattr(IfcValveTypeEnum, 'FLUSHING', INDETERMINATE) -gascock = express_getattr(IfcValveTypeEnum, 'GASCOCK', INDETERMINATE) -gastap = express_getattr(IfcValveTypeEnum, 'GASTAP', INDETERMINATE) -isolating = express_getattr(IfcValveTypeEnum, 'ISOLATING', INDETERMINATE) -mixing = express_getattr(IfcValveTypeEnum, 'MIXING', INDETERMINATE) -pressurereducing = express_getattr(IfcValveTypeEnum, 'PRESSUREREDUCING', INDETERMINATE) -pressurerelief = express_getattr(IfcValveTypeEnum, 'PRESSURERELIEF', INDETERMINATE) -regulating = express_getattr(IfcValveTypeEnum, 'REGULATING', INDETERMINATE) -safetycutoff = express_getattr(IfcValveTypeEnum, 'SAFETYCUTOFF', INDETERMINATE) -steamtrap = express_getattr(IfcValveTypeEnum, 'STEAMTRAP', INDETERMINATE) -stopcock = express_getattr(IfcValveTypeEnum, 'STOPCOCK', INDETERMINATE) -userdefined = express_getattr(IfcValveTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcValveTypeEnum, 'NOTDEFINED', INDETERMINATE) +airrelease = IfcValveTypeEnum.AIRRELEASE +antivacuum = IfcValveTypeEnum.ANTIVACUUM +changeover = IfcValveTypeEnum.CHANGEOVER +check = IfcValveTypeEnum.CHECK +commissioning = IfcValveTypeEnum.COMMISSIONING +diverting = IfcValveTypeEnum.DIVERTING +drawoffcock = IfcValveTypeEnum.DRAWOFFCOCK +doublecheck = IfcValveTypeEnum.DOUBLECHECK +doubleregulating = IfcValveTypeEnum.DOUBLEREGULATING +faucet = IfcValveTypeEnum.FAUCET +flushing = IfcValveTypeEnum.FLUSHING +gascock = IfcValveTypeEnum.GASCOCK +gastap = IfcValveTypeEnum.GASTAP +isolating = IfcValveTypeEnum.ISOLATING +mixing = IfcValveTypeEnum.MIXING +pressurereducing = IfcValveTypeEnum.PRESSUREREDUCING +pressurerelief = IfcValveTypeEnum.PRESSURERELIEF +regulating = IfcValveTypeEnum.REGULATING +safetycutoff = IfcValveTypeEnum.SAFETYCUTOFF +steamtrap = IfcValveTypeEnum.STEAMTRAP +stopcock = IfcValveTypeEnum.STOPCOCK +userdefined = IfcValveTypeEnum.USERDEFINED +notdefined = IfcValveTypeEnum.NOTDEFINED IfcVibrationDamperTypeEnum = enum_namespace() -bending_yield = express_getattr(IfcVibrationDamperTypeEnum, 'BENDING_YIELD', INDETERMINATE) -shear_yield = express_getattr(IfcVibrationDamperTypeEnum, 'SHEAR_YIELD', INDETERMINATE) -axial_yield = express_getattr(IfcVibrationDamperTypeEnum, 'AXIAL_YIELD', INDETERMINATE) -friction = express_getattr(IfcVibrationDamperTypeEnum, 'FRICTION', INDETERMINATE) -viscous = express_getattr(IfcVibrationDamperTypeEnum, 'VISCOUS', INDETERMINATE) -rubber = express_getattr(IfcVibrationDamperTypeEnum, 'RUBBER', INDETERMINATE) -userdefined = express_getattr(IfcVibrationDamperTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcVibrationDamperTypeEnum, 'NOTDEFINED', INDETERMINATE) +bending_yield = IfcVibrationDamperTypeEnum.BENDING_YIELD +shear_yield = IfcVibrationDamperTypeEnum.SHEAR_YIELD +axial_yield = IfcVibrationDamperTypeEnum.AXIAL_YIELD +friction = IfcVibrationDamperTypeEnum.FRICTION +viscous = IfcVibrationDamperTypeEnum.VISCOUS +rubber = IfcVibrationDamperTypeEnum.RUBBER +userdefined = IfcVibrationDamperTypeEnum.USERDEFINED +notdefined = IfcVibrationDamperTypeEnum.NOTDEFINED IfcVibrationIsolatorTypeEnum = enum_namespace() -compression = express_getattr(IfcVibrationIsolatorTypeEnum, 'COMPRESSION', INDETERMINATE) -spring = express_getattr(IfcVibrationIsolatorTypeEnum, 'SPRING', INDETERMINATE) -base = express_getattr(IfcVibrationIsolatorTypeEnum, 'BASE', INDETERMINATE) -userdefined = express_getattr(IfcVibrationIsolatorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcVibrationIsolatorTypeEnum, 'NOTDEFINED', INDETERMINATE) +compression = IfcVibrationIsolatorTypeEnum.COMPRESSION +spring = IfcVibrationIsolatorTypeEnum.SPRING +base = IfcVibrationIsolatorTypeEnum.BASE +userdefined = IfcVibrationIsolatorTypeEnum.USERDEFINED +notdefined = IfcVibrationIsolatorTypeEnum.NOTDEFINED IfcVoidingFeatureTypeEnum = enum_namespace() -cutout = express_getattr(IfcVoidingFeatureTypeEnum, 'CUTOUT', INDETERMINATE) -notch = express_getattr(IfcVoidingFeatureTypeEnum, 'NOTCH', INDETERMINATE) -hole = express_getattr(IfcVoidingFeatureTypeEnum, 'HOLE', INDETERMINATE) -miter = express_getattr(IfcVoidingFeatureTypeEnum, 'MITER', INDETERMINATE) -chamfer = express_getattr(IfcVoidingFeatureTypeEnum, 'CHAMFER', INDETERMINATE) -edge = express_getattr(IfcVoidingFeatureTypeEnum, 'EDGE', INDETERMINATE) -userdefined = express_getattr(IfcVoidingFeatureTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcVoidingFeatureTypeEnum, 'NOTDEFINED', INDETERMINATE) +cutout = IfcVoidingFeatureTypeEnum.CUTOUT +notch = IfcVoidingFeatureTypeEnum.NOTCH +hole = IfcVoidingFeatureTypeEnum.HOLE +miter = IfcVoidingFeatureTypeEnum.MITER +chamfer = IfcVoidingFeatureTypeEnum.CHAMFER +edge = IfcVoidingFeatureTypeEnum.EDGE +userdefined = IfcVoidingFeatureTypeEnum.USERDEFINED +notdefined = IfcVoidingFeatureTypeEnum.NOTDEFINED IfcWallTypeEnum = enum_namespace() -movable = express_getattr(IfcWallTypeEnum, 'MOVABLE', INDETERMINATE) -parapet = express_getattr(IfcWallTypeEnum, 'PARAPET', INDETERMINATE) -partitioning = express_getattr(IfcWallTypeEnum, 'PARTITIONING', INDETERMINATE) -plumbingwall = express_getattr(IfcWallTypeEnum, 'PLUMBINGWALL', INDETERMINATE) -shear = express_getattr(IfcWallTypeEnum, 'SHEAR', INDETERMINATE) -solidwall = express_getattr(IfcWallTypeEnum, 'SOLIDWALL', INDETERMINATE) -standard = express_getattr(IfcWallTypeEnum, 'STANDARD', INDETERMINATE) -polygonal = express_getattr(IfcWallTypeEnum, 'POLYGONAL', INDETERMINATE) -elementedwall = express_getattr(IfcWallTypeEnum, 'ELEMENTEDWALL', INDETERMINATE) -retainingwall = express_getattr(IfcWallTypeEnum, 'RETAININGWALL', INDETERMINATE) -wavewall = express_getattr(IfcWallTypeEnum, 'WAVEWALL', INDETERMINATE) -userdefined = express_getattr(IfcWallTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcWallTypeEnum, 'NOTDEFINED', INDETERMINATE) +movable = IfcWallTypeEnum.MOVABLE +parapet = IfcWallTypeEnum.PARAPET +partitioning = IfcWallTypeEnum.PARTITIONING +plumbingwall = IfcWallTypeEnum.PLUMBINGWALL +shear = IfcWallTypeEnum.SHEAR +solidwall = IfcWallTypeEnum.SOLIDWALL +standard = IfcWallTypeEnum.STANDARD +polygonal = IfcWallTypeEnum.POLYGONAL +elementedwall = IfcWallTypeEnum.ELEMENTEDWALL +retainingwall = IfcWallTypeEnum.RETAININGWALL +wavewall = IfcWallTypeEnum.WAVEWALL +userdefined = IfcWallTypeEnum.USERDEFINED +notdefined = IfcWallTypeEnum.NOTDEFINED IfcWasteTerminalTypeEnum = enum_namespace() -floortrap = express_getattr(IfcWasteTerminalTypeEnum, 'FLOORTRAP', INDETERMINATE) -floorwaste = express_getattr(IfcWasteTerminalTypeEnum, 'FLOORWASTE', INDETERMINATE) -gullysump = express_getattr(IfcWasteTerminalTypeEnum, 'GULLYSUMP', INDETERMINATE) -gullytrap = express_getattr(IfcWasteTerminalTypeEnum, 'GULLYTRAP', INDETERMINATE) -roofdrain = express_getattr(IfcWasteTerminalTypeEnum, 'ROOFDRAIN', INDETERMINATE) -wastedisposalunit = express_getattr(IfcWasteTerminalTypeEnum, 'WASTEDISPOSALUNIT', INDETERMINATE) -wastetrap = express_getattr(IfcWasteTerminalTypeEnum, 'WASTETRAP', INDETERMINATE) -userdefined = express_getattr(IfcWasteTerminalTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcWasteTerminalTypeEnum, 'NOTDEFINED', INDETERMINATE) +floortrap = IfcWasteTerminalTypeEnum.FLOORTRAP +floorwaste = IfcWasteTerminalTypeEnum.FLOORWASTE +gullysump = IfcWasteTerminalTypeEnum.GULLYSUMP +gullytrap = IfcWasteTerminalTypeEnum.GULLYTRAP +roofdrain = IfcWasteTerminalTypeEnum.ROOFDRAIN +wastedisposalunit = IfcWasteTerminalTypeEnum.WASTEDISPOSALUNIT +wastetrap = IfcWasteTerminalTypeEnum.WASTETRAP +userdefined = IfcWasteTerminalTypeEnum.USERDEFINED +notdefined = IfcWasteTerminalTypeEnum.NOTDEFINED IfcWindowPanelOperationEnum = enum_namespace() -sidehungrighthand = express_getattr(IfcWindowPanelOperationEnum, 'SIDEHUNGRIGHTHAND', INDETERMINATE) -sidehunglefthand = express_getattr(IfcWindowPanelOperationEnum, 'SIDEHUNGLEFTHAND', INDETERMINATE) -tiltandturnrighthand = express_getattr(IfcWindowPanelOperationEnum, 'TILTANDTURNRIGHTHAND', INDETERMINATE) -tiltandturnlefthand = express_getattr(IfcWindowPanelOperationEnum, 'TILTANDTURNLEFTHAND', INDETERMINATE) -tophung = express_getattr(IfcWindowPanelOperationEnum, 'TOPHUNG', INDETERMINATE) -bottomhung = express_getattr(IfcWindowPanelOperationEnum, 'BOTTOMHUNG', INDETERMINATE) -pivothorizontal = express_getattr(IfcWindowPanelOperationEnum, 'PIVOTHORIZONTAL', INDETERMINATE) -pivotvertical = express_getattr(IfcWindowPanelOperationEnum, 'PIVOTVERTICAL', INDETERMINATE) -slidinghorizontal = express_getattr(IfcWindowPanelOperationEnum, 'SLIDINGHORIZONTAL', INDETERMINATE) -slidingvertical = express_getattr(IfcWindowPanelOperationEnum, 'SLIDINGVERTICAL', INDETERMINATE) -removablecasement = express_getattr(IfcWindowPanelOperationEnum, 'REMOVABLECASEMENT', INDETERMINATE) -fixedcasement = express_getattr(IfcWindowPanelOperationEnum, 'FIXEDCASEMENT', INDETERMINATE) -otheroperation = express_getattr(IfcWindowPanelOperationEnum, 'OTHEROPERATION', INDETERMINATE) -notdefined = express_getattr(IfcWindowPanelOperationEnum, 'NOTDEFINED', INDETERMINATE) +sidehungrighthand = IfcWindowPanelOperationEnum.SIDEHUNGRIGHTHAND +sidehunglefthand = IfcWindowPanelOperationEnum.SIDEHUNGLEFTHAND +tiltandturnrighthand = IfcWindowPanelOperationEnum.TILTANDTURNRIGHTHAND +tiltandturnlefthand = IfcWindowPanelOperationEnum.TILTANDTURNLEFTHAND +tophung = IfcWindowPanelOperationEnum.TOPHUNG +bottomhung = IfcWindowPanelOperationEnum.BOTTOMHUNG +pivothorizontal = IfcWindowPanelOperationEnum.PIVOTHORIZONTAL +pivotvertical = IfcWindowPanelOperationEnum.PIVOTVERTICAL +slidinghorizontal = IfcWindowPanelOperationEnum.SLIDINGHORIZONTAL +slidingvertical = IfcWindowPanelOperationEnum.SLIDINGVERTICAL +removablecasement = IfcWindowPanelOperationEnum.REMOVABLECASEMENT +fixedcasement = IfcWindowPanelOperationEnum.FIXEDCASEMENT +otheroperation = IfcWindowPanelOperationEnum.OTHEROPERATION +notdefined = IfcWindowPanelOperationEnum.NOTDEFINED IfcWindowPanelPositionEnum = enum_namespace() -left = express_getattr(IfcWindowPanelPositionEnum, 'LEFT', INDETERMINATE) -middle = express_getattr(IfcWindowPanelPositionEnum, 'MIDDLE', INDETERMINATE) -right = express_getattr(IfcWindowPanelPositionEnum, 'RIGHT', INDETERMINATE) -bottom = express_getattr(IfcWindowPanelPositionEnum, 'BOTTOM', INDETERMINATE) -top = express_getattr(IfcWindowPanelPositionEnum, 'TOP', INDETERMINATE) -notdefined = express_getattr(IfcWindowPanelPositionEnum, 'NOTDEFINED', INDETERMINATE) +left = IfcWindowPanelPositionEnum.LEFT +middle = IfcWindowPanelPositionEnum.MIDDLE +right = IfcWindowPanelPositionEnum.RIGHT +bottom = IfcWindowPanelPositionEnum.BOTTOM +top = IfcWindowPanelPositionEnum.TOP +notdefined = IfcWindowPanelPositionEnum.NOTDEFINED IfcWindowStyleConstructionEnum = enum_namespace() -aluminium = express_getattr(IfcWindowStyleConstructionEnum, 'ALUMINIUM', INDETERMINATE) -high_grade_steel = express_getattr(IfcWindowStyleConstructionEnum, 'HIGH_GRADE_STEEL', INDETERMINATE) -steel = express_getattr(IfcWindowStyleConstructionEnum, 'STEEL', INDETERMINATE) -wood = express_getattr(IfcWindowStyleConstructionEnum, 'WOOD', INDETERMINATE) -aluminium_wood = express_getattr(IfcWindowStyleConstructionEnum, 'ALUMINIUM_WOOD', INDETERMINATE) -plastic = express_getattr(IfcWindowStyleConstructionEnum, 'PLASTIC', INDETERMINATE) -other_construction = express_getattr(IfcWindowStyleConstructionEnum, 'OTHER_CONSTRUCTION', INDETERMINATE) -notdefined = express_getattr(IfcWindowStyleConstructionEnum, 'NOTDEFINED', INDETERMINATE) +aluminium = IfcWindowStyleConstructionEnum.ALUMINIUM +high_grade_steel = IfcWindowStyleConstructionEnum.HIGH_GRADE_STEEL +steel = IfcWindowStyleConstructionEnum.STEEL +wood = IfcWindowStyleConstructionEnum.WOOD +aluminium_wood = IfcWindowStyleConstructionEnum.ALUMINIUM_WOOD +plastic = IfcWindowStyleConstructionEnum.PLASTIC +other_construction = IfcWindowStyleConstructionEnum.OTHER_CONSTRUCTION +notdefined = IfcWindowStyleConstructionEnum.NOTDEFINED IfcWindowStyleOperationEnum = enum_namespace() -single_panel = express_getattr(IfcWindowStyleOperationEnum, 'SINGLE_PANEL', INDETERMINATE) -double_panel_vertical = express_getattr(IfcWindowStyleOperationEnum, 'DOUBLE_PANEL_VERTICAL', INDETERMINATE) -double_panel_horizontal = express_getattr(IfcWindowStyleOperationEnum, 'DOUBLE_PANEL_HORIZONTAL', INDETERMINATE) -triple_panel_vertical = express_getattr(IfcWindowStyleOperationEnum, 'TRIPLE_PANEL_VERTICAL', INDETERMINATE) -triple_panel_bottom = express_getattr(IfcWindowStyleOperationEnum, 'TRIPLE_PANEL_BOTTOM', INDETERMINATE) -triple_panel_top = express_getattr(IfcWindowStyleOperationEnum, 'TRIPLE_PANEL_TOP', INDETERMINATE) -triple_panel_left = express_getattr(IfcWindowStyleOperationEnum, 'TRIPLE_PANEL_LEFT', INDETERMINATE) -triple_panel_right = express_getattr(IfcWindowStyleOperationEnum, 'TRIPLE_PANEL_RIGHT', INDETERMINATE) -triple_panel_horizontal = express_getattr(IfcWindowStyleOperationEnum, 'TRIPLE_PANEL_HORIZONTAL', INDETERMINATE) -userdefined = express_getattr(IfcWindowStyleOperationEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcWindowStyleOperationEnum, 'NOTDEFINED', INDETERMINATE) +single_panel = IfcWindowStyleOperationEnum.SINGLE_PANEL +double_panel_vertical = IfcWindowStyleOperationEnum.DOUBLE_PANEL_VERTICAL +double_panel_horizontal = IfcWindowStyleOperationEnum.DOUBLE_PANEL_HORIZONTAL +triple_panel_vertical = IfcWindowStyleOperationEnum.TRIPLE_PANEL_VERTICAL +triple_panel_bottom = IfcWindowStyleOperationEnum.TRIPLE_PANEL_BOTTOM +triple_panel_top = IfcWindowStyleOperationEnum.TRIPLE_PANEL_TOP +triple_panel_left = IfcWindowStyleOperationEnum.TRIPLE_PANEL_LEFT +triple_panel_right = IfcWindowStyleOperationEnum.TRIPLE_PANEL_RIGHT +triple_panel_horizontal = IfcWindowStyleOperationEnum.TRIPLE_PANEL_HORIZONTAL +userdefined = IfcWindowStyleOperationEnum.USERDEFINED +notdefined = IfcWindowStyleOperationEnum.NOTDEFINED IfcWindowTypeEnum = enum_namespace() -window = express_getattr(IfcWindowTypeEnum, 'WINDOW', INDETERMINATE) -skylight = express_getattr(IfcWindowTypeEnum, 'SKYLIGHT', INDETERMINATE) -lightdome = express_getattr(IfcWindowTypeEnum, 'LIGHTDOME', INDETERMINATE) -userdefined = express_getattr(IfcWindowTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcWindowTypeEnum, 'NOTDEFINED', INDETERMINATE) +window = IfcWindowTypeEnum.WINDOW +skylight = IfcWindowTypeEnum.SKYLIGHT +lightdome = IfcWindowTypeEnum.LIGHTDOME +userdefined = IfcWindowTypeEnum.USERDEFINED +notdefined = IfcWindowTypeEnum.NOTDEFINED IfcWindowTypePartitioningEnum = enum_namespace() -single_panel = express_getattr(IfcWindowTypePartitioningEnum, 'SINGLE_PANEL', INDETERMINATE) -double_panel_vertical = express_getattr(IfcWindowTypePartitioningEnum, 'DOUBLE_PANEL_VERTICAL', INDETERMINATE) -double_panel_horizontal = express_getattr(IfcWindowTypePartitioningEnum, 'DOUBLE_PANEL_HORIZONTAL', INDETERMINATE) -triple_panel_vertical = express_getattr(IfcWindowTypePartitioningEnum, 'TRIPLE_PANEL_VERTICAL', INDETERMINATE) -triple_panel_bottom = express_getattr(IfcWindowTypePartitioningEnum, 'TRIPLE_PANEL_BOTTOM', INDETERMINATE) -triple_panel_top = express_getattr(IfcWindowTypePartitioningEnum, 'TRIPLE_PANEL_TOP', INDETERMINATE) -triple_panel_left = express_getattr(IfcWindowTypePartitioningEnum, 'TRIPLE_PANEL_LEFT', INDETERMINATE) -triple_panel_right = express_getattr(IfcWindowTypePartitioningEnum, 'TRIPLE_PANEL_RIGHT', INDETERMINATE) -triple_panel_horizontal = express_getattr(IfcWindowTypePartitioningEnum, 'TRIPLE_PANEL_HORIZONTAL', INDETERMINATE) -userdefined = express_getattr(IfcWindowTypePartitioningEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcWindowTypePartitioningEnum, 'NOTDEFINED', INDETERMINATE) +single_panel = IfcWindowTypePartitioningEnum.SINGLE_PANEL +double_panel_vertical = IfcWindowTypePartitioningEnum.DOUBLE_PANEL_VERTICAL +double_panel_horizontal = IfcWindowTypePartitioningEnum.DOUBLE_PANEL_HORIZONTAL +triple_panel_vertical = IfcWindowTypePartitioningEnum.TRIPLE_PANEL_VERTICAL +triple_panel_bottom = IfcWindowTypePartitioningEnum.TRIPLE_PANEL_BOTTOM +triple_panel_top = IfcWindowTypePartitioningEnum.TRIPLE_PANEL_TOP +triple_panel_left = IfcWindowTypePartitioningEnum.TRIPLE_PANEL_LEFT +triple_panel_right = IfcWindowTypePartitioningEnum.TRIPLE_PANEL_RIGHT +triple_panel_horizontal = IfcWindowTypePartitioningEnum.TRIPLE_PANEL_HORIZONTAL +userdefined = IfcWindowTypePartitioningEnum.USERDEFINED +notdefined = IfcWindowTypePartitioningEnum.NOTDEFINED IfcWorkCalendarTypeEnum = enum_namespace() -firstshift = express_getattr(IfcWorkCalendarTypeEnum, 'FIRSTSHIFT', INDETERMINATE) -secondshift = express_getattr(IfcWorkCalendarTypeEnum, 'SECONDSHIFT', INDETERMINATE) -thirdshift = express_getattr(IfcWorkCalendarTypeEnum, 'THIRDSHIFT', INDETERMINATE) -userdefined = express_getattr(IfcWorkCalendarTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcWorkCalendarTypeEnum, 'NOTDEFINED', INDETERMINATE) +firstshift = IfcWorkCalendarTypeEnum.FIRSTSHIFT +secondshift = IfcWorkCalendarTypeEnum.SECONDSHIFT +thirdshift = IfcWorkCalendarTypeEnum.THIRDSHIFT +userdefined = IfcWorkCalendarTypeEnum.USERDEFINED +notdefined = IfcWorkCalendarTypeEnum.NOTDEFINED IfcWorkPlanTypeEnum = enum_namespace() -actual = express_getattr(IfcWorkPlanTypeEnum, 'ACTUAL', INDETERMINATE) -baseline = express_getattr(IfcWorkPlanTypeEnum, 'BASELINE', INDETERMINATE) -planned = express_getattr(IfcWorkPlanTypeEnum, 'PLANNED', INDETERMINATE) -userdefined = express_getattr(IfcWorkPlanTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcWorkPlanTypeEnum, 'NOTDEFINED', INDETERMINATE) +actual = IfcWorkPlanTypeEnum.ACTUAL +baseline = IfcWorkPlanTypeEnum.BASELINE +planned = IfcWorkPlanTypeEnum.PLANNED +userdefined = IfcWorkPlanTypeEnum.USERDEFINED +notdefined = IfcWorkPlanTypeEnum.NOTDEFINED IfcWorkScheduleTypeEnum = enum_namespace() -actual = express_getattr(IfcWorkScheduleTypeEnum, 'ACTUAL', INDETERMINATE) -baseline = express_getattr(IfcWorkScheduleTypeEnum, 'BASELINE', INDETERMINATE) -planned = express_getattr(IfcWorkScheduleTypeEnum, 'PLANNED', INDETERMINATE) -userdefined = express_getattr(IfcWorkScheduleTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcWorkScheduleTypeEnum, 'NOTDEFINED', INDETERMINATE) +actual = IfcWorkScheduleTypeEnum.ACTUAL +baseline = IfcWorkScheduleTypeEnum.BASELINE +planned = IfcWorkScheduleTypeEnum.PLANNED +userdefined = IfcWorkScheduleTypeEnum.USERDEFINED +notdefined = IfcWorkScheduleTypeEnum.NOTDEFINED def IfcActionRequest(*args, **kwargs): return ifcopenshell.create_entity('IfcActionRequest', 'IFC4X3_RC4', *args, **kwargs) diff --git a/src/ifcopenshell-python/ifcopenshell/express/rules/IFC4X3_TC1.py b/src/ifcopenshell-python/ifcopenshell/express/rules/IFC4X3_TC1.py index ec18f39a936..ce2c064993f 100644 --- a/src/ifcopenshell-python/ifcopenshell/express/rules/IFC4X3_TC1.py +++ b/src/ifcopenshell-python/ifcopenshell/express/rules/IFC4X3_TC1.py @@ -1,5 +1,8 @@ import ifcopenshell +def is_indeterminate(v): + return v is None or type(v).__name__ == 'indeterminate_type' + def exists(v): if callable(v): try: @@ -7,10 +10,10 @@ def exists(v): except IndexError as e: return False else: - return v is not None + return not is_indeterminate(v) def nvl(v, default): - return v if v is not None else default + return v if not is_indeterminate(v) else default def is_entity(inst): if isinstance(inst, ifcopenshell.entity_instance): @@ -22,13 +25,13 @@ def is_entity(inst): def express_len(v): if isinstance(v, ifcopenshell.entity_instance) and (not is_entity(v)): v = v[0] - elif v is None or v is INDETERMINATE: + elif is_indeterminate(v): return INDETERMINATE return len(v) old_range = range def range(*args): - if INDETERMINATE in args: + if any(map(is_indeterminate, args)): return yield from old_range(*args) sizeof = express_len @@ -149,2361 +152,2361 @@ class enum_namespace: def __getattr__(self, k): return express_getattr(k, 'upper', INDETERMINATE)() IfcActionRequestTypeEnum = enum_namespace() -email = express_getattr(IfcActionRequestTypeEnum, 'EMAIL', INDETERMINATE) -fax = express_getattr(IfcActionRequestTypeEnum, 'FAX', INDETERMINATE) -phone = express_getattr(IfcActionRequestTypeEnum, 'PHONE', INDETERMINATE) -post = express_getattr(IfcActionRequestTypeEnum, 'POST', INDETERMINATE) -verbal = express_getattr(IfcActionRequestTypeEnum, 'VERBAL', INDETERMINATE) -userdefined = express_getattr(IfcActionRequestTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcActionRequestTypeEnum, 'NOTDEFINED', INDETERMINATE) +email = IfcActionRequestTypeEnum.EMAIL +fax = IfcActionRequestTypeEnum.FAX +phone = IfcActionRequestTypeEnum.PHONE +post = IfcActionRequestTypeEnum.POST +verbal = IfcActionRequestTypeEnum.VERBAL +userdefined = IfcActionRequestTypeEnum.USERDEFINED +notdefined = IfcActionRequestTypeEnum.NOTDEFINED IfcActionSourceTypeEnum = enum_namespace() -brakes = express_getattr(IfcActionSourceTypeEnum, 'BRAKES', INDETERMINATE) -buoyancy = express_getattr(IfcActionSourceTypeEnum, 'BUOYANCY', INDETERMINATE) -completion_g1 = express_getattr(IfcActionSourceTypeEnum, 'COMPLETION_G1', INDETERMINATE) -creep = express_getattr(IfcActionSourceTypeEnum, 'CREEP', INDETERMINATE) -current = express_getattr(IfcActionSourceTypeEnum, 'CURRENT', INDETERMINATE) -dead_load_g = express_getattr(IfcActionSourceTypeEnum, 'DEAD_LOAD_G', INDETERMINATE) -earthquake_e = express_getattr(IfcActionSourceTypeEnum, 'EARTHQUAKE_E', INDETERMINATE) -erection = express_getattr(IfcActionSourceTypeEnum, 'ERECTION', INDETERMINATE) -fire = express_getattr(IfcActionSourceTypeEnum, 'FIRE', INDETERMINATE) -ice = express_getattr(IfcActionSourceTypeEnum, 'ICE', INDETERMINATE) -impact = express_getattr(IfcActionSourceTypeEnum, 'IMPACT', INDETERMINATE) -impulse = express_getattr(IfcActionSourceTypeEnum, 'IMPULSE', INDETERMINATE) -lack_of_fit = express_getattr(IfcActionSourceTypeEnum, 'LACK_OF_FIT', INDETERMINATE) -live_load_q = express_getattr(IfcActionSourceTypeEnum, 'LIVE_LOAD_Q', INDETERMINATE) -prestressing_p = express_getattr(IfcActionSourceTypeEnum, 'PRESTRESSING_P', INDETERMINATE) -propping = express_getattr(IfcActionSourceTypeEnum, 'PROPPING', INDETERMINATE) -rain = express_getattr(IfcActionSourceTypeEnum, 'RAIN', INDETERMINATE) -settlement_u = express_getattr(IfcActionSourceTypeEnum, 'SETTLEMENT_U', INDETERMINATE) -shrinkage = express_getattr(IfcActionSourceTypeEnum, 'SHRINKAGE', INDETERMINATE) -snow_s = express_getattr(IfcActionSourceTypeEnum, 'SNOW_S', INDETERMINATE) -system_imperfection = express_getattr(IfcActionSourceTypeEnum, 'SYSTEM_IMPERFECTION', INDETERMINATE) -temperature_t = express_getattr(IfcActionSourceTypeEnum, 'TEMPERATURE_T', INDETERMINATE) -transport = express_getattr(IfcActionSourceTypeEnum, 'TRANSPORT', INDETERMINATE) -wave = express_getattr(IfcActionSourceTypeEnum, 'WAVE', INDETERMINATE) -wind_w = express_getattr(IfcActionSourceTypeEnum, 'WIND_W', INDETERMINATE) -userdefined = express_getattr(IfcActionSourceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcActionSourceTypeEnum, 'NOTDEFINED', INDETERMINATE) +brakes = IfcActionSourceTypeEnum.BRAKES +buoyancy = IfcActionSourceTypeEnum.BUOYANCY +completion_g1 = IfcActionSourceTypeEnum.COMPLETION_G1 +creep = IfcActionSourceTypeEnum.CREEP +current = IfcActionSourceTypeEnum.CURRENT +dead_load_g = IfcActionSourceTypeEnum.DEAD_LOAD_G +earthquake_e = IfcActionSourceTypeEnum.EARTHQUAKE_E +erection = IfcActionSourceTypeEnum.ERECTION +fire = IfcActionSourceTypeEnum.FIRE +ice = IfcActionSourceTypeEnum.ICE +impact = IfcActionSourceTypeEnum.IMPACT +impulse = IfcActionSourceTypeEnum.IMPULSE +lack_of_fit = IfcActionSourceTypeEnum.LACK_OF_FIT +live_load_q = IfcActionSourceTypeEnum.LIVE_LOAD_Q +prestressing_p = IfcActionSourceTypeEnum.PRESTRESSING_P +propping = IfcActionSourceTypeEnum.PROPPING +rain = IfcActionSourceTypeEnum.RAIN +settlement_u = IfcActionSourceTypeEnum.SETTLEMENT_U +shrinkage = IfcActionSourceTypeEnum.SHRINKAGE +snow_s = IfcActionSourceTypeEnum.SNOW_S +system_imperfection = IfcActionSourceTypeEnum.SYSTEM_IMPERFECTION +temperature_t = IfcActionSourceTypeEnum.TEMPERATURE_T +transport = IfcActionSourceTypeEnum.TRANSPORT +wave = IfcActionSourceTypeEnum.WAVE +wind_w = IfcActionSourceTypeEnum.WIND_W +userdefined = IfcActionSourceTypeEnum.USERDEFINED +notdefined = IfcActionSourceTypeEnum.NOTDEFINED IfcActionTypeEnum = enum_namespace() -extraordinary_a = express_getattr(IfcActionTypeEnum, 'EXTRAORDINARY_A', INDETERMINATE) -permanent_g = express_getattr(IfcActionTypeEnum, 'PERMANENT_G', INDETERMINATE) -variable_q = express_getattr(IfcActionTypeEnum, 'VARIABLE_Q', INDETERMINATE) -userdefined = express_getattr(IfcActionTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcActionTypeEnum, 'NOTDEFINED', INDETERMINATE) +extraordinary_a = IfcActionTypeEnum.EXTRAORDINARY_A +permanent_g = IfcActionTypeEnum.PERMANENT_G +variable_q = IfcActionTypeEnum.VARIABLE_Q +userdefined = IfcActionTypeEnum.USERDEFINED +notdefined = IfcActionTypeEnum.NOTDEFINED IfcActuatorTypeEnum = enum_namespace() -electricactuator = express_getattr(IfcActuatorTypeEnum, 'ELECTRICACTUATOR', INDETERMINATE) -handoperatedactuator = express_getattr(IfcActuatorTypeEnum, 'HANDOPERATEDACTUATOR', INDETERMINATE) -hydraulicactuator = express_getattr(IfcActuatorTypeEnum, 'HYDRAULICACTUATOR', INDETERMINATE) -pneumaticactuator = express_getattr(IfcActuatorTypeEnum, 'PNEUMATICACTUATOR', INDETERMINATE) -thermostaticactuator = express_getattr(IfcActuatorTypeEnum, 'THERMOSTATICACTUATOR', INDETERMINATE) -userdefined = express_getattr(IfcActuatorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcActuatorTypeEnum, 'NOTDEFINED', INDETERMINATE) +electricactuator = IfcActuatorTypeEnum.ELECTRICACTUATOR +handoperatedactuator = IfcActuatorTypeEnum.HANDOPERATEDACTUATOR +hydraulicactuator = IfcActuatorTypeEnum.HYDRAULICACTUATOR +pneumaticactuator = IfcActuatorTypeEnum.PNEUMATICACTUATOR +thermostaticactuator = IfcActuatorTypeEnum.THERMOSTATICACTUATOR +userdefined = IfcActuatorTypeEnum.USERDEFINED +notdefined = IfcActuatorTypeEnum.NOTDEFINED IfcAddressTypeEnum = enum_namespace() -distributionpoint = express_getattr(IfcAddressTypeEnum, 'DISTRIBUTIONPOINT', INDETERMINATE) -home = express_getattr(IfcAddressTypeEnum, 'HOME', INDETERMINATE) -office = express_getattr(IfcAddressTypeEnum, 'OFFICE', INDETERMINATE) -site = express_getattr(IfcAddressTypeEnum, 'SITE', INDETERMINATE) -userdefined = express_getattr(IfcAddressTypeEnum, 'USERDEFINED', INDETERMINATE) +distributionpoint = IfcAddressTypeEnum.DISTRIBUTIONPOINT +home = IfcAddressTypeEnum.HOME +office = IfcAddressTypeEnum.OFFICE +site = IfcAddressTypeEnum.SITE +userdefined = IfcAddressTypeEnum.USERDEFINED IfcAirTerminalBoxTypeEnum = enum_namespace() -constantflow = express_getattr(IfcAirTerminalBoxTypeEnum, 'CONSTANTFLOW', INDETERMINATE) -variableflowpressuredependant = express_getattr(IfcAirTerminalBoxTypeEnum, 'VARIABLEFLOWPRESSUREDEPENDANT', INDETERMINATE) -variableflowpressureindependant = express_getattr(IfcAirTerminalBoxTypeEnum, 'VARIABLEFLOWPRESSUREINDEPENDANT', INDETERMINATE) -userdefined = express_getattr(IfcAirTerminalBoxTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAirTerminalBoxTypeEnum, 'NOTDEFINED', INDETERMINATE) +constantflow = IfcAirTerminalBoxTypeEnum.CONSTANTFLOW +variableflowpressuredependant = IfcAirTerminalBoxTypeEnum.VARIABLEFLOWPRESSUREDEPENDANT +variableflowpressureindependant = IfcAirTerminalBoxTypeEnum.VARIABLEFLOWPRESSUREINDEPENDANT +userdefined = IfcAirTerminalBoxTypeEnum.USERDEFINED +notdefined = IfcAirTerminalBoxTypeEnum.NOTDEFINED IfcAirTerminalTypeEnum = enum_namespace() -diffuser = express_getattr(IfcAirTerminalTypeEnum, 'DIFFUSER', INDETERMINATE) -grille = express_getattr(IfcAirTerminalTypeEnum, 'GRILLE', INDETERMINATE) -louvre = express_getattr(IfcAirTerminalTypeEnum, 'LOUVRE', INDETERMINATE) -register = express_getattr(IfcAirTerminalTypeEnum, 'REGISTER', INDETERMINATE) -userdefined = express_getattr(IfcAirTerminalTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAirTerminalTypeEnum, 'NOTDEFINED', INDETERMINATE) +diffuser = IfcAirTerminalTypeEnum.DIFFUSER +grille = IfcAirTerminalTypeEnum.GRILLE +louvre = IfcAirTerminalTypeEnum.LOUVRE +register = IfcAirTerminalTypeEnum.REGISTER +userdefined = IfcAirTerminalTypeEnum.USERDEFINED +notdefined = IfcAirTerminalTypeEnum.NOTDEFINED IfcAirToAirHeatRecoveryTypeEnum = enum_namespace() -fixedplatecounterflowexchanger = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'FIXEDPLATECOUNTERFLOWEXCHANGER', INDETERMINATE) -fixedplatecrossflowexchanger = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'FIXEDPLATECROSSFLOWEXCHANGER', INDETERMINATE) -fixedplateparallelflowexchanger = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'FIXEDPLATEPARALLELFLOWEXCHANGER', INDETERMINATE) -heatpipe = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'HEATPIPE', INDETERMINATE) -rotarywheel = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'ROTARYWHEEL', INDETERMINATE) -runaroundcoilloop = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'RUNAROUNDCOILLOOP', INDETERMINATE) -thermosiphoncoiltypeheatexchangers = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'THERMOSIPHONCOILTYPEHEATEXCHANGERS', INDETERMINATE) -thermosiphonsealedtubeheatexchangers = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'THERMOSIPHONSEALEDTUBEHEATEXCHANGERS', INDETERMINATE) -twintowerenthalpyrecoveryloops = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'TWINTOWERENTHALPYRECOVERYLOOPS', INDETERMINATE) -userdefined = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAirToAirHeatRecoveryTypeEnum, 'NOTDEFINED', INDETERMINATE) +fixedplatecounterflowexchanger = IfcAirToAirHeatRecoveryTypeEnum.FIXEDPLATECOUNTERFLOWEXCHANGER +fixedplatecrossflowexchanger = IfcAirToAirHeatRecoveryTypeEnum.FIXEDPLATECROSSFLOWEXCHANGER +fixedplateparallelflowexchanger = IfcAirToAirHeatRecoveryTypeEnum.FIXEDPLATEPARALLELFLOWEXCHANGER +heatpipe = IfcAirToAirHeatRecoveryTypeEnum.HEATPIPE +rotarywheel = IfcAirToAirHeatRecoveryTypeEnum.ROTARYWHEEL +runaroundcoilloop = IfcAirToAirHeatRecoveryTypeEnum.RUNAROUNDCOILLOOP +thermosiphoncoiltypeheatexchangers = IfcAirToAirHeatRecoveryTypeEnum.THERMOSIPHONCOILTYPEHEATEXCHANGERS +thermosiphonsealedtubeheatexchangers = IfcAirToAirHeatRecoveryTypeEnum.THERMOSIPHONSEALEDTUBEHEATEXCHANGERS +twintowerenthalpyrecoveryloops = IfcAirToAirHeatRecoveryTypeEnum.TWINTOWERENTHALPYRECOVERYLOOPS +userdefined = IfcAirToAirHeatRecoveryTypeEnum.USERDEFINED +notdefined = IfcAirToAirHeatRecoveryTypeEnum.NOTDEFINED IfcAlarmTypeEnum = enum_namespace() -bell = express_getattr(IfcAlarmTypeEnum, 'BELL', INDETERMINATE) -breakglassbutton = express_getattr(IfcAlarmTypeEnum, 'BREAKGLASSBUTTON', INDETERMINATE) -light = express_getattr(IfcAlarmTypeEnum, 'LIGHT', INDETERMINATE) -manualpullbox = express_getattr(IfcAlarmTypeEnum, 'MANUALPULLBOX', INDETERMINATE) -railwaycrocodile = express_getattr(IfcAlarmTypeEnum, 'RAILWAYCROCODILE', INDETERMINATE) -railwaydetonator = express_getattr(IfcAlarmTypeEnum, 'RAILWAYDETONATOR', INDETERMINATE) -siren = express_getattr(IfcAlarmTypeEnum, 'SIREN', INDETERMINATE) -whistle = express_getattr(IfcAlarmTypeEnum, 'WHISTLE', INDETERMINATE) -userdefined = express_getattr(IfcAlarmTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAlarmTypeEnum, 'NOTDEFINED', INDETERMINATE) +bell = IfcAlarmTypeEnum.BELL +breakglassbutton = IfcAlarmTypeEnum.BREAKGLASSBUTTON +light = IfcAlarmTypeEnum.LIGHT +manualpullbox = IfcAlarmTypeEnum.MANUALPULLBOX +railwaycrocodile = IfcAlarmTypeEnum.RAILWAYCROCODILE +railwaydetonator = IfcAlarmTypeEnum.RAILWAYDETONATOR +siren = IfcAlarmTypeEnum.SIREN +whistle = IfcAlarmTypeEnum.WHISTLE +userdefined = IfcAlarmTypeEnum.USERDEFINED +notdefined = IfcAlarmTypeEnum.NOTDEFINED IfcAlignmentCantSegmentTypeEnum = enum_namespace() -blosscurve = express_getattr(IfcAlignmentCantSegmentTypeEnum, 'BLOSSCURVE', INDETERMINATE) -constantcant = express_getattr(IfcAlignmentCantSegmentTypeEnum, 'CONSTANTCANT', INDETERMINATE) -cosinecurve = express_getattr(IfcAlignmentCantSegmentTypeEnum, 'COSINECURVE', INDETERMINATE) -helmertcurve = express_getattr(IfcAlignmentCantSegmentTypeEnum, 'HELMERTCURVE', INDETERMINATE) -lineartransition = express_getattr(IfcAlignmentCantSegmentTypeEnum, 'LINEARTRANSITION', INDETERMINATE) -sinecurve = express_getattr(IfcAlignmentCantSegmentTypeEnum, 'SINECURVE', INDETERMINATE) -viennesebend = express_getattr(IfcAlignmentCantSegmentTypeEnum, 'VIENNESEBEND', INDETERMINATE) +blosscurve = IfcAlignmentCantSegmentTypeEnum.BLOSSCURVE +constantcant = IfcAlignmentCantSegmentTypeEnum.CONSTANTCANT +cosinecurve = IfcAlignmentCantSegmentTypeEnum.COSINECURVE +helmertcurve = IfcAlignmentCantSegmentTypeEnum.HELMERTCURVE +lineartransition = IfcAlignmentCantSegmentTypeEnum.LINEARTRANSITION +sinecurve = IfcAlignmentCantSegmentTypeEnum.SINECURVE +viennesebend = IfcAlignmentCantSegmentTypeEnum.VIENNESEBEND IfcAlignmentHorizontalSegmentTypeEnum = enum_namespace() -blosscurve = express_getattr(IfcAlignmentHorizontalSegmentTypeEnum, 'BLOSSCURVE', INDETERMINATE) -circulararc = express_getattr(IfcAlignmentHorizontalSegmentTypeEnum, 'CIRCULARARC', INDETERMINATE) -clothoid = express_getattr(IfcAlignmentHorizontalSegmentTypeEnum, 'CLOTHOID', INDETERMINATE) -cosinecurve = express_getattr(IfcAlignmentHorizontalSegmentTypeEnum, 'COSINECURVE', INDETERMINATE) -cubic = express_getattr(IfcAlignmentHorizontalSegmentTypeEnum, 'CUBIC', INDETERMINATE) -helmertcurve = express_getattr(IfcAlignmentHorizontalSegmentTypeEnum, 'HELMERTCURVE', INDETERMINATE) -line = express_getattr(IfcAlignmentHorizontalSegmentTypeEnum, 'LINE', INDETERMINATE) -sinecurve = express_getattr(IfcAlignmentHorizontalSegmentTypeEnum, 'SINECURVE', INDETERMINATE) -viennesebend = express_getattr(IfcAlignmentHorizontalSegmentTypeEnum, 'VIENNESEBEND', INDETERMINATE) +blosscurve = IfcAlignmentHorizontalSegmentTypeEnum.BLOSSCURVE +circulararc = IfcAlignmentHorizontalSegmentTypeEnum.CIRCULARARC +clothoid = IfcAlignmentHorizontalSegmentTypeEnum.CLOTHOID +cosinecurve = IfcAlignmentHorizontalSegmentTypeEnum.COSINECURVE +cubic = IfcAlignmentHorizontalSegmentTypeEnum.CUBIC +helmertcurve = IfcAlignmentHorizontalSegmentTypeEnum.HELMERTCURVE +line = IfcAlignmentHorizontalSegmentTypeEnum.LINE +sinecurve = IfcAlignmentHorizontalSegmentTypeEnum.SINECURVE +viennesebend = IfcAlignmentHorizontalSegmentTypeEnum.VIENNESEBEND IfcAlignmentTypeEnum = enum_namespace() -userdefined = express_getattr(IfcAlignmentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAlignmentTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcAlignmentTypeEnum.USERDEFINED +notdefined = IfcAlignmentTypeEnum.NOTDEFINED IfcAlignmentVerticalSegmentTypeEnum = enum_namespace() -circulararc = express_getattr(IfcAlignmentVerticalSegmentTypeEnum, 'CIRCULARARC', INDETERMINATE) -clothoid = express_getattr(IfcAlignmentVerticalSegmentTypeEnum, 'CLOTHOID', INDETERMINATE) -constantgradient = express_getattr(IfcAlignmentVerticalSegmentTypeEnum, 'CONSTANTGRADIENT', INDETERMINATE) -parabolicarc = express_getattr(IfcAlignmentVerticalSegmentTypeEnum, 'PARABOLICARC', INDETERMINATE) +circulararc = IfcAlignmentVerticalSegmentTypeEnum.CIRCULARARC +clothoid = IfcAlignmentVerticalSegmentTypeEnum.CLOTHOID +constantgradient = IfcAlignmentVerticalSegmentTypeEnum.CONSTANTGRADIENT +parabolicarc = IfcAlignmentVerticalSegmentTypeEnum.PARABOLICARC IfcAnalysisModelTypeEnum = enum_namespace() -in_plane_loading_2d = express_getattr(IfcAnalysisModelTypeEnum, 'IN_PLANE_LOADING_2D', INDETERMINATE) -loading_3d = express_getattr(IfcAnalysisModelTypeEnum, 'LOADING_3D', INDETERMINATE) -out_plane_loading_2d = express_getattr(IfcAnalysisModelTypeEnum, 'OUT_PLANE_LOADING_2D', INDETERMINATE) -userdefined = express_getattr(IfcAnalysisModelTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAnalysisModelTypeEnum, 'NOTDEFINED', INDETERMINATE) +in_plane_loading_2d = IfcAnalysisModelTypeEnum.IN_PLANE_LOADING_2D +loading_3d = IfcAnalysisModelTypeEnum.LOADING_3D +out_plane_loading_2d = IfcAnalysisModelTypeEnum.OUT_PLANE_LOADING_2D +userdefined = IfcAnalysisModelTypeEnum.USERDEFINED +notdefined = IfcAnalysisModelTypeEnum.NOTDEFINED IfcAnalysisTheoryTypeEnum = enum_namespace() -first_order_theory = express_getattr(IfcAnalysisTheoryTypeEnum, 'FIRST_ORDER_THEORY', INDETERMINATE) -full_nonlinear_theory = express_getattr(IfcAnalysisTheoryTypeEnum, 'FULL_NONLINEAR_THEORY', INDETERMINATE) -second_order_theory = express_getattr(IfcAnalysisTheoryTypeEnum, 'SECOND_ORDER_THEORY', INDETERMINATE) -third_order_theory = express_getattr(IfcAnalysisTheoryTypeEnum, 'THIRD_ORDER_THEORY', INDETERMINATE) -userdefined = express_getattr(IfcAnalysisTheoryTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAnalysisTheoryTypeEnum, 'NOTDEFINED', INDETERMINATE) +first_order_theory = IfcAnalysisTheoryTypeEnum.FIRST_ORDER_THEORY +full_nonlinear_theory = IfcAnalysisTheoryTypeEnum.FULL_NONLINEAR_THEORY +second_order_theory = IfcAnalysisTheoryTypeEnum.SECOND_ORDER_THEORY +third_order_theory = IfcAnalysisTheoryTypeEnum.THIRD_ORDER_THEORY +userdefined = IfcAnalysisTheoryTypeEnum.USERDEFINED +notdefined = IfcAnalysisTheoryTypeEnum.NOTDEFINED IfcAnnotationTypeEnum = enum_namespace() -asbuiltarea = express_getattr(IfcAnnotationTypeEnum, 'ASBUILTAREA', INDETERMINATE) -asbuiltline = express_getattr(IfcAnnotationTypeEnum, 'ASBUILTLINE', INDETERMINATE) -asbuiltpoint = express_getattr(IfcAnnotationTypeEnum, 'ASBUILTPOINT', INDETERMINATE) -assumedarea = express_getattr(IfcAnnotationTypeEnum, 'ASSUMEDAREA', INDETERMINATE) -assumedline = express_getattr(IfcAnnotationTypeEnum, 'ASSUMEDLINE', INDETERMINATE) -assumedpoint = express_getattr(IfcAnnotationTypeEnum, 'ASSUMEDPOINT', INDETERMINATE) -non_physical_signal = express_getattr(IfcAnnotationTypeEnum, 'NON_PHYSICAL_SIGNAL', INDETERMINATE) -superelevationevent = express_getattr(IfcAnnotationTypeEnum, 'SUPERELEVATIONEVENT', INDETERMINATE) -widthevent = express_getattr(IfcAnnotationTypeEnum, 'WIDTHEVENT', INDETERMINATE) -userdefined = express_getattr(IfcAnnotationTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAnnotationTypeEnum, 'NOTDEFINED', INDETERMINATE) +asbuiltarea = IfcAnnotationTypeEnum.ASBUILTAREA +asbuiltline = IfcAnnotationTypeEnum.ASBUILTLINE +asbuiltpoint = IfcAnnotationTypeEnum.ASBUILTPOINT +assumedarea = IfcAnnotationTypeEnum.ASSUMEDAREA +assumedline = IfcAnnotationTypeEnum.ASSUMEDLINE +assumedpoint = IfcAnnotationTypeEnum.ASSUMEDPOINT +non_physical_signal = IfcAnnotationTypeEnum.NON_PHYSICAL_SIGNAL +superelevationevent = IfcAnnotationTypeEnum.SUPERELEVATIONEVENT +widthevent = IfcAnnotationTypeEnum.WIDTHEVENT +userdefined = IfcAnnotationTypeEnum.USERDEFINED +notdefined = IfcAnnotationTypeEnum.NOTDEFINED IfcArithmeticOperatorEnum = enum_namespace() -add = express_getattr(IfcArithmeticOperatorEnum, 'ADD', INDETERMINATE) -divide = express_getattr(IfcArithmeticOperatorEnum, 'DIVIDE', INDETERMINATE) -multiply = express_getattr(IfcArithmeticOperatorEnum, 'MULTIPLY', INDETERMINATE) -subtract = express_getattr(IfcArithmeticOperatorEnum, 'SUBTRACT', INDETERMINATE) +add = IfcArithmeticOperatorEnum.ADD +divide = IfcArithmeticOperatorEnum.DIVIDE +multiply = IfcArithmeticOperatorEnum.MULTIPLY +subtract = IfcArithmeticOperatorEnum.SUBTRACT IfcAssemblyPlaceEnum = enum_namespace() -factory = express_getattr(IfcAssemblyPlaceEnum, 'FACTORY', INDETERMINATE) -site = express_getattr(IfcAssemblyPlaceEnum, 'SITE', INDETERMINATE) -notdefined = express_getattr(IfcAssemblyPlaceEnum, 'NOTDEFINED', INDETERMINATE) +factory = IfcAssemblyPlaceEnum.FACTORY +site = IfcAssemblyPlaceEnum.SITE +notdefined = IfcAssemblyPlaceEnum.NOTDEFINED IfcAudioVisualApplianceTypeEnum = enum_namespace() -amplifier = express_getattr(IfcAudioVisualApplianceTypeEnum, 'AMPLIFIER', INDETERMINATE) -camera = express_getattr(IfcAudioVisualApplianceTypeEnum, 'CAMERA', INDETERMINATE) -communicationterminal = express_getattr(IfcAudioVisualApplianceTypeEnum, 'COMMUNICATIONTERMINAL', INDETERMINATE) -display = express_getattr(IfcAudioVisualApplianceTypeEnum, 'DISPLAY', INDETERMINATE) -microphone = express_getattr(IfcAudioVisualApplianceTypeEnum, 'MICROPHONE', INDETERMINATE) -player = express_getattr(IfcAudioVisualApplianceTypeEnum, 'PLAYER', INDETERMINATE) -projector = express_getattr(IfcAudioVisualApplianceTypeEnum, 'PROJECTOR', INDETERMINATE) -receiver = express_getattr(IfcAudioVisualApplianceTypeEnum, 'RECEIVER', INDETERMINATE) -recordingequipment = express_getattr(IfcAudioVisualApplianceTypeEnum, 'RECORDINGEQUIPMENT', INDETERMINATE) -speaker = express_getattr(IfcAudioVisualApplianceTypeEnum, 'SPEAKER', INDETERMINATE) -switcher = express_getattr(IfcAudioVisualApplianceTypeEnum, 'SWITCHER', INDETERMINATE) -telephone = express_getattr(IfcAudioVisualApplianceTypeEnum, 'TELEPHONE', INDETERMINATE) -tuner = express_getattr(IfcAudioVisualApplianceTypeEnum, 'TUNER', INDETERMINATE) -userdefined = express_getattr(IfcAudioVisualApplianceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcAudioVisualApplianceTypeEnum, 'NOTDEFINED', INDETERMINATE) +amplifier = IfcAudioVisualApplianceTypeEnum.AMPLIFIER +camera = IfcAudioVisualApplianceTypeEnum.CAMERA +communicationterminal = IfcAudioVisualApplianceTypeEnum.COMMUNICATIONTERMINAL +display = IfcAudioVisualApplianceTypeEnum.DISPLAY +microphone = IfcAudioVisualApplianceTypeEnum.MICROPHONE +player = IfcAudioVisualApplianceTypeEnum.PLAYER +projector = IfcAudioVisualApplianceTypeEnum.PROJECTOR +receiver = IfcAudioVisualApplianceTypeEnum.RECEIVER +recordingequipment = IfcAudioVisualApplianceTypeEnum.RECORDINGEQUIPMENT +speaker = IfcAudioVisualApplianceTypeEnum.SPEAKER +switcher = IfcAudioVisualApplianceTypeEnum.SWITCHER +telephone = IfcAudioVisualApplianceTypeEnum.TELEPHONE +tuner = IfcAudioVisualApplianceTypeEnum.TUNER +userdefined = IfcAudioVisualApplianceTypeEnum.USERDEFINED +notdefined = IfcAudioVisualApplianceTypeEnum.NOTDEFINED IfcBSplineCurveForm = enum_namespace() -circular_arc = express_getattr(IfcBSplineCurveForm, 'CIRCULAR_ARC', INDETERMINATE) -elliptic_arc = express_getattr(IfcBSplineCurveForm, 'ELLIPTIC_ARC', INDETERMINATE) -hyperbolic_arc = express_getattr(IfcBSplineCurveForm, 'HYPERBOLIC_ARC', INDETERMINATE) -parabolic_arc = express_getattr(IfcBSplineCurveForm, 'PARABOLIC_ARC', INDETERMINATE) -polyline_form = express_getattr(IfcBSplineCurveForm, 'POLYLINE_FORM', INDETERMINATE) -unspecified = express_getattr(IfcBSplineCurveForm, 'UNSPECIFIED', INDETERMINATE) +circular_arc = IfcBSplineCurveForm.CIRCULAR_ARC +elliptic_arc = IfcBSplineCurveForm.ELLIPTIC_ARC +hyperbolic_arc = IfcBSplineCurveForm.HYPERBOLIC_ARC +parabolic_arc = IfcBSplineCurveForm.PARABOLIC_ARC +polyline_form = IfcBSplineCurveForm.POLYLINE_FORM +unspecified = IfcBSplineCurveForm.UNSPECIFIED IfcBSplineSurfaceForm = enum_namespace() -conical_surf = express_getattr(IfcBSplineSurfaceForm, 'CONICAL_SURF', INDETERMINATE) -cylindrical_surf = express_getattr(IfcBSplineSurfaceForm, 'CYLINDRICAL_SURF', INDETERMINATE) -generalised_cone = express_getattr(IfcBSplineSurfaceForm, 'GENERALISED_CONE', INDETERMINATE) -plane_surf = express_getattr(IfcBSplineSurfaceForm, 'PLANE_SURF', INDETERMINATE) -quadric_surf = express_getattr(IfcBSplineSurfaceForm, 'QUADRIC_SURF', INDETERMINATE) -ruled_surf = express_getattr(IfcBSplineSurfaceForm, 'RULED_SURF', INDETERMINATE) -spherical_surf = express_getattr(IfcBSplineSurfaceForm, 'SPHERICAL_SURF', INDETERMINATE) -surf_of_linear_extrusion = express_getattr(IfcBSplineSurfaceForm, 'SURF_OF_LINEAR_EXTRUSION', INDETERMINATE) -surf_of_revolution = express_getattr(IfcBSplineSurfaceForm, 'SURF_OF_REVOLUTION', INDETERMINATE) -toroidal_surf = express_getattr(IfcBSplineSurfaceForm, 'TOROIDAL_SURF', INDETERMINATE) -unspecified = express_getattr(IfcBSplineSurfaceForm, 'UNSPECIFIED', INDETERMINATE) +conical_surf = IfcBSplineSurfaceForm.CONICAL_SURF +cylindrical_surf = IfcBSplineSurfaceForm.CYLINDRICAL_SURF +generalised_cone = IfcBSplineSurfaceForm.GENERALISED_CONE +plane_surf = IfcBSplineSurfaceForm.PLANE_SURF +quadric_surf = IfcBSplineSurfaceForm.QUADRIC_SURF +ruled_surf = IfcBSplineSurfaceForm.RULED_SURF +spherical_surf = IfcBSplineSurfaceForm.SPHERICAL_SURF +surf_of_linear_extrusion = IfcBSplineSurfaceForm.SURF_OF_LINEAR_EXTRUSION +surf_of_revolution = IfcBSplineSurfaceForm.SURF_OF_REVOLUTION +toroidal_surf = IfcBSplineSurfaceForm.TOROIDAL_SURF +unspecified = IfcBSplineSurfaceForm.UNSPECIFIED IfcBeamTypeEnum = enum_namespace() -beam = express_getattr(IfcBeamTypeEnum, 'BEAM', INDETERMINATE) -cornice = express_getattr(IfcBeamTypeEnum, 'CORNICE', INDETERMINATE) -diaphragm = express_getattr(IfcBeamTypeEnum, 'DIAPHRAGM', INDETERMINATE) -edgebeam = express_getattr(IfcBeamTypeEnum, 'EDGEBEAM', INDETERMINATE) -girder_segment = express_getattr(IfcBeamTypeEnum, 'GIRDER_SEGMENT', INDETERMINATE) -hatstone = express_getattr(IfcBeamTypeEnum, 'HATSTONE', INDETERMINATE) -hollowcore = express_getattr(IfcBeamTypeEnum, 'HOLLOWCORE', INDETERMINATE) -joist = express_getattr(IfcBeamTypeEnum, 'JOIST', INDETERMINATE) -lintel = express_getattr(IfcBeamTypeEnum, 'LINTEL', INDETERMINATE) -piercap = express_getattr(IfcBeamTypeEnum, 'PIERCAP', INDETERMINATE) -spandrel = express_getattr(IfcBeamTypeEnum, 'SPANDREL', INDETERMINATE) -t_beam = express_getattr(IfcBeamTypeEnum, 'T_BEAM', INDETERMINATE) -userdefined = express_getattr(IfcBeamTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBeamTypeEnum, 'NOTDEFINED', INDETERMINATE) +beam = IfcBeamTypeEnum.BEAM +cornice = IfcBeamTypeEnum.CORNICE +diaphragm = IfcBeamTypeEnum.DIAPHRAGM +edgebeam = IfcBeamTypeEnum.EDGEBEAM +girder_segment = IfcBeamTypeEnum.GIRDER_SEGMENT +hatstone = IfcBeamTypeEnum.HATSTONE +hollowcore = IfcBeamTypeEnum.HOLLOWCORE +joist = IfcBeamTypeEnum.JOIST +lintel = IfcBeamTypeEnum.LINTEL +piercap = IfcBeamTypeEnum.PIERCAP +spandrel = IfcBeamTypeEnum.SPANDREL +t_beam = IfcBeamTypeEnum.T_BEAM +userdefined = IfcBeamTypeEnum.USERDEFINED +notdefined = IfcBeamTypeEnum.NOTDEFINED IfcBearingTypeEnum = enum_namespace() -cylindrical = express_getattr(IfcBearingTypeEnum, 'CYLINDRICAL', INDETERMINATE) -disk = express_getattr(IfcBearingTypeEnum, 'DISK', INDETERMINATE) -elastomeric = express_getattr(IfcBearingTypeEnum, 'ELASTOMERIC', INDETERMINATE) -guide = express_getattr(IfcBearingTypeEnum, 'GUIDE', INDETERMINATE) -pot = express_getattr(IfcBearingTypeEnum, 'POT', INDETERMINATE) -rocker = express_getattr(IfcBearingTypeEnum, 'ROCKER', INDETERMINATE) -roller = express_getattr(IfcBearingTypeEnum, 'ROLLER', INDETERMINATE) -spherical = express_getattr(IfcBearingTypeEnum, 'SPHERICAL', INDETERMINATE) -userdefined = express_getattr(IfcBearingTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBearingTypeEnum, 'NOTDEFINED', INDETERMINATE) +cylindrical = IfcBearingTypeEnum.CYLINDRICAL +disk = IfcBearingTypeEnum.DISK +elastomeric = IfcBearingTypeEnum.ELASTOMERIC +guide = IfcBearingTypeEnum.GUIDE +pot = IfcBearingTypeEnum.POT +rocker = IfcBearingTypeEnum.ROCKER +roller = IfcBearingTypeEnum.ROLLER +spherical = IfcBearingTypeEnum.SPHERICAL +userdefined = IfcBearingTypeEnum.USERDEFINED +notdefined = IfcBearingTypeEnum.NOTDEFINED IfcBenchmarkEnum = enum_namespace() -equalto = express_getattr(IfcBenchmarkEnum, 'EQUALTO', INDETERMINATE) -greaterthan = express_getattr(IfcBenchmarkEnum, 'GREATERTHAN', INDETERMINATE) -greaterthanorequalto = express_getattr(IfcBenchmarkEnum, 'GREATERTHANOREQUALTO', INDETERMINATE) -includedin = express_getattr(IfcBenchmarkEnum, 'INCLUDEDIN', INDETERMINATE) -includes = express_getattr(IfcBenchmarkEnum, 'INCLUDES', INDETERMINATE) -lessthan = express_getattr(IfcBenchmarkEnum, 'LESSTHAN', INDETERMINATE) -lessthanorequalto = express_getattr(IfcBenchmarkEnum, 'LESSTHANOREQUALTO', INDETERMINATE) -notequalto = express_getattr(IfcBenchmarkEnum, 'NOTEQUALTO', INDETERMINATE) -notincludedin = express_getattr(IfcBenchmarkEnum, 'NOTINCLUDEDIN', INDETERMINATE) -notincludes = express_getattr(IfcBenchmarkEnum, 'NOTINCLUDES', INDETERMINATE) +equalto = IfcBenchmarkEnum.EQUALTO +greaterthan = IfcBenchmarkEnum.GREATERTHAN +greaterthanorequalto = IfcBenchmarkEnum.GREATERTHANOREQUALTO +includedin = IfcBenchmarkEnum.INCLUDEDIN +includes = IfcBenchmarkEnum.INCLUDES +lessthan = IfcBenchmarkEnum.LESSTHAN +lessthanorequalto = IfcBenchmarkEnum.LESSTHANOREQUALTO +notequalto = IfcBenchmarkEnum.NOTEQUALTO +notincludedin = IfcBenchmarkEnum.NOTINCLUDEDIN +notincludes = IfcBenchmarkEnum.NOTINCLUDES IfcBoilerTypeEnum = enum_namespace() -steam = express_getattr(IfcBoilerTypeEnum, 'STEAM', INDETERMINATE) -water = express_getattr(IfcBoilerTypeEnum, 'WATER', INDETERMINATE) -userdefined = express_getattr(IfcBoilerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBoilerTypeEnum, 'NOTDEFINED', INDETERMINATE) +steam = IfcBoilerTypeEnum.STEAM +water = IfcBoilerTypeEnum.WATER +userdefined = IfcBoilerTypeEnum.USERDEFINED +notdefined = IfcBoilerTypeEnum.NOTDEFINED IfcBooleanOperator = enum_namespace() -difference = express_getattr(IfcBooleanOperator, 'DIFFERENCE', INDETERMINATE) -intersection = express_getattr(IfcBooleanOperator, 'INTERSECTION', INDETERMINATE) -union = express_getattr(IfcBooleanOperator, 'UNION', INDETERMINATE) +difference = IfcBooleanOperator.DIFFERENCE +intersection = IfcBooleanOperator.INTERSECTION +union = IfcBooleanOperator.UNION IfcBridgePartTypeEnum = enum_namespace() -abutment = express_getattr(IfcBridgePartTypeEnum, 'ABUTMENT', INDETERMINATE) -deck = express_getattr(IfcBridgePartTypeEnum, 'DECK', INDETERMINATE) -deck_segment = express_getattr(IfcBridgePartTypeEnum, 'DECK_SEGMENT', INDETERMINATE) -foundation = express_getattr(IfcBridgePartTypeEnum, 'FOUNDATION', INDETERMINATE) -pier = express_getattr(IfcBridgePartTypeEnum, 'PIER', INDETERMINATE) -pier_segment = express_getattr(IfcBridgePartTypeEnum, 'PIER_SEGMENT', INDETERMINATE) -pylon = express_getattr(IfcBridgePartTypeEnum, 'PYLON', INDETERMINATE) -substructure = express_getattr(IfcBridgePartTypeEnum, 'SUBSTRUCTURE', INDETERMINATE) -superstructure = express_getattr(IfcBridgePartTypeEnum, 'SUPERSTRUCTURE', INDETERMINATE) -surfacestructure = express_getattr(IfcBridgePartTypeEnum, 'SURFACESTRUCTURE', INDETERMINATE) -userdefined = express_getattr(IfcBridgePartTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBridgePartTypeEnum, 'NOTDEFINED', INDETERMINATE) +abutment = IfcBridgePartTypeEnum.ABUTMENT +deck = IfcBridgePartTypeEnum.DECK +deck_segment = IfcBridgePartTypeEnum.DECK_SEGMENT +foundation = IfcBridgePartTypeEnum.FOUNDATION +pier = IfcBridgePartTypeEnum.PIER +pier_segment = IfcBridgePartTypeEnum.PIER_SEGMENT +pylon = IfcBridgePartTypeEnum.PYLON +substructure = IfcBridgePartTypeEnum.SUBSTRUCTURE +superstructure = IfcBridgePartTypeEnum.SUPERSTRUCTURE +surfacestructure = IfcBridgePartTypeEnum.SURFACESTRUCTURE +userdefined = IfcBridgePartTypeEnum.USERDEFINED +notdefined = IfcBridgePartTypeEnum.NOTDEFINED IfcBridgeTypeEnum = enum_namespace() -arched = express_getattr(IfcBridgeTypeEnum, 'ARCHED', INDETERMINATE) -cable_stayed = express_getattr(IfcBridgeTypeEnum, 'CABLE_STAYED', INDETERMINATE) -cantilever = express_getattr(IfcBridgeTypeEnum, 'CANTILEVER', INDETERMINATE) -culvert = express_getattr(IfcBridgeTypeEnum, 'CULVERT', INDETERMINATE) -framework = express_getattr(IfcBridgeTypeEnum, 'FRAMEWORK', INDETERMINATE) -girder = express_getattr(IfcBridgeTypeEnum, 'GIRDER', INDETERMINATE) -suspension = express_getattr(IfcBridgeTypeEnum, 'SUSPENSION', INDETERMINATE) -truss = express_getattr(IfcBridgeTypeEnum, 'TRUSS', INDETERMINATE) -userdefined = express_getattr(IfcBridgeTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBridgeTypeEnum, 'NOTDEFINED', INDETERMINATE) +arched = IfcBridgeTypeEnum.ARCHED +cable_stayed = IfcBridgeTypeEnum.CABLE_STAYED +cantilever = IfcBridgeTypeEnum.CANTILEVER +culvert = IfcBridgeTypeEnum.CULVERT +framework = IfcBridgeTypeEnum.FRAMEWORK +girder = IfcBridgeTypeEnum.GIRDER +suspension = IfcBridgeTypeEnum.SUSPENSION +truss = IfcBridgeTypeEnum.TRUSS +userdefined = IfcBridgeTypeEnum.USERDEFINED +notdefined = IfcBridgeTypeEnum.NOTDEFINED IfcBuildingElementPartTypeEnum = enum_namespace() -apron = express_getattr(IfcBuildingElementPartTypeEnum, 'APRON', INDETERMINATE) -armourunit = express_getattr(IfcBuildingElementPartTypeEnum, 'ARMOURUNIT', INDETERMINATE) -insulation = express_getattr(IfcBuildingElementPartTypeEnum, 'INSULATION', INDETERMINATE) -precastpanel = express_getattr(IfcBuildingElementPartTypeEnum, 'PRECASTPANEL', INDETERMINATE) -safetycage = express_getattr(IfcBuildingElementPartTypeEnum, 'SAFETYCAGE', INDETERMINATE) -userdefined = express_getattr(IfcBuildingElementPartTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBuildingElementPartTypeEnum, 'NOTDEFINED', INDETERMINATE) +apron = IfcBuildingElementPartTypeEnum.APRON +armourunit = IfcBuildingElementPartTypeEnum.ARMOURUNIT +insulation = IfcBuildingElementPartTypeEnum.INSULATION +precastpanel = IfcBuildingElementPartTypeEnum.PRECASTPANEL +safetycage = IfcBuildingElementPartTypeEnum.SAFETYCAGE +userdefined = IfcBuildingElementPartTypeEnum.USERDEFINED +notdefined = IfcBuildingElementPartTypeEnum.NOTDEFINED IfcBuildingElementProxyTypeEnum = enum_namespace() -complex = express_getattr(IfcBuildingElementProxyTypeEnum, 'COMPLEX', INDETERMINATE) -element = express_getattr(IfcBuildingElementProxyTypeEnum, 'ELEMENT', INDETERMINATE) -partial = express_getattr(IfcBuildingElementProxyTypeEnum, 'PARTIAL', INDETERMINATE) -provisionforspace = express_getattr(IfcBuildingElementProxyTypeEnum, 'PROVISIONFORSPACE', INDETERMINATE) -provisionforvoid = express_getattr(IfcBuildingElementProxyTypeEnum, 'PROVISIONFORVOID', INDETERMINATE) -userdefined = express_getattr(IfcBuildingElementProxyTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBuildingElementProxyTypeEnum, 'NOTDEFINED', INDETERMINATE) +complex = IfcBuildingElementProxyTypeEnum.COMPLEX +element = IfcBuildingElementProxyTypeEnum.ELEMENT +partial = IfcBuildingElementProxyTypeEnum.PARTIAL +provisionforspace = IfcBuildingElementProxyTypeEnum.PROVISIONFORSPACE +provisionforvoid = IfcBuildingElementProxyTypeEnum.PROVISIONFORVOID +userdefined = IfcBuildingElementProxyTypeEnum.USERDEFINED +notdefined = IfcBuildingElementProxyTypeEnum.NOTDEFINED IfcBuildingSystemTypeEnum = enum_namespace() -fenestration = express_getattr(IfcBuildingSystemTypeEnum, 'FENESTRATION', INDETERMINATE) -foundation = express_getattr(IfcBuildingSystemTypeEnum, 'FOUNDATION', INDETERMINATE) -loadbearing = express_getattr(IfcBuildingSystemTypeEnum, 'LOADBEARING', INDETERMINATE) -outershell = express_getattr(IfcBuildingSystemTypeEnum, 'OUTERSHELL', INDETERMINATE) -shading = express_getattr(IfcBuildingSystemTypeEnum, 'SHADING', INDETERMINATE) -transport = express_getattr(IfcBuildingSystemTypeEnum, 'TRANSPORT', INDETERMINATE) -userdefined = express_getattr(IfcBuildingSystemTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBuildingSystemTypeEnum, 'NOTDEFINED', INDETERMINATE) +fenestration = IfcBuildingSystemTypeEnum.FENESTRATION +foundation = IfcBuildingSystemTypeEnum.FOUNDATION +loadbearing = IfcBuildingSystemTypeEnum.LOADBEARING +outershell = IfcBuildingSystemTypeEnum.OUTERSHELL +shading = IfcBuildingSystemTypeEnum.SHADING +transport = IfcBuildingSystemTypeEnum.TRANSPORT +userdefined = IfcBuildingSystemTypeEnum.USERDEFINED +notdefined = IfcBuildingSystemTypeEnum.NOTDEFINED IfcBuiltSystemTypeEnum = enum_namespace() -erosionprevention = express_getattr(IfcBuiltSystemTypeEnum, 'EROSIONPREVENTION', INDETERMINATE) -fenestration = express_getattr(IfcBuiltSystemTypeEnum, 'FENESTRATION', INDETERMINATE) -foundation = express_getattr(IfcBuiltSystemTypeEnum, 'FOUNDATION', INDETERMINATE) -loadbearing = express_getattr(IfcBuiltSystemTypeEnum, 'LOADBEARING', INDETERMINATE) -mooring = express_getattr(IfcBuiltSystemTypeEnum, 'MOORING', INDETERMINATE) -outershell = express_getattr(IfcBuiltSystemTypeEnum, 'OUTERSHELL', INDETERMINATE) -prestressing = express_getattr(IfcBuiltSystemTypeEnum, 'PRESTRESSING', INDETERMINATE) -railwayline = express_getattr(IfcBuiltSystemTypeEnum, 'RAILWAYLINE', INDETERMINATE) -railwaytrack = express_getattr(IfcBuiltSystemTypeEnum, 'RAILWAYTRACK', INDETERMINATE) -reinforcing = express_getattr(IfcBuiltSystemTypeEnum, 'REINFORCING', INDETERMINATE) -shading = express_getattr(IfcBuiltSystemTypeEnum, 'SHADING', INDETERMINATE) -trackcircuit = express_getattr(IfcBuiltSystemTypeEnum, 'TRACKCIRCUIT', INDETERMINATE) -transport = express_getattr(IfcBuiltSystemTypeEnum, 'TRANSPORT', INDETERMINATE) -userdefined = express_getattr(IfcBuiltSystemTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBuiltSystemTypeEnum, 'NOTDEFINED', INDETERMINATE) +erosionprevention = IfcBuiltSystemTypeEnum.EROSIONPREVENTION +fenestration = IfcBuiltSystemTypeEnum.FENESTRATION +foundation = IfcBuiltSystemTypeEnum.FOUNDATION +loadbearing = IfcBuiltSystemTypeEnum.LOADBEARING +mooring = IfcBuiltSystemTypeEnum.MOORING +outershell = IfcBuiltSystemTypeEnum.OUTERSHELL +prestressing = IfcBuiltSystemTypeEnum.PRESTRESSING +railwayline = IfcBuiltSystemTypeEnum.RAILWAYLINE +railwaytrack = IfcBuiltSystemTypeEnum.RAILWAYTRACK +reinforcing = IfcBuiltSystemTypeEnum.REINFORCING +shading = IfcBuiltSystemTypeEnum.SHADING +trackcircuit = IfcBuiltSystemTypeEnum.TRACKCIRCUIT +transport = IfcBuiltSystemTypeEnum.TRANSPORT +userdefined = IfcBuiltSystemTypeEnum.USERDEFINED +notdefined = IfcBuiltSystemTypeEnum.NOTDEFINED IfcBurnerTypeEnum = enum_namespace() -userdefined = express_getattr(IfcBurnerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcBurnerTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcBurnerTypeEnum.USERDEFINED +notdefined = IfcBurnerTypeEnum.NOTDEFINED IfcCableCarrierFittingTypeEnum = enum_namespace() -bend = express_getattr(IfcCableCarrierFittingTypeEnum, 'BEND', INDETERMINATE) -connector = express_getattr(IfcCableCarrierFittingTypeEnum, 'CONNECTOR', INDETERMINATE) -cross = express_getattr(IfcCableCarrierFittingTypeEnum, 'CROSS', INDETERMINATE) -junction = express_getattr(IfcCableCarrierFittingTypeEnum, 'JUNCTION', INDETERMINATE) -reducer = express_getattr(IfcCableCarrierFittingTypeEnum, 'REDUCER', INDETERMINATE) -tee = express_getattr(IfcCableCarrierFittingTypeEnum, 'TEE', INDETERMINATE) -transition = express_getattr(IfcCableCarrierFittingTypeEnum, 'TRANSITION', INDETERMINATE) -userdefined = express_getattr(IfcCableCarrierFittingTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCableCarrierFittingTypeEnum, 'NOTDEFINED', INDETERMINATE) +bend = IfcCableCarrierFittingTypeEnum.BEND +connector = IfcCableCarrierFittingTypeEnum.CONNECTOR +cross = IfcCableCarrierFittingTypeEnum.CROSS +junction = IfcCableCarrierFittingTypeEnum.JUNCTION +reducer = IfcCableCarrierFittingTypeEnum.REDUCER +tee = IfcCableCarrierFittingTypeEnum.TEE +transition = IfcCableCarrierFittingTypeEnum.TRANSITION +userdefined = IfcCableCarrierFittingTypeEnum.USERDEFINED +notdefined = IfcCableCarrierFittingTypeEnum.NOTDEFINED IfcCableCarrierSegmentTypeEnum = enum_namespace() -cablebracket = express_getattr(IfcCableCarrierSegmentTypeEnum, 'CABLEBRACKET', INDETERMINATE) -cableladdersegment = express_getattr(IfcCableCarrierSegmentTypeEnum, 'CABLELADDERSEGMENT', INDETERMINATE) -cabletraysegment = express_getattr(IfcCableCarrierSegmentTypeEnum, 'CABLETRAYSEGMENT', INDETERMINATE) -cabletrunkingsegment = express_getattr(IfcCableCarrierSegmentTypeEnum, 'CABLETRUNKINGSEGMENT', INDETERMINATE) -catenarywire = express_getattr(IfcCableCarrierSegmentTypeEnum, 'CATENARYWIRE', INDETERMINATE) -conduitsegment = express_getattr(IfcCableCarrierSegmentTypeEnum, 'CONDUITSEGMENT', INDETERMINATE) -dropper = express_getattr(IfcCableCarrierSegmentTypeEnum, 'DROPPER', INDETERMINATE) -userdefined = express_getattr(IfcCableCarrierSegmentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCableCarrierSegmentTypeEnum, 'NOTDEFINED', INDETERMINATE) +cablebracket = IfcCableCarrierSegmentTypeEnum.CABLEBRACKET +cableladdersegment = IfcCableCarrierSegmentTypeEnum.CABLELADDERSEGMENT +cabletraysegment = IfcCableCarrierSegmentTypeEnum.CABLETRAYSEGMENT +cabletrunkingsegment = IfcCableCarrierSegmentTypeEnum.CABLETRUNKINGSEGMENT +catenarywire = IfcCableCarrierSegmentTypeEnum.CATENARYWIRE +conduitsegment = IfcCableCarrierSegmentTypeEnum.CONDUITSEGMENT +dropper = IfcCableCarrierSegmentTypeEnum.DROPPER +userdefined = IfcCableCarrierSegmentTypeEnum.USERDEFINED +notdefined = IfcCableCarrierSegmentTypeEnum.NOTDEFINED IfcCableFittingTypeEnum = enum_namespace() -connector = express_getattr(IfcCableFittingTypeEnum, 'CONNECTOR', INDETERMINATE) -entry = express_getattr(IfcCableFittingTypeEnum, 'ENTRY', INDETERMINATE) -exit = express_getattr(IfcCableFittingTypeEnum, 'EXIT', INDETERMINATE) -fanout = express_getattr(IfcCableFittingTypeEnum, 'FANOUT', INDETERMINATE) -junction = express_getattr(IfcCableFittingTypeEnum, 'JUNCTION', INDETERMINATE) -transition = express_getattr(IfcCableFittingTypeEnum, 'TRANSITION', INDETERMINATE) -userdefined = express_getattr(IfcCableFittingTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCableFittingTypeEnum, 'NOTDEFINED', INDETERMINATE) +connector = IfcCableFittingTypeEnum.CONNECTOR +entry = IfcCableFittingTypeEnum.ENTRY +exit = IfcCableFittingTypeEnum.EXIT +fanout = IfcCableFittingTypeEnum.FANOUT +junction = IfcCableFittingTypeEnum.JUNCTION +transition = IfcCableFittingTypeEnum.TRANSITION +userdefined = IfcCableFittingTypeEnum.USERDEFINED +notdefined = IfcCableFittingTypeEnum.NOTDEFINED IfcCableSegmentTypeEnum = enum_namespace() -busbarsegment = express_getattr(IfcCableSegmentTypeEnum, 'BUSBARSEGMENT', INDETERMINATE) -cablesegment = express_getattr(IfcCableSegmentTypeEnum, 'CABLESEGMENT', INDETERMINATE) -conductorsegment = express_getattr(IfcCableSegmentTypeEnum, 'CONDUCTORSEGMENT', INDETERMINATE) -contactwiresegment = express_getattr(IfcCableSegmentTypeEnum, 'CONTACTWIRESEGMENT', INDETERMINATE) -coresegment = express_getattr(IfcCableSegmentTypeEnum, 'CORESEGMENT', INDETERMINATE) -fibersegment = express_getattr(IfcCableSegmentTypeEnum, 'FIBERSEGMENT', INDETERMINATE) -fibertube = express_getattr(IfcCableSegmentTypeEnum, 'FIBERTUBE', INDETERMINATE) -opticalcablesegment = express_getattr(IfcCableSegmentTypeEnum, 'OPTICALCABLESEGMENT', INDETERMINATE) -stitchwire = express_getattr(IfcCableSegmentTypeEnum, 'STITCHWIRE', INDETERMINATE) -wirepairsegment = express_getattr(IfcCableSegmentTypeEnum, 'WIREPAIRSEGMENT', INDETERMINATE) -userdefined = express_getattr(IfcCableSegmentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCableSegmentTypeEnum, 'NOTDEFINED', INDETERMINATE) +busbarsegment = IfcCableSegmentTypeEnum.BUSBARSEGMENT +cablesegment = IfcCableSegmentTypeEnum.CABLESEGMENT +conductorsegment = IfcCableSegmentTypeEnum.CONDUCTORSEGMENT +contactwiresegment = IfcCableSegmentTypeEnum.CONTACTWIRESEGMENT +coresegment = IfcCableSegmentTypeEnum.CORESEGMENT +fibersegment = IfcCableSegmentTypeEnum.FIBERSEGMENT +fibertube = IfcCableSegmentTypeEnum.FIBERTUBE +opticalcablesegment = IfcCableSegmentTypeEnum.OPTICALCABLESEGMENT +stitchwire = IfcCableSegmentTypeEnum.STITCHWIRE +wirepairsegment = IfcCableSegmentTypeEnum.WIREPAIRSEGMENT +userdefined = IfcCableSegmentTypeEnum.USERDEFINED +notdefined = IfcCableSegmentTypeEnum.NOTDEFINED IfcCaissonFoundationTypeEnum = enum_namespace() -caisson = express_getattr(IfcCaissonFoundationTypeEnum, 'CAISSON', INDETERMINATE) -well = express_getattr(IfcCaissonFoundationTypeEnum, 'WELL', INDETERMINATE) -userdefined = express_getattr(IfcCaissonFoundationTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCaissonFoundationTypeEnum, 'NOTDEFINED', INDETERMINATE) +caisson = IfcCaissonFoundationTypeEnum.CAISSON +well = IfcCaissonFoundationTypeEnum.WELL +userdefined = IfcCaissonFoundationTypeEnum.USERDEFINED +notdefined = IfcCaissonFoundationTypeEnum.NOTDEFINED IfcChangeActionEnum = enum_namespace() -added = express_getattr(IfcChangeActionEnum, 'ADDED', INDETERMINATE) -deleted = express_getattr(IfcChangeActionEnum, 'DELETED', INDETERMINATE) -modified = express_getattr(IfcChangeActionEnum, 'MODIFIED', INDETERMINATE) -nochange = express_getattr(IfcChangeActionEnum, 'NOCHANGE', INDETERMINATE) -notdefined = express_getattr(IfcChangeActionEnum, 'NOTDEFINED', INDETERMINATE) +added = IfcChangeActionEnum.ADDED +deleted = IfcChangeActionEnum.DELETED +modified = IfcChangeActionEnum.MODIFIED +nochange = IfcChangeActionEnum.NOCHANGE +notdefined = IfcChangeActionEnum.NOTDEFINED IfcChillerTypeEnum = enum_namespace() -aircooled = express_getattr(IfcChillerTypeEnum, 'AIRCOOLED', INDETERMINATE) -heatrecovery = express_getattr(IfcChillerTypeEnum, 'HEATRECOVERY', INDETERMINATE) -watercooled = express_getattr(IfcChillerTypeEnum, 'WATERCOOLED', INDETERMINATE) -userdefined = express_getattr(IfcChillerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcChillerTypeEnum, 'NOTDEFINED', INDETERMINATE) +aircooled = IfcChillerTypeEnum.AIRCOOLED +heatrecovery = IfcChillerTypeEnum.HEATRECOVERY +watercooled = IfcChillerTypeEnum.WATERCOOLED +userdefined = IfcChillerTypeEnum.USERDEFINED +notdefined = IfcChillerTypeEnum.NOTDEFINED IfcChimneyTypeEnum = enum_namespace() -userdefined = express_getattr(IfcChimneyTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcChimneyTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcChimneyTypeEnum.USERDEFINED +notdefined = IfcChimneyTypeEnum.NOTDEFINED IfcCoilTypeEnum = enum_namespace() -dxcoolingcoil = express_getattr(IfcCoilTypeEnum, 'DXCOOLINGCOIL', INDETERMINATE) -electricheatingcoil = express_getattr(IfcCoilTypeEnum, 'ELECTRICHEATINGCOIL', INDETERMINATE) -gasheatingcoil = express_getattr(IfcCoilTypeEnum, 'GASHEATINGCOIL', INDETERMINATE) -hydroniccoil = express_getattr(IfcCoilTypeEnum, 'HYDRONICCOIL', INDETERMINATE) -steamheatingcoil = express_getattr(IfcCoilTypeEnum, 'STEAMHEATINGCOIL', INDETERMINATE) -watercoolingcoil = express_getattr(IfcCoilTypeEnum, 'WATERCOOLINGCOIL', INDETERMINATE) -waterheatingcoil = express_getattr(IfcCoilTypeEnum, 'WATERHEATINGCOIL', INDETERMINATE) -userdefined = express_getattr(IfcCoilTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCoilTypeEnum, 'NOTDEFINED', INDETERMINATE) +dxcoolingcoil = IfcCoilTypeEnum.DXCOOLINGCOIL +electricheatingcoil = IfcCoilTypeEnum.ELECTRICHEATINGCOIL +gasheatingcoil = IfcCoilTypeEnum.GASHEATINGCOIL +hydroniccoil = IfcCoilTypeEnum.HYDRONICCOIL +steamheatingcoil = IfcCoilTypeEnum.STEAMHEATINGCOIL +watercoolingcoil = IfcCoilTypeEnum.WATERCOOLINGCOIL +waterheatingcoil = IfcCoilTypeEnum.WATERHEATINGCOIL +userdefined = IfcCoilTypeEnum.USERDEFINED +notdefined = IfcCoilTypeEnum.NOTDEFINED IfcColumnTypeEnum = enum_namespace() -column = express_getattr(IfcColumnTypeEnum, 'COLUMN', INDETERMINATE) -pierstem = express_getattr(IfcColumnTypeEnum, 'PIERSTEM', INDETERMINATE) -pierstem_segment = express_getattr(IfcColumnTypeEnum, 'PIERSTEM_SEGMENT', INDETERMINATE) -pilaster = express_getattr(IfcColumnTypeEnum, 'PILASTER', INDETERMINATE) -standcolumn = express_getattr(IfcColumnTypeEnum, 'STANDCOLUMN', INDETERMINATE) -userdefined = express_getattr(IfcColumnTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcColumnTypeEnum, 'NOTDEFINED', INDETERMINATE) +column = IfcColumnTypeEnum.COLUMN +pierstem = IfcColumnTypeEnum.PIERSTEM +pierstem_segment = IfcColumnTypeEnum.PIERSTEM_SEGMENT +pilaster = IfcColumnTypeEnum.PILASTER +standcolumn = IfcColumnTypeEnum.STANDCOLUMN +userdefined = IfcColumnTypeEnum.USERDEFINED +notdefined = IfcColumnTypeEnum.NOTDEFINED IfcCommunicationsApplianceTypeEnum = enum_namespace() -antenna = express_getattr(IfcCommunicationsApplianceTypeEnum, 'ANTENNA', INDETERMINATE) -automaton = express_getattr(IfcCommunicationsApplianceTypeEnum, 'AUTOMATON', INDETERMINATE) -computer = express_getattr(IfcCommunicationsApplianceTypeEnum, 'COMPUTER', INDETERMINATE) -fax = express_getattr(IfcCommunicationsApplianceTypeEnum, 'FAX', INDETERMINATE) -gateway = express_getattr(IfcCommunicationsApplianceTypeEnum, 'GATEWAY', INDETERMINATE) -intelligentperipheral = express_getattr(IfcCommunicationsApplianceTypeEnum, 'INTELLIGENTPERIPHERAL', INDETERMINATE) -ipnetworkequipment = express_getattr(IfcCommunicationsApplianceTypeEnum, 'IPNETWORKEQUIPMENT', INDETERMINATE) -linesideelectronicunit = express_getattr(IfcCommunicationsApplianceTypeEnum, 'LINESIDEELECTRONICUNIT', INDETERMINATE) -modem = express_getattr(IfcCommunicationsApplianceTypeEnum, 'MODEM', INDETERMINATE) -networkappliance = express_getattr(IfcCommunicationsApplianceTypeEnum, 'NETWORKAPPLIANCE', INDETERMINATE) -networkbridge = express_getattr(IfcCommunicationsApplianceTypeEnum, 'NETWORKBRIDGE', INDETERMINATE) -networkhub = express_getattr(IfcCommunicationsApplianceTypeEnum, 'NETWORKHUB', INDETERMINATE) -opticallineterminal = express_getattr(IfcCommunicationsApplianceTypeEnum, 'OPTICALLINETERMINAL', INDETERMINATE) -opticalnetworkunit = express_getattr(IfcCommunicationsApplianceTypeEnum, 'OPTICALNETWORKUNIT', INDETERMINATE) -printer = express_getattr(IfcCommunicationsApplianceTypeEnum, 'PRINTER', INDETERMINATE) -radioblockcenter = express_getattr(IfcCommunicationsApplianceTypeEnum, 'RADIOBLOCKCENTER', INDETERMINATE) -repeater = express_getattr(IfcCommunicationsApplianceTypeEnum, 'REPEATER', INDETERMINATE) -router = express_getattr(IfcCommunicationsApplianceTypeEnum, 'ROUTER', INDETERMINATE) -scanner = express_getattr(IfcCommunicationsApplianceTypeEnum, 'SCANNER', INDETERMINATE) -telecommand = express_getattr(IfcCommunicationsApplianceTypeEnum, 'TELECOMMAND', INDETERMINATE) -telephonyexchange = express_getattr(IfcCommunicationsApplianceTypeEnum, 'TELEPHONYEXCHANGE', INDETERMINATE) -transitioncomponent = express_getattr(IfcCommunicationsApplianceTypeEnum, 'TRANSITIONCOMPONENT', INDETERMINATE) -transponder = express_getattr(IfcCommunicationsApplianceTypeEnum, 'TRANSPONDER', INDETERMINATE) -transportequipment = express_getattr(IfcCommunicationsApplianceTypeEnum, 'TRANSPORTEQUIPMENT', INDETERMINATE) -userdefined = express_getattr(IfcCommunicationsApplianceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCommunicationsApplianceTypeEnum, 'NOTDEFINED', INDETERMINATE) +antenna = IfcCommunicationsApplianceTypeEnum.ANTENNA +automaton = IfcCommunicationsApplianceTypeEnum.AUTOMATON +computer = IfcCommunicationsApplianceTypeEnum.COMPUTER +fax = IfcCommunicationsApplianceTypeEnum.FAX +gateway = IfcCommunicationsApplianceTypeEnum.GATEWAY +intelligentperipheral = IfcCommunicationsApplianceTypeEnum.INTELLIGENTPERIPHERAL +ipnetworkequipment = IfcCommunicationsApplianceTypeEnum.IPNETWORKEQUIPMENT +linesideelectronicunit = IfcCommunicationsApplianceTypeEnum.LINESIDEELECTRONICUNIT +modem = IfcCommunicationsApplianceTypeEnum.MODEM +networkappliance = IfcCommunicationsApplianceTypeEnum.NETWORKAPPLIANCE +networkbridge = IfcCommunicationsApplianceTypeEnum.NETWORKBRIDGE +networkhub = IfcCommunicationsApplianceTypeEnum.NETWORKHUB +opticallineterminal = IfcCommunicationsApplianceTypeEnum.OPTICALLINETERMINAL +opticalnetworkunit = IfcCommunicationsApplianceTypeEnum.OPTICALNETWORKUNIT +printer = IfcCommunicationsApplianceTypeEnum.PRINTER +radioblockcenter = IfcCommunicationsApplianceTypeEnum.RADIOBLOCKCENTER +repeater = IfcCommunicationsApplianceTypeEnum.REPEATER +router = IfcCommunicationsApplianceTypeEnum.ROUTER +scanner = IfcCommunicationsApplianceTypeEnum.SCANNER +telecommand = IfcCommunicationsApplianceTypeEnum.TELECOMMAND +telephonyexchange = IfcCommunicationsApplianceTypeEnum.TELEPHONYEXCHANGE +transitioncomponent = IfcCommunicationsApplianceTypeEnum.TRANSITIONCOMPONENT +transponder = IfcCommunicationsApplianceTypeEnum.TRANSPONDER +transportequipment = IfcCommunicationsApplianceTypeEnum.TRANSPORTEQUIPMENT +userdefined = IfcCommunicationsApplianceTypeEnum.USERDEFINED +notdefined = IfcCommunicationsApplianceTypeEnum.NOTDEFINED IfcComplexPropertyTemplateTypeEnum = enum_namespace() -p_complex = express_getattr(IfcComplexPropertyTemplateTypeEnum, 'P_COMPLEX', INDETERMINATE) -q_complex = express_getattr(IfcComplexPropertyTemplateTypeEnum, 'Q_COMPLEX', INDETERMINATE) +p_complex = IfcComplexPropertyTemplateTypeEnum.P_COMPLEX +q_complex = IfcComplexPropertyTemplateTypeEnum.Q_COMPLEX IfcCompressorTypeEnum = enum_namespace() -booster = express_getattr(IfcCompressorTypeEnum, 'BOOSTER', INDETERMINATE) -dynamic = express_getattr(IfcCompressorTypeEnum, 'DYNAMIC', INDETERMINATE) -hermetic = express_getattr(IfcCompressorTypeEnum, 'HERMETIC', INDETERMINATE) -opentype = express_getattr(IfcCompressorTypeEnum, 'OPENTYPE', INDETERMINATE) -reciprocating = express_getattr(IfcCompressorTypeEnum, 'RECIPROCATING', INDETERMINATE) -rollingpiston = express_getattr(IfcCompressorTypeEnum, 'ROLLINGPISTON', INDETERMINATE) -rotary = express_getattr(IfcCompressorTypeEnum, 'ROTARY', INDETERMINATE) -rotaryvane = express_getattr(IfcCompressorTypeEnum, 'ROTARYVANE', INDETERMINATE) -scroll = express_getattr(IfcCompressorTypeEnum, 'SCROLL', INDETERMINATE) -semihermetic = express_getattr(IfcCompressorTypeEnum, 'SEMIHERMETIC', INDETERMINATE) -singlescrew = express_getattr(IfcCompressorTypeEnum, 'SINGLESCREW', INDETERMINATE) -singlestage = express_getattr(IfcCompressorTypeEnum, 'SINGLESTAGE', INDETERMINATE) -trochoidal = express_getattr(IfcCompressorTypeEnum, 'TROCHOIDAL', INDETERMINATE) -twinscrew = express_getattr(IfcCompressorTypeEnum, 'TWINSCREW', INDETERMINATE) -weldedshellhermetic = express_getattr(IfcCompressorTypeEnum, 'WELDEDSHELLHERMETIC', INDETERMINATE) -userdefined = express_getattr(IfcCompressorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCompressorTypeEnum, 'NOTDEFINED', INDETERMINATE) +booster = IfcCompressorTypeEnum.BOOSTER +dynamic = IfcCompressorTypeEnum.DYNAMIC +hermetic = IfcCompressorTypeEnum.HERMETIC +opentype = IfcCompressorTypeEnum.OPENTYPE +reciprocating = IfcCompressorTypeEnum.RECIPROCATING +rollingpiston = IfcCompressorTypeEnum.ROLLINGPISTON +rotary = IfcCompressorTypeEnum.ROTARY +rotaryvane = IfcCompressorTypeEnum.ROTARYVANE +scroll = IfcCompressorTypeEnum.SCROLL +semihermetic = IfcCompressorTypeEnum.SEMIHERMETIC +singlescrew = IfcCompressorTypeEnum.SINGLESCREW +singlestage = IfcCompressorTypeEnum.SINGLESTAGE +trochoidal = IfcCompressorTypeEnum.TROCHOIDAL +twinscrew = IfcCompressorTypeEnum.TWINSCREW +weldedshellhermetic = IfcCompressorTypeEnum.WELDEDSHELLHERMETIC +userdefined = IfcCompressorTypeEnum.USERDEFINED +notdefined = IfcCompressorTypeEnum.NOTDEFINED IfcCondenserTypeEnum = enum_namespace() -aircooled = express_getattr(IfcCondenserTypeEnum, 'AIRCOOLED', INDETERMINATE) -evaporativecooled = express_getattr(IfcCondenserTypeEnum, 'EVAPORATIVECOOLED', INDETERMINATE) -watercooled = express_getattr(IfcCondenserTypeEnum, 'WATERCOOLED', INDETERMINATE) -watercooledbrazedplate = express_getattr(IfcCondenserTypeEnum, 'WATERCOOLEDBRAZEDPLATE', INDETERMINATE) -watercooledshellcoil = express_getattr(IfcCondenserTypeEnum, 'WATERCOOLEDSHELLCOIL', INDETERMINATE) -watercooledshelltube = express_getattr(IfcCondenserTypeEnum, 'WATERCOOLEDSHELLTUBE', INDETERMINATE) -watercooledtubeintube = express_getattr(IfcCondenserTypeEnum, 'WATERCOOLEDTUBEINTUBE', INDETERMINATE) -userdefined = express_getattr(IfcCondenserTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCondenserTypeEnum, 'NOTDEFINED', INDETERMINATE) +aircooled = IfcCondenserTypeEnum.AIRCOOLED +evaporativecooled = IfcCondenserTypeEnum.EVAPORATIVECOOLED +watercooled = IfcCondenserTypeEnum.WATERCOOLED +watercooledbrazedplate = IfcCondenserTypeEnum.WATERCOOLEDBRAZEDPLATE +watercooledshellcoil = IfcCondenserTypeEnum.WATERCOOLEDSHELLCOIL +watercooledshelltube = IfcCondenserTypeEnum.WATERCOOLEDSHELLTUBE +watercooledtubeintube = IfcCondenserTypeEnum.WATERCOOLEDTUBEINTUBE +userdefined = IfcCondenserTypeEnum.USERDEFINED +notdefined = IfcCondenserTypeEnum.NOTDEFINED IfcConnectionTypeEnum = enum_namespace() -atend = express_getattr(IfcConnectionTypeEnum, 'ATEND', INDETERMINATE) -atpath = express_getattr(IfcConnectionTypeEnum, 'ATPATH', INDETERMINATE) -atstart = express_getattr(IfcConnectionTypeEnum, 'ATSTART', INDETERMINATE) -notdefined = express_getattr(IfcConnectionTypeEnum, 'NOTDEFINED', INDETERMINATE) +atend = IfcConnectionTypeEnum.ATEND +atpath = IfcConnectionTypeEnum.ATPATH +atstart = IfcConnectionTypeEnum.ATSTART +notdefined = IfcConnectionTypeEnum.NOTDEFINED IfcConstraintEnum = enum_namespace() -advisory = express_getattr(IfcConstraintEnum, 'ADVISORY', INDETERMINATE) -hard = express_getattr(IfcConstraintEnum, 'HARD', INDETERMINATE) -soft = express_getattr(IfcConstraintEnum, 'SOFT', INDETERMINATE) -userdefined = express_getattr(IfcConstraintEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcConstraintEnum, 'NOTDEFINED', INDETERMINATE) +advisory = IfcConstraintEnum.ADVISORY +hard = IfcConstraintEnum.HARD +soft = IfcConstraintEnum.SOFT +userdefined = IfcConstraintEnum.USERDEFINED +notdefined = IfcConstraintEnum.NOTDEFINED IfcConstructionEquipmentResourceTypeEnum = enum_namespace() -demolishing = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'DEMOLISHING', INDETERMINATE) -earthmoving = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'EARTHMOVING', INDETERMINATE) -erecting = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'ERECTING', INDETERMINATE) -heating = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'HEATING', INDETERMINATE) -lighting = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'LIGHTING', INDETERMINATE) -paving = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'PAVING', INDETERMINATE) -pumping = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'PUMPING', INDETERMINATE) -transporting = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'TRANSPORTING', INDETERMINATE) -userdefined = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcConstructionEquipmentResourceTypeEnum, 'NOTDEFINED', INDETERMINATE) +demolishing = IfcConstructionEquipmentResourceTypeEnum.DEMOLISHING +earthmoving = IfcConstructionEquipmentResourceTypeEnum.EARTHMOVING +erecting = IfcConstructionEquipmentResourceTypeEnum.ERECTING +heating = IfcConstructionEquipmentResourceTypeEnum.HEATING +lighting = IfcConstructionEquipmentResourceTypeEnum.LIGHTING +paving = IfcConstructionEquipmentResourceTypeEnum.PAVING +pumping = IfcConstructionEquipmentResourceTypeEnum.PUMPING +transporting = IfcConstructionEquipmentResourceTypeEnum.TRANSPORTING +userdefined = IfcConstructionEquipmentResourceTypeEnum.USERDEFINED +notdefined = IfcConstructionEquipmentResourceTypeEnum.NOTDEFINED IfcConstructionMaterialResourceTypeEnum = enum_namespace() -aggregates = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'AGGREGATES', INDETERMINATE) -concrete = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'CONCRETE', INDETERMINATE) -drywall = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'DRYWALL', INDETERMINATE) -fuel = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'FUEL', INDETERMINATE) -gypsum = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'GYPSUM', INDETERMINATE) -masonry = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'MASONRY', INDETERMINATE) -metal = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'METAL', INDETERMINATE) -plastic = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'PLASTIC', INDETERMINATE) -wood = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'WOOD', INDETERMINATE) -userdefined = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcConstructionMaterialResourceTypeEnum, 'NOTDEFINED', INDETERMINATE) +aggregates = IfcConstructionMaterialResourceTypeEnum.AGGREGATES +concrete = IfcConstructionMaterialResourceTypeEnum.CONCRETE +drywall = IfcConstructionMaterialResourceTypeEnum.DRYWALL +fuel = IfcConstructionMaterialResourceTypeEnum.FUEL +gypsum = IfcConstructionMaterialResourceTypeEnum.GYPSUM +masonry = IfcConstructionMaterialResourceTypeEnum.MASONRY +metal = IfcConstructionMaterialResourceTypeEnum.METAL +plastic = IfcConstructionMaterialResourceTypeEnum.PLASTIC +wood = IfcConstructionMaterialResourceTypeEnum.WOOD +userdefined = IfcConstructionMaterialResourceTypeEnum.USERDEFINED +notdefined = IfcConstructionMaterialResourceTypeEnum.NOTDEFINED IfcConstructionProductResourceTypeEnum = enum_namespace() -assembly = express_getattr(IfcConstructionProductResourceTypeEnum, 'ASSEMBLY', INDETERMINATE) -formwork = express_getattr(IfcConstructionProductResourceTypeEnum, 'FORMWORK', INDETERMINATE) -userdefined = express_getattr(IfcConstructionProductResourceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcConstructionProductResourceTypeEnum, 'NOTDEFINED', INDETERMINATE) +assembly = IfcConstructionProductResourceTypeEnum.ASSEMBLY +formwork = IfcConstructionProductResourceTypeEnum.FORMWORK +userdefined = IfcConstructionProductResourceTypeEnum.USERDEFINED +notdefined = IfcConstructionProductResourceTypeEnum.NOTDEFINED IfcControllerTypeEnum = enum_namespace() -floating = express_getattr(IfcControllerTypeEnum, 'FLOATING', INDETERMINATE) -multiposition = express_getattr(IfcControllerTypeEnum, 'MULTIPOSITION', INDETERMINATE) -programmable = express_getattr(IfcControllerTypeEnum, 'PROGRAMMABLE', INDETERMINATE) -proportional = express_getattr(IfcControllerTypeEnum, 'PROPORTIONAL', INDETERMINATE) -twoposition = express_getattr(IfcControllerTypeEnum, 'TWOPOSITION', INDETERMINATE) -userdefined = express_getattr(IfcControllerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcControllerTypeEnum, 'NOTDEFINED', INDETERMINATE) +floating = IfcControllerTypeEnum.FLOATING +multiposition = IfcControllerTypeEnum.MULTIPOSITION +programmable = IfcControllerTypeEnum.PROGRAMMABLE +proportional = IfcControllerTypeEnum.PROPORTIONAL +twoposition = IfcControllerTypeEnum.TWOPOSITION +userdefined = IfcControllerTypeEnum.USERDEFINED +notdefined = IfcControllerTypeEnum.NOTDEFINED IfcConveyorSegmentTypeEnum = enum_namespace() -beltconveyor = express_getattr(IfcConveyorSegmentTypeEnum, 'BELTCONVEYOR', INDETERMINATE) -bucketconveyor = express_getattr(IfcConveyorSegmentTypeEnum, 'BUCKETCONVEYOR', INDETERMINATE) -chuteconveyor = express_getattr(IfcConveyorSegmentTypeEnum, 'CHUTECONVEYOR', INDETERMINATE) -screwconveyor = express_getattr(IfcConveyorSegmentTypeEnum, 'SCREWCONVEYOR', INDETERMINATE) -userdefined = express_getattr(IfcConveyorSegmentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcConveyorSegmentTypeEnum, 'NOTDEFINED', INDETERMINATE) +beltconveyor = IfcConveyorSegmentTypeEnum.BELTCONVEYOR +bucketconveyor = IfcConveyorSegmentTypeEnum.BUCKETCONVEYOR +chuteconveyor = IfcConveyorSegmentTypeEnum.CHUTECONVEYOR +screwconveyor = IfcConveyorSegmentTypeEnum.SCREWCONVEYOR +userdefined = IfcConveyorSegmentTypeEnum.USERDEFINED +notdefined = IfcConveyorSegmentTypeEnum.NOTDEFINED IfcCooledBeamTypeEnum = enum_namespace() -active = express_getattr(IfcCooledBeamTypeEnum, 'ACTIVE', INDETERMINATE) -passive = express_getattr(IfcCooledBeamTypeEnum, 'PASSIVE', INDETERMINATE) -userdefined = express_getattr(IfcCooledBeamTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCooledBeamTypeEnum, 'NOTDEFINED', INDETERMINATE) +active = IfcCooledBeamTypeEnum.ACTIVE +passive = IfcCooledBeamTypeEnum.PASSIVE +userdefined = IfcCooledBeamTypeEnum.USERDEFINED +notdefined = IfcCooledBeamTypeEnum.NOTDEFINED IfcCoolingTowerTypeEnum = enum_namespace() -mechanicalforceddraft = express_getattr(IfcCoolingTowerTypeEnum, 'MECHANICALFORCEDDRAFT', INDETERMINATE) -mechanicalinduceddraft = express_getattr(IfcCoolingTowerTypeEnum, 'MECHANICALINDUCEDDRAFT', INDETERMINATE) -naturaldraft = express_getattr(IfcCoolingTowerTypeEnum, 'NATURALDRAFT', INDETERMINATE) -userdefined = express_getattr(IfcCoolingTowerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCoolingTowerTypeEnum, 'NOTDEFINED', INDETERMINATE) +mechanicalforceddraft = IfcCoolingTowerTypeEnum.MECHANICALFORCEDDRAFT +mechanicalinduceddraft = IfcCoolingTowerTypeEnum.MECHANICALINDUCEDDRAFT +naturaldraft = IfcCoolingTowerTypeEnum.NATURALDRAFT +userdefined = IfcCoolingTowerTypeEnum.USERDEFINED +notdefined = IfcCoolingTowerTypeEnum.NOTDEFINED IfcCostItemTypeEnum = enum_namespace() -userdefined = express_getattr(IfcCostItemTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCostItemTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcCostItemTypeEnum.USERDEFINED +notdefined = IfcCostItemTypeEnum.NOTDEFINED IfcCostScheduleTypeEnum = enum_namespace() -budget = express_getattr(IfcCostScheduleTypeEnum, 'BUDGET', INDETERMINATE) -costplan = express_getattr(IfcCostScheduleTypeEnum, 'COSTPLAN', INDETERMINATE) -estimate = express_getattr(IfcCostScheduleTypeEnum, 'ESTIMATE', INDETERMINATE) -pricedbillofquantities = express_getattr(IfcCostScheduleTypeEnum, 'PRICEDBILLOFQUANTITIES', INDETERMINATE) -scheduleofrates = express_getattr(IfcCostScheduleTypeEnum, 'SCHEDULEOFRATES', INDETERMINATE) -tender = express_getattr(IfcCostScheduleTypeEnum, 'TENDER', INDETERMINATE) -unpricedbillofquantities = express_getattr(IfcCostScheduleTypeEnum, 'UNPRICEDBILLOFQUANTITIES', INDETERMINATE) -userdefined = express_getattr(IfcCostScheduleTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCostScheduleTypeEnum, 'NOTDEFINED', INDETERMINATE) +budget = IfcCostScheduleTypeEnum.BUDGET +costplan = IfcCostScheduleTypeEnum.COSTPLAN +estimate = IfcCostScheduleTypeEnum.ESTIMATE +pricedbillofquantities = IfcCostScheduleTypeEnum.PRICEDBILLOFQUANTITIES +scheduleofrates = IfcCostScheduleTypeEnum.SCHEDULEOFRATES +tender = IfcCostScheduleTypeEnum.TENDER +unpricedbillofquantities = IfcCostScheduleTypeEnum.UNPRICEDBILLOFQUANTITIES +userdefined = IfcCostScheduleTypeEnum.USERDEFINED +notdefined = IfcCostScheduleTypeEnum.NOTDEFINED IfcCourseTypeEnum = enum_namespace() -armour = express_getattr(IfcCourseTypeEnum, 'ARMOUR', INDETERMINATE) -ballastbed = express_getattr(IfcCourseTypeEnum, 'BALLASTBED', INDETERMINATE) -core = express_getattr(IfcCourseTypeEnum, 'CORE', INDETERMINATE) -filter = express_getattr(IfcCourseTypeEnum, 'FILTER', INDETERMINATE) -pavement = express_getattr(IfcCourseTypeEnum, 'PAVEMENT', INDETERMINATE) -protection = express_getattr(IfcCourseTypeEnum, 'PROTECTION', INDETERMINATE) -userdefined = express_getattr(IfcCourseTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCourseTypeEnum, 'NOTDEFINED', INDETERMINATE) +armour = IfcCourseTypeEnum.ARMOUR +ballastbed = IfcCourseTypeEnum.BALLASTBED +core = IfcCourseTypeEnum.CORE +filter = IfcCourseTypeEnum.FILTER +pavement = IfcCourseTypeEnum.PAVEMENT +protection = IfcCourseTypeEnum.PROTECTION +userdefined = IfcCourseTypeEnum.USERDEFINED +notdefined = IfcCourseTypeEnum.NOTDEFINED IfcCoveringTypeEnum = enum_namespace() -ceiling = express_getattr(IfcCoveringTypeEnum, 'CEILING', INDETERMINATE) -cladding = express_getattr(IfcCoveringTypeEnum, 'CLADDING', INDETERMINATE) -coping = express_getattr(IfcCoveringTypeEnum, 'COPING', INDETERMINATE) -flooring = express_getattr(IfcCoveringTypeEnum, 'FLOORING', INDETERMINATE) -insulation = express_getattr(IfcCoveringTypeEnum, 'INSULATION', INDETERMINATE) -membrane = express_getattr(IfcCoveringTypeEnum, 'MEMBRANE', INDETERMINATE) -molding = express_getattr(IfcCoveringTypeEnum, 'MOLDING', INDETERMINATE) -roofing = express_getattr(IfcCoveringTypeEnum, 'ROOFING', INDETERMINATE) -skirtingboard = express_getattr(IfcCoveringTypeEnum, 'SKIRTINGBOARD', INDETERMINATE) -sleeving = express_getattr(IfcCoveringTypeEnum, 'SLEEVING', INDETERMINATE) -topping = express_getattr(IfcCoveringTypeEnum, 'TOPPING', INDETERMINATE) -wrapping = express_getattr(IfcCoveringTypeEnum, 'WRAPPING', INDETERMINATE) -userdefined = express_getattr(IfcCoveringTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCoveringTypeEnum, 'NOTDEFINED', INDETERMINATE) +ceiling = IfcCoveringTypeEnum.CEILING +cladding = IfcCoveringTypeEnum.CLADDING +coping = IfcCoveringTypeEnum.COPING +flooring = IfcCoveringTypeEnum.FLOORING +insulation = IfcCoveringTypeEnum.INSULATION +membrane = IfcCoveringTypeEnum.MEMBRANE +molding = IfcCoveringTypeEnum.MOLDING +roofing = IfcCoveringTypeEnum.ROOFING +skirtingboard = IfcCoveringTypeEnum.SKIRTINGBOARD +sleeving = IfcCoveringTypeEnum.SLEEVING +topping = IfcCoveringTypeEnum.TOPPING +wrapping = IfcCoveringTypeEnum.WRAPPING +userdefined = IfcCoveringTypeEnum.USERDEFINED +notdefined = IfcCoveringTypeEnum.NOTDEFINED IfcCrewResourceTypeEnum = enum_namespace() -office = express_getattr(IfcCrewResourceTypeEnum, 'OFFICE', INDETERMINATE) -site = express_getattr(IfcCrewResourceTypeEnum, 'SITE', INDETERMINATE) -userdefined = express_getattr(IfcCrewResourceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCrewResourceTypeEnum, 'NOTDEFINED', INDETERMINATE) +office = IfcCrewResourceTypeEnum.OFFICE +site = IfcCrewResourceTypeEnum.SITE +userdefined = IfcCrewResourceTypeEnum.USERDEFINED +notdefined = IfcCrewResourceTypeEnum.NOTDEFINED IfcCurtainWallTypeEnum = enum_namespace() -userdefined = express_getattr(IfcCurtainWallTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcCurtainWallTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcCurtainWallTypeEnum.USERDEFINED +notdefined = IfcCurtainWallTypeEnum.NOTDEFINED IfcCurveInterpolationEnum = enum_namespace() -linear = express_getattr(IfcCurveInterpolationEnum, 'LINEAR', INDETERMINATE) -log_linear = express_getattr(IfcCurveInterpolationEnum, 'LOG_LINEAR', INDETERMINATE) -log_log = express_getattr(IfcCurveInterpolationEnum, 'LOG_LOG', INDETERMINATE) -notdefined = express_getattr(IfcCurveInterpolationEnum, 'NOTDEFINED', INDETERMINATE) +linear = IfcCurveInterpolationEnum.LINEAR +log_linear = IfcCurveInterpolationEnum.LOG_LINEAR +log_log = IfcCurveInterpolationEnum.LOG_LOG +notdefined = IfcCurveInterpolationEnum.NOTDEFINED IfcDamperTypeEnum = enum_namespace() -backdraftdamper = express_getattr(IfcDamperTypeEnum, 'BACKDRAFTDAMPER', INDETERMINATE) -balancingdamper = express_getattr(IfcDamperTypeEnum, 'BALANCINGDAMPER', INDETERMINATE) -blastdamper = express_getattr(IfcDamperTypeEnum, 'BLASTDAMPER', INDETERMINATE) -controldamper = express_getattr(IfcDamperTypeEnum, 'CONTROLDAMPER', INDETERMINATE) -firedamper = express_getattr(IfcDamperTypeEnum, 'FIREDAMPER', INDETERMINATE) -firesmokedamper = express_getattr(IfcDamperTypeEnum, 'FIRESMOKEDAMPER', INDETERMINATE) -fumehoodexhaust = express_getattr(IfcDamperTypeEnum, 'FUMEHOODEXHAUST', INDETERMINATE) -gravitydamper = express_getattr(IfcDamperTypeEnum, 'GRAVITYDAMPER', INDETERMINATE) -gravityreliefdamper = express_getattr(IfcDamperTypeEnum, 'GRAVITYRELIEFDAMPER', INDETERMINATE) -reliefdamper = express_getattr(IfcDamperTypeEnum, 'RELIEFDAMPER', INDETERMINATE) -smokedamper = express_getattr(IfcDamperTypeEnum, 'SMOKEDAMPER', INDETERMINATE) -userdefined = express_getattr(IfcDamperTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDamperTypeEnum, 'NOTDEFINED', INDETERMINATE) +backdraftdamper = IfcDamperTypeEnum.BACKDRAFTDAMPER +balancingdamper = IfcDamperTypeEnum.BALANCINGDAMPER +blastdamper = IfcDamperTypeEnum.BLASTDAMPER +controldamper = IfcDamperTypeEnum.CONTROLDAMPER +firedamper = IfcDamperTypeEnum.FIREDAMPER +firesmokedamper = IfcDamperTypeEnum.FIRESMOKEDAMPER +fumehoodexhaust = IfcDamperTypeEnum.FUMEHOODEXHAUST +gravitydamper = IfcDamperTypeEnum.GRAVITYDAMPER +gravityreliefdamper = IfcDamperTypeEnum.GRAVITYRELIEFDAMPER +reliefdamper = IfcDamperTypeEnum.RELIEFDAMPER +smokedamper = IfcDamperTypeEnum.SMOKEDAMPER +userdefined = IfcDamperTypeEnum.USERDEFINED +notdefined = IfcDamperTypeEnum.NOTDEFINED IfcDataOriginEnum = enum_namespace() -measured = express_getattr(IfcDataOriginEnum, 'MEASURED', INDETERMINATE) -predicted = express_getattr(IfcDataOriginEnum, 'PREDICTED', INDETERMINATE) -simulated = express_getattr(IfcDataOriginEnum, 'SIMULATED', INDETERMINATE) -userdefined = express_getattr(IfcDataOriginEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDataOriginEnum, 'NOTDEFINED', INDETERMINATE) +measured = IfcDataOriginEnum.MEASURED +predicted = IfcDataOriginEnum.PREDICTED +simulated = IfcDataOriginEnum.SIMULATED +userdefined = IfcDataOriginEnum.USERDEFINED +notdefined = IfcDataOriginEnum.NOTDEFINED IfcDerivedUnitEnum = enum_namespace() -accelerationunit = express_getattr(IfcDerivedUnitEnum, 'ACCELERATIONUNIT', INDETERMINATE) -angularvelocityunit = express_getattr(IfcDerivedUnitEnum, 'ANGULARVELOCITYUNIT', INDETERMINATE) -areadensityunit = express_getattr(IfcDerivedUnitEnum, 'AREADENSITYUNIT', INDETERMINATE) -compoundplaneangleunit = express_getattr(IfcDerivedUnitEnum, 'COMPOUNDPLANEANGLEUNIT', INDETERMINATE) -curvatureunit = express_getattr(IfcDerivedUnitEnum, 'CURVATUREUNIT', INDETERMINATE) -dynamicviscosityunit = express_getattr(IfcDerivedUnitEnum, 'DYNAMICVISCOSITYUNIT', INDETERMINATE) -heatfluxdensityunit = express_getattr(IfcDerivedUnitEnum, 'HEATFLUXDENSITYUNIT', INDETERMINATE) -heatingvalueunit = express_getattr(IfcDerivedUnitEnum, 'HEATINGVALUEUNIT', INDETERMINATE) -integercountrateunit = express_getattr(IfcDerivedUnitEnum, 'INTEGERCOUNTRATEUNIT', INDETERMINATE) -ionconcentrationunit = express_getattr(IfcDerivedUnitEnum, 'IONCONCENTRATIONUNIT', INDETERMINATE) -isothermalmoisturecapacityunit = express_getattr(IfcDerivedUnitEnum, 'ISOTHERMALMOISTURECAPACITYUNIT', INDETERMINATE) -kinematicviscosityunit = express_getattr(IfcDerivedUnitEnum, 'KINEMATICVISCOSITYUNIT', INDETERMINATE) -linearforceunit = express_getattr(IfcDerivedUnitEnum, 'LINEARFORCEUNIT', INDETERMINATE) -linearmomentunit = express_getattr(IfcDerivedUnitEnum, 'LINEARMOMENTUNIT', INDETERMINATE) -linearstiffnessunit = express_getattr(IfcDerivedUnitEnum, 'LINEARSTIFFNESSUNIT', INDETERMINATE) -linearvelocityunit = express_getattr(IfcDerivedUnitEnum, 'LINEARVELOCITYUNIT', INDETERMINATE) -luminousintensitydistributionunit = express_getattr(IfcDerivedUnitEnum, 'LUMINOUSINTENSITYDISTRIBUTIONUNIT', INDETERMINATE) -massdensityunit = express_getattr(IfcDerivedUnitEnum, 'MASSDENSITYUNIT', INDETERMINATE) -massflowrateunit = express_getattr(IfcDerivedUnitEnum, 'MASSFLOWRATEUNIT', INDETERMINATE) -massperlengthunit = express_getattr(IfcDerivedUnitEnum, 'MASSPERLENGTHUNIT', INDETERMINATE) -modulusofelasticityunit = express_getattr(IfcDerivedUnitEnum, 'MODULUSOFELASTICITYUNIT', INDETERMINATE) -modulusoflinearsubgradereactionunit = express_getattr(IfcDerivedUnitEnum, 'MODULUSOFLINEARSUBGRADEREACTIONUNIT', INDETERMINATE) -modulusofrotationalsubgradereactionunit = express_getattr(IfcDerivedUnitEnum, 'MODULUSOFROTATIONALSUBGRADEREACTIONUNIT', INDETERMINATE) -modulusofsubgradereactionunit = express_getattr(IfcDerivedUnitEnum, 'MODULUSOFSUBGRADEREACTIONUNIT', INDETERMINATE) -moisturediffusivityunit = express_getattr(IfcDerivedUnitEnum, 'MOISTUREDIFFUSIVITYUNIT', INDETERMINATE) -molecularweightunit = express_getattr(IfcDerivedUnitEnum, 'MOLECULARWEIGHTUNIT', INDETERMINATE) -momentofinertiaunit = express_getattr(IfcDerivedUnitEnum, 'MOMENTOFINERTIAUNIT', INDETERMINATE) -phunit = express_getattr(IfcDerivedUnitEnum, 'PHUNIT', INDETERMINATE) -planarforceunit = express_getattr(IfcDerivedUnitEnum, 'PLANARFORCEUNIT', INDETERMINATE) -rotationalfrequencyunit = express_getattr(IfcDerivedUnitEnum, 'ROTATIONALFREQUENCYUNIT', INDETERMINATE) -rotationalmassunit = express_getattr(IfcDerivedUnitEnum, 'ROTATIONALMASSUNIT', INDETERMINATE) -rotationalstiffnessunit = express_getattr(IfcDerivedUnitEnum, 'ROTATIONALSTIFFNESSUNIT', INDETERMINATE) -sectionareaintegralunit = express_getattr(IfcDerivedUnitEnum, 'SECTIONAREAINTEGRALUNIT', INDETERMINATE) -sectionmodulusunit = express_getattr(IfcDerivedUnitEnum, 'SECTIONMODULUSUNIT', INDETERMINATE) -shearmodulusunit = express_getattr(IfcDerivedUnitEnum, 'SHEARMODULUSUNIT', INDETERMINATE) -soundpowerlevelunit = express_getattr(IfcDerivedUnitEnum, 'SOUNDPOWERLEVELUNIT', INDETERMINATE) -soundpowerunit = express_getattr(IfcDerivedUnitEnum, 'SOUNDPOWERUNIT', INDETERMINATE) -soundpressurelevelunit = express_getattr(IfcDerivedUnitEnum, 'SOUNDPRESSURELEVELUNIT', INDETERMINATE) -soundpressureunit = express_getattr(IfcDerivedUnitEnum, 'SOUNDPRESSUREUNIT', INDETERMINATE) -specificheatcapacityunit = express_getattr(IfcDerivedUnitEnum, 'SPECIFICHEATCAPACITYUNIT', INDETERMINATE) -temperaturegradientunit = express_getattr(IfcDerivedUnitEnum, 'TEMPERATUREGRADIENTUNIT', INDETERMINATE) -temperaturerateofchangeunit = express_getattr(IfcDerivedUnitEnum, 'TEMPERATURERATEOFCHANGEUNIT', INDETERMINATE) -thermaladmittanceunit = express_getattr(IfcDerivedUnitEnum, 'THERMALADMITTANCEUNIT', INDETERMINATE) -thermalconductanceunit = express_getattr(IfcDerivedUnitEnum, 'THERMALCONDUCTANCEUNIT', INDETERMINATE) -thermalexpansioncoefficientunit = express_getattr(IfcDerivedUnitEnum, 'THERMALEXPANSIONCOEFFICIENTUNIT', INDETERMINATE) -thermalresistanceunit = express_getattr(IfcDerivedUnitEnum, 'THERMALRESISTANCEUNIT', INDETERMINATE) -thermaltransmittanceunit = express_getattr(IfcDerivedUnitEnum, 'THERMALTRANSMITTANCEUNIT', INDETERMINATE) -torqueunit = express_getattr(IfcDerivedUnitEnum, 'TORQUEUNIT', INDETERMINATE) -vaporpermeabilityunit = express_getattr(IfcDerivedUnitEnum, 'VAPORPERMEABILITYUNIT', INDETERMINATE) -volumetricflowrateunit = express_getattr(IfcDerivedUnitEnum, 'VOLUMETRICFLOWRATEUNIT', INDETERMINATE) -warpingconstantunit = express_getattr(IfcDerivedUnitEnum, 'WARPINGCONSTANTUNIT', INDETERMINATE) -warpingmomentunit = express_getattr(IfcDerivedUnitEnum, 'WARPINGMOMENTUNIT', INDETERMINATE) -userdefined = express_getattr(IfcDerivedUnitEnum, 'USERDEFINED', INDETERMINATE) +accelerationunit = IfcDerivedUnitEnum.ACCELERATIONUNIT +angularvelocityunit = IfcDerivedUnitEnum.ANGULARVELOCITYUNIT +areadensityunit = IfcDerivedUnitEnum.AREADENSITYUNIT +compoundplaneangleunit = IfcDerivedUnitEnum.COMPOUNDPLANEANGLEUNIT +curvatureunit = IfcDerivedUnitEnum.CURVATUREUNIT +dynamicviscosityunit = IfcDerivedUnitEnum.DYNAMICVISCOSITYUNIT +heatfluxdensityunit = IfcDerivedUnitEnum.HEATFLUXDENSITYUNIT +heatingvalueunit = IfcDerivedUnitEnum.HEATINGVALUEUNIT +integercountrateunit = IfcDerivedUnitEnum.INTEGERCOUNTRATEUNIT +ionconcentrationunit = IfcDerivedUnitEnum.IONCONCENTRATIONUNIT +isothermalmoisturecapacityunit = IfcDerivedUnitEnum.ISOTHERMALMOISTURECAPACITYUNIT +kinematicviscosityunit = IfcDerivedUnitEnum.KINEMATICVISCOSITYUNIT +linearforceunit = IfcDerivedUnitEnum.LINEARFORCEUNIT +linearmomentunit = IfcDerivedUnitEnum.LINEARMOMENTUNIT +linearstiffnessunit = IfcDerivedUnitEnum.LINEARSTIFFNESSUNIT +linearvelocityunit = IfcDerivedUnitEnum.LINEARVELOCITYUNIT +luminousintensitydistributionunit = IfcDerivedUnitEnum.LUMINOUSINTENSITYDISTRIBUTIONUNIT +massdensityunit = IfcDerivedUnitEnum.MASSDENSITYUNIT +massflowrateunit = IfcDerivedUnitEnum.MASSFLOWRATEUNIT +massperlengthunit = IfcDerivedUnitEnum.MASSPERLENGTHUNIT +modulusofelasticityunit = IfcDerivedUnitEnum.MODULUSOFELASTICITYUNIT +modulusoflinearsubgradereactionunit = IfcDerivedUnitEnum.MODULUSOFLINEARSUBGRADEREACTIONUNIT +modulusofrotationalsubgradereactionunit = IfcDerivedUnitEnum.MODULUSOFROTATIONALSUBGRADEREACTIONUNIT +modulusofsubgradereactionunit = IfcDerivedUnitEnum.MODULUSOFSUBGRADEREACTIONUNIT +moisturediffusivityunit = IfcDerivedUnitEnum.MOISTUREDIFFUSIVITYUNIT +molecularweightunit = IfcDerivedUnitEnum.MOLECULARWEIGHTUNIT +momentofinertiaunit = IfcDerivedUnitEnum.MOMENTOFINERTIAUNIT +phunit = IfcDerivedUnitEnum.PHUNIT +planarforceunit = IfcDerivedUnitEnum.PLANARFORCEUNIT +rotationalfrequencyunit = IfcDerivedUnitEnum.ROTATIONALFREQUENCYUNIT +rotationalmassunit = IfcDerivedUnitEnum.ROTATIONALMASSUNIT +rotationalstiffnessunit = IfcDerivedUnitEnum.ROTATIONALSTIFFNESSUNIT +sectionareaintegralunit = IfcDerivedUnitEnum.SECTIONAREAINTEGRALUNIT +sectionmodulusunit = IfcDerivedUnitEnum.SECTIONMODULUSUNIT +shearmodulusunit = IfcDerivedUnitEnum.SHEARMODULUSUNIT +soundpowerlevelunit = IfcDerivedUnitEnum.SOUNDPOWERLEVELUNIT +soundpowerunit = IfcDerivedUnitEnum.SOUNDPOWERUNIT +soundpressurelevelunit = IfcDerivedUnitEnum.SOUNDPRESSURELEVELUNIT +soundpressureunit = IfcDerivedUnitEnum.SOUNDPRESSUREUNIT +specificheatcapacityunit = IfcDerivedUnitEnum.SPECIFICHEATCAPACITYUNIT +temperaturegradientunit = IfcDerivedUnitEnum.TEMPERATUREGRADIENTUNIT +temperaturerateofchangeunit = IfcDerivedUnitEnum.TEMPERATURERATEOFCHANGEUNIT +thermaladmittanceunit = IfcDerivedUnitEnum.THERMALADMITTANCEUNIT +thermalconductanceunit = IfcDerivedUnitEnum.THERMALCONDUCTANCEUNIT +thermalexpansioncoefficientunit = IfcDerivedUnitEnum.THERMALEXPANSIONCOEFFICIENTUNIT +thermalresistanceunit = IfcDerivedUnitEnum.THERMALRESISTANCEUNIT +thermaltransmittanceunit = IfcDerivedUnitEnum.THERMALTRANSMITTANCEUNIT +torqueunit = IfcDerivedUnitEnum.TORQUEUNIT +vaporpermeabilityunit = IfcDerivedUnitEnum.VAPORPERMEABILITYUNIT +volumetricflowrateunit = IfcDerivedUnitEnum.VOLUMETRICFLOWRATEUNIT +warpingconstantunit = IfcDerivedUnitEnum.WARPINGCONSTANTUNIT +warpingmomentunit = IfcDerivedUnitEnum.WARPINGMOMENTUNIT +userdefined = IfcDerivedUnitEnum.USERDEFINED IfcDirectionSenseEnum = enum_namespace() -negative = express_getattr(IfcDirectionSenseEnum, 'NEGATIVE', INDETERMINATE) -positive = express_getattr(IfcDirectionSenseEnum, 'POSITIVE', INDETERMINATE) +negative = IfcDirectionSenseEnum.NEGATIVE +positive = IfcDirectionSenseEnum.POSITIVE IfcDiscreteAccessoryTypeEnum = enum_namespace() -anchorplate = express_getattr(IfcDiscreteAccessoryTypeEnum, 'ANCHORPLATE', INDETERMINATE) -birdprotection = express_getattr(IfcDiscreteAccessoryTypeEnum, 'BIRDPROTECTION', INDETERMINATE) -bracket = express_getattr(IfcDiscreteAccessoryTypeEnum, 'BRACKET', INDETERMINATE) -cablearranger = express_getattr(IfcDiscreteAccessoryTypeEnum, 'CABLEARRANGER', INDETERMINATE) -elastic_cushion = express_getattr(IfcDiscreteAccessoryTypeEnum, 'ELASTIC_CUSHION', INDETERMINATE) -expansion_joint_device = express_getattr(IfcDiscreteAccessoryTypeEnum, 'EXPANSION_JOINT_DEVICE', INDETERMINATE) -filler = express_getattr(IfcDiscreteAccessoryTypeEnum, 'FILLER', INDETERMINATE) -flashing = express_getattr(IfcDiscreteAccessoryTypeEnum, 'FLASHING', INDETERMINATE) -insulator = express_getattr(IfcDiscreteAccessoryTypeEnum, 'INSULATOR', INDETERMINATE) -lock = express_getattr(IfcDiscreteAccessoryTypeEnum, 'LOCK', INDETERMINATE) -panel_strengthening = express_getattr(IfcDiscreteAccessoryTypeEnum, 'PANEL_STRENGTHENING', INDETERMINATE) -pointmachinemountingdevice = express_getattr(IfcDiscreteAccessoryTypeEnum, 'POINTMACHINEMOUNTINGDEVICE', INDETERMINATE) -point_machine_locking_device = express_getattr(IfcDiscreteAccessoryTypeEnum, 'POINT_MACHINE_LOCKING_DEVICE', INDETERMINATE) -railbrace = express_getattr(IfcDiscreteAccessoryTypeEnum, 'RAILBRACE', INDETERMINATE) -railpad = express_getattr(IfcDiscreteAccessoryTypeEnum, 'RAILPAD', INDETERMINATE) -rail_lubrication = express_getattr(IfcDiscreteAccessoryTypeEnum, 'RAIL_LUBRICATION', INDETERMINATE) -rail_mechanical_equipment = express_getattr(IfcDiscreteAccessoryTypeEnum, 'RAIL_MECHANICAL_EQUIPMENT', INDETERMINATE) -shoe = express_getattr(IfcDiscreteAccessoryTypeEnum, 'SHOE', INDETERMINATE) -slidingchair = express_getattr(IfcDiscreteAccessoryTypeEnum, 'SLIDINGCHAIR', INDETERMINATE) -soundabsorption = express_getattr(IfcDiscreteAccessoryTypeEnum, 'SOUNDABSORPTION', INDETERMINATE) -tensioningequipment = express_getattr(IfcDiscreteAccessoryTypeEnum, 'TENSIONINGEQUIPMENT', INDETERMINATE) -userdefined = express_getattr(IfcDiscreteAccessoryTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDiscreteAccessoryTypeEnum, 'NOTDEFINED', INDETERMINATE) +anchorplate = IfcDiscreteAccessoryTypeEnum.ANCHORPLATE +birdprotection = IfcDiscreteAccessoryTypeEnum.BIRDPROTECTION +bracket = IfcDiscreteAccessoryTypeEnum.BRACKET +cablearranger = IfcDiscreteAccessoryTypeEnum.CABLEARRANGER +elastic_cushion = IfcDiscreteAccessoryTypeEnum.ELASTIC_CUSHION +expansion_joint_device = IfcDiscreteAccessoryTypeEnum.EXPANSION_JOINT_DEVICE +filler = IfcDiscreteAccessoryTypeEnum.FILLER +flashing = IfcDiscreteAccessoryTypeEnum.FLASHING +insulator = IfcDiscreteAccessoryTypeEnum.INSULATOR +lock = IfcDiscreteAccessoryTypeEnum.LOCK +panel_strengthening = IfcDiscreteAccessoryTypeEnum.PANEL_STRENGTHENING +pointmachinemountingdevice = IfcDiscreteAccessoryTypeEnum.POINTMACHINEMOUNTINGDEVICE +point_machine_locking_device = IfcDiscreteAccessoryTypeEnum.POINT_MACHINE_LOCKING_DEVICE +railbrace = IfcDiscreteAccessoryTypeEnum.RAILBRACE +railpad = IfcDiscreteAccessoryTypeEnum.RAILPAD +rail_lubrication = IfcDiscreteAccessoryTypeEnum.RAIL_LUBRICATION +rail_mechanical_equipment = IfcDiscreteAccessoryTypeEnum.RAIL_MECHANICAL_EQUIPMENT +shoe = IfcDiscreteAccessoryTypeEnum.SHOE +slidingchair = IfcDiscreteAccessoryTypeEnum.SLIDINGCHAIR +soundabsorption = IfcDiscreteAccessoryTypeEnum.SOUNDABSORPTION +tensioningequipment = IfcDiscreteAccessoryTypeEnum.TENSIONINGEQUIPMENT +userdefined = IfcDiscreteAccessoryTypeEnum.USERDEFINED +notdefined = IfcDiscreteAccessoryTypeEnum.NOTDEFINED IfcDistributionBoardTypeEnum = enum_namespace() -consumerunit = express_getattr(IfcDistributionBoardTypeEnum, 'CONSUMERUNIT', INDETERMINATE) -dispatchingboard = express_getattr(IfcDistributionBoardTypeEnum, 'DISPATCHINGBOARD', INDETERMINATE) -distributionboard = express_getattr(IfcDistributionBoardTypeEnum, 'DISTRIBUTIONBOARD', INDETERMINATE) -distributionframe = express_getattr(IfcDistributionBoardTypeEnum, 'DISTRIBUTIONFRAME', INDETERMINATE) -motorcontrolcentre = express_getattr(IfcDistributionBoardTypeEnum, 'MOTORCONTROLCENTRE', INDETERMINATE) -switchboard = express_getattr(IfcDistributionBoardTypeEnum, 'SWITCHBOARD', INDETERMINATE) -userdefined = express_getattr(IfcDistributionBoardTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDistributionBoardTypeEnum, 'NOTDEFINED', INDETERMINATE) +consumerunit = IfcDistributionBoardTypeEnum.CONSUMERUNIT +dispatchingboard = IfcDistributionBoardTypeEnum.DISPATCHINGBOARD +distributionboard = IfcDistributionBoardTypeEnum.DISTRIBUTIONBOARD +distributionframe = IfcDistributionBoardTypeEnum.DISTRIBUTIONFRAME +motorcontrolcentre = IfcDistributionBoardTypeEnum.MOTORCONTROLCENTRE +switchboard = IfcDistributionBoardTypeEnum.SWITCHBOARD +userdefined = IfcDistributionBoardTypeEnum.USERDEFINED +notdefined = IfcDistributionBoardTypeEnum.NOTDEFINED IfcDistributionChamberElementTypeEnum = enum_namespace() -formedduct = express_getattr(IfcDistributionChamberElementTypeEnum, 'FORMEDDUCT', INDETERMINATE) -inspectionchamber = express_getattr(IfcDistributionChamberElementTypeEnum, 'INSPECTIONCHAMBER', INDETERMINATE) -inspectionpit = express_getattr(IfcDistributionChamberElementTypeEnum, 'INSPECTIONPIT', INDETERMINATE) -manhole = express_getattr(IfcDistributionChamberElementTypeEnum, 'MANHOLE', INDETERMINATE) -meterchamber = express_getattr(IfcDistributionChamberElementTypeEnum, 'METERCHAMBER', INDETERMINATE) -sump = express_getattr(IfcDistributionChamberElementTypeEnum, 'SUMP', INDETERMINATE) -trench = express_getattr(IfcDistributionChamberElementTypeEnum, 'TRENCH', INDETERMINATE) -valvechamber = express_getattr(IfcDistributionChamberElementTypeEnum, 'VALVECHAMBER', INDETERMINATE) -userdefined = express_getattr(IfcDistributionChamberElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDistributionChamberElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +formedduct = IfcDistributionChamberElementTypeEnum.FORMEDDUCT +inspectionchamber = IfcDistributionChamberElementTypeEnum.INSPECTIONCHAMBER +inspectionpit = IfcDistributionChamberElementTypeEnum.INSPECTIONPIT +manhole = IfcDistributionChamberElementTypeEnum.MANHOLE +meterchamber = IfcDistributionChamberElementTypeEnum.METERCHAMBER +sump = IfcDistributionChamberElementTypeEnum.SUMP +trench = IfcDistributionChamberElementTypeEnum.TRENCH +valvechamber = IfcDistributionChamberElementTypeEnum.VALVECHAMBER +userdefined = IfcDistributionChamberElementTypeEnum.USERDEFINED +notdefined = IfcDistributionChamberElementTypeEnum.NOTDEFINED IfcDistributionPortTypeEnum = enum_namespace() -cable = express_getattr(IfcDistributionPortTypeEnum, 'CABLE', INDETERMINATE) -cablecarrier = express_getattr(IfcDistributionPortTypeEnum, 'CABLECARRIER', INDETERMINATE) -duct = express_getattr(IfcDistributionPortTypeEnum, 'DUCT', INDETERMINATE) -pipe = express_getattr(IfcDistributionPortTypeEnum, 'PIPE', INDETERMINATE) -wireless = express_getattr(IfcDistributionPortTypeEnum, 'WIRELESS', INDETERMINATE) -userdefined = express_getattr(IfcDistributionPortTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDistributionPortTypeEnum, 'NOTDEFINED', INDETERMINATE) +cable = IfcDistributionPortTypeEnum.CABLE +cablecarrier = IfcDistributionPortTypeEnum.CABLECARRIER +duct = IfcDistributionPortTypeEnum.DUCT +pipe = IfcDistributionPortTypeEnum.PIPE +wireless = IfcDistributionPortTypeEnum.WIRELESS +userdefined = IfcDistributionPortTypeEnum.USERDEFINED +notdefined = IfcDistributionPortTypeEnum.NOTDEFINED IfcDistributionSystemEnum = enum_namespace() -airconditioning = express_getattr(IfcDistributionSystemEnum, 'AIRCONDITIONING', INDETERMINATE) -audiovisual = express_getattr(IfcDistributionSystemEnum, 'AUDIOVISUAL', INDETERMINATE) -catenary_system = express_getattr(IfcDistributionSystemEnum, 'CATENARY_SYSTEM', INDETERMINATE) -chemical = express_getattr(IfcDistributionSystemEnum, 'CHEMICAL', INDETERMINATE) -chilledwater = express_getattr(IfcDistributionSystemEnum, 'CHILLEDWATER', INDETERMINATE) -communication = express_getattr(IfcDistributionSystemEnum, 'COMMUNICATION', INDETERMINATE) -compressedair = express_getattr(IfcDistributionSystemEnum, 'COMPRESSEDAIR', INDETERMINATE) -condenserwater = express_getattr(IfcDistributionSystemEnum, 'CONDENSERWATER', INDETERMINATE) -control = express_getattr(IfcDistributionSystemEnum, 'CONTROL', INDETERMINATE) -conveying = express_getattr(IfcDistributionSystemEnum, 'CONVEYING', INDETERMINATE) -data = express_getattr(IfcDistributionSystemEnum, 'DATA', INDETERMINATE) -disposal = express_getattr(IfcDistributionSystemEnum, 'DISPOSAL', INDETERMINATE) -domesticcoldwater = express_getattr(IfcDistributionSystemEnum, 'DOMESTICCOLDWATER', INDETERMINATE) -domestichotwater = express_getattr(IfcDistributionSystemEnum, 'DOMESTICHOTWATER', INDETERMINATE) -drainage = express_getattr(IfcDistributionSystemEnum, 'DRAINAGE', INDETERMINATE) -earthing = express_getattr(IfcDistributionSystemEnum, 'EARTHING', INDETERMINATE) -electrical = express_getattr(IfcDistributionSystemEnum, 'ELECTRICAL', INDETERMINATE) -electroacoustic = express_getattr(IfcDistributionSystemEnum, 'ELECTROACOUSTIC', INDETERMINATE) -exhaust = express_getattr(IfcDistributionSystemEnum, 'EXHAUST', INDETERMINATE) -fireprotection = express_getattr(IfcDistributionSystemEnum, 'FIREPROTECTION', INDETERMINATE) -fixedtransmissionnetwork = express_getattr(IfcDistributionSystemEnum, 'FIXEDTRANSMISSIONNETWORK', INDETERMINATE) -fuel = express_getattr(IfcDistributionSystemEnum, 'FUEL', INDETERMINATE) -gas = express_getattr(IfcDistributionSystemEnum, 'GAS', INDETERMINATE) -hazardous = express_getattr(IfcDistributionSystemEnum, 'HAZARDOUS', INDETERMINATE) -heating = express_getattr(IfcDistributionSystemEnum, 'HEATING', INDETERMINATE) -lighting = express_getattr(IfcDistributionSystemEnum, 'LIGHTING', INDETERMINATE) -lightningprotection = express_getattr(IfcDistributionSystemEnum, 'LIGHTNINGPROTECTION', INDETERMINATE) -mobilenetwork = express_getattr(IfcDistributionSystemEnum, 'MOBILENETWORK', INDETERMINATE) -monitoringsystem = express_getattr(IfcDistributionSystemEnum, 'MONITORINGSYSTEM', INDETERMINATE) -municipalsolidwaste = express_getattr(IfcDistributionSystemEnum, 'MUNICIPALSOLIDWASTE', INDETERMINATE) -oil = express_getattr(IfcDistributionSystemEnum, 'OIL', INDETERMINATE) -operational = express_getattr(IfcDistributionSystemEnum, 'OPERATIONAL', INDETERMINATE) -operationaltelephonysystem = express_getattr(IfcDistributionSystemEnum, 'OPERATIONALTELEPHONYSYSTEM', INDETERMINATE) -overhead_contactline_system = express_getattr(IfcDistributionSystemEnum, 'OVERHEAD_CONTACTLINE_SYSTEM', INDETERMINATE) -powergeneration = express_getattr(IfcDistributionSystemEnum, 'POWERGENERATION', INDETERMINATE) -rainwater = express_getattr(IfcDistributionSystemEnum, 'RAINWATER', INDETERMINATE) -refrigeration = express_getattr(IfcDistributionSystemEnum, 'REFRIGERATION', INDETERMINATE) -return_circuit = express_getattr(IfcDistributionSystemEnum, 'RETURN_CIRCUIT', INDETERMINATE) -security = express_getattr(IfcDistributionSystemEnum, 'SECURITY', INDETERMINATE) -sewage = express_getattr(IfcDistributionSystemEnum, 'SEWAGE', INDETERMINATE) -signal = express_getattr(IfcDistributionSystemEnum, 'SIGNAL', INDETERMINATE) -stormwater = express_getattr(IfcDistributionSystemEnum, 'STORMWATER', INDETERMINATE) -telephone = express_getattr(IfcDistributionSystemEnum, 'TELEPHONE', INDETERMINATE) -tv = express_getattr(IfcDistributionSystemEnum, 'TV', INDETERMINATE) -vacuum = express_getattr(IfcDistributionSystemEnum, 'VACUUM', INDETERMINATE) -vent = express_getattr(IfcDistributionSystemEnum, 'VENT', INDETERMINATE) -ventilation = express_getattr(IfcDistributionSystemEnum, 'VENTILATION', INDETERMINATE) -wastewater = express_getattr(IfcDistributionSystemEnum, 'WASTEWATER', INDETERMINATE) -watersupply = express_getattr(IfcDistributionSystemEnum, 'WATERSUPPLY', INDETERMINATE) -userdefined = express_getattr(IfcDistributionSystemEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDistributionSystemEnum, 'NOTDEFINED', INDETERMINATE) +airconditioning = IfcDistributionSystemEnum.AIRCONDITIONING +audiovisual = IfcDistributionSystemEnum.AUDIOVISUAL +catenary_system = IfcDistributionSystemEnum.CATENARY_SYSTEM +chemical = IfcDistributionSystemEnum.CHEMICAL +chilledwater = IfcDistributionSystemEnum.CHILLEDWATER +communication = IfcDistributionSystemEnum.COMMUNICATION +compressedair = IfcDistributionSystemEnum.COMPRESSEDAIR +condenserwater = IfcDistributionSystemEnum.CONDENSERWATER +control = IfcDistributionSystemEnum.CONTROL +conveying = IfcDistributionSystemEnum.CONVEYING +data = IfcDistributionSystemEnum.DATA +disposal = IfcDistributionSystemEnum.DISPOSAL +domesticcoldwater = IfcDistributionSystemEnum.DOMESTICCOLDWATER +domestichotwater = IfcDistributionSystemEnum.DOMESTICHOTWATER +drainage = IfcDistributionSystemEnum.DRAINAGE +earthing = IfcDistributionSystemEnum.EARTHING +electrical = IfcDistributionSystemEnum.ELECTRICAL +electroacoustic = IfcDistributionSystemEnum.ELECTROACOUSTIC +exhaust = IfcDistributionSystemEnum.EXHAUST +fireprotection = IfcDistributionSystemEnum.FIREPROTECTION +fixedtransmissionnetwork = IfcDistributionSystemEnum.FIXEDTRANSMISSIONNETWORK +fuel = IfcDistributionSystemEnum.FUEL +gas = IfcDistributionSystemEnum.GAS +hazardous = IfcDistributionSystemEnum.HAZARDOUS +heating = IfcDistributionSystemEnum.HEATING +lighting = IfcDistributionSystemEnum.LIGHTING +lightningprotection = IfcDistributionSystemEnum.LIGHTNINGPROTECTION +mobilenetwork = IfcDistributionSystemEnum.MOBILENETWORK +monitoringsystem = IfcDistributionSystemEnum.MONITORINGSYSTEM +municipalsolidwaste = IfcDistributionSystemEnum.MUNICIPALSOLIDWASTE +oil = IfcDistributionSystemEnum.OIL +operational = IfcDistributionSystemEnum.OPERATIONAL +operationaltelephonysystem = IfcDistributionSystemEnum.OPERATIONALTELEPHONYSYSTEM +overhead_contactline_system = IfcDistributionSystemEnum.OVERHEAD_CONTACTLINE_SYSTEM +powergeneration = IfcDistributionSystemEnum.POWERGENERATION +rainwater = IfcDistributionSystemEnum.RAINWATER +refrigeration = IfcDistributionSystemEnum.REFRIGERATION +return_circuit = IfcDistributionSystemEnum.RETURN_CIRCUIT +security = IfcDistributionSystemEnum.SECURITY +sewage = IfcDistributionSystemEnum.SEWAGE +signal = IfcDistributionSystemEnum.SIGNAL +stormwater = IfcDistributionSystemEnum.STORMWATER +telephone = IfcDistributionSystemEnum.TELEPHONE +tv = IfcDistributionSystemEnum.TV +vacuum = IfcDistributionSystemEnum.VACUUM +vent = IfcDistributionSystemEnum.VENT +ventilation = IfcDistributionSystemEnum.VENTILATION +wastewater = IfcDistributionSystemEnum.WASTEWATER +watersupply = IfcDistributionSystemEnum.WATERSUPPLY +userdefined = IfcDistributionSystemEnum.USERDEFINED +notdefined = IfcDistributionSystemEnum.NOTDEFINED IfcDocumentConfidentialityEnum = enum_namespace() -confidential = express_getattr(IfcDocumentConfidentialityEnum, 'CONFIDENTIAL', INDETERMINATE) -personal = express_getattr(IfcDocumentConfidentialityEnum, 'PERSONAL', INDETERMINATE) -public = express_getattr(IfcDocumentConfidentialityEnum, 'PUBLIC', INDETERMINATE) -restricted = express_getattr(IfcDocumentConfidentialityEnum, 'RESTRICTED', INDETERMINATE) -userdefined = express_getattr(IfcDocumentConfidentialityEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDocumentConfidentialityEnum, 'NOTDEFINED', INDETERMINATE) +confidential = IfcDocumentConfidentialityEnum.CONFIDENTIAL +personal = IfcDocumentConfidentialityEnum.PERSONAL +public = IfcDocumentConfidentialityEnum.PUBLIC +restricted = IfcDocumentConfidentialityEnum.RESTRICTED +userdefined = IfcDocumentConfidentialityEnum.USERDEFINED +notdefined = IfcDocumentConfidentialityEnum.NOTDEFINED IfcDocumentStatusEnum = enum_namespace() -draft = express_getattr(IfcDocumentStatusEnum, 'DRAFT', INDETERMINATE) -final = express_getattr(IfcDocumentStatusEnum, 'FINAL', INDETERMINATE) -finaldraft = express_getattr(IfcDocumentStatusEnum, 'FINALDRAFT', INDETERMINATE) -revision = express_getattr(IfcDocumentStatusEnum, 'REVISION', INDETERMINATE) -notdefined = express_getattr(IfcDocumentStatusEnum, 'NOTDEFINED', INDETERMINATE) +draft = IfcDocumentStatusEnum.DRAFT +final = IfcDocumentStatusEnum.FINAL +finaldraft = IfcDocumentStatusEnum.FINALDRAFT +revision = IfcDocumentStatusEnum.REVISION +notdefined = IfcDocumentStatusEnum.NOTDEFINED IfcDoorPanelOperationEnum = enum_namespace() -double_acting = express_getattr(IfcDoorPanelOperationEnum, 'DOUBLE_ACTING', INDETERMINATE) -fixedpanel = express_getattr(IfcDoorPanelOperationEnum, 'FIXEDPANEL', INDETERMINATE) -folding = express_getattr(IfcDoorPanelOperationEnum, 'FOLDING', INDETERMINATE) -revolving = express_getattr(IfcDoorPanelOperationEnum, 'REVOLVING', INDETERMINATE) -rollingup = express_getattr(IfcDoorPanelOperationEnum, 'ROLLINGUP', INDETERMINATE) -sliding = express_getattr(IfcDoorPanelOperationEnum, 'SLIDING', INDETERMINATE) -swinging = express_getattr(IfcDoorPanelOperationEnum, 'SWINGING', INDETERMINATE) -userdefined = express_getattr(IfcDoorPanelOperationEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDoorPanelOperationEnum, 'NOTDEFINED', INDETERMINATE) +double_acting = IfcDoorPanelOperationEnum.DOUBLE_ACTING +fixedpanel = IfcDoorPanelOperationEnum.FIXEDPANEL +folding = IfcDoorPanelOperationEnum.FOLDING +revolving = IfcDoorPanelOperationEnum.REVOLVING +rollingup = IfcDoorPanelOperationEnum.ROLLINGUP +sliding = IfcDoorPanelOperationEnum.SLIDING +swinging = IfcDoorPanelOperationEnum.SWINGING +userdefined = IfcDoorPanelOperationEnum.USERDEFINED +notdefined = IfcDoorPanelOperationEnum.NOTDEFINED IfcDoorPanelPositionEnum = enum_namespace() -left = express_getattr(IfcDoorPanelPositionEnum, 'LEFT', INDETERMINATE) -middle = express_getattr(IfcDoorPanelPositionEnum, 'MIDDLE', INDETERMINATE) -right = express_getattr(IfcDoorPanelPositionEnum, 'RIGHT', INDETERMINATE) -notdefined = express_getattr(IfcDoorPanelPositionEnum, 'NOTDEFINED', INDETERMINATE) +left = IfcDoorPanelPositionEnum.LEFT +middle = IfcDoorPanelPositionEnum.MIDDLE +right = IfcDoorPanelPositionEnum.RIGHT +notdefined = IfcDoorPanelPositionEnum.NOTDEFINED IfcDoorTypeEnum = enum_namespace() -boom_barrier = express_getattr(IfcDoorTypeEnum, 'BOOM_BARRIER', INDETERMINATE) -door = express_getattr(IfcDoorTypeEnum, 'DOOR', INDETERMINATE) -gate = express_getattr(IfcDoorTypeEnum, 'GATE', INDETERMINATE) -trapdoor = express_getattr(IfcDoorTypeEnum, 'TRAPDOOR', INDETERMINATE) -turnstile = express_getattr(IfcDoorTypeEnum, 'TURNSTILE', INDETERMINATE) -userdefined = express_getattr(IfcDoorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDoorTypeEnum, 'NOTDEFINED', INDETERMINATE) +boom_barrier = IfcDoorTypeEnum.BOOM_BARRIER +door = IfcDoorTypeEnum.DOOR +gate = IfcDoorTypeEnum.GATE +trapdoor = IfcDoorTypeEnum.TRAPDOOR +turnstile = IfcDoorTypeEnum.TURNSTILE +userdefined = IfcDoorTypeEnum.USERDEFINED +notdefined = IfcDoorTypeEnum.NOTDEFINED IfcDoorTypeOperationEnum = enum_namespace() -double_door_double_swing = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_DOOR_DOUBLE_SWING', INDETERMINATE) -double_door_folding = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_DOOR_FOLDING', INDETERMINATE) -double_door_lifting_vertical = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_DOOR_LIFTING_VERTICAL', INDETERMINATE) -double_door_single_swing = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_DOOR_SINGLE_SWING', INDETERMINATE) -double_door_single_swing_opposite_left = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_LEFT', INDETERMINATE) -double_door_single_swing_opposite_right = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_RIGHT', INDETERMINATE) -double_door_sliding = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_DOOR_SLIDING', INDETERMINATE) -double_swing_left = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_SWING_LEFT', INDETERMINATE) -double_swing_right = express_getattr(IfcDoorTypeOperationEnum, 'DOUBLE_SWING_RIGHT', INDETERMINATE) -folding_to_left = express_getattr(IfcDoorTypeOperationEnum, 'FOLDING_TO_LEFT', INDETERMINATE) -folding_to_right = express_getattr(IfcDoorTypeOperationEnum, 'FOLDING_TO_RIGHT', INDETERMINATE) -lifting_horizontal = express_getattr(IfcDoorTypeOperationEnum, 'LIFTING_HORIZONTAL', INDETERMINATE) -lifting_vertical_left = express_getattr(IfcDoorTypeOperationEnum, 'LIFTING_VERTICAL_LEFT', INDETERMINATE) -lifting_vertical_right = express_getattr(IfcDoorTypeOperationEnum, 'LIFTING_VERTICAL_RIGHT', INDETERMINATE) -revolving = express_getattr(IfcDoorTypeOperationEnum, 'REVOLVING', INDETERMINATE) -revolving_vertical = express_getattr(IfcDoorTypeOperationEnum, 'REVOLVING_VERTICAL', INDETERMINATE) -rollingup = express_getattr(IfcDoorTypeOperationEnum, 'ROLLINGUP', INDETERMINATE) -single_swing_left = express_getattr(IfcDoorTypeOperationEnum, 'SINGLE_SWING_LEFT', INDETERMINATE) -single_swing_right = express_getattr(IfcDoorTypeOperationEnum, 'SINGLE_SWING_RIGHT', INDETERMINATE) -sliding_to_left = express_getattr(IfcDoorTypeOperationEnum, 'SLIDING_TO_LEFT', INDETERMINATE) -sliding_to_right = express_getattr(IfcDoorTypeOperationEnum, 'SLIDING_TO_RIGHT', INDETERMINATE) -swing_fixed_left = express_getattr(IfcDoorTypeOperationEnum, 'SWING_FIXED_LEFT', INDETERMINATE) -swing_fixed_right = express_getattr(IfcDoorTypeOperationEnum, 'SWING_FIXED_RIGHT', INDETERMINATE) -userdefined = express_getattr(IfcDoorTypeOperationEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDoorTypeOperationEnum, 'NOTDEFINED', INDETERMINATE) +double_door_double_swing = IfcDoorTypeOperationEnum.DOUBLE_DOOR_DOUBLE_SWING +double_door_folding = IfcDoorTypeOperationEnum.DOUBLE_DOOR_FOLDING +double_door_lifting_vertical = IfcDoorTypeOperationEnum.DOUBLE_DOOR_LIFTING_VERTICAL +double_door_single_swing = IfcDoorTypeOperationEnum.DOUBLE_DOOR_SINGLE_SWING +double_door_single_swing_opposite_left = IfcDoorTypeOperationEnum.DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_LEFT +double_door_single_swing_opposite_right = IfcDoorTypeOperationEnum.DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_RIGHT +double_door_sliding = IfcDoorTypeOperationEnum.DOUBLE_DOOR_SLIDING +double_swing_left = IfcDoorTypeOperationEnum.DOUBLE_SWING_LEFT +double_swing_right = IfcDoorTypeOperationEnum.DOUBLE_SWING_RIGHT +folding_to_left = IfcDoorTypeOperationEnum.FOLDING_TO_LEFT +folding_to_right = IfcDoorTypeOperationEnum.FOLDING_TO_RIGHT +lifting_horizontal = IfcDoorTypeOperationEnum.LIFTING_HORIZONTAL +lifting_vertical_left = IfcDoorTypeOperationEnum.LIFTING_VERTICAL_LEFT +lifting_vertical_right = IfcDoorTypeOperationEnum.LIFTING_VERTICAL_RIGHT +revolving = IfcDoorTypeOperationEnum.REVOLVING +revolving_vertical = IfcDoorTypeOperationEnum.REVOLVING_VERTICAL +rollingup = IfcDoorTypeOperationEnum.ROLLINGUP +single_swing_left = IfcDoorTypeOperationEnum.SINGLE_SWING_LEFT +single_swing_right = IfcDoorTypeOperationEnum.SINGLE_SWING_RIGHT +sliding_to_left = IfcDoorTypeOperationEnum.SLIDING_TO_LEFT +sliding_to_right = IfcDoorTypeOperationEnum.SLIDING_TO_RIGHT +swing_fixed_left = IfcDoorTypeOperationEnum.SWING_FIXED_LEFT +swing_fixed_right = IfcDoorTypeOperationEnum.SWING_FIXED_RIGHT +userdefined = IfcDoorTypeOperationEnum.USERDEFINED +notdefined = IfcDoorTypeOperationEnum.NOTDEFINED IfcDuctFittingTypeEnum = enum_namespace() -bend = express_getattr(IfcDuctFittingTypeEnum, 'BEND', INDETERMINATE) -connector = express_getattr(IfcDuctFittingTypeEnum, 'CONNECTOR', INDETERMINATE) -entry = express_getattr(IfcDuctFittingTypeEnum, 'ENTRY', INDETERMINATE) -exit = express_getattr(IfcDuctFittingTypeEnum, 'EXIT', INDETERMINATE) -junction = express_getattr(IfcDuctFittingTypeEnum, 'JUNCTION', INDETERMINATE) -obstruction = express_getattr(IfcDuctFittingTypeEnum, 'OBSTRUCTION', INDETERMINATE) -transition = express_getattr(IfcDuctFittingTypeEnum, 'TRANSITION', INDETERMINATE) -userdefined = express_getattr(IfcDuctFittingTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDuctFittingTypeEnum, 'NOTDEFINED', INDETERMINATE) +bend = IfcDuctFittingTypeEnum.BEND +connector = IfcDuctFittingTypeEnum.CONNECTOR +entry = IfcDuctFittingTypeEnum.ENTRY +exit = IfcDuctFittingTypeEnum.EXIT +junction = IfcDuctFittingTypeEnum.JUNCTION +obstruction = IfcDuctFittingTypeEnum.OBSTRUCTION +transition = IfcDuctFittingTypeEnum.TRANSITION +userdefined = IfcDuctFittingTypeEnum.USERDEFINED +notdefined = IfcDuctFittingTypeEnum.NOTDEFINED IfcDuctSegmentTypeEnum = enum_namespace() -flexiblesegment = express_getattr(IfcDuctSegmentTypeEnum, 'FLEXIBLESEGMENT', INDETERMINATE) -rigidsegment = express_getattr(IfcDuctSegmentTypeEnum, 'RIGIDSEGMENT', INDETERMINATE) -userdefined = express_getattr(IfcDuctSegmentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDuctSegmentTypeEnum, 'NOTDEFINED', INDETERMINATE) +flexiblesegment = IfcDuctSegmentTypeEnum.FLEXIBLESEGMENT +rigidsegment = IfcDuctSegmentTypeEnum.RIGIDSEGMENT +userdefined = IfcDuctSegmentTypeEnum.USERDEFINED +notdefined = IfcDuctSegmentTypeEnum.NOTDEFINED IfcDuctSilencerTypeEnum = enum_namespace() -flatoval = express_getattr(IfcDuctSilencerTypeEnum, 'FLATOVAL', INDETERMINATE) -rectangular = express_getattr(IfcDuctSilencerTypeEnum, 'RECTANGULAR', INDETERMINATE) -round = express_getattr(IfcDuctSilencerTypeEnum, 'ROUND', INDETERMINATE) -userdefined = express_getattr(IfcDuctSilencerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcDuctSilencerTypeEnum, 'NOTDEFINED', INDETERMINATE) +flatoval = IfcDuctSilencerTypeEnum.FLATOVAL +rectangular = IfcDuctSilencerTypeEnum.RECTANGULAR +round = IfcDuctSilencerTypeEnum.ROUND +userdefined = IfcDuctSilencerTypeEnum.USERDEFINED +notdefined = IfcDuctSilencerTypeEnum.NOTDEFINED IfcEarthworksCutTypeEnum = enum_namespace() -base_excavation = express_getattr(IfcEarthworksCutTypeEnum, 'BASE_EXCAVATION', INDETERMINATE) -cut = express_getattr(IfcEarthworksCutTypeEnum, 'CUT', INDETERMINATE) -dredging = express_getattr(IfcEarthworksCutTypeEnum, 'DREDGING', INDETERMINATE) -excavation = express_getattr(IfcEarthworksCutTypeEnum, 'EXCAVATION', INDETERMINATE) -overexcavation = express_getattr(IfcEarthworksCutTypeEnum, 'OVEREXCAVATION', INDETERMINATE) -pavementmilling = express_getattr(IfcEarthworksCutTypeEnum, 'PAVEMENTMILLING', INDETERMINATE) -stepexcavation = express_getattr(IfcEarthworksCutTypeEnum, 'STEPEXCAVATION', INDETERMINATE) -topsoilremoval = express_getattr(IfcEarthworksCutTypeEnum, 'TOPSOILREMOVAL', INDETERMINATE) -trench = express_getattr(IfcEarthworksCutTypeEnum, 'TRENCH', INDETERMINATE) -userdefined = express_getattr(IfcEarthworksCutTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcEarthworksCutTypeEnum, 'NOTDEFINED', INDETERMINATE) +base_excavation = IfcEarthworksCutTypeEnum.BASE_EXCAVATION +cut = IfcEarthworksCutTypeEnum.CUT +dredging = IfcEarthworksCutTypeEnum.DREDGING +excavation = IfcEarthworksCutTypeEnum.EXCAVATION +overexcavation = IfcEarthworksCutTypeEnum.OVEREXCAVATION +pavementmilling = IfcEarthworksCutTypeEnum.PAVEMENTMILLING +stepexcavation = IfcEarthworksCutTypeEnum.STEPEXCAVATION +topsoilremoval = IfcEarthworksCutTypeEnum.TOPSOILREMOVAL +trench = IfcEarthworksCutTypeEnum.TRENCH +userdefined = IfcEarthworksCutTypeEnum.USERDEFINED +notdefined = IfcEarthworksCutTypeEnum.NOTDEFINED IfcEarthworksFillTypeEnum = enum_namespace() -backfill = express_getattr(IfcEarthworksFillTypeEnum, 'BACKFILL', INDETERMINATE) -counterweight = express_getattr(IfcEarthworksFillTypeEnum, 'COUNTERWEIGHT', INDETERMINATE) -embankment = express_getattr(IfcEarthworksFillTypeEnum, 'EMBANKMENT', INDETERMINATE) -slopefill = express_getattr(IfcEarthworksFillTypeEnum, 'SLOPEFILL', INDETERMINATE) -subgrade = express_getattr(IfcEarthworksFillTypeEnum, 'SUBGRADE', INDETERMINATE) -subgradebed = express_getattr(IfcEarthworksFillTypeEnum, 'SUBGRADEBED', INDETERMINATE) -transitionsection = express_getattr(IfcEarthworksFillTypeEnum, 'TRANSITIONSECTION', INDETERMINATE) -userdefined = express_getattr(IfcEarthworksFillTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcEarthworksFillTypeEnum, 'NOTDEFINED', INDETERMINATE) +backfill = IfcEarthworksFillTypeEnum.BACKFILL +counterweight = IfcEarthworksFillTypeEnum.COUNTERWEIGHT +embankment = IfcEarthworksFillTypeEnum.EMBANKMENT +slopefill = IfcEarthworksFillTypeEnum.SLOPEFILL +subgrade = IfcEarthworksFillTypeEnum.SUBGRADE +subgradebed = IfcEarthworksFillTypeEnum.SUBGRADEBED +transitionsection = IfcEarthworksFillTypeEnum.TRANSITIONSECTION +userdefined = IfcEarthworksFillTypeEnum.USERDEFINED +notdefined = IfcEarthworksFillTypeEnum.NOTDEFINED IfcElectricApplianceTypeEnum = enum_namespace() -dishwasher = express_getattr(IfcElectricApplianceTypeEnum, 'DISHWASHER', INDETERMINATE) -electriccooker = express_getattr(IfcElectricApplianceTypeEnum, 'ELECTRICCOOKER', INDETERMINATE) -freestandingelectricheater = express_getattr(IfcElectricApplianceTypeEnum, 'FREESTANDINGELECTRICHEATER', INDETERMINATE) -freestandingfan = express_getattr(IfcElectricApplianceTypeEnum, 'FREESTANDINGFAN', INDETERMINATE) -freestandingwatercooler = express_getattr(IfcElectricApplianceTypeEnum, 'FREESTANDINGWATERCOOLER', INDETERMINATE) -freestandingwaterheater = express_getattr(IfcElectricApplianceTypeEnum, 'FREESTANDINGWATERHEATER', INDETERMINATE) -freezer = express_getattr(IfcElectricApplianceTypeEnum, 'FREEZER', INDETERMINATE) -fridge_freezer = express_getattr(IfcElectricApplianceTypeEnum, 'FRIDGE_FREEZER', INDETERMINATE) -handdryer = express_getattr(IfcElectricApplianceTypeEnum, 'HANDDRYER', INDETERMINATE) -kitchenmachine = express_getattr(IfcElectricApplianceTypeEnum, 'KITCHENMACHINE', INDETERMINATE) -microwave = express_getattr(IfcElectricApplianceTypeEnum, 'MICROWAVE', INDETERMINATE) -photocopier = express_getattr(IfcElectricApplianceTypeEnum, 'PHOTOCOPIER', INDETERMINATE) -refrigerator = express_getattr(IfcElectricApplianceTypeEnum, 'REFRIGERATOR', INDETERMINATE) -tumbledryer = express_getattr(IfcElectricApplianceTypeEnum, 'TUMBLEDRYER', INDETERMINATE) -vendingmachine = express_getattr(IfcElectricApplianceTypeEnum, 'VENDINGMACHINE', INDETERMINATE) -washingmachine = express_getattr(IfcElectricApplianceTypeEnum, 'WASHINGMACHINE', INDETERMINATE) -userdefined = express_getattr(IfcElectricApplianceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcElectricApplianceTypeEnum, 'NOTDEFINED', INDETERMINATE) +dishwasher = IfcElectricApplianceTypeEnum.DISHWASHER +electriccooker = IfcElectricApplianceTypeEnum.ELECTRICCOOKER +freestandingelectricheater = IfcElectricApplianceTypeEnum.FREESTANDINGELECTRICHEATER +freestandingfan = IfcElectricApplianceTypeEnum.FREESTANDINGFAN +freestandingwatercooler = IfcElectricApplianceTypeEnum.FREESTANDINGWATERCOOLER +freestandingwaterheater = IfcElectricApplianceTypeEnum.FREESTANDINGWATERHEATER +freezer = IfcElectricApplianceTypeEnum.FREEZER +fridge_freezer = IfcElectricApplianceTypeEnum.FRIDGE_FREEZER +handdryer = IfcElectricApplianceTypeEnum.HANDDRYER +kitchenmachine = IfcElectricApplianceTypeEnum.KITCHENMACHINE +microwave = IfcElectricApplianceTypeEnum.MICROWAVE +photocopier = IfcElectricApplianceTypeEnum.PHOTOCOPIER +refrigerator = IfcElectricApplianceTypeEnum.REFRIGERATOR +tumbledryer = IfcElectricApplianceTypeEnum.TUMBLEDRYER +vendingmachine = IfcElectricApplianceTypeEnum.VENDINGMACHINE +washingmachine = IfcElectricApplianceTypeEnum.WASHINGMACHINE +userdefined = IfcElectricApplianceTypeEnum.USERDEFINED +notdefined = IfcElectricApplianceTypeEnum.NOTDEFINED IfcElectricDistributionBoardTypeEnum = enum_namespace() -consumerunit = express_getattr(IfcElectricDistributionBoardTypeEnum, 'CONSUMERUNIT', INDETERMINATE) -distributionboard = express_getattr(IfcElectricDistributionBoardTypeEnum, 'DISTRIBUTIONBOARD', INDETERMINATE) -motorcontrolcentre = express_getattr(IfcElectricDistributionBoardTypeEnum, 'MOTORCONTROLCENTRE', INDETERMINATE) -switchboard = express_getattr(IfcElectricDistributionBoardTypeEnum, 'SWITCHBOARD', INDETERMINATE) -userdefined = express_getattr(IfcElectricDistributionBoardTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcElectricDistributionBoardTypeEnum, 'NOTDEFINED', INDETERMINATE) +consumerunit = IfcElectricDistributionBoardTypeEnum.CONSUMERUNIT +distributionboard = IfcElectricDistributionBoardTypeEnum.DISTRIBUTIONBOARD +motorcontrolcentre = IfcElectricDistributionBoardTypeEnum.MOTORCONTROLCENTRE +switchboard = IfcElectricDistributionBoardTypeEnum.SWITCHBOARD +userdefined = IfcElectricDistributionBoardTypeEnum.USERDEFINED +notdefined = IfcElectricDistributionBoardTypeEnum.NOTDEFINED IfcElectricFlowStorageDeviceTypeEnum = enum_namespace() -battery = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'BATTERY', INDETERMINATE) -capacitor = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'CAPACITOR', INDETERMINATE) -capacitorbank = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'CAPACITORBANK', INDETERMINATE) -compensator = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'COMPENSATOR', INDETERMINATE) -harmonicfilter = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'HARMONICFILTER', INDETERMINATE) -inductor = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'INDUCTOR', INDETERMINATE) -inductorbank = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'INDUCTORBANK', INDETERMINATE) -recharger = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'RECHARGER', INDETERMINATE) -ups = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'UPS', INDETERMINATE) -userdefined = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcElectricFlowStorageDeviceTypeEnum, 'NOTDEFINED', INDETERMINATE) +battery = IfcElectricFlowStorageDeviceTypeEnum.BATTERY +capacitor = IfcElectricFlowStorageDeviceTypeEnum.CAPACITOR +capacitorbank = IfcElectricFlowStorageDeviceTypeEnum.CAPACITORBANK +compensator = IfcElectricFlowStorageDeviceTypeEnum.COMPENSATOR +harmonicfilter = IfcElectricFlowStorageDeviceTypeEnum.HARMONICFILTER +inductor = IfcElectricFlowStorageDeviceTypeEnum.INDUCTOR +inductorbank = IfcElectricFlowStorageDeviceTypeEnum.INDUCTORBANK +recharger = IfcElectricFlowStorageDeviceTypeEnum.RECHARGER +ups = IfcElectricFlowStorageDeviceTypeEnum.UPS +userdefined = IfcElectricFlowStorageDeviceTypeEnum.USERDEFINED +notdefined = IfcElectricFlowStorageDeviceTypeEnum.NOTDEFINED IfcElectricFlowTreatmentDeviceTypeEnum = enum_namespace() -electronicfilter = express_getattr(IfcElectricFlowTreatmentDeviceTypeEnum, 'ELECTRONICFILTER', INDETERMINATE) -userdefined = express_getattr(IfcElectricFlowTreatmentDeviceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcElectricFlowTreatmentDeviceTypeEnum, 'NOTDEFINED', INDETERMINATE) +electronicfilter = IfcElectricFlowTreatmentDeviceTypeEnum.ELECTRONICFILTER +userdefined = IfcElectricFlowTreatmentDeviceTypeEnum.USERDEFINED +notdefined = IfcElectricFlowTreatmentDeviceTypeEnum.NOTDEFINED IfcElectricGeneratorTypeEnum = enum_namespace() -chp = express_getattr(IfcElectricGeneratorTypeEnum, 'CHP', INDETERMINATE) -enginegenerator = express_getattr(IfcElectricGeneratorTypeEnum, 'ENGINEGENERATOR', INDETERMINATE) -standalone = express_getattr(IfcElectricGeneratorTypeEnum, 'STANDALONE', INDETERMINATE) -userdefined = express_getattr(IfcElectricGeneratorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcElectricGeneratorTypeEnum, 'NOTDEFINED', INDETERMINATE) +chp = IfcElectricGeneratorTypeEnum.CHP +enginegenerator = IfcElectricGeneratorTypeEnum.ENGINEGENERATOR +standalone = IfcElectricGeneratorTypeEnum.STANDALONE +userdefined = IfcElectricGeneratorTypeEnum.USERDEFINED +notdefined = IfcElectricGeneratorTypeEnum.NOTDEFINED IfcElectricMotorTypeEnum = enum_namespace() -dc = express_getattr(IfcElectricMotorTypeEnum, 'DC', INDETERMINATE) -induction = express_getattr(IfcElectricMotorTypeEnum, 'INDUCTION', INDETERMINATE) -polyphase = express_getattr(IfcElectricMotorTypeEnum, 'POLYPHASE', INDETERMINATE) -reluctancesynchronous = express_getattr(IfcElectricMotorTypeEnum, 'RELUCTANCESYNCHRONOUS', INDETERMINATE) -synchronous = express_getattr(IfcElectricMotorTypeEnum, 'SYNCHRONOUS', INDETERMINATE) -userdefined = express_getattr(IfcElectricMotorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcElectricMotorTypeEnum, 'NOTDEFINED', INDETERMINATE) +dc = IfcElectricMotorTypeEnum.DC +induction = IfcElectricMotorTypeEnum.INDUCTION +polyphase = IfcElectricMotorTypeEnum.POLYPHASE +reluctancesynchronous = IfcElectricMotorTypeEnum.RELUCTANCESYNCHRONOUS +synchronous = IfcElectricMotorTypeEnum.SYNCHRONOUS +userdefined = IfcElectricMotorTypeEnum.USERDEFINED +notdefined = IfcElectricMotorTypeEnum.NOTDEFINED IfcElectricTimeControlTypeEnum = enum_namespace() -relay = express_getattr(IfcElectricTimeControlTypeEnum, 'RELAY', INDETERMINATE) -timeclock = express_getattr(IfcElectricTimeControlTypeEnum, 'TIMECLOCK', INDETERMINATE) -timedelay = express_getattr(IfcElectricTimeControlTypeEnum, 'TIMEDELAY', INDETERMINATE) -userdefined = express_getattr(IfcElectricTimeControlTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcElectricTimeControlTypeEnum, 'NOTDEFINED', INDETERMINATE) +relay = IfcElectricTimeControlTypeEnum.RELAY +timeclock = IfcElectricTimeControlTypeEnum.TIMECLOCK +timedelay = IfcElectricTimeControlTypeEnum.TIMEDELAY +userdefined = IfcElectricTimeControlTypeEnum.USERDEFINED +notdefined = IfcElectricTimeControlTypeEnum.NOTDEFINED IfcElementAssemblyTypeEnum = enum_namespace() -abutment = express_getattr(IfcElementAssemblyTypeEnum, 'ABUTMENT', INDETERMINATE) -accessory_assembly = express_getattr(IfcElementAssemblyTypeEnum, 'ACCESSORY_ASSEMBLY', INDETERMINATE) -arch = express_getattr(IfcElementAssemblyTypeEnum, 'ARCH', INDETERMINATE) -beam_grid = express_getattr(IfcElementAssemblyTypeEnum, 'BEAM_GRID', INDETERMINATE) -braced_frame = express_getattr(IfcElementAssemblyTypeEnum, 'BRACED_FRAME', INDETERMINATE) -cross_bracing = express_getattr(IfcElementAssemblyTypeEnum, 'CROSS_BRACING', INDETERMINATE) -deck = express_getattr(IfcElementAssemblyTypeEnum, 'DECK', INDETERMINATE) -dilatationpanel = express_getattr(IfcElementAssemblyTypeEnum, 'DILATATIONPANEL', INDETERMINATE) -entranceworks = express_getattr(IfcElementAssemblyTypeEnum, 'ENTRANCEWORKS', INDETERMINATE) -girder = express_getattr(IfcElementAssemblyTypeEnum, 'GIRDER', INDETERMINATE) -grid = express_getattr(IfcElementAssemblyTypeEnum, 'GRID', INDETERMINATE) -mast = express_getattr(IfcElementAssemblyTypeEnum, 'MAST', INDETERMINATE) -pier = express_getattr(IfcElementAssemblyTypeEnum, 'PIER', INDETERMINATE) -pylon = express_getattr(IfcElementAssemblyTypeEnum, 'PYLON', INDETERMINATE) -rail_mechanical_equipment_assembly = express_getattr(IfcElementAssemblyTypeEnum, 'RAIL_MECHANICAL_EQUIPMENT_ASSEMBLY', INDETERMINATE) -reinforcement_unit = express_getattr(IfcElementAssemblyTypeEnum, 'REINFORCEMENT_UNIT', INDETERMINATE) -rigid_frame = express_getattr(IfcElementAssemblyTypeEnum, 'RIGID_FRAME', INDETERMINATE) -shelter = express_getattr(IfcElementAssemblyTypeEnum, 'SHELTER', INDETERMINATE) -signalassembly = express_getattr(IfcElementAssemblyTypeEnum, 'SIGNALASSEMBLY', INDETERMINATE) -slab_field = express_getattr(IfcElementAssemblyTypeEnum, 'SLAB_FIELD', INDETERMINATE) -sumpbuster = express_getattr(IfcElementAssemblyTypeEnum, 'SUMPBUSTER', INDETERMINATE) -supportingassembly = express_getattr(IfcElementAssemblyTypeEnum, 'SUPPORTINGASSEMBLY', INDETERMINATE) -suspensionassembly = express_getattr(IfcElementAssemblyTypeEnum, 'SUSPENSIONASSEMBLY', INDETERMINATE) -trackpanel = express_getattr(IfcElementAssemblyTypeEnum, 'TRACKPANEL', INDETERMINATE) -traction_switching_assembly = express_getattr(IfcElementAssemblyTypeEnum, 'TRACTION_SWITCHING_ASSEMBLY', INDETERMINATE) -traffic_calming_device = express_getattr(IfcElementAssemblyTypeEnum, 'TRAFFIC_CALMING_DEVICE', INDETERMINATE) -truss = express_getattr(IfcElementAssemblyTypeEnum, 'TRUSS', INDETERMINATE) -turnoutpanel = express_getattr(IfcElementAssemblyTypeEnum, 'TURNOUTPANEL', INDETERMINATE) -userdefined = express_getattr(IfcElementAssemblyTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcElementAssemblyTypeEnum, 'NOTDEFINED', INDETERMINATE) +abutment = IfcElementAssemblyTypeEnum.ABUTMENT +accessory_assembly = IfcElementAssemblyTypeEnum.ACCESSORY_ASSEMBLY +arch = IfcElementAssemblyTypeEnum.ARCH +beam_grid = IfcElementAssemblyTypeEnum.BEAM_GRID +braced_frame = IfcElementAssemblyTypeEnum.BRACED_FRAME +cross_bracing = IfcElementAssemblyTypeEnum.CROSS_BRACING +deck = IfcElementAssemblyTypeEnum.DECK +dilatationpanel = IfcElementAssemblyTypeEnum.DILATATIONPANEL +entranceworks = IfcElementAssemblyTypeEnum.ENTRANCEWORKS +girder = IfcElementAssemblyTypeEnum.GIRDER +grid = IfcElementAssemblyTypeEnum.GRID +mast = IfcElementAssemblyTypeEnum.MAST +pier = IfcElementAssemblyTypeEnum.PIER +pylon = IfcElementAssemblyTypeEnum.PYLON +rail_mechanical_equipment_assembly = IfcElementAssemblyTypeEnum.RAIL_MECHANICAL_EQUIPMENT_ASSEMBLY +reinforcement_unit = IfcElementAssemblyTypeEnum.REINFORCEMENT_UNIT +rigid_frame = IfcElementAssemblyTypeEnum.RIGID_FRAME +shelter = IfcElementAssemblyTypeEnum.SHELTER +signalassembly = IfcElementAssemblyTypeEnum.SIGNALASSEMBLY +slab_field = IfcElementAssemblyTypeEnum.SLAB_FIELD +sumpbuster = IfcElementAssemblyTypeEnum.SUMPBUSTER +supportingassembly = IfcElementAssemblyTypeEnum.SUPPORTINGASSEMBLY +suspensionassembly = IfcElementAssemblyTypeEnum.SUSPENSIONASSEMBLY +trackpanel = IfcElementAssemblyTypeEnum.TRACKPANEL +traction_switching_assembly = IfcElementAssemblyTypeEnum.TRACTION_SWITCHING_ASSEMBLY +traffic_calming_device = IfcElementAssemblyTypeEnum.TRAFFIC_CALMING_DEVICE +truss = IfcElementAssemblyTypeEnum.TRUSS +turnoutpanel = IfcElementAssemblyTypeEnum.TURNOUTPANEL +userdefined = IfcElementAssemblyTypeEnum.USERDEFINED +notdefined = IfcElementAssemblyTypeEnum.NOTDEFINED IfcElementCompositionEnum = enum_namespace() -complex = express_getattr(IfcElementCompositionEnum, 'COMPLEX', INDETERMINATE) -element = express_getattr(IfcElementCompositionEnum, 'ELEMENT', INDETERMINATE) -partial = express_getattr(IfcElementCompositionEnum, 'PARTIAL', INDETERMINATE) +complex = IfcElementCompositionEnum.COMPLEX +element = IfcElementCompositionEnum.ELEMENT +partial = IfcElementCompositionEnum.PARTIAL IfcEngineTypeEnum = enum_namespace() -externalcombustion = express_getattr(IfcEngineTypeEnum, 'EXTERNALCOMBUSTION', INDETERMINATE) -internalcombustion = express_getattr(IfcEngineTypeEnum, 'INTERNALCOMBUSTION', INDETERMINATE) -userdefined = express_getattr(IfcEngineTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcEngineTypeEnum, 'NOTDEFINED', INDETERMINATE) +externalcombustion = IfcEngineTypeEnum.EXTERNALCOMBUSTION +internalcombustion = IfcEngineTypeEnum.INTERNALCOMBUSTION +userdefined = IfcEngineTypeEnum.USERDEFINED +notdefined = IfcEngineTypeEnum.NOTDEFINED IfcEvaporativeCoolerTypeEnum = enum_namespace() -directevaporativeairwasher = express_getattr(IfcEvaporativeCoolerTypeEnum, 'DIRECTEVAPORATIVEAIRWASHER', INDETERMINATE) -directevaporativepackagedrotaryaircooler = express_getattr(IfcEvaporativeCoolerTypeEnum, 'DIRECTEVAPORATIVEPACKAGEDROTARYAIRCOOLER', INDETERMINATE) -directevaporativerandommediaaircooler = express_getattr(IfcEvaporativeCoolerTypeEnum, 'DIRECTEVAPORATIVERANDOMMEDIAAIRCOOLER', INDETERMINATE) -directevaporativerigidmediaaircooler = express_getattr(IfcEvaporativeCoolerTypeEnum, 'DIRECTEVAPORATIVERIGIDMEDIAAIRCOOLER', INDETERMINATE) -directevaporativeslingerspackagedaircooler = express_getattr(IfcEvaporativeCoolerTypeEnum, 'DIRECTEVAPORATIVESLINGERSPACKAGEDAIRCOOLER', INDETERMINATE) -indirectdirectcombination = express_getattr(IfcEvaporativeCoolerTypeEnum, 'INDIRECTDIRECTCOMBINATION', INDETERMINATE) -indirectevaporativecoolingtowerorcoilcooler = express_getattr(IfcEvaporativeCoolerTypeEnum, 'INDIRECTEVAPORATIVECOOLINGTOWERORCOILCOOLER', INDETERMINATE) -indirectevaporativepackageaircooler = express_getattr(IfcEvaporativeCoolerTypeEnum, 'INDIRECTEVAPORATIVEPACKAGEAIRCOOLER', INDETERMINATE) -indirectevaporativewetcoil = express_getattr(IfcEvaporativeCoolerTypeEnum, 'INDIRECTEVAPORATIVEWETCOIL', INDETERMINATE) -userdefined = express_getattr(IfcEvaporativeCoolerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcEvaporativeCoolerTypeEnum, 'NOTDEFINED', INDETERMINATE) +directevaporativeairwasher = IfcEvaporativeCoolerTypeEnum.DIRECTEVAPORATIVEAIRWASHER +directevaporativepackagedrotaryaircooler = IfcEvaporativeCoolerTypeEnum.DIRECTEVAPORATIVEPACKAGEDROTARYAIRCOOLER +directevaporativerandommediaaircooler = IfcEvaporativeCoolerTypeEnum.DIRECTEVAPORATIVERANDOMMEDIAAIRCOOLER +directevaporativerigidmediaaircooler = IfcEvaporativeCoolerTypeEnum.DIRECTEVAPORATIVERIGIDMEDIAAIRCOOLER +directevaporativeslingerspackagedaircooler = IfcEvaporativeCoolerTypeEnum.DIRECTEVAPORATIVESLINGERSPACKAGEDAIRCOOLER +indirectdirectcombination = IfcEvaporativeCoolerTypeEnum.INDIRECTDIRECTCOMBINATION +indirectevaporativecoolingtowerorcoilcooler = IfcEvaporativeCoolerTypeEnum.INDIRECTEVAPORATIVECOOLINGTOWERORCOILCOOLER +indirectevaporativepackageaircooler = IfcEvaporativeCoolerTypeEnum.INDIRECTEVAPORATIVEPACKAGEAIRCOOLER +indirectevaporativewetcoil = IfcEvaporativeCoolerTypeEnum.INDIRECTEVAPORATIVEWETCOIL +userdefined = IfcEvaporativeCoolerTypeEnum.USERDEFINED +notdefined = IfcEvaporativeCoolerTypeEnum.NOTDEFINED IfcEvaporatorTypeEnum = enum_namespace() -directexpansion = express_getattr(IfcEvaporatorTypeEnum, 'DIRECTEXPANSION', INDETERMINATE) -directexpansionbrazedplate = express_getattr(IfcEvaporatorTypeEnum, 'DIRECTEXPANSIONBRAZEDPLATE', INDETERMINATE) -directexpansionshellandtube = express_getattr(IfcEvaporatorTypeEnum, 'DIRECTEXPANSIONSHELLANDTUBE', INDETERMINATE) -directexpansiontubeintube = express_getattr(IfcEvaporatorTypeEnum, 'DIRECTEXPANSIONTUBEINTUBE', INDETERMINATE) -floodedshellandtube = express_getattr(IfcEvaporatorTypeEnum, 'FLOODEDSHELLANDTUBE', INDETERMINATE) -shellandcoil = express_getattr(IfcEvaporatorTypeEnum, 'SHELLANDCOIL', INDETERMINATE) -userdefined = express_getattr(IfcEvaporatorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcEvaporatorTypeEnum, 'NOTDEFINED', INDETERMINATE) +directexpansion = IfcEvaporatorTypeEnum.DIRECTEXPANSION +directexpansionbrazedplate = IfcEvaporatorTypeEnum.DIRECTEXPANSIONBRAZEDPLATE +directexpansionshellandtube = IfcEvaporatorTypeEnum.DIRECTEXPANSIONSHELLANDTUBE +directexpansiontubeintube = IfcEvaporatorTypeEnum.DIRECTEXPANSIONTUBEINTUBE +floodedshellandtube = IfcEvaporatorTypeEnum.FLOODEDSHELLANDTUBE +shellandcoil = IfcEvaporatorTypeEnum.SHELLANDCOIL +userdefined = IfcEvaporatorTypeEnum.USERDEFINED +notdefined = IfcEvaporatorTypeEnum.NOTDEFINED IfcEventTriggerTypeEnum = enum_namespace() -eventcomplex = express_getattr(IfcEventTriggerTypeEnum, 'EVENTCOMPLEX', INDETERMINATE) -eventmessage = express_getattr(IfcEventTriggerTypeEnum, 'EVENTMESSAGE', INDETERMINATE) -eventrule = express_getattr(IfcEventTriggerTypeEnum, 'EVENTRULE', INDETERMINATE) -eventtime = express_getattr(IfcEventTriggerTypeEnum, 'EVENTTIME', INDETERMINATE) -userdefined = express_getattr(IfcEventTriggerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcEventTriggerTypeEnum, 'NOTDEFINED', INDETERMINATE) +eventcomplex = IfcEventTriggerTypeEnum.EVENTCOMPLEX +eventmessage = IfcEventTriggerTypeEnum.EVENTMESSAGE +eventrule = IfcEventTriggerTypeEnum.EVENTRULE +eventtime = IfcEventTriggerTypeEnum.EVENTTIME +userdefined = IfcEventTriggerTypeEnum.USERDEFINED +notdefined = IfcEventTriggerTypeEnum.NOTDEFINED IfcEventTypeEnum = enum_namespace() -endevent = express_getattr(IfcEventTypeEnum, 'ENDEVENT', INDETERMINATE) -intermediateevent = express_getattr(IfcEventTypeEnum, 'INTERMEDIATEEVENT', INDETERMINATE) -startevent = express_getattr(IfcEventTypeEnum, 'STARTEVENT', INDETERMINATE) -userdefined = express_getattr(IfcEventTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcEventTypeEnum, 'NOTDEFINED', INDETERMINATE) +endevent = IfcEventTypeEnum.ENDEVENT +intermediateevent = IfcEventTypeEnum.INTERMEDIATEEVENT +startevent = IfcEventTypeEnum.STARTEVENT +userdefined = IfcEventTypeEnum.USERDEFINED +notdefined = IfcEventTypeEnum.NOTDEFINED IfcExternalSpatialElementTypeEnum = enum_namespace() -external = express_getattr(IfcExternalSpatialElementTypeEnum, 'EXTERNAL', INDETERMINATE) -external_earth = express_getattr(IfcExternalSpatialElementTypeEnum, 'EXTERNAL_EARTH', INDETERMINATE) -external_fire = express_getattr(IfcExternalSpatialElementTypeEnum, 'EXTERNAL_FIRE', INDETERMINATE) -external_water = express_getattr(IfcExternalSpatialElementTypeEnum, 'EXTERNAL_WATER', INDETERMINATE) -userdefined = express_getattr(IfcExternalSpatialElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcExternalSpatialElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +external = IfcExternalSpatialElementTypeEnum.EXTERNAL +external_earth = IfcExternalSpatialElementTypeEnum.EXTERNAL_EARTH +external_fire = IfcExternalSpatialElementTypeEnum.EXTERNAL_FIRE +external_water = IfcExternalSpatialElementTypeEnum.EXTERNAL_WATER +userdefined = IfcExternalSpatialElementTypeEnum.USERDEFINED +notdefined = IfcExternalSpatialElementTypeEnum.NOTDEFINED IfcFacilityPartCommonTypeEnum = enum_namespace() -aboveground = express_getattr(IfcFacilityPartCommonTypeEnum, 'ABOVEGROUND', INDETERMINATE) -belowground = express_getattr(IfcFacilityPartCommonTypeEnum, 'BELOWGROUND', INDETERMINATE) -junction = express_getattr(IfcFacilityPartCommonTypeEnum, 'JUNCTION', INDETERMINATE) -levelcrossing = express_getattr(IfcFacilityPartCommonTypeEnum, 'LEVELCROSSING', INDETERMINATE) -segment = express_getattr(IfcFacilityPartCommonTypeEnum, 'SEGMENT', INDETERMINATE) -substructure = express_getattr(IfcFacilityPartCommonTypeEnum, 'SUBSTRUCTURE', INDETERMINATE) -superstructure = express_getattr(IfcFacilityPartCommonTypeEnum, 'SUPERSTRUCTURE', INDETERMINATE) -terminal = express_getattr(IfcFacilityPartCommonTypeEnum, 'TERMINAL', INDETERMINATE) -userdefined = express_getattr(IfcFacilityPartCommonTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFacilityPartCommonTypeEnum, 'NOTDEFINED', INDETERMINATE) +aboveground = IfcFacilityPartCommonTypeEnum.ABOVEGROUND +belowground = IfcFacilityPartCommonTypeEnum.BELOWGROUND +junction = IfcFacilityPartCommonTypeEnum.JUNCTION +levelcrossing = IfcFacilityPartCommonTypeEnum.LEVELCROSSING +segment = IfcFacilityPartCommonTypeEnum.SEGMENT +substructure = IfcFacilityPartCommonTypeEnum.SUBSTRUCTURE +superstructure = IfcFacilityPartCommonTypeEnum.SUPERSTRUCTURE +terminal = IfcFacilityPartCommonTypeEnum.TERMINAL +userdefined = IfcFacilityPartCommonTypeEnum.USERDEFINED +notdefined = IfcFacilityPartCommonTypeEnum.NOTDEFINED IfcFacilityUsageEnum = enum_namespace() -lateral = express_getattr(IfcFacilityUsageEnum, 'LATERAL', INDETERMINATE) -longitudinal = express_getattr(IfcFacilityUsageEnum, 'LONGITUDINAL', INDETERMINATE) -region = express_getattr(IfcFacilityUsageEnum, 'REGION', INDETERMINATE) -vertical = express_getattr(IfcFacilityUsageEnum, 'VERTICAL', INDETERMINATE) -userdefined = express_getattr(IfcFacilityUsageEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFacilityUsageEnum, 'NOTDEFINED', INDETERMINATE) +lateral = IfcFacilityUsageEnum.LATERAL +longitudinal = IfcFacilityUsageEnum.LONGITUDINAL +region = IfcFacilityUsageEnum.REGION +vertical = IfcFacilityUsageEnum.VERTICAL +userdefined = IfcFacilityUsageEnum.USERDEFINED +notdefined = IfcFacilityUsageEnum.NOTDEFINED IfcFanTypeEnum = enum_namespace() -centrifugalairfoil = express_getattr(IfcFanTypeEnum, 'CENTRIFUGALAIRFOIL', INDETERMINATE) -centrifugalbackwardinclinedcurved = express_getattr(IfcFanTypeEnum, 'CENTRIFUGALBACKWARDINCLINEDCURVED', INDETERMINATE) -centrifugalforwardcurved = express_getattr(IfcFanTypeEnum, 'CENTRIFUGALFORWARDCURVED', INDETERMINATE) -centrifugalradial = express_getattr(IfcFanTypeEnum, 'CENTRIFUGALRADIAL', INDETERMINATE) -propelloraxial = express_getattr(IfcFanTypeEnum, 'PROPELLORAXIAL', INDETERMINATE) -tubeaxial = express_getattr(IfcFanTypeEnum, 'TUBEAXIAL', INDETERMINATE) -vaneaxial = express_getattr(IfcFanTypeEnum, 'VANEAXIAL', INDETERMINATE) -userdefined = express_getattr(IfcFanTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFanTypeEnum, 'NOTDEFINED', INDETERMINATE) +centrifugalairfoil = IfcFanTypeEnum.CENTRIFUGALAIRFOIL +centrifugalbackwardinclinedcurved = IfcFanTypeEnum.CENTRIFUGALBACKWARDINCLINEDCURVED +centrifugalforwardcurved = IfcFanTypeEnum.CENTRIFUGALFORWARDCURVED +centrifugalradial = IfcFanTypeEnum.CENTRIFUGALRADIAL +propelloraxial = IfcFanTypeEnum.PROPELLORAXIAL +tubeaxial = IfcFanTypeEnum.TUBEAXIAL +vaneaxial = IfcFanTypeEnum.VANEAXIAL +userdefined = IfcFanTypeEnum.USERDEFINED +notdefined = IfcFanTypeEnum.NOTDEFINED IfcFastenerTypeEnum = enum_namespace() -glue = express_getattr(IfcFastenerTypeEnum, 'GLUE', INDETERMINATE) -mortar = express_getattr(IfcFastenerTypeEnum, 'MORTAR', INDETERMINATE) -weld = express_getattr(IfcFastenerTypeEnum, 'WELD', INDETERMINATE) -userdefined = express_getattr(IfcFastenerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFastenerTypeEnum, 'NOTDEFINED', INDETERMINATE) +glue = IfcFastenerTypeEnum.GLUE +mortar = IfcFastenerTypeEnum.MORTAR +weld = IfcFastenerTypeEnum.WELD +userdefined = IfcFastenerTypeEnum.USERDEFINED +notdefined = IfcFastenerTypeEnum.NOTDEFINED IfcFilterTypeEnum = enum_namespace() -airparticlefilter = express_getattr(IfcFilterTypeEnum, 'AIRPARTICLEFILTER', INDETERMINATE) -compressedairfilter = express_getattr(IfcFilterTypeEnum, 'COMPRESSEDAIRFILTER', INDETERMINATE) -odorfilter = express_getattr(IfcFilterTypeEnum, 'ODORFILTER', INDETERMINATE) -oilfilter = express_getattr(IfcFilterTypeEnum, 'OILFILTER', INDETERMINATE) -strainer = express_getattr(IfcFilterTypeEnum, 'STRAINER', INDETERMINATE) -waterfilter = express_getattr(IfcFilterTypeEnum, 'WATERFILTER', INDETERMINATE) -userdefined = express_getattr(IfcFilterTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFilterTypeEnum, 'NOTDEFINED', INDETERMINATE) +airparticlefilter = IfcFilterTypeEnum.AIRPARTICLEFILTER +compressedairfilter = IfcFilterTypeEnum.COMPRESSEDAIRFILTER +odorfilter = IfcFilterTypeEnum.ODORFILTER +oilfilter = IfcFilterTypeEnum.OILFILTER +strainer = IfcFilterTypeEnum.STRAINER +waterfilter = IfcFilterTypeEnum.WATERFILTER +userdefined = IfcFilterTypeEnum.USERDEFINED +notdefined = IfcFilterTypeEnum.NOTDEFINED IfcFireSuppressionTerminalTypeEnum = enum_namespace() -breechinginlet = express_getattr(IfcFireSuppressionTerminalTypeEnum, 'BREECHINGINLET', INDETERMINATE) -firehydrant = express_getattr(IfcFireSuppressionTerminalTypeEnum, 'FIREHYDRANT', INDETERMINATE) -firemonitor = express_getattr(IfcFireSuppressionTerminalTypeEnum, 'FIREMONITOR', INDETERMINATE) -hosereel = express_getattr(IfcFireSuppressionTerminalTypeEnum, 'HOSEREEL', INDETERMINATE) -sprinkler = express_getattr(IfcFireSuppressionTerminalTypeEnum, 'SPRINKLER', INDETERMINATE) -sprinklerdeflector = express_getattr(IfcFireSuppressionTerminalTypeEnum, 'SPRINKLERDEFLECTOR', INDETERMINATE) -userdefined = express_getattr(IfcFireSuppressionTerminalTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFireSuppressionTerminalTypeEnum, 'NOTDEFINED', INDETERMINATE) +breechinginlet = IfcFireSuppressionTerminalTypeEnum.BREECHINGINLET +firehydrant = IfcFireSuppressionTerminalTypeEnum.FIREHYDRANT +firemonitor = IfcFireSuppressionTerminalTypeEnum.FIREMONITOR +hosereel = IfcFireSuppressionTerminalTypeEnum.HOSEREEL +sprinkler = IfcFireSuppressionTerminalTypeEnum.SPRINKLER +sprinklerdeflector = IfcFireSuppressionTerminalTypeEnum.SPRINKLERDEFLECTOR +userdefined = IfcFireSuppressionTerminalTypeEnum.USERDEFINED +notdefined = IfcFireSuppressionTerminalTypeEnum.NOTDEFINED IfcFlowDirectionEnum = enum_namespace() -sink = express_getattr(IfcFlowDirectionEnum, 'SINK', INDETERMINATE) -source = express_getattr(IfcFlowDirectionEnum, 'SOURCE', INDETERMINATE) -sourceandsink = express_getattr(IfcFlowDirectionEnum, 'SOURCEANDSINK', INDETERMINATE) -notdefined = express_getattr(IfcFlowDirectionEnum, 'NOTDEFINED', INDETERMINATE) +sink = IfcFlowDirectionEnum.SINK +source = IfcFlowDirectionEnum.SOURCE +sourceandsink = IfcFlowDirectionEnum.SOURCEANDSINK +notdefined = IfcFlowDirectionEnum.NOTDEFINED IfcFlowInstrumentTypeEnum = enum_namespace() -ammeter = express_getattr(IfcFlowInstrumentTypeEnum, 'AMMETER', INDETERMINATE) -combined = express_getattr(IfcFlowInstrumentTypeEnum, 'COMBINED', INDETERMINATE) -frequencymeter = express_getattr(IfcFlowInstrumentTypeEnum, 'FREQUENCYMETER', INDETERMINATE) -phaseanglemeter = express_getattr(IfcFlowInstrumentTypeEnum, 'PHASEANGLEMETER', INDETERMINATE) -powerfactormeter = express_getattr(IfcFlowInstrumentTypeEnum, 'POWERFACTORMETER', INDETERMINATE) -pressuregauge = express_getattr(IfcFlowInstrumentTypeEnum, 'PRESSUREGAUGE', INDETERMINATE) -thermometer = express_getattr(IfcFlowInstrumentTypeEnum, 'THERMOMETER', INDETERMINATE) -voltmeter = express_getattr(IfcFlowInstrumentTypeEnum, 'VOLTMETER', INDETERMINATE) -voltmeter_peak = express_getattr(IfcFlowInstrumentTypeEnum, 'VOLTMETER_PEAK', INDETERMINATE) -voltmeter_rms = express_getattr(IfcFlowInstrumentTypeEnum, 'VOLTMETER_RMS', INDETERMINATE) -userdefined = express_getattr(IfcFlowInstrumentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFlowInstrumentTypeEnum, 'NOTDEFINED', INDETERMINATE) +ammeter = IfcFlowInstrumentTypeEnum.AMMETER +combined = IfcFlowInstrumentTypeEnum.COMBINED +frequencymeter = IfcFlowInstrumentTypeEnum.FREQUENCYMETER +phaseanglemeter = IfcFlowInstrumentTypeEnum.PHASEANGLEMETER +powerfactormeter = IfcFlowInstrumentTypeEnum.POWERFACTORMETER +pressuregauge = IfcFlowInstrumentTypeEnum.PRESSUREGAUGE +thermometer = IfcFlowInstrumentTypeEnum.THERMOMETER +voltmeter = IfcFlowInstrumentTypeEnum.VOLTMETER +voltmeter_peak = IfcFlowInstrumentTypeEnum.VOLTMETER_PEAK +voltmeter_rms = IfcFlowInstrumentTypeEnum.VOLTMETER_RMS +userdefined = IfcFlowInstrumentTypeEnum.USERDEFINED +notdefined = IfcFlowInstrumentTypeEnum.NOTDEFINED IfcFlowMeterTypeEnum = enum_namespace() -energymeter = express_getattr(IfcFlowMeterTypeEnum, 'ENERGYMETER', INDETERMINATE) -gasmeter = express_getattr(IfcFlowMeterTypeEnum, 'GASMETER', INDETERMINATE) -oilmeter = express_getattr(IfcFlowMeterTypeEnum, 'OILMETER', INDETERMINATE) -watermeter = express_getattr(IfcFlowMeterTypeEnum, 'WATERMETER', INDETERMINATE) -userdefined = express_getattr(IfcFlowMeterTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFlowMeterTypeEnum, 'NOTDEFINED', INDETERMINATE) +energymeter = IfcFlowMeterTypeEnum.ENERGYMETER +gasmeter = IfcFlowMeterTypeEnum.GASMETER +oilmeter = IfcFlowMeterTypeEnum.OILMETER +watermeter = IfcFlowMeterTypeEnum.WATERMETER +userdefined = IfcFlowMeterTypeEnum.USERDEFINED +notdefined = IfcFlowMeterTypeEnum.NOTDEFINED IfcFootingTypeEnum = enum_namespace() -caisson_foundation = express_getattr(IfcFootingTypeEnum, 'CAISSON_FOUNDATION', INDETERMINATE) -footing_beam = express_getattr(IfcFootingTypeEnum, 'FOOTING_BEAM', INDETERMINATE) -pad_footing = express_getattr(IfcFootingTypeEnum, 'PAD_FOOTING', INDETERMINATE) -pile_cap = express_getattr(IfcFootingTypeEnum, 'PILE_CAP', INDETERMINATE) -strip_footing = express_getattr(IfcFootingTypeEnum, 'STRIP_FOOTING', INDETERMINATE) -userdefined = express_getattr(IfcFootingTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFootingTypeEnum, 'NOTDEFINED', INDETERMINATE) +caisson_foundation = IfcFootingTypeEnum.CAISSON_FOUNDATION +footing_beam = IfcFootingTypeEnum.FOOTING_BEAM +pad_footing = IfcFootingTypeEnum.PAD_FOOTING +pile_cap = IfcFootingTypeEnum.PILE_CAP +strip_footing = IfcFootingTypeEnum.STRIP_FOOTING +userdefined = IfcFootingTypeEnum.USERDEFINED +notdefined = IfcFootingTypeEnum.NOTDEFINED IfcFurnitureTypeEnum = enum_namespace() -bed = express_getattr(IfcFurnitureTypeEnum, 'BED', INDETERMINATE) -chair = express_getattr(IfcFurnitureTypeEnum, 'CHAIR', INDETERMINATE) -desk = express_getattr(IfcFurnitureTypeEnum, 'DESK', INDETERMINATE) -filecabinet = express_getattr(IfcFurnitureTypeEnum, 'FILECABINET', INDETERMINATE) -shelf = express_getattr(IfcFurnitureTypeEnum, 'SHELF', INDETERMINATE) -sofa = express_getattr(IfcFurnitureTypeEnum, 'SOFA', INDETERMINATE) -table = express_getattr(IfcFurnitureTypeEnum, 'TABLE', INDETERMINATE) -technicalcabinet = express_getattr(IfcFurnitureTypeEnum, 'TECHNICALCABINET', INDETERMINATE) -userdefined = express_getattr(IfcFurnitureTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcFurnitureTypeEnum, 'NOTDEFINED', INDETERMINATE) +bed = IfcFurnitureTypeEnum.BED +chair = IfcFurnitureTypeEnum.CHAIR +desk = IfcFurnitureTypeEnum.DESK +filecabinet = IfcFurnitureTypeEnum.FILECABINET +shelf = IfcFurnitureTypeEnum.SHELF +sofa = IfcFurnitureTypeEnum.SOFA +table = IfcFurnitureTypeEnum.TABLE +technicalcabinet = IfcFurnitureTypeEnum.TECHNICALCABINET +userdefined = IfcFurnitureTypeEnum.USERDEFINED +notdefined = IfcFurnitureTypeEnum.NOTDEFINED IfcGeographicElementTypeEnum = enum_namespace() -soil_boring_point = express_getattr(IfcGeographicElementTypeEnum, 'SOIL_BORING_POINT', INDETERMINATE) -terrain = express_getattr(IfcGeographicElementTypeEnum, 'TERRAIN', INDETERMINATE) -vegetation = express_getattr(IfcGeographicElementTypeEnum, 'VEGETATION', INDETERMINATE) -userdefined = express_getattr(IfcGeographicElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcGeographicElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +soil_boring_point = IfcGeographicElementTypeEnum.SOIL_BORING_POINT +terrain = IfcGeographicElementTypeEnum.TERRAIN +vegetation = IfcGeographicElementTypeEnum.VEGETATION +userdefined = IfcGeographicElementTypeEnum.USERDEFINED +notdefined = IfcGeographicElementTypeEnum.NOTDEFINED IfcGeometricProjectionEnum = enum_namespace() -elevation_view = express_getattr(IfcGeometricProjectionEnum, 'ELEVATION_VIEW', INDETERMINATE) -graph_view = express_getattr(IfcGeometricProjectionEnum, 'GRAPH_VIEW', INDETERMINATE) -model_view = express_getattr(IfcGeometricProjectionEnum, 'MODEL_VIEW', INDETERMINATE) -plan_view = express_getattr(IfcGeometricProjectionEnum, 'PLAN_VIEW', INDETERMINATE) -reflected_plan_view = express_getattr(IfcGeometricProjectionEnum, 'REFLECTED_PLAN_VIEW', INDETERMINATE) -section_view = express_getattr(IfcGeometricProjectionEnum, 'SECTION_VIEW', INDETERMINATE) -sketch_view = express_getattr(IfcGeometricProjectionEnum, 'SKETCH_VIEW', INDETERMINATE) -userdefined = express_getattr(IfcGeometricProjectionEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcGeometricProjectionEnum, 'NOTDEFINED', INDETERMINATE) +elevation_view = IfcGeometricProjectionEnum.ELEVATION_VIEW +graph_view = IfcGeometricProjectionEnum.GRAPH_VIEW +model_view = IfcGeometricProjectionEnum.MODEL_VIEW +plan_view = IfcGeometricProjectionEnum.PLAN_VIEW +reflected_plan_view = IfcGeometricProjectionEnum.REFLECTED_PLAN_VIEW +section_view = IfcGeometricProjectionEnum.SECTION_VIEW +sketch_view = IfcGeometricProjectionEnum.SKETCH_VIEW +userdefined = IfcGeometricProjectionEnum.USERDEFINED +notdefined = IfcGeometricProjectionEnum.NOTDEFINED IfcGeotechnicalStratumTypeEnum = enum_namespace() -solid = express_getattr(IfcGeotechnicalStratumTypeEnum, 'SOLID', INDETERMINATE) -void = express_getattr(IfcGeotechnicalStratumTypeEnum, 'VOID', INDETERMINATE) -water = express_getattr(IfcGeotechnicalStratumTypeEnum, 'WATER', INDETERMINATE) -userdefined = express_getattr(IfcGeotechnicalStratumTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcGeotechnicalStratumTypeEnum, 'NOTDEFINED', INDETERMINATE) +solid = IfcGeotechnicalStratumTypeEnum.SOLID +void = IfcGeotechnicalStratumTypeEnum.VOID +water = IfcGeotechnicalStratumTypeEnum.WATER +userdefined = IfcGeotechnicalStratumTypeEnum.USERDEFINED +notdefined = IfcGeotechnicalStratumTypeEnum.NOTDEFINED IfcGlobalOrLocalEnum = enum_namespace() -global_coords = express_getattr(IfcGlobalOrLocalEnum, 'GLOBAL_COORDS', INDETERMINATE) -local_coords = express_getattr(IfcGlobalOrLocalEnum, 'LOCAL_COORDS', INDETERMINATE) +global_coords = IfcGlobalOrLocalEnum.GLOBAL_COORDS +local_coords = IfcGlobalOrLocalEnum.LOCAL_COORDS IfcGridTypeEnum = enum_namespace() -irregular = express_getattr(IfcGridTypeEnum, 'IRREGULAR', INDETERMINATE) -radial = express_getattr(IfcGridTypeEnum, 'RADIAL', INDETERMINATE) -rectangular = express_getattr(IfcGridTypeEnum, 'RECTANGULAR', INDETERMINATE) -triangular = express_getattr(IfcGridTypeEnum, 'TRIANGULAR', INDETERMINATE) -userdefined = express_getattr(IfcGridTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcGridTypeEnum, 'NOTDEFINED', INDETERMINATE) +irregular = IfcGridTypeEnum.IRREGULAR +radial = IfcGridTypeEnum.RADIAL +rectangular = IfcGridTypeEnum.RECTANGULAR +triangular = IfcGridTypeEnum.TRIANGULAR +userdefined = IfcGridTypeEnum.USERDEFINED +notdefined = IfcGridTypeEnum.NOTDEFINED IfcHeatExchangerTypeEnum = enum_namespace() -plate = express_getattr(IfcHeatExchangerTypeEnum, 'PLATE', INDETERMINATE) -shellandtube = express_getattr(IfcHeatExchangerTypeEnum, 'SHELLANDTUBE', INDETERMINATE) -turnoutheating = express_getattr(IfcHeatExchangerTypeEnum, 'TURNOUTHEATING', INDETERMINATE) -userdefined = express_getattr(IfcHeatExchangerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcHeatExchangerTypeEnum, 'NOTDEFINED', INDETERMINATE) +plate = IfcHeatExchangerTypeEnum.PLATE +shellandtube = IfcHeatExchangerTypeEnum.SHELLANDTUBE +turnoutheating = IfcHeatExchangerTypeEnum.TURNOUTHEATING +userdefined = IfcHeatExchangerTypeEnum.USERDEFINED +notdefined = IfcHeatExchangerTypeEnum.NOTDEFINED IfcHumidifierTypeEnum = enum_namespace() -adiabaticairwasher = express_getattr(IfcHumidifierTypeEnum, 'ADIABATICAIRWASHER', INDETERMINATE) -adiabaticatomizing = express_getattr(IfcHumidifierTypeEnum, 'ADIABATICATOMIZING', INDETERMINATE) -adiabaticcompressedairnozzle = express_getattr(IfcHumidifierTypeEnum, 'ADIABATICCOMPRESSEDAIRNOZZLE', INDETERMINATE) -adiabaticpan = express_getattr(IfcHumidifierTypeEnum, 'ADIABATICPAN', INDETERMINATE) -adiabaticrigidmedia = express_getattr(IfcHumidifierTypeEnum, 'ADIABATICRIGIDMEDIA', INDETERMINATE) -adiabaticultrasonic = express_getattr(IfcHumidifierTypeEnum, 'ADIABATICULTRASONIC', INDETERMINATE) -adiabaticwettedelement = express_getattr(IfcHumidifierTypeEnum, 'ADIABATICWETTEDELEMENT', INDETERMINATE) -assistedbutane = express_getattr(IfcHumidifierTypeEnum, 'ASSISTEDBUTANE', INDETERMINATE) -assistedelectric = express_getattr(IfcHumidifierTypeEnum, 'ASSISTEDELECTRIC', INDETERMINATE) -assistednaturalgas = express_getattr(IfcHumidifierTypeEnum, 'ASSISTEDNATURALGAS', INDETERMINATE) -assistedpropane = express_getattr(IfcHumidifierTypeEnum, 'ASSISTEDPROPANE', INDETERMINATE) -assistedsteam = express_getattr(IfcHumidifierTypeEnum, 'ASSISTEDSTEAM', INDETERMINATE) -steaminjection = express_getattr(IfcHumidifierTypeEnum, 'STEAMINJECTION', INDETERMINATE) -userdefined = express_getattr(IfcHumidifierTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcHumidifierTypeEnum, 'NOTDEFINED', INDETERMINATE) +adiabaticairwasher = IfcHumidifierTypeEnum.ADIABATICAIRWASHER +adiabaticatomizing = IfcHumidifierTypeEnum.ADIABATICATOMIZING +adiabaticcompressedairnozzle = IfcHumidifierTypeEnum.ADIABATICCOMPRESSEDAIRNOZZLE +adiabaticpan = IfcHumidifierTypeEnum.ADIABATICPAN +adiabaticrigidmedia = IfcHumidifierTypeEnum.ADIABATICRIGIDMEDIA +adiabaticultrasonic = IfcHumidifierTypeEnum.ADIABATICULTRASONIC +adiabaticwettedelement = IfcHumidifierTypeEnum.ADIABATICWETTEDELEMENT +assistedbutane = IfcHumidifierTypeEnum.ASSISTEDBUTANE +assistedelectric = IfcHumidifierTypeEnum.ASSISTEDELECTRIC +assistednaturalgas = IfcHumidifierTypeEnum.ASSISTEDNATURALGAS +assistedpropane = IfcHumidifierTypeEnum.ASSISTEDPROPANE +assistedsteam = IfcHumidifierTypeEnum.ASSISTEDSTEAM +steaminjection = IfcHumidifierTypeEnum.STEAMINJECTION +userdefined = IfcHumidifierTypeEnum.USERDEFINED +notdefined = IfcHumidifierTypeEnum.NOTDEFINED IfcImpactProtectionDeviceTypeEnum = enum_namespace() -bumper = express_getattr(IfcImpactProtectionDeviceTypeEnum, 'BUMPER', INDETERMINATE) -crashcushion = express_getattr(IfcImpactProtectionDeviceTypeEnum, 'CRASHCUSHION', INDETERMINATE) -dampingsystem = express_getattr(IfcImpactProtectionDeviceTypeEnum, 'DAMPINGSYSTEM', INDETERMINATE) -fender = express_getattr(IfcImpactProtectionDeviceTypeEnum, 'FENDER', INDETERMINATE) -userdefined = express_getattr(IfcImpactProtectionDeviceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcImpactProtectionDeviceTypeEnum, 'NOTDEFINED', INDETERMINATE) +bumper = IfcImpactProtectionDeviceTypeEnum.BUMPER +crashcushion = IfcImpactProtectionDeviceTypeEnum.CRASHCUSHION +dampingsystem = IfcImpactProtectionDeviceTypeEnum.DAMPINGSYSTEM +fender = IfcImpactProtectionDeviceTypeEnum.FENDER +userdefined = IfcImpactProtectionDeviceTypeEnum.USERDEFINED +notdefined = IfcImpactProtectionDeviceTypeEnum.NOTDEFINED IfcInterceptorTypeEnum = enum_namespace() -cyclonic = express_getattr(IfcInterceptorTypeEnum, 'CYCLONIC', INDETERMINATE) -grease = express_getattr(IfcInterceptorTypeEnum, 'GREASE', INDETERMINATE) -oil = express_getattr(IfcInterceptorTypeEnum, 'OIL', INDETERMINATE) -petrol = express_getattr(IfcInterceptorTypeEnum, 'PETROL', INDETERMINATE) -userdefined = express_getattr(IfcInterceptorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcInterceptorTypeEnum, 'NOTDEFINED', INDETERMINATE) +cyclonic = IfcInterceptorTypeEnum.CYCLONIC +grease = IfcInterceptorTypeEnum.GREASE +oil = IfcInterceptorTypeEnum.OIL +petrol = IfcInterceptorTypeEnum.PETROL +userdefined = IfcInterceptorTypeEnum.USERDEFINED +notdefined = IfcInterceptorTypeEnum.NOTDEFINED IfcInternalOrExternalEnum = enum_namespace() -external = express_getattr(IfcInternalOrExternalEnum, 'EXTERNAL', INDETERMINATE) -external_earth = express_getattr(IfcInternalOrExternalEnum, 'EXTERNAL_EARTH', INDETERMINATE) -external_fire = express_getattr(IfcInternalOrExternalEnum, 'EXTERNAL_FIRE', INDETERMINATE) -external_water = express_getattr(IfcInternalOrExternalEnum, 'EXTERNAL_WATER', INDETERMINATE) -internal = express_getattr(IfcInternalOrExternalEnum, 'INTERNAL', INDETERMINATE) -notdefined = express_getattr(IfcInternalOrExternalEnum, 'NOTDEFINED', INDETERMINATE) +external = IfcInternalOrExternalEnum.EXTERNAL +external_earth = IfcInternalOrExternalEnum.EXTERNAL_EARTH +external_fire = IfcInternalOrExternalEnum.EXTERNAL_FIRE +external_water = IfcInternalOrExternalEnum.EXTERNAL_WATER +internal = IfcInternalOrExternalEnum.INTERNAL +notdefined = IfcInternalOrExternalEnum.NOTDEFINED IfcInventoryTypeEnum = enum_namespace() -assetinventory = express_getattr(IfcInventoryTypeEnum, 'ASSETINVENTORY', INDETERMINATE) -furnitureinventory = express_getattr(IfcInventoryTypeEnum, 'FURNITUREINVENTORY', INDETERMINATE) -spaceinventory = express_getattr(IfcInventoryTypeEnum, 'SPACEINVENTORY', INDETERMINATE) -userdefined = express_getattr(IfcInventoryTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcInventoryTypeEnum, 'NOTDEFINED', INDETERMINATE) +assetinventory = IfcInventoryTypeEnum.ASSETINVENTORY +furnitureinventory = IfcInventoryTypeEnum.FURNITUREINVENTORY +spaceinventory = IfcInventoryTypeEnum.SPACEINVENTORY +userdefined = IfcInventoryTypeEnum.USERDEFINED +notdefined = IfcInventoryTypeEnum.NOTDEFINED IfcJunctionBoxTypeEnum = enum_namespace() -data = express_getattr(IfcJunctionBoxTypeEnum, 'DATA', INDETERMINATE) -power = express_getattr(IfcJunctionBoxTypeEnum, 'POWER', INDETERMINATE) -userdefined = express_getattr(IfcJunctionBoxTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcJunctionBoxTypeEnum, 'NOTDEFINED', INDETERMINATE) +data = IfcJunctionBoxTypeEnum.DATA +power = IfcJunctionBoxTypeEnum.POWER +userdefined = IfcJunctionBoxTypeEnum.USERDEFINED +notdefined = IfcJunctionBoxTypeEnum.NOTDEFINED IfcKerbTypeEnum = enum_namespace() -userdefined = express_getattr(IfcKerbTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcKerbTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcKerbTypeEnum.USERDEFINED +notdefined = IfcKerbTypeEnum.NOTDEFINED IfcKnotType = enum_namespace() -piecewise_bezier_knots = express_getattr(IfcKnotType, 'PIECEWISE_BEZIER_KNOTS', INDETERMINATE) -quasi_uniform_knots = express_getattr(IfcKnotType, 'QUASI_UNIFORM_KNOTS', INDETERMINATE) -uniform_knots = express_getattr(IfcKnotType, 'UNIFORM_KNOTS', INDETERMINATE) -unspecified = express_getattr(IfcKnotType, 'UNSPECIFIED', INDETERMINATE) +piecewise_bezier_knots = IfcKnotType.PIECEWISE_BEZIER_KNOTS +quasi_uniform_knots = IfcKnotType.QUASI_UNIFORM_KNOTS +uniform_knots = IfcKnotType.UNIFORM_KNOTS +unspecified = IfcKnotType.UNSPECIFIED IfcLaborResourceTypeEnum = enum_namespace() -administration = express_getattr(IfcLaborResourceTypeEnum, 'ADMINISTRATION', INDETERMINATE) -carpentry = express_getattr(IfcLaborResourceTypeEnum, 'CARPENTRY', INDETERMINATE) -cleaning = express_getattr(IfcLaborResourceTypeEnum, 'CLEANING', INDETERMINATE) -concrete = express_getattr(IfcLaborResourceTypeEnum, 'CONCRETE', INDETERMINATE) -drywall = express_getattr(IfcLaborResourceTypeEnum, 'DRYWALL', INDETERMINATE) -electric = express_getattr(IfcLaborResourceTypeEnum, 'ELECTRIC', INDETERMINATE) -finishing = express_getattr(IfcLaborResourceTypeEnum, 'FINISHING', INDETERMINATE) -flooring = express_getattr(IfcLaborResourceTypeEnum, 'FLOORING', INDETERMINATE) -general = express_getattr(IfcLaborResourceTypeEnum, 'GENERAL', INDETERMINATE) -hvac = express_getattr(IfcLaborResourceTypeEnum, 'HVAC', INDETERMINATE) -landscaping = express_getattr(IfcLaborResourceTypeEnum, 'LANDSCAPING', INDETERMINATE) -masonry = express_getattr(IfcLaborResourceTypeEnum, 'MASONRY', INDETERMINATE) -painting = express_getattr(IfcLaborResourceTypeEnum, 'PAINTING', INDETERMINATE) -paving = express_getattr(IfcLaborResourceTypeEnum, 'PAVING', INDETERMINATE) -plumbing = express_getattr(IfcLaborResourceTypeEnum, 'PLUMBING', INDETERMINATE) -roofing = express_getattr(IfcLaborResourceTypeEnum, 'ROOFING', INDETERMINATE) -sitegrading = express_getattr(IfcLaborResourceTypeEnum, 'SITEGRADING', INDETERMINATE) -steelwork = express_getattr(IfcLaborResourceTypeEnum, 'STEELWORK', INDETERMINATE) -surveying = express_getattr(IfcLaborResourceTypeEnum, 'SURVEYING', INDETERMINATE) -userdefined = express_getattr(IfcLaborResourceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcLaborResourceTypeEnum, 'NOTDEFINED', INDETERMINATE) +administration = IfcLaborResourceTypeEnum.ADMINISTRATION +carpentry = IfcLaborResourceTypeEnum.CARPENTRY +cleaning = IfcLaborResourceTypeEnum.CLEANING +concrete = IfcLaborResourceTypeEnum.CONCRETE +drywall = IfcLaborResourceTypeEnum.DRYWALL +electric = IfcLaborResourceTypeEnum.ELECTRIC +finishing = IfcLaborResourceTypeEnum.FINISHING +flooring = IfcLaborResourceTypeEnum.FLOORING +general = IfcLaborResourceTypeEnum.GENERAL +hvac = IfcLaborResourceTypeEnum.HVAC +landscaping = IfcLaborResourceTypeEnum.LANDSCAPING +masonry = IfcLaborResourceTypeEnum.MASONRY +painting = IfcLaborResourceTypeEnum.PAINTING +paving = IfcLaborResourceTypeEnum.PAVING +plumbing = IfcLaborResourceTypeEnum.PLUMBING +roofing = IfcLaborResourceTypeEnum.ROOFING +sitegrading = IfcLaborResourceTypeEnum.SITEGRADING +steelwork = IfcLaborResourceTypeEnum.STEELWORK +surveying = IfcLaborResourceTypeEnum.SURVEYING +userdefined = IfcLaborResourceTypeEnum.USERDEFINED +notdefined = IfcLaborResourceTypeEnum.NOTDEFINED IfcLampTypeEnum = enum_namespace() -compactfluorescent = express_getattr(IfcLampTypeEnum, 'COMPACTFLUORESCENT', INDETERMINATE) -fluorescent = express_getattr(IfcLampTypeEnum, 'FLUORESCENT', INDETERMINATE) -halogen = express_getattr(IfcLampTypeEnum, 'HALOGEN', INDETERMINATE) -highpressuremercury = express_getattr(IfcLampTypeEnum, 'HIGHPRESSUREMERCURY', INDETERMINATE) -highpressuresodium = express_getattr(IfcLampTypeEnum, 'HIGHPRESSURESODIUM', INDETERMINATE) -led = express_getattr(IfcLampTypeEnum, 'LED', INDETERMINATE) -metalhalide = express_getattr(IfcLampTypeEnum, 'METALHALIDE', INDETERMINATE) -oled = express_getattr(IfcLampTypeEnum, 'OLED', INDETERMINATE) -tungstenfilament = express_getattr(IfcLampTypeEnum, 'TUNGSTENFILAMENT', INDETERMINATE) -userdefined = express_getattr(IfcLampTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcLampTypeEnum, 'NOTDEFINED', INDETERMINATE) +compactfluorescent = IfcLampTypeEnum.COMPACTFLUORESCENT +fluorescent = IfcLampTypeEnum.FLUORESCENT +halogen = IfcLampTypeEnum.HALOGEN +highpressuremercury = IfcLampTypeEnum.HIGHPRESSUREMERCURY +highpressuresodium = IfcLampTypeEnum.HIGHPRESSURESODIUM +led = IfcLampTypeEnum.LED +metalhalide = IfcLampTypeEnum.METALHALIDE +oled = IfcLampTypeEnum.OLED +tungstenfilament = IfcLampTypeEnum.TUNGSTENFILAMENT +userdefined = IfcLampTypeEnum.USERDEFINED +notdefined = IfcLampTypeEnum.NOTDEFINED IfcLayerSetDirectionEnum = enum_namespace() -axis1 = express_getattr(IfcLayerSetDirectionEnum, 'AXIS1', INDETERMINATE) -axis2 = express_getattr(IfcLayerSetDirectionEnum, 'AXIS2', INDETERMINATE) -axis3 = express_getattr(IfcLayerSetDirectionEnum, 'AXIS3', INDETERMINATE) +axis1 = IfcLayerSetDirectionEnum.AXIS1 +axis2 = IfcLayerSetDirectionEnum.AXIS2 +axis3 = IfcLayerSetDirectionEnum.AXIS3 IfcLightDistributionCurveEnum = enum_namespace() -type_a = express_getattr(IfcLightDistributionCurveEnum, 'TYPE_A', INDETERMINATE) -type_b = express_getattr(IfcLightDistributionCurveEnum, 'TYPE_B', INDETERMINATE) -type_c = express_getattr(IfcLightDistributionCurveEnum, 'TYPE_C', INDETERMINATE) -notdefined = express_getattr(IfcLightDistributionCurveEnum, 'NOTDEFINED', INDETERMINATE) +type_a = IfcLightDistributionCurveEnum.TYPE_A +type_b = IfcLightDistributionCurveEnum.TYPE_B +type_c = IfcLightDistributionCurveEnum.TYPE_C +notdefined = IfcLightDistributionCurveEnum.NOTDEFINED IfcLightEmissionSourceEnum = enum_namespace() -compactfluorescent = express_getattr(IfcLightEmissionSourceEnum, 'COMPACTFLUORESCENT', INDETERMINATE) -fluorescent = express_getattr(IfcLightEmissionSourceEnum, 'FLUORESCENT', INDETERMINATE) -highpressuremercury = express_getattr(IfcLightEmissionSourceEnum, 'HIGHPRESSUREMERCURY', INDETERMINATE) -highpressuresodium = express_getattr(IfcLightEmissionSourceEnum, 'HIGHPRESSURESODIUM', INDETERMINATE) -lightemittingdiode = express_getattr(IfcLightEmissionSourceEnum, 'LIGHTEMITTINGDIODE', INDETERMINATE) -lowpressuresodium = express_getattr(IfcLightEmissionSourceEnum, 'LOWPRESSURESODIUM', INDETERMINATE) -lowvoltagehalogen = express_getattr(IfcLightEmissionSourceEnum, 'LOWVOLTAGEHALOGEN', INDETERMINATE) -mainvoltagehalogen = express_getattr(IfcLightEmissionSourceEnum, 'MAINVOLTAGEHALOGEN', INDETERMINATE) -metalhalide = express_getattr(IfcLightEmissionSourceEnum, 'METALHALIDE', INDETERMINATE) -tungstenfilament = express_getattr(IfcLightEmissionSourceEnum, 'TUNGSTENFILAMENT', INDETERMINATE) -notdefined = express_getattr(IfcLightEmissionSourceEnum, 'NOTDEFINED', INDETERMINATE) +compactfluorescent = IfcLightEmissionSourceEnum.COMPACTFLUORESCENT +fluorescent = IfcLightEmissionSourceEnum.FLUORESCENT +highpressuremercury = IfcLightEmissionSourceEnum.HIGHPRESSUREMERCURY +highpressuresodium = IfcLightEmissionSourceEnum.HIGHPRESSURESODIUM +lightemittingdiode = IfcLightEmissionSourceEnum.LIGHTEMITTINGDIODE +lowpressuresodium = IfcLightEmissionSourceEnum.LOWPRESSURESODIUM +lowvoltagehalogen = IfcLightEmissionSourceEnum.LOWVOLTAGEHALOGEN +mainvoltagehalogen = IfcLightEmissionSourceEnum.MAINVOLTAGEHALOGEN +metalhalide = IfcLightEmissionSourceEnum.METALHALIDE +tungstenfilament = IfcLightEmissionSourceEnum.TUNGSTENFILAMENT +notdefined = IfcLightEmissionSourceEnum.NOTDEFINED IfcLightFixtureTypeEnum = enum_namespace() -directionsource = express_getattr(IfcLightFixtureTypeEnum, 'DIRECTIONSOURCE', INDETERMINATE) -pointsource = express_getattr(IfcLightFixtureTypeEnum, 'POINTSOURCE', INDETERMINATE) -securitylighting = express_getattr(IfcLightFixtureTypeEnum, 'SECURITYLIGHTING', INDETERMINATE) -userdefined = express_getattr(IfcLightFixtureTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcLightFixtureTypeEnum, 'NOTDEFINED', INDETERMINATE) +directionsource = IfcLightFixtureTypeEnum.DIRECTIONSOURCE +pointsource = IfcLightFixtureTypeEnum.POINTSOURCE +securitylighting = IfcLightFixtureTypeEnum.SECURITYLIGHTING +userdefined = IfcLightFixtureTypeEnum.USERDEFINED +notdefined = IfcLightFixtureTypeEnum.NOTDEFINED IfcLiquidTerminalTypeEnum = enum_namespace() -hosereel = express_getattr(IfcLiquidTerminalTypeEnum, 'HOSEREEL', INDETERMINATE) -loadingarm = express_getattr(IfcLiquidTerminalTypeEnum, 'LOADINGARM', INDETERMINATE) -userdefined = express_getattr(IfcLiquidTerminalTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcLiquidTerminalTypeEnum, 'NOTDEFINED', INDETERMINATE) +hosereel = IfcLiquidTerminalTypeEnum.HOSEREEL +loadingarm = IfcLiquidTerminalTypeEnum.LOADINGARM +userdefined = IfcLiquidTerminalTypeEnum.USERDEFINED +notdefined = IfcLiquidTerminalTypeEnum.NOTDEFINED IfcLoadGroupTypeEnum = enum_namespace() -load_case = express_getattr(IfcLoadGroupTypeEnum, 'LOAD_CASE', INDETERMINATE) -load_combination = express_getattr(IfcLoadGroupTypeEnum, 'LOAD_COMBINATION', INDETERMINATE) -load_group = express_getattr(IfcLoadGroupTypeEnum, 'LOAD_GROUP', INDETERMINATE) -userdefined = express_getattr(IfcLoadGroupTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcLoadGroupTypeEnum, 'NOTDEFINED', INDETERMINATE) +load_case = IfcLoadGroupTypeEnum.LOAD_CASE +load_combination = IfcLoadGroupTypeEnum.LOAD_COMBINATION +load_group = IfcLoadGroupTypeEnum.LOAD_GROUP +userdefined = IfcLoadGroupTypeEnum.USERDEFINED +notdefined = IfcLoadGroupTypeEnum.NOTDEFINED IfcLogicalOperatorEnum = enum_namespace() -logicaland = express_getattr(IfcLogicalOperatorEnum, 'LOGICALAND', INDETERMINATE) -logicalnotand = express_getattr(IfcLogicalOperatorEnum, 'LOGICALNOTAND', INDETERMINATE) -logicalnotor = express_getattr(IfcLogicalOperatorEnum, 'LOGICALNOTOR', INDETERMINATE) -logicalor = express_getattr(IfcLogicalOperatorEnum, 'LOGICALOR', INDETERMINATE) -logicalxor = express_getattr(IfcLogicalOperatorEnum, 'LOGICALXOR', INDETERMINATE) +logicaland = IfcLogicalOperatorEnum.LOGICALAND +logicalnotand = IfcLogicalOperatorEnum.LOGICALNOTAND +logicalnotor = IfcLogicalOperatorEnum.LOGICALNOTOR +logicalor = IfcLogicalOperatorEnum.LOGICALOR +logicalxor = IfcLogicalOperatorEnum.LOGICALXOR IfcMarineFacilityTypeEnum = enum_namespace() -barrierbeach = express_getattr(IfcMarineFacilityTypeEnum, 'BARRIERBEACH', INDETERMINATE) -breakwater = express_getattr(IfcMarineFacilityTypeEnum, 'BREAKWATER', INDETERMINATE) -canal = express_getattr(IfcMarineFacilityTypeEnum, 'CANAL', INDETERMINATE) -drydock = express_getattr(IfcMarineFacilityTypeEnum, 'DRYDOCK', INDETERMINATE) -floatingdock = express_getattr(IfcMarineFacilityTypeEnum, 'FLOATINGDOCK', INDETERMINATE) -hydrolift = express_getattr(IfcMarineFacilityTypeEnum, 'HYDROLIFT', INDETERMINATE) -jetty = express_getattr(IfcMarineFacilityTypeEnum, 'JETTY', INDETERMINATE) -launchrecovery = express_getattr(IfcMarineFacilityTypeEnum, 'LAUNCHRECOVERY', INDETERMINATE) -marinedefence = express_getattr(IfcMarineFacilityTypeEnum, 'MARINEDEFENCE', INDETERMINATE) -navigationalchannel = express_getattr(IfcMarineFacilityTypeEnum, 'NAVIGATIONALCHANNEL', INDETERMINATE) -port = express_getattr(IfcMarineFacilityTypeEnum, 'PORT', INDETERMINATE) -quay = express_getattr(IfcMarineFacilityTypeEnum, 'QUAY', INDETERMINATE) -revetment = express_getattr(IfcMarineFacilityTypeEnum, 'REVETMENT', INDETERMINATE) -shiplift = express_getattr(IfcMarineFacilityTypeEnum, 'SHIPLIFT', INDETERMINATE) -shiplock = express_getattr(IfcMarineFacilityTypeEnum, 'SHIPLOCK', INDETERMINATE) -shipyard = express_getattr(IfcMarineFacilityTypeEnum, 'SHIPYARD', INDETERMINATE) -slipway = express_getattr(IfcMarineFacilityTypeEnum, 'SLIPWAY', INDETERMINATE) -waterway = express_getattr(IfcMarineFacilityTypeEnum, 'WATERWAY', INDETERMINATE) -waterwayshiplift = express_getattr(IfcMarineFacilityTypeEnum, 'WATERWAYSHIPLIFT', INDETERMINATE) -userdefined = express_getattr(IfcMarineFacilityTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcMarineFacilityTypeEnum, 'NOTDEFINED', INDETERMINATE) +barrierbeach = IfcMarineFacilityTypeEnum.BARRIERBEACH +breakwater = IfcMarineFacilityTypeEnum.BREAKWATER +canal = IfcMarineFacilityTypeEnum.CANAL +drydock = IfcMarineFacilityTypeEnum.DRYDOCK +floatingdock = IfcMarineFacilityTypeEnum.FLOATINGDOCK +hydrolift = IfcMarineFacilityTypeEnum.HYDROLIFT +jetty = IfcMarineFacilityTypeEnum.JETTY +launchrecovery = IfcMarineFacilityTypeEnum.LAUNCHRECOVERY +marinedefence = IfcMarineFacilityTypeEnum.MARINEDEFENCE +navigationalchannel = IfcMarineFacilityTypeEnum.NAVIGATIONALCHANNEL +port = IfcMarineFacilityTypeEnum.PORT +quay = IfcMarineFacilityTypeEnum.QUAY +revetment = IfcMarineFacilityTypeEnum.REVETMENT +shiplift = IfcMarineFacilityTypeEnum.SHIPLIFT +shiplock = IfcMarineFacilityTypeEnum.SHIPLOCK +shipyard = IfcMarineFacilityTypeEnum.SHIPYARD +slipway = IfcMarineFacilityTypeEnum.SLIPWAY +waterway = IfcMarineFacilityTypeEnum.WATERWAY +waterwayshiplift = IfcMarineFacilityTypeEnum.WATERWAYSHIPLIFT +userdefined = IfcMarineFacilityTypeEnum.USERDEFINED +notdefined = IfcMarineFacilityTypeEnum.NOTDEFINED IfcMarinePartTypeEnum = enum_namespace() -abovewaterline = express_getattr(IfcMarinePartTypeEnum, 'ABOVEWATERLINE', INDETERMINATE) -anchorage = express_getattr(IfcMarinePartTypeEnum, 'ANCHORAGE', INDETERMINATE) -approachchannel = express_getattr(IfcMarinePartTypeEnum, 'APPROACHCHANNEL', INDETERMINATE) -belowwaterline = express_getattr(IfcMarinePartTypeEnum, 'BELOWWATERLINE', INDETERMINATE) -berthingstructure = express_getattr(IfcMarinePartTypeEnum, 'BERTHINGSTRUCTURE', INDETERMINATE) -chamber = express_getattr(IfcMarinePartTypeEnum, 'CHAMBER', INDETERMINATE) -cill_level = express_getattr(IfcMarinePartTypeEnum, 'CILL_LEVEL', INDETERMINATE) -copelevel = express_getattr(IfcMarinePartTypeEnum, 'COPELEVEL', INDETERMINATE) -core = express_getattr(IfcMarinePartTypeEnum, 'CORE', INDETERMINATE) -crest = express_getattr(IfcMarinePartTypeEnum, 'CREST', INDETERMINATE) -gatehead = express_getattr(IfcMarinePartTypeEnum, 'GATEHEAD', INDETERMINATE) -gudingstructure = express_getattr(IfcMarinePartTypeEnum, 'GUDINGSTRUCTURE', INDETERMINATE) -highwaterline = express_getattr(IfcMarinePartTypeEnum, 'HIGHWATERLINE', INDETERMINATE) -landfield = express_getattr(IfcMarinePartTypeEnum, 'LANDFIELD', INDETERMINATE) -leewardside = express_getattr(IfcMarinePartTypeEnum, 'LEEWARDSIDE', INDETERMINATE) -lowwaterline = express_getattr(IfcMarinePartTypeEnum, 'LOWWATERLINE', INDETERMINATE) -manufacturing = express_getattr(IfcMarinePartTypeEnum, 'MANUFACTURING', INDETERMINATE) -navigationalarea = express_getattr(IfcMarinePartTypeEnum, 'NAVIGATIONALAREA', INDETERMINATE) -protection = express_getattr(IfcMarinePartTypeEnum, 'PROTECTION', INDETERMINATE) -shiptransfer = express_getattr(IfcMarinePartTypeEnum, 'SHIPTRANSFER', INDETERMINATE) -storagearea = express_getattr(IfcMarinePartTypeEnum, 'STORAGEAREA', INDETERMINATE) -vehicleservicing = express_getattr(IfcMarinePartTypeEnum, 'VEHICLESERVICING', INDETERMINATE) -waterfield = express_getattr(IfcMarinePartTypeEnum, 'WATERFIELD', INDETERMINATE) -weatherside = express_getattr(IfcMarinePartTypeEnum, 'WEATHERSIDE', INDETERMINATE) -userdefined = express_getattr(IfcMarinePartTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcMarinePartTypeEnum, 'NOTDEFINED', INDETERMINATE) +abovewaterline = IfcMarinePartTypeEnum.ABOVEWATERLINE +anchorage = IfcMarinePartTypeEnum.ANCHORAGE +approachchannel = IfcMarinePartTypeEnum.APPROACHCHANNEL +belowwaterline = IfcMarinePartTypeEnum.BELOWWATERLINE +berthingstructure = IfcMarinePartTypeEnum.BERTHINGSTRUCTURE +chamber = IfcMarinePartTypeEnum.CHAMBER +cill_level = IfcMarinePartTypeEnum.CILL_LEVEL +copelevel = IfcMarinePartTypeEnum.COPELEVEL +core = IfcMarinePartTypeEnum.CORE +crest = IfcMarinePartTypeEnum.CREST +gatehead = IfcMarinePartTypeEnum.GATEHEAD +gudingstructure = IfcMarinePartTypeEnum.GUDINGSTRUCTURE +highwaterline = IfcMarinePartTypeEnum.HIGHWATERLINE +landfield = IfcMarinePartTypeEnum.LANDFIELD +leewardside = IfcMarinePartTypeEnum.LEEWARDSIDE +lowwaterline = IfcMarinePartTypeEnum.LOWWATERLINE +manufacturing = IfcMarinePartTypeEnum.MANUFACTURING +navigationalarea = IfcMarinePartTypeEnum.NAVIGATIONALAREA +protection = IfcMarinePartTypeEnum.PROTECTION +shiptransfer = IfcMarinePartTypeEnum.SHIPTRANSFER +storagearea = IfcMarinePartTypeEnum.STORAGEAREA +vehicleservicing = IfcMarinePartTypeEnum.VEHICLESERVICING +waterfield = IfcMarinePartTypeEnum.WATERFIELD +weatherside = IfcMarinePartTypeEnum.WEATHERSIDE +userdefined = IfcMarinePartTypeEnum.USERDEFINED +notdefined = IfcMarinePartTypeEnum.NOTDEFINED IfcMechanicalFastenerTypeEnum = enum_namespace() -anchorbolt = express_getattr(IfcMechanicalFastenerTypeEnum, 'ANCHORBOLT', INDETERMINATE) -bolt = express_getattr(IfcMechanicalFastenerTypeEnum, 'BOLT', INDETERMINATE) -chain = express_getattr(IfcMechanicalFastenerTypeEnum, 'CHAIN', INDETERMINATE) -coupler = express_getattr(IfcMechanicalFastenerTypeEnum, 'COUPLER', INDETERMINATE) -dowel = express_getattr(IfcMechanicalFastenerTypeEnum, 'DOWEL', INDETERMINATE) -nail = express_getattr(IfcMechanicalFastenerTypeEnum, 'NAIL', INDETERMINATE) -nailplate = express_getattr(IfcMechanicalFastenerTypeEnum, 'NAILPLATE', INDETERMINATE) -railfastening = express_getattr(IfcMechanicalFastenerTypeEnum, 'RAILFASTENING', INDETERMINATE) -railjoint = express_getattr(IfcMechanicalFastenerTypeEnum, 'RAILJOINT', INDETERMINATE) -rivet = express_getattr(IfcMechanicalFastenerTypeEnum, 'RIVET', INDETERMINATE) -rope = express_getattr(IfcMechanicalFastenerTypeEnum, 'ROPE', INDETERMINATE) -screw = express_getattr(IfcMechanicalFastenerTypeEnum, 'SCREW', INDETERMINATE) -shearconnector = express_getattr(IfcMechanicalFastenerTypeEnum, 'SHEARCONNECTOR', INDETERMINATE) -staple = express_getattr(IfcMechanicalFastenerTypeEnum, 'STAPLE', INDETERMINATE) -studshearconnector = express_getattr(IfcMechanicalFastenerTypeEnum, 'STUDSHEARCONNECTOR', INDETERMINATE) -userdefined = express_getattr(IfcMechanicalFastenerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcMechanicalFastenerTypeEnum, 'NOTDEFINED', INDETERMINATE) +anchorbolt = IfcMechanicalFastenerTypeEnum.ANCHORBOLT +bolt = IfcMechanicalFastenerTypeEnum.BOLT +chain = IfcMechanicalFastenerTypeEnum.CHAIN +coupler = IfcMechanicalFastenerTypeEnum.COUPLER +dowel = IfcMechanicalFastenerTypeEnum.DOWEL +nail = IfcMechanicalFastenerTypeEnum.NAIL +nailplate = IfcMechanicalFastenerTypeEnum.NAILPLATE +railfastening = IfcMechanicalFastenerTypeEnum.RAILFASTENING +railjoint = IfcMechanicalFastenerTypeEnum.RAILJOINT +rivet = IfcMechanicalFastenerTypeEnum.RIVET +rope = IfcMechanicalFastenerTypeEnum.ROPE +screw = IfcMechanicalFastenerTypeEnum.SCREW +shearconnector = IfcMechanicalFastenerTypeEnum.SHEARCONNECTOR +staple = IfcMechanicalFastenerTypeEnum.STAPLE +studshearconnector = IfcMechanicalFastenerTypeEnum.STUDSHEARCONNECTOR +userdefined = IfcMechanicalFastenerTypeEnum.USERDEFINED +notdefined = IfcMechanicalFastenerTypeEnum.NOTDEFINED IfcMedicalDeviceTypeEnum = enum_namespace() -airstation = express_getattr(IfcMedicalDeviceTypeEnum, 'AIRSTATION', INDETERMINATE) -feedairunit = express_getattr(IfcMedicalDeviceTypeEnum, 'FEEDAIRUNIT', INDETERMINATE) -oxygengenerator = express_getattr(IfcMedicalDeviceTypeEnum, 'OXYGENGENERATOR', INDETERMINATE) -oxygenplant = express_getattr(IfcMedicalDeviceTypeEnum, 'OXYGENPLANT', INDETERMINATE) -vacuumstation = express_getattr(IfcMedicalDeviceTypeEnum, 'VACUUMSTATION', INDETERMINATE) -userdefined = express_getattr(IfcMedicalDeviceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcMedicalDeviceTypeEnum, 'NOTDEFINED', INDETERMINATE) +airstation = IfcMedicalDeviceTypeEnum.AIRSTATION +feedairunit = IfcMedicalDeviceTypeEnum.FEEDAIRUNIT +oxygengenerator = IfcMedicalDeviceTypeEnum.OXYGENGENERATOR +oxygenplant = IfcMedicalDeviceTypeEnum.OXYGENPLANT +vacuumstation = IfcMedicalDeviceTypeEnum.VACUUMSTATION +userdefined = IfcMedicalDeviceTypeEnum.USERDEFINED +notdefined = IfcMedicalDeviceTypeEnum.NOTDEFINED IfcMemberTypeEnum = enum_namespace() -arch_segment = express_getattr(IfcMemberTypeEnum, 'ARCH_SEGMENT', INDETERMINATE) -brace = express_getattr(IfcMemberTypeEnum, 'BRACE', INDETERMINATE) -chord = express_getattr(IfcMemberTypeEnum, 'CHORD', INDETERMINATE) -collar = express_getattr(IfcMemberTypeEnum, 'COLLAR', INDETERMINATE) -member = express_getattr(IfcMemberTypeEnum, 'MEMBER', INDETERMINATE) -mullion = express_getattr(IfcMemberTypeEnum, 'MULLION', INDETERMINATE) -plate = express_getattr(IfcMemberTypeEnum, 'PLATE', INDETERMINATE) -post = express_getattr(IfcMemberTypeEnum, 'POST', INDETERMINATE) -purlin = express_getattr(IfcMemberTypeEnum, 'PURLIN', INDETERMINATE) -rafter = express_getattr(IfcMemberTypeEnum, 'RAFTER', INDETERMINATE) -stay_cable = express_getattr(IfcMemberTypeEnum, 'STAY_CABLE', INDETERMINATE) -stiffening_rib = express_getattr(IfcMemberTypeEnum, 'STIFFENING_RIB', INDETERMINATE) -stringer = express_getattr(IfcMemberTypeEnum, 'STRINGER', INDETERMINATE) -structuralcable = express_getattr(IfcMemberTypeEnum, 'STRUCTURALCABLE', INDETERMINATE) -strut = express_getattr(IfcMemberTypeEnum, 'STRUT', INDETERMINATE) -stud = express_getattr(IfcMemberTypeEnum, 'STUD', INDETERMINATE) -suspender = express_getattr(IfcMemberTypeEnum, 'SUSPENDER', INDETERMINATE) -suspension_cable = express_getattr(IfcMemberTypeEnum, 'SUSPENSION_CABLE', INDETERMINATE) -tiebar = express_getattr(IfcMemberTypeEnum, 'TIEBAR', INDETERMINATE) -userdefined = express_getattr(IfcMemberTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcMemberTypeEnum, 'NOTDEFINED', INDETERMINATE) +arch_segment = IfcMemberTypeEnum.ARCH_SEGMENT +brace = IfcMemberTypeEnum.BRACE +chord = IfcMemberTypeEnum.CHORD +collar = IfcMemberTypeEnum.COLLAR +member = IfcMemberTypeEnum.MEMBER +mullion = IfcMemberTypeEnum.MULLION +plate = IfcMemberTypeEnum.PLATE +post = IfcMemberTypeEnum.POST +purlin = IfcMemberTypeEnum.PURLIN +rafter = IfcMemberTypeEnum.RAFTER +stay_cable = IfcMemberTypeEnum.STAY_CABLE +stiffening_rib = IfcMemberTypeEnum.STIFFENING_RIB +stringer = IfcMemberTypeEnum.STRINGER +structuralcable = IfcMemberTypeEnum.STRUCTURALCABLE +strut = IfcMemberTypeEnum.STRUT +stud = IfcMemberTypeEnum.STUD +suspender = IfcMemberTypeEnum.SUSPENDER +suspension_cable = IfcMemberTypeEnum.SUSPENSION_CABLE +tiebar = IfcMemberTypeEnum.TIEBAR +userdefined = IfcMemberTypeEnum.USERDEFINED +notdefined = IfcMemberTypeEnum.NOTDEFINED IfcMobileTelecommunicationsApplianceTypeEnum = enum_namespace() -accesspoint = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'ACCESSPOINT', INDETERMINATE) -basebandunit = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'BASEBANDUNIT', INDETERMINATE) -basetransceiverstation = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'BASETRANSCEIVERSTATION', INDETERMINATE) -e_utran_node_b = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'E_UTRAN_NODE_B', INDETERMINATE) -gateway_gprs_support_node = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'GATEWAY_GPRS_SUPPORT_NODE', INDETERMINATE) -masterunit = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'MASTERUNIT', INDETERMINATE) -mobileswitchingcenter = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'MOBILESWITCHINGCENTER', INDETERMINATE) -mscserver = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'MSCSERVER', INDETERMINATE) -packetcontrolunit = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'PACKETCONTROLUNIT', INDETERMINATE) -remoteradiounit = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'REMOTERADIOUNIT', INDETERMINATE) -remoteunit = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'REMOTEUNIT', INDETERMINATE) -service_gprs_support_node = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'SERVICE_GPRS_SUPPORT_NODE', INDETERMINATE) -subscriberserver = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'SUBSCRIBERSERVER', INDETERMINATE) -userdefined = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcMobileTelecommunicationsApplianceTypeEnum, 'NOTDEFINED', INDETERMINATE) +accesspoint = IfcMobileTelecommunicationsApplianceTypeEnum.ACCESSPOINT +basebandunit = IfcMobileTelecommunicationsApplianceTypeEnum.BASEBANDUNIT +basetransceiverstation = IfcMobileTelecommunicationsApplianceTypeEnum.BASETRANSCEIVERSTATION +e_utran_node_b = IfcMobileTelecommunicationsApplianceTypeEnum.E_UTRAN_NODE_B +gateway_gprs_support_node = IfcMobileTelecommunicationsApplianceTypeEnum.GATEWAY_GPRS_SUPPORT_NODE +masterunit = IfcMobileTelecommunicationsApplianceTypeEnum.MASTERUNIT +mobileswitchingcenter = IfcMobileTelecommunicationsApplianceTypeEnum.MOBILESWITCHINGCENTER +mscserver = IfcMobileTelecommunicationsApplianceTypeEnum.MSCSERVER +packetcontrolunit = IfcMobileTelecommunicationsApplianceTypeEnum.PACKETCONTROLUNIT +remoteradiounit = IfcMobileTelecommunicationsApplianceTypeEnum.REMOTERADIOUNIT +remoteunit = IfcMobileTelecommunicationsApplianceTypeEnum.REMOTEUNIT +service_gprs_support_node = IfcMobileTelecommunicationsApplianceTypeEnum.SERVICE_GPRS_SUPPORT_NODE +subscriberserver = IfcMobileTelecommunicationsApplianceTypeEnum.SUBSCRIBERSERVER +userdefined = IfcMobileTelecommunicationsApplianceTypeEnum.USERDEFINED +notdefined = IfcMobileTelecommunicationsApplianceTypeEnum.NOTDEFINED IfcMooringDeviceTypeEnum = enum_namespace() -bollard = express_getattr(IfcMooringDeviceTypeEnum, 'BOLLARD', INDETERMINATE) -linetensioner = express_getattr(IfcMooringDeviceTypeEnum, 'LINETENSIONER', INDETERMINATE) -magneticdevice = express_getattr(IfcMooringDeviceTypeEnum, 'MAGNETICDEVICE', INDETERMINATE) -mooringhooks = express_getattr(IfcMooringDeviceTypeEnum, 'MOORINGHOOKS', INDETERMINATE) -vacuumdevice = express_getattr(IfcMooringDeviceTypeEnum, 'VACUUMDEVICE', INDETERMINATE) -userdefined = express_getattr(IfcMooringDeviceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcMooringDeviceTypeEnum, 'NOTDEFINED', INDETERMINATE) +bollard = IfcMooringDeviceTypeEnum.BOLLARD +linetensioner = IfcMooringDeviceTypeEnum.LINETENSIONER +magneticdevice = IfcMooringDeviceTypeEnum.MAGNETICDEVICE +mooringhooks = IfcMooringDeviceTypeEnum.MOORINGHOOKS +vacuumdevice = IfcMooringDeviceTypeEnum.VACUUMDEVICE +userdefined = IfcMooringDeviceTypeEnum.USERDEFINED +notdefined = IfcMooringDeviceTypeEnum.NOTDEFINED IfcMotorConnectionTypeEnum = enum_namespace() -beltdrive = express_getattr(IfcMotorConnectionTypeEnum, 'BELTDRIVE', INDETERMINATE) -coupling = express_getattr(IfcMotorConnectionTypeEnum, 'COUPLING', INDETERMINATE) -directdrive = express_getattr(IfcMotorConnectionTypeEnum, 'DIRECTDRIVE', INDETERMINATE) -userdefined = express_getattr(IfcMotorConnectionTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcMotorConnectionTypeEnum, 'NOTDEFINED', INDETERMINATE) +beltdrive = IfcMotorConnectionTypeEnum.BELTDRIVE +coupling = IfcMotorConnectionTypeEnum.COUPLING +directdrive = IfcMotorConnectionTypeEnum.DIRECTDRIVE +userdefined = IfcMotorConnectionTypeEnum.USERDEFINED +notdefined = IfcMotorConnectionTypeEnum.NOTDEFINED IfcNavigationElementTypeEnum = enum_namespace() -beacon = express_getattr(IfcNavigationElementTypeEnum, 'BEACON', INDETERMINATE) -buoy = express_getattr(IfcNavigationElementTypeEnum, 'BUOY', INDETERMINATE) -userdefined = express_getattr(IfcNavigationElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcNavigationElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +beacon = IfcNavigationElementTypeEnum.BEACON +buoy = IfcNavigationElementTypeEnum.BUOY +userdefined = IfcNavigationElementTypeEnum.USERDEFINED +notdefined = IfcNavigationElementTypeEnum.NOTDEFINED IfcObjectiveEnum = enum_namespace() -codecompliance = express_getattr(IfcObjectiveEnum, 'CODECOMPLIANCE', INDETERMINATE) -codewaiver = express_getattr(IfcObjectiveEnum, 'CODEWAIVER', INDETERMINATE) -designintent = express_getattr(IfcObjectiveEnum, 'DESIGNINTENT', INDETERMINATE) -external = express_getattr(IfcObjectiveEnum, 'EXTERNAL', INDETERMINATE) -healthandsafety = express_getattr(IfcObjectiveEnum, 'HEALTHANDSAFETY', INDETERMINATE) -mergeconflict = express_getattr(IfcObjectiveEnum, 'MERGECONFLICT', INDETERMINATE) -modelview = express_getattr(IfcObjectiveEnum, 'MODELVIEW', INDETERMINATE) -parameter = express_getattr(IfcObjectiveEnum, 'PARAMETER', INDETERMINATE) -requirement = express_getattr(IfcObjectiveEnum, 'REQUIREMENT', INDETERMINATE) -specification = express_getattr(IfcObjectiveEnum, 'SPECIFICATION', INDETERMINATE) -triggercondition = express_getattr(IfcObjectiveEnum, 'TRIGGERCONDITION', INDETERMINATE) -userdefined = express_getattr(IfcObjectiveEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcObjectiveEnum, 'NOTDEFINED', INDETERMINATE) +codecompliance = IfcObjectiveEnum.CODECOMPLIANCE +codewaiver = IfcObjectiveEnum.CODEWAIVER +designintent = IfcObjectiveEnum.DESIGNINTENT +external = IfcObjectiveEnum.EXTERNAL +healthandsafety = IfcObjectiveEnum.HEALTHANDSAFETY +mergeconflict = IfcObjectiveEnum.MERGECONFLICT +modelview = IfcObjectiveEnum.MODELVIEW +parameter = IfcObjectiveEnum.PARAMETER +requirement = IfcObjectiveEnum.REQUIREMENT +specification = IfcObjectiveEnum.SPECIFICATION +triggercondition = IfcObjectiveEnum.TRIGGERCONDITION +userdefined = IfcObjectiveEnum.USERDEFINED +notdefined = IfcObjectiveEnum.NOTDEFINED IfcOccupantTypeEnum = enum_namespace() -assignee = express_getattr(IfcOccupantTypeEnum, 'ASSIGNEE', INDETERMINATE) -assignor = express_getattr(IfcOccupantTypeEnum, 'ASSIGNOR', INDETERMINATE) -lessee = express_getattr(IfcOccupantTypeEnum, 'LESSEE', INDETERMINATE) -lessor = express_getattr(IfcOccupantTypeEnum, 'LESSOR', INDETERMINATE) -lettingagent = express_getattr(IfcOccupantTypeEnum, 'LETTINGAGENT', INDETERMINATE) -owner = express_getattr(IfcOccupantTypeEnum, 'OWNER', INDETERMINATE) -tenant = express_getattr(IfcOccupantTypeEnum, 'TENANT', INDETERMINATE) -userdefined = express_getattr(IfcOccupantTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcOccupantTypeEnum, 'NOTDEFINED', INDETERMINATE) +assignee = IfcOccupantTypeEnum.ASSIGNEE +assignor = IfcOccupantTypeEnum.ASSIGNOR +lessee = IfcOccupantTypeEnum.LESSEE +lessor = IfcOccupantTypeEnum.LESSOR +lettingagent = IfcOccupantTypeEnum.LETTINGAGENT +owner = IfcOccupantTypeEnum.OWNER +tenant = IfcOccupantTypeEnum.TENANT +userdefined = IfcOccupantTypeEnum.USERDEFINED +notdefined = IfcOccupantTypeEnum.NOTDEFINED IfcOpeningElementTypeEnum = enum_namespace() -opening = express_getattr(IfcOpeningElementTypeEnum, 'OPENING', INDETERMINATE) -recess = express_getattr(IfcOpeningElementTypeEnum, 'RECESS', INDETERMINATE) -userdefined = express_getattr(IfcOpeningElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcOpeningElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +opening = IfcOpeningElementTypeEnum.OPENING +recess = IfcOpeningElementTypeEnum.RECESS +userdefined = IfcOpeningElementTypeEnum.USERDEFINED +notdefined = IfcOpeningElementTypeEnum.NOTDEFINED IfcOutletTypeEnum = enum_namespace() -audiovisualoutlet = express_getattr(IfcOutletTypeEnum, 'AUDIOVISUALOUTLET', INDETERMINATE) -communicationsoutlet = express_getattr(IfcOutletTypeEnum, 'COMMUNICATIONSOUTLET', INDETERMINATE) -dataoutlet = express_getattr(IfcOutletTypeEnum, 'DATAOUTLET', INDETERMINATE) -poweroutlet = express_getattr(IfcOutletTypeEnum, 'POWEROUTLET', INDETERMINATE) -telephoneoutlet = express_getattr(IfcOutletTypeEnum, 'TELEPHONEOUTLET', INDETERMINATE) -userdefined = express_getattr(IfcOutletTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcOutletTypeEnum, 'NOTDEFINED', INDETERMINATE) +audiovisualoutlet = IfcOutletTypeEnum.AUDIOVISUALOUTLET +communicationsoutlet = IfcOutletTypeEnum.COMMUNICATIONSOUTLET +dataoutlet = IfcOutletTypeEnum.DATAOUTLET +poweroutlet = IfcOutletTypeEnum.POWEROUTLET +telephoneoutlet = IfcOutletTypeEnum.TELEPHONEOUTLET +userdefined = IfcOutletTypeEnum.USERDEFINED +notdefined = IfcOutletTypeEnum.NOTDEFINED IfcPavementTypeEnum = enum_namespace() -flexible = express_getattr(IfcPavementTypeEnum, 'FLEXIBLE', INDETERMINATE) -rigid = express_getattr(IfcPavementTypeEnum, 'RIGID', INDETERMINATE) -userdefined = express_getattr(IfcPavementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPavementTypeEnum, 'NOTDEFINED', INDETERMINATE) +flexible = IfcPavementTypeEnum.FLEXIBLE +rigid = IfcPavementTypeEnum.RIGID +userdefined = IfcPavementTypeEnum.USERDEFINED +notdefined = IfcPavementTypeEnum.NOTDEFINED IfcPerformanceHistoryTypeEnum = enum_namespace() -userdefined = express_getattr(IfcPerformanceHistoryTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPerformanceHistoryTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcPerformanceHistoryTypeEnum.USERDEFINED +notdefined = IfcPerformanceHistoryTypeEnum.NOTDEFINED IfcPermeableCoveringOperationEnum = enum_namespace() -grill = express_getattr(IfcPermeableCoveringOperationEnum, 'GRILL', INDETERMINATE) -louver = express_getattr(IfcPermeableCoveringOperationEnum, 'LOUVER', INDETERMINATE) -screen = express_getattr(IfcPermeableCoveringOperationEnum, 'SCREEN', INDETERMINATE) -userdefined = express_getattr(IfcPermeableCoveringOperationEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPermeableCoveringOperationEnum, 'NOTDEFINED', INDETERMINATE) +grill = IfcPermeableCoveringOperationEnum.GRILL +louver = IfcPermeableCoveringOperationEnum.LOUVER +screen = IfcPermeableCoveringOperationEnum.SCREEN +userdefined = IfcPermeableCoveringOperationEnum.USERDEFINED +notdefined = IfcPermeableCoveringOperationEnum.NOTDEFINED IfcPermitTypeEnum = enum_namespace() -access = express_getattr(IfcPermitTypeEnum, 'ACCESS', INDETERMINATE) -building = express_getattr(IfcPermitTypeEnum, 'BUILDING', INDETERMINATE) -work = express_getattr(IfcPermitTypeEnum, 'WORK', INDETERMINATE) -userdefined = express_getattr(IfcPermitTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPermitTypeEnum, 'NOTDEFINED', INDETERMINATE) +access = IfcPermitTypeEnum.ACCESS +building = IfcPermitTypeEnum.BUILDING +work = IfcPermitTypeEnum.WORK +userdefined = IfcPermitTypeEnum.USERDEFINED +notdefined = IfcPermitTypeEnum.NOTDEFINED IfcPhysicalOrVirtualEnum = enum_namespace() -physical = express_getattr(IfcPhysicalOrVirtualEnum, 'PHYSICAL', INDETERMINATE) -virtual = express_getattr(IfcPhysicalOrVirtualEnum, 'VIRTUAL', INDETERMINATE) -notdefined = express_getattr(IfcPhysicalOrVirtualEnum, 'NOTDEFINED', INDETERMINATE) +physical = IfcPhysicalOrVirtualEnum.PHYSICAL +virtual = IfcPhysicalOrVirtualEnum.VIRTUAL +notdefined = IfcPhysicalOrVirtualEnum.NOTDEFINED IfcPileConstructionEnum = enum_namespace() -cast_in_place = express_getattr(IfcPileConstructionEnum, 'CAST_IN_PLACE', INDETERMINATE) -composite = express_getattr(IfcPileConstructionEnum, 'COMPOSITE', INDETERMINATE) -precast_concrete = express_getattr(IfcPileConstructionEnum, 'PRECAST_CONCRETE', INDETERMINATE) -prefab_steel = express_getattr(IfcPileConstructionEnum, 'PREFAB_STEEL', INDETERMINATE) -userdefined = express_getattr(IfcPileConstructionEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPileConstructionEnum, 'NOTDEFINED', INDETERMINATE) +cast_in_place = IfcPileConstructionEnum.CAST_IN_PLACE +composite = IfcPileConstructionEnum.COMPOSITE +precast_concrete = IfcPileConstructionEnum.PRECAST_CONCRETE +prefab_steel = IfcPileConstructionEnum.PREFAB_STEEL +userdefined = IfcPileConstructionEnum.USERDEFINED +notdefined = IfcPileConstructionEnum.NOTDEFINED IfcPileTypeEnum = enum_namespace() -bored = express_getattr(IfcPileTypeEnum, 'BORED', INDETERMINATE) -cohesion = express_getattr(IfcPileTypeEnum, 'COHESION', INDETERMINATE) -driven = express_getattr(IfcPileTypeEnum, 'DRIVEN', INDETERMINATE) -friction = express_getattr(IfcPileTypeEnum, 'FRICTION', INDETERMINATE) -jetgrouting = express_getattr(IfcPileTypeEnum, 'JETGROUTING', INDETERMINATE) -support = express_getattr(IfcPileTypeEnum, 'SUPPORT', INDETERMINATE) -userdefined = express_getattr(IfcPileTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPileTypeEnum, 'NOTDEFINED', INDETERMINATE) +bored = IfcPileTypeEnum.BORED +cohesion = IfcPileTypeEnum.COHESION +driven = IfcPileTypeEnum.DRIVEN +friction = IfcPileTypeEnum.FRICTION +jetgrouting = IfcPileTypeEnum.JETGROUTING +support = IfcPileTypeEnum.SUPPORT +userdefined = IfcPileTypeEnum.USERDEFINED +notdefined = IfcPileTypeEnum.NOTDEFINED IfcPipeFittingTypeEnum = enum_namespace() -bend = express_getattr(IfcPipeFittingTypeEnum, 'BEND', INDETERMINATE) -connector = express_getattr(IfcPipeFittingTypeEnum, 'CONNECTOR', INDETERMINATE) -entry = express_getattr(IfcPipeFittingTypeEnum, 'ENTRY', INDETERMINATE) -exit = express_getattr(IfcPipeFittingTypeEnum, 'EXIT', INDETERMINATE) -junction = express_getattr(IfcPipeFittingTypeEnum, 'JUNCTION', INDETERMINATE) -obstruction = express_getattr(IfcPipeFittingTypeEnum, 'OBSTRUCTION', INDETERMINATE) -transition = express_getattr(IfcPipeFittingTypeEnum, 'TRANSITION', INDETERMINATE) -userdefined = express_getattr(IfcPipeFittingTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPipeFittingTypeEnum, 'NOTDEFINED', INDETERMINATE) +bend = IfcPipeFittingTypeEnum.BEND +connector = IfcPipeFittingTypeEnum.CONNECTOR +entry = IfcPipeFittingTypeEnum.ENTRY +exit = IfcPipeFittingTypeEnum.EXIT +junction = IfcPipeFittingTypeEnum.JUNCTION +obstruction = IfcPipeFittingTypeEnum.OBSTRUCTION +transition = IfcPipeFittingTypeEnum.TRANSITION +userdefined = IfcPipeFittingTypeEnum.USERDEFINED +notdefined = IfcPipeFittingTypeEnum.NOTDEFINED IfcPipeSegmentTypeEnum = enum_namespace() -culvert = express_getattr(IfcPipeSegmentTypeEnum, 'CULVERT', INDETERMINATE) -flexiblesegment = express_getattr(IfcPipeSegmentTypeEnum, 'FLEXIBLESEGMENT', INDETERMINATE) -gutter = express_getattr(IfcPipeSegmentTypeEnum, 'GUTTER', INDETERMINATE) -rigidsegment = express_getattr(IfcPipeSegmentTypeEnum, 'RIGIDSEGMENT', INDETERMINATE) -spool = express_getattr(IfcPipeSegmentTypeEnum, 'SPOOL', INDETERMINATE) -userdefined = express_getattr(IfcPipeSegmentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPipeSegmentTypeEnum, 'NOTDEFINED', INDETERMINATE) +culvert = IfcPipeSegmentTypeEnum.CULVERT +flexiblesegment = IfcPipeSegmentTypeEnum.FLEXIBLESEGMENT +gutter = IfcPipeSegmentTypeEnum.GUTTER +rigidsegment = IfcPipeSegmentTypeEnum.RIGIDSEGMENT +spool = IfcPipeSegmentTypeEnum.SPOOL +userdefined = IfcPipeSegmentTypeEnum.USERDEFINED +notdefined = IfcPipeSegmentTypeEnum.NOTDEFINED IfcPlateTypeEnum = enum_namespace() -base_plate = express_getattr(IfcPlateTypeEnum, 'BASE_PLATE', INDETERMINATE) -cover_plate = express_getattr(IfcPlateTypeEnum, 'COVER_PLATE', INDETERMINATE) -curtain_panel = express_getattr(IfcPlateTypeEnum, 'CURTAIN_PANEL', INDETERMINATE) -flange_plate = express_getattr(IfcPlateTypeEnum, 'FLANGE_PLATE', INDETERMINATE) -gusset_plate = express_getattr(IfcPlateTypeEnum, 'GUSSET_PLATE', INDETERMINATE) -sheet = express_getattr(IfcPlateTypeEnum, 'SHEET', INDETERMINATE) -splice_plate = express_getattr(IfcPlateTypeEnum, 'SPLICE_PLATE', INDETERMINATE) -stiffener_plate = express_getattr(IfcPlateTypeEnum, 'STIFFENER_PLATE', INDETERMINATE) -web_plate = express_getattr(IfcPlateTypeEnum, 'WEB_PLATE', INDETERMINATE) -userdefined = express_getattr(IfcPlateTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPlateTypeEnum, 'NOTDEFINED', INDETERMINATE) +base_plate = IfcPlateTypeEnum.BASE_PLATE +cover_plate = IfcPlateTypeEnum.COVER_PLATE +curtain_panel = IfcPlateTypeEnum.CURTAIN_PANEL +flange_plate = IfcPlateTypeEnum.FLANGE_PLATE +gusset_plate = IfcPlateTypeEnum.GUSSET_PLATE +sheet = IfcPlateTypeEnum.SHEET +splice_plate = IfcPlateTypeEnum.SPLICE_PLATE +stiffener_plate = IfcPlateTypeEnum.STIFFENER_PLATE +web_plate = IfcPlateTypeEnum.WEB_PLATE +userdefined = IfcPlateTypeEnum.USERDEFINED +notdefined = IfcPlateTypeEnum.NOTDEFINED IfcPreferredSurfaceCurveRepresentation = enum_namespace() -curve3d = express_getattr(IfcPreferredSurfaceCurveRepresentation, 'CURVE3D', INDETERMINATE) -pcurve_s1 = express_getattr(IfcPreferredSurfaceCurveRepresentation, 'PCURVE_S1', INDETERMINATE) -pcurve_s2 = express_getattr(IfcPreferredSurfaceCurveRepresentation, 'PCURVE_S2', INDETERMINATE) +curve3d = IfcPreferredSurfaceCurveRepresentation.CURVE3D +pcurve_s1 = IfcPreferredSurfaceCurveRepresentation.PCURVE_S1 +pcurve_s2 = IfcPreferredSurfaceCurveRepresentation.PCURVE_S2 IfcProcedureTypeEnum = enum_namespace() -advice_caution = express_getattr(IfcProcedureTypeEnum, 'ADVICE_CAUTION', INDETERMINATE) -advice_note = express_getattr(IfcProcedureTypeEnum, 'ADVICE_NOTE', INDETERMINATE) -advice_warning = express_getattr(IfcProcedureTypeEnum, 'ADVICE_WARNING', INDETERMINATE) -calibration = express_getattr(IfcProcedureTypeEnum, 'CALIBRATION', INDETERMINATE) -diagnostic = express_getattr(IfcProcedureTypeEnum, 'DIAGNOSTIC', INDETERMINATE) -shutdown = express_getattr(IfcProcedureTypeEnum, 'SHUTDOWN', INDETERMINATE) -startup = express_getattr(IfcProcedureTypeEnum, 'STARTUP', INDETERMINATE) -userdefined = express_getattr(IfcProcedureTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcProcedureTypeEnum, 'NOTDEFINED', INDETERMINATE) +advice_caution = IfcProcedureTypeEnum.ADVICE_CAUTION +advice_note = IfcProcedureTypeEnum.ADVICE_NOTE +advice_warning = IfcProcedureTypeEnum.ADVICE_WARNING +calibration = IfcProcedureTypeEnum.CALIBRATION +diagnostic = IfcProcedureTypeEnum.DIAGNOSTIC +shutdown = IfcProcedureTypeEnum.SHUTDOWN +startup = IfcProcedureTypeEnum.STARTUP +userdefined = IfcProcedureTypeEnum.USERDEFINED +notdefined = IfcProcedureTypeEnum.NOTDEFINED IfcProfileTypeEnum = enum_namespace() -area = express_getattr(IfcProfileTypeEnum, 'AREA', INDETERMINATE) -curve = express_getattr(IfcProfileTypeEnum, 'CURVE', INDETERMINATE) +area = IfcProfileTypeEnum.AREA +curve = IfcProfileTypeEnum.CURVE IfcProjectOrderTypeEnum = enum_namespace() -changeorder = express_getattr(IfcProjectOrderTypeEnum, 'CHANGEORDER', INDETERMINATE) -maintenanceworkorder = express_getattr(IfcProjectOrderTypeEnum, 'MAINTENANCEWORKORDER', INDETERMINATE) -moveorder = express_getattr(IfcProjectOrderTypeEnum, 'MOVEORDER', INDETERMINATE) -purchaseorder = express_getattr(IfcProjectOrderTypeEnum, 'PURCHASEORDER', INDETERMINATE) -workorder = express_getattr(IfcProjectOrderTypeEnum, 'WORKORDER', INDETERMINATE) -userdefined = express_getattr(IfcProjectOrderTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcProjectOrderTypeEnum, 'NOTDEFINED', INDETERMINATE) +changeorder = IfcProjectOrderTypeEnum.CHANGEORDER +maintenanceworkorder = IfcProjectOrderTypeEnum.MAINTENANCEWORKORDER +moveorder = IfcProjectOrderTypeEnum.MOVEORDER +purchaseorder = IfcProjectOrderTypeEnum.PURCHASEORDER +workorder = IfcProjectOrderTypeEnum.WORKORDER +userdefined = IfcProjectOrderTypeEnum.USERDEFINED +notdefined = IfcProjectOrderTypeEnum.NOTDEFINED IfcProjectedOrTrueLengthEnum = enum_namespace() -projected_length = express_getattr(IfcProjectedOrTrueLengthEnum, 'PROJECTED_LENGTH', INDETERMINATE) -true_length = express_getattr(IfcProjectedOrTrueLengthEnum, 'TRUE_LENGTH', INDETERMINATE) +projected_length = IfcProjectedOrTrueLengthEnum.PROJECTED_LENGTH +true_length = IfcProjectedOrTrueLengthEnum.TRUE_LENGTH IfcProjectionElementTypeEnum = enum_namespace() -blister = express_getattr(IfcProjectionElementTypeEnum, 'BLISTER', INDETERMINATE) -deviator = express_getattr(IfcProjectionElementTypeEnum, 'DEVIATOR', INDETERMINATE) -userdefined = express_getattr(IfcProjectionElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcProjectionElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +blister = IfcProjectionElementTypeEnum.BLISTER +deviator = IfcProjectionElementTypeEnum.DEVIATOR +userdefined = IfcProjectionElementTypeEnum.USERDEFINED +notdefined = IfcProjectionElementTypeEnum.NOTDEFINED IfcPropertySetTemplateTypeEnum = enum_namespace() -pset_materialdriven = express_getattr(IfcPropertySetTemplateTypeEnum, 'PSET_MATERIALDRIVEN', INDETERMINATE) -pset_occurrencedriven = express_getattr(IfcPropertySetTemplateTypeEnum, 'PSET_OCCURRENCEDRIVEN', INDETERMINATE) -pset_performancedriven = express_getattr(IfcPropertySetTemplateTypeEnum, 'PSET_PERFORMANCEDRIVEN', INDETERMINATE) -pset_profiledriven = express_getattr(IfcPropertySetTemplateTypeEnum, 'PSET_PROFILEDRIVEN', INDETERMINATE) -pset_typedrivenonly = express_getattr(IfcPropertySetTemplateTypeEnum, 'PSET_TYPEDRIVENONLY', INDETERMINATE) -pset_typedrivenoverride = express_getattr(IfcPropertySetTemplateTypeEnum, 'PSET_TYPEDRIVENOVERRIDE', INDETERMINATE) -qto_occurrencedriven = express_getattr(IfcPropertySetTemplateTypeEnum, 'QTO_OCCURRENCEDRIVEN', INDETERMINATE) -qto_typedrivenonly = express_getattr(IfcPropertySetTemplateTypeEnum, 'QTO_TYPEDRIVENONLY', INDETERMINATE) -qto_typedrivenoverride = express_getattr(IfcPropertySetTemplateTypeEnum, 'QTO_TYPEDRIVENOVERRIDE', INDETERMINATE) -notdefined = express_getattr(IfcPropertySetTemplateTypeEnum, 'NOTDEFINED', INDETERMINATE) +pset_materialdriven = IfcPropertySetTemplateTypeEnum.PSET_MATERIALDRIVEN +pset_occurrencedriven = IfcPropertySetTemplateTypeEnum.PSET_OCCURRENCEDRIVEN +pset_performancedriven = IfcPropertySetTemplateTypeEnum.PSET_PERFORMANCEDRIVEN +pset_profiledriven = IfcPropertySetTemplateTypeEnum.PSET_PROFILEDRIVEN +pset_typedrivenonly = IfcPropertySetTemplateTypeEnum.PSET_TYPEDRIVENONLY +pset_typedrivenoverride = IfcPropertySetTemplateTypeEnum.PSET_TYPEDRIVENOVERRIDE +qto_occurrencedriven = IfcPropertySetTemplateTypeEnum.QTO_OCCURRENCEDRIVEN +qto_typedrivenonly = IfcPropertySetTemplateTypeEnum.QTO_TYPEDRIVENONLY +qto_typedrivenoverride = IfcPropertySetTemplateTypeEnum.QTO_TYPEDRIVENOVERRIDE +notdefined = IfcPropertySetTemplateTypeEnum.NOTDEFINED IfcProtectiveDeviceTrippingUnitTypeEnum = enum_namespace() -electromagnetic = express_getattr(IfcProtectiveDeviceTrippingUnitTypeEnum, 'ELECTROMAGNETIC', INDETERMINATE) -electronic = express_getattr(IfcProtectiveDeviceTrippingUnitTypeEnum, 'ELECTRONIC', INDETERMINATE) -residualcurrent = express_getattr(IfcProtectiveDeviceTrippingUnitTypeEnum, 'RESIDUALCURRENT', INDETERMINATE) -thermal = express_getattr(IfcProtectiveDeviceTrippingUnitTypeEnum, 'THERMAL', INDETERMINATE) -userdefined = express_getattr(IfcProtectiveDeviceTrippingUnitTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcProtectiveDeviceTrippingUnitTypeEnum, 'NOTDEFINED', INDETERMINATE) +electromagnetic = IfcProtectiveDeviceTrippingUnitTypeEnum.ELECTROMAGNETIC +electronic = IfcProtectiveDeviceTrippingUnitTypeEnum.ELECTRONIC +residualcurrent = IfcProtectiveDeviceTrippingUnitTypeEnum.RESIDUALCURRENT +thermal = IfcProtectiveDeviceTrippingUnitTypeEnum.THERMAL +userdefined = IfcProtectiveDeviceTrippingUnitTypeEnum.USERDEFINED +notdefined = IfcProtectiveDeviceTrippingUnitTypeEnum.NOTDEFINED IfcProtectiveDeviceTypeEnum = enum_namespace() -anti_arcing_device = express_getattr(IfcProtectiveDeviceTypeEnum, 'ANTI_ARCING_DEVICE', INDETERMINATE) -circuitbreaker = express_getattr(IfcProtectiveDeviceTypeEnum, 'CIRCUITBREAKER', INDETERMINATE) -earthingswitch = express_getattr(IfcProtectiveDeviceTypeEnum, 'EARTHINGSWITCH', INDETERMINATE) -earthleakagecircuitbreaker = express_getattr(IfcProtectiveDeviceTypeEnum, 'EARTHLEAKAGECIRCUITBREAKER', INDETERMINATE) -fusedisconnector = express_getattr(IfcProtectiveDeviceTypeEnum, 'FUSEDISCONNECTOR', INDETERMINATE) -residualcurrentcircuitbreaker = express_getattr(IfcProtectiveDeviceTypeEnum, 'RESIDUALCURRENTCIRCUITBREAKER', INDETERMINATE) -residualcurrentswitch = express_getattr(IfcProtectiveDeviceTypeEnum, 'RESIDUALCURRENTSWITCH', INDETERMINATE) -sparkgap = express_getattr(IfcProtectiveDeviceTypeEnum, 'SPARKGAP', INDETERMINATE) -varistor = express_getattr(IfcProtectiveDeviceTypeEnum, 'VARISTOR', INDETERMINATE) -voltagelimiter = express_getattr(IfcProtectiveDeviceTypeEnum, 'VOLTAGELIMITER', INDETERMINATE) -userdefined = express_getattr(IfcProtectiveDeviceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcProtectiveDeviceTypeEnum, 'NOTDEFINED', INDETERMINATE) +anti_arcing_device = IfcProtectiveDeviceTypeEnum.ANTI_ARCING_DEVICE +circuitbreaker = IfcProtectiveDeviceTypeEnum.CIRCUITBREAKER +earthingswitch = IfcProtectiveDeviceTypeEnum.EARTHINGSWITCH +earthleakagecircuitbreaker = IfcProtectiveDeviceTypeEnum.EARTHLEAKAGECIRCUITBREAKER +fusedisconnector = IfcProtectiveDeviceTypeEnum.FUSEDISCONNECTOR +residualcurrentcircuitbreaker = IfcProtectiveDeviceTypeEnum.RESIDUALCURRENTCIRCUITBREAKER +residualcurrentswitch = IfcProtectiveDeviceTypeEnum.RESIDUALCURRENTSWITCH +sparkgap = IfcProtectiveDeviceTypeEnum.SPARKGAP +varistor = IfcProtectiveDeviceTypeEnum.VARISTOR +voltagelimiter = IfcProtectiveDeviceTypeEnum.VOLTAGELIMITER +userdefined = IfcProtectiveDeviceTypeEnum.USERDEFINED +notdefined = IfcProtectiveDeviceTypeEnum.NOTDEFINED IfcPumpTypeEnum = enum_namespace() -circulator = express_getattr(IfcPumpTypeEnum, 'CIRCULATOR', INDETERMINATE) -endsuction = express_getattr(IfcPumpTypeEnum, 'ENDSUCTION', INDETERMINATE) -splitcase = express_getattr(IfcPumpTypeEnum, 'SPLITCASE', INDETERMINATE) -submersiblepump = express_getattr(IfcPumpTypeEnum, 'SUBMERSIBLEPUMP', INDETERMINATE) -sumppump = express_getattr(IfcPumpTypeEnum, 'SUMPPUMP', INDETERMINATE) -verticalinline = express_getattr(IfcPumpTypeEnum, 'VERTICALINLINE', INDETERMINATE) -verticalturbine = express_getattr(IfcPumpTypeEnum, 'VERTICALTURBINE', INDETERMINATE) -userdefined = express_getattr(IfcPumpTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcPumpTypeEnum, 'NOTDEFINED', INDETERMINATE) +circulator = IfcPumpTypeEnum.CIRCULATOR +endsuction = IfcPumpTypeEnum.ENDSUCTION +splitcase = IfcPumpTypeEnum.SPLITCASE +submersiblepump = IfcPumpTypeEnum.SUBMERSIBLEPUMP +sumppump = IfcPumpTypeEnum.SUMPPUMP +verticalinline = IfcPumpTypeEnum.VERTICALINLINE +verticalturbine = IfcPumpTypeEnum.VERTICALTURBINE +userdefined = IfcPumpTypeEnum.USERDEFINED +notdefined = IfcPumpTypeEnum.NOTDEFINED IfcRailTypeEnum = enum_namespace() -blade = express_getattr(IfcRailTypeEnum, 'BLADE', INDETERMINATE) -checkrail = express_getattr(IfcRailTypeEnum, 'CHECKRAIL', INDETERMINATE) -guardrail = express_getattr(IfcRailTypeEnum, 'GUARDRAIL', INDETERMINATE) -rackrail = express_getattr(IfcRailTypeEnum, 'RACKRAIL', INDETERMINATE) -rail = express_getattr(IfcRailTypeEnum, 'RAIL', INDETERMINATE) -stockrail = express_getattr(IfcRailTypeEnum, 'STOCKRAIL', INDETERMINATE) -userdefined = express_getattr(IfcRailTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcRailTypeEnum, 'NOTDEFINED', INDETERMINATE) +blade = IfcRailTypeEnum.BLADE +checkrail = IfcRailTypeEnum.CHECKRAIL +guardrail = IfcRailTypeEnum.GUARDRAIL +rackrail = IfcRailTypeEnum.RACKRAIL +rail = IfcRailTypeEnum.RAIL +stockrail = IfcRailTypeEnum.STOCKRAIL +userdefined = IfcRailTypeEnum.USERDEFINED +notdefined = IfcRailTypeEnum.NOTDEFINED IfcRailingTypeEnum = enum_namespace() -balustrade = express_getattr(IfcRailingTypeEnum, 'BALUSTRADE', INDETERMINATE) -fence = express_getattr(IfcRailingTypeEnum, 'FENCE', INDETERMINATE) -guardrail = express_getattr(IfcRailingTypeEnum, 'GUARDRAIL', INDETERMINATE) -handrail = express_getattr(IfcRailingTypeEnum, 'HANDRAIL', INDETERMINATE) -userdefined = express_getattr(IfcRailingTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcRailingTypeEnum, 'NOTDEFINED', INDETERMINATE) +balustrade = IfcRailingTypeEnum.BALUSTRADE +fence = IfcRailingTypeEnum.FENCE +guardrail = IfcRailingTypeEnum.GUARDRAIL +handrail = IfcRailingTypeEnum.HANDRAIL +userdefined = IfcRailingTypeEnum.USERDEFINED +notdefined = IfcRailingTypeEnum.NOTDEFINED IfcRailwayPartTypeEnum = enum_namespace() -dilatationsuperstructure = express_getattr(IfcRailwayPartTypeEnum, 'DILATATIONSUPERSTRUCTURE', INDETERMINATE) -linesidestructure = express_getattr(IfcRailwayPartTypeEnum, 'LINESIDESTRUCTURE', INDETERMINATE) -linesidestructurepart = express_getattr(IfcRailwayPartTypeEnum, 'LINESIDESTRUCTUREPART', INDETERMINATE) -plaintracksuperstructure = express_getattr(IfcRailwayPartTypeEnum, 'PLAINTRACKSUPERSTRUCTURE', INDETERMINATE) -superstructure = express_getattr(IfcRailwayPartTypeEnum, 'SUPERSTRUCTURE', INDETERMINATE) -trackstructure = express_getattr(IfcRailwayPartTypeEnum, 'TRACKSTRUCTURE', INDETERMINATE) -trackstructurepart = express_getattr(IfcRailwayPartTypeEnum, 'TRACKSTRUCTUREPART', INDETERMINATE) -turnoutsuperstructure = express_getattr(IfcRailwayPartTypeEnum, 'TURNOUTSUPERSTRUCTURE', INDETERMINATE) -userdefined = express_getattr(IfcRailwayPartTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcRailwayPartTypeEnum, 'NOTDEFINED', INDETERMINATE) +dilatationsuperstructure = IfcRailwayPartTypeEnum.DILATATIONSUPERSTRUCTURE +linesidestructure = IfcRailwayPartTypeEnum.LINESIDESTRUCTURE +linesidestructurepart = IfcRailwayPartTypeEnum.LINESIDESTRUCTUREPART +plaintracksuperstructure = IfcRailwayPartTypeEnum.PLAINTRACKSUPERSTRUCTURE +superstructure = IfcRailwayPartTypeEnum.SUPERSTRUCTURE +trackstructure = IfcRailwayPartTypeEnum.TRACKSTRUCTURE +trackstructurepart = IfcRailwayPartTypeEnum.TRACKSTRUCTUREPART +turnoutsuperstructure = IfcRailwayPartTypeEnum.TURNOUTSUPERSTRUCTURE +userdefined = IfcRailwayPartTypeEnum.USERDEFINED +notdefined = IfcRailwayPartTypeEnum.NOTDEFINED IfcRailwayTypeEnum = enum_namespace() -userdefined = express_getattr(IfcRailwayTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcRailwayTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcRailwayTypeEnum.USERDEFINED +notdefined = IfcRailwayTypeEnum.NOTDEFINED IfcRampFlightTypeEnum = enum_namespace() -spiral = express_getattr(IfcRampFlightTypeEnum, 'SPIRAL', INDETERMINATE) -straight = express_getattr(IfcRampFlightTypeEnum, 'STRAIGHT', INDETERMINATE) -userdefined = express_getattr(IfcRampFlightTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcRampFlightTypeEnum, 'NOTDEFINED', INDETERMINATE) +spiral = IfcRampFlightTypeEnum.SPIRAL +straight = IfcRampFlightTypeEnum.STRAIGHT +userdefined = IfcRampFlightTypeEnum.USERDEFINED +notdefined = IfcRampFlightTypeEnum.NOTDEFINED IfcRampTypeEnum = enum_namespace() -half_turn_ramp = express_getattr(IfcRampTypeEnum, 'HALF_TURN_RAMP', INDETERMINATE) -quarter_turn_ramp = express_getattr(IfcRampTypeEnum, 'QUARTER_TURN_RAMP', INDETERMINATE) -spiral_ramp = express_getattr(IfcRampTypeEnum, 'SPIRAL_RAMP', INDETERMINATE) -straight_run_ramp = express_getattr(IfcRampTypeEnum, 'STRAIGHT_RUN_RAMP', INDETERMINATE) -two_quarter_turn_ramp = express_getattr(IfcRampTypeEnum, 'TWO_QUARTER_TURN_RAMP', INDETERMINATE) -two_straight_run_ramp = express_getattr(IfcRampTypeEnum, 'TWO_STRAIGHT_RUN_RAMP', INDETERMINATE) -userdefined = express_getattr(IfcRampTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcRampTypeEnum, 'NOTDEFINED', INDETERMINATE) +half_turn_ramp = IfcRampTypeEnum.HALF_TURN_RAMP +quarter_turn_ramp = IfcRampTypeEnum.QUARTER_TURN_RAMP +spiral_ramp = IfcRampTypeEnum.SPIRAL_RAMP +straight_run_ramp = IfcRampTypeEnum.STRAIGHT_RUN_RAMP +two_quarter_turn_ramp = IfcRampTypeEnum.TWO_QUARTER_TURN_RAMP +two_straight_run_ramp = IfcRampTypeEnum.TWO_STRAIGHT_RUN_RAMP +userdefined = IfcRampTypeEnum.USERDEFINED +notdefined = IfcRampTypeEnum.NOTDEFINED IfcRecurrenceTypeEnum = enum_namespace() -by_day_count = express_getattr(IfcRecurrenceTypeEnum, 'BY_DAY_COUNT', INDETERMINATE) -by_weekday_count = express_getattr(IfcRecurrenceTypeEnum, 'BY_WEEKDAY_COUNT', INDETERMINATE) -daily = express_getattr(IfcRecurrenceTypeEnum, 'DAILY', INDETERMINATE) -monthly_by_day_of_month = express_getattr(IfcRecurrenceTypeEnum, 'MONTHLY_BY_DAY_OF_MONTH', INDETERMINATE) -monthly_by_position = express_getattr(IfcRecurrenceTypeEnum, 'MONTHLY_BY_POSITION', INDETERMINATE) -weekly = express_getattr(IfcRecurrenceTypeEnum, 'WEEKLY', INDETERMINATE) -yearly_by_day_of_month = express_getattr(IfcRecurrenceTypeEnum, 'YEARLY_BY_DAY_OF_MONTH', INDETERMINATE) -yearly_by_position = express_getattr(IfcRecurrenceTypeEnum, 'YEARLY_BY_POSITION', INDETERMINATE) +by_day_count = IfcRecurrenceTypeEnum.BY_DAY_COUNT +by_weekday_count = IfcRecurrenceTypeEnum.BY_WEEKDAY_COUNT +daily = IfcRecurrenceTypeEnum.DAILY +monthly_by_day_of_month = IfcRecurrenceTypeEnum.MONTHLY_BY_DAY_OF_MONTH +monthly_by_position = IfcRecurrenceTypeEnum.MONTHLY_BY_POSITION +weekly = IfcRecurrenceTypeEnum.WEEKLY +yearly_by_day_of_month = IfcRecurrenceTypeEnum.YEARLY_BY_DAY_OF_MONTH +yearly_by_position = IfcRecurrenceTypeEnum.YEARLY_BY_POSITION IfcReferentTypeEnum = enum_namespace() -boundary = express_getattr(IfcReferentTypeEnum, 'BOUNDARY', INDETERMINATE) -intersection = express_getattr(IfcReferentTypeEnum, 'INTERSECTION', INDETERMINATE) -kilopoint = express_getattr(IfcReferentTypeEnum, 'KILOPOINT', INDETERMINATE) -landmark = express_getattr(IfcReferentTypeEnum, 'LANDMARK', INDETERMINATE) -milepoint = express_getattr(IfcReferentTypeEnum, 'MILEPOINT', INDETERMINATE) -position = express_getattr(IfcReferentTypeEnum, 'POSITION', INDETERMINATE) -referencemarker = express_getattr(IfcReferentTypeEnum, 'REFERENCEMARKER', INDETERMINATE) -station = express_getattr(IfcReferentTypeEnum, 'STATION', INDETERMINATE) -userdefined = express_getattr(IfcReferentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcReferentTypeEnum, 'NOTDEFINED', INDETERMINATE) +boundary = IfcReferentTypeEnum.BOUNDARY +intersection = IfcReferentTypeEnum.INTERSECTION +kilopoint = IfcReferentTypeEnum.KILOPOINT +landmark = IfcReferentTypeEnum.LANDMARK +milepoint = IfcReferentTypeEnum.MILEPOINT +position = IfcReferentTypeEnum.POSITION +referencemarker = IfcReferentTypeEnum.REFERENCEMARKER +station = IfcReferentTypeEnum.STATION +userdefined = IfcReferentTypeEnum.USERDEFINED +notdefined = IfcReferentTypeEnum.NOTDEFINED IfcReflectanceMethodEnum = enum_namespace() -blinn = express_getattr(IfcReflectanceMethodEnum, 'BLINN', INDETERMINATE) -flat = express_getattr(IfcReflectanceMethodEnum, 'FLAT', INDETERMINATE) -glass = express_getattr(IfcReflectanceMethodEnum, 'GLASS', INDETERMINATE) -matt = express_getattr(IfcReflectanceMethodEnum, 'MATT', INDETERMINATE) -metal = express_getattr(IfcReflectanceMethodEnum, 'METAL', INDETERMINATE) -mirror = express_getattr(IfcReflectanceMethodEnum, 'MIRROR', INDETERMINATE) -phong = express_getattr(IfcReflectanceMethodEnum, 'PHONG', INDETERMINATE) -physical = express_getattr(IfcReflectanceMethodEnum, 'PHYSICAL', INDETERMINATE) -plastic = express_getattr(IfcReflectanceMethodEnum, 'PLASTIC', INDETERMINATE) -strauss = express_getattr(IfcReflectanceMethodEnum, 'STRAUSS', INDETERMINATE) -notdefined = express_getattr(IfcReflectanceMethodEnum, 'NOTDEFINED', INDETERMINATE) +blinn = IfcReflectanceMethodEnum.BLINN +flat = IfcReflectanceMethodEnum.FLAT +glass = IfcReflectanceMethodEnum.GLASS +matt = IfcReflectanceMethodEnum.MATT +metal = IfcReflectanceMethodEnum.METAL +mirror = IfcReflectanceMethodEnum.MIRROR +phong = IfcReflectanceMethodEnum.PHONG +physical = IfcReflectanceMethodEnum.PHYSICAL +plastic = IfcReflectanceMethodEnum.PLASTIC +strauss = IfcReflectanceMethodEnum.STRAUSS +notdefined = IfcReflectanceMethodEnum.NOTDEFINED IfcReinforcedSoilTypeEnum = enum_namespace() -dynamicallycompacted = express_getattr(IfcReinforcedSoilTypeEnum, 'DYNAMICALLYCOMPACTED', INDETERMINATE) -grouted = express_getattr(IfcReinforcedSoilTypeEnum, 'GROUTED', INDETERMINATE) -replaced = express_getattr(IfcReinforcedSoilTypeEnum, 'REPLACED', INDETERMINATE) -rollercompacted = express_getattr(IfcReinforcedSoilTypeEnum, 'ROLLERCOMPACTED', INDETERMINATE) -surchargepreloaded = express_getattr(IfcReinforcedSoilTypeEnum, 'SURCHARGEPRELOADED', INDETERMINATE) -verticallydrained = express_getattr(IfcReinforcedSoilTypeEnum, 'VERTICALLYDRAINED', INDETERMINATE) -userdefined = express_getattr(IfcReinforcedSoilTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcReinforcedSoilTypeEnum, 'NOTDEFINED', INDETERMINATE) +dynamicallycompacted = IfcReinforcedSoilTypeEnum.DYNAMICALLYCOMPACTED +grouted = IfcReinforcedSoilTypeEnum.GROUTED +replaced = IfcReinforcedSoilTypeEnum.REPLACED +rollercompacted = IfcReinforcedSoilTypeEnum.ROLLERCOMPACTED +surchargepreloaded = IfcReinforcedSoilTypeEnum.SURCHARGEPRELOADED +verticallydrained = IfcReinforcedSoilTypeEnum.VERTICALLYDRAINED +userdefined = IfcReinforcedSoilTypeEnum.USERDEFINED +notdefined = IfcReinforcedSoilTypeEnum.NOTDEFINED IfcReinforcingBarRoleEnum = enum_namespace() -anchoring = express_getattr(IfcReinforcingBarRoleEnum, 'ANCHORING', INDETERMINATE) -edge = express_getattr(IfcReinforcingBarRoleEnum, 'EDGE', INDETERMINATE) -ligature = express_getattr(IfcReinforcingBarRoleEnum, 'LIGATURE', INDETERMINATE) -main = express_getattr(IfcReinforcingBarRoleEnum, 'MAIN', INDETERMINATE) -punching = express_getattr(IfcReinforcingBarRoleEnum, 'PUNCHING', INDETERMINATE) -ring = express_getattr(IfcReinforcingBarRoleEnum, 'RING', INDETERMINATE) -shear = express_getattr(IfcReinforcingBarRoleEnum, 'SHEAR', INDETERMINATE) -stud = express_getattr(IfcReinforcingBarRoleEnum, 'STUD', INDETERMINATE) -userdefined = express_getattr(IfcReinforcingBarRoleEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcReinforcingBarRoleEnum, 'NOTDEFINED', INDETERMINATE) +anchoring = IfcReinforcingBarRoleEnum.ANCHORING +edge = IfcReinforcingBarRoleEnum.EDGE +ligature = IfcReinforcingBarRoleEnum.LIGATURE +main = IfcReinforcingBarRoleEnum.MAIN +punching = IfcReinforcingBarRoleEnum.PUNCHING +ring = IfcReinforcingBarRoleEnum.RING +shear = IfcReinforcingBarRoleEnum.SHEAR +stud = IfcReinforcingBarRoleEnum.STUD +userdefined = IfcReinforcingBarRoleEnum.USERDEFINED +notdefined = IfcReinforcingBarRoleEnum.NOTDEFINED IfcReinforcingBarSurfaceEnum = enum_namespace() -plain = express_getattr(IfcReinforcingBarSurfaceEnum, 'PLAIN', INDETERMINATE) -textured = express_getattr(IfcReinforcingBarSurfaceEnum, 'TEXTURED', INDETERMINATE) +plain = IfcReinforcingBarSurfaceEnum.PLAIN +textured = IfcReinforcingBarSurfaceEnum.TEXTURED IfcReinforcingBarTypeEnum = enum_namespace() -anchoring = express_getattr(IfcReinforcingBarTypeEnum, 'ANCHORING', INDETERMINATE) -edge = express_getattr(IfcReinforcingBarTypeEnum, 'EDGE', INDETERMINATE) -ligature = express_getattr(IfcReinforcingBarTypeEnum, 'LIGATURE', INDETERMINATE) -main = express_getattr(IfcReinforcingBarTypeEnum, 'MAIN', INDETERMINATE) -punching = express_getattr(IfcReinforcingBarTypeEnum, 'PUNCHING', INDETERMINATE) -ring = express_getattr(IfcReinforcingBarTypeEnum, 'RING', INDETERMINATE) -shear = express_getattr(IfcReinforcingBarTypeEnum, 'SHEAR', INDETERMINATE) -spacebar = express_getattr(IfcReinforcingBarTypeEnum, 'SPACEBAR', INDETERMINATE) -stud = express_getattr(IfcReinforcingBarTypeEnum, 'STUD', INDETERMINATE) -userdefined = express_getattr(IfcReinforcingBarTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcReinforcingBarTypeEnum, 'NOTDEFINED', INDETERMINATE) +anchoring = IfcReinforcingBarTypeEnum.ANCHORING +edge = IfcReinforcingBarTypeEnum.EDGE +ligature = IfcReinforcingBarTypeEnum.LIGATURE +main = IfcReinforcingBarTypeEnum.MAIN +punching = IfcReinforcingBarTypeEnum.PUNCHING +ring = IfcReinforcingBarTypeEnum.RING +shear = IfcReinforcingBarTypeEnum.SHEAR +spacebar = IfcReinforcingBarTypeEnum.SPACEBAR +stud = IfcReinforcingBarTypeEnum.STUD +userdefined = IfcReinforcingBarTypeEnum.USERDEFINED +notdefined = IfcReinforcingBarTypeEnum.NOTDEFINED IfcReinforcingMeshTypeEnum = enum_namespace() -userdefined = express_getattr(IfcReinforcingMeshTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcReinforcingMeshTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcReinforcingMeshTypeEnum.USERDEFINED +notdefined = IfcReinforcingMeshTypeEnum.NOTDEFINED IfcRoadPartTypeEnum = enum_namespace() -bicyclecrossing = express_getattr(IfcRoadPartTypeEnum, 'BICYCLECROSSING', INDETERMINATE) -bus_stop = express_getattr(IfcRoadPartTypeEnum, 'BUS_STOP', INDETERMINATE) -carriageway = express_getattr(IfcRoadPartTypeEnum, 'CARRIAGEWAY', INDETERMINATE) -centralisland = express_getattr(IfcRoadPartTypeEnum, 'CENTRALISLAND', INDETERMINATE) -centralreserve = express_getattr(IfcRoadPartTypeEnum, 'CENTRALRESERVE', INDETERMINATE) -hardshoulder = express_getattr(IfcRoadPartTypeEnum, 'HARDSHOULDER', INDETERMINATE) -intersection = express_getattr(IfcRoadPartTypeEnum, 'INTERSECTION', INDETERMINATE) -layby = express_getattr(IfcRoadPartTypeEnum, 'LAYBY', INDETERMINATE) -parkingbay = express_getattr(IfcRoadPartTypeEnum, 'PARKINGBAY', INDETERMINATE) -passingbay = express_getattr(IfcRoadPartTypeEnum, 'PASSINGBAY', INDETERMINATE) -pedestrian_crossing = express_getattr(IfcRoadPartTypeEnum, 'PEDESTRIAN_CROSSING', INDETERMINATE) -railwaycrossing = express_getattr(IfcRoadPartTypeEnum, 'RAILWAYCROSSING', INDETERMINATE) -refugeisland = express_getattr(IfcRoadPartTypeEnum, 'REFUGEISLAND', INDETERMINATE) -roadsegment = express_getattr(IfcRoadPartTypeEnum, 'ROADSEGMENT', INDETERMINATE) -roadside = express_getattr(IfcRoadPartTypeEnum, 'ROADSIDE', INDETERMINATE) -roadsidepart = express_getattr(IfcRoadPartTypeEnum, 'ROADSIDEPART', INDETERMINATE) -roadwayplateau = express_getattr(IfcRoadPartTypeEnum, 'ROADWAYPLATEAU', INDETERMINATE) -roundabout = express_getattr(IfcRoadPartTypeEnum, 'ROUNDABOUT', INDETERMINATE) -shoulder = express_getattr(IfcRoadPartTypeEnum, 'SHOULDER', INDETERMINATE) -sidewalk = express_getattr(IfcRoadPartTypeEnum, 'SIDEWALK', INDETERMINATE) -softshoulder = express_getattr(IfcRoadPartTypeEnum, 'SOFTSHOULDER', INDETERMINATE) -tollplaza = express_getattr(IfcRoadPartTypeEnum, 'TOLLPLAZA', INDETERMINATE) -trafficisland = express_getattr(IfcRoadPartTypeEnum, 'TRAFFICISLAND', INDETERMINATE) -trafficlane = express_getattr(IfcRoadPartTypeEnum, 'TRAFFICLANE', INDETERMINATE) -userdefined = express_getattr(IfcRoadPartTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcRoadPartTypeEnum, 'NOTDEFINED', INDETERMINATE) +bicyclecrossing = IfcRoadPartTypeEnum.BICYCLECROSSING +bus_stop = IfcRoadPartTypeEnum.BUS_STOP +carriageway = IfcRoadPartTypeEnum.CARRIAGEWAY +centralisland = IfcRoadPartTypeEnum.CENTRALISLAND +centralreserve = IfcRoadPartTypeEnum.CENTRALRESERVE +hardshoulder = IfcRoadPartTypeEnum.HARDSHOULDER +intersection = IfcRoadPartTypeEnum.INTERSECTION +layby = IfcRoadPartTypeEnum.LAYBY +parkingbay = IfcRoadPartTypeEnum.PARKINGBAY +passingbay = IfcRoadPartTypeEnum.PASSINGBAY +pedestrian_crossing = IfcRoadPartTypeEnum.PEDESTRIAN_CROSSING +railwaycrossing = IfcRoadPartTypeEnum.RAILWAYCROSSING +refugeisland = IfcRoadPartTypeEnum.REFUGEISLAND +roadsegment = IfcRoadPartTypeEnum.ROADSEGMENT +roadside = IfcRoadPartTypeEnum.ROADSIDE +roadsidepart = IfcRoadPartTypeEnum.ROADSIDEPART +roadwayplateau = IfcRoadPartTypeEnum.ROADWAYPLATEAU +roundabout = IfcRoadPartTypeEnum.ROUNDABOUT +shoulder = IfcRoadPartTypeEnum.SHOULDER +sidewalk = IfcRoadPartTypeEnum.SIDEWALK +softshoulder = IfcRoadPartTypeEnum.SOFTSHOULDER +tollplaza = IfcRoadPartTypeEnum.TOLLPLAZA +trafficisland = IfcRoadPartTypeEnum.TRAFFICISLAND +trafficlane = IfcRoadPartTypeEnum.TRAFFICLANE +userdefined = IfcRoadPartTypeEnum.USERDEFINED +notdefined = IfcRoadPartTypeEnum.NOTDEFINED IfcRoadTypeEnum = enum_namespace() -userdefined = express_getattr(IfcRoadTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcRoadTypeEnum, 'NOTDEFINED', INDETERMINATE) +userdefined = IfcRoadTypeEnum.USERDEFINED +notdefined = IfcRoadTypeEnum.NOTDEFINED IfcRoleEnum = enum_namespace() -architect = express_getattr(IfcRoleEnum, 'ARCHITECT', INDETERMINATE) -buildingoperator = express_getattr(IfcRoleEnum, 'BUILDINGOPERATOR', INDETERMINATE) -buildingowner = express_getattr(IfcRoleEnum, 'BUILDINGOWNER', INDETERMINATE) -civilengineer = express_getattr(IfcRoleEnum, 'CIVILENGINEER', INDETERMINATE) -client = express_getattr(IfcRoleEnum, 'CLIENT', INDETERMINATE) -commissioningengineer = express_getattr(IfcRoleEnum, 'COMMISSIONINGENGINEER', INDETERMINATE) -constructionmanager = express_getattr(IfcRoleEnum, 'CONSTRUCTIONMANAGER', INDETERMINATE) -consultant = express_getattr(IfcRoleEnum, 'CONSULTANT', INDETERMINATE) -contractor = express_getattr(IfcRoleEnum, 'CONTRACTOR', INDETERMINATE) -costengineer = express_getattr(IfcRoleEnum, 'COSTENGINEER', INDETERMINATE) -electricalengineer = express_getattr(IfcRoleEnum, 'ELECTRICALENGINEER', INDETERMINATE) -engineer = express_getattr(IfcRoleEnum, 'ENGINEER', INDETERMINATE) -facilitiesmanager = express_getattr(IfcRoleEnum, 'FACILITIESMANAGER', INDETERMINATE) -fieldconstructionmanager = express_getattr(IfcRoleEnum, 'FIELDCONSTRUCTIONMANAGER', INDETERMINATE) -manufacturer = express_getattr(IfcRoleEnum, 'MANUFACTURER', INDETERMINATE) -mechanicalengineer = express_getattr(IfcRoleEnum, 'MECHANICALENGINEER', INDETERMINATE) -owner = express_getattr(IfcRoleEnum, 'OWNER', INDETERMINATE) -projectmanager = express_getattr(IfcRoleEnum, 'PROJECTMANAGER', INDETERMINATE) -reseller = express_getattr(IfcRoleEnum, 'RESELLER', INDETERMINATE) -structuralengineer = express_getattr(IfcRoleEnum, 'STRUCTURALENGINEER', INDETERMINATE) -subcontractor = express_getattr(IfcRoleEnum, 'SUBCONTRACTOR', INDETERMINATE) -supplier = express_getattr(IfcRoleEnum, 'SUPPLIER', INDETERMINATE) -userdefined = express_getattr(IfcRoleEnum, 'USERDEFINED', INDETERMINATE) +architect = IfcRoleEnum.ARCHITECT +buildingoperator = IfcRoleEnum.BUILDINGOPERATOR +buildingowner = IfcRoleEnum.BUILDINGOWNER +civilengineer = IfcRoleEnum.CIVILENGINEER +client = IfcRoleEnum.CLIENT +commissioningengineer = IfcRoleEnum.COMMISSIONINGENGINEER +constructionmanager = IfcRoleEnum.CONSTRUCTIONMANAGER +consultant = IfcRoleEnum.CONSULTANT +contractor = IfcRoleEnum.CONTRACTOR +costengineer = IfcRoleEnum.COSTENGINEER +electricalengineer = IfcRoleEnum.ELECTRICALENGINEER +engineer = IfcRoleEnum.ENGINEER +facilitiesmanager = IfcRoleEnum.FACILITIESMANAGER +fieldconstructionmanager = IfcRoleEnum.FIELDCONSTRUCTIONMANAGER +manufacturer = IfcRoleEnum.MANUFACTURER +mechanicalengineer = IfcRoleEnum.MECHANICALENGINEER +owner = IfcRoleEnum.OWNER +projectmanager = IfcRoleEnum.PROJECTMANAGER +reseller = IfcRoleEnum.RESELLER +structuralengineer = IfcRoleEnum.STRUCTURALENGINEER +subcontractor = IfcRoleEnum.SUBCONTRACTOR +supplier = IfcRoleEnum.SUPPLIER +userdefined = IfcRoleEnum.USERDEFINED IfcRoofTypeEnum = enum_namespace() -barrel_roof = express_getattr(IfcRoofTypeEnum, 'BARREL_ROOF', INDETERMINATE) -butterfly_roof = express_getattr(IfcRoofTypeEnum, 'BUTTERFLY_ROOF', INDETERMINATE) -dome_roof = express_getattr(IfcRoofTypeEnum, 'DOME_ROOF', INDETERMINATE) -flat_roof = express_getattr(IfcRoofTypeEnum, 'FLAT_ROOF', INDETERMINATE) -freeform = express_getattr(IfcRoofTypeEnum, 'FREEFORM', INDETERMINATE) -gable_roof = express_getattr(IfcRoofTypeEnum, 'GABLE_ROOF', INDETERMINATE) -gambrel_roof = express_getattr(IfcRoofTypeEnum, 'GAMBREL_ROOF', INDETERMINATE) -hipped_gable_roof = express_getattr(IfcRoofTypeEnum, 'HIPPED_GABLE_ROOF', INDETERMINATE) -hip_roof = express_getattr(IfcRoofTypeEnum, 'HIP_ROOF', INDETERMINATE) -mansard_roof = express_getattr(IfcRoofTypeEnum, 'MANSARD_ROOF', INDETERMINATE) -pavilion_roof = express_getattr(IfcRoofTypeEnum, 'PAVILION_ROOF', INDETERMINATE) -rainbow_roof = express_getattr(IfcRoofTypeEnum, 'RAINBOW_ROOF', INDETERMINATE) -shed_roof = express_getattr(IfcRoofTypeEnum, 'SHED_ROOF', INDETERMINATE) -userdefined = express_getattr(IfcRoofTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcRoofTypeEnum, 'NOTDEFINED', INDETERMINATE) +barrel_roof = IfcRoofTypeEnum.BARREL_ROOF +butterfly_roof = IfcRoofTypeEnum.BUTTERFLY_ROOF +dome_roof = IfcRoofTypeEnum.DOME_ROOF +flat_roof = IfcRoofTypeEnum.FLAT_ROOF +freeform = IfcRoofTypeEnum.FREEFORM +gable_roof = IfcRoofTypeEnum.GABLE_ROOF +gambrel_roof = IfcRoofTypeEnum.GAMBREL_ROOF +hipped_gable_roof = IfcRoofTypeEnum.HIPPED_GABLE_ROOF +hip_roof = IfcRoofTypeEnum.HIP_ROOF +mansard_roof = IfcRoofTypeEnum.MANSARD_ROOF +pavilion_roof = IfcRoofTypeEnum.PAVILION_ROOF +rainbow_roof = IfcRoofTypeEnum.RAINBOW_ROOF +shed_roof = IfcRoofTypeEnum.SHED_ROOF +userdefined = IfcRoofTypeEnum.USERDEFINED +notdefined = IfcRoofTypeEnum.NOTDEFINED IfcSIPrefix = enum_namespace() -atto = express_getattr(IfcSIPrefix, 'ATTO', INDETERMINATE) -centi = express_getattr(IfcSIPrefix, 'CENTI', INDETERMINATE) -deca = express_getattr(IfcSIPrefix, 'DECA', INDETERMINATE) -deci = express_getattr(IfcSIPrefix, 'DECI', INDETERMINATE) -exa = express_getattr(IfcSIPrefix, 'EXA', INDETERMINATE) -femto = express_getattr(IfcSIPrefix, 'FEMTO', INDETERMINATE) -giga = express_getattr(IfcSIPrefix, 'GIGA', INDETERMINATE) -hecto = express_getattr(IfcSIPrefix, 'HECTO', INDETERMINATE) -kilo = express_getattr(IfcSIPrefix, 'KILO', INDETERMINATE) -mega = express_getattr(IfcSIPrefix, 'MEGA', INDETERMINATE) -micro = express_getattr(IfcSIPrefix, 'MICRO', INDETERMINATE) -milli = express_getattr(IfcSIPrefix, 'MILLI', INDETERMINATE) -nano = express_getattr(IfcSIPrefix, 'NANO', INDETERMINATE) -peta = express_getattr(IfcSIPrefix, 'PETA', INDETERMINATE) -pico = express_getattr(IfcSIPrefix, 'PICO', INDETERMINATE) -tera = express_getattr(IfcSIPrefix, 'TERA', INDETERMINATE) +atto = IfcSIPrefix.ATTO +centi = IfcSIPrefix.CENTI +deca = IfcSIPrefix.DECA +deci = IfcSIPrefix.DECI +exa = IfcSIPrefix.EXA +femto = IfcSIPrefix.FEMTO +giga = IfcSIPrefix.GIGA +hecto = IfcSIPrefix.HECTO +kilo = IfcSIPrefix.KILO +mega = IfcSIPrefix.MEGA +micro = IfcSIPrefix.MICRO +milli = IfcSIPrefix.MILLI +nano = IfcSIPrefix.NANO +peta = IfcSIPrefix.PETA +pico = IfcSIPrefix.PICO +tera = IfcSIPrefix.TERA IfcSIUnitName = enum_namespace() -ampere = express_getattr(IfcSIUnitName, 'AMPERE', INDETERMINATE) -becquerel = express_getattr(IfcSIUnitName, 'BECQUEREL', INDETERMINATE) -candela = express_getattr(IfcSIUnitName, 'CANDELA', INDETERMINATE) -coulomb = express_getattr(IfcSIUnitName, 'COULOMB', INDETERMINATE) -cubic_metre = express_getattr(IfcSIUnitName, 'CUBIC_METRE', INDETERMINATE) -degree_celsius = express_getattr(IfcSIUnitName, 'DEGREE_CELSIUS', INDETERMINATE) -farad = express_getattr(IfcSIUnitName, 'FARAD', INDETERMINATE) -gram = express_getattr(IfcSIUnitName, 'GRAM', INDETERMINATE) -gray = express_getattr(IfcSIUnitName, 'GRAY', INDETERMINATE) -henry = express_getattr(IfcSIUnitName, 'HENRY', INDETERMINATE) -hertz = express_getattr(IfcSIUnitName, 'HERTZ', INDETERMINATE) -joule = express_getattr(IfcSIUnitName, 'JOULE', INDETERMINATE) -kelvin = express_getattr(IfcSIUnitName, 'KELVIN', INDETERMINATE) -lumen = express_getattr(IfcSIUnitName, 'LUMEN', INDETERMINATE) -lux = express_getattr(IfcSIUnitName, 'LUX', INDETERMINATE) -metre = express_getattr(IfcSIUnitName, 'METRE', INDETERMINATE) -mole = express_getattr(IfcSIUnitName, 'MOLE', INDETERMINATE) -newton = express_getattr(IfcSIUnitName, 'NEWTON', INDETERMINATE) -ohm = express_getattr(IfcSIUnitName, 'OHM', INDETERMINATE) -pascal = express_getattr(IfcSIUnitName, 'PASCAL', INDETERMINATE) -radian = express_getattr(IfcSIUnitName, 'RADIAN', INDETERMINATE) -second = express_getattr(IfcSIUnitName, 'SECOND', INDETERMINATE) -siemens = express_getattr(IfcSIUnitName, 'SIEMENS', INDETERMINATE) -sievert = express_getattr(IfcSIUnitName, 'SIEVERT', INDETERMINATE) -square_metre = express_getattr(IfcSIUnitName, 'SQUARE_METRE', INDETERMINATE) -steradian = express_getattr(IfcSIUnitName, 'STERADIAN', INDETERMINATE) -tesla = express_getattr(IfcSIUnitName, 'TESLA', INDETERMINATE) -volt = express_getattr(IfcSIUnitName, 'VOLT', INDETERMINATE) -watt = express_getattr(IfcSIUnitName, 'WATT', INDETERMINATE) -weber = express_getattr(IfcSIUnitName, 'WEBER', INDETERMINATE) +ampere = IfcSIUnitName.AMPERE +becquerel = IfcSIUnitName.BECQUEREL +candela = IfcSIUnitName.CANDELA +coulomb = IfcSIUnitName.COULOMB +cubic_metre = IfcSIUnitName.CUBIC_METRE +degree_celsius = IfcSIUnitName.DEGREE_CELSIUS +farad = IfcSIUnitName.FARAD +gram = IfcSIUnitName.GRAM +gray = IfcSIUnitName.GRAY +henry = IfcSIUnitName.HENRY +hertz = IfcSIUnitName.HERTZ +joule = IfcSIUnitName.JOULE +kelvin = IfcSIUnitName.KELVIN +lumen = IfcSIUnitName.LUMEN +lux = IfcSIUnitName.LUX +metre = IfcSIUnitName.METRE +mole = IfcSIUnitName.MOLE +newton = IfcSIUnitName.NEWTON +ohm = IfcSIUnitName.OHM +pascal = IfcSIUnitName.PASCAL +radian = IfcSIUnitName.RADIAN +second = IfcSIUnitName.SECOND +siemens = IfcSIUnitName.SIEMENS +sievert = IfcSIUnitName.SIEVERT +square_metre = IfcSIUnitName.SQUARE_METRE +steradian = IfcSIUnitName.STERADIAN +tesla = IfcSIUnitName.TESLA +volt = IfcSIUnitName.VOLT +watt = IfcSIUnitName.WATT +weber = IfcSIUnitName.WEBER IfcSanitaryTerminalTypeEnum = enum_namespace() -bath = express_getattr(IfcSanitaryTerminalTypeEnum, 'BATH', INDETERMINATE) -bidet = express_getattr(IfcSanitaryTerminalTypeEnum, 'BIDET', INDETERMINATE) -cistern = express_getattr(IfcSanitaryTerminalTypeEnum, 'CISTERN', INDETERMINATE) -sanitaryfountain = express_getattr(IfcSanitaryTerminalTypeEnum, 'SANITARYFOUNTAIN', INDETERMINATE) -shower = express_getattr(IfcSanitaryTerminalTypeEnum, 'SHOWER', INDETERMINATE) -sink = express_getattr(IfcSanitaryTerminalTypeEnum, 'SINK', INDETERMINATE) -toiletpan = express_getattr(IfcSanitaryTerminalTypeEnum, 'TOILETPAN', INDETERMINATE) -urinal = express_getattr(IfcSanitaryTerminalTypeEnum, 'URINAL', INDETERMINATE) -washhandbasin = express_getattr(IfcSanitaryTerminalTypeEnum, 'WASHHANDBASIN', INDETERMINATE) -wcseat = express_getattr(IfcSanitaryTerminalTypeEnum, 'WCSEAT', INDETERMINATE) -userdefined = express_getattr(IfcSanitaryTerminalTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSanitaryTerminalTypeEnum, 'NOTDEFINED', INDETERMINATE) +bath = IfcSanitaryTerminalTypeEnum.BATH +bidet = IfcSanitaryTerminalTypeEnum.BIDET +cistern = IfcSanitaryTerminalTypeEnum.CISTERN +sanitaryfountain = IfcSanitaryTerminalTypeEnum.SANITARYFOUNTAIN +shower = IfcSanitaryTerminalTypeEnum.SHOWER +sink = IfcSanitaryTerminalTypeEnum.SINK +toiletpan = IfcSanitaryTerminalTypeEnum.TOILETPAN +urinal = IfcSanitaryTerminalTypeEnum.URINAL +washhandbasin = IfcSanitaryTerminalTypeEnum.WASHHANDBASIN +wcseat = IfcSanitaryTerminalTypeEnum.WCSEAT +userdefined = IfcSanitaryTerminalTypeEnum.USERDEFINED +notdefined = IfcSanitaryTerminalTypeEnum.NOTDEFINED IfcSectionTypeEnum = enum_namespace() -tapered = express_getattr(IfcSectionTypeEnum, 'TAPERED', INDETERMINATE) -uniform = express_getattr(IfcSectionTypeEnum, 'UNIFORM', INDETERMINATE) +tapered = IfcSectionTypeEnum.TAPERED +uniform = IfcSectionTypeEnum.UNIFORM IfcSensorTypeEnum = enum_namespace() -co2sensor = express_getattr(IfcSensorTypeEnum, 'CO2SENSOR', INDETERMINATE) -conductancesensor = express_getattr(IfcSensorTypeEnum, 'CONDUCTANCESENSOR', INDETERMINATE) -contactsensor = express_getattr(IfcSensorTypeEnum, 'CONTACTSENSOR', INDETERMINATE) -cosensor = express_getattr(IfcSensorTypeEnum, 'COSENSOR', INDETERMINATE) -earthquakesensor = express_getattr(IfcSensorTypeEnum, 'EARTHQUAKESENSOR', INDETERMINATE) -firesensor = express_getattr(IfcSensorTypeEnum, 'FIRESENSOR', INDETERMINATE) -flowsensor = express_getattr(IfcSensorTypeEnum, 'FLOWSENSOR', INDETERMINATE) -foreignobjectdetectionsensor = express_getattr(IfcSensorTypeEnum, 'FOREIGNOBJECTDETECTIONSENSOR', INDETERMINATE) -frostsensor = express_getattr(IfcSensorTypeEnum, 'FROSTSENSOR', INDETERMINATE) -gassensor = express_getattr(IfcSensorTypeEnum, 'GASSENSOR', INDETERMINATE) -heatsensor = express_getattr(IfcSensorTypeEnum, 'HEATSENSOR', INDETERMINATE) -humiditysensor = express_getattr(IfcSensorTypeEnum, 'HUMIDITYSENSOR', INDETERMINATE) -identifiersensor = express_getattr(IfcSensorTypeEnum, 'IDENTIFIERSENSOR', INDETERMINATE) -ionconcentrationsensor = express_getattr(IfcSensorTypeEnum, 'IONCONCENTRATIONSENSOR', INDETERMINATE) -levelsensor = express_getattr(IfcSensorTypeEnum, 'LEVELSENSOR', INDETERMINATE) -lightsensor = express_getattr(IfcSensorTypeEnum, 'LIGHTSENSOR', INDETERMINATE) -moisturesensor = express_getattr(IfcSensorTypeEnum, 'MOISTURESENSOR', INDETERMINATE) -movementsensor = express_getattr(IfcSensorTypeEnum, 'MOVEMENTSENSOR', INDETERMINATE) -obstaclesensor = express_getattr(IfcSensorTypeEnum, 'OBSTACLESENSOR', INDETERMINATE) -phsensor = express_getattr(IfcSensorTypeEnum, 'PHSENSOR', INDETERMINATE) -pressuresensor = express_getattr(IfcSensorTypeEnum, 'PRESSURESENSOR', INDETERMINATE) -radiationsensor = express_getattr(IfcSensorTypeEnum, 'RADIATIONSENSOR', INDETERMINATE) -radioactivitysensor = express_getattr(IfcSensorTypeEnum, 'RADIOACTIVITYSENSOR', INDETERMINATE) -rainsensor = express_getattr(IfcSensorTypeEnum, 'RAINSENSOR', INDETERMINATE) -smokesensor = express_getattr(IfcSensorTypeEnum, 'SMOKESENSOR', INDETERMINATE) -snowdepthsensor = express_getattr(IfcSensorTypeEnum, 'SNOWDEPTHSENSOR', INDETERMINATE) -soundsensor = express_getattr(IfcSensorTypeEnum, 'SOUNDSENSOR', INDETERMINATE) -temperaturesensor = express_getattr(IfcSensorTypeEnum, 'TEMPERATURESENSOR', INDETERMINATE) -trainsensor = express_getattr(IfcSensorTypeEnum, 'TRAINSENSOR', INDETERMINATE) -turnoutclosuresensor = express_getattr(IfcSensorTypeEnum, 'TURNOUTCLOSURESENSOR', INDETERMINATE) -wheelsensor = express_getattr(IfcSensorTypeEnum, 'WHEELSENSOR', INDETERMINATE) -windsensor = express_getattr(IfcSensorTypeEnum, 'WINDSENSOR', INDETERMINATE) -userdefined = express_getattr(IfcSensorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSensorTypeEnum, 'NOTDEFINED', INDETERMINATE) +co2sensor = IfcSensorTypeEnum.CO2SENSOR +conductancesensor = IfcSensorTypeEnum.CONDUCTANCESENSOR +contactsensor = IfcSensorTypeEnum.CONTACTSENSOR +cosensor = IfcSensorTypeEnum.COSENSOR +earthquakesensor = IfcSensorTypeEnum.EARTHQUAKESENSOR +firesensor = IfcSensorTypeEnum.FIRESENSOR +flowsensor = IfcSensorTypeEnum.FLOWSENSOR +foreignobjectdetectionsensor = IfcSensorTypeEnum.FOREIGNOBJECTDETECTIONSENSOR +frostsensor = IfcSensorTypeEnum.FROSTSENSOR +gassensor = IfcSensorTypeEnum.GASSENSOR +heatsensor = IfcSensorTypeEnum.HEATSENSOR +humiditysensor = IfcSensorTypeEnum.HUMIDITYSENSOR +identifiersensor = IfcSensorTypeEnum.IDENTIFIERSENSOR +ionconcentrationsensor = IfcSensorTypeEnum.IONCONCENTRATIONSENSOR +levelsensor = IfcSensorTypeEnum.LEVELSENSOR +lightsensor = IfcSensorTypeEnum.LIGHTSENSOR +moisturesensor = IfcSensorTypeEnum.MOISTURESENSOR +movementsensor = IfcSensorTypeEnum.MOVEMENTSENSOR +obstaclesensor = IfcSensorTypeEnum.OBSTACLESENSOR +phsensor = IfcSensorTypeEnum.PHSENSOR +pressuresensor = IfcSensorTypeEnum.PRESSURESENSOR +radiationsensor = IfcSensorTypeEnum.RADIATIONSENSOR +radioactivitysensor = IfcSensorTypeEnum.RADIOACTIVITYSENSOR +rainsensor = IfcSensorTypeEnum.RAINSENSOR +smokesensor = IfcSensorTypeEnum.SMOKESENSOR +snowdepthsensor = IfcSensorTypeEnum.SNOWDEPTHSENSOR +soundsensor = IfcSensorTypeEnum.SOUNDSENSOR +temperaturesensor = IfcSensorTypeEnum.TEMPERATURESENSOR +trainsensor = IfcSensorTypeEnum.TRAINSENSOR +turnoutclosuresensor = IfcSensorTypeEnum.TURNOUTCLOSURESENSOR +wheelsensor = IfcSensorTypeEnum.WHEELSENSOR +windsensor = IfcSensorTypeEnum.WINDSENSOR +userdefined = IfcSensorTypeEnum.USERDEFINED +notdefined = IfcSensorTypeEnum.NOTDEFINED IfcSequenceEnum = enum_namespace() -finish_finish = express_getattr(IfcSequenceEnum, 'FINISH_FINISH', INDETERMINATE) -finish_start = express_getattr(IfcSequenceEnum, 'FINISH_START', INDETERMINATE) -start_finish = express_getattr(IfcSequenceEnum, 'START_FINISH', INDETERMINATE) -start_start = express_getattr(IfcSequenceEnum, 'START_START', INDETERMINATE) -userdefined = express_getattr(IfcSequenceEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSequenceEnum, 'NOTDEFINED', INDETERMINATE) +finish_finish = IfcSequenceEnum.FINISH_FINISH +finish_start = IfcSequenceEnum.FINISH_START +start_finish = IfcSequenceEnum.START_FINISH +start_start = IfcSequenceEnum.START_START +userdefined = IfcSequenceEnum.USERDEFINED +notdefined = IfcSequenceEnum.NOTDEFINED IfcShadingDeviceTypeEnum = enum_namespace() -awning = express_getattr(IfcShadingDeviceTypeEnum, 'AWNING', INDETERMINATE) -jalousie = express_getattr(IfcShadingDeviceTypeEnum, 'JALOUSIE', INDETERMINATE) -shutter = express_getattr(IfcShadingDeviceTypeEnum, 'SHUTTER', INDETERMINATE) -userdefined = express_getattr(IfcShadingDeviceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcShadingDeviceTypeEnum, 'NOTDEFINED', INDETERMINATE) +awning = IfcShadingDeviceTypeEnum.AWNING +jalousie = IfcShadingDeviceTypeEnum.JALOUSIE +shutter = IfcShadingDeviceTypeEnum.SHUTTER +userdefined = IfcShadingDeviceTypeEnum.USERDEFINED +notdefined = IfcShadingDeviceTypeEnum.NOTDEFINED IfcSignTypeEnum = enum_namespace() -marker = express_getattr(IfcSignTypeEnum, 'MARKER', INDETERMINATE) -mirror = express_getattr(IfcSignTypeEnum, 'MIRROR', INDETERMINATE) -pictoral = express_getattr(IfcSignTypeEnum, 'PICTORAL', INDETERMINATE) -userdefined = express_getattr(IfcSignTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSignTypeEnum, 'NOTDEFINED', INDETERMINATE) +marker = IfcSignTypeEnum.MARKER +mirror = IfcSignTypeEnum.MIRROR +pictoral = IfcSignTypeEnum.PICTORAL +userdefined = IfcSignTypeEnum.USERDEFINED +notdefined = IfcSignTypeEnum.NOTDEFINED IfcSignalTypeEnum = enum_namespace() -audio = express_getattr(IfcSignalTypeEnum, 'AUDIO', INDETERMINATE) -mixed = express_getattr(IfcSignalTypeEnum, 'MIXED', INDETERMINATE) -visual = express_getattr(IfcSignalTypeEnum, 'VISUAL', INDETERMINATE) -userdefined = express_getattr(IfcSignalTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSignalTypeEnum, 'NOTDEFINED', INDETERMINATE) +audio = IfcSignalTypeEnum.AUDIO +mixed = IfcSignalTypeEnum.MIXED +visual = IfcSignalTypeEnum.VISUAL +userdefined = IfcSignalTypeEnum.USERDEFINED +notdefined = IfcSignalTypeEnum.NOTDEFINED IfcSimplePropertyTemplateTypeEnum = enum_namespace() -p_boundedvalue = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'P_BOUNDEDVALUE', INDETERMINATE) -p_enumeratedvalue = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'P_ENUMERATEDVALUE', INDETERMINATE) -p_listvalue = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'P_LISTVALUE', INDETERMINATE) -p_referencevalue = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'P_REFERENCEVALUE', INDETERMINATE) -p_singlevalue = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'P_SINGLEVALUE', INDETERMINATE) -p_tablevalue = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'P_TABLEVALUE', INDETERMINATE) -q_area = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'Q_AREA', INDETERMINATE) -q_count = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'Q_COUNT', INDETERMINATE) -q_length = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'Q_LENGTH', INDETERMINATE) -q_number = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'Q_NUMBER', INDETERMINATE) -q_time = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'Q_TIME', INDETERMINATE) -q_volume = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'Q_VOLUME', INDETERMINATE) -q_weight = express_getattr(IfcSimplePropertyTemplateTypeEnum, 'Q_WEIGHT', INDETERMINATE) +p_boundedvalue = IfcSimplePropertyTemplateTypeEnum.P_BOUNDEDVALUE +p_enumeratedvalue = IfcSimplePropertyTemplateTypeEnum.P_ENUMERATEDVALUE +p_listvalue = IfcSimplePropertyTemplateTypeEnum.P_LISTVALUE +p_referencevalue = IfcSimplePropertyTemplateTypeEnum.P_REFERENCEVALUE +p_singlevalue = IfcSimplePropertyTemplateTypeEnum.P_SINGLEVALUE +p_tablevalue = IfcSimplePropertyTemplateTypeEnum.P_TABLEVALUE +q_area = IfcSimplePropertyTemplateTypeEnum.Q_AREA +q_count = IfcSimplePropertyTemplateTypeEnum.Q_COUNT +q_length = IfcSimplePropertyTemplateTypeEnum.Q_LENGTH +q_number = IfcSimplePropertyTemplateTypeEnum.Q_NUMBER +q_time = IfcSimplePropertyTemplateTypeEnum.Q_TIME +q_volume = IfcSimplePropertyTemplateTypeEnum.Q_VOLUME +q_weight = IfcSimplePropertyTemplateTypeEnum.Q_WEIGHT IfcSlabTypeEnum = enum_namespace() -approach_slab = express_getattr(IfcSlabTypeEnum, 'APPROACH_SLAB', INDETERMINATE) -baseslab = express_getattr(IfcSlabTypeEnum, 'BASESLAB', INDETERMINATE) -floor = express_getattr(IfcSlabTypeEnum, 'FLOOR', INDETERMINATE) -landing = express_getattr(IfcSlabTypeEnum, 'LANDING', INDETERMINATE) -paving = express_getattr(IfcSlabTypeEnum, 'PAVING', INDETERMINATE) -roof = express_getattr(IfcSlabTypeEnum, 'ROOF', INDETERMINATE) -sidewalk = express_getattr(IfcSlabTypeEnum, 'SIDEWALK', INDETERMINATE) -trackslab = express_getattr(IfcSlabTypeEnum, 'TRACKSLAB', INDETERMINATE) -wearing = express_getattr(IfcSlabTypeEnum, 'WEARING', INDETERMINATE) -userdefined = express_getattr(IfcSlabTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSlabTypeEnum, 'NOTDEFINED', INDETERMINATE) +approach_slab = IfcSlabTypeEnum.APPROACH_SLAB +baseslab = IfcSlabTypeEnum.BASESLAB +floor = IfcSlabTypeEnum.FLOOR +landing = IfcSlabTypeEnum.LANDING +paving = IfcSlabTypeEnum.PAVING +roof = IfcSlabTypeEnum.ROOF +sidewalk = IfcSlabTypeEnum.SIDEWALK +trackslab = IfcSlabTypeEnum.TRACKSLAB +wearing = IfcSlabTypeEnum.WEARING +userdefined = IfcSlabTypeEnum.USERDEFINED +notdefined = IfcSlabTypeEnum.NOTDEFINED IfcSolarDeviceTypeEnum = enum_namespace() -solarcollector = express_getattr(IfcSolarDeviceTypeEnum, 'SOLARCOLLECTOR', INDETERMINATE) -solarpanel = express_getattr(IfcSolarDeviceTypeEnum, 'SOLARPANEL', INDETERMINATE) -userdefined = express_getattr(IfcSolarDeviceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSolarDeviceTypeEnum, 'NOTDEFINED', INDETERMINATE) +solarcollector = IfcSolarDeviceTypeEnum.SOLARCOLLECTOR +solarpanel = IfcSolarDeviceTypeEnum.SOLARPANEL +userdefined = IfcSolarDeviceTypeEnum.USERDEFINED +notdefined = IfcSolarDeviceTypeEnum.NOTDEFINED IfcSpaceHeaterTypeEnum = enum_namespace() -convector = express_getattr(IfcSpaceHeaterTypeEnum, 'CONVECTOR', INDETERMINATE) -radiator = express_getattr(IfcSpaceHeaterTypeEnum, 'RADIATOR', INDETERMINATE) -userdefined = express_getattr(IfcSpaceHeaterTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSpaceHeaterTypeEnum, 'NOTDEFINED', INDETERMINATE) +convector = IfcSpaceHeaterTypeEnum.CONVECTOR +radiator = IfcSpaceHeaterTypeEnum.RADIATOR +userdefined = IfcSpaceHeaterTypeEnum.USERDEFINED +notdefined = IfcSpaceHeaterTypeEnum.NOTDEFINED IfcSpaceTypeEnum = enum_namespace() -berth = express_getattr(IfcSpaceTypeEnum, 'BERTH', INDETERMINATE) -external = express_getattr(IfcSpaceTypeEnum, 'EXTERNAL', INDETERMINATE) -gfa = express_getattr(IfcSpaceTypeEnum, 'GFA', INDETERMINATE) -internal = express_getattr(IfcSpaceTypeEnum, 'INTERNAL', INDETERMINATE) -parking = express_getattr(IfcSpaceTypeEnum, 'PARKING', INDETERMINATE) -space = express_getattr(IfcSpaceTypeEnum, 'SPACE', INDETERMINATE) -userdefined = express_getattr(IfcSpaceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSpaceTypeEnum, 'NOTDEFINED', INDETERMINATE) +berth = IfcSpaceTypeEnum.BERTH +external = IfcSpaceTypeEnum.EXTERNAL +gfa = IfcSpaceTypeEnum.GFA +internal = IfcSpaceTypeEnum.INTERNAL +parking = IfcSpaceTypeEnum.PARKING +space = IfcSpaceTypeEnum.SPACE +userdefined = IfcSpaceTypeEnum.USERDEFINED +notdefined = IfcSpaceTypeEnum.NOTDEFINED IfcSpatialZoneTypeEnum = enum_namespace() -construction = express_getattr(IfcSpatialZoneTypeEnum, 'CONSTRUCTION', INDETERMINATE) -firesafety = express_getattr(IfcSpatialZoneTypeEnum, 'FIRESAFETY', INDETERMINATE) -interference = express_getattr(IfcSpatialZoneTypeEnum, 'INTERFERENCE', INDETERMINATE) -lighting = express_getattr(IfcSpatialZoneTypeEnum, 'LIGHTING', INDETERMINATE) -occupancy = express_getattr(IfcSpatialZoneTypeEnum, 'OCCUPANCY', INDETERMINATE) -reservation = express_getattr(IfcSpatialZoneTypeEnum, 'RESERVATION', INDETERMINATE) -security = express_getattr(IfcSpatialZoneTypeEnum, 'SECURITY', INDETERMINATE) -thermal = express_getattr(IfcSpatialZoneTypeEnum, 'THERMAL', INDETERMINATE) -transport = express_getattr(IfcSpatialZoneTypeEnum, 'TRANSPORT', INDETERMINATE) -ventilation = express_getattr(IfcSpatialZoneTypeEnum, 'VENTILATION', INDETERMINATE) -userdefined = express_getattr(IfcSpatialZoneTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSpatialZoneTypeEnum, 'NOTDEFINED', INDETERMINATE) +construction = IfcSpatialZoneTypeEnum.CONSTRUCTION +firesafety = IfcSpatialZoneTypeEnum.FIRESAFETY +interference = IfcSpatialZoneTypeEnum.INTERFERENCE +lighting = IfcSpatialZoneTypeEnum.LIGHTING +occupancy = IfcSpatialZoneTypeEnum.OCCUPANCY +reservation = IfcSpatialZoneTypeEnum.RESERVATION +security = IfcSpatialZoneTypeEnum.SECURITY +thermal = IfcSpatialZoneTypeEnum.THERMAL +transport = IfcSpatialZoneTypeEnum.TRANSPORT +ventilation = IfcSpatialZoneTypeEnum.VENTILATION +userdefined = IfcSpatialZoneTypeEnum.USERDEFINED +notdefined = IfcSpatialZoneTypeEnum.NOTDEFINED IfcStackTerminalTypeEnum = enum_namespace() -birdcage = express_getattr(IfcStackTerminalTypeEnum, 'BIRDCAGE', INDETERMINATE) -cowl = express_getattr(IfcStackTerminalTypeEnum, 'COWL', INDETERMINATE) -rainwaterhopper = express_getattr(IfcStackTerminalTypeEnum, 'RAINWATERHOPPER', INDETERMINATE) -userdefined = express_getattr(IfcStackTerminalTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcStackTerminalTypeEnum, 'NOTDEFINED', INDETERMINATE) +birdcage = IfcStackTerminalTypeEnum.BIRDCAGE +cowl = IfcStackTerminalTypeEnum.COWL +rainwaterhopper = IfcStackTerminalTypeEnum.RAINWATERHOPPER +userdefined = IfcStackTerminalTypeEnum.USERDEFINED +notdefined = IfcStackTerminalTypeEnum.NOTDEFINED IfcStairFlightTypeEnum = enum_namespace() -curved = express_getattr(IfcStairFlightTypeEnum, 'CURVED', INDETERMINATE) -freeform = express_getattr(IfcStairFlightTypeEnum, 'FREEFORM', INDETERMINATE) -spiral = express_getattr(IfcStairFlightTypeEnum, 'SPIRAL', INDETERMINATE) -straight = express_getattr(IfcStairFlightTypeEnum, 'STRAIGHT', INDETERMINATE) -winder = express_getattr(IfcStairFlightTypeEnum, 'WINDER', INDETERMINATE) -userdefined = express_getattr(IfcStairFlightTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcStairFlightTypeEnum, 'NOTDEFINED', INDETERMINATE) +curved = IfcStairFlightTypeEnum.CURVED +freeform = IfcStairFlightTypeEnum.FREEFORM +spiral = IfcStairFlightTypeEnum.SPIRAL +straight = IfcStairFlightTypeEnum.STRAIGHT +winder = IfcStairFlightTypeEnum.WINDER +userdefined = IfcStairFlightTypeEnum.USERDEFINED +notdefined = IfcStairFlightTypeEnum.NOTDEFINED IfcStairTypeEnum = enum_namespace() -curved_run_stair = express_getattr(IfcStairTypeEnum, 'CURVED_RUN_STAIR', INDETERMINATE) -double_return_stair = express_getattr(IfcStairTypeEnum, 'DOUBLE_RETURN_STAIR', INDETERMINATE) -half_turn_stair = express_getattr(IfcStairTypeEnum, 'HALF_TURN_STAIR', INDETERMINATE) -half_winding_stair = express_getattr(IfcStairTypeEnum, 'HALF_WINDING_STAIR', INDETERMINATE) -ladder = express_getattr(IfcStairTypeEnum, 'LADDER', INDETERMINATE) -quarter_turn_stair = express_getattr(IfcStairTypeEnum, 'QUARTER_TURN_STAIR', INDETERMINATE) -quarter_winding_stair = express_getattr(IfcStairTypeEnum, 'QUARTER_WINDING_STAIR', INDETERMINATE) -spiral_stair = express_getattr(IfcStairTypeEnum, 'SPIRAL_STAIR', INDETERMINATE) -straight_run_stair = express_getattr(IfcStairTypeEnum, 'STRAIGHT_RUN_STAIR', INDETERMINATE) -three_quarter_turn_stair = express_getattr(IfcStairTypeEnum, 'THREE_QUARTER_TURN_STAIR', INDETERMINATE) -three_quarter_winding_stair = express_getattr(IfcStairTypeEnum, 'THREE_QUARTER_WINDING_STAIR', INDETERMINATE) -two_curved_run_stair = express_getattr(IfcStairTypeEnum, 'TWO_CURVED_RUN_STAIR', INDETERMINATE) -two_quarter_turn_stair = express_getattr(IfcStairTypeEnum, 'TWO_QUARTER_TURN_STAIR', INDETERMINATE) -two_quarter_winding_stair = express_getattr(IfcStairTypeEnum, 'TWO_QUARTER_WINDING_STAIR', INDETERMINATE) -two_straight_run_stair = express_getattr(IfcStairTypeEnum, 'TWO_STRAIGHT_RUN_STAIR', INDETERMINATE) -userdefined = express_getattr(IfcStairTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcStairTypeEnum, 'NOTDEFINED', INDETERMINATE) +curved_run_stair = IfcStairTypeEnum.CURVED_RUN_STAIR +double_return_stair = IfcStairTypeEnum.DOUBLE_RETURN_STAIR +half_turn_stair = IfcStairTypeEnum.HALF_TURN_STAIR +half_winding_stair = IfcStairTypeEnum.HALF_WINDING_STAIR +ladder = IfcStairTypeEnum.LADDER +quarter_turn_stair = IfcStairTypeEnum.QUARTER_TURN_STAIR +quarter_winding_stair = IfcStairTypeEnum.QUARTER_WINDING_STAIR +spiral_stair = IfcStairTypeEnum.SPIRAL_STAIR +straight_run_stair = IfcStairTypeEnum.STRAIGHT_RUN_STAIR +three_quarter_turn_stair = IfcStairTypeEnum.THREE_QUARTER_TURN_STAIR +three_quarter_winding_stair = IfcStairTypeEnum.THREE_QUARTER_WINDING_STAIR +two_curved_run_stair = IfcStairTypeEnum.TWO_CURVED_RUN_STAIR +two_quarter_turn_stair = IfcStairTypeEnum.TWO_QUARTER_TURN_STAIR +two_quarter_winding_stair = IfcStairTypeEnum.TWO_QUARTER_WINDING_STAIR +two_straight_run_stair = IfcStairTypeEnum.TWO_STRAIGHT_RUN_STAIR +userdefined = IfcStairTypeEnum.USERDEFINED +notdefined = IfcStairTypeEnum.NOTDEFINED IfcStateEnum = enum_namespace() -locked = express_getattr(IfcStateEnum, 'LOCKED', INDETERMINATE) -readonly = express_getattr(IfcStateEnum, 'READONLY', INDETERMINATE) -readonlylocked = express_getattr(IfcStateEnum, 'READONLYLOCKED', INDETERMINATE) -readwrite = express_getattr(IfcStateEnum, 'READWRITE', INDETERMINATE) -readwritelocked = express_getattr(IfcStateEnum, 'READWRITELOCKED', INDETERMINATE) +locked = IfcStateEnum.LOCKED +readonly = IfcStateEnum.READONLY +readonlylocked = IfcStateEnum.READONLYLOCKED +readwrite = IfcStateEnum.READWRITE +readwritelocked = IfcStateEnum.READWRITELOCKED IfcStructuralCurveActivityTypeEnum = enum_namespace() -const = express_getattr(IfcStructuralCurveActivityTypeEnum, 'CONST', INDETERMINATE) -discrete = express_getattr(IfcStructuralCurveActivityTypeEnum, 'DISCRETE', INDETERMINATE) -equidistant = express_getattr(IfcStructuralCurveActivityTypeEnum, 'EQUIDISTANT', INDETERMINATE) -linear = express_getattr(IfcStructuralCurveActivityTypeEnum, 'LINEAR', INDETERMINATE) -parabola = express_getattr(IfcStructuralCurveActivityTypeEnum, 'PARABOLA', INDETERMINATE) -polygonal = express_getattr(IfcStructuralCurveActivityTypeEnum, 'POLYGONAL', INDETERMINATE) -sinus = express_getattr(IfcStructuralCurveActivityTypeEnum, 'SINUS', INDETERMINATE) -userdefined = express_getattr(IfcStructuralCurveActivityTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcStructuralCurveActivityTypeEnum, 'NOTDEFINED', INDETERMINATE) +const = IfcStructuralCurveActivityTypeEnum.CONST +discrete = IfcStructuralCurveActivityTypeEnum.DISCRETE +equidistant = IfcStructuralCurveActivityTypeEnum.EQUIDISTANT +linear = IfcStructuralCurveActivityTypeEnum.LINEAR +parabola = IfcStructuralCurveActivityTypeEnum.PARABOLA +polygonal = IfcStructuralCurveActivityTypeEnum.POLYGONAL +sinus = IfcStructuralCurveActivityTypeEnum.SINUS +userdefined = IfcStructuralCurveActivityTypeEnum.USERDEFINED +notdefined = IfcStructuralCurveActivityTypeEnum.NOTDEFINED IfcStructuralCurveMemberTypeEnum = enum_namespace() -cable = express_getattr(IfcStructuralCurveMemberTypeEnum, 'CABLE', INDETERMINATE) -compression_member = express_getattr(IfcStructuralCurveMemberTypeEnum, 'COMPRESSION_MEMBER', INDETERMINATE) -pin_joined_member = express_getattr(IfcStructuralCurveMemberTypeEnum, 'PIN_JOINED_MEMBER', INDETERMINATE) -rigid_joined_member = express_getattr(IfcStructuralCurveMemberTypeEnum, 'RIGID_JOINED_MEMBER', INDETERMINATE) -tension_member = express_getattr(IfcStructuralCurveMemberTypeEnum, 'TENSION_MEMBER', INDETERMINATE) -userdefined = express_getattr(IfcStructuralCurveMemberTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcStructuralCurveMemberTypeEnum, 'NOTDEFINED', INDETERMINATE) +cable = IfcStructuralCurveMemberTypeEnum.CABLE +compression_member = IfcStructuralCurveMemberTypeEnum.COMPRESSION_MEMBER +pin_joined_member = IfcStructuralCurveMemberTypeEnum.PIN_JOINED_MEMBER +rigid_joined_member = IfcStructuralCurveMemberTypeEnum.RIGID_JOINED_MEMBER +tension_member = IfcStructuralCurveMemberTypeEnum.TENSION_MEMBER +userdefined = IfcStructuralCurveMemberTypeEnum.USERDEFINED +notdefined = IfcStructuralCurveMemberTypeEnum.NOTDEFINED IfcStructuralSurfaceActivityTypeEnum = enum_namespace() -bilinear = express_getattr(IfcStructuralSurfaceActivityTypeEnum, 'BILINEAR', INDETERMINATE) -const = express_getattr(IfcStructuralSurfaceActivityTypeEnum, 'CONST', INDETERMINATE) -discrete = express_getattr(IfcStructuralSurfaceActivityTypeEnum, 'DISCRETE', INDETERMINATE) -isocontour = express_getattr(IfcStructuralSurfaceActivityTypeEnum, 'ISOCONTOUR', INDETERMINATE) -userdefined = express_getattr(IfcStructuralSurfaceActivityTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcStructuralSurfaceActivityTypeEnum, 'NOTDEFINED', INDETERMINATE) +bilinear = IfcStructuralSurfaceActivityTypeEnum.BILINEAR +const = IfcStructuralSurfaceActivityTypeEnum.CONST +discrete = IfcStructuralSurfaceActivityTypeEnum.DISCRETE +isocontour = IfcStructuralSurfaceActivityTypeEnum.ISOCONTOUR +userdefined = IfcStructuralSurfaceActivityTypeEnum.USERDEFINED +notdefined = IfcStructuralSurfaceActivityTypeEnum.NOTDEFINED IfcStructuralSurfaceMemberTypeEnum = enum_namespace() -bending_element = express_getattr(IfcStructuralSurfaceMemberTypeEnum, 'BENDING_ELEMENT', INDETERMINATE) -membrane_element = express_getattr(IfcStructuralSurfaceMemberTypeEnum, 'MEMBRANE_ELEMENT', INDETERMINATE) -shell = express_getattr(IfcStructuralSurfaceMemberTypeEnum, 'SHELL', INDETERMINATE) -userdefined = express_getattr(IfcStructuralSurfaceMemberTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcStructuralSurfaceMemberTypeEnum, 'NOTDEFINED', INDETERMINATE) +bending_element = IfcStructuralSurfaceMemberTypeEnum.BENDING_ELEMENT +membrane_element = IfcStructuralSurfaceMemberTypeEnum.MEMBRANE_ELEMENT +shell = IfcStructuralSurfaceMemberTypeEnum.SHELL +userdefined = IfcStructuralSurfaceMemberTypeEnum.USERDEFINED +notdefined = IfcStructuralSurfaceMemberTypeEnum.NOTDEFINED IfcSubContractResourceTypeEnum = enum_namespace() -purchase = express_getattr(IfcSubContractResourceTypeEnum, 'PURCHASE', INDETERMINATE) -work = express_getattr(IfcSubContractResourceTypeEnum, 'WORK', INDETERMINATE) -userdefined = express_getattr(IfcSubContractResourceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSubContractResourceTypeEnum, 'NOTDEFINED', INDETERMINATE) +purchase = IfcSubContractResourceTypeEnum.PURCHASE +work = IfcSubContractResourceTypeEnum.WORK +userdefined = IfcSubContractResourceTypeEnum.USERDEFINED +notdefined = IfcSubContractResourceTypeEnum.NOTDEFINED IfcSurfaceFeatureTypeEnum = enum_namespace() -defect = express_getattr(IfcSurfaceFeatureTypeEnum, 'DEFECT', INDETERMINATE) -hatchmarking = express_getattr(IfcSurfaceFeatureTypeEnum, 'HATCHMARKING', INDETERMINATE) -linemarking = express_getattr(IfcSurfaceFeatureTypeEnum, 'LINEMARKING', INDETERMINATE) -mark = express_getattr(IfcSurfaceFeatureTypeEnum, 'MARK', INDETERMINATE) -nonskidsurfacing = express_getattr(IfcSurfaceFeatureTypeEnum, 'NONSKIDSURFACING', INDETERMINATE) -pavementsurfacemarking = express_getattr(IfcSurfaceFeatureTypeEnum, 'PAVEMENTSURFACEMARKING', INDETERMINATE) -rumblestrip = express_getattr(IfcSurfaceFeatureTypeEnum, 'RUMBLESTRIP', INDETERMINATE) -symbolmarking = express_getattr(IfcSurfaceFeatureTypeEnum, 'SYMBOLMARKING', INDETERMINATE) -tag = express_getattr(IfcSurfaceFeatureTypeEnum, 'TAG', INDETERMINATE) -transverserumblestrip = express_getattr(IfcSurfaceFeatureTypeEnum, 'TRANSVERSERUMBLESTRIP', INDETERMINATE) -treatment = express_getattr(IfcSurfaceFeatureTypeEnum, 'TREATMENT', INDETERMINATE) -userdefined = express_getattr(IfcSurfaceFeatureTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSurfaceFeatureTypeEnum, 'NOTDEFINED', INDETERMINATE) +defect = IfcSurfaceFeatureTypeEnum.DEFECT +hatchmarking = IfcSurfaceFeatureTypeEnum.HATCHMARKING +linemarking = IfcSurfaceFeatureTypeEnum.LINEMARKING +mark = IfcSurfaceFeatureTypeEnum.MARK +nonskidsurfacing = IfcSurfaceFeatureTypeEnum.NONSKIDSURFACING +pavementsurfacemarking = IfcSurfaceFeatureTypeEnum.PAVEMENTSURFACEMARKING +rumblestrip = IfcSurfaceFeatureTypeEnum.RUMBLESTRIP +symbolmarking = IfcSurfaceFeatureTypeEnum.SYMBOLMARKING +tag = IfcSurfaceFeatureTypeEnum.TAG +transverserumblestrip = IfcSurfaceFeatureTypeEnum.TRANSVERSERUMBLESTRIP +treatment = IfcSurfaceFeatureTypeEnum.TREATMENT +userdefined = IfcSurfaceFeatureTypeEnum.USERDEFINED +notdefined = IfcSurfaceFeatureTypeEnum.NOTDEFINED IfcSurfaceSide = enum_namespace() -both = express_getattr(IfcSurfaceSide, 'BOTH', INDETERMINATE) -negative = express_getattr(IfcSurfaceSide, 'NEGATIVE', INDETERMINATE) -positive = express_getattr(IfcSurfaceSide, 'POSITIVE', INDETERMINATE) +both = IfcSurfaceSide.BOTH +negative = IfcSurfaceSide.NEGATIVE +positive = IfcSurfaceSide.POSITIVE IfcSwitchingDeviceTypeEnum = enum_namespace() -contactor = express_getattr(IfcSwitchingDeviceTypeEnum, 'CONTACTOR', INDETERMINATE) -dimmerswitch = express_getattr(IfcSwitchingDeviceTypeEnum, 'DIMMERSWITCH', INDETERMINATE) -emergencystop = express_getattr(IfcSwitchingDeviceTypeEnum, 'EMERGENCYSTOP', INDETERMINATE) -keypad = express_getattr(IfcSwitchingDeviceTypeEnum, 'KEYPAD', INDETERMINATE) -momentaryswitch = express_getattr(IfcSwitchingDeviceTypeEnum, 'MOMENTARYSWITCH', INDETERMINATE) -relay = express_getattr(IfcSwitchingDeviceTypeEnum, 'RELAY', INDETERMINATE) -selectorswitch = express_getattr(IfcSwitchingDeviceTypeEnum, 'SELECTORSWITCH', INDETERMINATE) -starter = express_getattr(IfcSwitchingDeviceTypeEnum, 'STARTER', INDETERMINATE) -start_and_stop_equipment = express_getattr(IfcSwitchingDeviceTypeEnum, 'START_AND_STOP_EQUIPMENT', INDETERMINATE) -switchdisconnector = express_getattr(IfcSwitchingDeviceTypeEnum, 'SWITCHDISCONNECTOR', INDETERMINATE) -toggleswitch = express_getattr(IfcSwitchingDeviceTypeEnum, 'TOGGLESWITCH', INDETERMINATE) -userdefined = express_getattr(IfcSwitchingDeviceTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSwitchingDeviceTypeEnum, 'NOTDEFINED', INDETERMINATE) +contactor = IfcSwitchingDeviceTypeEnum.CONTACTOR +dimmerswitch = IfcSwitchingDeviceTypeEnum.DIMMERSWITCH +emergencystop = IfcSwitchingDeviceTypeEnum.EMERGENCYSTOP +keypad = IfcSwitchingDeviceTypeEnum.KEYPAD +momentaryswitch = IfcSwitchingDeviceTypeEnum.MOMENTARYSWITCH +relay = IfcSwitchingDeviceTypeEnum.RELAY +selectorswitch = IfcSwitchingDeviceTypeEnum.SELECTORSWITCH +starter = IfcSwitchingDeviceTypeEnum.STARTER +start_and_stop_equipment = IfcSwitchingDeviceTypeEnum.START_AND_STOP_EQUIPMENT +switchdisconnector = IfcSwitchingDeviceTypeEnum.SWITCHDISCONNECTOR +toggleswitch = IfcSwitchingDeviceTypeEnum.TOGGLESWITCH +userdefined = IfcSwitchingDeviceTypeEnum.USERDEFINED +notdefined = IfcSwitchingDeviceTypeEnum.NOTDEFINED IfcSystemFurnitureElementTypeEnum = enum_namespace() -panel = express_getattr(IfcSystemFurnitureElementTypeEnum, 'PANEL', INDETERMINATE) -subrack = express_getattr(IfcSystemFurnitureElementTypeEnum, 'SUBRACK', INDETERMINATE) -worksurface = express_getattr(IfcSystemFurnitureElementTypeEnum, 'WORKSURFACE', INDETERMINATE) -userdefined = express_getattr(IfcSystemFurnitureElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcSystemFurnitureElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +panel = IfcSystemFurnitureElementTypeEnum.PANEL +subrack = IfcSystemFurnitureElementTypeEnum.SUBRACK +worksurface = IfcSystemFurnitureElementTypeEnum.WORKSURFACE +userdefined = IfcSystemFurnitureElementTypeEnum.USERDEFINED +notdefined = IfcSystemFurnitureElementTypeEnum.NOTDEFINED IfcTankTypeEnum = enum_namespace() -basin = express_getattr(IfcTankTypeEnum, 'BASIN', INDETERMINATE) -breakpressure = express_getattr(IfcTankTypeEnum, 'BREAKPRESSURE', INDETERMINATE) -expansion = express_getattr(IfcTankTypeEnum, 'EXPANSION', INDETERMINATE) -feedandexpansion = express_getattr(IfcTankTypeEnum, 'FEEDANDEXPANSION', INDETERMINATE) -oilretentiontray = express_getattr(IfcTankTypeEnum, 'OILRETENTIONTRAY', INDETERMINATE) -pressurevessel = express_getattr(IfcTankTypeEnum, 'PRESSUREVESSEL', INDETERMINATE) -storage = express_getattr(IfcTankTypeEnum, 'STORAGE', INDETERMINATE) -vessel = express_getattr(IfcTankTypeEnum, 'VESSEL', INDETERMINATE) -userdefined = express_getattr(IfcTankTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTankTypeEnum, 'NOTDEFINED', INDETERMINATE) +basin = IfcTankTypeEnum.BASIN +breakpressure = IfcTankTypeEnum.BREAKPRESSURE +expansion = IfcTankTypeEnum.EXPANSION +feedandexpansion = IfcTankTypeEnum.FEEDANDEXPANSION +oilretentiontray = IfcTankTypeEnum.OILRETENTIONTRAY +pressurevessel = IfcTankTypeEnum.PRESSUREVESSEL +storage = IfcTankTypeEnum.STORAGE +vessel = IfcTankTypeEnum.VESSEL +userdefined = IfcTankTypeEnum.USERDEFINED +notdefined = IfcTankTypeEnum.NOTDEFINED IfcTaskDurationEnum = enum_namespace() -elapsedtime = express_getattr(IfcTaskDurationEnum, 'ELAPSEDTIME', INDETERMINATE) -worktime = express_getattr(IfcTaskDurationEnum, 'WORKTIME', INDETERMINATE) -notdefined = express_getattr(IfcTaskDurationEnum, 'NOTDEFINED', INDETERMINATE) +elapsedtime = IfcTaskDurationEnum.ELAPSEDTIME +worktime = IfcTaskDurationEnum.WORKTIME +notdefined = IfcTaskDurationEnum.NOTDEFINED IfcTaskTypeEnum = enum_namespace() -adjustment = express_getattr(IfcTaskTypeEnum, 'ADJUSTMENT', INDETERMINATE) -attendance = express_getattr(IfcTaskTypeEnum, 'ATTENDANCE', INDETERMINATE) -calibration = express_getattr(IfcTaskTypeEnum, 'CALIBRATION', INDETERMINATE) -construction = express_getattr(IfcTaskTypeEnum, 'CONSTRUCTION', INDETERMINATE) -demolition = express_getattr(IfcTaskTypeEnum, 'DEMOLITION', INDETERMINATE) -dismantle = express_getattr(IfcTaskTypeEnum, 'DISMANTLE', INDETERMINATE) -disposal = express_getattr(IfcTaskTypeEnum, 'DISPOSAL', INDETERMINATE) -emergency = express_getattr(IfcTaskTypeEnum, 'EMERGENCY', INDETERMINATE) -inspection = express_getattr(IfcTaskTypeEnum, 'INSPECTION', INDETERMINATE) -installation = express_getattr(IfcTaskTypeEnum, 'INSTALLATION', INDETERMINATE) -logistic = express_getattr(IfcTaskTypeEnum, 'LOGISTIC', INDETERMINATE) -maintenance = express_getattr(IfcTaskTypeEnum, 'MAINTENANCE', INDETERMINATE) -move = express_getattr(IfcTaskTypeEnum, 'MOVE', INDETERMINATE) -operation = express_getattr(IfcTaskTypeEnum, 'OPERATION', INDETERMINATE) -removal = express_getattr(IfcTaskTypeEnum, 'REMOVAL', INDETERMINATE) -renovation = express_getattr(IfcTaskTypeEnum, 'RENOVATION', INDETERMINATE) -safety = express_getattr(IfcTaskTypeEnum, 'SAFETY', INDETERMINATE) -shutdown = express_getattr(IfcTaskTypeEnum, 'SHUTDOWN', INDETERMINATE) -startup = express_getattr(IfcTaskTypeEnum, 'STARTUP', INDETERMINATE) -testing = express_getattr(IfcTaskTypeEnum, 'TESTING', INDETERMINATE) -troubleshooting = express_getattr(IfcTaskTypeEnum, 'TROUBLESHOOTING', INDETERMINATE) -userdefined = express_getattr(IfcTaskTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTaskTypeEnum, 'NOTDEFINED', INDETERMINATE) +adjustment = IfcTaskTypeEnum.ADJUSTMENT +attendance = IfcTaskTypeEnum.ATTENDANCE +calibration = IfcTaskTypeEnum.CALIBRATION +construction = IfcTaskTypeEnum.CONSTRUCTION +demolition = IfcTaskTypeEnum.DEMOLITION +dismantle = IfcTaskTypeEnum.DISMANTLE +disposal = IfcTaskTypeEnum.DISPOSAL +emergency = IfcTaskTypeEnum.EMERGENCY +inspection = IfcTaskTypeEnum.INSPECTION +installation = IfcTaskTypeEnum.INSTALLATION +logistic = IfcTaskTypeEnum.LOGISTIC +maintenance = IfcTaskTypeEnum.MAINTENANCE +move = IfcTaskTypeEnum.MOVE +operation = IfcTaskTypeEnum.OPERATION +removal = IfcTaskTypeEnum.REMOVAL +renovation = IfcTaskTypeEnum.RENOVATION +safety = IfcTaskTypeEnum.SAFETY +shutdown = IfcTaskTypeEnum.SHUTDOWN +startup = IfcTaskTypeEnum.STARTUP +testing = IfcTaskTypeEnum.TESTING +troubleshooting = IfcTaskTypeEnum.TROUBLESHOOTING +userdefined = IfcTaskTypeEnum.USERDEFINED +notdefined = IfcTaskTypeEnum.NOTDEFINED IfcTendonAnchorTypeEnum = enum_namespace() -coupler = express_getattr(IfcTendonAnchorTypeEnum, 'COUPLER', INDETERMINATE) -fixed_end = express_getattr(IfcTendonAnchorTypeEnum, 'FIXED_END', INDETERMINATE) -tensioning_end = express_getattr(IfcTendonAnchorTypeEnum, 'TENSIONING_END', INDETERMINATE) -userdefined = express_getattr(IfcTendonAnchorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTendonAnchorTypeEnum, 'NOTDEFINED', INDETERMINATE) +coupler = IfcTendonAnchorTypeEnum.COUPLER +fixed_end = IfcTendonAnchorTypeEnum.FIXED_END +tensioning_end = IfcTendonAnchorTypeEnum.TENSIONING_END +userdefined = IfcTendonAnchorTypeEnum.USERDEFINED +notdefined = IfcTendonAnchorTypeEnum.NOTDEFINED IfcTendonConduitTypeEnum = enum_namespace() -coupler = express_getattr(IfcTendonConduitTypeEnum, 'COUPLER', INDETERMINATE) -diabolo = express_getattr(IfcTendonConduitTypeEnum, 'DIABOLO', INDETERMINATE) -duct = express_getattr(IfcTendonConduitTypeEnum, 'DUCT', INDETERMINATE) -grouting_duct = express_getattr(IfcTendonConduitTypeEnum, 'GROUTING_DUCT', INDETERMINATE) -trumpet = express_getattr(IfcTendonConduitTypeEnum, 'TRUMPET', INDETERMINATE) -userdefined = express_getattr(IfcTendonConduitTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTendonConduitTypeEnum, 'NOTDEFINED', INDETERMINATE) +coupler = IfcTendonConduitTypeEnum.COUPLER +diabolo = IfcTendonConduitTypeEnum.DIABOLO +duct = IfcTendonConduitTypeEnum.DUCT +grouting_duct = IfcTendonConduitTypeEnum.GROUTING_DUCT +trumpet = IfcTendonConduitTypeEnum.TRUMPET +userdefined = IfcTendonConduitTypeEnum.USERDEFINED +notdefined = IfcTendonConduitTypeEnum.NOTDEFINED IfcTendonTypeEnum = enum_namespace() -bar = express_getattr(IfcTendonTypeEnum, 'BAR', INDETERMINATE) -coated = express_getattr(IfcTendonTypeEnum, 'COATED', INDETERMINATE) -strand = express_getattr(IfcTendonTypeEnum, 'STRAND', INDETERMINATE) -wire = express_getattr(IfcTendonTypeEnum, 'WIRE', INDETERMINATE) -userdefined = express_getattr(IfcTendonTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTendonTypeEnum, 'NOTDEFINED', INDETERMINATE) +bar = IfcTendonTypeEnum.BAR +coated = IfcTendonTypeEnum.COATED +strand = IfcTendonTypeEnum.STRAND +wire = IfcTendonTypeEnum.WIRE +userdefined = IfcTendonTypeEnum.USERDEFINED +notdefined = IfcTendonTypeEnum.NOTDEFINED IfcTextPath = enum_namespace() -down = express_getattr(IfcTextPath, 'DOWN', INDETERMINATE) -left = express_getattr(IfcTextPath, 'LEFT', INDETERMINATE) -right = express_getattr(IfcTextPath, 'RIGHT', INDETERMINATE) -up = express_getattr(IfcTextPath, 'UP', INDETERMINATE) +down = IfcTextPath.DOWN +left = IfcTextPath.LEFT +right = IfcTextPath.RIGHT +up = IfcTextPath.UP IfcTimeSeriesDataTypeEnum = enum_namespace() -continuous = express_getattr(IfcTimeSeriesDataTypeEnum, 'CONTINUOUS', INDETERMINATE) -discrete = express_getattr(IfcTimeSeriesDataTypeEnum, 'DISCRETE', INDETERMINATE) -discretebinary = express_getattr(IfcTimeSeriesDataTypeEnum, 'DISCRETEBINARY', INDETERMINATE) -piecewisebinary = express_getattr(IfcTimeSeriesDataTypeEnum, 'PIECEWISEBINARY', INDETERMINATE) -piecewiseconstant = express_getattr(IfcTimeSeriesDataTypeEnum, 'PIECEWISECONSTANT', INDETERMINATE) -piecewisecontinuous = express_getattr(IfcTimeSeriesDataTypeEnum, 'PIECEWISECONTINUOUS', INDETERMINATE) -notdefined = express_getattr(IfcTimeSeriesDataTypeEnum, 'NOTDEFINED', INDETERMINATE) +continuous = IfcTimeSeriesDataTypeEnum.CONTINUOUS +discrete = IfcTimeSeriesDataTypeEnum.DISCRETE +discretebinary = IfcTimeSeriesDataTypeEnum.DISCRETEBINARY +piecewisebinary = IfcTimeSeriesDataTypeEnum.PIECEWISEBINARY +piecewiseconstant = IfcTimeSeriesDataTypeEnum.PIECEWISECONSTANT +piecewisecontinuous = IfcTimeSeriesDataTypeEnum.PIECEWISECONTINUOUS +notdefined = IfcTimeSeriesDataTypeEnum.NOTDEFINED IfcTrackElementTypeEnum = enum_namespace() -blockingdevice = express_getattr(IfcTrackElementTypeEnum, 'BLOCKINGDEVICE', INDETERMINATE) -derailer = express_getattr(IfcTrackElementTypeEnum, 'DERAILER', INDETERMINATE) -frog = express_getattr(IfcTrackElementTypeEnum, 'FROG', INDETERMINATE) -half_set_of_blades = express_getattr(IfcTrackElementTypeEnum, 'HALF_SET_OF_BLADES', INDETERMINATE) -sleeper = express_getattr(IfcTrackElementTypeEnum, 'SLEEPER', INDETERMINATE) -speedregulator = express_getattr(IfcTrackElementTypeEnum, 'SPEEDREGULATOR', INDETERMINATE) -trackendofalignment = express_getattr(IfcTrackElementTypeEnum, 'TRACKENDOFALIGNMENT', INDETERMINATE) -vehiclestop = express_getattr(IfcTrackElementTypeEnum, 'VEHICLESTOP', INDETERMINATE) -userdefined = express_getattr(IfcTrackElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTrackElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +blockingdevice = IfcTrackElementTypeEnum.BLOCKINGDEVICE +derailer = IfcTrackElementTypeEnum.DERAILER +frog = IfcTrackElementTypeEnum.FROG +half_set_of_blades = IfcTrackElementTypeEnum.HALF_SET_OF_BLADES +sleeper = IfcTrackElementTypeEnum.SLEEPER +speedregulator = IfcTrackElementTypeEnum.SPEEDREGULATOR +trackendofalignment = IfcTrackElementTypeEnum.TRACKENDOFALIGNMENT +vehiclestop = IfcTrackElementTypeEnum.VEHICLESTOP +userdefined = IfcTrackElementTypeEnum.USERDEFINED +notdefined = IfcTrackElementTypeEnum.NOTDEFINED IfcTransformerTypeEnum = enum_namespace() -chopper = express_getattr(IfcTransformerTypeEnum, 'CHOPPER', INDETERMINATE) -combined = express_getattr(IfcTransformerTypeEnum, 'COMBINED', INDETERMINATE) -current = express_getattr(IfcTransformerTypeEnum, 'CURRENT', INDETERMINATE) -frequency = express_getattr(IfcTransformerTypeEnum, 'FREQUENCY', INDETERMINATE) -inverter = express_getattr(IfcTransformerTypeEnum, 'INVERTER', INDETERMINATE) -rectifier = express_getattr(IfcTransformerTypeEnum, 'RECTIFIER', INDETERMINATE) -voltage = express_getattr(IfcTransformerTypeEnum, 'VOLTAGE', INDETERMINATE) -userdefined = express_getattr(IfcTransformerTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTransformerTypeEnum, 'NOTDEFINED', INDETERMINATE) +chopper = IfcTransformerTypeEnum.CHOPPER +combined = IfcTransformerTypeEnum.COMBINED +current = IfcTransformerTypeEnum.CURRENT +frequency = IfcTransformerTypeEnum.FREQUENCY +inverter = IfcTransformerTypeEnum.INVERTER +rectifier = IfcTransformerTypeEnum.RECTIFIER +voltage = IfcTransformerTypeEnum.VOLTAGE +userdefined = IfcTransformerTypeEnum.USERDEFINED +notdefined = IfcTransformerTypeEnum.NOTDEFINED IfcTransitionCode = enum_namespace() -continuous = express_getattr(IfcTransitionCode, 'CONTINUOUS', INDETERMINATE) -contsamegradient = express_getattr(IfcTransitionCode, 'CONTSAMEGRADIENT', INDETERMINATE) -contsamegradientsamecurvature = express_getattr(IfcTransitionCode, 'CONTSAMEGRADIENTSAMECURVATURE', INDETERMINATE) -discontinuous = express_getattr(IfcTransitionCode, 'DISCONTINUOUS', INDETERMINATE) +continuous = IfcTransitionCode.CONTINUOUS +contsamegradient = IfcTransitionCode.CONTSAMEGRADIENT +contsamegradientsamecurvature = IfcTransitionCode.CONTSAMEGRADIENTSAMECURVATURE +discontinuous = IfcTransitionCode.DISCONTINUOUS IfcTransportElementTypeEnum = enum_namespace() -craneway = express_getattr(IfcTransportElementTypeEnum, 'CRANEWAY', INDETERMINATE) -elevator = express_getattr(IfcTransportElementTypeEnum, 'ELEVATOR', INDETERMINATE) -escalator = express_getattr(IfcTransportElementTypeEnum, 'ESCALATOR', INDETERMINATE) -haulinggear = express_getattr(IfcTransportElementTypeEnum, 'HAULINGGEAR', INDETERMINATE) -liftinggear = express_getattr(IfcTransportElementTypeEnum, 'LIFTINGGEAR', INDETERMINATE) -movingwalkway = express_getattr(IfcTransportElementTypeEnum, 'MOVINGWALKWAY', INDETERMINATE) -userdefined = express_getattr(IfcTransportElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTransportElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +craneway = IfcTransportElementTypeEnum.CRANEWAY +elevator = IfcTransportElementTypeEnum.ELEVATOR +escalator = IfcTransportElementTypeEnum.ESCALATOR +haulinggear = IfcTransportElementTypeEnum.HAULINGGEAR +liftinggear = IfcTransportElementTypeEnum.LIFTINGGEAR +movingwalkway = IfcTransportElementTypeEnum.MOVINGWALKWAY +userdefined = IfcTransportElementTypeEnum.USERDEFINED +notdefined = IfcTransportElementTypeEnum.NOTDEFINED IfcTrimmingPreference = enum_namespace() -cartesian = express_getattr(IfcTrimmingPreference, 'CARTESIAN', INDETERMINATE) -parameter = express_getattr(IfcTrimmingPreference, 'PARAMETER', INDETERMINATE) -unspecified = express_getattr(IfcTrimmingPreference, 'UNSPECIFIED', INDETERMINATE) +cartesian = IfcTrimmingPreference.CARTESIAN +parameter = IfcTrimmingPreference.PARAMETER +unspecified = IfcTrimmingPreference.UNSPECIFIED IfcTubeBundleTypeEnum = enum_namespace() -finned = express_getattr(IfcTubeBundleTypeEnum, 'FINNED', INDETERMINATE) -userdefined = express_getattr(IfcTubeBundleTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcTubeBundleTypeEnum, 'NOTDEFINED', INDETERMINATE) +finned = IfcTubeBundleTypeEnum.FINNED +userdefined = IfcTubeBundleTypeEnum.USERDEFINED +notdefined = IfcTubeBundleTypeEnum.NOTDEFINED IfcUnitEnum = enum_namespace() -absorbeddoseunit = express_getattr(IfcUnitEnum, 'ABSORBEDDOSEUNIT', INDETERMINATE) -amountofsubstanceunit = express_getattr(IfcUnitEnum, 'AMOUNTOFSUBSTANCEUNIT', INDETERMINATE) -areaunit = express_getattr(IfcUnitEnum, 'AREAUNIT', INDETERMINATE) -doseequivalentunit = express_getattr(IfcUnitEnum, 'DOSEEQUIVALENTUNIT', INDETERMINATE) -electriccapacitanceunit = express_getattr(IfcUnitEnum, 'ELECTRICCAPACITANCEUNIT', INDETERMINATE) -electricchargeunit = express_getattr(IfcUnitEnum, 'ELECTRICCHARGEUNIT', INDETERMINATE) -electricconductanceunit = express_getattr(IfcUnitEnum, 'ELECTRICCONDUCTANCEUNIT', INDETERMINATE) -electriccurrentunit = express_getattr(IfcUnitEnum, 'ELECTRICCURRENTUNIT', INDETERMINATE) -electricresistanceunit = express_getattr(IfcUnitEnum, 'ELECTRICRESISTANCEUNIT', INDETERMINATE) -electricvoltageunit = express_getattr(IfcUnitEnum, 'ELECTRICVOLTAGEUNIT', INDETERMINATE) -energyunit = express_getattr(IfcUnitEnum, 'ENERGYUNIT', INDETERMINATE) -forceunit = express_getattr(IfcUnitEnum, 'FORCEUNIT', INDETERMINATE) -frequencyunit = express_getattr(IfcUnitEnum, 'FREQUENCYUNIT', INDETERMINATE) -illuminanceunit = express_getattr(IfcUnitEnum, 'ILLUMINANCEUNIT', INDETERMINATE) -inductanceunit = express_getattr(IfcUnitEnum, 'INDUCTANCEUNIT', INDETERMINATE) -lengthunit = express_getattr(IfcUnitEnum, 'LENGTHUNIT', INDETERMINATE) -luminousfluxunit = express_getattr(IfcUnitEnum, 'LUMINOUSFLUXUNIT', INDETERMINATE) -luminousintensityunit = express_getattr(IfcUnitEnum, 'LUMINOUSINTENSITYUNIT', INDETERMINATE) -magneticfluxdensityunit = express_getattr(IfcUnitEnum, 'MAGNETICFLUXDENSITYUNIT', INDETERMINATE) -magneticfluxunit = express_getattr(IfcUnitEnum, 'MAGNETICFLUXUNIT', INDETERMINATE) -massunit = express_getattr(IfcUnitEnum, 'MASSUNIT', INDETERMINATE) -planeangleunit = express_getattr(IfcUnitEnum, 'PLANEANGLEUNIT', INDETERMINATE) -powerunit = express_getattr(IfcUnitEnum, 'POWERUNIT', INDETERMINATE) -pressureunit = express_getattr(IfcUnitEnum, 'PRESSUREUNIT', INDETERMINATE) -radioactivityunit = express_getattr(IfcUnitEnum, 'RADIOACTIVITYUNIT', INDETERMINATE) -solidangleunit = express_getattr(IfcUnitEnum, 'SOLIDANGLEUNIT', INDETERMINATE) -thermodynamictemperatureunit = express_getattr(IfcUnitEnum, 'THERMODYNAMICTEMPERATUREUNIT', INDETERMINATE) -timeunit = express_getattr(IfcUnitEnum, 'TIMEUNIT', INDETERMINATE) -volumeunit = express_getattr(IfcUnitEnum, 'VOLUMEUNIT', INDETERMINATE) -userdefined = express_getattr(IfcUnitEnum, 'USERDEFINED', INDETERMINATE) +absorbeddoseunit = IfcUnitEnum.ABSORBEDDOSEUNIT +amountofsubstanceunit = IfcUnitEnum.AMOUNTOFSUBSTANCEUNIT +areaunit = IfcUnitEnum.AREAUNIT +doseequivalentunit = IfcUnitEnum.DOSEEQUIVALENTUNIT +electriccapacitanceunit = IfcUnitEnum.ELECTRICCAPACITANCEUNIT +electricchargeunit = IfcUnitEnum.ELECTRICCHARGEUNIT +electricconductanceunit = IfcUnitEnum.ELECTRICCONDUCTANCEUNIT +electriccurrentunit = IfcUnitEnum.ELECTRICCURRENTUNIT +electricresistanceunit = IfcUnitEnum.ELECTRICRESISTANCEUNIT +electricvoltageunit = IfcUnitEnum.ELECTRICVOLTAGEUNIT +energyunit = IfcUnitEnum.ENERGYUNIT +forceunit = IfcUnitEnum.FORCEUNIT +frequencyunit = IfcUnitEnum.FREQUENCYUNIT +illuminanceunit = IfcUnitEnum.ILLUMINANCEUNIT +inductanceunit = IfcUnitEnum.INDUCTANCEUNIT +lengthunit = IfcUnitEnum.LENGTHUNIT +luminousfluxunit = IfcUnitEnum.LUMINOUSFLUXUNIT +luminousintensityunit = IfcUnitEnum.LUMINOUSINTENSITYUNIT +magneticfluxdensityunit = IfcUnitEnum.MAGNETICFLUXDENSITYUNIT +magneticfluxunit = IfcUnitEnum.MAGNETICFLUXUNIT +massunit = IfcUnitEnum.MASSUNIT +planeangleunit = IfcUnitEnum.PLANEANGLEUNIT +powerunit = IfcUnitEnum.POWERUNIT +pressureunit = IfcUnitEnum.PRESSUREUNIT +radioactivityunit = IfcUnitEnum.RADIOACTIVITYUNIT +solidangleunit = IfcUnitEnum.SOLIDANGLEUNIT +thermodynamictemperatureunit = IfcUnitEnum.THERMODYNAMICTEMPERATUREUNIT +timeunit = IfcUnitEnum.TIMEUNIT +volumeunit = IfcUnitEnum.VOLUMEUNIT +userdefined = IfcUnitEnum.USERDEFINED IfcUnitaryControlElementTypeEnum = enum_namespace() -alarmpanel = express_getattr(IfcUnitaryControlElementTypeEnum, 'ALARMPANEL', INDETERMINATE) -basestationcontroller = express_getattr(IfcUnitaryControlElementTypeEnum, 'BASESTATIONCONTROLLER', INDETERMINATE) -combined = express_getattr(IfcUnitaryControlElementTypeEnum, 'COMBINED', INDETERMINATE) -controlpanel = express_getattr(IfcUnitaryControlElementTypeEnum, 'CONTROLPANEL', INDETERMINATE) -gasdetectionpanel = express_getattr(IfcUnitaryControlElementTypeEnum, 'GASDETECTIONPANEL', INDETERMINATE) -humidistat = express_getattr(IfcUnitaryControlElementTypeEnum, 'HUMIDISTAT', INDETERMINATE) -indicatorpanel = express_getattr(IfcUnitaryControlElementTypeEnum, 'INDICATORPANEL', INDETERMINATE) -mimicpanel = express_getattr(IfcUnitaryControlElementTypeEnum, 'MIMICPANEL', INDETERMINATE) -thermostat = express_getattr(IfcUnitaryControlElementTypeEnum, 'THERMOSTAT', INDETERMINATE) -weatherstation = express_getattr(IfcUnitaryControlElementTypeEnum, 'WEATHERSTATION', INDETERMINATE) -userdefined = express_getattr(IfcUnitaryControlElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcUnitaryControlElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +alarmpanel = IfcUnitaryControlElementTypeEnum.ALARMPANEL +basestationcontroller = IfcUnitaryControlElementTypeEnum.BASESTATIONCONTROLLER +combined = IfcUnitaryControlElementTypeEnum.COMBINED +controlpanel = IfcUnitaryControlElementTypeEnum.CONTROLPANEL +gasdetectionpanel = IfcUnitaryControlElementTypeEnum.GASDETECTIONPANEL +humidistat = IfcUnitaryControlElementTypeEnum.HUMIDISTAT +indicatorpanel = IfcUnitaryControlElementTypeEnum.INDICATORPANEL +mimicpanel = IfcUnitaryControlElementTypeEnum.MIMICPANEL +thermostat = IfcUnitaryControlElementTypeEnum.THERMOSTAT +weatherstation = IfcUnitaryControlElementTypeEnum.WEATHERSTATION +userdefined = IfcUnitaryControlElementTypeEnum.USERDEFINED +notdefined = IfcUnitaryControlElementTypeEnum.NOTDEFINED IfcUnitaryEquipmentTypeEnum = enum_namespace() -airconditioningunit = express_getattr(IfcUnitaryEquipmentTypeEnum, 'AIRCONDITIONINGUNIT', INDETERMINATE) -airhandler = express_getattr(IfcUnitaryEquipmentTypeEnum, 'AIRHANDLER', INDETERMINATE) -dehumidifier = express_getattr(IfcUnitaryEquipmentTypeEnum, 'DEHUMIDIFIER', INDETERMINATE) -rooftopunit = express_getattr(IfcUnitaryEquipmentTypeEnum, 'ROOFTOPUNIT', INDETERMINATE) -splitsystem = express_getattr(IfcUnitaryEquipmentTypeEnum, 'SPLITSYSTEM', INDETERMINATE) -userdefined = express_getattr(IfcUnitaryEquipmentTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcUnitaryEquipmentTypeEnum, 'NOTDEFINED', INDETERMINATE) +airconditioningunit = IfcUnitaryEquipmentTypeEnum.AIRCONDITIONINGUNIT +airhandler = IfcUnitaryEquipmentTypeEnum.AIRHANDLER +dehumidifier = IfcUnitaryEquipmentTypeEnum.DEHUMIDIFIER +rooftopunit = IfcUnitaryEquipmentTypeEnum.ROOFTOPUNIT +splitsystem = IfcUnitaryEquipmentTypeEnum.SPLITSYSTEM +userdefined = IfcUnitaryEquipmentTypeEnum.USERDEFINED +notdefined = IfcUnitaryEquipmentTypeEnum.NOTDEFINED IfcValveTypeEnum = enum_namespace() -airrelease = express_getattr(IfcValveTypeEnum, 'AIRRELEASE', INDETERMINATE) -antivacuum = express_getattr(IfcValveTypeEnum, 'ANTIVACUUM', INDETERMINATE) -changeover = express_getattr(IfcValveTypeEnum, 'CHANGEOVER', INDETERMINATE) -check = express_getattr(IfcValveTypeEnum, 'CHECK', INDETERMINATE) -commissioning = express_getattr(IfcValveTypeEnum, 'COMMISSIONING', INDETERMINATE) -diverting = express_getattr(IfcValveTypeEnum, 'DIVERTING', INDETERMINATE) -doublecheck = express_getattr(IfcValveTypeEnum, 'DOUBLECHECK', INDETERMINATE) -doubleregulating = express_getattr(IfcValveTypeEnum, 'DOUBLEREGULATING', INDETERMINATE) -drawoffcock = express_getattr(IfcValveTypeEnum, 'DRAWOFFCOCK', INDETERMINATE) -faucet = express_getattr(IfcValveTypeEnum, 'FAUCET', INDETERMINATE) -flushing = express_getattr(IfcValveTypeEnum, 'FLUSHING', INDETERMINATE) -gascock = express_getattr(IfcValveTypeEnum, 'GASCOCK', INDETERMINATE) -gastap = express_getattr(IfcValveTypeEnum, 'GASTAP', INDETERMINATE) -isolating = express_getattr(IfcValveTypeEnum, 'ISOLATING', INDETERMINATE) -mixing = express_getattr(IfcValveTypeEnum, 'MIXING', INDETERMINATE) -pressurereducing = express_getattr(IfcValveTypeEnum, 'PRESSUREREDUCING', INDETERMINATE) -pressurerelief = express_getattr(IfcValveTypeEnum, 'PRESSURERELIEF', INDETERMINATE) -regulating = express_getattr(IfcValveTypeEnum, 'REGULATING', INDETERMINATE) -safetycutoff = express_getattr(IfcValveTypeEnum, 'SAFETYCUTOFF', INDETERMINATE) -steamtrap = express_getattr(IfcValveTypeEnum, 'STEAMTRAP', INDETERMINATE) -stopcock = express_getattr(IfcValveTypeEnum, 'STOPCOCK', INDETERMINATE) -userdefined = express_getattr(IfcValveTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcValveTypeEnum, 'NOTDEFINED', INDETERMINATE) +airrelease = IfcValveTypeEnum.AIRRELEASE +antivacuum = IfcValveTypeEnum.ANTIVACUUM +changeover = IfcValveTypeEnum.CHANGEOVER +check = IfcValveTypeEnum.CHECK +commissioning = IfcValveTypeEnum.COMMISSIONING +diverting = IfcValveTypeEnum.DIVERTING +doublecheck = IfcValveTypeEnum.DOUBLECHECK +doubleregulating = IfcValveTypeEnum.DOUBLEREGULATING +drawoffcock = IfcValveTypeEnum.DRAWOFFCOCK +faucet = IfcValveTypeEnum.FAUCET +flushing = IfcValveTypeEnum.FLUSHING +gascock = IfcValveTypeEnum.GASCOCK +gastap = IfcValveTypeEnum.GASTAP +isolating = IfcValveTypeEnum.ISOLATING +mixing = IfcValveTypeEnum.MIXING +pressurereducing = IfcValveTypeEnum.PRESSUREREDUCING +pressurerelief = IfcValveTypeEnum.PRESSURERELIEF +regulating = IfcValveTypeEnum.REGULATING +safetycutoff = IfcValveTypeEnum.SAFETYCUTOFF +steamtrap = IfcValveTypeEnum.STEAMTRAP +stopcock = IfcValveTypeEnum.STOPCOCK +userdefined = IfcValveTypeEnum.USERDEFINED +notdefined = IfcValveTypeEnum.NOTDEFINED IfcVehicleTypeEnum = enum_namespace() -cargo = express_getattr(IfcVehicleTypeEnum, 'CARGO', INDETERMINATE) -rollingstock = express_getattr(IfcVehicleTypeEnum, 'ROLLINGSTOCK', INDETERMINATE) -vehicle = express_getattr(IfcVehicleTypeEnum, 'VEHICLE', INDETERMINATE) -vehicleair = express_getattr(IfcVehicleTypeEnum, 'VEHICLEAIR', INDETERMINATE) -vehiclemarine = express_getattr(IfcVehicleTypeEnum, 'VEHICLEMARINE', INDETERMINATE) -vehicletracked = express_getattr(IfcVehicleTypeEnum, 'VEHICLETRACKED', INDETERMINATE) -vehiclewheeled = express_getattr(IfcVehicleTypeEnum, 'VEHICLEWHEELED', INDETERMINATE) -userdefined = express_getattr(IfcVehicleTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcVehicleTypeEnum, 'NOTDEFINED', INDETERMINATE) +cargo = IfcVehicleTypeEnum.CARGO +rollingstock = IfcVehicleTypeEnum.ROLLINGSTOCK +vehicle = IfcVehicleTypeEnum.VEHICLE +vehicleair = IfcVehicleTypeEnum.VEHICLEAIR +vehiclemarine = IfcVehicleTypeEnum.VEHICLEMARINE +vehicletracked = IfcVehicleTypeEnum.VEHICLETRACKED +vehiclewheeled = IfcVehicleTypeEnum.VEHICLEWHEELED +userdefined = IfcVehicleTypeEnum.USERDEFINED +notdefined = IfcVehicleTypeEnum.NOTDEFINED IfcVibrationDamperTypeEnum = enum_namespace() -axial_yield = express_getattr(IfcVibrationDamperTypeEnum, 'AXIAL_YIELD', INDETERMINATE) -bending_yield = express_getattr(IfcVibrationDamperTypeEnum, 'BENDING_YIELD', INDETERMINATE) -friction = express_getattr(IfcVibrationDamperTypeEnum, 'FRICTION', INDETERMINATE) -rubber = express_getattr(IfcVibrationDamperTypeEnum, 'RUBBER', INDETERMINATE) -shear_yield = express_getattr(IfcVibrationDamperTypeEnum, 'SHEAR_YIELD', INDETERMINATE) -viscous = express_getattr(IfcVibrationDamperTypeEnum, 'VISCOUS', INDETERMINATE) -userdefined = express_getattr(IfcVibrationDamperTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcVibrationDamperTypeEnum, 'NOTDEFINED', INDETERMINATE) +axial_yield = IfcVibrationDamperTypeEnum.AXIAL_YIELD +bending_yield = IfcVibrationDamperTypeEnum.BENDING_YIELD +friction = IfcVibrationDamperTypeEnum.FRICTION +rubber = IfcVibrationDamperTypeEnum.RUBBER +shear_yield = IfcVibrationDamperTypeEnum.SHEAR_YIELD +viscous = IfcVibrationDamperTypeEnum.VISCOUS +userdefined = IfcVibrationDamperTypeEnum.USERDEFINED +notdefined = IfcVibrationDamperTypeEnum.NOTDEFINED IfcVibrationIsolatorTypeEnum = enum_namespace() -base = express_getattr(IfcVibrationIsolatorTypeEnum, 'BASE', INDETERMINATE) -compression = express_getattr(IfcVibrationIsolatorTypeEnum, 'COMPRESSION', INDETERMINATE) -spring = express_getattr(IfcVibrationIsolatorTypeEnum, 'SPRING', INDETERMINATE) -userdefined = express_getattr(IfcVibrationIsolatorTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcVibrationIsolatorTypeEnum, 'NOTDEFINED', INDETERMINATE) +base = IfcVibrationIsolatorTypeEnum.BASE +compression = IfcVibrationIsolatorTypeEnum.COMPRESSION +spring = IfcVibrationIsolatorTypeEnum.SPRING +userdefined = IfcVibrationIsolatorTypeEnum.USERDEFINED +notdefined = IfcVibrationIsolatorTypeEnum.NOTDEFINED IfcVirtualElementTypeEnum = enum_namespace() -boundary = express_getattr(IfcVirtualElementTypeEnum, 'BOUNDARY', INDETERMINATE) -clearance = express_getattr(IfcVirtualElementTypeEnum, 'CLEARANCE', INDETERMINATE) -provisionforvoid = express_getattr(IfcVirtualElementTypeEnum, 'PROVISIONFORVOID', INDETERMINATE) -userdefined = express_getattr(IfcVirtualElementTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcVirtualElementTypeEnum, 'NOTDEFINED', INDETERMINATE) +boundary = IfcVirtualElementTypeEnum.BOUNDARY +clearance = IfcVirtualElementTypeEnum.CLEARANCE +provisionforvoid = IfcVirtualElementTypeEnum.PROVISIONFORVOID +userdefined = IfcVirtualElementTypeEnum.USERDEFINED +notdefined = IfcVirtualElementTypeEnum.NOTDEFINED IfcVoidingFeatureTypeEnum = enum_namespace() -chamfer = express_getattr(IfcVoidingFeatureTypeEnum, 'CHAMFER', INDETERMINATE) -cutout = express_getattr(IfcVoidingFeatureTypeEnum, 'CUTOUT', INDETERMINATE) -edge = express_getattr(IfcVoidingFeatureTypeEnum, 'EDGE', INDETERMINATE) -hole = express_getattr(IfcVoidingFeatureTypeEnum, 'HOLE', INDETERMINATE) -miter = express_getattr(IfcVoidingFeatureTypeEnum, 'MITER', INDETERMINATE) -notch = express_getattr(IfcVoidingFeatureTypeEnum, 'NOTCH', INDETERMINATE) -userdefined = express_getattr(IfcVoidingFeatureTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcVoidingFeatureTypeEnum, 'NOTDEFINED', INDETERMINATE) +chamfer = IfcVoidingFeatureTypeEnum.CHAMFER +cutout = IfcVoidingFeatureTypeEnum.CUTOUT +edge = IfcVoidingFeatureTypeEnum.EDGE +hole = IfcVoidingFeatureTypeEnum.HOLE +miter = IfcVoidingFeatureTypeEnum.MITER +notch = IfcVoidingFeatureTypeEnum.NOTCH +userdefined = IfcVoidingFeatureTypeEnum.USERDEFINED +notdefined = IfcVoidingFeatureTypeEnum.NOTDEFINED IfcWallTypeEnum = enum_namespace() -elementedwall = express_getattr(IfcWallTypeEnum, 'ELEMENTEDWALL', INDETERMINATE) -movable = express_getattr(IfcWallTypeEnum, 'MOVABLE', INDETERMINATE) -parapet = express_getattr(IfcWallTypeEnum, 'PARAPET', INDETERMINATE) -partitioning = express_getattr(IfcWallTypeEnum, 'PARTITIONING', INDETERMINATE) -plumbingwall = express_getattr(IfcWallTypeEnum, 'PLUMBINGWALL', INDETERMINATE) -polygonal = express_getattr(IfcWallTypeEnum, 'POLYGONAL', INDETERMINATE) -retainingwall = express_getattr(IfcWallTypeEnum, 'RETAININGWALL', INDETERMINATE) -shear = express_getattr(IfcWallTypeEnum, 'SHEAR', INDETERMINATE) -solidwall = express_getattr(IfcWallTypeEnum, 'SOLIDWALL', INDETERMINATE) -standard = express_getattr(IfcWallTypeEnum, 'STANDARD', INDETERMINATE) -wavewall = express_getattr(IfcWallTypeEnum, 'WAVEWALL', INDETERMINATE) -userdefined = express_getattr(IfcWallTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcWallTypeEnum, 'NOTDEFINED', INDETERMINATE) +elementedwall = IfcWallTypeEnum.ELEMENTEDWALL +movable = IfcWallTypeEnum.MOVABLE +parapet = IfcWallTypeEnum.PARAPET +partitioning = IfcWallTypeEnum.PARTITIONING +plumbingwall = IfcWallTypeEnum.PLUMBINGWALL +polygonal = IfcWallTypeEnum.POLYGONAL +retainingwall = IfcWallTypeEnum.RETAININGWALL +shear = IfcWallTypeEnum.SHEAR +solidwall = IfcWallTypeEnum.SOLIDWALL +standard = IfcWallTypeEnum.STANDARD +wavewall = IfcWallTypeEnum.WAVEWALL +userdefined = IfcWallTypeEnum.USERDEFINED +notdefined = IfcWallTypeEnum.NOTDEFINED IfcWasteTerminalTypeEnum = enum_namespace() -floortrap = express_getattr(IfcWasteTerminalTypeEnum, 'FLOORTRAP', INDETERMINATE) -floorwaste = express_getattr(IfcWasteTerminalTypeEnum, 'FLOORWASTE', INDETERMINATE) -gullysump = express_getattr(IfcWasteTerminalTypeEnum, 'GULLYSUMP', INDETERMINATE) -gullytrap = express_getattr(IfcWasteTerminalTypeEnum, 'GULLYTRAP', INDETERMINATE) -roofdrain = express_getattr(IfcWasteTerminalTypeEnum, 'ROOFDRAIN', INDETERMINATE) -wastedisposalunit = express_getattr(IfcWasteTerminalTypeEnum, 'WASTEDISPOSALUNIT', INDETERMINATE) -wastetrap = express_getattr(IfcWasteTerminalTypeEnum, 'WASTETRAP', INDETERMINATE) -userdefined = express_getattr(IfcWasteTerminalTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcWasteTerminalTypeEnum, 'NOTDEFINED', INDETERMINATE) +floortrap = IfcWasteTerminalTypeEnum.FLOORTRAP +floorwaste = IfcWasteTerminalTypeEnum.FLOORWASTE +gullysump = IfcWasteTerminalTypeEnum.GULLYSUMP +gullytrap = IfcWasteTerminalTypeEnum.GULLYTRAP +roofdrain = IfcWasteTerminalTypeEnum.ROOFDRAIN +wastedisposalunit = IfcWasteTerminalTypeEnum.WASTEDISPOSALUNIT +wastetrap = IfcWasteTerminalTypeEnum.WASTETRAP +userdefined = IfcWasteTerminalTypeEnum.USERDEFINED +notdefined = IfcWasteTerminalTypeEnum.NOTDEFINED IfcWindowPanelOperationEnum = enum_namespace() -bottomhung = express_getattr(IfcWindowPanelOperationEnum, 'BOTTOMHUNG', INDETERMINATE) -fixedcasement = express_getattr(IfcWindowPanelOperationEnum, 'FIXEDCASEMENT', INDETERMINATE) -otheroperation = express_getattr(IfcWindowPanelOperationEnum, 'OTHEROPERATION', INDETERMINATE) -pivothorizontal = express_getattr(IfcWindowPanelOperationEnum, 'PIVOTHORIZONTAL', INDETERMINATE) -pivotvertical = express_getattr(IfcWindowPanelOperationEnum, 'PIVOTVERTICAL', INDETERMINATE) -removablecasement = express_getattr(IfcWindowPanelOperationEnum, 'REMOVABLECASEMENT', INDETERMINATE) -sidehunglefthand = express_getattr(IfcWindowPanelOperationEnum, 'SIDEHUNGLEFTHAND', INDETERMINATE) -sidehungrighthand = express_getattr(IfcWindowPanelOperationEnum, 'SIDEHUNGRIGHTHAND', INDETERMINATE) -slidinghorizontal = express_getattr(IfcWindowPanelOperationEnum, 'SLIDINGHORIZONTAL', INDETERMINATE) -slidingvertical = express_getattr(IfcWindowPanelOperationEnum, 'SLIDINGVERTICAL', INDETERMINATE) -tiltandturnlefthand = express_getattr(IfcWindowPanelOperationEnum, 'TILTANDTURNLEFTHAND', INDETERMINATE) -tiltandturnrighthand = express_getattr(IfcWindowPanelOperationEnum, 'TILTANDTURNRIGHTHAND', INDETERMINATE) -tophung = express_getattr(IfcWindowPanelOperationEnum, 'TOPHUNG', INDETERMINATE) -notdefined = express_getattr(IfcWindowPanelOperationEnum, 'NOTDEFINED', INDETERMINATE) +bottomhung = IfcWindowPanelOperationEnum.BOTTOMHUNG +fixedcasement = IfcWindowPanelOperationEnum.FIXEDCASEMENT +otheroperation = IfcWindowPanelOperationEnum.OTHEROPERATION +pivothorizontal = IfcWindowPanelOperationEnum.PIVOTHORIZONTAL +pivotvertical = IfcWindowPanelOperationEnum.PIVOTVERTICAL +removablecasement = IfcWindowPanelOperationEnum.REMOVABLECASEMENT +sidehunglefthand = IfcWindowPanelOperationEnum.SIDEHUNGLEFTHAND +sidehungrighthand = IfcWindowPanelOperationEnum.SIDEHUNGRIGHTHAND +slidinghorizontal = IfcWindowPanelOperationEnum.SLIDINGHORIZONTAL +slidingvertical = IfcWindowPanelOperationEnum.SLIDINGVERTICAL +tiltandturnlefthand = IfcWindowPanelOperationEnum.TILTANDTURNLEFTHAND +tiltandturnrighthand = IfcWindowPanelOperationEnum.TILTANDTURNRIGHTHAND +tophung = IfcWindowPanelOperationEnum.TOPHUNG +notdefined = IfcWindowPanelOperationEnum.NOTDEFINED IfcWindowPanelPositionEnum = enum_namespace() -bottom = express_getattr(IfcWindowPanelPositionEnum, 'BOTTOM', INDETERMINATE) -left = express_getattr(IfcWindowPanelPositionEnum, 'LEFT', INDETERMINATE) -middle = express_getattr(IfcWindowPanelPositionEnum, 'MIDDLE', INDETERMINATE) -right = express_getattr(IfcWindowPanelPositionEnum, 'RIGHT', INDETERMINATE) -top = express_getattr(IfcWindowPanelPositionEnum, 'TOP', INDETERMINATE) -notdefined = express_getattr(IfcWindowPanelPositionEnum, 'NOTDEFINED', INDETERMINATE) +bottom = IfcWindowPanelPositionEnum.BOTTOM +left = IfcWindowPanelPositionEnum.LEFT +middle = IfcWindowPanelPositionEnum.MIDDLE +right = IfcWindowPanelPositionEnum.RIGHT +top = IfcWindowPanelPositionEnum.TOP +notdefined = IfcWindowPanelPositionEnum.NOTDEFINED IfcWindowTypeEnum = enum_namespace() -lightdome = express_getattr(IfcWindowTypeEnum, 'LIGHTDOME', INDETERMINATE) -skylight = express_getattr(IfcWindowTypeEnum, 'SKYLIGHT', INDETERMINATE) -window = express_getattr(IfcWindowTypeEnum, 'WINDOW', INDETERMINATE) -userdefined = express_getattr(IfcWindowTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcWindowTypeEnum, 'NOTDEFINED', INDETERMINATE) +lightdome = IfcWindowTypeEnum.LIGHTDOME +skylight = IfcWindowTypeEnum.SKYLIGHT +window = IfcWindowTypeEnum.WINDOW +userdefined = IfcWindowTypeEnum.USERDEFINED +notdefined = IfcWindowTypeEnum.NOTDEFINED IfcWindowTypePartitioningEnum = enum_namespace() -double_panel_horizontal = express_getattr(IfcWindowTypePartitioningEnum, 'DOUBLE_PANEL_HORIZONTAL', INDETERMINATE) -double_panel_vertical = express_getattr(IfcWindowTypePartitioningEnum, 'DOUBLE_PANEL_VERTICAL', INDETERMINATE) -single_panel = express_getattr(IfcWindowTypePartitioningEnum, 'SINGLE_PANEL', INDETERMINATE) -triple_panel_bottom = express_getattr(IfcWindowTypePartitioningEnum, 'TRIPLE_PANEL_BOTTOM', INDETERMINATE) -triple_panel_horizontal = express_getattr(IfcWindowTypePartitioningEnum, 'TRIPLE_PANEL_HORIZONTAL', INDETERMINATE) -triple_panel_left = express_getattr(IfcWindowTypePartitioningEnum, 'TRIPLE_PANEL_LEFT', INDETERMINATE) -triple_panel_right = express_getattr(IfcWindowTypePartitioningEnum, 'TRIPLE_PANEL_RIGHT', INDETERMINATE) -triple_panel_top = express_getattr(IfcWindowTypePartitioningEnum, 'TRIPLE_PANEL_TOP', INDETERMINATE) -triple_panel_vertical = express_getattr(IfcWindowTypePartitioningEnum, 'TRIPLE_PANEL_VERTICAL', INDETERMINATE) -userdefined = express_getattr(IfcWindowTypePartitioningEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcWindowTypePartitioningEnum, 'NOTDEFINED', INDETERMINATE) +double_panel_horizontal = IfcWindowTypePartitioningEnum.DOUBLE_PANEL_HORIZONTAL +double_panel_vertical = IfcWindowTypePartitioningEnum.DOUBLE_PANEL_VERTICAL +single_panel = IfcWindowTypePartitioningEnum.SINGLE_PANEL +triple_panel_bottom = IfcWindowTypePartitioningEnum.TRIPLE_PANEL_BOTTOM +triple_panel_horizontal = IfcWindowTypePartitioningEnum.TRIPLE_PANEL_HORIZONTAL +triple_panel_left = IfcWindowTypePartitioningEnum.TRIPLE_PANEL_LEFT +triple_panel_right = IfcWindowTypePartitioningEnum.TRIPLE_PANEL_RIGHT +triple_panel_top = IfcWindowTypePartitioningEnum.TRIPLE_PANEL_TOP +triple_panel_vertical = IfcWindowTypePartitioningEnum.TRIPLE_PANEL_VERTICAL +userdefined = IfcWindowTypePartitioningEnum.USERDEFINED +notdefined = IfcWindowTypePartitioningEnum.NOTDEFINED IfcWorkCalendarTypeEnum = enum_namespace() -firstshift = express_getattr(IfcWorkCalendarTypeEnum, 'FIRSTSHIFT', INDETERMINATE) -secondshift = express_getattr(IfcWorkCalendarTypeEnum, 'SECONDSHIFT', INDETERMINATE) -thirdshift = express_getattr(IfcWorkCalendarTypeEnum, 'THIRDSHIFT', INDETERMINATE) -userdefined = express_getattr(IfcWorkCalendarTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcWorkCalendarTypeEnum, 'NOTDEFINED', INDETERMINATE) +firstshift = IfcWorkCalendarTypeEnum.FIRSTSHIFT +secondshift = IfcWorkCalendarTypeEnum.SECONDSHIFT +thirdshift = IfcWorkCalendarTypeEnum.THIRDSHIFT +userdefined = IfcWorkCalendarTypeEnum.USERDEFINED +notdefined = IfcWorkCalendarTypeEnum.NOTDEFINED IfcWorkPlanTypeEnum = enum_namespace() -actual = express_getattr(IfcWorkPlanTypeEnum, 'ACTUAL', INDETERMINATE) -baseline = express_getattr(IfcWorkPlanTypeEnum, 'BASELINE', INDETERMINATE) -planned = express_getattr(IfcWorkPlanTypeEnum, 'PLANNED', INDETERMINATE) -userdefined = express_getattr(IfcWorkPlanTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcWorkPlanTypeEnum, 'NOTDEFINED', INDETERMINATE) +actual = IfcWorkPlanTypeEnum.ACTUAL +baseline = IfcWorkPlanTypeEnum.BASELINE +planned = IfcWorkPlanTypeEnum.PLANNED +userdefined = IfcWorkPlanTypeEnum.USERDEFINED +notdefined = IfcWorkPlanTypeEnum.NOTDEFINED IfcWorkScheduleTypeEnum = enum_namespace() -actual = express_getattr(IfcWorkScheduleTypeEnum, 'ACTUAL', INDETERMINATE) -baseline = express_getattr(IfcWorkScheduleTypeEnum, 'BASELINE', INDETERMINATE) -planned = express_getattr(IfcWorkScheduleTypeEnum, 'PLANNED', INDETERMINATE) -userdefined = express_getattr(IfcWorkScheduleTypeEnum, 'USERDEFINED', INDETERMINATE) -notdefined = express_getattr(IfcWorkScheduleTypeEnum, 'NOTDEFINED', INDETERMINATE) +actual = IfcWorkScheduleTypeEnum.ACTUAL +baseline = IfcWorkScheduleTypeEnum.BASELINE +planned = IfcWorkScheduleTypeEnum.PLANNED +userdefined = IfcWorkScheduleTypeEnum.USERDEFINED +notdefined = IfcWorkScheduleTypeEnum.NOTDEFINED def IfcActionRequest(*args, **kwargs): return ifcopenshell.create_entity('IfcActionRequest', 'IFC4X3_TC1', *args, **kwargs) diff --git a/src/ifcopenshell-python/ifcopenshell/express/schema.py b/src/ifcopenshell-python/ifcopenshell/express/schema.py index ebb050d1ae5..315db817b64 100644 --- a/src/ifcopenshell-python/ifcopenshell/express/schema.py +++ b/src/ifcopenshell-python/ifcopenshell/express/schema.py @@ -27,6 +27,7 @@ collections.OrderedDict = ordereddict.OrderedDict + # According to ISO 10303-11 7.1.2: Letters: "... The case of # letters is significant only within explicit string literals." class OrderedCaseInsensitiveDict_KeyObject(str): @@ -92,23 +93,21 @@ def __init__(self, parsetree: pyparsing.ParseResults): sort = lambda d: OrderedCaseInsensitiveDict(sorted(d)) - declarations = [ - d.any()[0] - for d in schema_declarations - if d.rule == "declaration" - ] + [ - d - for d in schema_declarations - if d.rule == "RuleDeclaration" + declarations = [d.any()[0] for d in schema_declarations if d.rule == "declaration"] + [ + d for d in schema_declarations if d.rule == "RuleDeclaration" ] - + self.types = sort([(t.name, t) for t in declarations if isinstance(t, nodes.TypeDeclaration)]) self.entities = sort([(t.name, t) for t in declarations if isinstance(t, nodes.EntityDeclaration)]) self.rules = sort([(t.name, t) for t in declarations if isinstance(t, nodes.RuleDeclaration)]) self.functions = sort([(t.name, t) for t in declarations if isinstance(t, nodes.FunctionDeclaration)]) - self.keys = list(self.types.keys()) + list(self.entities.keys()) + list(self.rules.keys()) + list(self.functions.keys()) - self.all_declarations = {k: v for d in (self.types, self.entities, self.rules, self.functions) for k, v in d.items()} + self.keys = ( + list(self.types.keys()) + list(self.entities.keys()) + list(self.rules.keys()) + list(self.functions.keys()) + ) + self.all_declarations = { + k: v for d in (self.types, self.entities, self.rules, self.functions) for k, v in d.items() + } of_type = lambda *types: sort( [(a, b.type) for a, b in self.types.items() if any(isinstance(b.type, ty) for ty in types)] diff --git a/src/ifcopenshell-python/ifcopenshell/express/schema_class.py b/src/ifcopenshell-python/ifcopenshell/express/schema_class.py index 50a4e50c5df..d7595ad6cb9 100644 --- a/src/ifcopenshell-python/ifcopenshell/express/schema_class.py +++ b/src/ifcopenshell-python/ifcopenshell/express/schema_class.py @@ -123,6 +123,7 @@ class string_pool: def __init__(self, fn): self.di = {} self.fn = fn + def append(self, v): def _(): if i := self.di.get(v): @@ -131,7 +132,9 @@ def _(): i = len(self.di) self.di[v] = i return i + return self.fn(_()) + def __iter__(self): return iter(self.di.keys()) @@ -146,9 +149,9 @@ def __init__(self, schema_name): "", '#include "../ifcparse/IfcSchema.h"', '#include "../ifcparse/%(schema_name_title)s.h"' % self.__dict__, - '#include ', + "#include ", "", - 'using namespace std::string_literals;', + "using namespace std::string_literals;", "using namespace IfcParse;", "", ] @@ -180,18 +183,18 @@ def begin_schema(self): self.statements.append("{factory_placeholder}") -# self.statements.append( -# """ -# #if defined(__clang__) -# __attribute__((optnone)) -# #elif defined(__GNUC__) || defined(__GNUG__) -# #pragma GCC push_options -# #pragma GCC optimize ("O0") -# #elif defined(_MSC_VER) -# #pragma optimize("", off) -# #endif -# """ -# ) + # self.statements.append( + # """ + # #if defined(__clang__) + # __attribute__((optnone)) + # #elif defined(__GNUC__) || defined(__GNUG__) + # #pragma GCC push_options + # #pragma GCC optimize ("O0") + # #elif defined(_MSC_VER) + # #pragma optimize("", off) + # #endif + # """ + # ) self.statements.append("IfcParse::schema_definition* %s_populate_schema() {" % self.schema_name.upper()) self.statements.append("{string_pool_placeholder}") @@ -200,7 +203,7 @@ def typedef(self, name, declared_type): index_in_schema = self.names.index(name) ref = self.strings.append(name) self.statements.append( - ' %(schema_name)s_types[%(index_in_schema)d] = new type_declaration(%(ref)s, %(index_in_schema)d, %(declared_type)s);' + " %(schema_name)s_types[%(index_in_schema)d] = new type_declaration(%(ref)s, %(index_in_schema)d, %(declared_type)s);" % locals() ) @@ -210,7 +213,7 @@ def enumeration(self, name, enum): ref = self.strings.append(name) items = ",".join(self.strings.append(v) for v in enum.values) self.statements.append( - ' %(schema_name)s_types[%(index_in_schema)d] = new enumeration_type(%(ref)s, %(index_in_schema)d, {%(items)s});' + " %(schema_name)s_types[%(index_in_schema)d] = new enumeration_type(%(ref)s, %(index_in_schema)d, {%(items)s});" % locals() ) @@ -218,10 +221,14 @@ def entity(self, name, type): schema_name = self.schema_name.upper() index_in_schema = self.names.index(name) ref = self.strings.append(name) - supertype = "0" if len(type.supertypes) == 0 else "%s_types[%d]" % (self.schema_name, self.names.index(type.supertypes[0])) + supertype = ( + "0" + if len(type.supertypes) == 0 + else "%s_types[%d]" % (self.schema_name, self.names.index(type.supertypes[0])) + ) is_abstract = "true" if type.abstract else "false" self.statements.append( - ' %(schema_name)s_types[%(index_in_schema)d] = new entity(%(ref)s, %(is_abstract)s, %(index_in_schema)d, (entity*) %(supertype)s);' + " %(schema_name)s_types[%(index_in_schema)d] = new entity(%(ref)s, %(is_abstract)s, %(index_in_schema)d, (entity*) %(supertype)s);" % locals() ) @@ -233,73 +240,89 @@ def select(self, name, type): map(lambda v: "%s_types[%d]" % (self.schema_name, self.names.index(v)), sorted(map(str, type.values))) ) self.statements.append( - ' %(schema_name)s_types[%(index_in_schema)d] = new select_type(%(ref)s, %(index_in_schema)d, {%(items)s});' + " %(schema_name)s_types[%(index_in_schema)d] = new select_type(%(ref)s, %(index_in_schema)d, {%(items)s});" % locals() ) def entity_attributes(self, name, attribute_definitions, is_derived): schema_name = self.schema_name.upper() index_in_schema = self.names.index(name) + def _(): index_in_schema = self.names.index(name) schema_name = self.schema_name for attr_name, decl_type, optional in attribute_definitions: attr_name_ref = self.strings.append(attr_name) optional_cpp = str(optional).lower() - yield 'new attribute(%(attr_name_ref)s, %(decl_type)s, %(optional_cpp)s)' % locals() + yield "new attribute(%(attr_name_ref)s, %(decl_type)s, %(optional_cpp)s)" % locals() + attributes = ",".join(_()) derived = ",".join(map(lambda b: str(b).lower(), is_derived)) - self.statements.append(" ((entity*)%(schema_name)s_types[%(index_in_schema)d])->set_attributes({%(attributes)s}, {%(derived)s});" % locals()) + self.statements.append( + " ((entity*)%(schema_name)s_types[%(index_in_schema)d])->set_attributes({%(attributes)s}, {%(derived)s});" + % locals() + ) def inverse_attributes(self, name, inv_attrs): schema_name = self.schema_name.upper() index_in_schema = self.names.index(name) + def _(): schema_name = self.schema_name index_in_schema = self.names.index(name) for attr_name, aggr_type, bound1, bound2, entity_ref, attribute_entity, attribute_entity_index in inv_attrs: attr_name_ref = self.strings.append(attr_name) opposite_index_in_schema = self.names.index(entity_ref) - opposite1 = '%(schema_name)s_types[%(opposite_index_in_schema)d]' % locals() + opposite1 = "%(schema_name)s_types[%(opposite_index_in_schema)d]" % locals() opposite_index_in_schema = self.names.index(attribute_entity) - opposite2 = '%(schema_name)s_types[%(opposite_index_in_schema)d]' % locals() - yield 'new inverse_attribute(%(attr_name_ref)s, inverse_attribute::%(aggr_type)s_type, %(bound1)d, %(bound2)d, ((entity*) %(opposite1)s), ((entity*) %(opposite2)s)->attributes()[%(attribute_entity_index)d])' % locals() + opposite2 = "%(schema_name)s_types[%(opposite_index_in_schema)d]" % locals() + yield "new inverse_attribute(%(attr_name_ref)s, inverse_attribute::%(aggr_type)s_type, %(bound1)d, %(bound2)d, ((entity*) %(opposite1)s), ((entity*) %(opposite2)s)->attributes()[%(attribute_entity_index)d])" % locals() + attributes = ",".join(_()) - self.statements.append(" ((entity*) %(schema_name)s_types[%(index_in_schema)d])->set_inverse_attributes({%(attributes)s});" % locals()) + self.statements.append( + " ((entity*) %(schema_name)s_types[%(index_in_schema)d])->set_inverse_attributes({%(attributes)s});" + % locals() + ) def entity_subtypes(self, name, tys): schema_name = self.schema_name.upper() index_in_schema = self.names.index(name) - subtypes = ",".join(map(lambda t: ("((entity*) %%(schema_name)s_types[%d])" % self.names.index(t)), tys)) % locals() - self.statements.append(" ((entity*) %(schema_name)s_types[%(index_in_schema)d])->set_subtypes({%(subtypes)s});" % locals()) + subtypes = ( + ",".join(map(lambda t: ("((entity*) %%(schema_name)s_types[%d])" % self.names.index(t)), tys)) % locals() + ) + self.statements.append( + " ((entity*) %(schema_name)s_types[%(index_in_schema)d])->set_subtypes({%(subtypes)s});" % locals() + ) def finalize(self, can_be_instantiated_set): schema_name = self.schema_name.upper() schema_name_title = self.schema_name.capitalize() + def _(): schema_name = self.schema_name.upper() schema_name_title = self.schema_name.capitalize() for type_name in self.names: index_in_schema = self.names.index(type_name) yield "%(schema_name)s_types[%(index_in_schema)d]" % locals() + declarations = ",".join(_()) schema_name_ref = self.strings.append(schema_name) self.statements.append( - ' return new schema_definition(%(schema_name_ref)s, {%(declarations)s}, new %(schema_name)s_instance_factory());' + " return new schema_definition(%(schema_name_ref)s, {%(declarations)s}, new %(schema_name)s_instance_factory());" % locals() ) - self.statements.append("}"); - -# self.statements.append( -# """ -# #if defined(__clang__) -# #elif defined(__GNUC__) || defined(__GNUG__) -# #pragma GCC pop_options -# #elif defined(_MSC_VER) -# #pragma optimize("", on) -# #endif -# """ -# ) + self.statements.append("}") + + # self.statements.append( + # """ + # #if defined(__clang__) + # #elif defined(__GNUC__) || defined(__GNUG__) + # #pragma GCC pop_options + # #elif defined(_MSC_VER) + # #pragma optimize("", on) + # #endif + # """ + # ) self.statements.extend( ( @@ -340,24 +363,18 @@ def can_be_instantiated(idx_name): ) ) - self.statements[self.statements.index("{factory_placeholder}")] = ( - """ + self.statements[self.statements.index("{factory_placeholder}")] = """ class %(schema_name)s_instance_factory : public IfcParse::instance_factory { virtual IfcUtil::IfcBaseClass* operator()(const IfcParse::declaration* decl, IfcEntityInstanceData&& data) const { %(instance_mapping)s } }; -""" - % locals() - ) +""" % locals() "" - self.statements[self.statements.index("{string_pool_placeholder}")] = ( - """ + self.statements[self.statements.index("{string_pool_placeholder}")] = """ const std::string strings[] = {%s}; -""" - % ",".join(map(lambda s: '"%s"s' % s, self.strings)) - ) +""" % ",".join(map(lambda s: '"%s"s' % s, self.strings)) def __str__(self): return "\n".join(self.statements) @@ -379,16 +396,19 @@ def transform_to_indexed(fn): def wrapper(*args, **kwargs): schema_name_upper = mapping.schema.name.upper() declared_type = fn(*args, **kwargs) - if 'simple_type' in declared_type: + if "simple_type" in declared_type: pass else: - match = re.search(r'\((\w+?_[\w+]+?_\w+?)\)', declared_type) + match = re.search(r"\((\w+?_[\w+]+?_\w+?)\)", declared_type) if match: old_decl = match.group(1) - name = old_decl.lower().replace(schema_name.lower() + '_', '').replace('_type', '') + name = old_decl.lower().replace(schema_name.lower() + "_", "").replace("_type", "") idx = [n.lower() for n in x.names].index(name) - declared_type = declared_type.replace(old_decl, '%(schema_name_upper)s_types[%(idx)d]' % locals()) + declared_type = declared_type.replace( + old_decl, "%(schema_name_upper)s_types[%(idx)d]" % locals() + ) return declared_type + return wrapper if code == EarlyBoundCodeWriter else fn @transform_to_indexed diff --git a/src/ifcopenshell-python/ifcopenshell/express/templates.py b/src/ifcopenshell-python/ifcopenshell/express/templates.py index e0398fd58d8..564fe881a55 100644 --- a/src/ifcopenshell-python/ifcopenshell/express/templates.py +++ b/src/ifcopenshell-python/ifcopenshell/express/templates.py @@ -217,7 +217,7 @@ class IFC_PARSE_API %(name)s : %(superclass)s { %(schema_name)s::%(name)s::%(name)s(%(constructor_arguments)s) : %(superclass_num_attrs)s { %(constructor_implementation)s; populate_derived(); } """ -# data_ = e; +# data_ = e; # data_ = new IfcEntityInstanceData(%(schema_name_upper)s_types[%(index_in_schema)d]); optional_attribute_description = "/// Whether the optional attribute %s is defined for this %s" @@ -255,32 +255,16 @@ class IFC_PARSE_API %(name)s : %(superclass)s { get_inverse = "if (!file_) { return nullptr; } return file_->getInverse(id_, %(schema_name_upper)s_types[%(type_index)d], %(index)d)->as<%(type)s>();" -set_attr_stmt = ( - "%(check_optional_set_begin)sset_attribute_value(%(index)d, %(star_if_optional)sv);%(check_optional_set_else)sunset_attribute_value(%(index)d);%(check_optional_set_end)s" -) -set_attr_instance = ( - "%(check_optional_set_begin)sset_attribute_value(%(index)d, v->as());%(check_optional_set_else)sunset_attribute_value(%(index)d);%(check_optional_set_end)s" -) -set_attr_stmt_enum = "%(check_optional_set_begin)sset_attribute_value(%(index)d, EnumerationReference(&%(non_optional_type)s::Class(), (size_t) %(star_if_optional)sv));%(check_optional_set_else)sunset_attribute_value(%(index)d);%(check_optional_set_end)s" -set_attr_stmt_array = ( - "%(check_optional_set_begin)sset_attribute_value(%(index)d, (%(star_if_optional)sv)->generalize());%(check_optional_set_else)sunset_attribute_value(%(index)d);%(check_optional_set_end)s" -) +set_attr_stmt = "%(check_optional_set_begin)sset_attribute_value(%(index)d, %(star_if_optional)sv);%(check_optional_set_else)sunset_attribute_value(%(index)d);%(check_optional_set_end)s" +set_attr_instance = "%(check_optional_set_begin)sset_attribute_value(%(index)d, v->as());%(check_optional_set_else)sunset_attribute_value(%(index)d);%(check_optional_set_end)s" +set_attr_stmt_enum = "%(check_optional_set_begin)sset_attribute_value(%(index)d, EnumerationReference(&%(non_optional_type)s::Class(), (size_t) %(star_if_optional)sv));%(check_optional_set_else)sunset_attribute_value(%(index)d);%(check_optional_set_end)s" +set_attr_stmt_array = "%(check_optional_set_begin)sset_attribute_value(%(index)d, (%(star_if_optional)sv)->generalize());%(check_optional_set_else)sunset_attribute_value(%(index)d);%(check_optional_set_end)s" -constructor_stmt = ( - "set_attribute_value(%(index)d, (%(name)s));" -) -constructor_stmt_enum = ( - "set_attribute_value(%(index)d, (EnumerationReference(&%(type)s::Class(),(size_t)%(name)s)));" -) -constructor_stmt_array = ( - "set_attribute_value(%(index)d, (%(name)s)->generalize());" -) -constructor_stmt_derived = ( - "" -) -constructor_stmt_instance = ( - "set_attribute_value(%(index)d, %(name)s ? %(name)s->as() : (IfcUtil::IfcBaseClass*) nullptr);" -) +constructor_stmt = "set_attribute_value(%(index)d, (%(name)s));" +constructor_stmt_enum = "set_attribute_value(%(index)d, (EnumerationReference(&%(type)s::Class(),(size_t)%(name)s)));" +constructor_stmt_array = "set_attribute_value(%(index)d, (%(name)s)->generalize());" +constructor_stmt_derived = "" +constructor_stmt_instance = "set_attribute_value(%(index)d, %(name)s ? %(name)s->as() : (IfcUtil::IfcBaseClass*) nullptr);" constructor_stmt_optional = " if (%(name)s) {%(stmt)s }" diff --git a/src/ifcopenshell-python/ifcopenshell/geom/__init__.py b/src/ifcopenshell-python/ifcopenshell/geom/__init__.py index 604e5b8e371..2b01d63925a 100644 --- a/src/ifcopenshell-python/ifcopenshell/geom/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/geom/__init__.py @@ -33,14 +33,14 @@ def _has_occ(): # Previous versions (pythonocc<=0.17.3) are using just OCC. try: - import OCC.Core.BRepTools + import OCC.Core.BRepTools # pyright: ignore[reportMissingImports] # ty:ignore[unresolved-import] return True except ImportError: pass try: - import OCC.BRepTools + import OCC.BRepTools # noqa: F401 # pyright: ignore[reportMissingImports] # ty:ignore[unresolved-import] return True except ImportError: @@ -52,6 +52,6 @@ def _has_occ(): has_occ = _has_occ() if has_occ: - from . import occ_utils as utils + from . import occ_utils as utils # noqa: F401 from .main import * diff --git a/src/ifcopenshell-python/ifcopenshell/geom/app.py b/src/ifcopenshell-python/ifcopenshell/geom/app.py index 4ee0a5d482a..d6bab207f1c 100644 --- a/src/ifcopenshell-python/ifcopenshell/geom/app.py +++ b/src/ifcopenshell-python/ifcopenshell/geom/app.py @@ -18,7 +18,6 @@ import functools import multiprocessing -import operator import os import sys import time @@ -26,11 +25,10 @@ import ifcopenshell.ifcopenshell_wrapper as W try: - from OCC.Core import AIS + from OCC.Core import AIS # noqa: F401 USE_OCCT_HANDLE = False except ImportError: - from OCC import AIS USE_OCCT_HANDLE = True @@ -56,7 +54,6 @@ try: from OCC.Display.pyqt5Display import qtViewer3d except BaseException: - import OCC.Display try: import OCC.Display.backend @@ -148,8 +145,7 @@ def Cfg(): config.set( "snippets", "print all wall ids", - self.config_encode( - """ + self.config_encode(""" ########################################################################### # A simple script that iterates over all walls in the current model # # and prints their Globally unique IDs (GUIDS) to the console window # @@ -157,15 +153,13 @@ def Cfg(): for wall in model.by_type("IfcWall"): print ("wall with global id: "+str(wall.GlobalId)) -""".lstrip() - ), +""".lstrip()), ) config.set( "snippets", "print properties of current selection", - self.config_encode( - """ + self.config_encode(""" ########################################################################### # A simple script that iterates over all IfcPropertySets of the currently # # selected object and prints them to the console # @@ -183,8 +177,7 @@ def Cfg(): for prop in relDefinesByProperties.RelatingPropertyDefinition.HasProperties: print ("{:<20} :{}".format(prop.Name,prop.NominalValue.wrappedValue)) print ("\\n") -""".lstrip() - ), +""".lstrip()), ) with open(conf_file, "w") as configfile: config.write(configfile) diff --git a/src/ifcopenshell-python/ifcopenshell/geom/code_editor_pane.py b/src/ifcopenshell-python/ifcopenshell/geom/code_editor_pane.py index ff46b67d8d9..3e130debbc6 100644 --- a/src/ifcopenshell-python/ifcopenshell/geom/code_editor_pane.py +++ b/src/ifcopenshell-python/ifcopenshell/geom/code_editor_pane.py @@ -17,7 +17,6 @@ # along with IfcOpenShell. If not, see . import logging -import os import sys from code import InteractiveConsole @@ -30,14 +29,11 @@ try: from pyqode.core import api, modes, panels - from pyqode.core.api import CodeEdit, ColorScheme - from pyqode.core.panels import CheckerPanel + from pyqode.core.api import CodeEdit from pyqode.python import modes as pymodes from pyqode.python import panels as pypanels - from pyqode.python import widgets from pyqode.python.backend import server - from pyqode.python.modes import PyAutoIndentMode, PythonSH - from pyqode.python.widgets import PyInteractiveConsole + from pyqode.python.modes import PythonSH has_pyqode = True except BaseException: diff --git a/src/ifcopenshell-python/ifcopenshell/geom/main.py b/src/ifcopenshell-python/ifcopenshell/geom/main.py index fe31a15d84c..9c36e4b9335 100644 --- a/src/ifcopenshell-python/ifcopenshell/geom/main.py +++ b/src/ifcopenshell-python/ifcopenshell/geom/main.py @@ -19,9 +19,6 @@ from __future__ import annotations -import operator -import os -import sys from collections.abc import Generator, Iterable from typing import TYPE_CHECKING, Any, Literal, Optional, TypeVar, Union, cast, overload @@ -31,7 +28,7 @@ from . import has_occ if TYPE_CHECKING: - from OCC.Core import TopoDS + from OCC.Core import TopoDS # pyright: ignore[reportMissingImports] # ty:ignore[unresolved-import] IteratorOutput = Union["ShapeElementType", "utils.shape_tuple"] @@ -50,9 +47,9 @@ def wrap_shape_creation(settings, shape): from . import occ_utils as utils try: - from OCC.Core import TopoDS + from OCC.Core import TopoDS # pyright: ignore[reportMissingImports] # ty:ignore[unresolved-import] except ImportError: - from OCC import TopoDS + from OCC import TopoDS # pyright: ignore[reportMissingImports] # ty:ignore[unresolved-import] def wrap_shape_creation(settings: settings, shape: ifcopenshell_wrapper.Element): if getattr(settings, "use_python_opencascade", False): @@ -92,6 +89,7 @@ def wrap_shape_creation(settings: settings, shape: ifcopenshell_wrapper.Element) "keep-bounding-boxes", "layerset-first", "length-unit", + "make-volume", "max-offset-deviation", "max-offset", "mesher-angular-deflection", @@ -127,6 +125,7 @@ def wrap_shape_creation(settings: settings, shape: ifcopenshell_wrapper.Element) "ecef", "digits", "wkt-use-section", + "separate-z-up-node", ] # NOTE: hybrid-cgal-simple-opencascade is added just as an example diff --git a/src/ifcopenshell-python/ifcopenshell/geom/occ_utils.py b/src/ifcopenshell-python/ifcopenshell/geom/occ_utils.py index 9abddff4707..15a4dfc838f 100644 --- a/src/ifcopenshell-python/ifcopenshell/geom/occ_utils.py +++ b/src/ifcopenshell-python/ifcopenshell/geom/occ_utils.py @@ -24,19 +24,35 @@ import random import warnings from collections.abc import Iterable -from typing import Any, NamedTuple, Union +from typing import NamedTuple, Union -import OCC +import OCC # pyright: ignore[reportMissingImports] # ty:ignore[unresolved-import] from typing_extensions import assert_never import ifcopenshell.ifcopenshell_wrapper as ifcopenshell_wrapper try: - from OCC.Core import AIS, BRepTools, Graphic3d, Quantity, TopoDS, V3d, gp + from OCC.Core import ( # pyright: ignore[reportMissingImports] # ty:ignore[unresolved-import] + AIS, + BRepTools, + Graphic3d, + Quantity, + TopoDS, + V3d, + gp, + ) USE_OCCT_HANDLE = False except ImportError: - from OCC import AIS, BRepTools, Graphic3d, Quantity, TopoDS, V3d, gp + from OCC import ( # pyright: ignore[reportMissingImports] # ty:ignore[unresolved-import] + AIS, + BRepTools, + Graphic3d, + Quantity, + TopoDS, + V3d, + gp, + ) USE_OCCT_HANDLE = True @@ -68,7 +84,7 @@ class shape_tuple(NamedTuple): def initialize_display(): - import OCC.Display.SimpleGui + import OCC.Display.SimpleGui # pyright: ignore[reportMissingImports] # ty:ignore[unresolved-import] global handle, main_loop, add_menu, add_function_to_menu handle, main_loop, add_menu, add_function_to_menu = OCC.Display.SimpleGui.init_display() diff --git a/src/ifcopenshell-python/ifcopenshell/ifcopenshell_wrapper.pyi b/src/ifcopenshell-python/ifcopenshell/ifcopenshell_wrapper.pyi index c906f570551..28caafc2627 100644 --- a/src/ifcopenshell-python/ifcopenshell/ifcopenshell_wrapper.pyi +++ b/src/ifcopenshell-python/ifcopenshell/ifcopenshell_wrapper.pyi @@ -104,6 +104,7 @@ class IfcSpfHeader: https://standards.buildingsmart.org/documents/Implementation/ImplementationGuide_IFCHeaderData_Version_1.0.2.pdf """ + def __init__(self, *args): ... def file(self, *args): ... def file_description_py(self): ... def file_name_py(self): ... @@ -113,7 +114,8 @@ class IfcSpfHeader: def write(self, out): ... class BRep(Representation): - def as_compound(self, force_meters): ... + def __init__(self, settings, entity, id, shapes): ... + def as_compound(self, force_meters=False): ... def begin(self): ... def calculate_projected_surface_area(self, ax, along_x, along_y, along_z): ... def calculate_surface_area(self, arg2): ... @@ -125,6 +127,7 @@ class BRep(Representation): def size(self): ... class BRepElement(Element): + def __init__(self, id, parent_id, name, type, guid, context, trsf, geometry, product): ... def calculate_projected_surface_area(self, along_x, along_y, along_z): ... @property def geometry(self) -> BRep: ... @@ -135,6 +138,7 @@ class BRepElement(Element): def volume(self): ... class ColladaSerializer(WriteOnlyGeometrySerializer): + def __init__(self, dae_filename, geometry_settings, settings): ... def finalize(self): ... def isTesselated(self): ... def object_id(self, o): ... @@ -150,8 +154,9 @@ class ConversionResult: def Shape(self): ... def Style(self): ... def StylePtr(self): ... + def __init__(self, *args): ... def append(self, trsf): ... - def apply_transform(self, unit_scale): ... + def apply_transform(self, unit_scale=1.0): ... def hasStyle(self): ... def prepend(self, trsf): ... def setStyle(self, newStyle): ... @@ -159,6 +164,7 @@ class ConversionResult: class ConversionResultShape: def Serialize(self, place, arg3): ... def Triangulate(self, *args): ... + def __init__(self, *args, **kwargs): ... def add(self, arg2): ... def area(self): ... def axis(self): ... @@ -193,6 +199,7 @@ class ConversionResultShape: def wrap_in_compound(self): ... class DoubleArray3: + def __init__(self, *args): ... def back(self): ... def begin(self): ... def empty(self): ... @@ -206,6 +213,7 @@ class DoubleArray3: def swap(self, v): ... class Element: + def __init__(self, settings, id, parent_id, name, type, guid, context, trsf, product): ... # TODO: Remove from the wrapper? def SetParents(self, newparents): ... # TODO: could it be None? @@ -266,6 +274,7 @@ class Element: class GeometrySerializer: READ_BREP: Any READ_TRIANGULATION: Any + def __init__(self, *args, **kwargs): ... def geometry_settings(self, *args): ... def isTesselated(self): ... def object_id(self, o): ... @@ -275,6 +284,7 @@ class GeometrySerializer: def write(self, *args): ... class GltfSerializer(WriteOnlyGeometrySerializer): + def __init__(self, filename, geometry_settings, settings): ... def finalize(self): ... def isTesselated(self): ... def ready(self): ... @@ -284,6 +294,7 @@ class GltfSerializer(WriteOnlyGeometrySerializer): def writeHeader(self): ... class HdfSerializer(GeometrySerializer): + def __init__(self, hdf_filename, geometry_settings, settings, read_only=False): ... def finalize(self): ... def isTesselated(self): ... def read(self, *args): ... @@ -295,6 +306,7 @@ class HdfSerializer(GeometrySerializer): def writeHeader(self): ... class IfcBaseEntity(entity_instance): + def __init__(self, *args, **kwargs): ... def declaration(self): ... def get(self, name): ... def get_inverse(self, name): ... @@ -302,26 +314,31 @@ class IfcBaseEntity(entity_instance): def set_id(self, i): ... class IfcBaseType(entity_instance): + def __init__(self, *args, **kwargs): ... def declaration(self): ... -class IfcEntityInstanceData: ... +class IfcEntityInstanceData: + def __init__(self, *args, **kwargs): ... class IfcLateBoundEntity(IfcBaseEntity): + def __init__(self, decl, data): ... def declaration(self): ... class InstanceStreamer: + def __init__(self, *args): ... def bypassTypes(self, type_names): ... def bypassed_instances(self): ... coerce_attribute_count: bool def hasSemicolon(self): ... def inverses(self, *args): ... def pushPage(self, page): ... - def readInstancePy(self, type_as_declaration_instance): ... + def readInstancePy(self, type_as_declaration_instance=False): ... def references(self, *args): ... def semicolonCount(self): ... def status(self): ... class Iterator: + def __init__(self, *args): ... initialization_outcome_: Any processed_: Any def bounds_max(self): ... @@ -367,25 +384,36 @@ class Iterator: class JsonSerializer: JSON_DIALECT_CREOOX: Any + def __init__(self, *args): ... def finalize(self): ... def ready(self): ... def setFile(self, arg2): ... def writeHeader(self): ... +# TODO: MakeVolume is ignored in SWIG, remove from stub once build is bumped. +class MakeVolume: + defaultvalue: Any + description: Any + name: Any + class OpaqueCoordinate_3: + def __init__(self, *args): ... def get(self, i): ... def set(self, i, n): ... class OpaqueCoordinate_4: + def __init__(self, *args): ... def get(self, i): ... def set(self, i, n): ... class OpaqueNumber: + def __init__(self, *args, **kwargs): ... def clone(self): ... def to_double(self): ... def to_string(self): ... class Representation: + def __init__(self, settings, entity, id): ... def entity(self): ... @property def id(self) -> str: @@ -398,18 +426,21 @@ class Representation: def settings(self): ... class RocksDBPrefixIterator: + def __init__(self, storage, prefix): ... def key(self): ... def next(self): ... def valid(self): ... def value(self): ... class RocksDbSerializer: - def finalize(self): ... - def ready(self): ... - def setFile(self, arg2): ... - def writeHeader(self): ... + def __init__(self, *args): ... + def finalize(self) -> None: ... + def ready(self) -> bool: ... + def setFile(self, arg2) -> None: ... + def writeHeader(self) -> None: ... class Serialization(Representation): + def __init__(self, brep): ... @property def brep_data(self): ... @property @@ -418,6 +449,7 @@ class Serialization(Representation): def surface_styles(self): ... class SerializedElement(Element): + def __init__(self, shape_model): ... @property def geometry(self) -> Serialization: ... @@ -434,6 +466,7 @@ class Settings: def setting_names(self): ... class SvgSerializer(WriteOnlyGeometrySerializer): + def __init__(self, out_filename, geometry_settings, settings): ... SH_NONE: Any SH_FULL: Any SH_LEFT: Any @@ -479,8 +512,8 @@ class SvgSerializer(WriteOnlyGeometrySerializer): def setPrintSpaceNames(self, b): ... def setProfileThreshold(self, i): ... def setScale(self, s): ... - def setSectionHeight(self, h, storey): ... - def setSectionHeightsFromStoreys(self, offset): ... + def setSectionHeight(self, h, storey=None): ... + def setSectionHeightsFromStoreys(self, offset=1.2): ... def setSectionRef(self, s): ... def setSegmentProjection(self, b): ... def setSpaceNameTransform(self, v): ... @@ -497,22 +530,25 @@ class SvgSerializer(WriteOnlyGeometrySerializer): def writeHeader(self): ... class SwigPyIterator: + def __init__(self, *args, **kwargs): ... def advance(self, n): ... def copy(self): ... - def decr(self, n): ... + def decr(self, n=1): ... def distance(self, x): ... def equal(self, x): ... - def incr(self, n): ... + def incr(self, n=1): ... def next(self): ... def previous(self): ... def value(self): ... class Transformation: + def __init__(self, settings, matrix): ... def data(self): ... @property def matrix(self): ... class Triangulation(Representation): + def __init__(self, *args): ... def addEdge(self, item_id, style, i0, i1): ... def addFace(self, *args): ... def addNormal(self, X, Y, Z): ... @@ -567,21 +603,24 @@ class Triangulation(Representation): def verts_buffer(self) -> bytes: ... class TriangulationElement(Element): + def __init__(self, *args): ... @property def geometry(self) -> Triangulation: ... def geometry_pointer(self): ... class TtlWktSerializer(WriteOnlyGeometrySerializer): + def __init__(self, filename, geometry_settings, settings): ... def finalize(self): ... def isTesselated(self): ... def ready(self): ... def setFile(self, arg2): ... def setUnitNameAndMagnitude(self, arg2, arg3): ... - def ttl_object_id(self, o, postfix): ... + def ttl_object_id(self, o, postfix=None): ... def write(self, *args): ... def writeHeader(self): ... class WaveFrontOBJSerializer(WriteOnlyGeometrySerializer): + def __init__(self, obj_filename, mtl_filename, geometry_settings, settings): ... def finalize(self): ... def isTesselated(self): ... def ready(self): ... @@ -592,9 +631,11 @@ class WaveFrontOBJSerializer(WriteOnlyGeometrySerializer): def writeMaterial(self, style): ... class WriteOnlyGeometrySerializer(GeometrySerializer): + def __init__(self, *args, **kwargs): ... def read(self, *args): ... class XmlSerializer: + def __init__(self, file, xml_filename): ... def finalize(self): ... def ready(self): ... def setFile(self, arg2): ... @@ -603,6 +644,7 @@ class XmlSerializer: class _SwigNonDynamicMeta(type): ... class abstract_arrangement: + def __init__(self, *args, **kwargs): ... def get_face_pairs(self): ... def merge(self, edge_indices): ... def num_edges(self): ... @@ -610,6 +652,7 @@ class abstract_arrangement: def write(self, polygons, progress): ... class aggregation_type(parameter_type): + def __init__(self, type_of_aggregation, bound1, bound2, type_of_element): ... array_type: Any bag_type: Any list_type: Any @@ -622,6 +665,7 @@ class aggregation_type(parameter_type): def type_of_element(self) -> parameter_type: ... class attribute: + def __init__(self, name, type_of_attribute, optional): ... def name(self) -> str: ... def optional(self) -> bool: ... def type_of_attribute(self) -> parameter_type: ... @@ -662,11 +706,13 @@ class bspline_surface(surface): def kind(self): ... class buffer: + def __init__(self, *args): ... def filename(self): ... def get_value(self): ... def is_ready(self): ... class cant_function(function_item): + def __init__(self, *args): ... def calc_hash(self): ... def clone_(self): ... def end(self): ... @@ -694,6 +740,7 @@ class clash: p2: Any class clashes: + def __init__(self, *args): ... def append(self, x): ... def assign(self, n, x): ... def back(self): ... @@ -727,6 +774,7 @@ class collection: def matrix(self): ... class colour(item): + def __init__(self, *args): ... def r(self) -> float: ... def g(self) -> float: ... def b(self) -> float: ... @@ -740,6 +788,7 @@ class colour(item): def kind(self) -> int: ... class context: + def __init__(self, *args): ... def add(self, segments): ... def build(self): ... def get_face_pairs(self): ... @@ -749,7 +798,8 @@ class context: def write(self, arg2): ... class curve(geom_item): - def print_impl(self, o, classname, indent): ... + def __init__(self, *args, **kwargs): ... + def print_impl(self, o, classname, indent=0): ... class cylinder(surface): radius: Any @@ -760,6 +810,7 @@ class cylinder(surface): def matrix(self): ... class declaration: + def __init__(self, name, index_in_schema): ... def _is(self, *args: Union[str, declaration]) -> bool: ... def as_entity(self) -> Union[entity, None]: ... def as_enumeration_type(self) -> Union[enumeration_type, None]: ... @@ -775,6 +826,7 @@ class declaration: def type(self): ... class direction3: + def __init__(self, *args): ... def calc_hash(self): ... def clone_(self): ... @property @@ -786,6 +838,7 @@ class drawing_meta: pln_3d: Any class edge(trimmed_curve): + def __init__(self, *args): ... def calc_hash(self): ... def clone_(self): ... def kind(self): ... @@ -800,6 +853,7 @@ class ellipse(curve): def matrix(self): ... class entity(declaration): + def __init__(self, name, is_abstract, index_in_schema, supertype): ... def all_attributes(self) -> tuple[attribute, ...]: ... def all_inverse_attributes(self) -> tuple[inverse_attribute, ...]: ... def argument_types(self) -> tuple[str, ...]: @@ -828,6 +882,7 @@ class entity(declaration): def supertype(self) -> Union[entity, None]: ... class entity_instance: + def __init__(self, *args, **kwargs): ... file: ifcopenshell.file """Reference to IFC file to prevent it's garbage collection, if entity is still used.""" @@ -881,11 +936,12 @@ class entity_instance: def setArgumentAsNull(self, i): ... def setArgumentAsString(self, i, a): ... def set_attribute_value(self, *args): ... - def toString(self, arg2, upper): ... - def to_string(self, valid_spf): ... + def toString(self, arg2, upper=False): ... + def to_string(self, valid_spf=True): ... def unset_attribute_value(self, i): ... class enumeration_type(declaration): + def __init__(self, name, index_in_schema, enumeration_items): ... def argument_types(self) -> tuple[str, ...]: ... def as_enumeration_type(self) -> enumeration_type: ... def enumeration_items(self) -> tuple[str, ...]: ... @@ -898,6 +954,7 @@ class enumeration_type(declaration): ... class extrusion(sweep): + def __init__(self, m, basis, dir, d): ... depth: Any direction: Any def calc_hash(self): ... @@ -919,7 +976,8 @@ class face: class file: def FreshId(self): ... - def add(self, entity: entity_instance, id: int) -> entity_instance: ... + def __init__(self, *args): ... + def add(self, entity: entity_instance, id: int = -1) -> entity_instance: ... def addEntities(self, entities): ... def add_type_ref(self, new_entity): ... def batch(self) -> None: @@ -950,7 +1008,7 @@ class file: def by_id(self, id: int) -> entity_instance: ... def by_type(self, *args): ... def by_type_excl_subtypes(self, *args): ... - def bypass_type(self, type_name): ... + def bypass_type(self, type_name: str) -> None: ... calculate_unit_factors: bool check_existance_before_adding: bool def create(self, decl): ... @@ -1010,9 +1068,9 @@ class file: def storage_mode(self): ... def to_string(self): ... @staticmethod - def traverse(instance: entity_instance, max_level: int) -> tuple[entity_instance, ...]: ... + def traverse(instance: entity_instance, max_level: int = -1) -> tuple[entity_instance, ...]: ... @staticmethod - def traverse_breadth_first(instance: entity_instance, max_level: int) -> tuple[entity_instance, ...]: ... + def traverse_breadth_first(instance: entity_instance, max_level: int = -1) -> tuple[entity_instance, ...]: ... def types(self) -> tuple[str, ...]: """Return a tuple of classes present in the file. @@ -1029,9 +1087,11 @@ class file_open_status: UNSUPPORTED_SCHEMA: int INVALID_SYNTAX: int UNKNOWN: int + def __init__(self, *args): ... def value(self): ... class fn_evaluator: + def __init__(self, *args, **kwargs): ... settings_: Any def clone(self): ... def end(self): ... @@ -1040,6 +1100,7 @@ class fn_evaluator: def start(self): ... class function_item(implicit_item): + def __init__(self, *args, **kwargs): ... def calc_hash(self): ... def end(self): ... def kind(self): ... @@ -1047,10 +1108,12 @@ class function_item(implicit_item): def start(self): ... class function_item_evaluator: + def __init__(self, *args): ... def evaluate(self, *args): ... def evaluation_points(self, *args): ... class functor_item(function_item): + def __init__(self, *args): ... def calc_hash(self): ... def clone_(self): ... def end(self): ... @@ -1058,6 +1121,7 @@ class functor_item(function_item): def start(self): ... class geom_item(item): + def __init__(self, *args, **kwargs): ... matrix: Any surface_style: Any @@ -1071,6 +1135,7 @@ class geometry_conversion_result: representation: Any class gradient_function(function_item): + def __init__(self, *args): ... def calc_hash(self): ... def clone_(self): ... def end(self): ... @@ -1082,9 +1147,12 @@ class gradient_function(function_item): class equal_functor: ... class hash_functor: ... class horizontal_plan_at_element: ... -class implicit_item(geom_item): ... + +class implicit_item(geom_item): + def __init__(self, *args, **kwargs): ... class inverse_attribute: + def __init__(self, name, type_of_aggregation, bound1, bound2, entity_reference, attribute_reference): ... bag_type: Any set_type: Any unspecified_type: Any @@ -1097,6 +1165,7 @@ class inverse_attribute: def type_of_aggregation_string(self): ... class item: + def __init__(self, *args, **kwargs): ... instance: Any orientation: Any def calc_hash(self): ... @@ -1119,6 +1188,7 @@ class line(curve): def matrix(self): ... class line_segment: + def __init__(self, *args): ... def back(self): ... def begin(self): ... def empty(self): ... @@ -1143,7 +1213,8 @@ class loft: class loop: closed: Any external: Any - fi: Any + function_item: Any + tags: Any def calc_hash(self): ... def calculate_linear_edge_curves(self): ... def centroid(self): ... @@ -1160,6 +1231,7 @@ class matrix4(item): AFFINE_W_UNIFORM_SCALE: Any AFFINE_W_NONUNIFORM_SCALE: Any OTHER: Any + def __init__(self, *args): ... tag: Any def calc_hash(self): ... def clone_(self): ... @@ -1172,6 +1244,7 @@ class matrix4(item): def pre_multiply_scale(self, s): ... class named_type(parameter_type): + def __init__(self, declared_type): ... def _is(self, *args): ... def as_named_type(self) -> named_type: ... def declared_type(self) -> declaration: ... @@ -1190,6 +1263,7 @@ class offset_curve(curve): def kind(self): ... class offset_function(function_item): + def __init__(self, *args): ... def calc_hash(self): ... def clone_(self): ... def end(self): ... @@ -1211,6 +1285,7 @@ class parameter_type: def as_simple_type(self) -> Union[simple_type, None]: ... class piecewise_function(function_item): + def __init__(self, *args): ... def calc_hash(self): ... def clone_(self): ... def end(self): ... @@ -1230,6 +1305,7 @@ class plane(surface): def matrix(self): ... class point3: + def __init__(self, *args): ... def calc_hash(self): ... def clone_(self): ... @property @@ -1251,6 +1327,7 @@ class ray_intersection_result: style_index: Any class ray_intersection_results: + def __init__(self, *args): ... def append(self, x): ... def assign(self, n, x): ... def back(self): ... @@ -1275,6 +1352,7 @@ class ray_intersection_results: def swap(self, v): ... class revolve(sweep): + def __init__(self, m, basis, pnt, dir, a): ... angle: Any axis_origin: Any direction: Any @@ -1285,6 +1363,7 @@ class revolve(sweep): def matrix(self): ... class schema_definition: + def __init__(self, name, declarations, factory): ... def declaration_by_name(self, *args: str) -> declaration: """ :return: ``declaration`` but upcasted to the most advanced available type @@ -1306,6 +1385,7 @@ class schema_definition: def name(self) -> str: ... class select_type(declaration): + def __init__(self, name, index_in_schema, select_list): ... def as_select_type(self) -> select_type: ... def select_list(self) -> tuple[declaration, ...]: ... @@ -1320,6 +1400,7 @@ class shell: def print_impl(self, o, indent): ... class simple_type(parameter_type): + def __init__(self, declared_type): ... binary_type: Any boolean_type: Any integer_type: Any @@ -1349,6 +1430,7 @@ class sphere(surface): def matrix(self): ... class style(item): + def __init__(self, *args): ... diffuse: colour name: str """E.g. 'IfcSurfaceStyleShading-218', where 218 is style's STEP id.""" @@ -1383,9 +1465,11 @@ class style(item): def kind(self) -> int: ... -class surface(geom_item): ... +class surface(geom_item): + def __init__(self, *args, **kwargs): ... class svg_groups_of_line_segments: + def __init__(self, *args): ... def append(self, x): ... def assign(self, n, x): ... def back(self): ... @@ -1410,6 +1494,7 @@ class svg_groups_of_line_segments: def swap(self, v): ... class svg_groups_of_polygons: + def __init__(self, *args): ... def append(self, x): ... def assign(self, n, x): ... def back(self): ... @@ -1434,6 +1519,7 @@ class svg_groups_of_polygons: def swap(self, v): ... class svg_line_segments: + def __init__(self, *args): ... def append(self, x): ... def assign(self, n, x): ... def back(self): ... @@ -1458,6 +1544,7 @@ class svg_line_segments: def swap(self, v): ... class svg_loop: + def __init__(self, *args): ... def append(self, x): ... def assign(self, n, x): ... def back(self): ... @@ -1482,6 +1569,7 @@ class svg_loop: def swap(self, v): ... class svg_loops: + def __init__(self, *args): ... def append(self, x): ... def assign(self, n, x): ... def back(self): ... @@ -1506,6 +1594,7 @@ class svg_loops: def swap(self, v): ... class svg_point: + def __init__(self, *args): ... def back(self): ... def begin(self): ... def empty(self): ... @@ -1519,6 +1608,7 @@ class svg_point: def swap(self, v): ... class svg_polygons: + def __init__(self, *args): ... def append(self, x): ... def assign(self, n, x): ... def back(self): ... @@ -1543,9 +1633,11 @@ class svg_polygons: def swap(self, v): ... class sweep(geom_item): + def __init__(self, *args, **kwargs): ... basis: Any class sweep_along_curve(sweep): + def __init__(self, *args): ... curve: Any surface: Any direction: Any @@ -1563,6 +1655,7 @@ class torus(surface): def matrix(self): ... class tree: + def __init__(self, *args): ... def add_element(self, *args): ... def add_file(self, *args): ... def clash_clearance_many(self, set_a, set_b, clearance, check_all): ... @@ -1575,7 +1668,7 @@ class tree: def protrusion_distances(self): ... def select(self, *args): ... def select_box(self, *args): ... - def select_ray(self, p0, d, length): ... + def select_ray(self, p0, d, length=1000.0): ... def styles(self): ... def uint8_to_b64(self, uuids_array): ... @staticmethod @@ -1583,6 +1676,7 @@ class tree: def write_h5(self): ... class trimmed_curve(geom_item): + def __init__(self, *args, **kwargs): ... basis: Any curve_sense: Any start: Any @@ -1594,6 +1688,7 @@ class type_by_kind: max: Any class type_declaration(declaration): + def __init__(self, name, index_in_schema, declared_type): ... def argument_types(self): ... def as_type_declaration(self) -> type_declaration: ... def declared_type(self): ... @@ -1612,7 +1707,7 @@ def create_epeck(*args): ... def create_shape(*args): ... def flatten(deep): ... def get_feature(x): ... -def get_info_cpp(v, include_identifier): ... +def get_info_cpp(v, include_identifier=True): ... def get_log(): ... def guess_file_type(fn): ... def helmert_curve_point(A0, A1, A2, s): ... @@ -1622,14 +1717,14 @@ def line_segments_to_polygons(s, eps, segments): ... def map_shape(settings, instance): ... def nary_union(sequence): ... def new_IfcBaseClass(schema_identifier: str, name: str) -> entity_instance: ... -def open(fn, readonly): ... +def open(fn: str, readonly: bool = False) -> file: ... def parse_ifcxml(filename): ... def polygons_to_svg(*args): ... def read(data): ... def register_schema(arg1): ... def schema_by_name(arg1: str) -> schema_definition: ... def schema_names() -> tuple[str, ...]: ... -def serialise(schema_name, shape_str, advanced): ... +def serialise(schema_name, shape_str, advanced=True): ... def set_feature(x, v): ... def set_log_format_json(): ... def set_log_format_text(): ... diff --git a/src/ifcopenshell-python/ifcopenshell/simple_spf b/src/ifcopenshell-python/ifcopenshell/simple_spf index 30317826f8f..ed50b756c40 160000 --- a/src/ifcopenshell-python/ifcopenshell/simple_spf +++ b/src/ifcopenshell-python/ifcopenshell/simple_spf @@ -1 +1 @@ -Subproject commit 30317826f8f743860ecff9e183699296593e42cb +Subproject commit ed50b756c4035290d50eb2d928f89423f3aa0947 diff --git a/src/ifcopenshell-python/ifcopenshell/util/cost.py b/src/ifcopenshell-python/ifcopenshell/util/cost.py index 19172c47108..4354e49e90c 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/cost.py +++ b/src/ifcopenshell-python/ifcopenshell/util/cost.py @@ -196,9 +196,12 @@ def get_cost_items_for_product(product: ifcopenshell.entity_instance) -> list[if :return: A list of IfcCostItem objects representing the cost items related to the product. """ cost_items = [] - for assignment in product.HasAssignments: - if assignment.is_a("IfcRelAssignsToControl") and assignment.RelatingControl.is_a("IfcCostItem"): - cost_items.append(assignment.RelatingControl) + for assignment in product.HasAssignments or []: + if assignment.is_a("IfcRelAssignsToControl"): + control = assignment.RelatingControl + if control and control.is_a("IfcCostItem"): + cost_items.append(control) + return cost_items @@ -352,8 +355,7 @@ def get_cost_rate( class CostValueUnserialiser: def parse(self, formula: str): - l = lark.Lark( - """start: formula + l = lark.Lark("""start: formula formula: operand (operator operand)* operand: value | category "(" formula ")" value: NUMBER? @@ -390,8 +392,7 @@ def parse(self, formula: str): NEWLINE: (CR? LF)+ %ignore WS // Disregard spaces in text - """ - ) + """) start = l.parse(formula) return self.get_formula(start.children[0]) diff --git a/src/ifcopenshell-python/ifcopenshell/util/doc.py b/src/ifcopenshell-python/ifcopenshell/util/doc.py index 9c7acf16b7f..b0443f6117f 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/doc.py +++ b/src/ifcopenshell-python/ifcopenshell/util/doc.py @@ -19,7 +19,7 @@ import copy import json from pathlib import Path -from typing import Any, Literal, Optional, TypedDict, Union +from typing import Optional, TypedDict, Union from typing_extensions import NotRequired diff --git a/src/ifcopenshell-python/ifcopenshell/util/element.py b/src/ifcopenshell-python/ifcopenshell/util/element.py index 149606cb142..8a8a817336a 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/element.py +++ b/src/ifcopenshell-python/ifcopenshell/util/element.py @@ -469,7 +469,7 @@ def get_properties( del data["HasProperties"] results[prop_name] = data if verbose: - results[prop_name] = {"id": data["id"], "class": data["class"], "value": results[prop_name]} + results[prop_name] = {"id": data["id"], "class": data["type"], "value": results[prop_name]} return results @@ -1234,7 +1234,9 @@ def get_controls(element: ifcopenshell.entity_instance) -> Generator[ifcopenshel yield rel.RelatingControl -def get_parent(element: ifcopenshell.entity_instance) -> Union[ifcopenshell.entity_instance, None]: +def get_parent( + element: ifcopenshell.entity_instance, ifc_class: Optional[str] = None +) -> Union[ifcopenshell.entity_instance, None]: """Get the parent in the spatial heirarchy IFC features a spatial hierarchy tree of all objects. Each spatial element @@ -1251,6 +1253,8 @@ def get_parent(element: ifcopenshell.entity_instance) -> Union[ifcopenshell.enti - Voiding: the opening voids another physical element, such as a hole in a wall :param element: Any physical or spatial element in the tree + :param ifc_class: Optionally filter the type of parent you're after. For + example, you may be after the storey, not a space. :return: Its parent. This must exist for any valid file, or None if we've reached the IfcProject. Example: @@ -1260,7 +1264,7 @@ def get_parent(element: ifcopenshell.entity_instance) -> Union[ifcopenshell.enti element = file.by_type("IfcWall")[0] parent = ifcopenshell.util.element.get_parent(element) """ - return ( + parent = ( get_container(element, should_get_direct=True) or get_aggregate(element) or get_nest(element) @@ -1268,6 +1272,16 @@ def get_parent(element: ifcopenshell.entity_instance) -> Union[ifcopenshell.enti or get_voided_element(element) ) + if not ifc_class: + return parent + + while parent: + if parent.is_a(ifc_class): + return parent + parent = get_parent(parent) + + return None + def get_filled_void(element: ifcopenshell.entity_instance) -> Union[ifcopenshell.entity_instance, None]: """If the element is filling a void, get the void diff --git a/src/ifcopenshell-python/ifcopenshell/util/generate_pset_templates.py b/src/ifcopenshell-python/ifcopenshell/util/generate_pset_templates.py index 87c65e2f28b..681c0740097 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/generate_pset_templates.py +++ b/src/ifcopenshell-python/ifcopenshell/util/generate_pset_templates.py @@ -30,7 +30,6 @@ import ifcopenshell.api.unit import ifcopenshell.guid import ifcopenshell.ifcopenshell_wrapper as W -import ifcopenshell.util.attribute if not RUN_FROM_DEV_REPO: import shutil diff --git a/src/ifcopenshell-python/ifcopenshell/util/geolocation.py b/src/ifcopenshell-python/ifcopenshell/util/geolocation.py index fba8dfffaf6..47c8886691a 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/geolocation.py +++ b/src/ifcopenshell-python/ifcopenshell/util/geolocation.py @@ -18,7 +18,7 @@ import math from decimal import ROUND_HALF_UP, Decimal -from typing import NamedTuple, Optional, Union +from typing import Any, NamedTuple, Optional, Union import numpy as np @@ -268,6 +268,15 @@ def get_helmert_transformation_parameters(ifc_file: ifcopenshell.file) -> Option return HelmertTransformation(e, n, h, xaa, xao, scale, factor_x, factor_y, factor_z) +def get_crs(ifc_file: ifcopenshell.file) -> dict[str, Any]: + """Get CRS information from an IFC file.""" + if ifc_file.schema == "IFC2X3": + return ifcopenshell.util.element.get_pset(ifc_file.by_type("IfcProject")[0], "ePSet_ProjectedCRS") + for context in ifc_file.by_type("IfcGeometricRepresentationContext", include_subtypes=False): + if operation := context.HasCoordinateOperation: + return operation[0].TargetCRS.get_info() + + def auto_z2e(ifc_file: ifcopenshell.file, z: float, should_return_in_map_units: bool = True) -> float: """Convert a Z coordinate to an elevation using model georeferencing data diff --git a/src/ifcopenshell-python/ifcopenshell/util/scripts/validate_stub.py b/src/ifcopenshell-python/ifcopenshell/util/scripts/validate_stub.py index 2ddf444704d..1c3b6cb0015 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/scripts/validate_stub.py +++ b/src/ifcopenshell-python/ifcopenshell/util/scripts/validate_stub.py @@ -25,7 +25,6 @@ - class hierarchy """ - import ast import difflib from pathlib import Path @@ -58,11 +57,28 @@ def get_function_node_name(node: ast.FunctionDef) -> Union[SubnameType, None]: :return: Function node name as ``SubnameType`` or ``None``, if function wasn't processed and can be skipped. """ node_name = node.name - if node_name.startswith("_") and node_name not in ("_is",): + is_init = node_name == "__init__" + + if node_name.startswith("_") and node_name not in ("_is",) and not is_init: + return None + arg_nodes = node.args.args + defaults = [None] * (len(arg_nodes) - len(node.args.defaults)) + node.args.defaults + args: list[str] = [] + for arg, default in zip(arg_nodes, defaults): + if default is None: + args.append(arg.arg) + else: + args.append(f"{arg.arg}={ast.unparse(default)}") + + if arg := node.args.vararg: + args.append(f"*{arg.arg}") + + if arg := node.args.kwarg: + args.append(f"**{arg.arg}") + + # Skip non-informative constructors. + if is_init and args == ["self"]: return None - args = [a.arg for a in node.args.args] - if node.args.vararg: - args.append("*args") node_name = f"def {node.name}" node_name = f"{node_name}({', '.join(args)}): ..." diff --git a/src/ifcopenshell-python/ifcopenshell/util/selector.py b/src/ifcopenshell-python/ifcopenshell/util/selector.py index e14b82c47df..bbe8125927a 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/selector.py +++ b/src/ifcopenshell-python/ifcopenshell/util/selector.py @@ -17,7 +17,6 @@ # along with IfcOpenShell. If not, see . import re -import sys from collections.abc import Iterable from decimal import Decimal from types import EllipsisType @@ -32,7 +31,6 @@ import ifcopenshell.util.attribute import ifcopenshell.util.classification import ifcopenshell.util.element -import ifcopenshell.util.fm import ifcopenshell.util.geolocation import ifcopenshell.util.placement import ifcopenshell.util.pset @@ -41,8 +39,7 @@ import ifcopenshell.util.system import ifcopenshell.util.unit -filter_elements_grammar = lark.Lark( - """start: filter_group +filter_elements_grammar = lark.Lark("""start: filter_group filter_group: facet_list ("+" facet_list)* facet_list: facet ("," facet)* @@ -113,11 +110,9 @@ NEWLINE: (CR? LF)+ %ignore WS // Disregard spaces in text -""" -) +""") -get_element_grammar = lark.Lark( - """start: keys +get_element_grammar = lark.Lark("""start: keys keys: key ("." key)* key: quoted_string | regex_string | unquoted_string @@ -132,11 +127,9 @@ WS: /[ \\t\\f\\r\\n]/+ %ignore WS // Disregard spaces in text - """ -) + """) -format_grammar = lark.Lark( - """start: expression +format_grammar = lark.Lark("""start: expression ?expression: add_sub ?add_sub: mul_div @@ -146,7 +139,7 @@ | mul_div "*" function -> multiply | mul_div "/" function -> divide - function: round | number | int | format_length | lower | upper | title | concat | substr | variable | ESCAPED_STRING | NUMBER | "(" expression ")" + function: round | number | int | format_length | lower | upper | title | concat | substr | sort | reverse | join | variable | ESCAPED_STRING | SIGNED_NUMBER | "(" expression ")" variable: "{{" query_path "}}" query_path: /[^}]+/ @@ -162,6 +155,9 @@ title: "title(" expression ")" concat: "concat(" expression ("," expression)* ")" substr: "substr(" expression "," SIGNED_INT ["," SIGNED_INT] ")" + sort: "sort(" expression ")" + reverse: "reverse(" expression ")" + join: "join(" ESCAPED_STRING "," expression ")" boolean: TRUE | FALSE TRUE: "true" | "True" | "TRUE" @@ -192,8 +188,7 @@ NEWLINE: (CR? LF)+ %ignore WS // Disregard spaces in text -""" -) +""") class FormatTransformer(lark.Transformer): @@ -203,6 +198,8 @@ def __init__(self, element=None): self.element = element def start(self, args): + if isinstance(args[0], (list, tuple)): + return ", ".join(args[0]) return args[0] def expression(self, args): @@ -210,18 +207,11 @@ def expression(self, args): def variable(self, args): """Handle variable substitution like {{z}} or {{Pset_Wall.FireRating}}""" - if self.element is None: - return "0" # Default value if no element context - - query_path = args[0] - try: - value = get_element_value(self.element, query_path) - if value is None: - return "0" - # Convert to string for further processing - return str(value) - except: - return "0" # Return default on error + if self.element: + try: + return get_element_value(self.element, args[0]) + except: + pass def query_path(self, args): """Extract the query path from variable""" @@ -303,6 +293,15 @@ def substr(self, args): elif len(args) == 2: return str(args[0])[int(args[1]) :] + def sort(self, args): + return sorted(args[0]) + + def reverse(self, args): + return list(reversed(args[0])) + + def join(self, args): + return args[0].join(args[1]) + def boolean(self, args): if not args: return True @@ -399,11 +398,11 @@ def ESCAPED_STRING(self, args): def format(query: str, element: Optional[ifcopenshell.entity_instance] = None) -> str: """Format a query string with optional element context for variable substitution. - + :param query: Format query string (can include {{variable}} placeholders) :param element: Optional IFC element for variable substitution :return: Formatted string - + Example: format("{{z}} / 2", element) # Substitutes element's z value format("imperial_length({{z}} / 2, 4)", element) # Uses z in calculation @@ -441,13 +440,13 @@ def _get_element_value(element: ifcopenshell.entity_instance, keys: list[str]) - elif key == "container": value = ifcopenshell.util.element.get_container(value) elif key == "space": - value = ifcopenshell.util.element.get_container(value, ifc_class="IfcSpace") + value = ifcopenshell.util.element.get_parent(value, ifc_class="IfcSpace") elif key == "storey": - value = ifcopenshell.util.element.get_container(value, ifc_class="IfcBuildingStorey") + value = ifcopenshell.util.element.get_parent(value, ifc_class="IfcBuildingStorey") elif key == "building": - value = ifcopenshell.util.element.get_container(value, ifc_class="IfcBuilding") + value = ifcopenshell.util.element.get_parent(value, ifc_class="IfcBuilding") elif key == "site": - value = ifcopenshell.util.element.get_container(value, ifc_class="IfcSite") + value = ifcopenshell.util.element.get_parent(value, ifc_class="IfcSite") elif key == "parent": value = ifcopenshell.util.element.get_parent(value) elif key in ("types", "occurrences"): @@ -1257,4 +1256,4 @@ def compare(self, element_value, comparison, value) -> bool: if comparison.startswith("!"): return not result - return result \ No newline at end of file + return result diff --git a/src/ifcopenshell-python/ifcopenshell/util/shape.py b/src/ifcopenshell-python/ifcopenshell/util/shape.py index 4c41eff9f99..7732412861c 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/shape.py +++ b/src/ifcopenshell-python/ifcopenshell/util/shape.py @@ -16,28 +16,36 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +from __future__ import annotations + from math import cos, radians -from typing import Literal, Optional, Union +from typing import TYPE_CHECKING, Literal, Optional, Union import numpy as np import numpy.typing as npt import shapely import shapely.ops -import ifcopenshell.ifcopenshell_wrapper as W import ifcopenshell.util.element import ifcopenshell.util.placement import ifcopenshell.util.representation -from ifcopenshell.geom import ShapeElementType -from ifcopenshell.util.shape_builder import VectorType -tol = 1e-6 -AXIS_LITERAL = Literal["X", "Y", "Z"] -VECTOR_3D = tuple[float, float, float] +if TYPE_CHECKING: + + import ifcopenshell.ifcopenshell_wrapper as W + from ifcopenshell.geom import ShapeElementType + from ifcopenshell.util.shape_builder import VectorType + + AXIS_LITERAL = Literal["X", "Y", "Z"] + VECTOR_3D = tuple[float, float, float] + +# Used only for typing, but reused by `shape.py` users. MatrixType = npt.NDArray[np.float64] """`npt.NDArray[np.float64]`""" +tol = 1e-6 + # NOTE: See IfcGeomRepresentation.h for W.Triangulation buffer types. # NOTE: For functions that return a single scalar ensure to use .item() to diff --git a/src/ifcopenshell-python/ifcopenshell/util/shape_builder.py b/src/ifcopenshell-python/ifcopenshell/util/shape_builder.py index 8c0f3d6ce91..e53d069a76b 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/shape_builder.py +++ b/src/ifcopenshell-python/ifcopenshell/util/shape_builder.py @@ -18,7 +18,6 @@ from __future__ import annotations -import collections import collections.abc from collections.abc import Sequence from itertools import chain @@ -29,7 +28,6 @@ import numpy.typing as npt import ifcopenshell -import ifcopenshell.api import ifcopenshell.util.element import ifcopenshell.util.placement import ifcopenshell.util.representation @@ -42,7 +40,7 @@ # NOTE: mathutils is never used at runtime in ifcopenshell, # only for type checking to ensure methods are compatible with # Blender vectors. - from mathutils import Vector + from mathutils import Vector # pyright: ignore[reportMissingImports] # ty:ignore[unresolved-import] # Support both numpy arrays and python sequences as inputs. VectorType = Union[Sequence[float], Vector, np.ndarray] @@ -315,7 +313,7 @@ def polyline( Generate an IfcIndexedPolyCurve based on the provided points. :param points: List of 2d or 3d points - :param closed: Whether polyline should be closed. Default is `False` + :param closed: Whether polyline should be closed. :param position_offset: offset to be applied to all points :param arc_points: Indices of the middle points for arcs. For creating an arc segment, provide 3 points: `arc_start`, `arc_middle` and `arc_end` to `points` and add the `arc_middle` @@ -418,8 +416,9 @@ def get_rectangle_coords(size: VectorType = (1.0, 1.0), position: Optional[Vecto 3 2 0 1 - :param size: rectangle size, could be either 2d or 3d, defaults to `(1,1)` - :param position: rectangle position, default to `None`. + :param size: rectangle size, could be either 2d or 3d. + Use 0 for one of 3d dimensions to create 2d rectangle in 3d space. + :param position: rectangle position. if `position` not specified zero-vector will be used :return: list of rectangle coords """ @@ -444,9 +443,11 @@ def rectangle( """ Generate a rectangle polyline. - :param size: rectangle size, could be either 2d or 3d, defaults to `(1,1)` - :param position: rectangle position, default to `None`. - if `position` not specified zero-vector will be used + :param size: rectangle. + :param position: rectangle position. + + See ``get_rectangle_coords`` for more information. + :return: IfcIndexedPolyCurve """ return self.polyline(self.get_rectangle_coords(size, position), closed=True) @@ -516,11 +517,18 @@ def get_trim_points_from_mask( trim_points_mask: Sequence[int], position_offset: Optional[VectorType] = None, ) -> np.ndarray: - """Handy way to get edge points of the ellipse like shape of a given radiuses. + """Get cardinal-point coordinates of an ellipse by index mask. - Mask points are numerated from 0 to 3 ccw starting from (x_axis_radius/2; 0). + The four cardinal points are numbered 0–3 counter-clockwise starting from the + positive X axis: 0 → ``(x, 0)``, 1 → ``(0, y)``, 2 → ``(-x, 0)``, 3 → ``(0, -y)``. - Example: mask (0, 1, 2, 3) will return points (x, 0), (0, y), (-x, 0), (0, -y) + Example: mask ``(0, 1, 2, 3)`` returns all four points in order. + + :param x_axis_radius: Radius (semi-axis length) along the X axis. + :param y_axis_radius: Radius (semi-axis length) along the Y axis. + :param trim_points_mask: Sequence of cardinal-point indices (0–3) to select. + :param position_offset: Optional 2D offset added to all returned points. + :return: Numpy array of the selected 2D points. """ points = np.array( ( @@ -545,15 +553,23 @@ def create_ellipse_curve( ref_x_direction: VectorType = (1.0, 0.0), trim_points_mask: Sequence[int] = (), ) -> ifcopenshell.entity_instance: - """ - Ellipse trimming points should be specified in counter clockwise order. - - For example, if you need to get the part of the ellipse ABOVE y-axis, you need to use mask (0,2). Below y-axis - (2,0) - - For more information about trim_points_mask check builder.get_trim_points_from_mask - - Notion: trimmed ellipse also contains polyline between trim points, meaning IfcTrimmedCurve could be used - for further extrusion. + """Create an IfcEllipse, optionally trimmed to an arc. + + If neither ``trim_points`` nor ``trim_points_mask`` is provided, a full IfcEllipse is returned. + Trimming points must be given in counter-clockwise order. For example, to get the arc + above the Y-axis use mask ``(0, 2)``; below the Y-axis use ``(2, 0)``. + + A trimmed result (IfcTrimmedCurve) includes a closing segment between the trim points, + making it suitable for use as a profile in :meth:`extrude`. + + :param x_axis_radius: Semi-axis length along the local X axis. + :param y_axis_radius: Semi-axis length along the local Y axis. + :param position: 2D centre of the ellipse. + :param trim_points: Explicit pair of 2D trim points. Takes precedence over ``trim_points_mask``. + :param ref_x_direction: Direction of the local X axis. + :param trim_points_mask: Pair of cardinal-point indices (0–3) used when ``trim_points`` is empty. + See :meth:`get_trim_points_from_mask` for index definitions. + :return: IfcEllipse (untrimmed) or IfcTrimmedCurve (trimmed). """ ifc_position = self.create_axis2_placement_2d(position, ref_x_direction) ifc_ellipse = self.file.createIfcEllipse( @@ -684,6 +700,14 @@ def rotate_2d_point( pivot_point: VectorType = (0.0, 0.0), counter_clockwise: bool = False, ) -> np.ndarray: + """Rotate a single 2D point around a pivot. + + :param point_2d: The 2D point to rotate. + :param angle: Rotation angle, in degrees. Defaults to 90. + :param pivot_point: The point to rotate around. + :param counter_clockwise: If True, rotate counter-clockwise. Defaults to clockwise. + :return: Rotated 2D point as a numpy array. + """ angle_rad = radians(angle) * (1 if counter_clockwise else -1) relative_point = np.array(point_2d) - pivot_point relative_point = np_rotation_matrix(angle_rad, 2) @ relative_point @@ -751,7 +775,16 @@ def mirror_2d_point( mirror_axes: VectorType = (1.0, 1.0), mirror_point: VectorType = (0.0, 0.0), ) -> np.ndarray: - """mirror_axes - along which axes mirror will be applied""" + """Mirror a single 2D point across the specified axes. + + :param point_2d: The 2D point to mirror. + :param mirror_axes: Indicates which axes to mirror across. A positive value in a + component means that axis is mirrored (negated relative to ``mirror_point``). + Example: ``(1, 0)`` mirrors across the Y-axis (negates X only), + ``(1, 1)`` mirrors across both axes. + :param mirror_point: Origin of the mirror operation. + :return: Mirrored 2D point as a numpy array. + """ mirror_axes: np.ndarray = np.where(np.array(mirror_axes) > 0, -1, 1) mirror_point: np.ndarray = np.array(mirror_point) relative_point = point_2d - mirror_point @@ -787,7 +820,7 @@ def create_axis2_placement_3d_from_matrix( """ Create IfcAxis2Placement3D from numpy matrix. - :param matrix: 4x4 transformation matrix, defaults to `np.eye(4)` + :param matrix: 4x4 transformation matrix, defaults to ``np.eye(4)`` :return: IfcAxis2Placement3D """ if matrix is None: @@ -797,7 +830,13 @@ def create_axis2_placement_3d_from_matrix( def create_axis2_placement_2d( self, position: VectorType = (0.0, 0.0), x_direction: Optional[VectorType] = None ) -> ifcopenshell.entity_instance: - """Create IfcAxis2Placement2D.""" + """Create IfcAxis2Placement2D. + + :param position: 2D origin of the placement. + :param x_direction: Direction of the local X axis. If not provided, defaults to + the global X axis ``(1, 0)``. + :return: IfcAxis2Placement2D + """ ref_direction = ( self.file.create_entity("IfcDirection", ifc_safe_vector_type(x_direction)) if x_direction else None ) @@ -968,8 +1007,8 @@ def mirror( def sphere(self, radius: float = 1.0, center: VectorType = (0.0, 0.0, 0.0)) -> ifcopenshell.entity_instance: """ - :param radius: radius of the sphere, defaults to 1.0 - :param center: sphere position, defaults to `(0.0, 0.0, 0.0)` + :param radius: radius of the sphere. + :param center: sphere position. :return: IfcSphere """ @@ -999,7 +1038,7 @@ def half_space_solid( ) -> ifcopenshell.entity_instance: """ :param plane: The IfcPlane representing the half space. - :param agreement_flag: False if +Z represents the void + :param agreement_flag: If False (default), the plane normal points toward the **removed** material (the void). The kept region is on the opposite side from the normal. :return: IfcHalfSpaceSolid """ return self.file.createIfcHalfSpaceSolid(plane, AgreementFlag=agreement_flag) @@ -1052,7 +1091,14 @@ def extrude( def create_swept_disk_solid( self, path_curve: ifcopenshell.entity_instance, radius: float ) -> ifcopenshell.entity_instance: - """Create IfcSweptDiskSolid from `path_curve` (must be 3D) and `radius`""" + """Create an IfcSweptDiskSolid — a circular cross-section swept along a 3D path. + + Useful for modelling round pipes, conduits, and cables. + + :param path_curve: A 3D curve entity defining the centreline path. Must have ``Dim == 3``. + :param radius: Radius of the circular disk cross-section. + :return: IfcSweptDiskSolid + """ if path_curve.Dim != 3: raise Exception( f"Path curve for IfcSweptDiskSolid should be 3D to be valid, currently it has {path_curve.Dim} dimensions.\n" @@ -1070,10 +1116,22 @@ def get_representation( ) -> ifcopenshell.entity_instance: """Create IFC representation for the specified context and items. + **All items must belong to the same geometry category.** IFC prohibits + mixing incompatible item types in one representation (e.g. + ``IfcExtrudedAreaSolid`` with ``IfcBlock``, or solids with curves). + When ``representation_type`` is omitted the type is inferred via + :func:`ifcopenshell.util.representation.guess_type`; if the items are + heterogeneous ``guess_type`` returns ``None`` and the representation is + written with no ``RepresentationType``, which fails IFC validation. + Avoid mixing swept-solid primitives (``IfcExtrudedAreaSolid``, + ``IfcRevolvedAreaSolid``) with CSG primitives (``IfcBlock``, + ``IfcSphere``, etc.) or any other category in a single call. + :param context: IfcGeometricRepresentationSubContext - :param items: could be a list or single curve/IfcExtrudedAreaSolid - :param representation_type: Explicitly specified RepresentationType, defaults to `None`. - If not provided it will be guessed from the items types + :param items: A single item or list of items, all of the same geometry + category (e.g. all ``IfcExtrudedAreaSolid``, all ``IfcIndexedPolyCurve``) + :param representation_type: Explicitly specified RepresentationType. + If not provided it will be guessed from the items types. :return: IfcShapeRepresentation """ if not isinstance(items, collections.abc.Iterable): @@ -1095,18 +1153,26 @@ def get_representation( ) def deep_copy(self, element: ifcopenshell.entity_instance) -> ifcopenshell.entity_instance: + """Create a deep copy of an IFC element and all its referenced entities. + + :param element: The IFC entity to copy. + :return: A new independent copy of the element. + """ return ifcopenshell.util.element.copy_deep(self.file, element) # UTILITIES def extrude_kwargs(self, axis: Literal["Y", "X", "Z"]) -> dict[str, tuple[float, float, float]]: - """Shortcut to get kwargs for `ShapeBuilder.extrude` to extrude by some axis. + """Shortcut to get kwargs for :meth:`extrude` to extrude along a principal axis. + + Assumes the 2D profile lies in the plane perpendicular to the extrusion axis: + XZ plane for Y-axis extrusion, YZ plane for X-axis extrusion, XY plane for Z-axis extrusion. - It assumes you have 2D profile in: - XZ plane for Y axis extrusion, \n - YZ plane for X axis extrusion, \n - XY plane for Z axis extrusion, \n + Extruding along X or Y with other kwargs may violate the IFC ValidExtrusionDirection constraint. - Extruding by X/Y using other kwargs might break ValidExtrusionDirection.""" + :param axis: The extrusion axis: ``'X'``, ``'Y'``, or ``'Z'``. + :return: A dict with keys ``position_x_axis``, ``position_z_axis``, and ``extrusion_vector`` + suitable for passing as ``**kwargs`` to :meth:`extrude`. + """ if axis == "Y": return { @@ -1130,13 +1196,16 @@ def extrude_kwargs(self, axis: Literal["Y", "X", "Z"]) -> dict[str, tuple[float, def rotate_extrusion_kwargs_by_z( self, kwargs: dict[str, Any], angle: float, counter_clockwise: bool = False ) -> dict[str, VectorType]: - """shortcut to rotate extrusion kwargs by z axis + """Rotate extrusion kwargs around the Z axis. - `kwargs` expected to have `position_x_axis` and `position_z_axis` keys + A shortcut to rotate the ``position_x_axis`` and ``position_z_axis`` values returned by + :meth:`extrude_kwargs` around the Z axis before passing them to :meth:`extrude`. - `angle` is a rotation value in radians - - by default rotation is clockwise, to make it counter clockwise use `counter_clockwise` flag + :param kwargs: A dict with ``position_x_axis`` and ``position_z_axis`` keys, + as returned by :meth:`extrude_kwargs`. The original dict is not mutated. + :param angle: Rotation angle, in radians. + :param counter_clockwise: If True, rotate counter-clockwise. Defaults to clockwise. + :return: A new dict with ``position_x_axis`` and ``position_z_axis`` rotated around Z. """ rot = np_rotation_matrix(-angle, 3, "Z") kwargs = kwargs.copy() # prevent mutation of original kwargs @@ -1145,7 +1214,11 @@ def rotate_extrusion_kwargs_by_z( return kwargs def get_polyline_coords(self, polyline: ifcopenshell.entity_instance) -> np.ndarray: - """polyline should be either `IfcIndexedPolyCurve` or `IfcPolyline`""" + """Extract the coordinate array from a polyline entity. + + :param polyline: An ``IfcIndexedPolyCurve`` or ``IfcPolyline`` entity. + :return: Numpy array of the polyline's point coordinates. + """ coords = None if polyline.is_a("IfcIndexedPolyCurve"): coords = np.array(polyline.Points.CoordList) @@ -1156,7 +1229,12 @@ def get_polyline_coords(self, polyline: ifcopenshell.entity_instance) -> np.ndar return coords def set_polyline_coords(self, polyline: ifcopenshell.entity_instance, coords: SequenceOfVectors) -> None: - """polyline should be either `IfcIndexedPolyCurve` or `IfcPolyline`""" + """Update the coordinates of a polyline entity in-place. + + :param polyline: An ``IfcIndexedPolyCurve`` or ``IfcPolyline`` entity. + :param coords: New sequence of point coordinates. Must contain the same number of + points as the original polyline. + """ if polyline.is_a("IfcIndexedPolyCurve"): polyline.Points.CoordList = ifc_safe_vector_type(coords) elif polyline.is_a("IfcPolyline"): @@ -1183,8 +1261,8 @@ def get_simple_2dcurve_data( :param fillets: list of points from `coords` to base fillet on. Example: (1,) :param fillet_radius: list of fillet radius for each of corresponding point form `fillets`. Example: (5.,) Note: `fillet_radius` could be just 1 float value if it's the same for all fillets. - :param closed: boolean whether curve should be closed (whether last point connected to first one). Default: True - :param create_ifc_curve: create IfcIndexedPolyCurve or just return the data. Default: False + :param closed: boolean whether curve should be closed (whether last point connected to first one). + :param create_ifc_curve: create IfcIndexedPolyCurve or just return the data. :return: (points, segments, ifc_curve) for the created simple curve if both points in e are equally far from pt, then v1 is returned. @@ -1295,6 +1373,18 @@ def create_z_profile_lips_curve( WallThickness: float, FilletRadius: float, ) -> ifcopenshell.entity_instance: + """Create a Z-profile (cold-formed steel section) outline curve with lips and fillets. + + All dimensions are in the IFC project's length units. + + :param FirstFlangeWidth: Width of the first (top) flange, measured from the web centreline. + :param SecondFlangeWidth: Width of the second (bottom) flange, measured from the web centreline. + :param Depth: Total depth of the section (web height). + :param Girth: Length of the return lips on each flange. + :param WallThickness: Uniform material thickness. + :param FilletRadius: Inner bend radius at each corner. + :return: IfcIndexedPolyCurve representing the closed Z-profile outline. + """ x1 = FirstFlangeWidth x2 = SecondFlangeWidth y = Depth / 2 @@ -1336,10 +1426,17 @@ def create_z_profile_lips_curve( def create_transition_arc_ifc( self, width: float, height: float, create_ifc_curve: bool = False ) -> tuple[SequenceOfVectors, list[list[int]], Union[ifcopenshell.entity_instance, None]]: - """Create an arc in the rectangle with specified width and height. + """Create an arc fitting inside a rectangle of the given width and height. + + If a single arc cannot span the full width, the longest possible radius is used and + a straight segment is inserted in the middle. - If it's not possible to make a complete arc, create an arc with longest radius possible - and straight segment in the middle. + :param width: Width of the bounding rectangle. + :param height: Height of the bounding rectangle (also the maximum arc radius). + :param create_ifc_curve: If True, also create and return an ``IfcIndexedPolyCurve``. + If False, only return the raw point and segment data. + :return: A tuple ``(points, segments, ifc_curve)`` where ``ifc_curve`` is an + ``IfcIndexedPolyCurve`` when ``create_ifc_curve=True``, otherwise ``None``. """ fillet_size = (width / 2) / height if fillet_size <= 1: @@ -1369,6 +1466,14 @@ def create_transition_arc_ifc( return points, segments, transition_arc def mesh(self, points: SequenceOfVectors, faces: Sequence[Sequence[int]]) -> ifcopenshell.entity_instance: + """Create a tessellated mesh from points and face indices. + + Delegates to :meth:`faceted_brep` for IFC2X3, or :meth:`polygonal_face_set` for IFC4 and later. + + :param points: List of 3D coordinates. + :param faces: List of faces, each face a sequence of zero-based point indices. + :return: IfcFacetedBrep (IFC2X3) or IfcPolygonalFaceSet (IFC4+). + """ if self.file.schema == "IFC2X3": return self.faceted_brep(points, faces) return self.polygonal_face_set(points, faces) @@ -1463,10 +1568,10 @@ def extrude_face_set( :param points: list of points, assuming they form consecutive closed polyline. :param magnitude: extrusion magnitude - :param extrusion_vector: extrusion direction, by default it's extruding by Z+ axis + :param extrusion_vector: extrusion direction. :param offset: offset from the points - :param start_cap: if True, create start cap, by default it's True - :param end_cap: if True, create end cap, by default it's True + :param start_cap: if True, create start cap. + :param end_cap: if True, create end cap. :return: IfcPolygonalFaceSet """ @@ -1722,11 +1827,20 @@ def mep_transition_length( angle: float, profile_offset: VectorType = (0.0, 0.0), verbose: bool = True, - ): - """get the final transition length for two profiles dimensions, angle and XY offset between them, - - the difference from `calculate_transition` - `get_transition_length` is making sure - that length will fit both sides of the transition + ) -> Optional[float]: + """Get the transition length for two profile half-dimensions, an angle, and an XY offset. + + Unlike :meth:`mep_transition_calculate`, this method checks that the resulting length + satisfies the angle constraint from both the start and end profile perspectives. + + :param start_half_dim: Half-dimensions of the start profile as a 3-element array + ``[half_x, half_y, depth]``. For circular profiles ``half_x == half_y == radius``. + :param end_half_dim: Half-dimensions of the end profile in the same format. + :param angle: Maximum allowed transition angle, in degrees. + :param profile_offset: 2D XY offset between the centrelines of the start and end profiles. + :param verbose: If True, print diagnostic values during calculation. + :return: Transition length in project length units, or ``None`` if no valid length exists + for the given angle and offset. """ print = lambda *args, **kwargs: __builtins__["print"](*args, **kwargs) if verbose else None np_X, np_Y = 0, 1 @@ -1787,9 +1901,23 @@ def mep_transition_calculate( angle: Optional[float] = None, verbose: bool = True, ) -> Union[float, None]: - """will return transition length based on the profile dimension differences and offset. - - If `length` is provided will return transition angle""" + """Calculate MEP transition length from angle, or transition angle from length. + + Low-level calculation kernel used by :meth:`mep_transition_length`. Provide either + ``angle`` or ``length`` (not both); the other value is computed and returned. + + :param start_half_dim: Half-dimensions of the start profile ``[half_x, half_y, depth]``. + :param end_half_dim: Half-dimensions of the end profile ``[half_x, half_y, depth]``. + :param offset: 2D XY offset between profile centrelines. + :param diff: Pre-computed absolute difference of start and end half-dimensions (XY only). + Computed from ``start_half_dim`` and ``end_half_dim`` if not provided. + :param end_profile: If True, swap X and Y axes to compute from the end-profile perspective. + :param length: Known transition length. If provided, the corresponding angle is returned. + :param angle: Known transition angle, in degrees. If provided, the corresponding length is returned. + :param verbose: If True, print diagnostic values during calculation. + :return: Transition length (if ``angle`` was given) or transition angle in degrees + (if ``length`` was given), or ``None`` if the geometry is not feasible. + """ print = lambda *args, **kwargs: __builtins__["print"](*args, **kwargs) if verbose else None diff --git a/src/ifcopenshell-python/ifcopenshell/util/unit.py b/src/ifcopenshell-python/ifcopenshell/util/unit.py index 93d4776df04..7e4686d4e4a 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/unit.py +++ b/src/ifcopenshell-python/ifcopenshell/util/unit.py @@ -22,7 +22,6 @@ from typing import Literal, Optional, Union import ifcopenshell -import ifcopenshell.api.unit import ifcopenshell.ifcopenshell_wrapper as ifcopenshell_wrapper prefixes = { diff --git a/src/ifcopenshell-python/ifcopenshell/validate.py b/src/ifcopenshell-python/ifcopenshell/validate.py index 13f148d5203..524dc78d35c 100644 --- a/src/ifcopenshell-python/ifcopenshell/validate.py +++ b/src/ifcopenshell-python/ifcopenshell/validate.py @@ -47,6 +47,7 @@ import argparse import functools +import itertools import json import os import sys @@ -60,7 +61,6 @@ import ifcopenshell import ifcopenshell.express.rule_executor import ifcopenshell.ifcopenshell_wrapper -import ifcopenshell.ifcopenshell_wrapper as W if TYPE_CHECKING: import ifcopenshell.simple_spf @@ -332,7 +332,7 @@ def log_internal_cpp_errors( lines = list(open(filename, "rb")) lengths = list(map(len, lines)) cumsum = 0 - cs = [cumsum := cumsum + x for x in lengths] + cs = list(itertools.accumulate(lengths)) for offsets, msg in zip(chr_offsets, msgs): if offsets: @@ -705,10 +705,10 @@ def validate_attribute( log_error(header_entity, name, index, STRING_TYPE, type(value).__name__) # Ignore header.file_schema as file won't load to IfcOpenShell with invalid file_schema. - file_description: W.FileDescription = header.file_description + file_description = header.file_description validate_attribute(file_description, "description", 0, aggregate=True) validate_attribute(file_description, "implementation_level", 1) - file_name: W.FileName = header.file_name + file_name = header.file_name validate_attribute(file_name, "name", 0) validate_attribute(file_name, "time_stamp", 1) validate_attribute(file_name, "author", 2, aggregate=True) @@ -793,6 +793,12 @@ def handle_exception(exc_type, exc_value, exc_traceback): parser.add_argument("files", nargs="+", help="The IFC file to validate.") parser.add_argument("--rules", action="store_true", help="Run express rules.") parser.add_argument("--json", action="store_true", help="Output in JSON format.") + parser.add_argument( + "--recursion-limit", + type=int, + default=-1, + help="Override sys.getrecursionlimit to process express rules on deeply nested structures (e.g 10000)", + ) parser.add_argument( "--fields", action="store_true", @@ -804,6 +810,9 @@ def handle_exception(exc_type, exc_value, exc_traceback): filenames: list[str] = args.files some_file_is_invalid = False + if args.recursion_limit > 0: + sys.setrecursionlimit(args.recursion_limit) + for fn in filenames: handler = None if args.json: diff --git a/src/ifcopenshell-python/pyproject.toml b/src/ifcopenshell-python/pyproject.toml index 790891e350d..9bcaeeebaad 100644 --- a/src/ifcopenshell-python/pyproject.toml +++ b/src/ifcopenshell-python/pyproject.toml @@ -45,3 +45,6 @@ include = ["ifcopenshell*"] [tool.ruff] extend = "../../pyproject.toml" +lint.select = [ + "F401", # unused imports +] diff --git a/src/ifcopenshell-python/scripts/dev_environment.py b/src/ifcopenshell-python/scripts/dev_environment.py index db650200489..b958369ba17 100644 --- a/src/ifcopenshell-python/scripts/dev_environment.py +++ b/src/ifcopenshell-python/scripts/dev_environment.py @@ -11,13 +11,24 @@ from pathlib import Path SITE = Path(site.getusersitepackages()) +SITE.mkdir(parents=True, exist_ok=True) REPO_PATH = Path(__file__).parent.parent.parent.parent REPO_PATH_SRC = REPO_PATH / "src" assert REPO_PATH_SRC.exists(), f"'{REPO_PATH_SRC}' doesn't exist." packages = { + "bcf": REPO_PATH_SRC / "bcf" / "bcf", + "bsdd.py": REPO_PATH_SRC / "bsdd" / "bsdd.py", + "ifc4d": REPO_PATH_SRC / "ifc4d" / "ifc4d", + "ifc5d": REPO_PATH_SRC / "ifc5d" / "ifc5d", + "ifccityjson": REPO_PATH_SRC / "ifccityjson" / "ifccityjson", + "ifcclash": REPO_PATH_SRC / "ifcclash" / "ifcclash", + "ifccsv.py": REPO_PATH_SRC / "ifccsv" / "ifccsv.py", + "ifcdiff.py": REPO_PATH_SRC / "ifcdiff" / "ifcdiff.py", + "ifcfm": REPO_PATH_SRC / "ifcfm" / "ifcfm", "ifcopenshell": REPO_PATH_SRC / "ifcopenshell-python" / "ifcopenshell", "ifcpatch": REPO_PATH_SRC / "ifcpatch" / "ifcpatch", + "ifctester": REPO_PATH_SRC / "ifctester" / "ifctester", } @@ -34,10 +45,12 @@ continue package_path.unlink() if package_path.exists(): - # I guess it's a directory. - shutil.rmtree(package_path) - package_path.symlink_to(repo_package_path, True) + if package_path.is_dir(): + shutil.rmtree(package_path) + else: + package_path.unlink() print(f"Symlinking {package_path} -> {repo_package_path}") + package_path.symlink_to(repo_package_path, target_is_directory=repo_package_path.is_dir()) PACKAGE_PATH = SITE / "ifcopenshell" diff --git a/src/ifcopenshell-python/test/api/alignment/test_add_segment_to_layout.py b/src/ifcopenshell-python/test/api/alignment/test_add_segment_to_layout.py index 9c6503516a7..90a4d97d110 100644 --- a/src/ifcopenshell-python/test/api/alignment/test_add_segment_to_layout.py +++ b/src/ifcopenshell-python/test/api/alignment/test_add_segment_to_layout.py @@ -16,7 +16,6 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . -import pytest import ifcopenshell.api.alignment import ifcopenshell.api.context diff --git a/src/ifcopenshell-python/test/api/alignment/test_add_stationing_to_alignment.py b/src/ifcopenshell-python/test/api/alignment/test_add_stationing_to_alignment.py index 52786cb28c7..4dd113ebbcc 100644 --- a/src/ifcopenshell-python/test/api/alignment/test_add_stationing_to_alignment.py +++ b/src/ifcopenshell-python/test/api/alignment/test_add_stationing_to_alignment.py @@ -16,7 +16,6 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . -import pytest import ifcopenshell.api.alignment import ifcopenshell.api.context diff --git a/src/ifcopenshell-python/test/api/alignment/test_add_vertical_alignment.py b/src/ifcopenshell-python/test/api/alignment/test_add_vertical_alignment.py index 50298717b3b..5a09cd18908 100644 --- a/src/ifcopenshell-python/test/api/alignment/test_add_vertical_alignment.py +++ b/src/ifcopenshell-python/test/api/alignment/test_add_vertical_alignment.py @@ -16,7 +16,6 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . -import pytest import ifcopenshell.api.alignment import ifcopenshell.api.context diff --git a/src/ifcopenshell-python/test/api/alignment/test_create.py b/src/ifcopenshell-python/test/api/alignment/test_create.py index e9fb2d00f32..f227bfd758a 100644 --- a/src/ifcopenshell-python/test/api/alignment/test_create.py +++ b/src/ifcopenshell-python/test/api/alignment/test_create.py @@ -16,7 +16,6 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . -import pytest import ifcopenshell.api.alignment import ifcopenshell.api.context diff --git a/src/ifcopenshell-python/test/api/alignment/test_create_as_offset_curve.py b/src/ifcopenshell-python/test/api/alignment/test_create_as_offset_curve.py index 90321574bdb..ac763e6af11 100644 --- a/src/ifcopenshell-python/test/api/alignment/test_create_as_offset_curve.py +++ b/src/ifcopenshell-python/test/api/alignment/test_create_as_offset_curve.py @@ -18,8 +18,6 @@ import math -import pytest - import ifcopenshell.api.alignment import ifcopenshell.api.unit import ifcopenshell.util diff --git a/src/ifcopenshell-python/test/api/alignment/test_create_as_polyline.py b/src/ifcopenshell-python/test/api/alignment/test_create_as_polyline.py index 8724de5e95d..6e4eee9527a 100644 --- a/src/ifcopenshell-python/test/api/alignment/test_create_as_polyline.py +++ b/src/ifcopenshell-python/test/api/alignment/test_create_as_polyline.py @@ -16,7 +16,6 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . -import pytest import ifcopenshell.api.alignment import ifcopenshell.api.unit diff --git a/src/ifcopenshell-python/test/api/alignment/test_create_by_pi_method.py b/src/ifcopenshell-python/test/api/alignment/test_create_by_pi_method.py index 17a7d9b5580..6da7af06907 100644 --- a/src/ifcopenshell-python/test/api/alignment/test_create_by_pi_method.py +++ b/src/ifcopenshell-python/test/api/alignment/test_create_by_pi_method.py @@ -16,7 +16,6 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . -import pytest import ifcopenshell.api.alignment import ifcopenshell.api.context diff --git a/src/ifcopenshell-python/test/api/alignment/test_create_layout_segment.py b/src/ifcopenshell-python/test/api/alignment/test_create_layout_segment.py index 87d1ca563f7..e1b0978e1ad 100644 --- a/src/ifcopenshell-python/test/api/alignment/test_create_layout_segment.py +++ b/src/ifcopenshell-python/test/api/alignment/test_create_layout_segment.py @@ -18,8 +18,6 @@ import math -import pytest - import ifcopenshell.api.alignment import ifcopenshell.api.context import ifcopenshell.api.unit diff --git a/src/ifcopenshell-python/test/api/alignment/test_create_no_geometry.py b/src/ifcopenshell-python/test/api/alignment/test_create_no_geometry.py index a8f7c3ac061..20d5f946e86 100644 --- a/src/ifcopenshell-python/test/api/alignment/test_create_no_geometry.py +++ b/src/ifcopenshell-python/test/api/alignment/test_create_no_geometry.py @@ -16,10 +16,8 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . -import pytest import ifcopenshell.api.alignment -import ifcopenshell.api.context import ifcopenshell.api.unit diff --git a/src/ifcopenshell-python/test/api/alignment/test_get_alignment.py b/src/ifcopenshell-python/test/api/alignment/test_get_alignment.py index a7821ce2130..9c7a8718e28 100644 --- a/src/ifcopenshell-python/test/api/alignment/test_get_alignment.py +++ b/src/ifcopenshell-python/test/api/alignment/test_get_alignment.py @@ -16,7 +16,6 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . -import pytest import ifcopenshell.api.alignment import ifcopenshell.api.context diff --git a/src/ifcopenshell-python/test/api/alignment/test_get_basis_curve.py b/src/ifcopenshell-python/test/api/alignment/test_get_basis_curve.py index 659b9db3432..0743fa6fd7f 100644 --- a/src/ifcopenshell-python/test/api/alignment/test_get_basis_curve.py +++ b/src/ifcopenshell-python/test/api/alignment/test_get_basis_curve.py @@ -16,7 +16,6 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . -import pytest import ifcopenshell.api.alignment import ifcopenshell.api.context diff --git a/src/ifcopenshell-python/test/api/alignment/test_horizontal_layout_by_pi_method.py b/src/ifcopenshell-python/test/api/alignment/test_horizontal_layout_by_pi_method.py index 75d46ba1736..0864d5a67f6 100644 --- a/src/ifcopenshell-python/test/api/alignment/test_horizontal_layout_by_pi_method.py +++ b/src/ifcopenshell-python/test/api/alignment/test_horizontal_layout_by_pi_method.py @@ -16,7 +16,6 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . -import pytest import ifcopenshell.api.alignment import ifcopenshell.api.context diff --git a/src/ifcopenshell-python/test/api/alignment/test_map_alignment_cant_segment.py b/src/ifcopenshell-python/test/api/alignment/test_map_alignment_cant_segment.py index 2f529fb08ab..c3ec6c38315 100644 --- a/src/ifcopenshell-python/test/api/alignment/test_map_alignment_cant_segment.py +++ b/src/ifcopenshell-python/test/api/alignment/test_map_alignment_cant_segment.py @@ -19,7 +19,6 @@ import pytest import ifcopenshell.api.alignment -import ifcopenshell.api.context from ifcopenshell.api.alignment._map_alignment_cant_segment import ( _map_alignment_cant_segment, ) diff --git a/src/ifcopenshell-python/test/api/alignment/test_name_segments.py b/src/ifcopenshell-python/test/api/alignment/test_name_segments.py index 20ed746ab01..2c9b8fa2ef9 100644 --- a/src/ifcopenshell-python/test/api/alignment/test_name_segments.py +++ b/src/ifcopenshell-python/test/api/alignment/test_name_segments.py @@ -16,7 +16,6 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . -import pytest import ifcopenshell.api.alignment import ifcopenshell.api.context diff --git a/src/ifcopenshell-python/test/api/alignment/test_referent_names.py b/src/ifcopenshell-python/test/api/alignment/test_referent_names.py index d18ecf16c3d..d64ea9a3ec0 100644 --- a/src/ifcopenshell-python/test/api/alignment/test_referent_names.py +++ b/src/ifcopenshell-python/test/api/alignment/test_referent_names.py @@ -17,7 +17,6 @@ # along with IfcOpenShell. If not, see . import pytest -from pytest import fixture import ifcopenshell.api.alignment import ifcopenshell.api.context diff --git a/src/ifcopenshell-python/test/api/alignment/test_update_curve_segment_transition_code.py b/src/ifcopenshell-python/test/api/alignment/test_update_curve_segment_transition_code.py index 30803b5a59f..6fc87861dbe 100644 --- a/src/ifcopenshell-python/test/api/alignment/test_update_curve_segment_transition_code.py +++ b/src/ifcopenshell-python/test/api/alignment/test_update_curve_segment_transition_code.py @@ -16,7 +16,6 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . -import pytest import ifcopenshell.api.context import ifcopenshell.api.unit diff --git a/src/ifcopenshell-python/test/api/alignment/test_vertical_layout_by_pi_method.py b/src/ifcopenshell-python/test/api/alignment/test_vertical_layout_by_pi_method.py index b34e22c7416..bd97d644de5 100644 --- a/src/ifcopenshell-python/test/api/alignment/test_vertical_layout_by_pi_method.py +++ b/src/ifcopenshell-python/test/api/alignment/test_vertical_layout_by_pi_method.py @@ -16,7 +16,6 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . -import pytest import ifcopenshell.api.alignment import ifcopenshell.api.context diff --git a/src/ifcopenshell-python/test/api/boundary/test_edit_attributes.py b/src/ifcopenshell-python/test/api/boundary/test_edit_attributes.py new file mode 100644 index 00000000000..ed79d7e8bff --- /dev/null +++ b/src/ifcopenshell-python/test/api/boundary/test_edit_attributes.py @@ -0,0 +1,115 @@ +# IfcOpenShell - IFC toolkit and geometry engine +# Copyright (C) 2026 Dion Moult +# +# This file is part of IfcOpenShell. +# +# IfcOpenShell is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# IfcOpenShell is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with IfcOpenShell. If not, see . +# This file was generated with the assistance of an AI coding tool. + +import ifcopenshell.api.boundary +import ifcopenshell.api.root +import test.bootstrap + + +class TestEditAttributes(test.bootstrap.IFC4): + def setup_boundary(self): + space = ifcopenshell.api.root.create_entity(self.file, ifc_class="IfcSpace") + wall = ifcopenshell.api.root.create_entity(self.file, ifc_class="IfcWall") + boundary = ifcopenshell.api.root.create_entity(self.file, ifc_class="IfcRelSpaceBoundary") + return boundary, space, wall + + def test_sets_relating_space_and_building_element(self): + boundary, space, wall = self.setup_boundary() + ifcopenshell.api.boundary.edit_attributes( + self.file, entity=boundary, relating_space=space, related_building_element=wall + ) + assert boundary.RelatingSpace == space + assert boundary.RelatedBuildingElement == wall + + def test_defaults_enums_to_notdefined(self): + boundary, space, wall = self.setup_boundary() + ifcopenshell.api.boundary.edit_attributes( + self.file, entity=boundary, relating_space=space, related_building_element=wall + ) + assert boundary.PhysicalOrVirtualBoundary == "NOTDEFINED" + assert boundary.InternalOrExternalBoundary == "NOTDEFINED" + + def test_sets_physical_or_virtual(self): + boundary, space, wall = self.setup_boundary() + ifcopenshell.api.boundary.edit_attributes( + self.file, + entity=boundary, + relating_space=space, + related_building_element=wall, + physical_or_virtual="PHYSICAL", + ) + assert boundary.PhysicalOrVirtualBoundary == "PHYSICAL" + + def test_sets_internal_or_external(self): + boundary, space, wall = self.setup_boundary() + ifcopenshell.api.boundary.edit_attributes( + self.file, + entity=boundary, + relating_space=space, + related_building_element=wall, + internal_or_external="EXTERNAL", + ) + assert boundary.InternalOrExternalBoundary == "EXTERNAL" + + def test_sets_all_enum_variants(self): + boundary, space, wall = self.setup_boundary() + for value in ("PHYSICAL", "VIRTUAL", "NOTDEFINED"): + ifcopenshell.api.boundary.edit_attributes( + self.file, + entity=boundary, + relating_space=space, + related_building_element=wall, + physical_or_virtual=value, + ) + assert boundary.PhysicalOrVirtualBoundary == value + + for value in ("INTERNAL", "EXTERNAL", "EXTERNAL_EARTH", "EXTERNAL_WATER", "EXTERNAL_FIRE", "NOTDEFINED"): + ifcopenshell.api.boundary.edit_attributes( + self.file, + entity=boundary, + relating_space=space, + related_building_element=wall, + internal_or_external=value, + ) + assert boundary.InternalOrExternalBoundary == value + + +class TestEditAttributesIFC2X3(test.bootstrap.IFC2X3, TestEditAttributes): + def test_sets_all_enum_variants(self): + boundary, space, wall = self.setup_boundary() + for value in ("PHYSICAL", "VIRTUAL", "NOTDEFINED"): + ifcopenshell.api.boundary.edit_attributes( + self.file, + entity=boundary, + relating_space=space, + related_building_element=wall, + physical_or_virtual=value, + ) + assert boundary.PhysicalOrVirtualBoundary == value + + # IFC2X3 only has INTERNAL, EXTERNAL, NOTDEFINED + for value in ("INTERNAL", "EXTERNAL", "NOTDEFINED"): + ifcopenshell.api.boundary.edit_attributes( + self.file, + entity=boundary, + relating_space=space, + related_building_element=wall, + internal_or_external=value, + ) + assert boundary.InternalOrExternalBoundary == value diff --git a/src/ifcopenshell-python/test/api/cogo/test_add_survey_point.py b/src/ifcopenshell-python/test/api/cogo/test_add_survey_point.py index 73d3c69105a..143cb32c656 100644 --- a/src/ifcopenshell-python/test/api/cogo/test_add_survey_point.py +++ b/src/ifcopenshell-python/test/api/cogo/test_add_survey_point.py @@ -19,7 +19,6 @@ import pytest import ifcopenshell.api.aggregate -import ifcopenshell.api.alignment import ifcopenshell.api.cogo import ifcopenshell.api.context diff --git a/src/ifcopenshell-python/test/api/cogo/test_assign_survey_point.py b/src/ifcopenshell-python/test/api/cogo/test_assign_survey_point.py index e19639166f2..23a61c76559 100644 --- a/src/ifcopenshell-python/test/api/cogo/test_assign_survey_point.py +++ b/src/ifcopenshell-python/test/api/cogo/test_assign_survey_point.py @@ -19,7 +19,6 @@ import pytest import ifcopenshell.api.aggregate -import ifcopenshell.api.alignment import ifcopenshell.api.cogo import ifcopenshell.api.context diff --git a/src/ifcopenshell-python/test/api/cogo/test_bearing2dd.py b/src/ifcopenshell-python/test/api/cogo/test_bearing2dd.py index 433a981ac74..199aa8a4e80 100644 --- a/src/ifcopenshell-python/test/api/cogo/test_bearing2dd.py +++ b/src/ifcopenshell-python/test/api/cogo/test_bearing2dd.py @@ -16,7 +16,6 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . -import math import pytest diff --git a/src/ifcopenshell-python/test/api/cogo/test_edit_survey_point.py b/src/ifcopenshell-python/test/api/cogo/test_edit_survey_point.py index 6b714b73424..cce88374750 100644 --- a/src/ifcopenshell-python/test/api/cogo/test_edit_survey_point.py +++ b/src/ifcopenshell-python/test/api/cogo/test_edit_survey_point.py @@ -19,7 +19,6 @@ import pytest import ifcopenshell.api.aggregate -import ifcopenshell.api.alignment import ifcopenshell.api.cogo import ifcopenshell.api.context diff --git a/src/ifcopenshell-python/test/api/cost/test_edit_cost_value.py b/src/ifcopenshell-python/test/api/cost/test_edit_cost_value.py new file mode 100644 index 00000000000..38b6775c08d --- /dev/null +++ b/src/ifcopenshell-python/test/api/cost/test_edit_cost_value.py @@ -0,0 +1,70 @@ +# IfcOpenShell - IFC toolkit and geometry engine +# Copyright (C) 2021 Dion Moult +# +# This file is part of IfcOpenShell. +# +# IfcOpenShell is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# IfcOpenShell is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with IfcOpenShell. If not, see . + +import ifcopenshell.api.cost +import ifcopenshell.api.unit +import test.bootstrap + + +class TestEditCostValue(test.bootstrap.IFC4): + def test_editing_applied_value(self): + schedule = ifcopenshell.api.cost.add_cost_schedule(self.file) + item = ifcopenshell.api.cost.add_cost_item(self.file, cost_schedule=schedule) + value = ifcopenshell.api.cost.add_cost_value(self.file, parent=item) + ifcopenshell.api.cost.edit_cost_value(self.file, cost_value=value, attributes={"AppliedValue": 42.0}) + assert value.AppliedValue.wrappedValue == 42.0 + + def test_editing_unit_basis_removes_old_deeply(self): + schedule = ifcopenshell.api.cost.add_cost_schedule(self.file) + item = ifcopenshell.api.cost.add_cost_item(self.file, cost_schedule=schedule) + value = ifcopenshell.api.cost.add_cost_value(self.file, parent=item) + unit = ifcopenshell.api.unit.add_si_unit(self.file, unit_type="LENGTHUNIT") + ifcopenshell.api.cost.edit_cost_value( + self.file, + cost_value=value, + attributes={"UnitBasis": {"ValueComponent": 1.0, "UnitComponent": unit}}, + ) + old_basis = value.UnitBasis + assert old_basis is not None + old_basis_id = old_basis.id() + # Now change to a new unit basis — the old one should be deeply removed. + ifcopenshell.api.cost.edit_cost_value( + self.file, + cost_value=value, + attributes={"UnitBasis": {"ValueComponent": 2.0, "UnitComponent": unit}}, + ) + assert value.UnitBasis is not None + assert value.UnitBasis.id() != old_basis_id + + def test_clearing_unit_basis(self): + schedule = ifcopenshell.api.cost.add_cost_schedule(self.file) + item = ifcopenshell.api.cost.add_cost_item(self.file, cost_schedule=schedule) + value = ifcopenshell.api.cost.add_cost_value(self.file, parent=item) + unit = ifcopenshell.api.unit.add_si_unit(self.file, unit_type="LENGTHUNIT") + ifcopenshell.api.cost.edit_cost_value( + self.file, + cost_value=value, + attributes={"UnitBasis": {"ValueComponent": 1.0, "UnitComponent": unit}}, + ) + assert value.UnitBasis is not None + ifcopenshell.api.cost.edit_cost_value(self.file, cost_value=value, attributes={"UnitBasis": None}) + assert value.UnitBasis is None + + +class TestEditCostValueIFC4X3(test.bootstrap.IFC4X3, TestEditCostValue): + pass diff --git a/src/ifcopenshell-python/test/api/cost/test_remove_cost_schedule.py b/src/ifcopenshell-python/test/api/cost/test_remove_cost_schedule.py index 5acadb9673b..9b6c6824f1f 100644 --- a/src/ifcopenshell-python/test/api/cost/test_remove_cost_schedule.py +++ b/src/ifcopenshell-python/test/api/cost/test_remove_cost_schedule.py @@ -16,7 +16,6 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . -import ifcopenshell.api import ifcopenshell.api.cost import test.bootstrap diff --git a/src/ifcopenshell-python/test/api/geometry/test_add_boolean.py b/src/ifcopenshell-python/test/api/geometry/test_add_boolean.py index d507f893086..f750795ee76 100644 --- a/src/ifcopenshell-python/test/api/geometry/test_add_boolean.py +++ b/src/ifcopenshell-python/test/api/geometry/test_add_boolean.py @@ -42,7 +42,7 @@ def test_adding_a_boolean_from_two_top_level_items(self): assert boolean.FirstOperand == first assert boolean.SecondOperand == second assert boolean.Operator == "DIFFERENCE" - assert set(rep.Items) == {boolean} + assert set(rep.Items) == {boolean, second} def test_adding_multiple_booleans_from_three_top_level_items(self): ifcopenshell.api.root.create_entity(self.file, ifc_class="IfcProject") @@ -58,13 +58,14 @@ def test_adding_multiple_booleans_from_three_top_level_items(self): booleans = ifcopenshell.api.geometry.add_boolean(self.file, first, [second1, second2]) assert len(booleans) == 2 - assert len(rep.Items) == 1 - assert rep.Items[0].FirstOperand.is_a("IfcBooleanResult") - assert rep.Items[0].SecondOperand == second2 - assert rep.Items[0].Operator == "DIFFERENCE" - assert rep.Items[0].FirstOperand.FirstOperand == first - assert rep.Items[0].FirstOperand.SecondOperand == second1 - assert rep.Items[0].FirstOperand.Operator == "DIFFERENCE" + final_boolean = booleans[-1] + assert final_boolean.FirstOperand.is_a("IfcBooleanResult") + assert final_boolean.SecondOperand == second2 + assert final_boolean.Operator == "DIFFERENCE" + assert final_boolean.FirstOperand.FirstOperand == first + assert final_boolean.FirstOperand.SecondOperand == second1 + assert final_boolean.FirstOperand.Operator == "DIFFERENCE" + assert set(rep.Items) == {final_boolean, second1, second2} def test_adding_a_boolean_to_an_existing_operand_from_a_top_level_item(self): ifcopenshell.api.root.create_entity(self.file, ifc_class="IfcProject") @@ -78,14 +79,16 @@ def test_adding_a_boolean_to_an_existing_operand_from_a_top_level_item(self): second2 = builder.block() rep = builder.get_representation(body, [first, second1]) booleans = ifcopenshell.api.geometry.add_boolean(self.file, first, [second1]) + # second1 stays in Items, add second2 as well rep.Items = list(rep.Items) + [second2] booleans = ifcopenshell.api.geometry.add_boolean(self.file, first, [second2]) assert len(booleans) == 1 - assert len(rep.Items) == 1 - assert rep.Items[0].FirstOperand.is_a("IfcBooleanResult") - assert rep.Items[0].SecondOperand == second2 - assert rep.Items[0].FirstOperand.FirstOperand == first - assert rep.Items[0].FirstOperand.SecondOperand == second1 + final_boolean = booleans[0] + assert final_boolean.FirstOperand.is_a("IfcBooleanResult") + assert final_boolean.SecondOperand == second2 + assert final_boolean.FirstOperand.FirstOperand == first + assert final_boolean.FirstOperand.SecondOperand == second1 + assert set(rep.Items) == {final_boolean, second1, second2} def test_adding_a_boolean_to_an_existing_operand_from_another_operand(self): ifcopenshell.api.root.create_entity(self.file, ifc_class="IfcProject") @@ -104,7 +107,7 @@ def test_adding_a_boolean_to_an_existing_operand_from_another_operand(self): booleans = ifcopenshell.api.geometry.add_boolean(self.file, first1, [second2]) assert len(booleans) == 1 - assert len(rep.Items) == 2 + assert len(rep.Items) == 4 assert self.file.get_total_inverses(first1) == 1 result = next(iter(self.file.get_inverse(first1))) @@ -132,14 +135,15 @@ def test_preventing_recursive_booleans(self): rep = builder.get_representation(body, [first, second]) ifcopenshell.api.geometry.add_boolean(self.file, first, [second]) ifcopenshell.api.geometry.add_boolean(self.file, first, [second]) - assert len(rep.Items) == 1 - assert rep.Items[0].FirstOperand == first - assert rep.Items[0].SecondOperand == second + assert set(rep.Items) == {self.file.by_type("IfcBooleanResult")[0], second} + boolean = self.file.by_type("IfcBooleanResult")[0] + assert boolean.FirstOperand == first + assert boolean.SecondOperand == second ifcopenshell.api.geometry.add_boolean(self.file, second, [second]) ifcopenshell.api.geometry.add_boolean(self.file, second, [first]) - assert len(rep.Items) == 1 - assert rep.Items[0].FirstOperand == first - assert rep.Items[0].SecondOperand == second + assert set(rep.Items) == {boolean, second} + assert boolean.FirstOperand == first + assert boolean.SecondOperand == second assert len(self.file.by_type("IfcBooleanResult")) == 1 diff --git a/src/ifcopenshell-python/test/api/geometry/test_add_topology_representation.py b/src/ifcopenshell-python/test/api/geometry/test_add_topology_representation.py new file mode 100644 index 00000000000..5b89f503383 --- /dev/null +++ b/src/ifcopenshell-python/test/api/geometry/test_add_topology_representation.py @@ -0,0 +1,82 @@ +# IfcOpenShell - IFC toolkit and geometry engine +# Copyright (C) 2026 Dion Moult +# +# This file is part of IfcOpenShell. +# +# IfcOpenShell is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# IfcOpenShell is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with IfcOpenShell. If not, see . +# This file was generated with the assistance of an AI coding tool. + +import ifcopenshell.api.context +import ifcopenshell.api.geometry +import ifcopenshell.api.root +import test.bootstrap + + +class TestAddTopologyRepresentation(test.bootstrap.IFC4): + def setup_context(self): + ifcopenshell.api.root.create_entity(self.file, ifc_class="IfcProject") + model = ifcopenshell.api.context.add_context(self.file, context_type="Model") + return ifcopenshell.api.context.add_context( + self.file, + context_type="Model", + context_identifier="Reference", + target_view="GRAPH_VIEW", + parent=model, + ) + + def test_creates_topology_representation(self): + context = self.setup_context() + face = self.file.create_entity("IfcFaceSurface") + rep = ifcopenshell.api.geometry.add_topology_representation(self.file, context=context, item=face) + assert rep.is_a("IfcTopologyRepresentation") + assert rep.ContextOfItems == context + assert face in rep.Items + + def test_infers_face_representation_type(self): + context = self.setup_context() + face = self.file.create_entity("IfcFaceSurface") + rep = ifcopenshell.api.geometry.add_topology_representation(self.file, context=context, item=face) + assert rep.RepresentationType == "Face" + + def test_infers_edge_representation_type(self): + context = self.setup_context() + edge = self.file.create_entity("IfcEdge") + rep = ifcopenshell.api.geometry.add_topology_representation(self.file, context=context, item=edge) + assert rep.RepresentationType == "Edge" + + def test_defaults_representation_identifier_to_context_identifier(self): + context = self.setup_context() + face = self.file.create_entity("IfcFaceSurface") + rep = ifcopenshell.api.geometry.add_topology_representation(self.file, context=context, item=face) + assert rep.RepresentationIdentifier == context.ContextIdentifier + + def test_custom_representation_identifier(self): + context = self.setup_context() + face = self.file.create_entity("IfcFaceSurface") + rep = ifcopenshell.api.geometry.add_topology_representation( + self.file, context=context, item=face, representation_identifier="Body" + ) + assert rep.RepresentationIdentifier == "Body" + + def test_custom_representation_type_overrides_inferred(self): + context = self.setup_context() + face = self.file.create_entity("IfcFaceSurface") + rep = ifcopenshell.api.geometry.add_topology_representation( + self.file, context=context, item=face, representation_type="Undefined" + ) + assert rep.RepresentationType == "Undefined" + + +class TestAddTopologyRepresentationIFC2X3(test.bootstrap.IFC2X3, TestAddTopologyRepresentation): + pass diff --git a/src/ifcopenshell-python/test/api/geometry/test_assign_representation.py b/src/ifcopenshell-python/test/api/geometry/test_assign_representation.py index ec02c7bc270..57fb48dabed 100644 --- a/src/ifcopenshell-python/test/api/geometry/test_assign_representation.py +++ b/src/ifcopenshell-python/test/api/geometry/test_assign_representation.py @@ -16,7 +16,6 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . -import ifcopenshell.api import ifcopenshell.api.geometry import ifcopenshell.api.material import ifcopenshell.api.root diff --git a/src/ifcopenshell-python/test/api/geometry/test_clip_solid.py b/src/ifcopenshell-python/test/api/geometry/test_clip_solid.py new file mode 100644 index 00000000000..512bfcc92e0 --- /dev/null +++ b/src/ifcopenshell-python/test/api/geometry/test_clip_solid.py @@ -0,0 +1,154 @@ +# IfcOpenShell - IFC toolkit and geometry engine +# Copyright (C) 2026 Dion Moult +# +# This file is part of IfcOpenShell. +# +# IfcOpenShell is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# IfcOpenShell is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with IfcOpenShell. If not, see . + +import json + +import ifcopenshell.api.geometry +import ifcopenshell.util.element +import ifcopenshell.util.shape_builder +import test.bootstrap + + +class TestClipSolid(test.bootstrap.IFC4): + def make_extrusion(self): + builder = ifcopenshell.util.shape_builder.ShapeBuilder(self.file) + rect = builder.rectangle(size=(1.0, 1.0)) + return builder.extrude(rect, magnitude=4.0) + + def test_returns_boolean_clipping_result(self): + extrusion = self.make_extrusion() + result = ifcopenshell.api.geometry.clip_solid( + self.file, + item=extrusion, + location=[0.0, 0.0, 3.0], + normal=[0.0, 0.0, 1.0], + ) + assert result.is_a("IfcBooleanClippingResult") + assert result.Operator == "DIFFERENCE" + + def test_first_operand_is_the_item(self): + extrusion = self.make_extrusion() + result = ifcopenshell.api.geometry.clip_solid( + self.file, + item=extrusion, + location=[0.0, 0.0, 3.0], + normal=[0.0, 0.0, 1.0], + ) + assert result.FirstOperand == extrusion + + def test_second_operand_is_half_space_solid(self): + extrusion = self.make_extrusion() + result = ifcopenshell.api.geometry.clip_solid( + self.file, + item=extrusion, + location=[0.0, 0.0, 3.0], + normal=[0.0, 0.0, 1.0], + ) + assert result.SecondOperand.is_a("IfcHalfSpaceSolid") + + def test_clip_plane_location_matches(self): + extrusion = self.make_extrusion() + result = ifcopenshell.api.geometry.clip_solid( + self.file, + item=extrusion, + location=[0.0, 0.0, 3.0], + normal=[0.0, 0.0, 1.0], + ) + plane = result.SecondOperand.BaseSurface + coords = plane.Position.Location.Coordinates + assert list(coords) == [0.0, 0.0, 3.0] + + def test_chaining_two_clips(self): + extrusion = self.make_extrusion() + first_clip = ifcopenshell.api.geometry.clip_solid( + self.file, + item=extrusion, + location=[0.0, 0.0, 3.0], + normal=[0.0, 0.0, 1.0], + ) + second_clip = ifcopenshell.api.geometry.clip_solid( + self.file, + item=first_clip, + location=[0.0, 0.0, 1.0], + normal=[0.0, 0.0, -1.0], + ) + assert second_clip.is_a("IfcBooleanClippingResult") + assert second_clip.FirstOperand == first_clip + assert first_clip.FirstOperand == extrusion + + def test_angled_clip_plane(self): + extrusion = self.make_extrusion() + result = ifcopenshell.api.geometry.clip_solid( + self.file, + item=extrusion, + location=[0.0, 0.0, 3.26], + normal=[0.419, 0.0, 0.908], + ) + assert result.is_a("IfcBooleanClippingResult") + assert result.SecondOperand.is_a("IfcHalfSpaceSolid") + + def test_element_registers_result_in_bbim_boolean(self): + extrusion = self.make_extrusion() + wall = self.file.createIfcWall() + result = ifcopenshell.api.geometry.clip_solid( + self.file, + item=extrusion, + location=[0.0, 0.0, 3.0], + normal=[0.0, 0.0, 1.0], + element=wall, + ) + pset = ifcopenshell.util.element.get_pset(wall, "BBIM_Boolean") + assert pset is not None + assert result.id() in json.loads(pset["Data"]) + + def test_element_appends_to_existing_bbim_boolean(self): + extrusion = self.make_extrusion() + wall = self.file.createIfcWall() + first = ifcopenshell.api.geometry.clip_solid( + self.file, + item=extrusion, + location=[0.0, 0.0, 3.0], + normal=[0.0, 0.0, 1.0], + element=wall, + ) + second = ifcopenshell.api.geometry.clip_solid( + self.file, + item=first, + location=[0.0, 0.0, 1.0], + normal=[0.0, 0.0, -1.0], + element=wall, + ) + pset = ifcopenshell.util.element.get_pset(wall, "BBIM_Boolean") + ids = json.loads(pset["Data"]) + assert first.id() in ids + assert second.id() in ids + + def test_no_element_does_not_create_pset(self): + extrusion = self.make_extrusion() + wall = self.file.createIfcWall() + ifcopenshell.api.geometry.clip_solid( + self.file, + item=extrusion, + location=[0.0, 0.0, 3.0], + normal=[0.0, 0.0, 1.0], + ) + assert ifcopenshell.util.element.get_pset(wall, "BBIM_Boolean") is None + + +class TestClipSolidIFC2X3(test.bootstrap.IFC2X3, TestClipSolid): + pass diff --git a/src/ifcopenshell-python/test/api/geometry/test_clip_solid_bounded.py b/src/ifcopenshell-python/test/api/geometry/test_clip_solid_bounded.py new file mode 100644 index 00000000000..3dae335cad8 --- /dev/null +++ b/src/ifcopenshell-python/test/api/geometry/test_clip_solid_bounded.py @@ -0,0 +1,179 @@ +# IfcOpenShell - IFC toolkit and geometry engine +# Copyright (C) 2026 Dion Moult +# +# This file is part of IfcOpenShell. +# +# IfcOpenShell is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# IfcOpenShell is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with IfcOpenShell. If not, see . + +import json + +import ifcopenshell.api.geometry +import ifcopenshell.util.element +import ifcopenshell.util.shape_builder +import test.bootstrap + + +class TestClipSolidBounded(test.bootstrap.IFC4): + def make_extrusion(self): + builder = ifcopenshell.util.shape_builder.ShapeBuilder(self.file) + rect = builder.rectangle(size=(4.0, 1.0)) + return builder.extrude(rect, magnitude=3.0) + + def test_returns_boolean_clipping_result(self): + extrusion = self.make_extrusion() + result = ifcopenshell.api.geometry.clip_solid_bounded( + self.file, + item=extrusion, + location=[2.5, 0.0, 2.0], + normal=[0.6, 0.0, 0.8], + boundary_points=[[2.0, 0.0], [3.0, 0.0], [3.0, 2.0], [2.0, 2.0]], + ) + assert result.is_a("IfcBooleanClippingResult") + assert result.Operator == "DIFFERENCE" + + def test_first_operand_is_the_item(self): + extrusion = self.make_extrusion() + result = ifcopenshell.api.geometry.clip_solid_bounded( + self.file, + item=extrusion, + location=[2.5, 0.0, 2.0], + normal=[0.6, 0.0, 0.8], + boundary_points=[[2.0, 0.0], [3.0, 0.0], [3.0, 2.0], [2.0, 2.0]], + ) + assert result.FirstOperand == extrusion + + def test_second_operand_is_polygonal_bounded_half_space(self): + extrusion = self.make_extrusion() + result = ifcopenshell.api.geometry.clip_solid_bounded( + self.file, + item=extrusion, + location=[2.5, 0.0, 2.0], + normal=[0.6, 0.0, 0.8], + boundary_points=[[2.0, 0.0], [3.0, 0.0], [3.0, 2.0], [2.0, 2.0]], + ) + assert result.SecondOperand.is_a("IfcPolygonalBoundedHalfSpace") + + def test_agreement_flag_is_false(self): + extrusion = self.make_extrusion() + result = ifcopenshell.api.geometry.clip_solid_bounded( + self.file, + item=extrusion, + location=[2.5, 0.0, 2.0], + normal=[0.6, 0.0, 0.8], + boundary_points=[[2.0, 0.0], [3.0, 0.0], [3.0, 2.0], [2.0, 2.0]], + ) + assert result.SecondOperand.AgreementFlag is False + + def test_clip_plane_location_matches(self): + extrusion = self.make_extrusion() + result = ifcopenshell.api.geometry.clip_solid_bounded( + self.file, + item=extrusion, + location=[2.5, 0.0, 2.0], + normal=[0.6, 0.0, 0.8], + boundary_points=[[2.0, 0.0], [3.0, 0.0], [3.0, 2.0], [2.0, 2.0]], + ) + plane = result.SecondOperand.BaseSurface + coords = plane.Position.Location.Coordinates + assert list(coords) == [2.5, 0.0, 2.0] + + def test_boundary_is_closed_polyline(self): + extrusion = self.make_extrusion() + result = ifcopenshell.api.geometry.clip_solid_bounded( + self.file, + item=extrusion, + location=[2.5, 0.0, 2.0], + normal=[0.6, 0.0, 0.8], + boundary_points=[[2.0, 0.0], [3.0, 0.0], [3.0, 2.0], [2.0, 2.0]], + ) + boundary = result.SecondOperand.PolygonalBoundary + assert boundary.is_a("IfcPolyline") + pts = [list(p.Coordinates) for p in boundary.Points] + assert pts[0] == pts[-1], "polygon should be closed" + assert len(pts) == 5 # 4 unique + closing repeat + + def test_boundary_position_defaults_to_origin(self): + extrusion = self.make_extrusion() + result = ifcopenshell.api.geometry.clip_solid_bounded( + self.file, + item=extrusion, + location=[2.5, 0.0, 2.0], + normal=[0.6, 0.0, 0.8], + boundary_points=[[2.0, 0.0], [3.0, 0.0], [3.0, 2.0], [2.0, 2.0]], + ) + pos = result.SecondOperand.Position + assert list(pos.Location.Coordinates) == [0.0, 0.0, 0.0] + + def test_custom_boundary_position(self): + extrusion = self.make_extrusion() + result = ifcopenshell.api.geometry.clip_solid_bounded( + self.file, + item=extrusion, + location=[2.5, 0.0, 2.0], + normal=[0.6, 0.0, 0.8], + boundary_points=[[2.0, 0.0], [3.0, 0.0], [3.0, 2.0], [2.0, 2.0]], + boundary_position=[1.0, 2.0, 3.0], + ) + pos = result.SecondOperand.Position + assert list(pos.Location.Coordinates) == [1.0, 2.0, 3.0] + + def test_chaining_with_clip_solid(self): + extrusion = self.make_extrusion() + first_clip = ifcopenshell.api.geometry.clip_solid( + self.file, + item=extrusion, + location=[0.0, 0.0, 3.0], + normal=[0.0, 0.0, 1.0], + ) + result = ifcopenshell.api.geometry.clip_solid_bounded( + self.file, + item=first_clip, + location=[2.5, 0.0, 2.0], + normal=[0.6, 0.0, 0.8], + boundary_points=[[2.0, 0.0], [3.0, 0.0], [3.0, 2.0], [2.0, 2.0]], + ) + assert result.is_a("IfcBooleanClippingResult") + assert result.FirstOperand == first_clip + assert first_clip.FirstOperand == extrusion + + def test_element_registers_result_in_bbim_boolean(self): + extrusion = self.make_extrusion() + wall = self.file.createIfcWall() + result = ifcopenshell.api.geometry.clip_solid_bounded( + self.file, + item=extrusion, + location=[2.5, 0.0, 2.0], + normal=[0.6, 0.0, 0.8], + boundary_points=[[2.0, 0.0], [3.0, 0.0], [3.0, 2.0], [2.0, 2.0]], + element=wall, + ) + pset = ifcopenshell.util.element.get_pset(wall, "BBIM_Boolean") + assert pset is not None + assert result.id() in json.loads(pset["Data"]) + + def test_no_element_does_not_create_pset(self): + extrusion = self.make_extrusion() + wall = self.file.createIfcWall() + ifcopenshell.api.geometry.clip_solid_bounded( + self.file, + item=extrusion, + location=[2.5, 0.0, 2.0], + normal=[0.6, 0.0, 0.8], + boundary_points=[[2.0, 0.0], [3.0, 0.0], [3.0, 2.0], [2.0, 2.0]], + ) + assert ifcopenshell.util.element.get_pset(wall, "BBIM_Boolean") is None + + +class TestClipSolidBoundedIFC2X3(test.bootstrap.IFC2X3, TestClipSolidBounded): + pass diff --git a/src/ifcopenshell-python/test/api/geometry/test_connect_path.py b/src/ifcopenshell-python/test/api/geometry/test_connect_path.py index bda341d2c68..0927e474ae9 100644 --- a/src/ifcopenshell-python/test/api/geometry/test_connect_path.py +++ b/src/ifcopenshell-python/test/api/geometry/test_connect_path.py @@ -33,6 +33,18 @@ def test_connecting_a_path(self): assert rel.RelatedConnectionType == "ATEND" assert rel.Description == "MITRE" + def test_storing_connection_geometry(self): + wall1 = ifcopenshell.api.root.create_entity(self.file, ifc_class="IfcWall") + wall2 = ifcopenshell.api.root.create_entity(self.file, ifc_class="IfcWall") + geometry = self.file.create_entity("IfcConnectionPointGeometry") + rel = ifcopenshell.api.geometry.connect_path( + self.file, + relating_element=wall1, + related_element=wall2, + connection_geometry=geometry, + ) + assert rel.ConnectionGeometry == geometry + def test_doing_nothing_if_the_element_is_already_connected(self): wall1 = ifcopenshell.api.root.create_entity(self.file, ifc_class="IfcWall") wall2 = ifcopenshell.api.root.create_entity(self.file, ifc_class="IfcWall") diff --git a/src/ifcopenshell-python/test/api/geometry/test_copy_representation.py b/src/ifcopenshell-python/test/api/geometry/test_copy_representation.py new file mode 100644 index 00000000000..b997a91bcf5 --- /dev/null +++ b/src/ifcopenshell-python/test/api/geometry/test_copy_representation.py @@ -0,0 +1,133 @@ +# IfcOpenShell - IFC toolkit and geometry engine +# Copyright (C) 2026 Dion Moult +# +# This file is part of IfcOpenShell. +# +# IfcOpenShell is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# IfcOpenShell is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with IfcOpenShell. If not, see . + +import ifcopenshell.api.geometry +import ifcopenshell.api.root +import ifcopenshell.util.representation +import test.bootstrap + + +class TestCopyRepresentation(test.bootstrap.IFC4): + def _body_context(self): + body = ifcopenshell.util.representation.get_context(self.file, "Model", "Body", "MODEL_VIEW") + if body is None: + model = self.file.createIfcGeometricRepresentationContext( + ContextType="Model", + CoordinateSpaceDimension=3, + Precision=1e-5, + WorldCoordinateSystem=self.file.createIfcAxis2Placement3D( + self.file.createIfcCartesianPoint((0.0, 0.0, 0.0)) + ), + ) + body = self.file.createIfcGeometricRepresentationSubContext( + ContextIdentifier="Body", + ContextType="Model", + TargetView="MODEL_VIEW", + ParentContext=model, + ) + return body + + def _add_body_rep(self, element): + body = self._body_context() + rep = ifcopenshell.api.geometry.add_wall_representation( + self.file, context=body, length=5.0, height=3.0, thickness=0.2 + ) + ifcopenshell.api.geometry.assign_representation(self.file, product=element, representation=rep) + return rep + + def test_copy_to_empty_target(self): + wall_a = ifcopenshell.api.root.create_entity(self.file, ifc_class="IfcWall") + wall_b = ifcopenshell.api.root.create_entity(self.file, ifc_class="IfcWall") + self._add_body_rep(wall_a) + + result = ifcopenshell.api.geometry.copy_representation(self.file, source=wall_a, target=wall_b) + + assert result is not None + assert result.is_a("IfcShapeRepresentation") + target_rep = ifcopenshell.util.representation.get_representation(wall_b, "Model", "Body") + assert target_rep is not None + assert target_rep == result + + def test_source_rep_entities_are_distinct(self): + wall_a = ifcopenshell.api.root.create_entity(self.file, ifc_class="IfcWall") + wall_b = ifcopenshell.api.root.create_entity(self.file, ifc_class="IfcWall") + source_rep = self._add_body_rep(wall_a) + + new_rep = ifcopenshell.api.geometry.copy_representation(self.file, source=wall_a, target=wall_b) + + assert new_rep.id() != source_rep.id() + assert new_rep.Items[0].id() != source_rep.Items[0].id() + + def test_context_is_shared_not_copied(self): + wall_a = ifcopenshell.api.root.create_entity(self.file, ifc_class="IfcWall") + wall_b = ifcopenshell.api.root.create_entity(self.file, ifc_class="IfcWall") + source_rep = self._add_body_rep(wall_a) + + new_rep = ifcopenshell.api.geometry.copy_representation(self.file, source=wall_a, target=wall_b) + + assert new_rep.ContextOfItems.id() == source_rep.ContextOfItems.id() + + def test_replaces_existing_target_rep(self): + wall_a = ifcopenshell.api.root.create_entity(self.file, ifc_class="IfcWall") + wall_b = ifcopenshell.api.root.create_entity(self.file, ifc_class="IfcWall") + self._add_body_rep(wall_a) + old_rep = self._add_body_rep(wall_b) + old_rep_id = old_rep.id() + + ifcopenshell.api.geometry.copy_representation(self.file, source=wall_a, target=wall_b) + + try: + self.file.by_id(old_rep_id) + assert False, "old representation still exists" + except RuntimeError: + pass # entity was removed, as expected + + def test_source_unchanged_after_copy(self): + wall_a = ifcopenshell.api.root.create_entity(self.file, ifc_class="IfcWall") + wall_b = ifcopenshell.api.root.create_entity(self.file, ifc_class="IfcWall") + source_rep = self._add_body_rep(wall_a) + source_rep_id = source_rep.id() + + ifcopenshell.api.geometry.copy_representation(self.file, source=wall_a, target=wall_b) + + assert self.file.by_id(source_rep_id) is not None # source must still exist + assert ifcopenshell.util.representation.get_representation(wall_a, "Model", "Body") is not None + + def test_returns_none_when_no_matching_rep(self): + wall_a = ifcopenshell.api.root.create_entity(self.file, ifc_class="IfcWall") + wall_b = ifcopenshell.api.root.create_entity(self.file, ifc_class="IfcWall") + + result = ifcopenshell.api.geometry.copy_representation(self.file, source=wall_a, target=wall_b) + + assert result is None + + def test_custom_context_identifier(self): + wall_a = ifcopenshell.api.root.create_entity(self.file, ifc_class="IfcWall") + wall_b = ifcopenshell.api.root.create_entity(self.file, ifc_class="IfcWall") + self._add_body_rep(wall_a) + + # "Axis" doesn't exist on wall_a, so should return None + result = ifcopenshell.api.geometry.copy_representation( + self.file, source=wall_a, target=wall_b, context_identifier="Axis" + ) + + assert result is None + + +class TestCopyRepresentationIFC2X3(test.bootstrap.IFC2X3, TestCopyRepresentation): + pass diff --git a/src/ifcopenshell-python/test/api/geometry/test_unassign_representation.py b/src/ifcopenshell-python/test/api/geometry/test_unassign_representation.py index 55fbcaefe96..e44d802e23e 100644 --- a/src/ifcopenshell-python/test/api/geometry/test_unassign_representation.py +++ b/src/ifcopenshell-python/test/api/geometry/test_unassign_representation.py @@ -17,7 +17,6 @@ # along with IfcOpenShell. If not, see . import ifcopenshell.api.geometry -import ifcopenshell.util.placement import test.bootstrap diff --git a/src/ifcopenshell-python/test/api/geometry/test_validate_type.py b/src/ifcopenshell-python/test/api/geometry/test_validate_type.py index 7f4a57e9958..01fa17bfede 100644 --- a/src/ifcopenshell-python/test/api/geometry/test_validate_type.py +++ b/src/ifcopenshell-python/test/api/geometry/test_validate_type.py @@ -76,7 +76,7 @@ def test_adding_multiple_booleans_from_three_top_level_items(self): booleans = ifcopenshell.api.geometry.add_boolean(self.file, first, [second1]) assert len(booleans) == 1 - assert len(rep.Items) == 3 + assert len(rep.Items) == 4 assert ifcopenshell.api.geometry.validate_type(self.file, rep) is True assert len(rep.Items) == 1 assert rep.RepresentationType == "CSG" @@ -96,9 +96,9 @@ def test_failing_validation_on_unreconcilable_types(self): booleans = ifcopenshell.api.geometry.add_boolean(self.file, first, [second1]) assert len(booleans) == 1 - assert len(rep.Items) == 2 + assert len(rep.Items) == 3 # boolean replaced first, but second1 stays in Items assert ifcopenshell.api.geometry.validate_type(self.file, rep) is False - assert len(rep.Items) == 2 + assert len(rep.Items) == 2 # validate_type unioned second1 into the boolean assert rep.RepresentationType is None diff --git a/src/ifcopenshell-python/test/api/georeference/test_add_georeferencing.py b/src/ifcopenshell-python/test/api/georeference/test_add_georeferencing.py index 68f1ac2597e..4eb0e4e609e 100644 --- a/src/ifcopenshell-python/test/api/georeference/test_add_georeferencing.py +++ b/src/ifcopenshell-python/test/api/georeference/test_add_georeferencing.py @@ -51,6 +51,38 @@ def test_not_adding_georeferencing_twice(self): assert len(self.file.by_type("IfcMapConversion")) == 1 assert len(self.file.by_type("IfcProjectedCRS")) == 1 + def test_recovering_from_orphan_projected_crs(self): + ifcopenshell.api.root.create_entity(self.file, ifc_class="IfcProject") + ifcopenshell.api.context.add_context(self.file, "Model") + self.file.create_entity("IfcProjectedCRS", Name="EPSG:1234") + assert len(self.file.by_type("IfcProjectedCRS")) == 1 + assert len(self.file.by_type("IfcCoordinateOperation")) == 0 + ifcopenshell.api.georeference.add_georeferencing(self.file) + assert len(self.file.by_type("IfcMapConversion")) == 1 + assert len(self.file.by_type("IfcProjectedCRS")) == 1 + + def test_recovering_from_orphan_coordinate_operation(self): + ifcopenshell.api.root.create_entity(self.file, ifc_class="IfcProject") + context = ifcopenshell.api.context.add_context(self.file, "Model") + self.file.create_entity( + "IfcMapConversion", + SourceCRS=context, + TargetCRS=self.file.create_entity("IfcProjectedCRS", Name="EPSG:1234"), + ) + ifcopenshell.api.georeference.remove_georeferencing(self.file) + # Simulate orphan by re-adding just a conversion without CRS + self.file.create_entity( + "IfcMapConversion", + SourceCRS=context, + TargetCRS=self.file.create_entity("IfcProjectedCRS", Name="EPSG:1234"), + ) + self.file.remove(self.file.by_type("IfcProjectedCRS")[0]) + assert len(self.file.by_type("IfcProjectedCRS")) == 0 + assert len(self.file.by_type("IfcCoordinateOperation")) == 1 + ifcopenshell.api.georeference.add_georeferencing(self.file) + assert len(self.file.by_type("IfcMapConversion")) == 1 + assert len(self.file.by_type("IfcProjectedCRS")) == 1 + class TestAddGeoreferencingIFC2X3(test.bootstrap.IFC2X3): def test_adding_georeferencing(self): diff --git a/src/ifcopenshell-python/test/api/grid/test_remove_grid_axis.py b/src/ifcopenshell-python/test/api/grid/test_remove_grid_axis.py new file mode 100644 index 00000000000..f59930e0e5a --- /dev/null +++ b/src/ifcopenshell-python/test/api/grid/test_remove_grid_axis.py @@ -0,0 +1,59 @@ +# IfcOpenShell - IFC toolkit and geometry engine +# Copyright (C) 2021 Dion Moult +# +# This file is part of IfcOpenShell. +# +# IfcOpenShell is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# IfcOpenShell is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with IfcOpenShell. If not, see . + +import ifcopenshell.api.grid +import test.bootstrap + + +class TestRemoveGridAxis(test.bootstrap.IFC4): + def test_removing_an_axis_removes_its_curve(self): + grid = self.file.createIfcGrid() + axis = ifcopenshell.api.grid.create_grid_axis( + self.file, axis_tag="A", same_sense=True, uvw_axes="UAxes", grid=grid + ) + axis.AxisCurve = self.file.createIfcPolyline([self.file.createIfcCartesianPoint((0.0, 0.0, 0.0))]) + axis2 = ifcopenshell.api.grid.create_grid_axis( + self.file, axis_tag="B", same_sense=True, uvw_axes="UAxes", grid=grid + ) + axis2.AxisCurve = self.file.createIfcPolyline([self.file.createIfcCartesianPoint((1.0, 0.0, 0.0))]) + ifcopenshell.api.grid.remove_grid_axis(self.file, axis=axis2) + assert grid.UAxes == (axis,) + assert len(self.file.by_type("IfcGridAxis")) == 1 + # The curve should be removed since it was only used by the removed axis. + assert len(self.file.by_type("IfcPolyline")) == 1 + + def test_removing_an_axis_preserves_shared_curve(self): + grid = self.file.createIfcGrid() + shared_curve = self.file.createIfcPolyline([self.file.createIfcCartesianPoint((0.0, 0.0, 0.0))]) + axis = ifcopenshell.api.grid.create_grid_axis( + self.file, axis_tag="A", same_sense=True, uvw_axes="UAxes", grid=grid + ) + axis.AxisCurve = shared_curve + axis2 = ifcopenshell.api.grid.create_grid_axis( + self.file, axis_tag="B", same_sense=True, uvw_axes="UAxes", grid=grid + ) + axis2.AxisCurve = shared_curve + ifcopenshell.api.grid.remove_grid_axis(self.file, axis=axis2) + assert grid.UAxes == (axis,) + # The shared curve should be preserved since it's still used by axis. + assert shared_curve in self.file + assert axis.AxisCurve == shared_curve + + +class TestRemoveGridAxisIFC2X3(test.bootstrap.IFC2X3, TestRemoveGridAxis): + pass diff --git a/src/ifcopenshell-python/test/api/group/test_add_group.py b/src/ifcopenshell-python/test/api/group/test_add_group.py index 0c3547ce496..22eaac30c5d 100644 --- a/src/ifcopenshell-python/test/api/group/test_add_group.py +++ b/src/ifcopenshell-python/test/api/group/test_add_group.py @@ -17,7 +17,6 @@ # along with IfcOpenShell. If not, see . import ifcopenshell.api.group -import ifcopenshell.util.element import test.bootstrap diff --git a/src/ifcopenshell-python/test/api/material/test_edit_profile_usage.py b/src/ifcopenshell-python/test/api/material/test_edit_profile_usage.py index 478c41eb55d..ae4230d29f7 100644 --- a/src/ifcopenshell-python/test/api/material/test_edit_profile_usage.py +++ b/src/ifcopenshell-python/test/api/material/test_edit_profile_usage.py @@ -20,7 +20,6 @@ import ifcopenshell.api.geometry import ifcopenshell.api.material import ifcopenshell.api.root -import ifcopenshell.util.placement import test.bootstrap from ifcopenshell.util.shape_builder import ShapeBuilder diff --git a/src/ifcopenshell-python/test/api/nest/test_assign_object.py b/src/ifcopenshell-python/test/api/nest/test_assign_object.py index 45c4d828e3c..c83f796ac0f 100644 --- a/src/ifcopenshell-python/test/api/nest/test_assign_object.py +++ b/src/ifcopenshell-python/test/api/nest/test_assign_object.py @@ -18,10 +18,11 @@ import pytest +import ifcopenshell.api.aggregate import ifcopenshell.api.nest import ifcopenshell.api.root +import ifcopenshell.api.spatial import ifcopenshell.util.element -import ifcopenshell.util.placement import test.bootstrap @@ -83,6 +84,24 @@ def test_maintain_assignment_order_in_related_objects(self): ifcopenshell.api.nest.assign_object(self.file, related_objects=subelements[2:3], relating_object=element2) assert rel.RelatedObjects == tuple(subelements[:2] + subelements[3:]) + def test_nesting_removes_spatial_containment(self): + element = ifcopenshell.api.root.create_entity(self.file, ifc_class="IfcWall") + subelement = ifcopenshell.api.root.create_entity(self.file, ifc_class="IfcWall") + storey = ifcopenshell.api.root.create_entity(self.file, ifc_class="IfcBuildingStorey") + ifcopenshell.api.spatial.assign_container(self.file, products=[subelement], relating_structure=storey) + assert ifcopenshell.util.element.get_container(subelement) == storey + ifcopenshell.api.nest.assign_object(self.file, related_objects=[subelement], relating_object=element) + assert ifcopenshell.util.element.get_container(subelement) is None + + def test_nesting_removes_aggregate(self): + element = ifcopenshell.api.root.create_entity(self.file, ifc_class="IfcWall") + subelement = ifcopenshell.api.root.create_entity(self.file, ifc_class="IfcWall") + assembly = ifcopenshell.api.root.create_entity(self.file, ifc_class="IfcElementAssembly") + ifcopenshell.api.aggregate.assign_object(self.file, products=[subelement], relating_object=assembly) + assert ifcopenshell.util.element.get_aggregate(subelement) == assembly + ifcopenshell.api.nest.assign_object(self.file, related_objects=[subelement], relating_object=element) + assert ifcopenshell.util.element.get_aggregate(subelement) is None + class TestAssignObjectIFC2X3(test.bootstrap.IFC2X3, TestAssignObject): pass diff --git a/src/ifcopenshell-python/test/api/project/test_append_asset.py b/src/ifcopenshell-python/test/api/project/test_append_asset.py index f89e4d5c898..949fc2fa5f7 100644 --- a/src/ifcopenshell-python/test/api/project/test_append_asset.py +++ b/src/ifcopenshell-python/test/api/project/test_append_asset.py @@ -37,7 +37,6 @@ import ifcopenshell.util.classification import ifcopenshell.util.element import ifcopenshell.util.placement -import ifcopenshell.util.unit import test.bootstrap from ifcopenshell.util.shape_builder import ShapeBuilder diff --git a/src/ifcopenshell-python/test/api/pset/test_assign_pset.py b/src/ifcopenshell-python/test/api/pset/test_assign_pset.py index e1234e8fe19..0685d1dbf01 100644 --- a/src/ifcopenshell-python/test/api/pset/test_assign_pset.py +++ b/src/ifcopenshell-python/test/api/pset/test_assign_pset.py @@ -17,7 +17,6 @@ # along with IfcOpenShell. If not, see . import ifcopenshell.api.pset -import ifcopenshell.util.element import test.bootstrap diff --git a/src/ifcopenshell-python/test/api/pset/test_unassign_pset.py b/src/ifcopenshell-python/test/api/pset/test_unassign_pset.py index 58c476d74a7..3ee3e85328d 100644 --- a/src/ifcopenshell-python/test/api/pset/test_unassign_pset.py +++ b/src/ifcopenshell-python/test/api/pset/test_unassign_pset.py @@ -17,7 +17,6 @@ # along with IfcOpenShell. If not, see . import ifcopenshell.api.pset -import ifcopenshell.util.element import test.bootstrap diff --git a/src/ifcopenshell-python/test/api/pset/test_unshare_pset.py b/src/ifcopenshell-python/test/api/pset/test_unshare_pset.py index 769294e1b56..76481b91703 100644 --- a/src/ifcopenshell-python/test/api/pset/test_unshare_pset.py +++ b/src/ifcopenshell-python/test/api/pset/test_unshare_pset.py @@ -17,7 +17,6 @@ # along with IfcOpenShell. If not, see . import ifcopenshell.api.pset -import ifcopenshell.api.root import ifcopenshell.guid import ifcopenshell.util.element import test.bootstrap diff --git a/src/ifcopenshell-python/test/api/pset_template/test_remove_prop_template.py b/src/ifcopenshell-python/test/api/pset_template/test_remove_prop_template.py new file mode 100644 index 00000000000..d967a0017af --- /dev/null +++ b/src/ifcopenshell-python/test/api/pset_template/test_remove_prop_template.py @@ -0,0 +1,38 @@ +# IfcOpenShell - IFC toolkit and geometry engine +# Copyright (C) 2021 Dion Moult +# +# This file is part of IfcOpenShell. +# +# IfcOpenShell is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# IfcOpenShell is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with IfcOpenShell. If not, see . + +import ifcopenshell.api.pset_template +import test.bootstrap + + +class TestRemovePropTemplate(test.bootstrap.IFC4): + def test_removing_a_prop_template(self): + template = ifcopenshell.api.pset_template.add_pset_template(self.file, name="ABC_RiskFactors") + prop1 = ifcopenshell.api.pset_template.add_prop_template(self.file, pset_template=template) + prop2 = ifcopenshell.api.pset_template.add_prop_template(self.file, pset_template=template) + ifcopenshell.api.pset_template.remove_prop_template(self.file, prop_template=prop2) + assert len(self.file.by_type("IfcSimplePropertyTemplate")) == 1 + assert template.HasPropertyTemplates == (prop1,) + + def test_not_removing_the_last_prop_template(self): + template = ifcopenshell.api.pset_template.add_pset_template(self.file, name="ABC_RiskFactors") + prop = ifcopenshell.api.pset_template.add_prop_template(self.file, pset_template=template) + ifcopenshell.api.pset_template.remove_prop_template(self.file, prop_template=prop) + # The last prop template should not be removed to keep the pset template valid. + assert len(self.file.by_type("IfcSimplePropertyTemplate")) == 1 + assert template.HasPropertyTemplates == (prop,) diff --git a/src/ifcopenshell-python/test/api/pset_template/test_remove_pset_template.py b/src/ifcopenshell-python/test/api/pset_template/test_remove_pset_template.py new file mode 100644 index 00000000000..67c700a74f2 --- /dev/null +++ b/src/ifcopenshell-python/test/api/pset_template/test_remove_pset_template.py @@ -0,0 +1,35 @@ +# IfcOpenShell - IFC toolkit and geometry engine +# Copyright (C) 2021 Dion Moult +# +# This file is part of IfcOpenShell. +# +# IfcOpenShell is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# IfcOpenShell is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with IfcOpenShell. If not, see . + +import ifcopenshell.api.pset_template +import test.bootstrap + + +class TestRemovePsetTemplate(test.bootstrap.IFC4): + def test_removing_a_pset_template(self): + template = ifcopenshell.api.pset_template.add_pset_template(self.file, name="ABC_RiskFactors") + ifcopenshell.api.pset_template.remove_pset_template(self.file, pset_template=template) + assert len(self.file.by_type("IfcPropertySetTemplate")) == 0 + + def test_removing_a_pset_template_with_property_templates(self): + template = ifcopenshell.api.pset_template.add_pset_template(self.file, name="ABC_RiskFactors") + prop1 = ifcopenshell.api.pset_template.add_prop_template(self.file, pset_template=template) + prop2 = ifcopenshell.api.pset_template.add_prop_template(self.file, pset_template=template) + ifcopenshell.api.pset_template.remove_pset_template(self.file, pset_template=template) + assert len(self.file.by_type("IfcPropertySetTemplate")) == 0 + assert len(self.file.by_type("IfcSimplePropertyTemplate")) == 0 diff --git a/src/ifcopenshell-python/test/api/resource/test_calculate_resource_work.py b/src/ifcopenshell-python/test/api/resource/test_calculate_resource_work.py index 6affa8a60f4..a15947a544c 100644 --- a/src/ifcopenshell-python/test/api/resource/test_calculate_resource_work.py +++ b/src/ifcopenshell-python/test/api/resource/test_calculate_resource_work.py @@ -20,7 +20,6 @@ import ifcopenshell.api.resource import ifcopenshell.api.root import ifcopenshell.api.sequence -import ifcopenshell.util.constraint import test.bootstrap diff --git a/src/ifcopenshell-python/test/api/resource/test_remove_resource_quantity.py b/src/ifcopenshell-python/test/api/resource/test_remove_resource_quantity.py new file mode 100644 index 00000000000..74182d1c69a --- /dev/null +++ b/src/ifcopenshell-python/test/api/resource/test_remove_resource_quantity.py @@ -0,0 +1,42 @@ +# IfcOpenShell - IFC toolkit and geometry engine +# Copyright (C) 2021 Dion Moult +# +# This file is part of IfcOpenShell. +# +# IfcOpenShell is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# IfcOpenShell is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with IfcOpenShell. If not, see . + +import ifcopenshell.api.resource +import test.bootstrap + + +class TestRemoveResourceQuantity(test.bootstrap.IFC4): + def test_removing_a_resource_quantity(self): + self.file.create_entity("IfcProject") + resource = ifcopenshell.api.resource.add_resource(self.file, ifc_class="IfcLaborResource") + ifcopenshell.api.resource.add_resource_quantity(self.file, resource=resource, ifc_class="IfcQuantityTime") + assert resource.BaseQuantity is not None + ifcopenshell.api.resource.remove_resource_quantity(self.file, resource=resource) + assert resource.BaseQuantity is None + assert len(self.file.by_type("IfcPhysicalSimpleQuantity")) == 0 + + def test_removing_a_resource_quantity_when_none_exists(self): + self.file.create_entity("IfcProject") + resource = ifcopenshell.api.resource.add_resource(self.file, ifc_class="IfcLaborResource") + # Should not raise. + ifcopenshell.api.resource.remove_resource_quantity(self.file, resource=resource) + assert resource.BaseQuantity is None + + +class TestRemoveResourceQuantityIFC2X3(test.bootstrap.IFC2X3, TestRemoveResourceQuantity): + pass diff --git a/src/ifcopenshell-python/test/api/root/test_copy_class.py b/src/ifcopenshell-python/test/api/root/test_copy_class.py index 77de0233799..c8cf57c3f6c 100644 --- a/src/ifcopenshell-python/test/api/root/test_copy_class.py +++ b/src/ifcopenshell-python/test/api/root/test_copy_class.py @@ -28,7 +28,6 @@ import ifcopenshell.api.system import ifcopenshell.api.type import ifcopenshell.api.unit -import ifcopenshell.util import ifcopenshell.util.system import test.bootstrap diff --git a/src/ifcopenshell-python/test/api/sequence/test_remove_task.py b/src/ifcopenshell-python/test/api/sequence/test_remove_task.py index 1d1d3c14670..8395afe288f 100644 --- a/src/ifcopenshell-python/test/api/sequence/test_remove_task.py +++ b/src/ifcopenshell-python/test/api/sequence/test_remove_task.py @@ -16,9 +16,7 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . -import pytest -import ifcopenshell.api import ifcopenshell.api.nest import ifcopenshell.api.sequence import test.bootstrap diff --git a/src/ifcopenshell-python/test/api/sequence/test_remove_work_calendar.py b/src/ifcopenshell-python/test/api/sequence/test_remove_work_calendar.py index 42264d1182b..cadf4770dba 100644 --- a/src/ifcopenshell-python/test/api/sequence/test_remove_work_calendar.py +++ b/src/ifcopenshell-python/test/api/sequence/test_remove_work_calendar.py @@ -16,9 +16,7 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . -import pytest -import ifcopenshell.api import ifcopenshell.api.control import ifcopenshell.api.sequence import test.bootstrap diff --git a/src/ifcopenshell-python/test/api/sequence/test_remove_work_plan.py b/src/ifcopenshell-python/test/api/sequence/test_remove_work_plan.py index 6f9a0ee9cfa..906ea7a6447 100644 --- a/src/ifcopenshell-python/test/api/sequence/test_remove_work_plan.py +++ b/src/ifcopenshell-python/test/api/sequence/test_remove_work_plan.py @@ -16,7 +16,6 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . -import pytest import ifcopenshell.api import ifcopenshell.api.sequence diff --git a/src/ifcopenshell-python/test/api/sequence/test_remove_work_schedule.py b/src/ifcopenshell-python/test/api/sequence/test_remove_work_schedule.py index ea2b0943646..02608e64f69 100644 --- a/src/ifcopenshell-python/test/api/sequence/test_remove_work_schedule.py +++ b/src/ifcopenshell-python/test/api/sequence/test_remove_work_schedule.py @@ -16,7 +16,6 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . -import pytest import ifcopenshell.api import ifcopenshell.api.sequence diff --git a/src/ifcopenshell-python/test/api/sequence/test_remove_work_time.py b/src/ifcopenshell-python/test/api/sequence/test_remove_work_time.py index 30393c540b0..207206f3665 100644 --- a/src/ifcopenshell-python/test/api/sequence/test_remove_work_time.py +++ b/src/ifcopenshell-python/test/api/sequence/test_remove_work_time.py @@ -16,9 +16,7 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . -import pytest -import ifcopenshell.api import ifcopenshell.api.sequence import test.bootstrap diff --git a/src/ifcopenshell-python/test/api/spatial/test_unassign_container.py b/src/ifcopenshell-python/test/api/spatial/test_unassign_container.py index efd89c990f3..2a75a0c9df6 100644 --- a/src/ifcopenshell-python/test/api/spatial/test_unassign_container.py +++ b/src/ifcopenshell-python/test/api/spatial/test_unassign_container.py @@ -19,7 +19,6 @@ import ifcopenshell.api.root import ifcopenshell.api.spatial import ifcopenshell.util.element -import ifcopenshell.util.placement import test.bootstrap diff --git a/src/ifcopenshell-python/test/api/structural/test_assign_product.py b/src/ifcopenshell-python/test/api/structural/test_assign_product.py new file mode 100644 index 00000000000..3e2f1c2b4ac --- /dev/null +++ b/src/ifcopenshell-python/test/api/structural/test_assign_product.py @@ -0,0 +1,56 @@ +# IfcOpenShell - IFC toolkit and geometry engine +# Copyright (C) 2026 Dion Moult +# +# This file is part of IfcOpenShell. +# +# IfcOpenShell is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# IfcOpenShell is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with IfcOpenShell. If not, see . +# This file was generated with the assistance of an AI coding tool. + +import ifcopenshell.api.root +import ifcopenshell.api.structural +import test.bootstrap + + +class TestAssignProduct(test.bootstrap.IFC4): + def test_creating_a_new_relationship(self): + member = ifcopenshell.api.root.create_entity(self.file, ifc_class="IfcStructuralSurfaceMember") + wall = ifcopenshell.api.root.create_entity(self.file, ifc_class="IfcWall") + rel = ifcopenshell.api.structural.assign_product(self.file, relating_product=member, related_object=wall) + assert rel.is_a("IfcRelAssignsToProduct") + assert rel.RelatingProduct == member + assert wall in rel.RelatedObjects + + def test_adding_a_second_object_to_an_existing_relationship(self): + member = ifcopenshell.api.root.create_entity(self.file, ifc_class="IfcStructuralSurfaceMember") + wall1 = ifcopenshell.api.root.create_entity(self.file, ifc_class="IfcWall") + wall2 = ifcopenshell.api.root.create_entity(self.file, ifc_class="IfcWall") + rel1 = ifcopenshell.api.structural.assign_product(self.file, relating_product=member, related_object=wall1) + rel2 = ifcopenshell.api.structural.assign_product(self.file, relating_product=member, related_object=wall2) + assert rel1 == rel2 + assert len(self.file.by_type("IfcRelAssignsToProduct")) == 1 + assert wall1 in rel1.RelatedObjects + assert wall2 in rel1.RelatedObjects + + def test_does_not_duplicate_an_existing_assignment(self): + member = ifcopenshell.api.root.create_entity(self.file, ifc_class="IfcStructuralSurfaceMember") + wall = ifcopenshell.api.root.create_entity(self.file, ifc_class="IfcWall") + ifcopenshell.api.structural.assign_product(self.file, relating_product=member, related_object=wall) + ifcopenshell.api.structural.assign_product(self.file, relating_product=member, related_object=wall) + assert len(self.file.by_type("IfcRelAssignsToProduct")) == 1 + rels = self.file.by_type("IfcRelAssignsToProduct") + assert len(rels[0].RelatedObjects) == 1 + + +class TestAssignProductIFC2X3(test.bootstrap.IFC2X3, TestAssignProduct): + pass diff --git a/src/ifcopenshell-python/test/api/structural/test_assign_to_building.py b/src/ifcopenshell-python/test/api/structural/test_assign_to_building.py new file mode 100644 index 00000000000..671ca1b4765 --- /dev/null +++ b/src/ifcopenshell-python/test/api/structural/test_assign_to_building.py @@ -0,0 +1,62 @@ +# IfcOpenShell - IFC toolkit and geometry engine +# Copyright (C) 2026 Dion Moult +# +# This file is part of IfcOpenShell. +# +# IfcOpenShell is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# IfcOpenShell is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with IfcOpenShell. If not, see . +# This file was generated with the assistance of an AI coding tool. + +import ifcopenshell.api.root +import ifcopenshell.api.structural +import test.bootstrap + + +class TestAssignToBuilding(test.bootstrap.IFC4): + def test_creating_a_new_relationship(self): + model = ifcopenshell.api.structural.add_structural_analysis_model(self.file) + building = ifcopenshell.api.root.create_entity(self.file, ifc_class="IfcBuilding") + rel = ifcopenshell.api.structural.assign_to_building( + self.file, structural_analysis_model=model, building=building + ) + assert rel.is_a("IfcRelServicesBuildings") + assert rel.RelatingSystem == model + assert building in rel.RelatedBuildings + + def test_adding_a_second_building_to_an_existing_relationship(self): + model = ifcopenshell.api.structural.add_structural_analysis_model(self.file) + building1 = ifcopenshell.api.root.create_entity(self.file, ifc_class="IfcBuilding") + building2 = ifcopenshell.api.root.create_entity(self.file, ifc_class="IfcBuilding") + rel1 = ifcopenshell.api.structural.assign_to_building( + self.file, structural_analysis_model=model, building=building1 + ) + rel2 = ifcopenshell.api.structural.assign_to_building( + self.file, structural_analysis_model=model, building=building2 + ) + assert rel1 == rel2 + assert len(self.file.by_type("IfcRelServicesBuildings")) == 1 + assert building1 in rel1.RelatedBuildings + assert building2 in rel1.RelatedBuildings + + def test_does_not_duplicate_an_existing_assignment(self): + model = ifcopenshell.api.structural.add_structural_analysis_model(self.file) + building = ifcopenshell.api.root.create_entity(self.file, ifc_class="IfcBuilding") + ifcopenshell.api.structural.assign_to_building(self.file, structural_analysis_model=model, building=building) + ifcopenshell.api.structural.assign_to_building(self.file, structural_analysis_model=model, building=building) + assert len(self.file.by_type("IfcRelServicesBuildings")) == 1 + rels = self.file.by_type("IfcRelServicesBuildings") + assert len(rels[0].RelatedBuildings) == 1 + + +class TestAssignToBuildingIFC2X3(test.bootstrap.IFC2X3, TestAssignToBuilding): + pass diff --git a/src/ifcopenshell-python/test/api/style/test_add_surface_textures.py b/src/ifcopenshell-python/test/api/style/test_add_surface_textures.py index 12c1711baaf..aa7d011adc3 100644 --- a/src/ifcopenshell-python/test/api/style/test_add_surface_textures.py +++ b/src/ifcopenshell-python/test/api/style/test_add_surface_textures.py @@ -16,7 +16,6 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . -import pytest import ifcopenshell.api.style import test.bootstrap diff --git a/src/ifcopenshell-python/test/api/style/test_assign_material_style.py b/src/ifcopenshell-python/test/api/style/test_assign_material_style.py index 7b7ea3df56d..40e82d7ac2f 100644 --- a/src/ifcopenshell-python/test/api/style/test_assign_material_style.py +++ b/src/ifcopenshell-python/test/api/style/test_assign_material_style.py @@ -16,7 +16,6 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . -import ifcopenshell import ifcopenshell.api.material import ifcopenshell.api.root import ifcopenshell.api.style diff --git a/src/ifcopenshell-python/test/api/style/test_assign_representation_styles.py b/src/ifcopenshell-python/test/api/style/test_assign_representation_styles.py index 157acf49da0..0dbe2b51ad5 100644 --- a/src/ifcopenshell-python/test/api/style/test_assign_representation_styles.py +++ b/src/ifcopenshell-python/test/api/style/test_assign_representation_styles.py @@ -16,7 +16,6 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . -import ifcopenshell import ifcopenshell.api.root import ifcopenshell.api.style import test.bootstrap diff --git a/src/ifcopenshell-python/test/api/style/test_remove_style.py b/src/ifcopenshell-python/test/api/style/test_remove_style.py index 5b39ec655c5..04faee3b253 100644 --- a/src/ifcopenshell-python/test/api/style/test_remove_style.py +++ b/src/ifcopenshell-python/test/api/style/test_remove_style.py @@ -16,7 +16,6 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . -import pytest import ifcopenshell.api.material import ifcopenshell.api.style diff --git a/src/ifcopenshell-python/test/api/style/test_remove_surface_style.py b/src/ifcopenshell-python/test/api/style/test_remove_surface_style.py index 12ebf766f21..25affe54a4f 100644 --- a/src/ifcopenshell-python/test/api/style/test_remove_surface_style.py +++ b/src/ifcopenshell-python/test/api/style/test_remove_surface_style.py @@ -16,7 +16,6 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . -import pytest import ifcopenshell.api.style import test.bootstrap diff --git a/src/ifcopenshell-python/test/api/style/test_unassign_material_style.py b/src/ifcopenshell-python/test/api/style/test_unassign_material_style.py index 919f26e3c9f..6a3fad0c205 100644 --- a/src/ifcopenshell-python/test/api/style/test_unassign_material_style.py +++ b/src/ifcopenshell-python/test/api/style/test_unassign_material_style.py @@ -16,7 +16,6 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . -import ifcopenshell import ifcopenshell.api.material import ifcopenshell.api.root import ifcopenshell.api.style diff --git a/src/ifcopenshell-python/test/api/style/test_unassign_representation_styles.py b/src/ifcopenshell-python/test/api/style/test_unassign_representation_styles.py index ed7285b1dea..45bf8529473 100644 --- a/src/ifcopenshell-python/test/api/style/test_unassign_representation_styles.py +++ b/src/ifcopenshell-python/test/api/style/test_unassign_representation_styles.py @@ -16,7 +16,6 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . -import ifcopenshell import ifcopenshell.api.root import ifcopenshell.api.style import test.bootstrap diff --git a/src/ifcopenshell-python/test/api/system/test_connect_port.py b/src/ifcopenshell-python/test/api/system/test_connect_port.py index 06d1fb7f267..53975b5fd90 100644 --- a/src/ifcopenshell-python/test/api/system/test_connect_port.py +++ b/src/ifcopenshell-python/test/api/system/test_connect_port.py @@ -18,7 +18,6 @@ import ifcopenshell.api.root import ifcopenshell.api.system -import ifcopenshell.util.system import test.bootstrap diff --git a/src/ifcopenshell-python/test/api/system/test_disconnect_port.py b/src/ifcopenshell-python/test/api/system/test_disconnect_port.py index 4d782414a6a..1d711bdd2c5 100644 --- a/src/ifcopenshell-python/test/api/system/test_disconnect_port.py +++ b/src/ifcopenshell-python/test/api/system/test_disconnect_port.py @@ -17,7 +17,6 @@ # along with IfcOpenShell. If not, see . import ifcopenshell.api.system -import ifcopenshell.util.system import test.bootstrap diff --git a/src/ifcopenshell-python/test/api/system/test_unassign_system.py b/src/ifcopenshell-python/test/api/system/test_unassign_system.py index 7e60cbb07c2..3db260b5aba 100644 --- a/src/ifcopenshell-python/test/api/system/test_unassign_system.py +++ b/src/ifcopenshell-python/test/api/system/test_unassign_system.py @@ -16,7 +16,6 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . -import pytest import ifcopenshell.api.root import ifcopenshell.api.system diff --git a/src/ifcopenshell-python/test/api/test_api.py b/src/ifcopenshell-python/test/api/test_api.py index 55889cc6272..8bed51a56fb 100644 --- a/src/ifcopenshell-python/test/api/test_api.py +++ b/src/ifcopenshell-python/test/api/test_api.py @@ -15,41 +15,3 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . - -from datetime import datetime -from typing import Union - -import ifcopenshell.api -import ifcopenshell.api.control -import ifcopenshell.api.cost -import ifcopenshell.api.root -import ifcopenshell.api.sequence -import ifcopenshell.util.element -import test.bootstrap - - -def deprecation_check(test): - def new_test(self): - assert datetime.now().date() < datetime(2026, 1, 9).date(), "API arguments are completely deprecated" - test(self) - - return new_test - - -class TestTemporarySupportForDeprecatedAPIArguments(test.bootstrap.IFC4): - @deprecation_check - def test_assigning_control(self): - model = self.file - element = ifcopenshell.api.root.create_entity(model, ifc_class="IfcWall") - control = ifcopenshell.api.cost.add_cost_schedule(model) - ifcopenshell.api.control.assign_control(model, relating_control=control, related_objects=[element]) - assert list(ifcopenshell.util.element.get_controls(element)) == [control] - - @deprecation_check - def test_unassigning_control(self): - TestTemporarySupportForDeprecatedAPIArguments.test_assigning_control(self) - model = self.file - element = model.by_type("IfcWall")[0] - control = model.by_type("IfcCostSchedule")[0] - ifcopenshell.api.control.unassign_control(model, relating_control=control, related_objects=[element]) - assert list(ifcopenshell.util.element.get_controls(element)) == [] diff --git a/src/ifcopenshell-python/test/geom/geometry_tests.py b/src/ifcopenshell-python/test/geom/geometry_tests.py index f18cb3206a6..744bf432fc4 100644 --- a/src/ifcopenshell-python/test/geom/geometry_tests.py +++ b/src/ifcopenshell-python/test/geom/geometry_tests.py @@ -18,7 +18,6 @@ import numpy as np -import ifcopenshell import ifcopenshell.geom import ifcopenshell.util.shape import test.bootstrap diff --git a/src/ifcopenshell-python/test/geom/polyhedral_shapes.py b/src/ifcopenshell-python/test/geom/polyhedral_shapes.py index 07ed5bf6e6f..c844c961e28 100644 --- a/src/ifcopenshell-python/test/geom/polyhedral_shapes.py +++ b/src/ifcopenshell-python/test/geom/polyhedral_shapes.py @@ -5,7 +5,6 @@ import ifcopenshell import ifcopenshell.geom -from test.bootstrap import file @pytest.mark.parametrize("file", ["geom/polygonal-face-tessellation.ifc"], indirect=True) diff --git a/src/ifcopenshell-python/test/geom/stats.py b/src/ifcopenshell-python/test/geom/stats.py index 9e2a9b29855..88f9b643459 100644 --- a/src/ifcopenshell-python/test/geom/stats.py +++ b/src/ifcopenshell-python/test/geom/stats.py @@ -2,7 +2,6 @@ import pytest -import ifcopenshell from ifcopenshell.geom.stats import StatsCollector diff --git a/src/ifcopenshell-python/test/test_entity_instance.py b/src/ifcopenshell-python/test/test_entity_instance.py index c031796b9f7..cf4c0503204 100644 --- a/src/ifcopenshell-python/test/test_entity_instance.py +++ b/src/ifcopenshell-python/test/test_entity_instance.py @@ -16,11 +16,7 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . -import pytest -import ifcopenshell -import ifcopenshell.api -import ifcopenshell.util.element import test.bootstrap diff --git a/src/ifcopenshell-python/test/test_file.py b/src/ifcopenshell-python/test/test_file.py index 062ef88b9ff..c2c0aa54ead 100644 --- a/src/ifcopenshell-python/test/test_file.py +++ b/src/ifcopenshell-python/test/test_file.py @@ -19,8 +19,6 @@ import pytest import ifcopenshell -import ifcopenshell.api -import ifcopenshell.util.element import test.bootstrap diff --git a/src/ifcopenshell-python/test/file_gc.py b/src/ifcopenshell-python/test/test_file_gc.py similarity index 99% rename from src/ifcopenshell-python/test/file_gc.py rename to src/ifcopenshell-python/test/test_file_gc.py index 483c268e171..532fa664ec0 100644 --- a/src/ifcopenshell-python/test/file_gc.py +++ b/src/ifcopenshell-python/test/test_file_gc.py @@ -95,7 +95,7 @@ def test_bug_2486_a(): file = ifcopenshell.api.project.create_file() mymaterial = ifcopenshell.api.material.add_material(file) - pset = ifcopenshell.api.pset.add_pset(file, product=mymaterial) + pset = ifcopenshell.api.pset.add_pset(file, product=mymaterial, name="Foo") ifcopenshell.api.pset.edit_pset( file, pset=pset, diff --git a/src/ifcopenshell-python/test/test_file_inverse.py b/src/ifcopenshell-python/test/test_file_inverse.py index d1708bc2bb9..af2e0d8a319 100644 --- a/src/ifcopenshell-python/test/test_file_inverse.py +++ b/src/ifcopenshell-python/test/test_file_inverse.py @@ -1,13 +1,6 @@ -import gc -import itertools -import pprint -import sys -import weakref - import pytest import ifcopenshell -import ifcopenshell.api def test_inverse_indices(): diff --git a/src/ifcopenshell-python/test/global_id_updates.py b/src/ifcopenshell-python/test/test_global_id_updates.py similarity index 100% rename from src/ifcopenshell-python/test/global_id_updates.py rename to src/ifcopenshell-python/test/test_global_id_updates.py diff --git a/src/ifcopenshell-python/test/instance_string_formatting.py b/src/ifcopenshell-python/test/test_instance_string_formatting.py similarity index 100% rename from src/ifcopenshell-python/test/instance_string_formatting.py rename to src/ifcopenshell-python/test/test_instance_string_formatting.py diff --git a/src/ifcopenshell-python/test/test_package.py b/src/ifcopenshell-python/test/test_package.py index b251e081c70..c7ed42a26a4 100644 --- a/src/ifcopenshell-python/test/test_package.py +++ b/src/ifcopenshell-python/test/test_package.py @@ -32,7 +32,7 @@ # - .github/workflows/ci-ifcopenshell-python.yml # - .github/workflows/ci-ifcopenshell-python-pypi.yml # - src/ifcopenshell-python/Makefile (PYVERSION check) -SUPPORTED_PY_VERSIONS = ("39", "310", "311", "312", "313", "314") +SUPPORTED_PY_VERSIONS = ("310", "311", "312", "313", "314") SUPPORTED_PLATFORMS = ("win64", "linux64", "macos64", "macosm164") WASM_SUPPORTED_PY_VERSIONS = ("313",) diff --git a/src/ifcopenshell-python/test/test_sql.py b/src/ifcopenshell-python/test/test_sql.py index d0f11792c4e..39cf4c2583f 100644 --- a/src/ifcopenshell-python/test/test_sql.py +++ b/src/ifcopenshell-python/test/test_sql.py @@ -19,7 +19,6 @@ import tempfile from pathlib import Path -import ifcpatch from ifcpatch.recipes import Ifc2Sql import ifcopenshell diff --git a/src/ifcopenshell-python/test/test_stream.py b/src/ifcopenshell-python/test/test_stream.py index c463c3cccaa..754fcc4527b 100644 --- a/src/ifcopenshell-python/test/test_stream.py +++ b/src/ifcopenshell-python/test/test_stream.py @@ -18,10 +18,7 @@ from pathlib import Path -import pytest - import ifcopenshell -import test.bootstrap TEST_FILE = Path(__file__).parent / "files" / "basic.ifc" diff --git a/src/ifcopenshell-python/test/test_validate_rocksdb.py b/src/ifcopenshell-python/test/test_validate_rocksdb.py index 6cfde4fddde..64c010938bf 100644 --- a/src/ifcopenshell-python/test/test_validate_rocksdb.py +++ b/src/ifcopenshell-python/test/test_validate_rocksdb.py @@ -19,7 +19,6 @@ import glob import os import tempfile -import time import pytest diff --git a/src/ifcopenshell-python/test/test_wall_opening.py b/src/ifcopenshell-python/test/test_wall_opening.py index 812a5420e2b..a08ff445be3 100644 --- a/src/ifcopenshell-python/test/test_wall_opening.py +++ b/src/ifcopenshell-python/test/test_wall_opening.py @@ -27,7 +27,6 @@ import pytest -import ifcopenshell import ifcopenshell.guid import ifcopenshell.template diff --git a/src/ifcopenshell-python/test/typing_tests.py b/src/ifcopenshell-python/test/typing_tests.py index 5b2d789613e..ccf007fa622 100644 --- a/src/ifcopenshell-python/test/typing_tests.py +++ b/src/ifcopenshell-python/test/typing_tests.py @@ -21,7 +21,6 @@ Those tests are not automatically checked and just there to make sure overloads are making sense. """ - from typing import Union from typing_extensions import assert_type diff --git a/src/ifcopenshell-python/test/util/scripts/test_validate_stub.py b/src/ifcopenshell-python/test/util/scripts/test_validate_stub.py index 82b9e02adc4..a4a0b1ecbc7 100644 --- a/src/ifcopenshell-python/test/util/scripts/test_validate_stub.py +++ b/src/ifcopenshell-python/test/util/scripts/test_validate_stub.py @@ -16,7 +16,6 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . -import pytest import ifcopenshell.util.scripts.validate_stub as subject diff --git a/src/ifcopenshell-python/test/util/test_attribute.py b/src/ifcopenshell-python/test/util/test_attribute.py index 4b04e8a6783..c3d882dc72e 100644 --- a/src/ifcopenshell-python/test/util/test_attribute.py +++ b/src/ifcopenshell-python/test/util/test_attribute.py @@ -16,7 +16,6 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . -import pytest import ifcopenshell import ifcopenshell.ifcopenshell_wrapper as W diff --git a/src/ifcopenshell-python/test/util/test_brick.py b/src/ifcopenshell-python/test/util/test_brick.py index d0cffeaba9c..88302a21709 100644 --- a/src/ifcopenshell-python/test/util/test_brick.py +++ b/src/ifcopenshell-python/test/util/test_brick.py @@ -16,7 +16,6 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . -import pytest import ifcopenshell.api.root import ifcopenshell.api.type diff --git a/src/ifcopenshell-python/test/util/test_cost.py b/src/ifcopenshell-python/test/util/test_cost.py new file mode 100644 index 00000000000..516a69edd0d --- /dev/null +++ b/src/ifcopenshell-python/test/util/test_cost.py @@ -0,0 +1,52 @@ +# IfcOpenShell - IFC toolkit and geometry engine +# Copyright (C) 2021 Dion Moult +# +# This file is part of IfcOpenShell. +# +# IfcOpenShell is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# IfcOpenShell is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with IfcOpenShell. If not, see . + +import pytest + +import ifcopenshell.api.control +import ifcopenshell.api.cost +import test.bootstrap +import ifcopenshell.api.root + +import ifcopenshell.util.cost as subject + +class TestGetCostItemForProduct(test.bootstrap.IFC4): + def test_run(self): + model = self.file + element = ifcopenshell.api.root.create_entity(self.file, ifc_class="IfcWall") + cost_schedule = ifcopenshell.api.cost.add_cost_schedule(model) + item1 = ifcopenshell.api.cost.add_cost_item(model, cost_schedule=cost_schedule) + ifcopenshell.api.control.assign_control(model, related_objects=[element], relating_control=item1) + assert list(subject.get_cost_items_for_product(element)) == [item1] + + def test_remove_cost_item(self): + model = self.file + element = ifcopenshell.api.root.create_entity(self.file, ifc_class="IfcWall") + cost_schedule = ifcopenshell.api.cost.add_cost_schedule(model) + item1 = ifcopenshell.api.cost.add_cost_item(model, cost_schedule=cost_schedule) + ifcopenshell.api.control.assign_control(model, related_objects=[element], relating_control=item1) + ifcopenshell.api.cost.remove_cost_item(model, cost_item = item1) + assert list(subject.get_cost_items_for_product(element)) == [] + + def test_no_assigned_cost_items(self): + model = self.file + element = ifcopenshell.api.root.create_entity(self.file, ifc_class="IfcWall") + cost_schedule = ifcopenshell.api.cost.add_cost_schedule(model) + item1 = ifcopenshell.api.cost.add_cost_item(model, cost_schedule=cost_schedule) + assert list(subject.get_cost_items_for_product(element)) == [] + diff --git a/src/ifcopenshell-python/test/util/test_date.py b/src/ifcopenshell-python/test/util/test_date.py index dd47244ba76..9b1713a7726 100644 --- a/src/ifcopenshell-python/test/util/test_date.py +++ b/src/ifcopenshell-python/test/util/test_date.py @@ -16,10 +16,8 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . -import pytest import ifcopenshell.util.date as subject -import test.bootstrap class TestReadableIFCDuration: diff --git a/src/ifcopenshell-python/test/util/test_element.py b/src/ifcopenshell-python/test/util/test_element.py index 1308e957c1c..ffd5789f01a 100644 --- a/src/ifcopenshell-python/test/util/test_element.py +++ b/src/ifcopenshell-python/test/util/test_element.py @@ -38,6 +38,7 @@ import ifcopenshell.api.spatial import ifcopenshell.api.style import ifcopenshell.api.type +import ifcopenshell.api.feature import ifcopenshell.guid import ifcopenshell.util.element as subject import test.bootstrap @@ -306,6 +307,35 @@ def test_getting_complex_properties_from_a_list_of_properties(self): } } + def test_getting_complex_properties_verbose(self): + element = ifcopenshell.api.root.create_entity(self.file, ifc_class="IfcWall") + pset = ifcopenshell.api.pset.add_pset(self.file, product=element, name="pset") + complex_property = self.file.create_entity("IfcComplexProperty", Name="prop", UsageName="usage_name") + ifcopenshell.api.pset.edit_pset(self.file, pset=complex_property, properties={"a": "b"}) + pset.HasProperties = [complex_property] + properties = subject.get_properties(pset.HasProperties, verbose=True) + prop_value = properties["prop"]["value"] + nested_prop = prop_value["properties"]["a"] + assert properties == { + "prop": { + "id": complex_property.id(), + "class": "IfcComplexProperty", + "value": { + "UsageName": "usage_name", + "id": complex_property.id(), + "type": "IfcComplexProperty", + "properties": { + "a": { + "id": nested_prop["id"], + "class": "IfcPropertySingleValue", + "value": "b", + "value_type": "IfcLabel", + } + }, + }, + } + } + class TestGetElementsUsingPset(test.bootstrap.IFC4): def test_run(self): @@ -891,6 +921,35 @@ def test_getting_the_layer_of_a_type_product_representation(self): assert subject.get_layers(self.file, element) == [layer] +class TestGetParentIFC4(test.bootstrap.IFC4): + def test_getting_the_parent_of_an_element(self): + element = ifcopenshell.api.root.create_entity(self.file, ifc_class="IfcWall") + building = ifcopenshell.api.root.create_entity(self.file, ifc_class="IfcBuilding") + ifcopenshell.api.spatial.assign_container(self.file, products=[element], relating_structure=building) + assert subject.get_parent(element) == building + + def test_getting_the_specific_parent_of_an_element(self): + element = ifcopenshell.api.root.create_entity(self.file, ifc_class="IfcWall") + building = ifcopenshell.api.root.create_entity(self.file, ifc_class="IfcBuilding") + storey = ifcopenshell.api.root.create_entity(self.file, ifc_class="IfcBuildingStorey") + ifcopenshell.api.aggregate.assign_object(self.file, products=[storey], relating_object=building) + ifcopenshell.api.spatial.assign_container(self.file, products=[element], relating_structure=storey) + assert subject.get_parent(element, ifc_class="IfcBuilding") == building + assert subject.get_parent(element, ifc_class="IfcSite") == None + + def test_getting_the_specific_parent_of_an_element_via_voiding(self): + wall = ifcopenshell.api.root.create_entity(self.file, ifc_class="IfcWall") + building = ifcopenshell.api.root.create_entity(self.file, ifc_class="IfcBuilding") + ifcopenshell.api.spatial.assign_container(self.file, products=[wall], relating_structure=building) + opening = ifcopenshell.api.root.create_entity(self.file, ifc_class="IfcOpeningElement") + ifcopenshell.api.feature.add_feature(self.file, feature=opening, element=wall) + window = ifcopenshell.api.root.create_entity(self.file, ifc_class="IfcWindow") + ifcopenshell.api.feature.add_filling(self.file, opening=opening, element=window) + assert subject.get_parent(window, ifc_class="IfcWall") == wall + assert subject.get_parent(window, ifc_class="IfcBuilding") == building + assert subject.get_parent(window, ifc_class="IfcSite") == None + + class TestGetContainerIFC4(test.bootstrap.IFC4): def test_getting_the_spatial_container_of_an_element(self): element = ifcopenshell.api.root.create_entity(self.file, ifc_class="IfcWall") diff --git a/src/ifcopenshell-python/test/util/test_file.py b/src/ifcopenshell-python/test/util/test_file.py index b7b34cd0976..18fc8ef07ca 100644 --- a/src/ifcopenshell-python/test/util/test_file.py +++ b/src/ifcopenshell-python/test/util/test_file.py @@ -20,8 +20,6 @@ import zipfile from pathlib import Path -import pytest - import ifcopenshell.util.file as subject import test.bootstrap diff --git a/src/ifcopenshell-python/test/util/test_placement.py b/src/ifcopenshell-python/test/util/test_placement.py index 8a26c52ee5f..bd611db36b4 100644 --- a/src/ifcopenshell-python/test/util/test_placement.py +++ b/src/ifcopenshell-python/test/util/test_placement.py @@ -16,7 +16,6 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . -import ifcopenshell import ifcopenshell.util.placement as subject import test.bootstrap diff --git a/src/ifcopenshell-python/test/util/test_pset.py b/src/ifcopenshell-python/test/util/test_pset.py index ccfbcc4970e..bec1a10ba07 100644 --- a/src/ifcopenshell-python/test/util/test_pset.py +++ b/src/ifcopenshell-python/test/util/test_pset.py @@ -17,7 +17,7 @@ # along with IfcOpenShell. If not, see . """Run this test from src/ifcopenshell-python folder: pytest --durations=0 ifcopenshell/util/test_pset.py""" -from ifcopenshell import util + from ifcopenshell.util import pset from ifcopenshell.util.pset import ApplicableEntity diff --git a/src/ifcopenshell-python/test/util/test_selector.py b/src/ifcopenshell-python/test/util/test_selector.py index e4de6785295..b8302e0f4a2 100644 --- a/src/ifcopenshell-python/test/util/test_selector.py +++ b/src/ifcopenshell-python/test/util/test_selector.py @@ -26,18 +26,16 @@ import ifcopenshell.api.material import ifcopenshell.api.pset import ifcopenshell.api.root -import ifcopenshell.api.sequence import ifcopenshell.api.spatial import ifcopenshell.api.type import ifcopenshell.api.unit import ifcopenshell.util.element import ifcopenshell.util.placement -import ifcopenshell.util.pset import ifcopenshell.util.selector as subject import test.bootstrap -class TestFormat: +class TestFormat(test.bootstrap.IFC4): def test_no_formatting(self): assert subject.format("123") == "123" assert subject.format('"123"') == "123" @@ -56,6 +54,7 @@ def test_string_formatting(self): def test_number_formatting(self): assert subject.format("round(123, 5)") == "125" assert subject.format('round("123", 5)') == "125" + assert subject.format("round(-123, 5)") == "-125" assert subject.format("int(123.123)") == "123" assert subject.format("int(123)") == "123" assert subject.format("number(123)") == "123" @@ -79,6 +78,38 @@ def test_number_formatting(self): assert subject.format('imperial_length(3.0, 4, "foot", "foot", false)') == "3' - 0\"" assert subject.format('imperial_length(3.0, 4, "foot", "foot", False)') == "3' - 0\"" + def test_variable_formatting(self): + assert subject.format("{{undefined}}") is None + assert subject.format("upper({{undefined}})") == "NONE" + assert subject.format("int({{undefined}})") == "0" + element = ifcopenshell.api.root.create_entity(self.file, ifc_class="IfcWall") + assert subject.format("{{undefined}}", element) is None + assert subject.format("{{class}}", element) == "IfcWall" + assert subject.format("{{ class }}", element) == "IfcWall" + assert subject.format("upper({{ class }})", element) == "IFCWALL" + + def test_list_formatting(self): + element = ifcopenshell.api.root.create_entity(self.file, ifc_class="IfcWall") + material = ifcopenshell.api.material.add_material(self.file, name="CON01") + material2 = ifcopenshell.api.material.add_material(self.file, name="CON03") + material3 = ifcopenshell.api.material.add_material(self.file, name="CON02") + material_set = ifcopenshell.api.material.add_material_set(self.file, set_type="IfcMaterialLayerSet") + layer = ifcopenshell.api.material.add_layer(self.file, layer_set=material_set, material=material) + layer = ifcopenshell.api.material.add_layer(self.file, layer_set=material_set, material=material2) + layer = ifcopenshell.api.material.add_layer(self.file, layer_set=material_set, material=material3) + ifcopenshell.api.material.assign_material(self.file, products=[element], material=material_set) + assert subject.format("{{materials.Name}}", element) == "CON01, CON03, CON02" + assert subject.format("sort({{materials.Name}})", element) == "CON01, CON02, CON03" + assert subject.format("reverse({{materials.Name}})", element) == "CON02, CON03, CON01" + assert subject.format('join("-", {{materials.Name}})', element) == "CON01-CON03-CON02" + + def test_expressions(self): + assert subject.format("2+3") == "5" + assert subject.format("-2+3") == "1" + assert subject.format("2-3") == "-1" + assert subject.format("3*2") == "6" + assert subject.format("3/2") == "1.5" + class TestGetElementValue(test.bootstrap.IFC4): def test_selecting_an_elements_class_or_id_using_a_query(self): diff --git a/src/ifcopenshell-python/test/util/test_shape_builder.py b/src/ifcopenshell-python/test/util/test_shape_builder.py index 87499b32887..6a01a742019 100644 --- a/src/ifcopenshell-python/test/util/test_shape_builder.py +++ b/src/ifcopenshell-python/test/util/test_shape_builder.py @@ -22,9 +22,7 @@ import numpy as np import pytest -import ifcopenshell.api import ifcopenshell.geom -import ifcopenshell.util import ifcopenshell.util.shape import test.bootstrap from ifcopenshell.util.shape_builder import ( @@ -43,7 +41,7 @@ class TestMathutilsCompatibleMethods(test.bootstrap.IFC4): def test_np_rotation_matrix(self): - from mathutils import Matrix, Vector # pyright: ignore[reportMissingImports] + from mathutils import Matrix, Vector # pyright: ignore[reportMissingImports] # ty:ignore[unresolved-import] # 2D. assert np.allclose(Matrix.Rotation(radians(45), 2), np_rotation_matrix(radians(45), 2)) @@ -64,7 +62,7 @@ def test_np_rotation_matrix(self): assert np.allclose(Matrix.Rotation(*rotation_vector_args), np_rotation_matrix(*rotation_vector_args)) def test_np_matrix_to_euler(self): - from mathutils import Euler # pyright: ignore[reportMissingImports] + from mathutils import Euler # pyright: ignore[reportMissingImports] # ty:ignore[unresolved-import] # Test 3x3. rot = Euler((0.5, 0.5, 0.5)).to_matrix() @@ -79,7 +77,7 @@ def test_np_matrix_to_euler(self): assert np.allclose(rot.to_euler(), np_matrix_to_euler(V(rot))) def test_np_angle(self): - from mathutils import Vector # pyright: ignore[reportMissingImports] + from mathutils import Vector # pyright: ignore[reportMissingImports] # ty:ignore[unresolved-import] v1, v2 = (1, 0, 0), (0, 1, 0) angle = np_angle(v1, v2) @@ -102,7 +100,7 @@ def test_np_angle(self): assert is_x(angle, radians(90)) def test_np_normal(self): - import mathutils.geometry # pyright: ignore[reportMissingImports] + import mathutils.geometry # pyright: ignore[reportMissingImports] # ty:ignore[unresolved-import] vectors = (0, 0, 0), (1, 0, 0), (0, 1, 0) n = mathutils.geometry.normal(vectors) @@ -115,7 +113,7 @@ def test_np_normal(self): assert np.allclose(n, (0, 0, -1)) def test_np_intersect_line_line(self): - import mathutils.geometry # pyright: ignore[reportMissingImports] + import mathutils.geometry # pyright: ignore[reportMissingImports] # ty:ignore[unresolved-import] p1, p2 = [0, 0, 0], [1, 1, 1] q1, q2 = [0, 1, 0], [1, 0, 1] diff --git a/src/ifcopenshell-python/test/util/test_type.py b/src/ifcopenshell-python/test/util/test_type.py index 54f0e6da168..dfc16e34460 100644 --- a/src/ifcopenshell-python/test/util/test_type.py +++ b/src/ifcopenshell-python/test/util/test_type.py @@ -16,9 +16,7 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . -import pytest -import ifcopenshell.api import ifcopenshell.util.type as subject import test.bootstrap diff --git a/src/ifcopenshell-python/type-check-requirements.txt b/src/ifcopenshell-python/type-check-requirements.txt new file mode 100644 index 00000000000..c797c28034b --- /dev/null +++ b/src/ifcopenshell-python/type-check-requirements.txt @@ -0,0 +1,31 @@ +beautifulsoup4 +cjio >=0.8, <0.10 +deepdiff +docutils +flask +isodate +jinja2 +lark +meshio +mysql-connector-python +networkx +numpy +odfpy +openpyxl +pandas +psutil +pydantic +PyP6Xer +pystache +pytest +python-dateutil +requests +scikit-learn +shapely +tabulate +toposort +typing-extensions +typst +xlsxwriter +xmlschema +xsdata diff --git a/src/ifcparse/IfcHierarchyHelper.h b/src/ifcparse/IfcHierarchyHelper.h index 019cbf69c1a..cfe37b37179 100644 --- a/src/ifcparse/IfcHierarchyHelper.h +++ b/src/ifcparse/IfcHierarchyHelper.h @@ -475,7 +475,7 @@ class IFC_PARSE_API IfcHierarchyHelper : public IfcParse::IfcFile { t->set_attribute_value(1, owner_hist); int relating_index = 4; int related_index = 5; - if (T::Class().name() == "IfcRelContainedInSpatialStructure" || std::is_base_of::value) { + if (T::Class().name() == "IfcRelContainedInSpatialStructure" || T::Class().name() == "IfcRelReferencedInSpatialStructure" || std::is_base_of::value) { // some classes have attributes reversed. std::swap(relating_index, related_index); } diff --git a/src/ifcparse/IfcParse.cpp b/src/ifcparse/IfcParse.cpp index f0f880b7d66..95ab95c0db4 100644 --- a/src/ifcparse/IfcParse.cpp +++ b/src/ifcparse/IfcParse.cpp @@ -746,7 +746,7 @@ namespace { static std::string format_double(const double& d) { std::ostringstream oss; oss.imbue(std::locale::classic()); - oss << std::setprecision(std::numeric_limits::digits10) << d; + oss << std::setprecision(std::numeric_limits::max_digits10) << d; const std::string str = oss.str(); oss.str(""); std::string::size_type e = str.find('e'); diff --git a/src/ifcparse/IfcSchema.h b/src/ifcparse/IfcSchema.h index 3dedd47a8e7..349a81532d0 100644 --- a/src/ifcparse/IfcSchema.h +++ b/src/ifcparse/IfcSchema.h @@ -358,6 +358,7 @@ class IFC_PARSE_API entity : public declaration { const std::vector& subtypes() const { return subtypes_; } const std::vector& attributes() const { return attributes_; } + const std::vector& inverse_attributes() const { return inverse_attributes_; } const std::vector& derived() const { return derived_; } const std::vector all_attributes() const { diff --git a/src/ifcpatch/bootstrap.py b/src/ifcpatch/bootstrap.py index 368d7b5cffe..f703e259697 100644 --- a/src/ifcpatch/bootstrap.py +++ b/src/ifcpatch/bootstrap.py @@ -15,12 +15,3 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcPatch. If not, see . - -import ifcopenshell.util.element -import ifcopenshell.util.schema -import ifcopenshell.util.selector -import ifcpatch.__main__ -import ifcpatch.recipes -import toposort - -import ifcpatch diff --git a/src/ifcpatch/ifcpatch/__init__.py b/src/ifcpatch/ifcpatch/__init__.py index 7ea668d55e3..3b6b8fdf40e 100644 --- a/src/ifcpatch/ifcpatch/__init__.py +++ b/src/ifcpatch/ifcpatch/__init__.py @@ -18,7 +18,6 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcPatch. If not, see . -import collections import importlib import importlib.util import inspect @@ -216,11 +215,11 @@ def _extract_docs(cls: type, method_name: str, boilerplate_args: Union[Sequence[ input_data = inputs[input_name] # E.g. list[str]. - if isinstance(type_hint, typing.GenericAlias): + if isinstance(type_hint, typing.GenericAlias): # pyright: ignore[reportAttributeAccessIssue] input_data["generic_type"] = type_hint.__name__ type_hint = typing.get_args(type_hint)[0] - if isinstance(type_hint, typing._UnionGenericAlias): + if isinstance(type_hint, typing._UnionGenericAlias): # pyright: ignore[reportAttributeAccessIssue] inputs[input_name]["type"] = [t.__name__ for t in typing.get_args(type_hint)] elif type_hint.__name__ == "Literal": inputs[input_name]["type"] = "Literal" diff --git a/src/ifcpatch/ifcpatch/recipes/AGS2IFC.py b/src/ifcpatch/ifcpatch/recipes/AGS2IFC.py index 8067d2e718e..d24aec34e48 100644 --- a/src/ifcpatch/ifcpatch/recipes/AGS2IFC.py +++ b/src/ifcpatch/ifcpatch/recipes/AGS2IFC.py @@ -19,9 +19,7 @@ import csv import os -from itertools import cycle -import ifcopenshell import ifcopenshell.api.aggregate import ifcopenshell.api.context import ifcopenshell.api.document diff --git a/src/ifcpatch/ifcpatch/recipes/AddGeometricRepresentationToAlignment.py b/src/ifcpatch/ifcpatch/recipes/AddGeometricRepresentationToAlignment.py index 65f48f899df..8045490181d 100644 --- a/src/ifcpatch/ifcpatch/recipes/AddGeometricRepresentationToAlignment.py +++ b/src/ifcpatch/ifcpatch/recipes/AddGeometricRepresentationToAlignment.py @@ -16,7 +16,6 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcPatch. If not, see . -import typing from logging import Logger from typing import Union diff --git a/src/ifcpatch/ifcpatch/recipes/AddLinearPlacementFallbackPosition.py b/src/ifcpatch/ifcpatch/recipes/AddLinearPlacementFallbackPosition.py index 9ec3f52a6a6..c659c38c647 100644 --- a/src/ifcpatch/ifcpatch/recipes/AddLinearPlacementFallbackPosition.py +++ b/src/ifcpatch/ifcpatch/recipes/AddLinearPlacementFallbackPosition.py @@ -16,7 +16,6 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcPatch. If not, see . -import typing from logging import Logger from typing import Union diff --git a/src/ifcpatch/ifcpatch/recipes/AddZeroLengthSegmentToAlignment.py b/src/ifcpatch/ifcpatch/recipes/AddZeroLengthSegmentToAlignment.py index e1f6664cd06..d92f7949592 100644 --- a/src/ifcpatch/ifcpatch/recipes/AddZeroLengthSegmentToAlignment.py +++ b/src/ifcpatch/ifcpatch/recipes/AddZeroLengthSegmentToAlignment.py @@ -16,7 +16,6 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcPatch. If not, see . -import typing from logging import Logger from typing import Union diff --git a/src/ifcpatch/ifcpatch/recipes/ConvertLengthUnit.py b/src/ifcpatch/ifcpatch/recipes/ConvertLengthUnit.py index 6b3554b192f..3b5774bfcb4 100644 --- a/src/ifcpatch/ifcpatch/recipes/ConvertLengthUnit.py +++ b/src/ifcpatch/ifcpatch/recipes/ConvertLengthUnit.py @@ -21,10 +21,6 @@ from typing import Union import ifcopenshell -import ifcopenshell.api -import ifcopenshell.api.owner.settings -import ifcopenshell.util.element -import ifcopenshell.util.pset import ifcopenshell.util.unit import ifcpatch diff --git a/src/ifcpatch/ifcpatch/recipes/ConvertNestToAggregate.py b/src/ifcpatch/ifcpatch/recipes/ConvertNestToAggregate.py index 8471ed28f3c..0d10de9bae5 100644 --- a/src/ifcpatch/ifcpatch/recipes/ConvertNestToAggregate.py +++ b/src/ifcpatch/ifcpatch/recipes/ConvertNestToAggregate.py @@ -16,7 +16,6 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcPatch. If not, see . -import ifcopenshell import ifcopenshell.guid diff --git a/src/ifcpatch/ifcpatch/recipes/ConvertPropertiesToQuantities.py b/src/ifcpatch/ifcpatch/recipes/ConvertPropertiesToQuantities.py index a9df2c93c48..3b3b54cac4c 100644 --- a/src/ifcpatch/ifcpatch/recipes/ConvertPropertiesToQuantities.py +++ b/src/ifcpatch/ifcpatch/recipes/ConvertPropertiesToQuantities.py @@ -20,9 +20,7 @@ from typing import Union import ifcopenshell -import ifcopenshell.api import ifcopenshell.api.pset -import ifcopenshell.util.element import ifcopenshell.util.pset diff --git a/src/ifcpatch/ifcpatch/recipes/DowngradeIndexedPolyCurve.py b/src/ifcpatch/ifcpatch/recipes/DowngradeIndexedPolyCurve.py index ea169f2967e..4ae36f26b8a 100644 --- a/src/ifcpatch/ifcpatch/recipes/DowngradeIndexedPolyCurve.py +++ b/src/ifcpatch/ifcpatch/recipes/DowngradeIndexedPolyCurve.py @@ -16,7 +16,6 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcPatch. If not, see . -import ifcopenshell import ifcopenshell.util.element diff --git a/src/ifcpatch/ifcpatch/recipes/ExtractElements.py b/src/ifcpatch/ifcpatch/recipes/ExtractElements.py index 31f1fb4140c..6f88f820be8 100644 --- a/src/ifcpatch/ifcpatch/recipes/ExtractElements.py +++ b/src/ifcpatch/ifcpatch/recipes/ExtractElements.py @@ -20,7 +20,6 @@ from typing import Union import ifcopenshell -import ifcopenshell.api import ifcopenshell.api.project import ifcopenshell.guid import ifcopenshell.util.selector diff --git a/src/ifcpatch/ifcpatch/recipes/ExtractPropertiesToSQLite.py b/src/ifcpatch/ifcpatch/recipes/ExtractPropertiesToSQLite.py index 5df98c4ab46..c91467036f8 100644 --- a/src/ifcpatch/ifcpatch/recipes/ExtractPropertiesToSQLite.py +++ b/src/ifcpatch/ifcpatch/recipes/ExtractPropertiesToSQLite.py @@ -17,26 +17,47 @@ # along with IfcPatch. If not, see . -import json -import os -import re +import logging import tempfile -import time +from typing import NamedTuple -import ifcopenshell import ifcopenshell.util.element +import ifcpatch + try: - import sqlite3 + import sqlite3 # noqa: F401 except: print("No SQLite support") -class Patcher: +class ElementRow(NamedTuple): + element_id: int + guid: str + class_: str + predefined_type: str | None + name: str | None + description: str | None + + +class PropertyRow(NamedTuple): + element_id: int + pset_name: str + name: str + value: str + + +class RelationshipRow(NamedTuple): + element_id: int + rel_ifc_class: str + to_id: int + + +class Patcher(ifcpatch.BasePatcher): def __init__( self, - file, - logger, + file: ifcopenshell.file, + logger: logging.Logger | None = None, ): """Extracts properties and relationships from a IFC-SPF model to SQLite. @@ -50,18 +71,18 @@ def __init__( result = ifcpatch.execute({"input": fn, "file": model, "recipe": "ExtractPropertiesToSQLite"}) ifcpatch.write(result, "output.sqlite") """ - self.file = file - self.logger = logger + super().__init__(file, logger) def patch(self): + import sqlite3 + tmp = tempfile.NamedTemporaryFile(delete=False) db_file = tmp.name self.db = sqlite3.connect(db_file) self.c = self.db.cursor() self.file_patched = db_file - self.c.execute( - """ + self.c.execute(""" CREATE TABLE IF NOT EXISTS elements ( id integer PRIMARY KEY NOT NULL UNIQUE, global_id text, @@ -70,51 +91,47 @@ def patch(self): name text, description text ); - """ - ) + """) self.c.execute("CREATE INDEX IF NOT EXISTS idx_global_id ON elements (global_id);") self.c.execute("CREATE INDEX IF NOT EXISTS idx_ifc_class ON elements (ifc_class);") self.c.execute("CREATE INDEX IF NOT EXISTS idx_predefined_type ON elements (predefined_type);") - self.c.execute( - """ + self.c.execute(""" CREATE TABLE IF NOT EXISTS relationships ( from_id integer NOT NULL, type text, to_id integer NOT NULL ); - """ - ) + """) self.c.execute("CREATE INDEX IF NOT EXISTS idx_from_id ON relationships (from_id);") - self.c.execute( - """ + self.c.execute(""" CREATE TABLE IF NOT EXISTS properties ( element_id integer NOT NULL, set_name text, name text, value text ); - """ - ) + """) self.c.execute("CREATE INDEX IF NOT EXISTS idx_element_id ON properties (element_id);") elements = self.file.by_type("IfcObjectDefinition") - rows = [] - properties = [] - relationships = [] + rows: list[ElementRow] = [] + properties: list[PropertyRow] = [] + relationships: list[RelationshipRow] = [] id_map = {e.id(): i for i, e in enumerate(elements)} + for i, element in enumerate(elements): rows.append( - [ + ElementRow( i, element[0], # IfcRoot.GlobalId element.is_a(), ifcopenshell.util.element.get_predefined_type(element), element[2], # IfcRoot.Name element[3], # IfcRoot.Description - ] + ) ) psets = ifcopenshell.util.element.get_psets(element, should_inherit=False) for pset_name, pset_data in psets.items(): @@ -125,49 +142,55 @@ def patch(self): value = "True" if value else "False" elif not isinstance(value, str): value = str(value) - properties.append([i, pset_name, prop_name, value]) + properties.append(PropertyRow(i, pset_name, prop_name, value)) material = ifcopenshell.util.element.get_material(element, should_skip_usage=True) if material: name = getattr(material, "Name", getattr(material, "LayerSetName", None)) or "Unnamed" - properties.append([i, "IFC Material", "Name", name]) - properties.append([i, "IFC Material", "Class", material.is_a()]) + properties.append(PropertyRow(i, "IFC Material", "Name", name)) + properties.append(PropertyRow(i, "IFC Material", "Class", material.is_a())) if material.is_a("IfcMaterial"): materials = [] elif material.is_a("IfcMaterialLayerSet"): for idx, item in enumerate(material.MaterialLayers or []): material = item.Material - properties.append([i, "IFC Material", f"Layer {idx + 1} Name", getattr(item, "Name", None)]) - properties.append([i, "IFC Material", f"Layer {idx + 1} Material", material.Name]) + properties.append( + PropertyRow(i, "IFC Material", f"Layer {idx + 1} Name", getattr(item, "Name", None)) + ) + properties.append(PropertyRow(i, "IFC Material", f"Layer {idx + 1} Material", material.Name)) if category := getattr(material, "Category", None): - properties.append([i, "IFC Material", f"Layer {idx + 1} Category", category]) + properties.append(PropertyRow(i, "IFC Material", f"Layer {idx + 1} Category", category)) elif material.is_a("IfcMaterialProfileSet"): for idx, item in enumerate(material.MaterialProfiles or []): material = item.Material - properties.append([i, "IFC Material", f"Profile {idx + 1} Name", item.Name]) - properties.append([i, "IFC Material", f"Profile {idx + 1} Material", material.Name]) + properties.append(PropertyRow(i, "IFC Material", f"Profile {idx + 1} Name", item.Name)) + properties.append(PropertyRow(i, "IFC Material", f"Profile {idx + 1} Material", material.Name)) if category := getattr(material, "Category", None): - properties.append([i, "IFC Material", f"Profile {idx + 1} Category", category]) + properties.append(PropertyRow(i, "IFC Material", f"Profile {idx + 1} Category", category)) elif material.is_a("IfcMaterialConstituentSet"): for idx, item in enumerate(material.MaterialConstituents or []): material = item.Material - properties.append([i, "IFC Material", f"Constituent {idx + 1} Name", item.Name]) - properties.append([i, "IFC Material", f"Constituent {idx + 1} Material", material.Name]) + properties.append(PropertyRow(i, "IFC Material", f"Constituent {idx + 1} Name", item.Name)) + properties.append( + PropertyRow(i, "IFC Material", f"Constituent {idx + 1} Material", material.Name) + ) if category := getattr(material, "Category", None): - properties.append([i, "IFC Material", f"Constituent {idx + 1} Category", category]) + properties.append( + PropertyRow(i, "IFC Material", f"Constituent {idx + 1} Category", category) + ) elif material.is_a("IfcMaterialList"): for idx, material in enumerate(material.Materials): - properties.append([i, "IFC Material", f"Material {idx + 1} Name", material.Name]) + properties.append(PropertyRow(i, "IFC Material", f"Material {idx + 1} Name", material.Name)) if category := getattr(material, "Category", None): - properties.append([i, "IFC Material", f"Material {idx + 1} Category", category]) + properties.append(PropertyRow(i, "IFC Material", f"Material {idx + 1} Category", category)) layers = ifcopenshell.util.element.get_layers(self.file, element) for idx, layer in enumerate(layers): - properties.append([i, "IFC Presentation Layer Assignment", f"Layer {idx + 1}", layer.Name]) + properties.append(PropertyRow(i, "IFC Presentation Layer Assignment", f"Layer {idx + 1}", layer.Name)) relating_type = ifcopenshell.util.element.get_type(element) if relating_type and relating_type != element: - relationships.append([i, "IfcRelDefinesByType", id_map[relating_type.id()]]) + relationships.append(RelationshipRow(i, "IfcRelDefinesByType", id_map[relating_type.id()])) self.c.executemany("INSERT INTO elements VALUES (?, ?, ?, ?, ?, ?);", rows) self.c.executemany("INSERT INTO properties VALUES (?, ?, ?, ?);", properties) diff --git a/src/ifcpatch/ifcpatch/recipes/FixArchiCADToRevitDoorSwings.py b/src/ifcpatch/ifcpatch/recipes/FixArchiCADToRevitDoorSwings.py index cf602bab0af..c2523c7e8f9 100644 --- a/src/ifcpatch/ifcpatch/recipes/FixArchiCADToRevitDoorSwings.py +++ b/src/ifcpatch/ifcpatch/recipes/FixArchiCADToRevitDoorSwings.py @@ -18,8 +18,6 @@ import logging -import math -import os from typing import Union import ifcopenshell diff --git a/src/ifcpatch/ifcpatch/recipes/FixArchiCADToRevitSpaces.py b/src/ifcpatch/ifcpatch/recipes/FixArchiCADToRevitSpaces.py index c6ea871c7b8..fac4573a234 100644 --- a/src/ifcpatch/ifcpatch/recipes/FixArchiCADToRevitSpaces.py +++ b/src/ifcpatch/ifcpatch/recipes/FixArchiCADToRevitSpaces.py @@ -18,8 +18,6 @@ import logging -import ifcopenshell - class Patcher: def __init__(self, file: None, logger: logging.Logger, filepath: str): @@ -69,10 +67,9 @@ def __init__(self, file: None, logger: logging.Logger, filepath: str): def patch(self) -> None: import bonsai.tool as tool - import bpy - import ifcopenshell + import bpy # pyright: ignore[reportMissingImports] # ty:ignore[unresolved-import] import ifcopenshell.util.element - from mathutils import Matrix, Vector + from mathutils import Matrix, Vector # pyright: ignore[reportMissingImports] # ty:ignore[unresolved-import] if len(bpy.data.objects) > 0: bpy.data.batch_remove(bpy.data.objects) diff --git a/src/ifcpatch/ifcpatch/recipes/FixRevit2025TINs.py b/src/ifcpatch/ifcpatch/recipes/FixRevit2025TINs.py index d6dc49be182..8cb68c3dfc9 100644 --- a/src/ifcpatch/ifcpatch/recipes/FixRevit2025TINs.py +++ b/src/ifcpatch/ifcpatch/recipes/FixRevit2025TINs.py @@ -16,14 +16,17 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcPatch. If not, see . +from __future__ import annotations import logging -from typing import Optional +from typing import Optional, TYPE_CHECKING + import ifcopenshell -import ifcopenshell.util.schema import ifcopenshell.util.shape_builder -import ifcopenshell.util.unit + +if TYPE_CHECKING: + import bpy # pyright: ignore[reportMissingImports] # ty:ignore[unresolved-import] class Patcher: @@ -111,12 +114,14 @@ def __init__( self.should_create_edges = should_create_edges def patch(self) -> None: - import bmesh + import bmesh # pyright: ignore[reportMissingImports] # ty:ignore[unresolved-import] import bonsai.tool as tool - import bpy - import ifcopenshell.util.shape_builder + import bpy # pyright: ignore[reportMissingImports] # ty:ignore[unresolved-import] + import ifcopenshell.util.schema + import ifcopenshell.util.unit - bpy.context.scene.BIMProjectProperties.should_use_native_meshes = True + props = tool.Project.get_project_props() + props.should_use_native_meshes = True bpy.ops.bim.load_project(filepath=self.filepath) old_history_size = tool.Ifc.get().history_size @@ -127,7 +132,7 @@ def patch(self) -> None: self.unit_scale = ifcopenshell.util.unit.calculate_unit_scale(tool.Ifc.get()) for obj in bpy.data.objects: - if not obj.BIMObjectProperties.ifc_definition_id or not obj.data: + if not tool.Blender.get_ifc_definition_id(obj) or not obj.data: continue if not obj.data.polygons: continue @@ -161,16 +166,14 @@ def patch(self) -> None: self.file = tool.Ifc.get() - def create_edges(self, obj): - import bmesh + def create_edges(self, obj: bpy.types.Object) -> None: + import bmesh # pyright: ignore[reportMissingImports] # ty:ignore[unresolved-import] import bonsai.tool as tool - import bpy + import bpy # pyright: ignore[reportMissingImports] # ty:ignore[unresolved-import] import ifcopenshell.api.geometry import ifcopenshell.api.root - import ifcopenshell.api.spatial - import ifcopenshell.api.type - import ifcopenshell.util.element import ifcopenshell.util.representation + import ifcopenshell.util.schema element = tool.Ifc.get_entity(obj) data = obj.data @@ -228,19 +231,16 @@ def create_edges(self, obj): ifcopenshell.util.schema.reassign_class(tool.Ifc.get(), element2, "IfcVirtualElement") bm.free() - def create_face_sampleable_object(self, obj): + def create_face_sampleable_object(self, obj: bpy.types.Object) -> None: # No sharp faces from math import degrees - import bmesh + import bmesh # pyright: ignore[reportMissingImports] # ty:ignore[unresolved-import] import bonsai.tool as tool - import bpy import ifcopenshell.api.geometry import ifcopenshell.api.root - import ifcopenshell.api.spatial - import ifcopenshell.api.type - import ifcopenshell.util.element import ifcopenshell.util.representation + import ifcopenshell.util.shape_builder print("working on ", obj.name) element = tool.Ifc.get_entity(obj) @@ -278,20 +278,17 @@ def create_face_sampleable_object(self, obj): bm.free() - def create_edge_sampleable_object(self, obj): + def create_edge_sampleable_object(self, obj: bpy.types.Object) -> None: # This is crazy but we need a sharp face per island from math import degrees, radians, sin - import bmesh + import bmesh # pyright: ignore[reportMissingImports] # ty:ignore[unresolved-import] import bonsai.tool as tool - import bpy import ifcopenshell.api.geometry import ifcopenshell.api.root - import ifcopenshell.api.spatial - import ifcopenshell.api.type - import ifcopenshell.util.element import ifcopenshell.util.representation - from mathutils import Matrix + import ifcopenshell.util.shape_builder + from mathutils import Matrix # pyright: ignore[reportMissingImports] # ty:ignore[unresolved-import] # Get the active object (assumed to have a mesh) mesh = obj.data @@ -440,7 +437,6 @@ def get_island(start_face): bm.free() print("Added a triangle to", islands_count, "mesh island(s).") - return def create_curves_from_curve_ifc2x3( self, is_2d: bool = False, curve_object_data=None diff --git a/src/ifcpatch/ifcpatch/recipes/FixRevitClassificationCodeTypes.py b/src/ifcpatch/ifcpatch/recipes/FixRevitClassificationCodeTypes.py index 1ec5b331de6..1ec871160a9 100644 --- a/src/ifcpatch/ifcpatch/recipes/FixRevitClassificationCodeTypes.py +++ b/src/ifcpatch/ifcpatch/recipes/FixRevitClassificationCodeTypes.py @@ -16,7 +16,6 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcPatch. If not, see . -import ifcopenshell import ifcopenshell.util.element diff --git a/src/ifcpatch/ifcpatch/recipes/FixRevitTINs.py b/src/ifcpatch/ifcpatch/recipes/FixRevitTINs.py index 872b1a0091c..cd801d9fe33 100644 --- a/src/ifcpatch/ifcpatch/recipes/FixRevitTINs.py +++ b/src/ifcpatch/ifcpatch/recipes/FixRevitTINs.py @@ -19,8 +19,6 @@ import logging -import ifcopenshell - class Patcher: def __init__(self, file: None, logger: logging.Logger, filepath: str, is_solid: bool = True): @@ -82,9 +80,9 @@ def __init__(self, file: None, logger: logging.Logger, filepath: str, is_solid: def patch(self) -> None: from math import degrees - import bmesh + import bmesh # pyright: ignore[reportMissingImports] # ty:ignore[unresolved-import] import bonsai.tool as tool - import bpy + import bpy # pyright: ignore[reportMissingImports] # ty:ignore[unresolved-import] props = tool.Project.get_project_props() props.should_use_native_meshes = True diff --git a/src/ifcpatch/ifcpatch/recipes/Ifc2Sql.py b/src/ifcpatch/ifcpatch/recipes/Ifc2Sql.py index 74744f34871..d1405e9a334 100644 --- a/src/ifcpatch/ifcpatch/recipes/Ifc2Sql.py +++ b/src/ifcpatch/ifcpatch/recipes/Ifc2Sql.py @@ -21,9 +21,7 @@ import json import logging import multiprocessing -import os import re -import tempfile import time import typing from pathlib import Path @@ -127,7 +125,6 @@ def __init__( ) """ super().__init__(file, logger) - self.logger = logger self.sql_type: Literal["sqlite", "mysql"] = sql_type.lower() self.host = host self.username = username @@ -351,13 +348,11 @@ def check_existing_ifc_database(self) -> None: assert cursor is not None row = cursor.fetchone() elif self.sql_type == "mysql": - cursor = self.c.execute( - f""" + cursor = self.c.execute(f""" SELECT 1 FROM information_schema.tables WHERE table_schema = '{self.database}' AND table_name = 'id_map' LIMIT 1; - """ - ) + """) row = self.c.fetchone() else: assert_never(self.sql_type) diff --git a/src/ifcpatch/ifcpatch/recipes/MergeDuplicateTypes.py b/src/ifcpatch/ifcpatch/recipes/MergeDuplicateTypes.py index 2c8385066b6..8da51a4ac84 100644 --- a/src/ifcpatch/ifcpatch/recipes/MergeDuplicateTypes.py +++ b/src/ifcpatch/ifcpatch/recipes/MergeDuplicateTypes.py @@ -20,7 +20,6 @@ from typing import Any import ifcopenshell -import ifcopenshell.api import ifcopenshell.api.type import ifcopenshell.util.element @@ -98,5 +97,5 @@ def assign_type( relating_type=relating_type, related_objects=related_objects, should_map_representations=False, - should_run_listeners=False, + should_run_listeners=False, # ty:ignore[unknown-argument] ) diff --git a/src/ifcpatch/ifcpatch/recipes/MergeProjects.py b/src/ifcpatch/ifcpatch/recipes/MergeProjects.py index ffb8e2e65ba..9d20164424f 100644 --- a/src/ifcpatch/ifcpatch/recipes/MergeProjects.py +++ b/src/ifcpatch/ifcpatch/recipes/MergeProjects.py @@ -16,20 +16,28 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcPatch. If not, see . +from collections.abc import Sequence from logging import Logger from typing import Union +import ifcpatch import ifcopenshell import ifcopenshell.util.element import ifcopenshell.util.geolocation import ifcopenshell.util.unit import numpy as np +import ifcpatch from ifcpatch.recipes.SetFalseOrigin import Patcher as SetFalseOrigin -class Patcher: - def __init__(self, file: ifcopenshell.file, logger: Logger, filepaths: list[Union[str, ifcopenshell.file]]): +class Patcher(ifcpatch.BasePatcher): + def __init__( + self, + file: ifcopenshell.file, + logger: Logger | None = None, + filepaths: Sequence[Union[str, ifcopenshell.file]] = (), + ): """Merge two or more IFC models into one Note that other than combining the two (or more) IfcProject elements into @@ -50,8 +58,7 @@ def __init__(self, file: ifcopenshell.file, logger: Logger, filepaths: list[Unio ifcpatch.execute({"input": "input.ifc", "file": model, "recipe": "MergeProjects", "arguments": ["/path/to/model2.ifc"]}) """ - self.file = file - self.logger = logger + super().__init__(file, logger) self.filepaths = filepaths def patch(self): @@ -61,6 +68,8 @@ def patch(self): "replace it with a list of file/filepaths." ) self.filepaths = [self.filepaths] + if len(self.filepaths) == 0: + raise ValueError("At least one file/filepath must be provided to merge with the main model.") for filepath in self.filepaths: if isinstance(filepath, ifcopenshell.file): other = filepath diff --git a/src/ifcpatch/ifcpatch/recipes/Migrate.py b/src/ifcpatch/ifcpatch/recipes/Migrate.py index 6b5c18ff116..627342f096d 100644 --- a/src/ifcpatch/ifcpatch/recipes/Migrate.py +++ b/src/ifcpatch/ifcpatch/recipes/Migrate.py @@ -16,7 +16,6 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcPatch. If not, see . -import typing from logging import Logger from typing import Union diff --git a/src/ifcpatch/ifcpatch/recipes/OffsetObjectPlacements.py b/src/ifcpatch/ifcpatch/recipes/OffsetObjectPlacements.py index a575fc4eac7..7b8f1224822 100644 --- a/src/ifcpatch/ifcpatch/recipes/OffsetObjectPlacements.py +++ b/src/ifcpatch/ifcpatch/recipes/OffsetObjectPlacements.py @@ -19,7 +19,6 @@ import math import typing -import ifcopenshell import ifcopenshell.util.placement import numpy as np from ifcopenshell.util.shape_builder import ShapeBuilder diff --git a/src/ifcpatch/ifcpatch/recipes/Optimise.py b/src/ifcpatch/ifcpatch/recipes/Optimise.py index 79699ae2e60..b0043a7299d 100644 --- a/src/ifcpatch/ifcpatch/recipes/Optimise.py +++ b/src/ifcpatch/ifcpatch/recipes/Optimise.py @@ -17,7 +17,6 @@ # along with IfcPatch. If not, see . import ifcopenshell -import ifcopenshell.util.element class Patcher: diff --git a/src/ifcpatch/ifcpatch/recipes/PatchStationReferentPosition.py b/src/ifcpatch/ifcpatch/recipes/PatchStationReferentPosition.py index cd3a4fb5234..9af1afc9503 100644 --- a/src/ifcpatch/ifcpatch/recipes/PatchStationReferentPosition.py +++ b/src/ifcpatch/ifcpatch/recipes/PatchStationReferentPosition.py @@ -1,4 +1,3 @@ -import typing from logging import Logger from typing import Union diff --git a/src/ifcpatch/ifcpatch/recipes/PurgeData.py b/src/ifcpatch/ifcpatch/recipes/PurgeData.py index 3c34927a636..0ea968f48ab 100644 --- a/src/ifcpatch/ifcpatch/recipes/PurgeData.py +++ b/src/ifcpatch/ifcpatch/recipes/PurgeData.py @@ -57,13 +57,7 @@ def __init__(self, file: ifcopenshell.file, logger: Logger): def patch(self): self.file.header.file_name.name = "Rabbit" - self.file.header.file_name.time_stamp = ( - datetime.datetime.utcnow() - .replace(tzinfo=datetime.timezone.utc) - .astimezone() - .replace(microsecond=0) - .isoformat() - ) + self.file.header.file_name.time_stamp = datetime.datetime.now().astimezone().replace(microsecond=0).isoformat() self.file.header.file_name.preprocessor_version = "Rabbit" self.file.header.file_name.originating_system = "Rabbit" diff --git a/src/ifcpatch/ifcpatch/recipes/ResetAbsoluteCoordinates.py b/src/ifcpatch/ifcpatch/recipes/ResetAbsoluteCoordinates.py index 641ba928b15..1414464fcd2 100644 --- a/src/ifcpatch/ifcpatch/recipes/ResetAbsoluteCoordinates.py +++ b/src/ifcpatch/ifcpatch/recipes/ResetAbsoluteCoordinates.py @@ -17,7 +17,7 @@ # along with IfcPatch. If not, see . import logging -from typing import Literal, Optional, Union +from typing import Literal, Union import ifcopenshell import numpy as np diff --git a/src/ifcpatch/ifcpatch/recipes/ResetSpatialElementLocations.py b/src/ifcpatch/ifcpatch/recipes/ResetSpatialElementLocations.py index 0f7c3933b42..9bd751e7632 100644 --- a/src/ifcpatch/ifcpatch/recipes/ResetSpatialElementLocations.py +++ b/src/ifcpatch/ifcpatch/recipes/ResetSpatialElementLocations.py @@ -19,9 +19,7 @@ import logging import ifcopenshell -import ifcopenshell.api import ifcopenshell.api.geometry -import ifcopenshell.util import ifcopenshell.util.element import ifcopenshell.util.placement import numpy as np diff --git a/src/ifcpatch/ifcpatch/recipes/SetFalseOrigin.py b/src/ifcpatch/ifcpatch/recipes/SetFalseOrigin.py index 72218e5ecf0..bd8706f9e10 100644 --- a/src/ifcpatch/ifcpatch/recipes/SetFalseOrigin.py +++ b/src/ifcpatch/ifcpatch/recipes/SetFalseOrigin.py @@ -18,7 +18,6 @@ import typing -import ifcopenshell import ifcopenshell.api.georeference import ifcopenshell.util.geolocation diff --git a/src/ifcpatch/ifcpatch/recipes/TessellateElements.py b/src/ifcpatch/ifcpatch/recipes/TessellateElements.py index 14ee80aec27..75dc5578d82 100644 --- a/src/ifcpatch/ifcpatch/recipes/TessellateElements.py +++ b/src/ifcpatch/ifcpatch/recipes/TessellateElements.py @@ -21,7 +21,6 @@ from typing import Union import ifcopenshell -import ifcopenshell.api import ifcopenshell.api.geometry import ifcopenshell.geom import ifcopenshell.util.representation diff --git a/src/ifcpatch/ifcpatch/recipes/UnsharePsets.py b/src/ifcpatch/ifcpatch/recipes/UnsharePsets.py index e7a1ad9eb1c..67dc3da6468 100644 --- a/src/ifcpatch/ifcpatch/recipes/UnsharePsets.py +++ b/src/ifcpatch/ifcpatch/recipes/UnsharePsets.py @@ -20,7 +20,6 @@ import ifcopenshell import ifcopenshell.api.pset -import ifcopenshell.guid import ifcopenshell.util.element import ifcopenshell.util.selector diff --git a/src/ifcpatch/pyproject.toml b/src/ifcpatch/pyproject.toml index 72ec9ca3f09..22cf2ec3c59 100644 --- a/src/ifcpatch/pyproject.toml +++ b/src/ifcpatch/pyproject.toml @@ -31,3 +31,11 @@ Issues = "https://github.com/IfcOpenShell/IfcOpenShell/issues" [tool.setuptools.packages.find] include = ["ifcpatch*"] exclude = ["test*"] + +[tool.ruff] +extend = "../../pyproject.toml" + +[tool.ruff.lint] +select = [ + "F401", # unused imports +] diff --git a/src/ifcpatch/test/test_ConvertLengthUnit.py b/src/ifcpatch/test/test_ConvertLengthUnit.py index a4f586512f2..6fdf2668ec8 100644 --- a/src/ifcpatch/test/test_ConvertLengthUnit.py +++ b/src/ifcpatch/test/test_ConvertLengthUnit.py @@ -16,7 +16,6 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . -import ifcopenshell.api import ifcopenshell.api.root import ifcopenshell.api.unit import ifcopenshell.util.unit diff --git a/src/ifcpatch/test/test_ExtractElements.py b/src/ifcpatch/test/test_ExtractElements.py index fe2e9350dd1..8d7d4021c62 100644 --- a/src/ifcpatch/test/test_ExtractElements.py +++ b/src/ifcpatch/test/test_ExtractElements.py @@ -19,7 +19,6 @@ import os import ifcopenshell -import ifcopenshell.api import ifcopenshell.api.aggregate import ifcopenshell.api.root import ifcopenshell.api.spatial diff --git a/src/ifcpatch/test/test_Ifc2Sql.py b/src/ifcpatch/test/test_Ifc2Sql.py index 79257a69c31..49e38c08fef 100644 --- a/src/ifcpatch/test/test_Ifc2Sql.py +++ b/src/ifcpatch/test/test_Ifc2Sql.py @@ -20,15 +20,6 @@ from pathlib import Path import ifcopenshell -import ifcopenshell.api.context -import ifcopenshell.api.geometry -import ifcopenshell.api.georeference -import ifcopenshell.geom -import ifcopenshell.util.geolocation -import ifcopenshell.util.placement -import ifcopenshell.util.representation -import ifcopenshell.util.shape -import ifcopenshell.util.shape_builder import ifcpatch diff --git a/src/ifcpatch/test/test_MergeDuplicateTypes.py b/src/ifcpatch/test/test_MergeDuplicateTypes.py index 439f7a0c065..565a62517b5 100644 --- a/src/ifcpatch/test/test_MergeDuplicateTypes.py +++ b/src/ifcpatch/test/test_MergeDuplicateTypes.py @@ -16,17 +16,13 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . -import os -import ifcopenshell -import ifcopenshell.api import ifcopenshell.api.geometry import ifcopenshell.api.material import ifcopenshell.api.root import ifcopenshell.api.type import ifcopenshell.util.element import ifcopenshell.util.representation -import pytest import ifcpatch import test.bootstrap diff --git a/src/ifcpatch/test/test_Migrate.py b/src/ifcpatch/test/test_Migrate.py index 319e01d91b9..85e60ff09fe 100644 --- a/src/ifcpatch/test/test_Migrate.py +++ b/src/ifcpatch/test/test_Migrate.py @@ -16,7 +16,6 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . -import ifcopenshell import ifcpatch import test.bootstrap diff --git a/src/ifcpatch/test/test_RegenerateGlobalIds.py b/src/ifcpatch/test/test_RegenerateGlobalIds.py index e51e4c7a9cb..4858b6a7b02 100644 --- a/src/ifcpatch/test/test_RegenerateGlobalIds.py +++ b/src/ifcpatch/test/test_RegenerateGlobalIds.py @@ -16,13 +16,8 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . -import os -import ifcopenshell -import ifcopenshell.api import ifcopenshell.api.root -import ifcopenshell.util.element -import pytest import ifcpatch import test.bootstrap diff --git a/src/ifcpatch/test/test_ResetSpatialElementLocations.py b/src/ifcpatch/test/test_ResetSpatialElementLocations.py index 5d446c91288..d0dc385015f 100644 --- a/src/ifcpatch/test/test_ResetSpatialElementLocations.py +++ b/src/ifcpatch/test/test_ResetSpatialElementLocations.py @@ -16,7 +16,6 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . -import ifcopenshell.api import ifcopenshell.api.aggregate import ifcopenshell.api.geometry import ifcopenshell.api.root diff --git a/src/ifcpatch/test/test_SetFalseOrigin.py b/src/ifcpatch/test/test_SetFalseOrigin.py index 1357ec39b04..e15e8684fb7 100644 --- a/src/ifcpatch/test/test_SetFalseOrigin.py +++ b/src/ifcpatch/test/test_SetFalseOrigin.py @@ -16,7 +16,6 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . -import ifcopenshell.api import ifcopenshell.api.aggregate import ifcopenshell.api.context import ifcopenshell.api.geometry diff --git a/src/ifcpatch/test/test_TesselateElements.py b/src/ifcpatch/test/test_TesselateElements.py index 7acdc899a73..9e15c35f72c 100644 --- a/src/ifcpatch/test/test_TesselateElements.py +++ b/src/ifcpatch/test/test_TesselateElements.py @@ -16,14 +16,10 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . -import ifcopenshell import ifcopenshell.api.context import ifcopenshell.api.geometry -import ifcopenshell.api.profile import ifcopenshell.api.root import ifcopenshell.api.unit -import ifcopenshell.geom -import ifcopenshell.util.element import ifcopenshell.util.representation from ifcopenshell.util.shape_builder import ShapeBuilder diff --git a/src/ifcpatch/test/test_UnsharePsets.py b/src/ifcpatch/test/test_UnsharePsets.py index fc40bdb74d0..ae09ed879b3 100644 --- a/src/ifcpatch/test/test_UnsharePsets.py +++ b/src/ifcpatch/test/test_UnsharePsets.py @@ -18,7 +18,6 @@ import ifcopenshell import ifcopenshell.api.pset -import ifcopenshell.geom import ifcopenshell.util.element import ifcpatch diff --git a/src/ifcpatch/test/test_ifcpatch.py b/src/ifcpatch/test/test_ifcpatch.py index 4d7e98e55a8..d0976965b64 100644 --- a/src/ifcpatch/test/test_ifcpatch.py +++ b/src/ifcpatch/test/test_ifcpatch.py @@ -52,10 +52,10 @@ def test_static_ifcpatch_execution(self): assert output.by_type("IfcProject")[0].GlobalId == project.GlobalId assert output.by_type("IfcWall")[0].GlobalId == wall.GlobalId - output_path = Path(tempfile.mktemp()) + output_path = Path(tempfile.mkstemp()[1]) try: - assert not output_path.exists() + assert output_path.stat().st_size == 0 ifcpatch.write(patcher.get_output(), output_path) - assert output_path.exists() + assert output_path.stat().st_size != 0 finally: output_path.unlink() diff --git a/src/ifcquery/Makefile b/src/ifcquery/Makefile new file mode 100644 index 00000000000..f77132db5e7 --- /dev/null +++ b/src/ifcquery/Makefile @@ -0,0 +1,10 @@ +PACKAGE_NAME:=ifcquery +include ../common.mk + +.PHONY: test +test: + pytest tests + +.PHONY: qa +qa: + black . diff --git a/src/ifcquery/README.md b/src/ifcquery/README.md new file mode 100644 index 00000000000..5cb895dc44b --- /dev/null +++ b/src/ifcquery/README.md @@ -0,0 +1,500 @@ + +# ifcquery + +A CLI tool for querying and inspecting IFC building models. All output is +structured JSON (or human-readable text), making it easy to pipe into other +tools or scripts. + +## Installation + +```bash +pip install ifcquery +``` + +Requires `ifcopenshell`. The `clash` subcommand additionally requires the +IfcOpenShell C++ geometry bindings (`ifcopenshell.geom`). + +## Usage + +``` +ifcquery [options] [--format json|text|ids] +``` + +The `--format` flag controls output: + +- `json` (default) -- structured JSON, suitable for piping to `jq` or `ifcedit foreach` +- `text` -- indented human-readable output +- `ids` -- comma-separated step IDs extracted from list results, suitable for piping directly into `ifcedit run` parameters + +## Subcommands + +### summary + +Get a model overview: schema version, entity counts, and project info. + +```bash +ifcquery model.ifc summary +``` + +```json +{ + "schema": "IFC4", + "total_entities": 1847, + "project": { + "id": 1, + "name": "Office Building", + "description": null + }, + "types": { + "IfcWall": 42, + "IfcSlab": 12, + "IfcWindow": 36 + } +} +``` + +### tree + +Display the spatial hierarchy from IfcProject down through sites, buildings, +storeys, and their contained elements. + +```bash +ifcquery model.ifc tree +``` + +```json +{ + "id": 1, + "type": "IfcProject", + "name": "Office Building", + "children": [ + { + "id": 2, + "type": "IfcSite", + "name": "Default Site", + "children": [ + { + "id": 3, + "type": "IfcBuilding", + "name": "Main Building", + "children": [ + { + "id": 4, + "type": "IfcBuildingStorey", + "name": "Ground Floor", + "elements": [ + {"id": 10, "type": "IfcWall", "name": "Wall001"}, + {"id": 11, "type": "IfcSlab", "name": "Floor001"} + ] + } + ] + } + ] + } + ] +} +``` + +### info + +Get detailed information about a specific element by step ID. + +```bash +ifcquery model.ifc info 10 +ifcquery model.ifc info '#10' +``` + +Returns attributes, property sets, type relationship, material assignment, +spatial container, and placement matrix. + +```json +{ + "id": 10, + "type": "IfcWall", + "attributes": { + "Name": "Wall001", + "Description": null, + "ObjectType": "LOADBEARING" + }, + "property_sets": { + "Pset_WallCommon": { + "IsExternal": true, + "FireRating": "2HR" + } + }, + "element_type": {"id": 50, "type": "IfcWallType", "name": "Standard"}, + "material": {"id": 60, "type": "IfcMaterial", "name": "Concrete"}, + "container": {"id": 4, "type": "IfcBuildingStorey", "name": "Ground Floor"}, + "placement": [ + [1.0, 0.0, 0.0, 5.0], + [0.0, 1.0, 0.0, 0.0], + [0.0, 0.0, 1.0, 0.0], + [0.0, 0.0, 0.0, 1.0] + ] +} +``` + +### select + +Filter elements using the ifcopenshell selector syntax. + +```bash +ifcquery model.ifc select 'IfcWall' +ifcquery model.ifc select 'IfcWall, IfcSlab' +``` + +```json +[ + {"id": 10, "type": "IfcWall", "name": "Wall001"}, + {"id": 11, "type": "IfcWall", "name": "Wall002"}, + {"id": 20, "type": "IfcSlab", "name": "Floor001"} +] +``` + +Results are sorted by ID. + +Use `--format ids` to get a comma-separated list of step IDs for direct use +in `ifcedit run` parameters: + +```bash +ifcedit run model.ifc type.assign_type \ + --related_objects "$(ifcquery model.ifc --format ids select 'IfcWall')" \ + --relating_type 456 +``` + +### relations + +Show all relationships for an element, organized by category: hierarchy, +children, type relationships, groups, systems, material, and connections. + +```bash +ifcquery model.ifc relations 10 +``` + +```json +{ + "id": 10, + "type": "IfcWall", + "name": "Wall001", + "hierarchy": { + "parent": {"id": 4, "type": "IfcBuildingStorey", "name": "Ground Floor"}, + "container": {"id": 4, "type": "IfcBuildingStorey", "name": "Ground Floor"} + }, + "children": { + "openings": [{"id": 30, "type": "IfcOpeningElement", "name": "Opening01"}] + }, + "type_relationship": { + "type_of": {"id": 50, "type": "IfcWallType", "name": "Standard"} + }, + "material": {"id": 60, "type": "IfcMaterial", "name": "Concrete"} +} +``` + +Empty categories are omitted from output. + +Use `--traverse up` to walk the spatial hierarchy from the element up to +IfcProject: + +```bash +ifcquery model.ifc relations 10 --traverse up +``` + +```json +[ + {"id": 10, "type": "IfcWall", "name": "Wall001"}, + {"id": 4, "type": "IfcBuildingStorey", "name": "Ground Floor"}, + {"id": 3, "type": "IfcBuilding", "name": "Main Building"}, + {"id": 2, "type": "IfcSite", "name": "Default Site"}, + {"id": 1, "type": "IfcProject", "name": "Office Building"} +] +``` + +### validate + +Check the model for schema and constraint violations. + +```bash +ifcquery model.ifc validate +ifcquery model.ifc validate --rules +``` + +Options: + +- `--rules` -- also run the slower EXPRESS rules check (default: off) + +```json +{ + "valid": true, + "issues": [] +} +``` + +On an invalid model: + +```json +{ + "valid": false, + "issues": [ + {"level": "ERROR", "message": "Entity #42 IfcWall.GlobalId is not a valid IfcGloballyUniqueId"} + ] +} +``` + +### schedule + +List all work schedules and their task trees from the model. + +```bash +ifcquery model.ifc schedule +ifcquery model.ifc schedule --depth 1 +``` + +Options: + +- `--depth N` -- expand at most N levels of subtasks (default: unlimited). At the + cutoff, `subtasks` is replaced with `{"truncated": true, "count": N}`. + +```json +[ + { + "id": 42, + "name": "Construction Schedule", + "predefined_type": "BASELINE", + "tasks": [ + { + "id": 55, + "name": "Phase 1", + "start": "2024-01-01T09:00:00", + "finish": "2024-06-30T17:00:00", + "is_milestone": false, + "outputs": [{"id": 10, "type": "IfcWall", "name": "Wall A"}], + "subtasks": [ + {"id": 56, "name": "Foundations", "start": null, "finish": null, + "is_milestone": false, "outputs": [], "subtasks": []} + ] + } + ] + } +] +``` + +### cost + +List all cost schedules and their cost item trees from the model. + +```bash +ifcquery model.ifc cost +ifcquery model.ifc cost --depth 2 +``` + +Options: + +- `--depth N` -- expand at most N levels of subitems (default: unlimited). At the + cutoff, `subitems` is replaced with `{"truncated": true, "count": N}`. + +```json +[ + { + "id": 100, + "name": "Bill of Quantities", + "predefined_type": "COSTPLAN", + "items": [ + { + "id": 110, + "name": "Concrete Works", + "values": [{"formula": "1200.00 = material(1200.0)", "category": "material"}], + "subitems": [ + {"id": 111, "name": "Formwork", "values": [], "subitems": []} + ] + } + ] + } +] +``` + +### schema + +Show IFC class documentation for any entity type, using the schema version of +the loaded model. + +```bash +ifcquery model.ifc schema IfcWall +ifcquery model.ifc schema IfcBuildingStorey +``` + +```json +{ + "description": "The wall represents a vertical construction ...", + "predefined_types": {"STANDARD": "A standard wall, extruded vertically ..."}, + "spec_url": "https://standards.buildingsmart.org/...", + "attributes": { + "Name": "Optional name for use by the participating software systems", + "ObjectPlacement": "Placement of the product in space ..." + } +} +``` + +Returns `{"error": "Unknown entity: Foo"}` for unrecognised types. + +### contexts + +List all geometric representation contexts and subcontexts in the model. + +```bash +ifcquery model.ifc contexts +``` + +```json +[ + { + "id": 5, + "type": "IfcGeometricRepresentationContext", + "context_type": "Model", + "subcontexts": [ + {"id": 6, "type": "IfcGeometricRepresentationSubContext", "context_identifier": "Body", "target_view": "MODEL_VIEW"}, + {"id": 7, "type": "IfcGeometricRepresentationSubContext", "context_identifier": "Axis", "target_view": "GRAPH_VIEW"} + ] + } +] +``` + +### materials + +List all materials and material sets used in the model, with their assigned elements. + +```bash +ifcquery model.ifc materials +``` + +```json +[ + { + "id": 60, + "type": "IfcMaterial", + "name": "Concrete", + "elements": [{"id": 10, "type": "IfcWall", "name": "Wall001"}] + } +] +``` + +### plot + +Generate a 2D technical drawing (floor plan, elevation, or section) of the model and write it to a file. + +```bash +ifcquery model.ifc plot -o output.svg --out-format svg +ifcquery model.ifc plot -o output.png --view floorplan --scale 0.01 +``` + +Options: + +- `-o, --output ` -- output file path (default: `.svg` or `.png`) +- `--out-format {svg,png,base64}` -- output format (default: `png`) +- `--view {floorplan,elevation,section,auto}` -- drawing view (default: `floorplan`) +- `--scale ` -- model-to-paper scale ratio (default: 0.01 = 1:100) +- `--width-mm ` -- paper width in mm (default: 297) +- `--height-mm ` -- paper height in mm (default: 420) +- `--png-width ` -- raster output width in pixels (default: 1024) +- `--png-height ` -- raster output height in pixels (default: 1024) + +Requires the IfcOpenShell drawing module (`ifcopenshell.draw`). PNG output additionally requires `cairosvg`. + +### render + +Render a 3D view of the model geometry to a PNG file. + +```bash +ifcquery model.ifc render -o output.png +ifcquery model.ifc render -o output.png --view iso --selector IfcWall +``` + +Options: + +- `--view {iso,top,south,north,east,west}` -- camera angle (default: `iso`) +- `--selector ` -- ifcopenshell selector to restrict rendered elements + +Requires `pyvista` and the IfcOpenShell C++ geometry bindings. + +### clash + +Check a single element for geometric intersections and clearance violations +against other elements. + +```bash +ifcquery model.ifc clash 10 +ifcquery model.ifc clash 10 --clearance 0.5 +ifcquery model.ifc clash 10 --scope all --tolerance 0.001 +``` + +Options: + +- `--clearance ` -- minimum clearance distance to check +- `--tolerance ` -- intersection tolerance (default: 0.002) +- `--scope {storey,all}` -- check against same-storey elements or all elements (default: storey) + +```json +{ + "element": {"id": 10, "type": "IfcWall", "name": "Wall001"}, + "scope": "storey", + "pass": false, + "checks": { + "intersection": { + "pass": false, + "tolerance": 0.002, + "clashes": [ + { + "element": {"id": 11, "type": "IfcWall", "name": "Wall002"}, + "type": "intersection", + "distance": 0.0, + "p1": [2.5, 2.5, 1.5], + "p2": [2.5, 2.5, 1.5] + } + ] + }, + "clearance": { + "pass": true, + "clearance": 0.5, + "clashes": [] + } + } +} +``` + +Requires the IfcOpenShell C++ geometry bindings. + +## Scripting with ifcedit + +`ifcquery` and `ifcedit` are designed to compose. Use `--format ids` to pass +query results directly into `ifcedit run` parameters, or pipe JSON into +`ifcedit foreach` to apply an operation to every matching element. + +```bash +# Remove all walls from their spatial container +ifcedit run model.ifc spatial.unassign_container \ + --products "$(ifcquery model.ifc --format ids select 'IfcWall')" + +# Delete every window (model opened and saved once) +ifcquery model.ifc select 'IfcWindow' | ifcedit foreach model.ifc root.remove_product --product {id} + +# Bulk rename all doors +ifcquery model.ifc select 'IfcDoor' | ifcedit foreach model.ifc attribute.edit_attributes \ + --product {id} --attributes '{"Name": "Door"}' + +# Render an element highlighted against everything related to it +ifcquery model.ifc render relations.png \ + --element "$(ifcquery model.ifc --format ids relations 42)" + +# Render a clash — subject and clashing elements highlighted together +ifcquery model.ifc render clash.png \ + --element "$(ifcquery model.ifc --format ids clash 42)" +``` + +See the `ifcedit` documentation for the full `foreach` reference. + +## Error handling + +Errors are written to stderr. Exit code is 0 on success, 1 on error. + +## License + +LGPLv3+ -- see the IfcOpenShell project license. diff --git a/src/ifcquery/ifcquery/__init__.py b/src/ifcquery/ifcquery/__init__.py new file mode 100644 index 00000000000..be5327b20d7 --- /dev/null +++ b/src/ifcquery/ifcquery/__init__.py @@ -0,0 +1,20 @@ +# This file was generated with the assistance of an AI coding tool. +# IfcQuery - IFC model interrogation CLI +# Copyright (C) 2026 Bruno Postle +# +# This file is part of IfcQuery. +# +# IfcQuery is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# IfcQuery is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with IfcQuery. If not, see . + +__version__ = version = "0.0.0" diff --git a/src/ifcquery/ifcquery/__main__.py b/src/ifcquery/ifcquery/__main__.py new file mode 100644 index 00000000000..d4b6141fd91 --- /dev/null +++ b/src/ifcquery/ifcquery/__main__.py @@ -0,0 +1,397 @@ +# This file was generated with the assistance of an AI coding tool. +# IfcQuery - IFC model interrogation CLI +# Copyright (C) 2026 Bruno Postle +# +# This file is part of IfcQuery. +# +# IfcQuery is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# IfcQuery is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with IfcQuery. If not, see . + +from __future__ import annotations + +import argparse +import json +import os +import sys + +import ifcopenshell + +from ifcquery import clash as clash_mod +from ifcquery import contexts as contexts_mod +from ifcquery import cost as cost_mod +from ifcquery import ( + info, + plot, + relations, + schedule, + schema, + select, + summary, + tree, +) +from ifcquery import ( + materials as materials_mod, +) +from ifcquery import ( + render as render_mod, +) +from ifcquery import validate as validate_mod + + +def parse_element_id(raw: str) -> int: + """Parse an element ID from '#123' or '123' format.""" + raw = raw.strip().lstrip("#") + return int(raw) + + +def format_output(data, fmt: str) -> str: + if fmt == "json": + return json.dumps(data, indent=2, ensure_ascii=False) + elif fmt == "text": + return _format_text(data) + elif fmt == "ids": + return _format_ids(data) + return json.dumps(data, indent=2, ensure_ascii=False) + + +def _format_ids(data) -> str: + """Extract 'id' fields from a list of dicts and return as comma-separated string. + + For dicts with a top-level 'elements' key (e.g. clash, relations output), + extracts from that flat summary list rather than the nested structure. + """ + if isinstance(data, list): + ids = [str(item["id"]) for item in data if isinstance(item, dict) and "id" in item] + return ",".join(ids) + if isinstance(data, dict): + if "elements" in data and isinstance(data["elements"], list): + return _format_ids(data["elements"]) + if "id" in data: + return str(data["id"]) + return "" + + +def _format_text(data, indent: int = 0) -> str: + prefix = " " * indent + lines = [] + if isinstance(data, dict): + for key, value in data.items(): + if isinstance(value, (dict, list)): + lines.append(f"{prefix}{key}:") + lines.append(_format_text(value, indent + 1)) + else: + lines.append(f"{prefix}{key}: {value}") + elif isinstance(data, list): + for item in data: + if isinstance(item, dict): + lines.append(_format_text(item, indent)) + lines.append("") + else: + lines.append(f"{prefix}- {item}") + else: + lines.append(f"{prefix}{data}") + return "\n".join(lines) + + +def main(): + parser = argparse.ArgumentParser( + prog="ifcquery", + description="Query and inspect IFC building models", + ) + parser.add_argument("ifc_file", help="Path to the IFC file") + parser.add_argument( + "--format", + choices=["json", "text", "ids"], + default="json", + dest="output_format", + help="Output format: json (default), text (human-readable), ids (comma-separated step IDs)", + ) + + subparsers = parser.add_subparsers(dest="command", required=True) + + subparsers.add_parser("summary", help="Model overview: schema, element counts, project info") + + subparsers.add_parser("tree", help="Spatial hierarchy tree") + + info_parser = subparsers.add_parser("info", help="Deep inspection of a specific element") + info_parser.add_argument("element_id", help="Element step ID (e.g. 123 or #123)") + + select_parser = subparsers.add_parser("select", help="Filter elements using selector syntax") + select_parser.add_argument("query", help="Selector query string") + + relations_parser = subparsers.add_parser("relations", help="Show relationships for an element") + relations_parser.add_argument("element_id", help="Element step ID (e.g. 123 or #123)") + relations_parser.add_argument("--traverse", choices=["up"], help="Traverse hierarchy (up: walk to IfcProject)") + + clash_parser = subparsers.add_parser("clash", help="Check element placement for clashes") + clash_parser.add_argument("element_id", help="Element step ID (e.g. 123 or #123)") + clash_parser.add_argument("--clearance", type=float, help="Minimum clearance distance") + clash_parser.add_argument("--tolerance", type=float, default=0.002, help="Intersection tolerance (default: 0.002)") + clash_parser.add_argument( + "--scope", choices=["storey", "all"], default="storey", help="Scope of elements to check (default: storey)" + ) + + validate_parser = subparsers.add_parser("validate", help="Schema/constraint validation") + validate_parser.add_argument( + "--rules", action="store_true", help="Also check EXPRESS rules (slower, default: false)" + ) + + schedule_parser = subparsers.add_parser("schedule", help="List work plans and tasks from the model") + schedule_parser.add_argument( + "--depth", type=int, default=None, metavar="N", help="Limit subtask expansion to N levels (default: unlimited)" + ) + + cost_parser = subparsers.add_parser("cost", help="List cost schedules and cost items from the model") + cost_parser.add_argument( + "--depth", + type=int, + default=None, + metavar="N", + help="Limit cost item expansion to N levels (default: unlimited)", + ) + + subparsers.add_parser("contexts", help="List geometric representation contexts and subcontexts") + + subparsers.add_parser("materials", help="List materials and material sets") + + schema_parser = subparsers.add_parser("schema", help="IFC class documentation") + schema_parser.add_argument("entity_type", help="IFC entity type (e.g. IfcWall)") + + render_parser = subparsers.add_parser("render", help="Render model geometry to a PNG image") + render_parser.add_argument( + "-o", "--output", default="", metavar="FILE", help="Output PNG path (default: .png)" + ) + render_parser.add_argument( + "--selector", default="", metavar="QUERY", help="ifcopenshell selector to restrict rendered elements" + ) + render_parser.add_argument( + "--element", + default="", + metavar="ID[,ID...]", + help="Comma-separated step IDs of elements to highlight (rest rendered in grey)", + ) + render_parser.add_argument( + "--view", + choices=render_mod.VIEWS, + default="iso", + help="Camera angle (default: iso)", + ) + + plot_parser = subparsers.add_parser( + "plot", help="Plot model drawing (SVG via ifcopenshell.draw; optional PNG via CairoSVG)" + ) + plot_parser.add_argument( + "-o", + "--output", + default="", + metavar="FILE", + help="Output file path. Default depends on --out-format: .svg/.png", + ) + plot_parser.add_argument( + "--out-format", + choices=["svg", "png", "base64"], + default="png", + help="Output format: svg (write SVG), png (write PNG), base64 (print base64 in JSON/text). Default: png", + ) + plot_parser.add_argument( + "--selector", default="", metavar="QUERY", help="ifcopenshell selector to restrict plotted elements" + ) + plot_parser.add_argument( + "--element", default="", metavar="ID[,ID...]", help="Comma-separated step IDs of elements to highlight" + ) + plot_parser.add_argument( + "--view", + choices=getattr(plot, "VIEWS", ("floorplan", "elevation", "section", "auto")), + default="floorplan", + help="Drawing view (default: floorplan)", + ) + plot_parser.add_argument( + "--width-mm", + type=float, + default=297.0, + metavar="MM", + help="Paper width in mm (default: 297)", + ) + plot_parser.add_argument( + "--height-mm", + type=float, + default=420.0, + metavar="MM", + help="Paper height in mm (default: 420)", + ) + plot_parser.add_argument( + "--scale", + type=float, + default=1.0 / 100.0, + metavar="S", + help="Model-to-paper scale (default: 0.01 = 1:100)", + ) + plot_parser.add_argument( + "--png-width", + type=int, + default=1024, + metavar="PX", + help="PNG width in pixels (default: 1024)", + ) + plot_parser.add_argument( + "--png-height", + type=int, + default=1024, + metavar="PX", + help="PNG height in pixels (default: 1024)", + ) + + args = parser.parse_args() + + try: + model = ifcopenshell.open(args.ifc_file) + except Exception as e: + print(f"Error: Could not open IFC file: {e}", file=sys.stderr) + sys.exit(1) + + if args.command == "summary": + result = summary.summary(model) + elif args.command == "tree": + result = tree.tree(model) + elif args.command == "info": + try: + element_id = parse_element_id(args.element_id) + except ValueError: + print(f"Error: Invalid element ID: {args.element_id}", file=sys.stderr) + sys.exit(1) + try: + element = model.by_id(element_id) + except RuntimeError: + print(f"Error: Element #{element_id} not found", file=sys.stderr) + sys.exit(1) + result = info.info(model, element) + elif args.command == "select": + result = select.select(model, args.query) + elif args.command == "relations": + try: + element_id = parse_element_id(args.element_id) + except ValueError: + print(f"Error: Invalid element ID: {args.element_id}", file=sys.stderr) + sys.exit(1) + try: + element = model.by_id(element_id) + except RuntimeError: + print(f"Error: Element #{element_id} not found", file=sys.stderr) + sys.exit(1) + result = relations.relations(model, element, traverse=args.traverse) + elif args.command == "clash": + try: + element_id = parse_element_id(args.element_id) + except ValueError: + print(f"Error: Invalid element ID: {args.element_id}", file=sys.stderr) + sys.exit(1) + try: + element = model.by_id(element_id) + except RuntimeError: + print(f"Error: Element #{element_id} not found", file=sys.stderr) + sys.exit(1) + try: + result = clash_mod.clash( + model, element, clearance=args.clearance, tolerance=args.tolerance, scope=args.scope + ) + except ImportError: + print("Error: ifcopenshell geometry engine not available (C++ bindings required)", file=sys.stderr) + sys.exit(1) + elif args.command == "validate": + result = validate_mod.validate(model, express_rules=args.rules) + elif args.command == "schedule": + result = schedule.schedule(model, max_depth=args.depth) + elif args.command == "cost": + result = cost_mod.cost(model, max_depth=args.depth) + elif args.command == "contexts": + result = contexts_mod.contexts(model) + elif args.command == "materials": + result = materials_mod.materials(model) + elif args.command == "schema": + result = schema.schema(model, args.entity_type) + elif args.command == "render": + element_ids = None + if args.element: + try: + element_ids = [parse_element_id(part) for part in args.element.split(",")] + except ValueError: + print(f"Error: Invalid element ID(s): {args.element}", file=sys.stderr) + sys.exit(1) + out_path = args.output or (os.path.splitext(args.ifc_file)[0] + ".png") + try: + png_bytes = render_mod.render( + model, + selector=args.selector or None, + element_ids=element_ids, + view=args.view, + ) + except ImportError as e: + print(f"Error: {e}", file=sys.stderr) + sys.exit(1) + except ValueError as e: + print(f"Error: {e}", file=sys.stderr) + sys.exit(1) + with open(out_path, "wb") as f: + f.write(png_bytes) + print(f"Saved render to {out_path}", file=sys.stderr) + return + elif args.command == "plot": + element_ids = None + if args.element: + try: + element_ids = [parse_element_id(part) for part in args.element.split(",")] + except ValueError: + print(f"Error: Invalid element ID(s): {args.element}", file=sys.stderr) + sys.exit(1) + + try: + result = plot.plot( + model, + selector=args.selector or None, + element_ids=element_ids, + view=args.view, + width_mm=args.width_mm, + height_mm=args.height_mm, + scale=args.scale, + output_format=args.out_format, + ) + except ImportError as e: + print(f"Error: {e}", file=sys.stderr) + sys.exit(1) + except ValueError as e: + print(f"Error: {e}", file=sys.stderr) + sys.exit(1) + + if args.out_format == "base64": + # result is a dict; serialise to stdout so callers can consume it + print(format_output(result, args.output_format)) + return + + # svg or png: write to a file + base = os.path.splitext(args.ifc_file)[0] + if args.out_format == "svg": + out_path = args.output or (base + ".svg") + else: + out_path = args.output or (base + ".png") + + with open(out_path, "wb") as f: + f.write(result) + + print(f"Saved drawing to {out_path}", file=sys.stderr) + return + + print(format_output(result, args.output_format)) + + +if __name__ == "__main__": + main() diff --git a/src/ifcquery/ifcquery/clash.py b/src/ifcquery/ifcquery/clash.py new file mode 100644 index 00000000000..52c8d53e3ba --- /dev/null +++ b/src/ifcquery/ifcquery/clash.py @@ -0,0 +1,180 @@ +# This file was generated with the assistance of an AI coding tool. +# IfcQuery - IFC model interrogation CLI +# Copyright (C) 2026 Bruno Postle +# +# This file is part of IfcQuery. +# +# IfcQuery is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# IfcQuery is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with IfcQuery. If not, see . + +from __future__ import annotations + +import multiprocessing +import sys +from typing import Any + +import ifcopenshell +import ifcopenshell.geom +import ifcopenshell.util.element + + +def _ref(element: ifcopenshell.entity_instance) -> dict[str, Any]: + """Serialize an element to a compact reference dict.""" + result: dict[str, Any] = {"id": element.id(), "type": element.is_a()} + if hasattr(element, "Name") and element.Name: + result["name"] = element.Name + return result + + +def _get_scope_elements( + model: ifcopenshell.file, element: ifcopenshell.entity_instance, scope: str +) -> tuple[set[ifcopenshell.entity_instance], str]: + """Return set of elements to check against and the effective scope used. + + Returns (elements, effective_scope) where effective_scope may differ from + the requested scope if fallback was needed. + """ + if scope == "storey": + container = ifcopenshell.util.element.get_container(element) + if container is not None: + siblings = set(ifcopenshell.util.element.get_contained(container)) + siblings.discard(element) + return siblings, "storey" + else: + print( + f"Warning: Element #{element.id()} has no spatial container, falling back to --scope all", + file=sys.stderr, + ) + + # scope == "all" or fallback + elements = set(model.by_type("IfcElement")) + elements -= set(model.by_type("IfcFeatureElement")) + elements.discard(element) + return elements, "all" + + +def _build_tree(model: ifcopenshell.file, elements: set[ifcopenshell.entity_instance]) -> ifcopenshell.geom.tree | None: + """Build geometry tree for given elements using iterator. + + Returns None if iterator fails to initialize (no geometry available). + """ + geom_settings = ifcopenshell.geom.settings() + geom_settings.set("use-world-coords", True) + geom_tree = ifcopenshell.geom.tree() + iterator = ifcopenshell.geom.iterator(geom_settings, model, multiprocessing.cpu_count(), include=list(elements)) + if not iterator.initialize(): + return None + while True: + geom_tree.add_element(iterator.get()) + if not iterator.next(): + break + return geom_tree + + +def _format_clash(clash_result, geom_tree: ifcopenshell.geom.tree, model: ifcopenshell.file) -> dict[str, Any]: + """Format a single clash result to dict.""" + # clash result .a/.b are C++ wrapper entity_instances without .Name; + # look up the Python entity from the model by id for proper serialization + other = model.by_id(clash_result.b.id()) + return { + "element": _ref(other), + "type": geom_tree.get_clash_type(clash_result.clash_type), + "distance": clash_result.distance, + "p1": list(clash_result.p1), + "p2": list(clash_result.p2), + } + + +def clash( + model: ifcopenshell.file, + element: ifcopenshell.entity_instance, + clearance: float | None = None, + tolerance: float = 0.002, + scope: str = "storey", +) -> dict[str, Any]: + """Check element for geometric clashes against other elements. + + :param model: The IFC model. + :param element: The element to check. + :param clearance: Minimum clearance distance; if provided, runs clearance check. + :param tolerance: Intersection tolerance in meters (default 0.002). + :param scope: Which elements to check against: "storey" or "all". + :return: Dict with clash results suitable for JSON serialization. + """ + result: dict[str, Any] = {"element": _ref(element)} + + # Get scope elements + scope_elements, effective_scope = _get_scope_elements(model, element, scope) + result["scope"] = effective_scope + + if not scope_elements: + result["pass"] = True + result["checks"] = {"intersection": {"pass": True, "tolerance": tolerance, "clashes": []}} + if clearance is not None: + result["checks"]["clearance"] = {"pass": True, "clearance": clearance, "clashes": []} + return result + + # Build geometry tree for target element + scope elements + all_elements = scope_elements | {element} + geom_tree = _build_tree(model, all_elements) + + if geom_tree is None: + result["pass"] = None + result["error"] = f"No geometry for element #{element.id()}" + return result + + # Run intersection check + intersection_clashes = geom_tree.clash_intersection_many( + [element], list(scope_elements), tolerance=tolerance, check_all=True + ) + intersection_results = [_format_clash(c, geom_tree, model) for c in intersection_clashes] + checks: dict[str, Any] = { + "intersection": { + "pass": len(intersection_results) == 0, + "tolerance": tolerance, + "clashes": intersection_results, + } + } + + all_pass = len(intersection_results) == 0 + + # Run clearance check if requested + if clearance is not None: + clearance_clashes = geom_tree.clash_clearance_many( + [element], list(scope_elements), clearance=clearance, check_all=True + ) + clearance_results = [_format_clash(c, geom_tree, model) for c in clearance_clashes] + checks["clearance"] = { + "pass": len(clearance_results) == 0, + "clearance": clearance, + "clashes": clearance_results, + } + if clearance_results: + all_pass = False + + result["pass"] = all_pass + result["checks"] = checks + + # Flat list of subject + all clashing elements across all checks, deduplicated. + # Allows --format ids to extract all involved IDs without jq. + seen: set[int] = {element.id()} + involved = [_ref(element)] + for check in checks.values(): + for clash_item in check.get("clashes", []): + eid = clash_item["element"]["id"] + if eid not in seen: + seen.add(eid) + involved.append(clash_item["element"]) + result["elements"] = involved + + return result diff --git a/src/ifcquery/ifcquery/contexts.py b/src/ifcquery/ifcquery/contexts.py new file mode 100644 index 00000000000..912df173d7a --- /dev/null +++ b/src/ifcquery/ifcquery/contexts.py @@ -0,0 +1,44 @@ +# IfcQuery - IFC model interrogation CLI +# Copyright (C) 2026 Bruno Postle +# +# This file is part of IfcQuery. +# +# IfcQuery is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# IfcQuery is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with IfcQuery. If not, see . + +from __future__ import annotations + +import ifcopenshell + + +def contexts(model: ifcopenshell.file) -> list[dict]: + """Return all geometric representation contexts and subcontexts. + + :param model: The in-memory IFC model. + :return: List of dicts with id, type, context_type, context_identifier, + and (for subcontexts) target_view and parent_context_id. + """ + results = [] + for ctx in model.by_type("IfcGeometricRepresentationContext"): + entry = { + "id": ctx.id(), + "type": ctx.is_a(), + "context_type": getattr(ctx, "ContextType", None), + "context_identifier": getattr(ctx, "ContextIdentifier", None), + } + if ctx.is_a("IfcGeometricRepresentationSubContext"): + entry["target_view"] = ctx.TargetView + parent = ctx.ParentContext + entry["parent_context_id"] = parent.id() if parent else None + results.append(entry) + return results diff --git a/src/ifcquery/ifcquery/cost.py b/src/ifcquery/ifcquery/cost.py new file mode 100644 index 00000000000..ef9559d597a --- /dev/null +++ b/src/ifcquery/ifcquery/cost.py @@ -0,0 +1,45 @@ +# This file was generated with the assistance of an AI coding tool. +from __future__ import annotations + +from typing import Any + +import ifcopenshell +import ifcopenshell.util.cost as cost_util + + +def _cost_item_to_dict(item: ifcopenshell.entity_instance, max_depth: int | None, depth: int) -> dict[str, Any]: + raw_values = cost_util.get_cost_values(item) + values = [{"formula": v.get("label", ""), "category": v.get("category")} for v in raw_values] + + if max_depth is not None and depth >= max_depth: + child_count = len(cost_util.get_nested_cost_items(item)) + subitems = {"truncated": True, "count": child_count} if child_count else [] + else: + subitems = [_cost_item_to_dict(sub, max_depth, depth + 1) for sub in cost_util.get_nested_cost_items(item)] + + return { + "id": item.id(), + "name": getattr(item, "Name", None), + "values": values, + "subitems": subitems, + } + + +def cost(model: ifcopenshell.file, max_depth: int | None = None) -> list[dict[str, Any]]: + """Return a list of IfcCostSchedule entries with nested cost item trees. + + max_depth limits how many levels of subitems are expanded (None = unlimited). + At the cutoff level, subitems is replaced with {"truncated": True, "count": N}. + """ + result = [] + for cost_schedule in model.by_type("IfcCostSchedule"): + items = [_cost_item_to_dict(i, max_depth, depth=1) for i in cost_util.get_root_cost_items(cost_schedule)] + result.append( + { + "id": cost_schedule.id(), + "name": getattr(cost_schedule, "Name", None), + "predefined_type": getattr(cost_schedule, "PredefinedType", None), + "items": items, + } + ) + return result diff --git a/src/ifcquery/ifcquery/info.py b/src/ifcquery/ifcquery/info.py new file mode 100644 index 00000000000..ad9a9daa4f7 --- /dev/null +++ b/src/ifcquery/ifcquery/info.py @@ -0,0 +1,262 @@ +# This file was generated with the assistance of an AI coding tool. +# IfcQuery - IFC model interrogation CLI +# Copyright (C) 2026 Bruno Postle +# +# This file is part of IfcQuery. +# +# IfcQuery is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# IfcQuery is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with IfcQuery. If not, see . + +from __future__ import annotations + +from typing import Any + +import ifcopenshell +import ifcopenshell.util.element +import ifcopenshell.util.placement + +# --------------------------------------------------------------------------- +# Geometry summary helpers +# --------------------------------------------------------------------------- + +_MAX_PROFILE_POINTS = 20 + + +def _rc(coords) -> list[float]: + """Round a coordinate sequence to 6 decimal places.""" + return [round(float(c), 6) for c in coords] + + +def _curve_points(curve) -> list | None: + if curve.is_a("IfcPolyline"): + return [_rc(p.Coordinates) for p in curve.Points] + if curve.is_a("IfcIndexedPolyCurve"): + return [_rc(c) for c in curve.Points.CoordList] + return None + + +def _profile_summary(profile) -> dict: + t = profile.is_a() + result: dict[str, Any] = {"type": t} + if t == "IfcRectangleProfileDef": + result["x_dim"] = profile.XDim + result["y_dim"] = profile.YDim + elif t in ("IfcCircleProfileDef", "IfcCircleHollowProfileDef"): + result["radius"] = profile.Radius + if t == "IfcCircleHollowProfileDef": + result["wall_thickness"] = profile.WallThickness + elif t in ("IfcArbitraryClosedProfileDef", "IfcArbitraryProfileDefWithVoids"): + pts = _curve_points(profile.OuterCurve) + if pts is not None: + if len(pts) <= _MAX_PROFILE_POINTS: + result["points"] = pts + else: + result["point_count"] = len(pts) + elif t == "IfcCompositeProfileDef": + result["profiles"] = [_profile_summary(p) for p in profile.Profiles] + return result + + +def _half_space_plane(half_space) -> dict | None: + if not half_space.is_a("IfcHalfSpaceSolid"): + return None + surface = half_space.BaseSurface + if not surface or not surface.is_a("IfcPlane"): + return None + pos = surface.Position + loc = _rc(pos.Location.Coordinates) + normal = _rc(pos.Axis.DirectionRatios) if pos.Axis else [0.0, 0.0, 1.0] + return {"location": loc, "normal": normal} + + +def _walk_clipping(item) -> tuple: + """Return (base_solid, [clipping_plane_dicts]) from a BooleanClippingResult chain.""" + planes = [] + current = item + while current.is_a("IfcBooleanClippingResult"): + plane = _half_space_plane(current.SecondOperand) + if plane: + planes.append(plane) + current = current.FirstOperand + return current, planes + + +def _swept_solid_dict(item) -> dict: + result: dict[str, Any] = {"solid_type": item.is_a()} + if item.is_a("IfcExtrudedAreaSolid"): + result["depth"] = item.Depth + if item.ExtrudedDirection: + result["direction"] = _rc(item.ExtrudedDirection.DirectionRatios) + if item.SweptArea: + result["profile"] = _profile_summary(item.SweptArea) + return result + + +def _summarize_rep(rep) -> dict: + rep_type = rep.RepresentationType or "" + result: dict[str, Any] = {"representation_type": rep_type} + items = list(rep.Items) + + if rep_type == "MappedRepresentation": + for item in items: + if item.is_a("IfcMappedItem"): + return _summarize_rep(item.MappingSource.MappedRepresentation) + + elif rep_type == "SweptSolid": + result["solids"] = [_swept_solid_dict(item) for item in items] + + elif rep_type == "Clipping": + solids = [] + for item in items: + base, planes = _walk_clipping(item) + solid = _swept_solid_dict(base) + if planes: + solid["clipping_planes"] = planes + solids.append(solid) + result["solids"] = solids + + elif rep_type == "CSG": + ops = [] + for item in items: + if hasattr(item, "Operator"): + ops.append({"operator": str(item.Operator), "type": item.is_a()}) + if ops: + result["operations"] = ops + + elif rep_type in ("Brep", "Tessellation", "SolidModel"): + face_count = 0 + vertex_count = 0 + for item in items: + if item.is_a("IfcPolygonalFaceSet"): + face_count += len(item.Faces) + vertex_count += len(item.Coordinates.CoordList) + elif item.is_a("IfcFacetedBrep"): + face_count += len(item.Outer.CfsFaces) + if face_count: + result["face_count"] = face_count + if vertex_count: + result["vertex_count"] = vertex_count + + return result + + +def _geometry_summary(element) -> dict | None: + if not hasattr(element, "Representation") or not element.Representation: + return None + body_rep = next( + (r for r in element.Representation.Representations if r.RepresentationIdentifier == "Body"), + None, + ) + if body_rep is None: + return None + try: + return _summarize_rep(body_rep) + except Exception: + return None + + +def _serialize_attribute(value: Any) -> Any: + """Convert an IFC attribute value to a JSON-serializable form.""" + if isinstance(value, ifcopenshell.entity_instance): + return {"id": value.id(), "type": value.is_a()} + if isinstance(value, tuple): + return [_serialize_attribute(v) for v in value] + return value + + +def _material_to_dict(material: ifcopenshell.entity_instance | None) -> dict[str, Any] | None: + """Convert a material entity to a summary dict.""" + if material is None: + return None + result: dict[str, Any] = { + "id": material.id(), + "type": material.is_a(), + } + if hasattr(material, "Name"): + result["name"] = material.Name + return result + + +def info(model: ifcopenshell.file, element: ifcopenshell.entity_instance) -> dict[str, Any]: + """Return deep inspection data for an element.""" + result: dict[str, Any] = { + "id": element.id(), + "type": element.is_a(), + } + + # Direct attributes via get_info() which returns a dict of all attributes + element_info = element.get_info() + attrs = {} + for key, value in element_info.items(): + if key in ("id", "type"): + continue + attrs[key] = _serialize_attribute(value) + result["attributes"] = attrs + + # Property sets and quantity sets + try: + psets = ifcopenshell.util.element.get_psets(element) + if psets: + result["property_sets"] = psets + except Exception: + pass + + # Element type + try: + element_type = ifcopenshell.util.element.get_type(element) + if element_type: + type_info: dict[str, Any] = { + "id": element_type.id(), + "type": element_type.is_a(), + } + if hasattr(element_type, "Name"): + type_info["name"] = element_type.Name + result["element_type"] = type_info + except Exception: + pass + + # Material + try: + material = ifcopenshell.util.element.get_material(element) + mat_dict = _material_to_dict(material) + if mat_dict: + result["material"] = mat_dict + except Exception: + pass + + # Spatial container + try: + container = ifcopenshell.util.element.get_container(element) + if container: + result["container"] = { + "id": container.id(), + "type": container.is_a(), + "name": container.Name if hasattr(container, "Name") else None, + } + except Exception: + pass + + # Placement (as 4x4 matrix) + try: + if hasattr(element, "ObjectPlacement") and element.ObjectPlacement: + matrix = ifcopenshell.util.placement.get_local_placement(element.ObjectPlacement) + result["placement"] = matrix.tolist() + except Exception: + pass + + # Geometry summary + geom = _geometry_summary(element) + if geom: + result["geometry_summary"] = geom + + return result diff --git a/src/ifcquery/ifcquery/materials.py b/src/ifcquery/ifcquery/materials.py new file mode 100644 index 00000000000..c7402d51e51 --- /dev/null +++ b/src/ifcquery/ifcquery/materials.py @@ -0,0 +1,100 @@ +# IfcQuery - IFC model interrogation CLI +# Copyright (C) 2026 Bruno Postle +# +# This file is part of IfcQuery. +# +# IfcQuery is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# IfcQuery is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with IfcQuery. If not, see . + +from __future__ import annotations + +import ifcopenshell + + +def materials(model: ifcopenshell.file) -> list[dict]: + """Return all materials and material sets from the model. + + :param model: The in-memory IFC model. + :return: List of dicts covering IfcMaterial, IfcMaterialLayerSet, + IfcMaterialConstituentSet, and IfcMaterialProfileSet entities. + """ + results = [] + + for m in model.by_type("IfcMaterial"): + results.append( + { + "id": m.id(), + "type": "IfcMaterial", + "name": m.Name, + "category": getattr(m, "Category", None), + } + ) + + for ls in model.by_type("IfcMaterialLayerSet"): + layers = [] + for layer in ls.MaterialLayers or []: + layers.append( + { + "name": layer.Name, + "thickness": layer.LayerThickness, + "material": layer.Material.Name if layer.Material else None, + "is_ventilated": layer.IsVentilated, + } + ) + results.append( + { + "id": ls.id(), + "type": "IfcMaterialLayerSet", + "name": ls.LayerSetName, + "layers": layers, + } + ) + + for cs in model.by_type("IfcMaterialConstituentSet"): + constituents = [] + for c in cs.MaterialConstituents or []: + constituents.append( + { + "name": c.Name, + "material": c.Material.Name if c.Material else None, + "fraction": c.Fraction, + } + ) + results.append( + { + "id": cs.id(), + "type": "IfcMaterialConstituentSet", + "name": cs.Name, + "constituents": constituents, + } + ) + + for ps in model.by_type("IfcMaterialProfileSet"): + profiles = [] + for p in ps.MaterialProfiles or []: + profiles.append( + { + "name": p.Name, + "material": p.Material.Name if p.Material else None, + } + ) + results.append( + { + "id": ps.id(), + "type": "IfcMaterialProfileSet", + "name": ps.Name, + "profiles": profiles, + } + ) + + return results diff --git a/src/ifcquery/ifcquery/plot.py b/src/ifcquery/ifcquery/plot.py new file mode 100644 index 00000000000..3393a87fc87 --- /dev/null +++ b/src/ifcquery/ifcquery/plot.py @@ -0,0 +1,284 @@ +# IfcQuery - IFC model interrogation CLI +# Copyright (C) 2026 Bruno Postle +# +# This file is part of IfcQuery. +# +# IfcQuery is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# IfcQuery is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with IfcQuery. If not, see . + +from __future__ import annotations + +import base64 +import os +from io import BytesIO +from typing import Any + +import ifcopenshell +import ifcopenshell.geom +import ifcopenshell.util.selector + +try: + import ifcopenshell.draw + + _HAS_DRAW = True +except ImportError: + _HAS_DRAW = False + +from xml.etree.ElementTree import Element, ElementTree, SubElement, register_namespace + +try: + import cairosvg # type: ignore + + _HAS_CAIROSVG = True +except Exception: + _HAS_CAIROSVG = False + + +try: + from PIL import Image # type: ignore + + _HAS_PIL = True +except Exception: + _HAS_PIL = False + +VIEWS = ("floorplan", "elevation", "section", "auto") +OUTPUT_FORMATS = ("svg", "png", "base64") + + +def _escape_css_attr(name: str) -> str: + # CSS attribute selectors must escape ':' (e.g. ifc:guid -> ifc\:guid) + return name.replace(":", "\\:") + + +def _highlight_css_from_ids(model: ifcopenshell.file, element_ids: list[int]) -> str: + guids: list[str] = [] + for sid in element_ids: + try: + e = model.by_id(int(sid)) + except RuntimeError: + continue + if e is None: + continue + gid = getattr(e, "GlobalId", None) + if isinstance(gid, str) and gid: + guids.append(gid) + + if not guids: + return "" + + attr = _escape_css_attr("ifc:guid") + + css = [ + "/* Auto-highlight injected by ifcquery.plot */", + f"[{attr}] path {{ opacity: 0.10; }}", + f"[{attr}] text {{ opacity: 0.25; }}", + ] + for gid in guids: + css.append(f'[{attr}="{gid}"] path {{ opacity: 1.0; stroke: #d00; stroke-width: 0.25; }}') + css.append(f'[{attr}="{gid}"] text {{ opacity: 1.0; fill: #d00; }}') + return "\n".join(css) + "\n" + + +def _make_filtered_iterator(model: ifcopenshell.file, include_elements: list[Any]) -> ifcopenshell.geom.iterator: + # Avoid multiprocessing in WASM; os.cpu_count is good enough. + n_threads = os.cpu_count() or 1 + + # These flags mirror the defaults used by ifcopenshell.draw in v0.8.x. + geom_settings = ifcopenshell.geom.settings( + REORIENT_SHELLS=False, + ELEMENT_HIERARCHY=True, + ) + + # IfcOpenShell wrapper constants may live in different places across builds. + wrapper = getattr(ifcopenshell, "ifcopenshell_wrapper", None) + if wrapper is not None: + try: + geom_settings.set("iterator-output", wrapper.NATIVE) + except Exception: + pass + try: + geom_settings.set("apply-default-materials", True) + except Exception: + pass + try: + geom_settings.set("dimensionality", wrapper.SURFACES_AND_SOLIDS) + except Exception: + pass + + return ifcopenshell.geom.iterator(geom_settings, model, n_threads, include=include_elements) + + +def _diagnose_empty_drawing(model: ifcopenshell.file, view: str) -> str: + """Return a helpful error message when ifcopenshell.draw produces no geometry groups.""" + hints = [] + + if view in ("floorplan", "auto"): + storeys = model.by_type("IfcBuildingStorey") + if not storeys: + hints.append("the model has no IfcBuildingStorey entities (required for auto_floorplan)") + else: + null_elevation = [s for s in storeys if getattr(s, "Elevation", None) is None] + if null_elevation: + names = ", ".join(f'"{s.Name or s.GlobalId}"' for s in null_elevation) + hints.append( + f"storey Elevation is None for: {names} — " + "set IfcBuildingStorey.Elevation (e.g. 0.0) so the section cut height can be determined" + ) + + has_geom = any(getattr(e, "Representation", None) is not None for e in model.by_type("IfcProduct")) + if not has_geom: + hints.append("no IfcProduct entities have geometric representations") + + base = f"No plan geometry found for view={view!r}." + if hints: + return base + " Possible causes: " + "; ".join(hints) + "." + return base + " The model may lack geometry visible in this view." + + +def plot( + model: ifcopenshell.file, + *, + output_format: str = "png", + selector: str | None = None, + element_ids: list[int] | None = None, + view: str = "floorplan", + # SVG / page sizing (draw works in mm coordinates) + width_mm: float = 297.0, + height_mm: float = 420.0, + scale: float = 1.0 / 100.0, + merge_projection: bool = True, + # PNG sizing (only for output_format png/base64) + png_width: int = 1024, + png_height: int = 1024, +) -> bytes | dict[str, Any]: + """ + Plot IFC model as SVG (via ifcopenshell.draw) or PNG/base64 (via CairoSVG). + + Args: + model: In-memory IFC model. + output_format: 'svg' | 'png' | 'base64' + - 'svg' -> returns SVG bytes + - 'png' -> returns PNG bytes + - 'base64'-> returns dict: {mime, png_b64, width, height, view} + selector: ifcopenshell selector query to restrict plotted elements. + element_ids: STEP ids to highlight; non-highlighted geometry is faded. + view: One of VIEWS ('floorplan', 'elevation', 'section', 'auto'). + width_mm, height_mm: Page size in mm. + scale: Model-to-paper scale (0.01 means 1:100). + merge_projection: Passed through to ifcopenshell.draw.main. + png_width, png_height: Raster size in pixels for png/base64 outputs. + + Raises: + ImportError: if ifcopenshell.draw or CairoSVG is not available (as required). + ValueError: invalid args or selector matches nothing. + """ + if output_format not in OUTPUT_FORMATS: + raise ValueError(f"output_format must be one of {OUTPUT_FORMATS}, got {output_format!r}") + if view not in VIEWS: + raise ValueError(f"view must be one of {VIEWS}, got {view!r}") + if not _HAS_DRAW: + raise ImportError("ifcopenshell.draw is not available in this environment.") + + # Configure draw settings + settings = ifcopenshell.draw.draw_settings( + auto_floorplan=(view in ("floorplan", "auto")), + auto_elevation=(view in ("elevation", "auto")), + auto_section=(view in ("section", "auto")), + width=width_mm, + height=height_mm, + scale=scale, + css="", + ) + + # Optional highlight CSS overlay + if element_ids: + settings.css = _highlight_css_from_ids(model, element_ids) + + # Optional element restriction via selector -> custom iterator + iterators: tuple[Any, ...] = () + if selector: + include_elements = list(ifcopenshell.util.selector.filter_elements(model, selector)) + if not include_elements: + raise ValueError(f"Selector {selector!r} matched no elements") + it = _make_filtered_iterator(model, include_elements) + iterators = (it,) + # If we explicitly include elements, don't rely on exclude_entities (best-effort). + settings.exclude_entities = "" + + # Generate SVG + svg_bytes = ifcopenshell.draw.main( + settings, + files=[model], + iterators=iterators, + merge_projection=merge_projection, + ) + + register_namespace("", "http://www.w3.org/2000/svg") + + def svg_split(f): + x = ElementTree(file=f) + svg = x.getroot() + resources = [] + for child in svg: + if child.tag == "{http://www.w3.org/2000/svg}g": + root = Element(svg.tag, svg.attrib) + n = ElementTree(root) + for r in resources + [child]: + root.append(r) + b = BytesIO() + n.write(b, xml_declaration=True, encoding="utf-8", method="xml") + yield b.getvalue() + else: + resources.append(child) + + if output_format == "svg": + return svg_bytes + + # Need CairoSVG for png/base64 + if not _HAS_CAIROSVG: + raise ImportError("CairoSVG is not installed. Install with: pip install cairosvg") + + svgs = list(svg_split(BytesIO(svg_bytes))) + if not svgs: + raise ValueError(_diagnose_empty_drawing(model, view)) + + composite = None + png_bytes = None + for i, svgb in enumerate(svgs): + png_bytes = cairosvg.svg2png(bytestring=svgb, output_width=png_width, output_height=png_height) + if len(svgs) == 1: + break + + # Need Pillow for concatenating images + if not _HAS_PIL: + raise ImportError("Pillow is not installed. Install with: pip install Pillow") + + if composite is None: + composite = Image.new("RGBA", (png_width, png_height * len(svgs))) + img = Image.open(BytesIO(png_bytes)) + composite.paste(img, (0, png_height * i)) + if composite is not None: + b = BytesIO() + composite.save(b, "png") + png_bytes = b.getvalue() + + if output_format == "base64": + return { + "mime": "image/png", + "png_b64": base64.b64encode(png_bytes).decode(), + "width": png_width, + "height": png_height, + "view": view, + } + + return png_bytes diff --git a/src/ifcquery/ifcquery/relations.py b/src/ifcquery/ifcquery/relations.py new file mode 100644 index 00000000000..556ee0324d8 --- /dev/null +++ b/src/ifcquery/ifcquery/relations.py @@ -0,0 +1,197 @@ +# This file was generated with the assistance of an AI coding tool. +# IfcQuery - IFC model interrogation CLI +# Copyright (C) 2026 Bruno Postle +# +# This file is part of IfcQuery. +# +# IfcQuery is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# IfcQuery is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with IfcQuery. If not, see . + +from __future__ import annotations + +from typing import Any + +import ifcopenshell +import ifcopenshell.util.element +import ifcopenshell.util.system + + +def _ref(element: ifcopenshell.entity_instance) -> dict[str, Any]: + """Serialize an element to a compact reference dict.""" + result: dict[str, Any] = {"id": element.id(), "type": element.is_a()} + if hasattr(element, "Name") and element.Name: + result["name"] = element.Name + return result + + +def _ref_or_none(element: ifcopenshell.entity_instance | None) -> dict[str, Any] | None: + return _ref(element) if element is not None else None + + +def _ref_list(elements) -> list[dict[str, Any]]: + return [_ref(e) for e in elements] + + +def _traverse_up(element: ifcopenshell.entity_instance) -> list[dict[str, Any]]: + """Walk the hierarchy from element up to IfcProject.""" + chain = [_ref(element)] + current = element + while True: + parent = ifcopenshell.util.element.get_parent(current) + if parent is None: + break + chain.append(_ref(parent)) + current = parent + return chain + + +def _all_relations(model: ifcopenshell.file, element: ifcopenshell.entity_instance) -> dict[str, Any]: + """Collect all relationships for an element.""" + result: dict[str, Any] = { + "id": element.id(), + "type": element.is_a(), + } + if hasattr(element, "Name") and element.Name: + result["name"] = element.Name + + # Hierarchy (upward) + hierarchy: dict[str, Any] = {} + parent = ifcopenshell.util.element.get_parent(element) + if parent is not None: + hierarchy["parent"] = _ref(parent) + container = ifcopenshell.util.element.get_container(element) + if container is not None: + hierarchy["container"] = _ref(container) + aggregate = ifcopenshell.util.element.get_aggregate(element) + if aggregate is not None: + hierarchy["aggregate"] = _ref(aggregate) + nest = ifcopenshell.util.element.get_nest(element) + if nest is not None: + hierarchy["nest"] = _ref(nest) + filled_void = ifcopenshell.util.element.get_filled_void(element) + if filled_void is not None: + hierarchy["filled_void"] = _ref(filled_void) + voided_element = ifcopenshell.util.element.get_voided_element(element) + if voided_element is not None: + hierarchy["voided_element"] = _ref(voided_element) + if hierarchy: + result["hierarchy"] = hierarchy + + # Children (downward) + children: dict[str, Any] = {} + contained = ifcopenshell.util.element.get_contained(element) + if contained: + children["contained"] = _ref_list(contained) + parts = ifcopenshell.util.element.get_parts(element) + if parts: + children["parts"] = _ref_list(parts) + components = ifcopenshell.util.element.get_components(element) + if components: + children["components"] = _ref_list(components) + openings = list(ifcopenshell.util.element.get_openings(element)) + if openings: + children["openings"] = _ref_list(openings) + if children: + result["children"] = children + + # Type relationship + type_relationship: dict[str, Any] = {} + element_type = ifcopenshell.util.element.get_type(element) + if element_type is not None: + type_relationship["type_of"] = _ref(element_type) + try: + occurrences = ifcopenshell.util.element.get_types(element) + if occurrences: + type_relationship["occurrences"] = _ref_list(occurrences) + except Exception: + pass + if type_relationship: + result["type_relationship"] = type_relationship + + # Groups + groups = ifcopenshell.util.element.get_groups(element) + if groups: + result["groups"] = _ref_list(groups) + + # Systems + systems = ifcopenshell.util.system.get_element_systems(element) + if systems: + result["systems"] = _ref_list(systems) + + # Zones + zones = ifcopenshell.util.system.get_element_zones(element) + if zones: + result["zones"] = _ref_list(zones) + + # Material + material = ifcopenshell.util.element.get_material(element) + if material is not None: + result["material"] = _ref(material) + + # Referenced structures + referenced = ifcopenshell.util.element.get_referenced_structures(element) + if referenced: + result["referenced_structures"] = _ref_list(referenced) + + # Connections + connections: dict[str, Any] = {} + connected_to = ifcopenshell.util.system.get_connected_to(element) + if connected_to: + connections["connected_to"] = _ref_list(connected_to) + connected_from = ifcopenshell.util.system.get_connected_from(element) + if connected_from: + connections["connected_from"] = _ref_list(connected_from) + ports = ifcopenshell.util.system.get_ports(element) + if ports: + connections["ports"] = _ref_list(ports) + if connections: + result["connections"] = connections + + return result + + +def _collect_elements(data: Any, seen: set[int], result: list[dict[str, Any]]) -> None: + """Recursively collect all element refs (dicts with 'id') from a nested structure.""" + if isinstance(data, dict): + if "id" in data and isinstance(data["id"], int): + eid = data["id"] + if eid not in seen: + seen.add(eid) + result.append( + {"id": data["id"], "type": data.get("type"), "name": data.get("name")} + if "name" in data + else {"id": data["id"], "type": data.get("type")} + ) + for v in data.values(): + _collect_elements(v, seen, result) + elif isinstance(data, list): + for item in data: + _collect_elements(item, seen, result) + + +def relations( + model: ifcopenshell.file, element: ifcopenshell.entity_instance, traverse: str | None = None +) -> dict[str, Any] | list[dict[str, Any]]: + """Return relationships for an element, or hierarchy chain if traverse='up'.""" + if traverse == "up": + return _traverse_up(element) + result = _all_relations(model, element) + + # Flat list of subject + all referenced elements, deduplicated. + # Allows --format ids to extract all involved IDs without jq. + seen: set[int] = set() + elements: list[dict[str, Any]] = [] + _collect_elements(result, seen, elements) + result["elements"] = elements + + return result diff --git a/src/ifcquery/ifcquery/render.py b/src/ifcquery/ifcquery/render.py new file mode 100644 index 00000000000..44105e0ee2d --- /dev/null +++ b/src/ifcquery/ifcquery/render.py @@ -0,0 +1,465 @@ +# IfcQuery - IFC model interrogation CLI +# Copyright (C) 2026 Bruno Postle +# +# This file is part of IfcQuery. +# +# IfcQuery is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# IfcQuery is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with IfcQuery. If not, see . + +from __future__ import annotations + +import multiprocessing +import os +import tempfile + +import ifcopenshell +import ifcopenshell.geom +import ifcopenshell.guid +import ifcopenshell.util.selector + +try: + import numpy as np + import pyvista as pv + + _HAS_PYVISTA = True +except ImportError: + _HAS_PYVISTA = False + +VIEWS = ("iso", "top", "south", "north", "east", "west") + + +def _apply_view(plotter: pv.Plotter, view: str) -> None: + """Set the camera to the requested named view. Z is up (IFC convention).""" + if view == "top": + plotter.view_xy() + elif view == "south": + # Camera at -Y looking toward +Y (south face of building) + plotter.view_xz(negative=True) + elif view == "north": + plotter.view_xz(negative=False) + elif view == "east": + plotter.view_yz(negative=False) + elif view == "west": + plotter.view_yz(negative=True) + else: + plotter.view_isometric() + # Ensure Z is world up for elevation views + if view not in ("top",): + plotter.camera.up = (0, 0, 1) + + +def _add_shape( + shape: object, + plotter: pv.Plotter, + highlight_ids: frozenset[int] | None, +) -> None: + """Triangulate and add a geometry shape to the plotter.""" + geom = shape.geometry + verts = np.array(geom.verts, dtype=float).reshape(-1, 3) + if verts.size == 0: + return + + raw_faces = np.array(geom.faces, dtype=int) + if raw_faces.size == 0 or raw_faces.size % 3 != 0: + return # degenerate geometry from kernel — skip silently + faces = raw_faces.reshape(-1, 3) + material_ids = np.array(geom.material_ids, dtype=int) + + is_subject = highlight_ids is not None and shape.product.id() in highlight_ids + + for midx, mat in enumerate(geom.materials): + tri_mask = material_ids == midx + if not np.any(tri_mask): + continue + + sub_faces = faces[tri_mask] + faces_pv = np.hstack([np.full((sub_faces.shape[0], 1), 3, dtype=int), sub_faces]).ravel() + mesh = pv.PolyData(verts, faces_pv) + + if highlight_ids is not None and not is_subject: + color = (180, 180, 180) + opacity = 0.10 + else: + diffuse = np.clip(np.array(mat.diffuse.components), 0.0, 1.0) + color = tuple((diffuse * 255).astype(np.uint8)) + transparency = mat.transparency if mat.transparency == mat.transparency else 0.0 + opacity = float(np.clip(1.0 - transparency, 0.0, 1.0)) + + plotter.add_mesh(mesh, color=color, opacity=opacity, show_edges=False) + + +def _render_iterator( + iterator: object, + highlight_ids: list[int] | None, + view: str, +) -> bytes: + """Drive a geometry iterator into a pyvista plotter and return PNG bytes.""" + plotter = pv.Plotter(off_screen=True, window_size=(1280, 960)) + plotter.background_color = "white" + + while True: + try: + _add_shape(iterator.get(), plotter, highlight_ids=frozenset(highlight_ids) if highlight_ids else None) + except Exception: + pass # skip broken shapes, keep rendering the rest + if not iterator.next(): + break + + plotter.reset_camera() + _apply_view(plotter, view) + + tmp_fd, tmp_path = tempfile.mkstemp(suffix=".png") + os.close(tmp_fd) + try: + plotter.show(screenshot=tmp_path, auto_close=True) + with open(tmp_path, "rb") as f: + return f.read() + finally: + try: + os.unlink(tmp_path) + except OSError: + pass + + +def _build_geom_settings(model: ifcopenshell.file) -> ifcopenshell.geom.settings: + """Build geometry settings, excluding Clearance subcontexts.""" + settings = ifcopenshell.geom.settings() + settings.set("use-world-coords", True) + + clearance_ids = { + c.id() for c in model.by_type("IfcGeometricRepresentationSubContext") if c.ContextIdentifier == "Clearance" + } + if clearance_ids: + ctx_ids = [c.id() for c in model.by_type("IfcGeometricRepresentationContext") if c.id() not in clearance_ids] + if ctx_ids: + settings.set("context-ids", ctx_ids) + + return settings + + +def _get_occurrence_class(type_entity) -> str: + """Derive the occurrence IFC class from a type entity class name.""" + type_class = type_entity.is_a() + if type_class.endswith("Type"): + return type_class[:-4] + return "IfcBuildingElementProxy" + + +def _make_type_occurrence(model: ifcopenshell.file, type_entity) -> object | None: + """Create a temporary occurrence for *type_entity* using its RepresentationMaps. + + The occurrence is added to *model* and references the type's existing + RepresentationMap entities via IfcMappedItem. Returns the occurrence entity, + or ``None`` when the type has no usable RepresentationMaps. + + .. note:: + This function is intended for use on a temporary model copy. The + caller is responsible for discarding that copy after rendering. + """ + rep_maps = getattr(type_entity, "RepresentationMaps", None) or [] + if not rep_maps: + return None + + # One IfcMappedItem per RepresentationMap. + mapped_items = [] + for rep_map in rep_maps: + origin = model.create_entity("IfcCartesianPoint", Coordinates=(0.0, 0.0, 0.0)) + transform = model.create_entity( + "IfcCartesianTransformationOperator3D", + LocalOrigin=origin, + ) + mapped_item = model.create_entity( + "IfcMappedItem", + MappingSource=rep_map, + MappingTarget=transform, + ) + mapped_items.append(mapped_item) + + context = rep_maps[0].MappedRepresentation.ContextOfItems + shape_rep = model.create_entity( + "IfcShapeRepresentation", + ContextOfItems=context, + RepresentationIdentifier="Body", + RepresentationType="MappedRepresentation", + Items=mapped_items, + ) + prod_def_shape = model.create_entity( + "IfcProductDefinitionShape", + Representations=[shape_rep], + ) + + # Identity placement. + pt = model.create_entity("IfcCartesianPoint", Coordinates=(0.0, 0.0, 0.0)) + z_dir = model.create_entity("IfcDirection", DirectionRatios=(0.0, 0.0, 1.0)) + x_dir = model.create_entity("IfcDirection", DirectionRatios=(1.0, 0.0, 0.0)) + axis2 = model.create_entity("IfcAxis2Placement3D", Location=pt, Axis=z_dir, RefDirection=x_dir) + placement = model.create_entity("IfcLocalPlacement", RelativePlacement=axis2) + + occ_class = _get_occurrence_class(type_entity) + try: + occurrence = model.create_entity( + occ_class, + GlobalId=ifcopenshell.guid.new(), + Name=f"_type_preview_{type_entity.id()}", + ObjectPlacement=placement, + Representation=prod_def_shape, + ) + except Exception: + occurrence = model.create_entity( + "IfcBuildingElementProxy", + GlobalId=ifcopenshell.guid.new(), + Name=f"_type_preview_{type_entity.id()}", + ObjectPlacement=placement, + Representation=prod_def_shape, + ) + return occurrence + + +def _make_profile_occurrence(model: ifcopenshell.file, type_entity) -> object | None: + """Create a temporary occurrence for a type that has a material profile set. + + Finds the first profile in the type's IfcMaterialProfileSet and creates a + 1-metre IfcExtrudedAreaSolid body representation from it. Returns the + occurrence, or ``None`` when no usable profile is found. + + .. note:: + Intended for use on a temporary model copy; caller discards it after + rendering. + """ + # Locate the first profile from the type's material profile set. + profile = None + for rel in getattr(type_entity, "HasAssociations", []): + if not rel.is_a("IfcRelAssociatesMaterial"): + continue + mat = rel.RelatingMaterial + if mat.is_a("IfcMaterialProfileSetUsage"): + mat = mat.ForProfileSet + if mat.is_a("IfcMaterialProfileSet"): + mat_profiles = list(getattr(mat, "MaterialProfiles", None) or []) + if mat_profiles: + profile = getattr(mat_profiles[0], "Profile", None) + if profile is not None: + break + if profile is None: + return None + + # Find a Body subcontext, or fall back to any Model context. + body_ctx = None + for ctx in model.by_type("IfcGeometricRepresentationSubContext"): + if ctx.ContextIdentifier == "Body": + body_ctx = ctx + break + if body_ctx is None: + for ctx in model.by_type("IfcGeometricRepresentationContext"): + if ctx.ContextType == "Model": + body_ctx = ctx + break + if body_ctx is None: + return None + + # Extrude 1 metre along Z (profile lies in XY plane). + origin = model.create_entity("IfcCartesianPoint", Coordinates=(0.0, 0.0, 0.0)) + z_axis = model.create_entity("IfcDirection", DirectionRatios=(0.0, 0.0, 1.0)) + x_axis = model.create_entity("IfcDirection", DirectionRatios=(1.0, 0.0, 0.0)) + position = model.create_entity("IfcAxis2Placement3D", Location=origin, Axis=z_axis, RefDirection=x_axis) + extrude_dir = model.create_entity("IfcDirection", DirectionRatios=(0.0, 0.0, 1.0)) + extrusion = model.create_entity( + "IfcExtrudedAreaSolid", + SweptArea=profile, + Position=position, + ExtrudedDirection=extrude_dir, + Depth=1.0, + ) + shape_rep = model.create_entity( + "IfcShapeRepresentation", + ContextOfItems=body_ctx, + RepresentationIdentifier="Body", + RepresentationType="SweptSolid", + Items=[extrusion], + ) + prod_def_shape = model.create_entity( + "IfcProductDefinitionShape", + Representations=[shape_rep], + ) + + # Identity placement. + pt = model.create_entity("IfcCartesianPoint", Coordinates=(0.0, 0.0, 0.0)) + z_dir = model.create_entity("IfcDirection", DirectionRatios=(0.0, 0.0, 1.0)) + x_dir = model.create_entity("IfcDirection", DirectionRatios=(1.0, 0.0, 0.0)) + axis2 = model.create_entity("IfcAxis2Placement3D", Location=pt, Axis=z_dir, RefDirection=x_dir) + placement = model.create_entity("IfcLocalPlacement", RelativePlacement=axis2) + + occ_class = _get_occurrence_class(type_entity) + try: + occurrence = model.create_entity( + occ_class, + GlobalId=ifcopenshell.guid.new(), + Name=f"_profile_preview_{type_entity.id()}", + ObjectPlacement=placement, + Representation=prod_def_shape, + ) + except Exception: + occurrence = model.create_entity( + "IfcBuildingElementProxy", + GlobalId=ifcopenshell.guid.new(), + Name=f"_profile_preview_{type_entity.id()}", + ObjectPlacement=placement, + Representation=prod_def_shape, + ) + return occurrence + + +def _render_with_types( + model: ifcopenshell.file, + types: list, + selector_elements: list | None, + element_ids: list[int] | None, + type_highlight_ids: set[int], + view: str, +) -> bytes: + """Render type entities by creating occurrences in a temporary model copy. + + *types* — list of IfcTypeProduct entities to render. + *selector_elements* — non-type elements from the selector (or ``None``). + *element_ids* — original highlight IDs (may contain type IDs). + *type_highlight_ids* — subset of *element_ids* that are type IDs. + """ + tmp_fd, tmp_path = tempfile.mkstemp(suffix=".ifc") + os.close(tmp_fd) + try: + model.write(tmp_path) + tmp = ifcopenshell.open(tmp_path) + + # Map original type step-ID → new occurrence step-ID in the tmp model. + type_id_to_occ_id: dict[int, int] = {} + for t in types: + tmp_type = tmp.by_id(t.id()) + occ = _make_type_occurrence(tmp, tmp_type) or _make_profile_occurrence(tmp, tmp_type) + if occ: + type_id_to_occ_id[t.id()] = occ.id() + + if not type_id_to_occ_id: + raise ValueError("Type entities have no RepresentationMaps or material profile sets to render") + + include = [tmp.by_id(occ_id) for occ_id in type_id_to_occ_id.values()] + if selector_elements: + include.extend(tmp.by_id(e.id()) for e in selector_elements) + + settings = _build_geom_settings(tmp) + iterator = ifcopenshell.geom.iterator(settings, tmp, multiprocessing.cpu_count(), include=include) + if not iterator.initialize(): + raise ValueError("Type entities have no renderable geometry") + + # Remap type IDs → occurrence IDs in the highlight list. + new_highlight = None + if element_ids: + new_highlight = [] + for hid in element_ids: + if hid in type_highlight_ids: + mapped = type_id_to_occ_id.get(hid) + if mapped: + new_highlight.append(mapped) + else: + new_highlight.append(hid) + + return _render_iterator(iterator, new_highlight, view) + finally: + try: + os.unlink(tmp_path) + except OSError: + pass + + +def render( + model: ifcopenshell.file, + selector: str | None = None, + element_ids: list[int] | None = None, + view: str = "iso", +) -> bytes: + """Render IFC model geometry to a PNG image. + + Supports both element instances and element types (e.g. ``IfcWallType``). + When type entities are targeted — via *selector* or *element_ids* — a + temporary copy of the model is used to create proxy occurrences that + reference the type's RepresentationMaps; the original model is not + modified. + + :param model: The in-memory IFC model. + :param selector: ifcopenshell selector to restrict rendered elements + (e.g. ``'IfcWall'``, ``'IfcWallType'``, or + ``'IfcBuildingStorey[Name="Ground Floor"]'``). + When omitted the whole model is rendered. + :param element_ids: Step IDs of elements (or types) to highlight. The + rest of the model is rendered in translucent grey so the highlighted + items stand out. + :param view: Camera angle: ``iso``, ``top``, ``south``, ``north``, + ``east``, or ``west``. Defaults to ``iso``. + :return: PNG image as raw bytes. + :raises ImportError: If pyvista is not installed. + :raises ValueError: If the selector matches nothing or the model has no + renderable geometry. + """ + if not _HAS_PYVISTA: + raise ImportError("pyvista is not installed. Install with: pip install pyvista") + + # --- Partition selector results into types and elements --- + if selector: + matched = list(ifcopenshell.util.selector.filter_elements(model, selector)) + if not matched: + raise ValueError(f"Selector {selector!r} matched no elements") + types = [e for e in matched if e.is_a("IfcTypeProduct")] + selector_elements: list | None = [e for e in matched if not e.is_a("IfcTypeProduct")] + else: + types = [] + selector_elements = None # no restriction — render all elements + + # --- Collect any type entities from element_ids --- + type_highlight_ids: set[int] = set() + if element_ids: + for eid in element_ids: + entity = model.by_id(eid) + if entity.is_a("IfcTypeProduct"): + type_highlight_ids.add(eid) + seen = {t.id() for t in types} + if eid not in seen: + types.append(entity) + + # --- Delegate to temp-copy path when any type entities are involved --- + if types: + return _render_with_types(model, types, selector_elements, element_ids, type_highlight_ids, view) + + # --- Regular element rendering --- + settings = _build_geom_settings(model) + + if selector_elements is not None: + if not selector_elements: + raise ValueError(f"Selector {selector!r} matched only type entities (use a type selector or IfcElement)") + iterator = ifcopenshell.geom.iterator( + settings, + model, + multiprocessing.cpu_count(), + include=selector_elements, + ) + else: + exclude = list(model.by_type("IfcOpeningElement")) + iterator = ifcopenshell.geom.iterator( + settings, + model, + multiprocessing.cpu_count(), + exclude=exclude if exclude else None, + ) + + if not iterator.initialize(): + raise ValueError("No renderable geometry found in model (or selector matched nothing)") + + return _render_iterator(iterator, element_ids, view) diff --git a/src/ifcquery/ifcquery/schedule.py b/src/ifcquery/ifcquery/schedule.py new file mode 100644 index 00000000000..b3e3ae45d62 --- /dev/null +++ b/src/ifcquery/ifcquery/schedule.py @@ -0,0 +1,56 @@ +# This file was generated with the assistance of an AI coding tool. +from __future__ import annotations + +from typing import Any + +import ifcopenshell +import ifcopenshell.util.sequence as seq + + +def _task_to_dict(task: ifcopenshell.entity_instance, max_depth: int | None, depth: int) -> dict[str, Any]: + task_time = task.TaskTime + start = None + finish = None + if task_time: + start = task_time.ScheduleStart + finish = task_time.ScheduleFinish + + outputs = [] + for product in seq.get_task_outputs(task): + outputs.append({"id": product.id(), "type": product.is_a(), "name": getattr(product, "Name", None)}) + + if max_depth is not None and depth >= max_depth: + child_count = len(seq.get_nested_tasks(task)) + subtasks = {"truncated": True, "count": child_count} if child_count else [] + else: + subtasks = [_task_to_dict(sub, max_depth, depth + 1) for sub in seq.get_nested_tasks(task)] + + return { + "id": task.id(), + "name": getattr(task, "Name", None), + "start": start, + "finish": finish, + "is_milestone": bool(task.IsMilestone) if hasattr(task, "IsMilestone") else False, + "outputs": outputs, + "subtasks": subtasks, + } + + +def schedule(model: ifcopenshell.file, max_depth: int | None = None) -> list[dict[str, Any]]: + """Return a list of IfcWorkSchedule entries with nested task trees. + + max_depth limits how many levels of subtasks are expanded (None = unlimited). + At the cutoff level, subtasks is replaced with {"truncated": True, "count": N}. + """ + result = [] + for work_schedule in model.by_type("IfcWorkSchedule"): + tasks = [_task_to_dict(t, max_depth, depth=1) for t in seq.get_root_tasks(work_schedule)] + result.append( + { + "id": work_schedule.id(), + "name": getattr(work_schedule, "Name", None), + "predefined_type": getattr(work_schedule, "PredefinedType", None), + "tasks": tasks, + } + ) + return result diff --git a/src/ifcquery/ifcquery/schema.py b/src/ifcquery/ifcquery/schema.py new file mode 100644 index 00000000000..ad47486db26 --- /dev/null +++ b/src/ifcquery/ifcquery/schema.py @@ -0,0 +1,19 @@ +# This file was generated with the assistance of an AI coding tool. +from __future__ import annotations + +from typing import Any + +import ifcopenshell +import ifcopenshell.util.doc + + +def schema(model: ifcopenshell.file, entity_type: str) -> dict[str, Any]: + """Return IFC class documentation for entity_type from model's schema version.""" + schema_name = model.schema + try: + doc = ifcopenshell.util.doc.get_entity_doc(schema_name, entity_type) + except Exception: + return {"error": f"Unknown entity: {entity_type}"} + if not doc: + return {"error": f"Unknown entity: {entity_type}"} + return dict(doc) diff --git a/src/ifcquery/ifcquery/select.py b/src/ifcquery/ifcquery/select.py new file mode 100644 index 00000000000..f3ee1dceaac --- /dev/null +++ b/src/ifcquery/ifcquery/select.py @@ -0,0 +1,50 @@ +# This file was generated with the assistance of an AI coding tool. +# IfcQuery - IFC model interrogation CLI +# Copyright (C) 2026 Bruno Postle +# +# This file is part of IfcQuery. +# +# IfcQuery is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# IfcQuery is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with IfcQuery. If not, see . + +from __future__ import annotations + +from typing import Any + +import ifcopenshell +import ifcopenshell.util.selector + + +def select(model: ifcopenshell.file, query: str) -> list[dict[str, Any]]: + """Filter elements using ifcopenshell selector syntax and return matching element summaries. + + Examples: + - ``IfcWall`` — all walls + - ``IfcWall, IfcColumn`` — walls and columns + - ``! IfcWall`` — everything except walls + - ``IfcWall, Name = "My Wall"`` — walls with a specific name attribute + - ``type = "Concrete Wall"`` — elements assigned that type product + - ``material = "Concrete"`` — elements with that material + """ + elements = ifcopenshell.util.selector.filter_elements(model, query) + results = [] + for element in sorted(elements, key=lambda e: e.id()): + entry: dict[str, Any] = { + "id": element.id(), + "type": element.is_a(), + "repr": str(element), + } + if hasattr(element, "Name"): + entry["name"] = element.Name + results.append(entry) + return results diff --git a/src/ifcquery/ifcquery/summary.py b/src/ifcquery/ifcquery/summary.py new file mode 100644 index 00000000000..d13f0704720 --- /dev/null +++ b/src/ifcquery/ifcquery/summary.py @@ -0,0 +1,52 @@ +# This file was generated with the assistance of an AI coding tool. +# IfcQuery - IFC model interrogation CLI +# Copyright (C) 2026 Bruno Postle +# +# This file is part of IfcQuery. +# +# IfcQuery is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# IfcQuery is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with IfcQuery. If not, see . + +from __future__ import annotations + +from collections import Counter +from typing import Any + +import ifcopenshell + + +def summary(model: ifcopenshell.file) -> dict[str, Any]: + """Return a model overview with schema, element counts, and project info.""" + # Count elements by IFC type, sorted by count descending + type_counter: Counter[str] = Counter() + total = 0 + for entity in model: + type_counter[entity.is_a()] += 1 + total += 1 + + result: dict[str, Any] = { + "schema": model.schema, + "total_entities": total, + } + + projects = model.by_type("IfcProject") + if projects: + project = projects[0] + result["project"] = { + "id": project.id(), + "name": project.Name, + "description": project.Description, + } + + result["types"] = dict(type_counter.most_common()) + return result diff --git a/src/ifcquery/ifcquery/tree.py b/src/ifcquery/ifcquery/tree.py new file mode 100644 index 00000000000..1cbbaeb986f --- /dev/null +++ b/src/ifcquery/ifcquery/tree.py @@ -0,0 +1,68 @@ +# This file was generated with the assistance of an AI coding tool. +# IfcQuery - IFC model interrogation CLI +# Copyright (C) 2026 Bruno Postle +# +# This file is part of IfcQuery. +# +# IfcQuery is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# IfcQuery is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with IfcQuery. If not, see . + +from __future__ import annotations + +from typing import Any + +import ifcopenshell +import ifcopenshell.util.element + + +def _element_summary(element: ifcopenshell.entity_instance) -> dict[str, Any]: + """Return a minimal summary dict for an element.""" + return { + "id": element.id(), + "type": element.is_a(), + "name": element.Name if hasattr(element, "Name") else None, + } + + +def _build_spatial_node(element: ifcopenshell.entity_instance) -> dict[str, Any]: + """Recursively build a spatial tree node.""" + node = _element_summary(element) + + # Get aggregated children (Site in Project, Building in Site, Storey in Building, etc.) + aggregates = [] + for rel in getattr(element, "IsDecomposedBy", []): + for child in rel.RelatedObjects: + aggregates.append(_build_spatial_node(child)) + + # Get contained elements (walls, slabs, etc. in a storey/space) + contained = [] + for rel in getattr(element, "ContainsElements", []): + for child in rel.RelatedElements: + contained.append(_element_summary(child)) + + if aggregates: + node["children"] = aggregates + if contained: + node["elements"] = contained + + return node + + +def tree(model: ifcopenshell.file) -> dict[str, Any] | list[dict[str, Any]]: + """Return the spatial hierarchy tree starting from IfcProject.""" + projects = model.by_type("IfcProject") + if not projects: + return {"error": "No IfcProject found in model"} + if len(projects) == 1: + return _build_spatial_node(projects[0]) + return [_build_spatial_node(p) for p in projects] diff --git a/src/ifcquery/ifcquery/validate.py b/src/ifcquery/ifcquery/validate.py new file mode 100644 index 00000000000..d35d9150af6 --- /dev/null +++ b/src/ifcquery/ifcquery/validate.py @@ -0,0 +1,15 @@ +# This file was generated with the assistance of an AI coding tool. +from __future__ import annotations + +from typing import Any + +import ifcopenshell +import ifcopenshell.validate + + +def validate(model: ifcopenshell.file, express_rules: bool = False) -> dict[str, Any]: + """Validate the model and return a dict with 'valid' bool and 'issues' list.""" + logger = ifcopenshell.validate.json_logger() + ifcopenshell.validate.validate(model, logger, express_rules=express_rules) + issues = [{"level": s["level"], "message": s["message"]} for s in logger.statements] + return {"valid": len(issues) == 0, "issues": issues} diff --git a/src/ifcquery/pyproject.toml b/src/ifcquery/pyproject.toml new file mode 100644 index 00000000000..3c8e7344748 --- /dev/null +++ b/src/ifcquery/pyproject.toml @@ -0,0 +1,33 @@ +[build-system] +requires = ["setuptools>=61.0"] +build-backend = "setuptools.build_meta" + +[project] +name = "ifcquery" +version = "0.0.0" +authors = [ + { name="Bruno Postle", email="bruno@postle.net" }, +] +description = "CLI tool for querying and inspecting IFC building models" +readme = "README.md" +keywords = ["IFC", "BIM", "Query"] +classifiers = [ + "Programming Language :: Python :: 3", + "License :: OSI Approved :: GNU Lesser General Public License v3 or later (LGPLv3+)", +] +dependencies = ["ifcopenshell"] + +[project.scripts] +ifcquery = "ifcquery.__main__:main" + +[project.urls] +Homepage = "http://ifcopenshell.org" +Documentation = "https://docs.ifcopenshell.org" +Issues = "https://github.com/IfcOpenShell/IfcOpenShell/issues" + +[tool.setuptools.packages.find] +include = ["ifcquery*"] +exclude = ["test*"] + +[tool.ruff] +extend = "../../pyproject.toml" diff --git a/src/ifcquery/tests/__init__.py b/src/ifcquery/tests/__init__.py new file mode 100644 index 00000000000..0a3bc271a0d --- /dev/null +++ b/src/ifcquery/tests/__init__.py @@ -0,0 +1 @@ +# This file was generated with the assistance of an AI coding tool. diff --git a/src/ifcquery/tests/conftest.py b/src/ifcquery/tests/conftest.py new file mode 100644 index 00000000000..496e74cd6e3 --- /dev/null +++ b/src/ifcquery/tests/conftest.py @@ -0,0 +1,36 @@ +# This file was generated with the assistance of an AI coding tool. +import ifcopenshell +import ifcopenshell.api.aggregate +import ifcopenshell.api.owner.settings +import ifcopenshell.api.project +import ifcopenshell.api.root +import ifcopenshell.api.spatial +import ifcopenshell.api.unit +import pytest + + +@pytest.fixture +def model(): + """Create an IFC4 model with a spatial hierarchy and a wall.""" + f = ifcopenshell.api.project.create_file() + ifcopenshell.api.owner.settings.get_user = lambda ifc: (ifc.by_type("IfcPersonAndOrganization") or [None])[0] + ifcopenshell.api.owner.settings.get_application = lambda ifc: (ifc.by_type("IfcApplication") or [None])[0] + + project = ifcopenshell.api.root.create_entity(f, ifc_class="IfcProject", name="TestProject") + ifcopenshell.api.unit.assign_unit(f) + + site = ifcopenshell.api.root.create_entity(f, ifc_class="IfcSite", name="TestSite") + building = ifcopenshell.api.root.create_entity(f, ifc_class="IfcBuilding", name="TestBuilding") + storey = ifcopenshell.api.root.create_entity(f, ifc_class="IfcBuildingStorey", name="Ground Floor") + + ifcopenshell.api.aggregate.assign_object(f, products=[site], relating_object=project) + ifcopenshell.api.aggregate.assign_object(f, products=[building], relating_object=site) + ifcopenshell.api.aggregate.assign_object(f, products=[storey], relating_object=building) + + wall = ifcopenshell.api.root.create_entity(f, ifc_class="IfcWall", name="Wall001") + ifcopenshell.api.spatial.assign_container(f, products=[wall], relating_structure=storey) + + slab = ifcopenshell.api.root.create_entity(f, ifc_class="IfcSlab", name="Slab001") + ifcopenshell.api.spatial.assign_container(f, products=[slab], relating_structure=storey) + + return f diff --git a/src/ifcquery/tests/test_clash.py b/src/ifcquery/tests/test_clash.py new file mode 100644 index 00000000000..150200f95ca --- /dev/null +++ b/src/ifcquery/tests/test_clash.py @@ -0,0 +1,330 @@ +# This file was generated with the assistance of an AI coding tool. +import json +import os +import subprocess +import sys +import tempfile + +import ifcopenshell +import ifcopenshell.api.aggregate +import ifcopenshell.api.context +import ifcopenshell.api.geometry +import ifcopenshell.api.owner.settings +import ifcopenshell.api.project +import ifcopenshell.api.root +import ifcopenshell.api.spatial +import ifcopenshell.api.unit +import numpy as np +import pytest + +from ifcquery.clash import clash + +try: + import ifcopenshell.geom + + HAS_GEOM = True +except ImportError: + HAS_GEOM = False + +pytestmark = pytest.mark.skipif(not HAS_GEOM, reason="ifcopenshell geometry engine not available") + + +@pytest.fixture +def model_with_geometry(): + """Create an IFC4 model with walls that have geometric representations.""" + f = ifcopenshell.api.project.create_file() + ifcopenshell.api.owner.settings.get_user = lambda ifc: (ifc.by_type("IfcPersonAndOrganization") or [None])[0] + ifcopenshell.api.owner.settings.get_application = lambda ifc: (ifc.by_type("IfcApplication") or [None])[0] + + project = ifcopenshell.api.root.create_entity(f, ifc_class="IfcProject", name="TestProject") + ifcopenshell.api.unit.assign_unit(f) + + site = ifcopenshell.api.root.create_entity(f, ifc_class="IfcSite", name="TestSite") + building = ifcopenshell.api.root.create_entity(f, ifc_class="IfcBuilding", name="TestBuilding") + storey = ifcopenshell.api.root.create_entity(f, ifc_class="IfcBuildingStorey", name="Ground Floor") + + ifcopenshell.api.aggregate.assign_object(f, products=[site], relating_object=project) + ifcopenshell.api.aggregate.assign_object(f, products=[building], relating_object=site) + ifcopenshell.api.aggregate.assign_object(f, products=[storey], relating_object=building) + + # Create geometry context + model_ctx = ifcopenshell.api.context.add_context(f, context_type="Model") + body = ifcopenshell.api.context.add_context( + f, context_type="Model", context_identifier="Body", target_view="MODEL_VIEW", parent=model_ctx + ) + + # Wall 1 at origin + wall1 = ifcopenshell.api.root.create_entity(f, ifc_class="IfcWall", name="Wall001") + rep1 = ifcopenshell.api.geometry.add_wall_representation(f, context=body, length=5, height=3, thickness=0.2) + ifcopenshell.api.geometry.assign_representation(f, product=wall1, representation=rep1) + ifcopenshell.api.spatial.assign_container(f, products=[wall1], relating_structure=storey) + + # Wall 2 perpendicular, crossing through wall 1 + wall2 = ifcopenshell.api.root.create_entity(f, ifc_class="IfcWall", name="Wall002") + rep2 = ifcopenshell.api.geometry.add_wall_representation(f, context=body, length=5, height=3, thickness=0.2) + ifcopenshell.api.geometry.assign_representation(f, product=wall2, representation=rep2) + ifcopenshell.api.spatial.assign_container(f, products=[wall2], relating_structure=storey) + matrix2 = np.array([[0, -1, 0, 2.5], [1, 0, 0, -2.0], [0, 0, 1, 0], [0, 0, 0, 1]], dtype=float) + ifcopenshell.api.geometry.edit_object_placement(f, product=wall2, matrix=matrix2) + + # Wall 3 far away (10m offset in Y) + wall3 = ifcopenshell.api.root.create_entity(f, ifc_class="IfcWall", name="Wall003") + rep3 = ifcopenshell.api.geometry.add_wall_representation(f, context=body, length=5, height=3, thickness=0.2) + ifcopenshell.api.geometry.assign_representation(f, product=wall3, representation=rep3) + ifcopenshell.api.spatial.assign_container(f, products=[wall3], relating_structure=storey) + matrix3 = np.eye(4) + matrix3[1, 3] = 10.0 # 10m in Y direction + ifcopenshell.api.geometry.edit_object_placement(f, product=wall3, matrix=matrix3) + + # Wall 4 close but not overlapping (0.3m offset in Y, wall thickness is 0.2m) + wall4 = ifcopenshell.api.root.create_entity(f, ifc_class="IfcWall", name="Wall004") + rep4 = ifcopenshell.api.geometry.add_wall_representation(f, context=body, length=5, height=3, thickness=0.2) + ifcopenshell.api.geometry.assign_representation(f, product=wall4, representation=rep4) + ifcopenshell.api.spatial.assign_container(f, products=[wall4], relating_structure=storey) + matrix4 = np.eye(4) + matrix4[1, 3] = 0.3 # 0.3m in Y (gap of 0.1m from wall1) + ifcopenshell.api.geometry.edit_object_placement(f, product=wall4, matrix=matrix4) + + return f + + +@pytest.fixture +def model_two_storeys(): + """Create a model with walls in different storeys.""" + f = ifcopenshell.api.project.create_file() + ifcopenshell.api.owner.settings.get_user = lambda ifc: (ifc.by_type("IfcPersonAndOrganization") or [None])[0] + ifcopenshell.api.owner.settings.get_application = lambda ifc: (ifc.by_type("IfcApplication") or [None])[0] + + project = ifcopenshell.api.root.create_entity(f, ifc_class="IfcProject", name="TestProject") + ifcopenshell.api.unit.assign_unit(f) + + site = ifcopenshell.api.root.create_entity(f, ifc_class="IfcSite", name="TestSite") + building = ifcopenshell.api.root.create_entity(f, ifc_class="IfcBuilding", name="TestBuilding") + storey1 = ifcopenshell.api.root.create_entity(f, ifc_class="IfcBuildingStorey", name="Ground Floor") + storey2 = ifcopenshell.api.root.create_entity(f, ifc_class="IfcBuildingStorey", name="First Floor") + + ifcopenshell.api.aggregate.assign_object(f, products=[site], relating_object=project) + ifcopenshell.api.aggregate.assign_object(f, products=[building], relating_object=site) + ifcopenshell.api.aggregate.assign_object(f, products=[storey1, storey2], relating_object=building) + + model_ctx = ifcopenshell.api.context.add_context(f, context_type="Model") + body = ifcopenshell.api.context.add_context( + f, context_type="Model", context_identifier="Body", target_view="MODEL_VIEW", parent=model_ctx + ) + + # Wall in storey 1 + wall1 = ifcopenshell.api.root.create_entity(f, ifc_class="IfcWall", name="GroundWall") + rep1 = ifcopenshell.api.geometry.add_wall_representation(f, context=body, length=5, height=3, thickness=0.2) + ifcopenshell.api.geometry.assign_representation(f, product=wall1, representation=rep1) + ifcopenshell.api.spatial.assign_container(f, products=[wall1], relating_structure=storey1) + + # Wall in storey 2, perpendicular and crossing wall1 + wall2 = ifcopenshell.api.root.create_entity(f, ifc_class="IfcWall", name="FirstFloorWall") + rep2 = ifcopenshell.api.geometry.add_wall_representation(f, context=body, length=5, height=3, thickness=0.2) + ifcopenshell.api.geometry.assign_representation(f, product=wall2, representation=rep2) + ifcopenshell.api.spatial.assign_container(f, products=[wall2], relating_structure=storey2) + matrix2 = np.array([[0, -1, 0, 2.5], [1, 0, 0, -2.0], [0, 0, 1, 0], [0, 0, 0, 1]], dtype=float) + ifcopenshell.api.geometry.edit_object_placement(f, product=wall2, matrix=matrix2) + + return f + + +class TestNoClashes: + def test_no_clashes_far_apart(self, model_with_geometry): + wall3 = next(w for w in model_with_geometry.by_type("IfcWall") if w.Name == "Wall003") + result = clash(model_with_geometry, wall3) + assert result["pass"] is True + assert result["checks"]["intersection"]["pass"] is True + assert result["checks"]["intersection"]["clashes"] == [] + + def test_no_clashes_empty_scope(self, model_with_geometry): + """A model where the element is the only one in scope should pass.""" + # Create a model with a single wall + f = ifcopenshell.api.project.create_file() + ifcopenshell.api.owner.settings.get_user = lambda ifc: (ifc.by_type("IfcPersonAndOrganization") or [None])[0] + ifcopenshell.api.owner.settings.get_application = lambda ifc: (ifc.by_type("IfcApplication") or [None])[0] + project = ifcopenshell.api.root.create_entity(f, ifc_class="IfcProject", name="P") + ifcopenshell.api.unit.assign_unit(f) + site = ifcopenshell.api.root.create_entity(f, ifc_class="IfcSite", name="S") + building = ifcopenshell.api.root.create_entity(f, ifc_class="IfcBuilding", name="B") + storey = ifcopenshell.api.root.create_entity(f, ifc_class="IfcBuildingStorey", name="GF") + ifcopenshell.api.aggregate.assign_object(f, products=[site], relating_object=project) + ifcopenshell.api.aggregate.assign_object(f, products=[building], relating_object=site) + ifcopenshell.api.aggregate.assign_object(f, products=[storey], relating_object=building) + model_ctx = ifcopenshell.api.context.add_context(f, context_type="Model") + body = ifcopenshell.api.context.add_context( + f, context_type="Model", context_identifier="Body", target_view="MODEL_VIEW", parent=model_ctx + ) + wall = ifcopenshell.api.root.create_entity(f, ifc_class="IfcWall", name="OnlyWall") + rep = ifcopenshell.api.geometry.add_wall_representation(f, context=body, length=5, height=3, thickness=0.2) + ifcopenshell.api.geometry.assign_representation(f, product=wall, representation=rep) + ifcopenshell.api.spatial.assign_container(f, products=[wall], relating_structure=storey) + + result = clash(f, wall) + assert result["pass"] is True + + +class TestIntersectionDetected: + def test_overlapping_walls(self, model_with_geometry): + wall1 = next(w for w in model_with_geometry.by_type("IfcWall") if w.Name == "Wall001") + result = clash(model_with_geometry, wall1) + assert result["pass"] is False + assert result["checks"]["intersection"]["pass"] is False + clashes = result["checks"]["intersection"]["clashes"] + assert len(clashes) > 0 + # Wall002 should be in the clashes (it overlaps wall1) + clash_ids = {c["element"]["id"] for c in clashes} + wall2 = next(w for w in model_with_geometry.by_type("IfcWall") if w.Name == "Wall002") + assert wall2.id() in clash_ids + + def test_clash_has_points(self, model_with_geometry): + wall1 = next(w for w in model_with_geometry.by_type("IfcWall") if w.Name == "Wall001") + result = clash(model_with_geometry, wall1) + clashes = result["checks"]["intersection"]["clashes"] + for c in clashes: + assert "p1" in c + assert "p2" in c + assert len(c["p1"]) == 3 + assert len(c["p2"]) == 3 + assert "type" in c + assert "distance" in c + + +class TestClearance: + def test_clearance_violation(self, model_with_geometry): + """Wall004 is 0.1m from wall1; clearance of 0.5m should fail.""" + wall1 = next(w for w in model_with_geometry.by_type("IfcWall") if w.Name == "Wall001") + result = clash(model_with_geometry, wall1, clearance=0.5) + assert "clearance" in result["checks"] + # Wall004 should violate clearance + clearance_clashes = result["checks"]["clearance"]["clashes"] + clash_ids = {c["element"]["id"] for c in clearance_clashes} + wall4 = next(w for w in model_with_geometry.by_type("IfcWall") if w.Name == "Wall004") + assert wall4.id() in clash_ids + assert result["checks"]["clearance"]["pass"] is False + + def test_clearance_pass(self, model_with_geometry): + """Wall003 is 10m away; clearance of 0.5m should pass for wall003.""" + wall3 = next(w for w in model_with_geometry.by_type("IfcWall") if w.Name == "Wall003") + result = clash(model_with_geometry, wall3, clearance=0.5) + assert result["checks"]["clearance"]["pass"] is True + assert result["checks"]["clearance"]["clashes"] == [] + + def test_clearance_not_included_by_default(self, model_with_geometry): + wall1 = next(w for w in model_with_geometry.by_type("IfcWall") if w.Name == "Wall001") + result = clash(model_with_geometry, wall1) + assert "clearance" not in result["checks"] + + +class TestScope: + def test_scope_storey_excludes_other_storeys(self, model_two_storeys): + wall1 = next(w for w in model_two_storeys.by_type("IfcWall") if w.Name == "GroundWall") + result = clash(model_two_storeys, wall1, scope="storey") + assert result["scope"] == "storey" + # No clashes because the overlapping wall is in a different storey + assert result["pass"] is True + + def test_scope_all_includes_other_storeys(self, model_two_storeys): + wall1 = next(w for w in model_two_storeys.by_type("IfcWall") if w.Name == "GroundWall") + result = clash(model_two_storeys, wall1, scope="all") + assert result["scope"] == "all" + # Should detect clash with the other-storey wall + assert result["pass"] is False + clash_ids = {c["element"]["id"] for c in result["checks"]["intersection"]["clashes"]} + wall2 = next(w for w in model_two_storeys.by_type("IfcWall") if w.Name == "FirstFloorWall") + assert wall2.id() in clash_ids + + +class TestNoGeometry: + def test_no_geometry_error(self, model): + """Element without geometry reports error.""" + wall = model.by_type("IfcWall")[0] + result = clash(model, wall) + assert result["pass"] is None + assert "error" in result + assert "No geometry" in result["error"] + + +class TestJsonSerializable: + def test_result_serializable(self, model_with_geometry): + wall1 = next(w for w in model_with_geometry.by_type("IfcWall") if w.Name == "Wall001") + result = clash(model_with_geometry, wall1) + serialized = json.dumps(result) + parsed = json.loads(serialized) + assert parsed["element"]["type"] == "IfcWall" + + def test_clearance_result_serializable(self, model_with_geometry): + wall1 = next(w for w in model_with_geometry.by_type("IfcWall") if w.Name == "Wall001") + result = clash(model_with_geometry, wall1, clearance=0.5) + serialized = json.dumps(result) + parsed = json.loads(serialized) + assert "clearance" in parsed["checks"] + + +class TestCLI: + @staticmethod + def _ifc_path(model): + f = tempfile.NamedTemporaryFile(suffix=".ifc", delete=False) + model.write(f.name) + f.close() + return f.name + + def test_clash_json(self, model_with_geometry): + path = self._ifc_path(model_with_geometry) + try: + wall1 = next(w for w in model_with_geometry.by_type("IfcWall") if w.Name == "Wall001") + result = subprocess.run( + [sys.executable, "-m", "ifcquery", path, "clash", str(wall1.id())], + capture_output=True, + text=True, + ) + assert result.returncode == 0 + data = json.loads(result.stdout) + assert data["element"]["type"] == "IfcWall" + assert "checks" in data + assert "intersection" in data["checks"] + finally: + os.unlink(path) + + def test_clash_with_clearance(self, model_with_geometry): + path = self._ifc_path(model_with_geometry) + try: + wall1 = next(w for w in model_with_geometry.by_type("IfcWall") if w.Name == "Wall001") + result = subprocess.run( + [sys.executable, "-m", "ifcquery", path, "clash", str(wall1.id()), "--clearance", "0.5"], + capture_output=True, + text=True, + ) + assert result.returncode == 0 + data = json.loads(result.stdout) + assert "clearance" in data["checks"] + finally: + os.unlink(path) + + def test_clash_scope_all(self, model_with_geometry): + path = self._ifc_path(model_with_geometry) + try: + wall1 = next(w for w in model_with_geometry.by_type("IfcWall") if w.Name == "Wall001") + result = subprocess.run( + [sys.executable, "-m", "ifcquery", path, "clash", str(wall1.id()), "--scope", "all"], + capture_output=True, + text=True, + ) + assert result.returncode == 0 + data = json.loads(result.stdout) + assert data["scope"] == "all" + finally: + os.unlink(path) + + def test_clash_bad_id(self, model_with_geometry): + path = self._ifc_path(model_with_geometry) + try: + result = subprocess.run( + [sys.executable, "-m", "ifcquery", path, "clash", "999999"], + capture_output=True, + text=True, + ) + assert result.returncode != 0 + assert "Error" in result.stderr + finally: + os.unlink(path) diff --git a/src/ifcquery/tests/test_contexts.py b/src/ifcquery/tests/test_contexts.py new file mode 100644 index 00000000000..c7a21acb961 --- /dev/null +++ b/src/ifcquery/tests/test_contexts.py @@ -0,0 +1,52 @@ +import ifcopenshell.api.context +import ifcopenshell.api.project +import ifcopenshell.api.root +import ifcopenshell.api.unit + +from ifcquery.contexts import contexts + + +class TestContexts: + def test_empty_model(self): + f = ifcopenshell.api.project.create_file() + result = contexts(f) + assert isinstance(result, list) + assert len(result) == 0 + + def test_model_context(self, model): + import ifcopenshell.api.context + + ifcopenshell.api.context.add_context(model, context_type="Model") + result = contexts(model) + assert len(result) == 1 + entry = result[0] + assert entry["type"] == "IfcGeometricRepresentationContext" + assert entry["context_type"] == "Model" + assert "id" in entry + assert "context_identifier" in entry + + def test_subcontext(self, model): + import ifcopenshell.api.context + + model_ctx = ifcopenshell.api.context.add_context(model, context_type="Model") + ifcopenshell.api.context.add_context( + model, + context_type="Model", + context_identifier="Body", + target_view="MODEL_VIEW", + parent=model_ctx, + ) + result = contexts(model) + assert len(result) == 2 + subctx = next(e for e in result if e["type"] == "IfcGeometricRepresentationSubContext") + assert subctx["context_identifier"] == "Body" + assert subctx["target_view"] == "MODEL_VIEW" + assert subctx["parent_context_id"] == model_ctx.id() + + def test_ids_are_integers(self, model): + import ifcopenshell.api.context + + ifcopenshell.api.context.add_context(model, context_type="Model") + result = contexts(model) + for entry in result: + assert isinstance(entry["id"], int) diff --git a/src/ifcquery/tests/test_cost.py b/src/ifcquery/tests/test_cost.py new file mode 100644 index 00000000000..1011beca0ae --- /dev/null +++ b/src/ifcquery/tests/test_cost.py @@ -0,0 +1,108 @@ +# This file was generated with the assistance of an AI coding tool. +from __future__ import annotations + +import ifcopenshell +import ifcopenshell.api.cost +import ifcopenshell.api.owner.settings +import ifcopenshell.api.project +import ifcopenshell.api.root +import ifcopenshell.api.unit +import pytest + +from ifcquery.cost import cost + + +@pytest.fixture +def cost_model(): + """Create an IFC4 model with a cost schedule, a top-level item, and one nested subitem.""" + f = ifcopenshell.api.project.create_file() + ifcopenshell.api.owner.settings.get_user = lambda ifc: (ifc.by_type("IfcPersonAndOrganization") or [None])[0] + ifcopenshell.api.owner.settings.get_application = lambda ifc: (ifc.by_type("IfcApplication") or [None])[0] + + project = ifcopenshell.api.root.create_entity(f, ifc_class="IfcProject", name="TestProject") + ifcopenshell.api.unit.assign_unit(f) + + cs = ifcopenshell.api.cost.add_cost_schedule(f, name="Bill of Quantities") + item = ifcopenshell.api.cost.add_cost_item(f, cost_schedule=cs) + ifcopenshell.api.cost.edit_cost_item(f, cost_item=item, attributes={"Name": "Concrete Works"}) + cv = ifcopenshell.api.cost.add_cost_value(f, parent=item) + ifcopenshell.api.cost.edit_cost_value(f, cost_value=cv, attributes={"AppliedValue": 1200.0, "Category": "material"}) + + # Add a nested subitem + subitem = ifcopenshell.api.cost.add_cost_item(f, cost_item=item) + ifcopenshell.api.cost.edit_cost_item(f, cost_item=subitem, attributes={"Name": "Formwork"}) + + return f + + +class TestCost: + def test_returns_list(self, cost_model): + result = cost(cost_model) + assert isinstance(result, list) + + def test_finds_cost_schedule(self, cost_model): + result = cost(cost_model) + assert len(result) == 1 + + def test_schedule_has_name(self, cost_model): + result = cost(cost_model) + assert result[0]["name"] == "Bill of Quantities" + + def test_schedule_has_id(self, cost_model): + result = cost(cost_model) + assert isinstance(result[0]["id"], int) + assert result[0]["id"] > 0 + + def test_schedule_has_items(self, cost_model): + result = cost(cost_model) + assert len(result[0]["items"]) == 1 + + def test_item_has_required_fields(self, cost_model): + result = cost(cost_model) + item = result[0]["items"][0] + assert "id" in item + assert "name" in item + assert "values" in item + assert "subitems" in item + + def test_item_name(self, cost_model): + result = cost(cost_model) + assert result[0]["items"][0]["name"] == "Concrete Works" + + def test_item_has_values(self, cost_model): + result = cost(cost_model) + values = result[0]["items"][0]["values"] + assert len(values) == 1 + assert "formula" in values[0] + assert "category" in values[0] + + def test_item_value_category(self, cost_model): + result = cost(cost_model) + values = result[0]["items"][0]["values"] + assert values[0]["category"] == "material" + + def test_empty_model_returns_empty_list(self, model): + result = cost(model) + assert result == [] + + def test_max_depth_none_returns_full_tree(self, cost_model): + result = cost(cost_model, max_depth=None) + item = result[0]["items"][0] + assert isinstance(item["subitems"], list) + assert len(item["subitems"]) == 1 + assert item["subitems"][0]["name"] == "Formwork" + + def test_max_depth_1_truncates_subitems(self, cost_model): + result = cost(cost_model, max_depth=1) + item = result[0]["items"][0] + assert isinstance(item["subitems"], dict) + assert item["subitems"]["truncated"] is True + assert item["subitems"]["count"] == 1 + + def test_max_depth_2_expands_to_depth_2(self, cost_model): + result = cost(cost_model, max_depth=2) + item = result[0]["items"][0] + assert isinstance(item["subitems"], list) + assert item["subitems"][0]["name"] == "Formwork" + # subitem has no children, so subitems should be empty list + assert item["subitems"][0]["subitems"] == [] diff --git a/src/ifcquery/tests/test_info.py b/src/ifcquery/tests/test_info.py new file mode 100644 index 00000000000..c17331a24d6 --- /dev/null +++ b/src/ifcquery/tests/test_info.py @@ -0,0 +1,112 @@ +# This file was generated with the assistance of an AI coding tool. +import ifcopenshell +import ifcopenshell.api.context +import ifcopenshell.api.geometry +import ifcopenshell.api.project +import ifcopenshell.api.root +import ifcopenshell.api.unit +import ifcopenshell.util.representation +import ifcopenshell.util.shape_builder + +from ifcquery.info import info + + +class TestInfo: + def test_basic_attributes(self, model): + wall = model.by_type("IfcWall")[0] + result = info(model, wall) + assert result["id"] == wall.id() + assert result["type"] == "IfcWall" + assert result["attributes"]["Name"] == "Wall001" + + def test_container(self, model): + wall = model.by_type("IfcWall")[0] + result = info(model, wall) + assert result["container"]["type"] == "IfcBuildingStorey" + assert result["container"]["name"] == "Ground Floor" + + def test_project_info(self, model): + project = model.by_type("IfcProject")[0] + result = info(model, project) + assert result["type"] == "IfcProject" + assert result["attributes"]["Name"] == "TestProject" + + def test_all_attributes_serializable(self, model): + """All attribute values should be JSON-serializable (no entity instances).""" + import json + + wall = model.by_type("IfcWall")[0] + result = info(model, wall) + # Should not raise + json.dumps(result) + + def test_no_geometry_summary_without_representation(self, model): + wall = model.by_type("IfcWall")[0] + result = info(model, wall) + assert "geometry_summary" not in result + + +class TestGeometrySummary: + def _make_model_with_wall(self): + f = ifcopenshell.api.project.create_file() + ifcopenshell.api.root.create_entity(f, ifc_class="IfcProject") + ifcopenshell.api.unit.assign_unit(f) + model_ctx = ifcopenshell.api.context.add_context(f, context_type="Model") + ifcopenshell.api.context.add_context( + f, + context_type="Model", + context_identifier="Body", + target_view="MODEL_VIEW", + parent=model_ctx, + ) + wall = ifcopenshell.api.root.create_entity(f, ifc_class="IfcWall", name="W1") + ifcopenshell.api.geometry.edit_object_placement(f, product=wall) + return f, wall + + def _body_context(self, f): + return ifcopenshell.util.representation.get_context(f, "Model", "Body", "MODEL_VIEW") + + def test_swept_solid_summary(self): + f, wall = self._make_model_with_wall() + body = self._body_context(f) + rep = ifcopenshell.api.geometry.add_wall_representation(f, context=body, length=5.0, height=3.0, thickness=0.2) + ifcopenshell.api.geometry.assign_representation(f, product=wall, representation=rep) + result = info(f, wall) + gs = result["geometry_summary"] + assert gs["representation_type"] == "SweptSolid" + assert len(gs["solids"]) == 1 + solid = gs["solids"][0] + assert solid["depth"] == 3000.0 # stored in project units (mm) + assert solid["profile"]["type"] == "IfcArbitraryClosedProfileDef" + assert len(solid["profile"]["points"]) == 5 # closed polyline + + def test_clipping_summary(self): + f, wall = self._make_model_with_wall() + body = self._body_context(f) + rep = ifcopenshell.api.geometry.add_wall_representation( + f, + context=body, + length=5.0, + height=4.0, + thickness=0.2, + clippings=[{"location": (0.0, 0.0, 3.0), "normal": (0.0, 0.0, 1.0)}], + ) + ifcopenshell.api.geometry.assign_representation(f, product=wall, representation=rep) + result = info(f, wall) + gs = result["geometry_summary"] + assert gs["representation_type"] == "Clipping" + solid = gs["solids"][0] + assert len(solid["clipping_planes"]) == 1 + plane = solid["clipping_planes"][0] + assert plane["location"][2] == 3000.0 # stored in project units (mm) + assert plane["normal"] == [0.0, 0.0, 1.0] + + def test_geometry_summary_json_serializable(self): + import json + + f, wall = self._make_model_with_wall() + body = self._body_context(f) + rep = ifcopenshell.api.geometry.add_wall_representation(f, context=body, length=5.0, height=3.0, thickness=0.2) + ifcopenshell.api.geometry.assign_representation(f, product=wall, representation=rep) + result = info(f, wall) + json.dumps(result) diff --git a/src/ifcquery/tests/test_main.py b/src/ifcquery/tests/test_main.py new file mode 100644 index 00000000000..164b93152d7 --- /dev/null +++ b/src/ifcquery/tests/test_main.py @@ -0,0 +1,121 @@ +# This file was generated with the assistance of an AI coding tool. +import json +import os +import subprocess +import sys +import tempfile + +import ifcopenshell +import ifcopenshell.api.project +import pytest + + +@pytest.fixture +def ifc_path(model): + """Write the model fixture to a temp file and return its path.""" + with tempfile.NamedTemporaryFile(suffix=".ifc", delete=False) as f: + model.write(f.name) + yield f.name + os.unlink(f.name) + + +def run_ifcquery(*args): + """Run ifcquery as a subprocess and return (returncode, stdout, stderr).""" + result = subprocess.run( + [sys.executable, "-m", "ifcquery", *args], + capture_output=True, + text=True, + ) + return result.returncode, result.stdout, result.stderr + + +class TestCLI: + def test_summary_json(self, ifc_path): + rc, stdout, stderr = run_ifcquery(ifc_path, "summary") + assert rc == 0 + data = json.loads(stdout) + assert data["schema"] == "IFC4" + assert "types" in data + + def test_tree_json(self, ifc_path): + rc, stdout, stderr = run_ifcquery(ifc_path, "tree") + assert rc == 0 + data = json.loads(stdout) + assert data["type"] == "IfcProject" + + def test_info_json(self, ifc_path, model): + wall = model.by_type("IfcWall")[0] + rc, stdout, stderr = run_ifcquery(ifc_path, "info", str(wall.id())) + assert rc == 0 + data = json.loads(stdout) + assert data["type"] == "IfcWall" + + def test_info_hash_id(self, ifc_path, model): + wall = model.by_type("IfcWall")[0] + rc, stdout, stderr = run_ifcquery(ifc_path, "info", f"#{wall.id()}") + assert rc == 0 + data = json.loads(stdout) + assert data["type"] == "IfcWall" + + def test_select_json(self, ifc_path): + rc, stdout, stderr = run_ifcquery(ifc_path, "select", "IfcWall") + assert rc == 0 + data = json.loads(stdout) + assert len(data) == 1 + assert data[0]["type"] == "IfcWall" + + def test_text_format(self, ifc_path): + rc, stdout, stderr = run_ifcquery(ifc_path, "--format", "text", "summary") + assert rc == 0 + assert "schema:" in stdout + + def test_bad_file(self): + rc, stdout, stderr = run_ifcquery("/nonexistent.ifc", "summary") + assert rc != 0 + assert "Error" in stderr + + def test_bad_element_id(self, ifc_path): + rc, stdout, stderr = run_ifcquery(ifc_path, "info", "999999") + assert rc != 0 + assert "Error" in stderr + + def test_no_command(self, ifc_path): + rc, stdout, stderr = run_ifcquery(ifc_path) + assert rc != 0 + + def test_select_ids_format(self, ifc_path): + rc, stdout, stderr = run_ifcquery(ifc_path, "--format", "ids", "select", "IfcWall") + assert rc == 0 + # Should be a comma-separated string of integers with no surrounding whitespace + ids = stdout.strip() + assert ids != "" + for part in ids.split(","): + assert part.isdigit() + + def test_select_ids_format_multiple(self, ifc_path, model): + rc, stdout, stderr = run_ifcquery(ifc_path, "--format", "ids", "select", "IfcElement") + assert rc == 0 + ids = stdout.strip().split(",") + assert len(ids) >= 2 + + def test_ids_format_empty_result(self, ifc_path): + rc, stdout, stderr = run_ifcquery(ifc_path, "--format", "ids", "select", "IfcDoor") + assert rc == 0 + assert stdout.strip() == "" + + def test_relations_ids_format(self, ifc_path, model): + storey = model.by_type("IfcBuildingStorey")[0] + rc, stdout, stderr = run_ifcquery(ifc_path, "--format", "ids", "relations", str(storey.id())) + assert rc == 0 + ids = stdout.strip().split(",") + assert all(i.isdigit() for i in ids) + # should include the storey itself and its contained elements + assert str(storey.id()) in ids + wall_id = str(model.by_type("IfcWall")[0].id()) + assert wall_id in ids + + def test_info_ids_format(self, ifc_path, model): + wall = model.by_type("IfcWall")[0] + rc, stdout, stderr = run_ifcquery(ifc_path, "--format", "ids", "info", str(wall.id())) + assert rc == 0 + assert stdout.strip() == str(wall.id()) diff --git a/src/ifcquery/tests/test_materials.py b/src/ifcquery/tests/test_materials.py new file mode 100644 index 00000000000..aa6886156fd --- /dev/null +++ b/src/ifcquery/tests/test_materials.py @@ -0,0 +1,52 @@ +import ifcopenshell.api.material +import ifcopenshell.api.project + +from ifcquery.materials import materials + + +class TestMaterials: + def test_empty_model(self, model): + result = materials(model) + assert isinstance(result, list) + assert len(result) == 0 + + def test_single_material(self, model): + ifcopenshell.api.material.add_material(model, name="Concrete", category="concrete") + result = materials(model) + assert len(result) == 1 + m = result[0] + assert m["type"] == "IfcMaterial" + assert m["name"] == "Concrete" + assert m["category"] == "concrete" + assert isinstance(m["id"], int) + + def test_material_layer_set(self, model): + mat = ifcopenshell.api.material.add_material(model, name="Brick") + layer_set = ifcopenshell.api.material.add_material_set(model, name="BrickSet", set_type="IfcMaterialLayerSet") + ifcopenshell.api.material.add_layer(model, layer_set=layer_set, material=mat) + result = materials(model) + layer_sets = [e for e in result if e["type"] == "IfcMaterialLayerSet"] + assert len(layer_sets) == 1 + ls = layer_sets[0] + assert ls["name"] == "BrickSet" + assert isinstance(ls["layers"], list) + assert len(ls["layers"]) == 1 + layer = ls["layers"][0] + assert layer["material"] == "Brick" + + def test_material_constituent_set(self, model): + mat = ifcopenshell.api.material.add_material(model, name="Steel") + cs = ifcopenshell.api.material.add_material_set(model, name="CompSet", set_type="IfcMaterialConstituentSet") + ifcopenshell.api.material.add_constituent(model, constituent_set=cs, material=mat) + result = materials(model) + constituent_sets = [e for e in result if e["type"] == "IfcMaterialConstituentSet"] + assert len(constituent_sets) == 1 + entry = constituent_sets[0] + assert entry["name"] == "CompSet" + assert isinstance(entry["constituents"], list) + + def test_ids_are_integers(self, model): + ifcopenshell.api.material.add_material(model, name="Wood") + result = materials(model) + for entry in result: + assert isinstance(entry["id"], int) diff --git a/src/ifcquery/tests/test_plot.py b/src/ifcquery/tests/test_plot.py new file mode 100644 index 00000000000..4c003ab9466 --- /dev/null +++ b/src/ifcquery/tests/test_plot.py @@ -0,0 +1,265 @@ +from __future__ import annotations + +import base64 +import os +import subprocess +import sys +import tempfile + +import ifcopenshell +import ifcopenshell.api.aggregate +import ifcopenshell.api.context +import ifcopenshell.api.geometry +import ifcopenshell.api.owner.settings +import ifcopenshell.api.project +import ifcopenshell.api.root +import ifcopenshell.api.spatial +import ifcopenshell.api.unit +import pytest + +from ifcquery.plot import _highlight_css_from_ids, plot + +try: + import ifcopenshell.draw # noqa: F401 + + HAS_DRAW = True +except ImportError: + HAS_DRAW = False + +try: + import cairosvg # noqa: F401 + + HAS_CAIROSVG = True +except ImportError: + HAS_CAIROSVG = False + +pytestmark = pytest.mark.skipif(not HAS_DRAW, reason="ifcopenshell.draw not available") + +SVG_MAGIC = b" elements, PNG/base64 should raise a clear error.""" + + def test_empty_drawing_png_raises(self, model_no_plan): + """PNG format raises ValueError (not silently returns None) for empty drawings.""" + model, _ = model_no_plan + svg = plot(model, output_format="svg") + has_groups = b"" in svg + if not has_groups: + pytest.raises(ValueError, plot, model, output_format="png") + else: + pytest.skip("Model produced non-empty SVG — empty path not triggered") + + def test_empty_drawing_base64_raises(self, model_no_plan): + """base64 format raises ValueError (not silently returns None) for empty drawings.""" + model, _ = model_no_plan + svg = plot(model, output_format="svg") + has_groups = b"" in svg + if not has_groups: + pytest.raises(ValueError, plot, model, output_format="base64") + else: + pytest.skip("Model produced non-empty SVG — empty path not triggered") + + +@pytest.mark.skipif(not HAS_CAIROSVG, reason="cairosvg not installed") +class TestPlotPNG: + """PNG and base64 require cairosvg.""" + + def test_png_returns_bytes_or_raises_on_empty(self, model_with_annotations): + model, _ = model_with_annotations + svg = plot(model, output_format="svg") + has_groups = b"" in svg + if has_groups: + result = plot(model, output_format="png") + assert isinstance(result, bytes) + assert result[:4] == PNG_MAGIC + else: + with pytest.raises(ValueError, match="No plan geometry"): + plot(model, output_format="png") + + def test_base64_returns_dict(self, model_with_annotations): + model, _ = model_with_annotations + svg = plot(model, output_format="svg") + has_groups = b"" in svg + if has_groups: + result = plot(model, output_format="base64") + assert isinstance(result, dict) + assert result["mime"] == "image/png" + assert "png_b64" in result + assert "width" in result + assert "height" in result + assert "view" in result + # Verify the base64 is valid PNG + decoded = base64.b64decode(result["png_b64"]) + assert decoded[:4] == PNG_MAGIC + else: + with pytest.raises(ValueError, match="No plan geometry"): + plot(model, output_format="base64") + + def test_base64_view_field_matches_requested(self, model_with_annotations): + model, _ = model_with_annotations + svg = plot(model, output_format="svg") + has_groups = b"" in svg + if not has_groups: + pytest.skip("Model produces empty SVG") + result = plot(model, output_format="base64", view="floorplan") + assert result["view"] == "floorplan" + + def test_png_custom_size(self, model_with_annotations): + model, _ = model_with_annotations + svg = plot(model, output_format="svg") + has_groups = b"" in svg + if not has_groups: + pytest.skip("Model produces empty SVG") + result = plot(model, output_format="png", png_width=512, png_height=512) + assert isinstance(result, bytes) + assert result[:4] == PNG_MAGIC + + +class TestCLI: + @staticmethod + def _ifc_path(model): + f = tempfile.NamedTemporaryFile(suffix=".ifc", delete=False) + model.write(f.name) + f.close() + return f.name + + def test_plot_svg_writes_file(self, model_with_annotations): + model, _ = model_with_annotations + ifc_path = self._ifc_path(model) + out_path = ifc_path.replace(".ifc", "_out.svg") + try: + result = subprocess.run( + [sys.executable, "-m", "ifcquery", ifc_path, "plot", "--out-format", "svg", "-o", out_path], + capture_output=True, + text=True, + ) + assert result.returncode == 0, result.stderr + assert os.path.exists(out_path) + with open(out_path, "rb") as f: + assert f.read(5) == SVG_MAGIC + finally: + for path in (ifc_path, out_path): + try: + os.unlink(path) + except OSError: + pass + + @pytest.mark.skipif(not HAS_CAIROSVG, reason="cairosvg not installed") + def test_plot_base64_prints_json(self, model_with_annotations): + """base64 format prints JSON to stdout instead of writing a file.""" + model, _ = model_with_annotations + ifc_path = self._ifc_path(model) + try: + # First check if the model would produce geometry + svg = plot(model, output_format="svg") + has_groups = b"" in svg + if not has_groups: + pytest.skip("Model produces empty SVG — base64 would raise ValueError") + + result = subprocess.run( + [sys.executable, "-m", "ifcquery", ifc_path, "plot", "--out-format", "base64"], + capture_output=True, + text=True, + ) + assert result.returncode == 0, result.stderr + # Output should be JSON (not an error) and contain base64 key + assert "png_b64" in result.stdout + finally: + try: + os.unlink(ifc_path) + except OSError: + pass diff --git a/src/ifcquery/tests/test_relations.py b/src/ifcquery/tests/test_relations.py new file mode 100644 index 00000000000..32bc8bf3cbd --- /dev/null +++ b/src/ifcquery/tests/test_relations.py @@ -0,0 +1,199 @@ +# This file was generated with the assistance of an AI coding tool. +import json +import os +import subprocess +import sys +import tempfile + +from ifcquery.relations import relations + + +class TestWallRelations: + def test_wall_has_container(self, model): + wall = model.by_type("IfcWall")[0] + result = relations(model, wall) + assert result["id"] == wall.id() + assert result["type"] == "IfcWall" + assert result["hierarchy"]["container"]["type"] == "IfcBuildingStorey" + assert result["hierarchy"]["container"]["name"] == "Ground Floor" + + def test_wall_has_parent(self, model): + wall = model.by_type("IfcWall")[0] + result = relations(model, wall) + assert result["hierarchy"]["parent"]["type"] == "IfcBuildingStorey" + + def test_wall_no_children(self, model): + wall = model.by_type("IfcWall")[0] + result = relations(model, wall) + assert "children" not in result + + def test_wall_empty_categories_omitted(self, model): + wall = model.by_type("IfcWall")[0] + result = relations(model, wall) + assert "groups" not in result + assert "systems" not in result + assert "zones" not in result + assert "connections" not in result + assert "referenced_structures" not in result + + +class TestStoreyRelations: + def test_storey_has_contained(self, model): + storey = model.by_type("IfcBuildingStorey")[0] + result = relations(model, storey) + contained_types = {e["type"] for e in result["children"]["contained"]} + assert "IfcWall" in contained_types + assert "IfcSlab" in contained_types + + def test_storey_has_aggregate_parent(self, model): + storey = model.by_type("IfcBuildingStorey")[0] + result = relations(model, storey) + assert result["hierarchy"]["aggregate"]["type"] == "IfcBuilding" + assert result["hierarchy"]["aggregate"]["name"] == "TestBuilding" + + +class TestProjectRelations: + def test_project_has_parts(self, model): + project = model.by_type("IfcProject")[0] + result = relations(model, project) + parts = result["children"]["parts"] + assert any(p["type"] == "IfcSite" for p in parts) + + def test_project_no_hierarchy(self, model): + project = model.by_type("IfcProject")[0] + result = relations(model, project) + assert "hierarchy" not in result + + +class TestTraverseUp: + def test_wall_to_project(self, model): + wall = model.by_type("IfcWall")[0] + chain = relations(model, wall, traverse="up") + assert isinstance(chain, list) + assert chain[0]["type"] == "IfcWall" + assert chain[-1]["type"] == "IfcProject" + types = [e["type"] for e in chain] + assert "IfcBuildingStorey" in types + assert "IfcBuilding" in types + assert "IfcSite" in types + + def test_project_traverse(self, model): + project = model.by_type("IfcProject")[0] + chain = relations(model, project, traverse="up") + assert len(chain) == 1 + assert chain[0]["type"] == "IfcProject" + + def test_storey_to_project(self, model): + storey = model.by_type("IfcBuildingStorey")[0] + chain = relations(model, storey, traverse="up") + assert chain[0]["type"] == "IfcBuildingStorey" + assert chain[-1]["type"] == "IfcProject" + assert len(chain) == 4 # storey -> building -> site -> project + + +class TestElementsSummary: + def test_wall_elements_includes_self(self, model): + wall = model.by_type("IfcWall")[0] + result = relations(model, wall) + ids = [e["id"] for e in result["elements"]] + assert wall.id() in ids + + def test_wall_elements_includes_container(self, model): + wall = model.by_type("IfcWall")[0] + result = relations(model, wall) + ids = [e["id"] for e in result["elements"]] + storey = model.by_type("IfcBuildingStorey")[0] + assert storey.id() in ids + + def test_storey_elements_includes_contained(self, model): + storey = model.by_type("IfcBuildingStorey")[0] + result = relations(model, storey) + ids = [e["id"] for e in result["elements"]] + wall = model.by_type("IfcWall")[0] + assert wall.id() in ids + + def test_elements_no_duplicates(self, model): + storey = model.by_type("IfcBuildingStorey")[0] + result = relations(model, storey) + ids = [e["id"] for e in result["elements"]] + assert len(ids) == len(set(ids)) + + def test_elements_all_have_id_and_type(self, model): + wall = model.by_type("IfcWall")[0] + result = relations(model, wall) + for e in result["elements"]: + assert "id" in e + assert "type" in e + + def test_traverse_up_has_no_elements_field(self, model): + wall = model.by_type("IfcWall")[0] + result = relations(model, wall, traverse="up") + assert isinstance(result, list) + assert not any("elements" in item for item in result) + + +class TestJsonSerializable: + def test_relations_serializable(self, model): + wall = model.by_type("IfcWall")[0] + result = relations(model, wall) + json.dumps(result) + + def test_traverse_serializable(self, model): + wall = model.by_type("IfcWall")[0] + result = relations(model, wall, traverse="up") + json.dumps(result) + + +class TestCLI: + @staticmethod + def _ifc_path(model): + f = tempfile.NamedTemporaryFile(suffix=".ifc", delete=False) + model.write(f.name) + f.close() + return f.name + + def test_relations_json(self, model): + path = self._ifc_path(model) + try: + wall = model.by_type("IfcWall")[0] + result = subprocess.run( + [sys.executable, "-m", "ifcquery", path, "relations", str(wall.id())], + capture_output=True, + text=True, + ) + assert result.returncode == 0 + data = json.loads(result.stdout) + assert data["type"] == "IfcWall" + assert "hierarchy" in data + finally: + os.unlink(path) + + def test_relations_traverse_up(self, model): + path = self._ifc_path(model) + try: + wall = model.by_type("IfcWall")[0] + result = subprocess.run( + [sys.executable, "-m", "ifcquery", path, "relations", str(wall.id()), "--traverse", "up"], + capture_output=True, + text=True, + ) + assert result.returncode == 0 + data = json.loads(result.stdout) + assert isinstance(data, list) + assert data[0]["type"] == "IfcWall" + assert data[-1]["type"] == "IfcProject" + finally: + os.unlink(path) + + def test_relations_bad_id(self, model): + path = self._ifc_path(model) + try: + result = subprocess.run( + [sys.executable, "-m", "ifcquery", path, "relations", "999999"], + capture_output=True, + text=True, + ) + assert result.returncode != 0 + assert "Error" in result.stderr + finally: + os.unlink(path) diff --git a/src/ifcquery/tests/test_render.py b/src/ifcquery/tests/test_render.py new file mode 100644 index 00000000000..28d83a6b68f --- /dev/null +++ b/src/ifcquery/tests/test_render.py @@ -0,0 +1,355 @@ +# This file was generated with the assistance of an AI coding tool. +import os +import subprocess +import sys +import tempfile + +import ifcopenshell +import ifcopenshell.api.aggregate +import ifcopenshell.api.context +import ifcopenshell.api.geometry +import ifcopenshell.api.owner.settings +import ifcopenshell.api.project +import ifcopenshell.api.root +import ifcopenshell.api.spatial +import ifcopenshell.api.unit +import ifcopenshell.guid +import numpy as np +import pytest + +from ifcquery.render import _make_profile_occurrence, _make_type_occurrence, render + +try: + import pyvista # noqa: F401 + + HAS_PYVISTA = True +except ImportError: + HAS_PYVISTA = False + +pytestmark = pytest.mark.skipif(not HAS_PYVISTA, reason="pyvista not installed") + +PNG_MAGIC = b"\x89PNG" + + +@pytest.fixture +def model_with_geometry(): + """Create an IFC4 model with walls that have geometric representations.""" + f = ifcopenshell.api.project.create_file() + ifcopenshell.api.owner.settings.get_user = lambda ifc: (ifc.by_type("IfcPersonAndOrganization") or [None])[0] + ifcopenshell.api.owner.settings.get_application = lambda ifc: (ifc.by_type("IfcApplication") or [None])[0] + + project = ifcopenshell.api.root.create_entity(f, ifc_class="IfcProject", name="TestProject") + ifcopenshell.api.unit.assign_unit(f) + + site = ifcopenshell.api.root.create_entity(f, ifc_class="IfcSite", name="TestSite") + building = ifcopenshell.api.root.create_entity(f, ifc_class="IfcBuilding", name="TestBuilding") + storey = ifcopenshell.api.root.create_entity(f, ifc_class="IfcBuildingStorey", name="Ground Floor") + + ifcopenshell.api.aggregate.assign_object(f, products=[site], relating_object=project) + ifcopenshell.api.aggregate.assign_object(f, products=[building], relating_object=site) + ifcopenshell.api.aggregate.assign_object(f, products=[storey], relating_object=building) + + model_ctx = ifcopenshell.api.context.add_context(f, context_type="Model") + body = ifcopenshell.api.context.add_context( + f, context_type="Model", context_identifier="Body", target_view="MODEL_VIEW", parent=model_ctx + ) + + wall1 = ifcopenshell.api.root.create_entity(f, ifc_class="IfcWall", name="Wall001") + rep1 = ifcopenshell.api.geometry.add_wall_representation(f, context=body, length=5, height=3, thickness=0.2) + ifcopenshell.api.geometry.assign_representation(f, product=wall1, representation=rep1) + ifcopenshell.api.spatial.assign_container(f, products=[wall1], relating_structure=storey) + + wall2 = ifcopenshell.api.root.create_entity(f, ifc_class="IfcWall", name="Wall002") + rep2 = ifcopenshell.api.geometry.add_wall_representation(f, context=body, length=4, height=3, thickness=0.2) + ifcopenshell.api.geometry.assign_representation(f, product=wall2, representation=rep2) + ifcopenshell.api.spatial.assign_container(f, products=[wall2], relating_structure=storey) + matrix2 = np.eye(4) + matrix2[1, 3] = 3.0 + ifcopenshell.api.geometry.edit_object_placement(f, product=wall2, matrix=matrix2) + + return f + + +@pytest.fixture +def library_with_type(): + """IFC4 library file: a WallType with a RepresentationMap but no instances.""" + f = ifcopenshell.api.project.create_file() + ifcopenshell.api.owner.settings.get_user = lambda ifc: (ifc.by_type("IfcPersonAndOrganization") or [None])[0] + ifcopenshell.api.owner.settings.get_application = lambda ifc: (ifc.by_type("IfcApplication") or [None])[0] + + project = ifcopenshell.api.root.create_entity(f, ifc_class="IfcProject", name="LibProject") + ifcopenshell.api.unit.assign_unit(f) + + model_ctx = ifcopenshell.api.context.add_context(f, context_type="Model") + body = ifcopenshell.api.context.add_context( + f, context_type="Model", context_identifier="Body", target_view="MODEL_VIEW", parent=model_ctx + ) + + # Build the shape representation and wrap it in an IfcRepresentationMap. + shape_rep = ifcopenshell.api.geometry.add_wall_representation(f, context=body, length=3, height=2.5, thickness=0.2) + origin = f.create_entity("IfcCartesianPoint", Coordinates=(0.0, 0.0, 0.0)) + z_dir = f.create_entity("IfcDirection", DirectionRatios=(0.0, 0.0, 1.0)) + x_dir = f.create_entity("IfcDirection", DirectionRatios=(1.0, 0.0, 0.0)) + map_origin = f.create_entity("IfcAxis2Placement3D", Location=origin, Axis=z_dir, RefDirection=x_dir) + rep_map = f.create_entity("IfcRepresentationMap", MappingOrigin=map_origin, MappedRepresentation=shape_rep) + + wall_type = ifcopenshell.api.root.create_entity(f, ifc_class="IfcWallType", name="LibWallType") + wall_type.RepresentationMaps = [rep_map] + + return f, wall_type + + +@pytest.fixture +def library_with_profile_type(): + """IFC4 library: a BeamType with an IfcMaterialProfileSet but no RepresentationMaps.""" + f = ifcopenshell.api.project.create_file() + ifcopenshell.api.owner.settings.get_user = lambda ifc: (ifc.by_type("IfcPersonAndOrganization") or [None])[0] + ifcopenshell.api.owner.settings.get_application = lambda ifc: (ifc.by_type("IfcApplication") or [None])[0] + + project = ifcopenshell.api.root.create_entity(f, ifc_class="IfcProject", name="ProfileLibProject") + ifcopenshell.api.unit.assign_unit(f) + + model_ctx = ifcopenshell.api.context.add_context(f, context_type="Model") + ifcopenshell.api.context.add_context( + f, context_type="Model", context_identifier="Body", target_view="MODEL_VIEW", parent=model_ctx + ) + + # Rectangular profile 0.2m x 0.3m + profile = f.create_entity( + "IfcRectangleProfileDef", + ProfileType="AREA", + ProfileName="200x300", + XDim=0.2, + YDim=0.3, + ) + material = f.create_entity("IfcMaterial", Name="Steel") + mat_profile = f.create_entity("IfcMaterialProfile", Material=material, Profile=profile) + profile_set = f.create_entity("IfcMaterialProfileSet", MaterialProfiles=[mat_profile]) + + beam_type = ifcopenshell.api.root.create_entity(f, ifc_class="IfcBeamType", name="200x300 Steel Beam") + rel = f.create_entity( + "IfcRelAssociatesMaterial", + GlobalId=ifcopenshell.guid.new(), + RelatedObjects=[beam_type], + RelatingMaterial=profile_set, + ) + + return f, beam_type + + +class TestRenderBasic: + def test_returns_png_bytes(self, model_with_geometry): + result = render(model_with_geometry) + assert isinstance(result, bytes) + assert result[:4] == PNG_MAGIC + + def test_iso_view(self, model_with_geometry): + result = render(model_with_geometry, view="iso") + assert result[:4] == PNG_MAGIC + + def test_top_view(self, model_with_geometry): + result = render(model_with_geometry, view="top") + assert result[:4] == PNG_MAGIC + + def test_south_view(self, model_with_geometry): + result = render(model_with_geometry, view="south") + assert result[:4] == PNG_MAGIC + + def test_unknown_view_falls_back_to_iso(self, model_with_geometry): + # Unknown view strings fall through to isometric + result = render(model_with_geometry, view="diagonal") + assert result[:4] == PNG_MAGIC + + +class TestRenderSelector: + def test_selector_restricts_elements(self, model_with_geometry): + result = render(model_with_geometry, selector="IfcWall") + assert result[:4] == PNG_MAGIC + + def test_selector_no_match_raises(self, model_with_geometry): + with pytest.raises(ValueError, match="matched no elements"): + render(model_with_geometry, selector="IfcDoor") + + +class TestRenderHighlight: + def test_highlight_single_element(self, model_with_geometry): + wall = model_with_geometry.by_type("IfcWall")[0] + result = render(model_with_geometry, element_ids=[wall.id()]) + assert result[:4] == PNG_MAGIC + + def test_highlight_multiple_elements(self, model_with_geometry): + walls = model_with_geometry.by_type("IfcWall") + result = render(model_with_geometry, element_ids=[w.id() for w in walls]) + assert result[:4] == PNG_MAGIC + + +class TestRenderTypes: + def test_render_type_by_selector(self, library_with_type): + """Selecting a type class renders its RepresentationMap geometry.""" + model, wall_type = library_with_type + result = render(model, selector="IfcWallType") + assert result[:4] == PNG_MAGIC + + def test_render_type_by_element_id(self, library_with_type): + """Passing a type step-ID via element_ids renders it highlighted.""" + model, wall_type = library_with_type + result = render(model, element_ids=[wall_type.id()]) + assert result[:4] == PNG_MAGIC + + def test_original_model_unmodified(self, library_with_type): + """Rendering a type must not add entities to the original model.""" + model, wall_type = library_with_type + entity_count_before = len(list(model)) + render(model, selector="IfcWallType") + assert len(list(model)) == entity_count_before + + def test_make_type_occurrence_no_rep_maps(self, library_with_type): + """_make_type_occurrence returns None for a type with no RepresentationMaps.""" + model, _ = library_with_type + bare_type = ifcopenshell.api.root.create_entity(model, ifc_class="IfcWallType", name="Bare") + assert _make_type_occurrence(model, bare_type) is None + + def test_type_without_rep_maps_raises(self): + """Selecting a type that has no RepresentationMaps raises ValueError.""" + f = ifcopenshell.api.project.create_file() + ifcopenshell.api.owner.settings.get_user = lambda ifc: (ifc.by_type("IfcPersonAndOrganization") or [None])[0] + ifcopenshell.api.owner.settings.get_application = lambda ifc: (ifc.by_type("IfcApplication") or [None])[0] + ifcopenshell.api.root.create_entity(f, ifc_class="IfcProject", name="P") + ifcopenshell.api.unit.assign_unit(f) + ifcopenshell.api.root.create_entity(f, ifc_class="IfcWallType", name="Bare") + with pytest.raises(ValueError): + render(f, selector="IfcWallType") + + +class TestRenderProfileTypes: + def test_render_profile_type_by_element_id(self, library_with_profile_type): + """A type with only a material profile set renders via temporary extrusion.""" + model, beam_type = library_with_profile_type + result = render(model, element_ids=[beam_type.id()]) + assert result[:4] == PNG_MAGIC + + def test_make_profile_occurrence_creates_occurrence(self, library_with_profile_type): + """_make_profile_occurrence returns an occurrence entity for a profile-set type.""" + model, beam_type = library_with_profile_type + occ = _make_profile_occurrence(model, beam_type) + assert occ is not None + + def test_make_profile_occurrence_no_profile_returns_none(self, library_with_type): + """_make_profile_occurrence returns None when type has no material profile set.""" + model, wall_type = library_with_type + # wall_type has RepresentationMaps but no material profile set + occ = _make_profile_occurrence(model, wall_type) + assert occ is None + + def test_original_model_unmodified_for_profile_type(self, library_with_profile_type): + """Rendering a profile-based type does not modify the original model.""" + model, beam_type = library_with_profile_type + entity_count_before = len(list(model)) + render(model, element_ids=[beam_type.id()]) + assert len(list(model)) == entity_count_before + + +class TestRenderNoGeometry: + def test_no_geometry_raises(self): + """A model without geometry representations raises ValueError.""" + f = ifcopenshell.api.project.create_file() + ifcopenshell.api.owner.settings.get_user = lambda ifc: (ifc.by_type("IfcPersonAndOrganization") or [None])[0] + ifcopenshell.api.owner.settings.get_application = lambda ifc: (ifc.by_type("IfcApplication") or [None])[0] + project = ifcopenshell.api.root.create_entity(f, ifc_class="IfcProject", name="P") + ifcopenshell.api.unit.assign_unit(f) + site = ifcopenshell.api.root.create_entity(f, ifc_class="IfcSite", name="S") + building = ifcopenshell.api.root.create_entity(f, ifc_class="IfcBuilding", name="B") + storey = ifcopenshell.api.root.create_entity(f, ifc_class="IfcBuildingStorey", name="GF") + ifcopenshell.api.aggregate.assign_object(f, products=[site], relating_object=project) + ifcopenshell.api.aggregate.assign_object(f, products=[building], relating_object=site) + ifcopenshell.api.aggregate.assign_object(f, products=[storey], relating_object=building) + wall = ifcopenshell.api.root.create_entity(f, ifc_class="IfcWall", name="Wallless") + ifcopenshell.api.spatial.assign_container(f, products=[wall], relating_structure=storey) + + with pytest.raises(ValueError, match="No renderable geometry"): + render(f) + + +class TestCLI: + @staticmethod + def _ifc_path(model): + f = tempfile.NamedTemporaryFile(suffix=".ifc", delete=False) + model.write(f.name) + f.close() + return f.name + + def test_render_writes_png(self, model_with_geometry): + ifc_path = self._ifc_path(model_with_geometry) + out_path = ifc_path.replace(".ifc", "_out.png") + try: + result = subprocess.run( + [sys.executable, "-m", "ifcquery", ifc_path, "render", "-o", out_path], + capture_output=True, + text=True, + ) + assert result.returncode == 0, result.stderr + assert os.path.exists(out_path) + with open(out_path, "rb") as f: + assert f.read(4) == PNG_MAGIC + finally: + for path in (ifc_path, out_path): + try: + os.unlink(path) + except OSError: + pass + + def test_render_default_output_path(self, model_with_geometry): + ifc_path = self._ifc_path(model_with_geometry) + expected_png = ifc_path.replace(".ifc", ".png") + try: + result = subprocess.run( + [sys.executable, "-m", "ifcquery", ifc_path, "render"], + capture_output=True, + text=True, + ) + assert result.returncode == 0, result.stderr + assert os.path.exists(expected_png) + finally: + for path in (ifc_path, expected_png): + try: + os.unlink(path) + except OSError: + pass + + def test_render_with_selector(self, model_with_geometry): + ifc_path = self._ifc_path(model_with_geometry) + out_path = ifc_path.replace(".ifc", "_sel.png") + try: + result = subprocess.run( + [sys.executable, "-m", "ifcquery", ifc_path, "render", "-o", out_path, "--selector", "IfcWall"], + capture_output=True, + text=True, + ) + assert result.returncode == 0, result.stderr + with open(out_path, "rb") as f: + assert f.read(4) == PNG_MAGIC + finally: + for path in (ifc_path, out_path): + try: + os.unlink(path) + except OSError: + pass + + def test_render_with_view(self, model_with_geometry): + ifc_path = self._ifc_path(model_with_geometry) + out_path = ifc_path.replace(".ifc", "_top.png") + try: + result = subprocess.run( + [sys.executable, "-m", "ifcquery", ifc_path, "render", "-o", out_path, "--view", "top"], + capture_output=True, + text=True, + ) + assert result.returncode == 0, result.stderr + with open(out_path, "rb") as f: + assert f.read(4) == PNG_MAGIC + finally: + for path in (ifc_path, out_path): + try: + os.unlink(path) + except OSError: + pass diff --git a/src/ifcquery/tests/test_schedule.py b/src/ifcquery/tests/test_schedule.py new file mode 100644 index 00000000000..0d3a3e934fb --- /dev/null +++ b/src/ifcquery/tests/test_schedule.py @@ -0,0 +1,121 @@ +# This file was generated with the assistance of an AI coding tool. +from __future__ import annotations + +import ifcopenshell +import ifcopenshell.api.aggregate +import ifcopenshell.api.owner.settings +import ifcopenshell.api.project +import ifcopenshell.api.root +import ifcopenshell.api.sequence +import ifcopenshell.api.unit +import pytest + +from ifcquery.schedule import schedule + + +@pytest.fixture +def schedule_model(): + """Create an IFC4 model with a work schedule and nested tasks.""" + f = ifcopenshell.api.project.create_file() + ifcopenshell.api.owner.settings.get_user = lambda ifc: (ifc.by_type("IfcPersonAndOrganization") or [None])[0] + ifcopenshell.api.owner.settings.get_application = lambda ifc: (ifc.by_type("IfcApplication") or [None])[0] + + project = ifcopenshell.api.root.create_entity(f, ifc_class="IfcProject", name="TestProject") + ifcopenshell.api.unit.assign_unit(f) + + ws = ifcopenshell.api.sequence.add_work_schedule(f, name="Construction Schedule") + + task1 = ifcopenshell.api.sequence.add_task(f, work_schedule=ws, name="Phase 1", identification="P1") + tt1 = ifcopenshell.api.sequence.add_task_time(f, task=task1) + ifcopenshell.api.sequence.edit_task_time( + f, task_time=tt1, attributes={"ScheduleStart": "2024-01-01", "ScheduleFinish": "2024-06-30"} + ) + + task2 = ifcopenshell.api.sequence.add_task(f, work_schedule=ws, name="Phase 2", identification="P2") + subtask = ifcopenshell.api.sequence.add_task(f, parent_task=task1, name="Sub Task", identification="S1") + + return f + + +class TestSchedule: + def test_returns_list(self, schedule_model): + result = schedule(schedule_model) + assert isinstance(result, list) + + def test_finds_work_schedule(self, schedule_model): + result = schedule(schedule_model) + assert len(result) == 1 + + def test_work_schedule_has_name(self, schedule_model): + result = schedule(schedule_model) + assert result[0]["name"] == "Construction Schedule" + + def test_work_schedule_has_id(self, schedule_model): + result = schedule(schedule_model) + assert isinstance(result[0]["id"], int) + assert result[0]["id"] > 0 + + def test_work_schedule_has_tasks(self, schedule_model): + result = schedule(schedule_model) + tasks = result[0]["tasks"] + assert isinstance(tasks, list) + assert len(tasks) >= 1 + + def test_task_has_required_fields(self, schedule_model): + result = schedule(schedule_model) + task = result[0]["tasks"][0] + assert "id" in task + assert "name" in task + assert "start" in task + assert "finish" in task + assert "is_milestone" in task + assert "outputs" in task + assert "subtasks" in task + + def test_task_name(self, schedule_model): + result = schedule(schedule_model) + task_names = [t["name"] for t in result[0]["tasks"]] + assert "Phase 1" in task_names + + def test_task_start_finish(self, schedule_model): + result = schedule(schedule_model) + phase1 = next(t for t in result[0]["tasks"] if t["name"] == "Phase 1") + assert phase1["start"] is not None + assert phase1["finish"] is not None + + def test_subtasks(self, schedule_model): + result = schedule(schedule_model) + phase1 = next(t for t in result[0]["tasks"] if t["name"] == "Phase 1") + assert len(phase1["subtasks"]) == 1 + assert phase1["subtasks"][0]["name"] == "Sub Task" + + def test_empty_model_returns_empty_list(self, model): + result = schedule(model) + assert result == [] + + def test_max_depth_none_returns_full_tree(self, schedule_model): + result = schedule(schedule_model, max_depth=None) + phase1 = next(t for t in result[0]["tasks"] if t["name"] == "Phase 1") + assert isinstance(phase1["subtasks"], list) + assert len(phase1["subtasks"]) == 1 + + def test_max_depth_1_truncates_subtasks(self, schedule_model): + result = schedule(schedule_model, max_depth=1) + phase1 = next(t for t in result[0]["tasks"] if t["name"] == "Phase 1") + assert isinstance(phase1["subtasks"], dict) + assert phase1["subtasks"]["truncated"] is True + assert phase1["subtasks"]["count"] == 1 + + def test_max_depth_truncation_shows_count(self, schedule_model): + result = schedule(schedule_model, max_depth=1) + # Phase 2 has no subtasks — should return empty list, not truncation dict + phase2 = next(t for t in result[0]["tasks"] if t["name"] == "Phase 2") + assert phase2["subtasks"] == [] + + def test_max_depth_2_expands_to_depth_2(self, schedule_model): + result = schedule(schedule_model, max_depth=2) + phase1 = next(t for t in result[0]["tasks"] if t["name"] == "Phase 1") + # subtask at depth 2 should be fully expanded (it has no children) + assert isinstance(phase1["subtasks"], list) + assert phase1["subtasks"][0]["name"] == "Sub Task" + assert phase1["subtasks"][0]["subtasks"] == [] diff --git a/src/ifcquery/tests/test_schema.py b/src/ifcquery/tests/test_schema.py new file mode 100644 index 00000000000..c4f63344eeb --- /dev/null +++ b/src/ifcquery/tests/test_schema.py @@ -0,0 +1,32 @@ +# This file was generated with the assistance of an AI coding tool. +from __future__ import annotations + +import pytest + +from ifcquery.schema import schema + + +class TestSchema: + def test_ifc_wall_has_description(self, model): + result = schema(model, "IfcWall") + assert "description" in result + assert isinstance(result["description"], str) + assert len(result["description"]) > 0 + + def test_ifc_wall_has_attributes(self, model): + result = schema(model, "IfcWall") + assert "attributes" in result + + def test_ifc_wall_has_spec_url(self, model): + result = schema(model, "IfcWall") + assert "spec_url" in result + + def test_unknown_entity_returns_error(self, model): + result = schema(model, "IfcNonExistentFooBar") + assert "error" in result + assert "IfcNonExistentFooBar" in result["error"] + + def test_ifc_window_has_description(self, model): + result = schema(model, "IfcWindow") + assert "description" in result + assert len(result["description"]) > 0 diff --git a/src/ifcquery/tests/test_select.py b/src/ifcquery/tests/test_select.py new file mode 100644 index 00000000000..d5700a38e65 --- /dev/null +++ b/src/ifcquery/tests/test_select.py @@ -0,0 +1,32 @@ +# This file was generated with the assistance of an AI coding tool. +from ifcquery.select import select + + +class TestSelect: + def test_select_by_type(self, model): + result = select(model, "IfcWall") + assert len(result) == 1 + assert result[0]["type"] == "IfcWall" + assert result[0]["name"] == "Wall001" + + def test_select_multiple_types(self, model): + result = select(model, "IfcWall, IfcSlab") + assert len(result) == 2 + types = {r["type"] for r in result} + assert types == {"IfcWall", "IfcSlab"} + + def test_select_no_match(self, model): + result = select(model, "IfcDoor") + assert result == [] + + def test_results_sorted_by_id(self, model): + result = select(model, "IfcWall, IfcSlab") + ids = [r["id"] for r in result] + assert ids == sorted(ids) + + def test_result_has_id_type_name(self, model): + result = select(model, "IfcWall") + entry = result[0] + assert "id" in entry + assert "type" in entry + assert "name" in entry diff --git a/src/ifcquery/tests/test_summary.py b/src/ifcquery/tests/test_summary.py new file mode 100644 index 00000000000..c230b48ab75 --- /dev/null +++ b/src/ifcquery/tests/test_summary.py @@ -0,0 +1,34 @@ +# This file was generated with the assistance of an AI coding tool. +import ifcopenshell +import ifcopenshell.api.project + +from ifcquery.summary import summary + + +class TestSummary: + def test_schema(self, model): + result = summary(model) + assert result["schema"] == "IFC4" + + def test_total_entities(self, model): + result = summary(model) + assert result["total_entities"] == len(list(model)) + assert result["total_entities"] > 0 + + def test_project_info(self, model): + result = summary(model) + assert result["project"]["name"] == "TestProject" + + def test_type_counts(self, model): + result = summary(model) + types = result["types"] + assert "IfcWall" in types + assert types["IfcWall"] == 1 + assert "IfcSlab" in types + assert types["IfcSlab"] == 1 + + def test_empty_model(self): + f = ifcopenshell.api.project.create_file() + result = summary(f) + assert result["schema"] == "IFC4" + assert "project" not in result diff --git a/src/ifcquery/tests/test_tree.py b/src/ifcquery/tests/test_tree.py new file mode 100644 index 00000000000..2110be31884 --- /dev/null +++ b/src/ifcquery/tests/test_tree.py @@ -0,0 +1,37 @@ +# This file was generated with the assistance of an AI coding tool. +from ifcquery.tree import tree + + +class TestTree: + def test_root_is_project(self, model): + result = tree(model) + assert result["type"] == "IfcProject" + assert result["name"] == "TestProject" + + def test_spatial_hierarchy(self, model): + result = tree(model) + # Project > Site > Building > Storey + site = result["children"][0] + assert site["type"] == "IfcSite" + assert site["name"] == "TestSite" + + building = site["children"][0] + assert building["type"] == "IfcBuilding" + assert building["name"] == "TestBuilding" + + storey = building["children"][0] + assert storey["type"] == "IfcBuildingStorey" + assert storey["name"] == "Ground Floor" + + def test_contained_elements(self, model): + result = tree(model) + storey = result["children"][0]["children"][0]["children"][0] + elements = storey["elements"] + element_types = {e["type"] for e in elements} + assert "IfcWall" in element_types + assert "IfcSlab" in element_types + + def test_element_ids_present(self, model): + result = tree(model) + assert "id" in result + assert isinstance(result["id"], int) diff --git a/src/ifcquery/tests/test_validate.py b/src/ifcquery/tests/test_validate.py new file mode 100644 index 00000000000..44734ce4b0b --- /dev/null +++ b/src/ifcquery/tests/test_validate.py @@ -0,0 +1,47 @@ +# This file was generated with the assistance of an AI coding tool. +from __future__ import annotations + +import ifcopenshell +import ifcopenshell.api.project +import pytest + +from ifcquery.validate import validate + + +class TestValidate: + def test_valid_model_returns_valid_true(self, model): + result = validate(model) + assert result["valid"] is True + assert isinstance(result["issues"], list) + + def test_valid_model_has_no_issues(self, model): + result = validate(model) + assert result["issues"] == [] + + def test_empty_model_is_valid(self): + f = ifcopenshell.api.project.create_file() + result = validate(f) + assert result["valid"] is True + assert result["issues"] == [] + + def test_result_has_expected_keys(self, model): + result = validate(model) + assert "valid" in result + assert "issues" in result + + def test_express_rules_flag_accepted(self, model): + # Just verify it runs without error; express rules may add/not add issues + result = validate(model, express_rules=True) + assert "valid" in result + assert isinstance(result["issues"], list) + + def test_issue_has_level_and_message(self, model): + # Force an issue by manually breaking the model (invalid IfcWall attribute) + f = ifcopenshell.file() + # Create a raw IfcWall with deliberately wrong type for GlobalId (use int) + # We just check structure if any issues appear; on well-formed models there are none. + result = validate(model) + # Even if no issues, the structure contract must hold for any issues present + for issue in result["issues"]: + assert "level" in issue + assert "message" in issue diff --git a/src/ifcsverchok/__init__.py b/src/ifcsverchok/__init__.py index 660ea6f707d..2355ab67834 100644 --- a/src/ifcsverchok/__init__.py +++ b/src/ifcsverchok/__init__.py @@ -81,7 +81,7 @@ def ensure_addons_are_enabled(*addon_names: str) -> None: from sverchok.ui.nodeview_space_menu import add_node_menu -def nodes_index(): +def nodes_index() -> list[tuple[str, list[tuple[str, str]]]]: return [ ( "IFC", @@ -111,15 +111,27 @@ def nodes_index(): ("ifc.create_project", "SvIfcCreateProject"), ("ifc.quick_project_setup", "SvIfcQuickProjectSetup"), ], - ) + ), + ( + "IFC Shape Builder", + [ + ("ifc.shape_builder.rectangle", "SvIfcSbRectangle"), + ("ifc.shape_builder.extrude", "SvIfcSbExtrude"), + ("ifc.shape_builder.representation", "SvIfcSbRepresentation"), + ("ifc.shape_builder.test", "SvIfcSbTest"), + ("ifc.shape_builder.shape_output", "SvSbShapeOutput"), + ("ifc.shape_builder.mesh", "SvSbMesh"), + ("ifc.shape_builder.polyline", "SvSbPolyline"), + ], + ), ] def make_node_categories() -> list[dict[str, list[str]]]: - node_categories = [{}] + node_categories: list[dict[str, list[str]]] = [] for category, nodes in nodes_index(): nodes = [node_name for idname, node_name in nodes] - node_categories[0][category] = nodes + node_categories.append({category: nodes}) return node_categories @@ -144,7 +156,6 @@ def make_node_list(): from os.path import splitext import ifcopenshell -import ifcopenshell.api import ifcopenshell.api.aggregate import ifcopenshell.api.root import ifcopenshell.api.spatial @@ -156,11 +167,11 @@ def make_node_list(): class IFC_Sv_UpdateCurrent(bpy.types.Operator): """Update current Sverchok node tree. - Will reset transient IFC file. - """ + Will reset transient IFC file""" bl_idname = "ifc.sverchok_update_current" bl_label = "Update Current Node Tree" + # bl_description = "Update current Sverchok node tree, resetting transient IFC file." bl_options = {"REGISTER", "UNDO", "INTERNAL"} node_group: bpy.props.StringProperty(default="") @@ -287,11 +298,13 @@ def poll(cls, context): def draw(self, context): ng = context.space_data.node_tree layout = self.layout + assert layout row = layout.split(factor=0.2, align=True) row = layout.row() row2 = layout.row() row.operator("ifc.sverchok_update_current", text="IFC Re-run all nodes") row2.operator("ifc.write_file_panel") + layout.operator("bim.ifcsverchok_use_bonsai_file") CLASSES = [IFC_Sv_UpdateCurrent, IFC_Sv_write_file, IFC_PT_write_file_panel] diff --git a/src/ifcsverchok/helper.py b/src/ifcsverchok/helper.py index d20626f365e..7407bd94cd8 100644 --- a/src/ifcsverchok/helper.py +++ b/src/ifcsverchok/helper.py @@ -16,12 +16,14 @@ # You should have received a copy of the GNU General Public License # along with IfcSverchok. If not, see . -from typing import Any, TypeVar, Union +from typing import Any, Literal, TypeVar, Union import bpy import ifcopenshell import sverchok.core.sockets -from sverchok.data_structure import zip_long_repeat +from sverchok.data_structure import flatten_data, zip_long_repeat + +from ifcsverchok.ifcstore import SvIfcStore T_socket = TypeVar("T_socket", bound=sverchok.core.sockets.SvSocketCommon) @@ -67,6 +69,54 @@ def get_selected_nodes() -> list[bpy.types.Node]: return [n for n in node_tree.nodes if n.select] +def get_socket_value( + sockets: Union[bpy.types.NodeInputs, bpy.types.NodeOutputs], + name: str, + *, + value_type: Literal["SINGLE_VALUE", "CONTAINER", "FLATTEN"] = "SINGLE_VALUE", +) -> Any: + """ + :param value_type: + + - ``SINGLE_VALUE`` - e.g. ``[[x]]`` -> ``x``. + + - ``CONTAINER`` - e.g. ``[ [ [x, y, z], [x,y, z] ] ]`` -> ``[ [x1, y1, z1], [x2, y2, z2] ]``. + + - ``FLATTEN`` - e.g. `` [ [ [x1], [x2] ] ] `` -> `` [x1, x2] ``. + """ + socket = sockets[name] + assert isinstance(socket, sverchok.core.sockets.SvSocketCommon) + value = socket.sv_get() + if value_type == "FLATTEN": + return flatten_data(value) + value = value[0] + if value_type == "SINGLE_VALUE": + return value[0] + return value + + +def set_socket_value( + sockets: bpy.types.NodeOutputs, + name: str, + value: Any, + *, + value_type: Literal["SINGLE_VALUE", "FINAL_VALUE"] = "SINGLE_VALUE", +) -> None: + """ + :param value_type: + + - ``SINGLE_VALUE`` - e.g. ``x`` -> ``[[x]]``. + + - ``FINAL_VALUE`` - keep value as is. + """ + socket = sockets[name] + assert isinstance(socket, sverchok.core.sockets.SvSocketCommon) + if value_type == "SINGLE_VALUE": + socket.sv_set([[value]]) + return + socket.sv_set(value) + + def create_socket( inputs_or_outputs: Union[bpy.types.NodeInputs, bpy.types.NodeOutputs], name: str, @@ -87,3 +137,7 @@ def create_socket( if prop_name: socket.prop_name = prop_name return socket + + +def get_file() -> ifcopenshell.file: + return SvIfcStore.get_file() diff --git a/src/ifcsverchok/ifcstore.py b/src/ifcsverchok/ifcstore.py index 6fda9b2ceaf..30cd760b87e 100644 --- a/src/ifcsverchok/ifcstore.py +++ b/src/ifcsverchok/ifcstore.py @@ -18,9 +18,9 @@ from typing import Any, Union +import bonsai.tool as tool import bpy import ifcopenshell -import ifcopenshell.api import ifcopenshell.api.context import ifcopenshell.util.representation from ifcopenshell import template @@ -50,6 +50,8 @@ class SvIfcStore: future = [] schema_identifiers = ["IFC4", "IFC2X3"] + use_bonsai_file = False + @staticmethod def purge() -> None: SvIfcStore.path = "" @@ -95,6 +97,8 @@ def create_boilerplate() -> ifcopenshell.file: @staticmethod def get_file() -> ifcopenshell.file: + if SvIfcStore.use_bonsai_file: + return tool.Ifc.get() if SvIfcStore.file is None: SvIfcStore.create_boilerplate() return SvIfcStore.file diff --git a/src/ifcsverchok/nodes/ifc/add_pset.py b/src/ifcsverchok/nodes/ifc/add_pset.py index 3cd25cd4dc9..5676dadf71c 100644 --- a/src/ifcsverchok/nodes/ifc/add_pset.py +++ b/src/ifcsverchok/nodes/ifc/add_pset.py @@ -20,7 +20,6 @@ import bpy import ifcopenshell -import ifcopenshell.api import ifcopenshell.api.pset import sverchok.core.sockets from bpy.props import StringProperty diff --git a/src/ifcsverchok/nodes/ifc/add_spatial_element.py b/src/ifcsverchok/nodes/ifc/add_spatial_element.py index f53dc3fa16b..0f03dc1b52a 100644 --- a/src/ifcsverchok/nodes/ifc/add_spatial_element.py +++ b/src/ifcsverchok/nodes/ifc/add_spatial_element.py @@ -19,8 +19,6 @@ from itertools import chain import bpy -import ifcopenshell -import ifcopenshell.api import ifcopenshell.api.aggregate import ifcopenshell.api.root import ifcopenshell.api.spatial diff --git a/src/ifcsverchok/nodes/ifc/api.py b/src/ifcsverchok/nodes/ifc/api.py index ce75275db40..4c53b3968d7 100644 --- a/src/ifcsverchok/nodes/ifc/api.py +++ b/src/ifcsverchok/nodes/ifc/api.py @@ -20,10 +20,9 @@ from typing import Any, Union import bpy -import ifcopenshell import ifcopenshell.api import sverchok.core.sockets -from bpy.props import EnumProperty, StringProperty +from bpy.props import StringProperty from sverchok.data_structure import updateNode from sverchok.node_tree import SverchCustomTreeNode diff --git a/src/ifcsverchok/nodes/ifc/bmesh_to_ifc.py b/src/ifcsverchok/nodes/ifc/bmesh_to_ifc.py index 8d623ffe1e7..134ad05d998 100644 --- a/src/ifcsverchok/nodes/ifc/bmesh_to_ifc.py +++ b/src/ifcsverchok/nodes/ifc/bmesh_to_ifc.py @@ -16,36 +16,20 @@ # You should have received a copy of the GNU General Public License # along with IfcSverchok. If not, see . -from copy import deepcopy -from decimal import Context -from email.policy import default -from itertools import chain, cycle - -import bonsai.core.geometry as core -import bonsai.tool as tool import bpy import ifcopenshell -import ifcopenshell.api import ifcopenshell.api.context import ifcopenshell.api.geometry import ifcopenshell.util.representation -from bonsai.bim.module.root.prop import get_contexts from bpy.props import ( BoolProperty, EnumProperty, - IntProperty, PointerProperty, StringProperty, ) from mathutils import Matrix -from sverchok.core.socket_data import sv_get_socket from sverchok.data_structure import ( - fixed_iter, - flat_iter, - flatten_data, - node_id, updateNode, - zip_long_repeat, ) from sverchok.node_tree import SverchCustomTreeNode @@ -209,7 +193,7 @@ def create(self, blender_objects: list[bpy.types.Object]) -> tuple[list[list[lis blender_object=obj, geometry=obj.data, context=context, - should_run_listeners=False, + should_run_listeners=False, # ty:ignore[unknown-argument] ) if not representation: raise Exception("Couldn't create representation. Possibly wrong context.") diff --git a/src/ifcsverchok/nodes/ifc/by_guid.py b/src/ifcsverchok/nodes/ifc/by_guid.py index 029b1b11a51..fd6b79bb55c 100644 --- a/src/ifcsverchok/nodes/ifc/by_guid.py +++ b/src/ifcsverchok/nodes/ifc/by_guid.py @@ -19,7 +19,6 @@ import itertools import bpy -import ifcopenshell from bpy.props import StringProperty from sverchok.data_structure import flatten_data, updateNode from sverchok.node_tree import SverchCustomTreeNode diff --git a/src/ifcsverchok/nodes/ifc/by_query.py b/src/ifcsverchok/nodes/ifc/by_query.py index 1bdd88054a9..6b6cb12bdb2 100644 --- a/src/ifcsverchok/nodes/ifc/by_query.py +++ b/src/ifcsverchok/nodes/ifc/by_query.py @@ -17,24 +17,35 @@ # along with IfcSverchok. If not, see . import bpy -import ifcopenshell import ifcopenshell.util.selector from bpy.props import StringProperty from sverchok.data_structure import updateNode from sverchok.node_tree import SverchCustomTreeNode -import ifcsverchok.helper +import ifcsverchok.helper as helper from ifcsverchok.ifcstore import SvIfcStore -class SvIfcByQuery(bpy.types.Node, SverchCustomTreeNode, ifcsverchok.helper.SvIfcCore): +class SvIfcByQuery(bpy.types.Node, SverchCustomTreeNode, helper.SvIfcCore): bl_idname = "SvIfcByQuery" bl_label = "IFC By Query" query: StringProperty(name="Query", update=updateNode) - def sv_init(self, context): - self.inputs.new("SvStringsSocket", "query").prop_name = "query" - self.outputs.new("SvStringsSocket", "Entity") + def sv_init(self, context) -> None: + helper.create_socket( + self.inputs, + "query", + description="IFC Query string.", + data_type="list[list[str]]", + prop_name="query", + ) + helper.create_socket( + self.outputs, + "Entity", + description="IFC Entities found by the query.", + data_type="set[ifcopenshell.entity_instance]", + prop_name="Entity", + ) def process(self): if not self.inputs["query"].sv_get()[0][0]: @@ -44,8 +55,8 @@ def process(self): super().process() def process_ifc(self, query: str) -> None: - selector = ifcopenshell.util.selector.Selector() - self.outputs["Entity"].sv_set([selector.parse(self.file, query)]) + elements = ifcopenshell.util.selector.filter_elements(self.file, query) + self.outputs["Entity"].sv_set(elements) def register(): diff --git a/src/ifcsverchok/nodes/ifc/create_entity.py b/src/ifcsverchok/nodes/ifc/create_entity.py index bc63b3bc08d..2ce1d54461b 100644 --- a/src/ifcsverchok/nodes/ifc/create_entity.py +++ b/src/ifcsverchok/nodes/ifc/create_entity.py @@ -17,8 +17,6 @@ # along with IfcSverchok. If not, see . import bpy -import ifcopenshell -import ifcopenshell.api import ifcopenshell.api.geometry import ifcopenshell.api.root import ifcopenshell.util.schema diff --git a/src/ifcsverchok/nodes/ifc/create_project.py b/src/ifcsverchok/nodes/ifc/create_project.py index 4f0b19a398e..b6de31de342 100644 --- a/src/ifcsverchok/nodes/ifc/create_project.py +++ b/src/ifcsverchok/nodes/ifc/create_project.py @@ -18,7 +18,6 @@ import bpy import ifcopenshell -import ifcopenshell.api import ifcopenshell.api.context import ifcopenshell.api.root import ifcopenshell.api.unit diff --git a/src/ifcsverchok/nodes/ifc/create_shape.py b/src/ifcsverchok/nodes/ifc/create_shape.py index 7b94008952b..de47c3b0e62 100644 --- a/src/ifcsverchok/nodes/ifc/create_shape.py +++ b/src/ifcsverchok/nodes/ifc/create_shape.py @@ -20,9 +20,8 @@ import bonsai.bim.import_ifc import bpy -import ifcopenshell import ifcopenshell.geom -from bpy.props import BoolProperty, PointerProperty, StringProperty +from bpy.props import BoolProperty, StringProperty from sverchok.data_structure import flatten_data, updateNode from sverchok.node_tree import SverchCustomTreeNode @@ -102,10 +101,8 @@ def create(self): def register(): - # bpy.utils.register_class(SvIfcCreateShapeRefresh) bpy.utils.register_class(SvIfcCreateShape) def unregister(): bpy.utils.unregister_class(SvIfcCreateShape) - # bpy.utils.unregister_class(SvIfcCreateShapeRefresh) diff --git a/src/ifcsverchok/nodes/ifc/generate_guid.py b/src/ifcsverchok/nodes/ifc/generate_guid.py index 26f50e8ae62..759dcbb90e0 100644 --- a/src/ifcsverchok/nodes/ifc/generate_guid.py +++ b/src/ifcsverchok/nodes/ifc/generate_guid.py @@ -17,7 +17,6 @@ # along with IfcSverchok. If not, see . import bpy -import ifcopenshell import ifcopenshell.guid from sverchok.node_tree import SverchCustomTreeNode diff --git a/src/ifcsverchok/nodes/ifc/get_attribute.py b/src/ifcsverchok/nodes/ifc/get_attribute.py index e809500de38..7f90e742a87 100644 --- a/src/ifcsverchok/nodes/ifc/get_attribute.py +++ b/src/ifcsverchok/nodes/ifc/get_attribute.py @@ -17,8 +17,6 @@ # along with IfcSverchok. If not, see . import bpy -import ifcopenshell -import ifcopenshell.util.element from bpy.props import StringProperty from sverchok.data_structure import flatten_data, updateNode from sverchok.node_tree import SverchCustomTreeNode diff --git a/src/ifcsverchok/nodes/ifc/get_property.py b/src/ifcsverchok/nodes/ifc/get_property.py index f99dff7aa36..e8af45d6067 100644 --- a/src/ifcsverchok/nodes/ifc/get_property.py +++ b/src/ifcsverchok/nodes/ifc/get_property.py @@ -17,7 +17,6 @@ # along with IfcSverchok. If not, see . import bpy -import ifcopenshell import ifcopenshell.util.element from bpy.props import StringProperty from sverchok.data_structure import flatten_data, updateNode diff --git a/src/ifcsverchok/nodes/ifc/quick_project_setup.py b/src/ifcsverchok/nodes/ifc/quick_project_setup.py index 5787e291875..c98e80a5c44 100644 --- a/src/ifcsverchok/nodes/ifc/quick_project_setup.py +++ b/src/ifcsverchok/nodes/ifc/quick_project_setup.py @@ -16,11 +16,7 @@ # You should have received a copy of the GNU General Public License # along with IfcSverchok. If not, see . - -from email.mime import application - import bpy -import ifcopenshell import sverchok.core.sockets from bpy.props import StringProperty from ifcopenshell import template diff --git a/src/ifcsverchok/nodes/ifc/read_entity.py b/src/ifcsverchok/nodes/ifc/read_entity.py index 38a703151d3..454293e7d3d 100644 --- a/src/ifcsverchok/nodes/ifc/read_entity.py +++ b/src/ifcsverchok/nodes/ifc/read_entity.py @@ -19,7 +19,7 @@ import bpy import ifcopenshell from bpy.props import StringProperty -from sverchok.data_structure import ensure_min_nesting, flatten_data, updateNode +from sverchok.data_structure import flatten_data, updateNode from sverchok.node_tree import SverchCustomTreeNode import ifcsverchok.helper diff --git a/src/ifcsverchok/nodes/ifc/select_blender_objects.py b/src/ifcsverchok/nodes/ifc/select_blender_objects.py index 3a0053a5145..d2582dcaff3 100644 --- a/src/ifcsverchok/nodes/ifc/select_blender_objects.py +++ b/src/ifcsverchok/nodes/ifc/select_blender_objects.py @@ -19,7 +19,6 @@ import bonsai.tool as tool import bpy import ifcopenshell -import ifcopenshell.util.selector from bpy.props import StringProperty from sverchok.data_structure import updateNode from sverchok.node_tree import SverchCustomTreeNode diff --git a/src/ifcsverchok/nodes/ifc/shape_builder/extrude.py b/src/ifcsverchok/nodes/ifc/shape_builder/extrude.py new file mode 100644 index 00000000000..350f4ac71f9 --- /dev/null +++ b/src/ifcsverchok/nodes/ifc/shape_builder/extrude.py @@ -0,0 +1,93 @@ +# IfcSverchok - IFC Sverchok extension +# Copyright (C) 2022 Martina Jakubowska +# +# This file is part of IfcSverchok. +# +# IfcSverchok is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# IfcSverchok is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with IfcSverchok. If not, see . + +from typing import TYPE_CHECKING, Literal + +import bpy +import ifcopenshell +import ifcsverchok.helper +import ifcsverchok.helper as helper +from ifcopenshell.util.shape_builder import ShapeBuilder +from sverchok.core.sockets import SvVerticesSocket +from sverchok.data_structure import updateNode +from sverchok.node_tree import SverchCustomTreeNode + + +class SvIfcSbExtrude(bpy.types.Node, SverchCustomTreeNode, ifcsverchok.helper.SvIfcCore): + bl_idname = "SvIfcSbExtrude" + bl_label = "IFC Extrude" + + extrude_axis: bpy.props.EnumProperty( + default="Z", + items=[ + ("X", "X", "Interpret curve as in XY plane and extrude along X+."), + ("Y", "Y", "Interpret curve as in XZ plane and extrude along Y+."), + ("Z", "Z", "Interpret curve as in XY plane and extrude along Z+."), + ], + name="Extrude Axis", + update=updateNode, + ) + + if TYPE_CHECKING: + extrude_axis: Literal["X", "Y", "Z"] + + def sv_init(self, context): + helper.create_socket( + self.inputs, + "Curve", + description="Curve to extrude", + data_type="list[list[ifcopenshell.entity_instance]]", + ) + helper.create_socket( + self.inputs, + "Magnitude", + data_type="list[list[float]]", + ) + helper.create_socket( + self.inputs, + "Position", + data_type="list[list[tuple[float, float, float]]]", + socket_type=SvVerticesSocket, + ) + helper.create_socket( + self.outputs, + "Extruded Profile", + description="Extruded Profile", + data_type="list[list[ifcopenshell.entity_instance]]", + ) + + def draw_buttons(self, context, layout): + layout.prop(self, "extrude_axis") + + def process(self): + self.file = helper.get_file() + curve: ifcopenshell.entity_instance = helper.get_socket_value(self.inputs, "Curve") + magnitude: float = helper.get_socket_value(self.inputs, "Magnitude") + position: tuple[float, float, float] = helper.get_socket_value(self.inputs, "Position") + builder = ShapeBuilder(self.file) + axis_kargs = builder.extrude_kwargs(self.extrude_axis) + extrude = builder.extrude(curve, magnitude=magnitude, position=position, **axis_kargs) + helper.set_socket_value(self.outputs, "Extruded Profile", extrude) + + +def register(): + bpy.utils.register_class(SvIfcSbExtrude) + + +def unregister(): + bpy.utils.unregister_class(SvIfcSbExtrude) diff --git a/src/ifcsverchok/nodes/ifc/shape_builder/mesh.py b/src/ifcsverchok/nodes/ifc/shape_builder/mesh.py new file mode 100644 index 00000000000..8b740bef08a --- /dev/null +++ b/src/ifcsverchok/nodes/ifc/shape_builder/mesh.py @@ -0,0 +1,51 @@ +# IfcSverchok - IFC Sverchok extension +# Copyright (C) 2022 Martina Jakubowska +# +# This file is part of IfcSverchok. +# +# IfcSverchok is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# IfcSverchok is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with IfcSverchok. If not, see . + +import bpy +import ifcsverchok.helper as helper +import sverchok.core.sockets +from ifcsverchok.nodes.ifc.shape_builder.representation import ShapeBuilder +from sverchok.node_tree import SverchCustomTreeNode + + +class SvSbMesh(bpy.types.Node, SverchCustomTreeNode, helper.SvIfcCore): + bl_idname = "SvSbMesh" + bl_label = "IFC Mesh" + + def sv_init(self, context): + helper.create_socket(self.inputs, "Vers", socket_type=sverchok.core.sockets.SvVerticesSocket) + helper.create_socket(self.inputs, "Pols") + helper.create_socket(self.outputs, "Representation Item", data_type="list[list[ifcopenshell.entity_instance]]") + + def process(self): + ifc_file = helper.get_file() + + vertices: list[[list[float]]] = helper.get_socket_value(self.inputs, "Vers", value_type="CONTAINER") + polygons: list[[list[int]]] = helper.get_socket_value(self.inputs, "Pols", value_type="CONTAINER") + + builder = ShapeBuilder(ifc_file) + mesh = builder.mesh(vertices, polygons) + helper.set_socket_value(self.outputs, "Representation Item", mesh) + + +def register(): + bpy.utils.register_class(SvSbMesh) + + +def unregister(): + bpy.utils.unregister_class(SvSbMesh) diff --git a/src/ifcsverchok/nodes/ifc/shape_builder/polyline.py b/src/ifcsverchok/nodes/ifc/shape_builder/polyline.py new file mode 100644 index 00000000000..2f27a3834fa --- /dev/null +++ b/src/ifcsverchok/nodes/ifc/shape_builder/polyline.py @@ -0,0 +1,52 @@ +# IfcSverchok - IFC Sverchok extension +# Copyright (C) 2022 Martina Jakubowska +# +# This file is part of IfcSverchok. +# +# IfcSverchok is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# IfcSverchok is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with IfcSverchok. If not, see . + +import bpy +import ifcsverchok.helper as helper +import sverchok.core.sockets +from ifcsverchok.nodes.ifc.shape_builder.representation import ShapeBuilder +from sverchok.node_tree import SverchCustomTreeNode + + +class SvSbPolyline(bpy.types.Node, SverchCustomTreeNode, helper.SvIfcCore): + bl_idname = "SvSbPolyline" + bl_label = "IFC Polyline" + bl_description = "Create closed polyline from vertices." + + def sv_init(self, context): + helper.create_socket(self.inputs, "Vers", socket_type=sverchok.core.sockets.SvVerticesSocket) + helper.create_socket(self.inputs, "Closed", data_type="list[list[bool]]") + helper.create_socket(self.outputs, "Representation Item", data_type="list[list[ifcopenshell.entity_instance]]") + + def process(self): + ifc_file = helper.get_file() + + vertices: list[[list[float]]] = helper.get_socket_value(self.inputs, "Vers", value_type="CONTAINER") + closed = helper.get_socket_value(self.inputs, "Closed") + + builder = ShapeBuilder(ifc_file) + Polyline = builder.polyline(vertices, closed=closed) + helper.set_socket_value(self.outputs, "Representation Item", Polyline) + + +def register(): + bpy.utils.register_class(SvSbPolyline) + + +def unregister(): + bpy.utils.unregister_class(SvSbPolyline) diff --git a/src/ifcsverchok/nodes/ifc/shape_builder/rectangle.py b/src/ifcsverchok/nodes/ifc/shape_builder/rectangle.py new file mode 100644 index 00000000000..35e73db71f3 --- /dev/null +++ b/src/ifcsverchok/nodes/ifc/shape_builder/rectangle.py @@ -0,0 +1,56 @@ +# IfcSverchok - IFC Sverchok extension +# Copyright (C) 2022 Martina Jakubowska +# +# This file is part of IfcSverchok. +# +# IfcSverchok is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# IfcSverchok is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with IfcSverchok. If not, see . + +import bpy +import ifcsverchok.helper +import ifcsverchok.helper as helper +from ifcopenshell.util.shape_builder import ShapeBuilder +from sverchok.node_tree import SverchCustomTreeNode + + +class SvIfcSbRectangle(bpy.types.Node, SverchCustomTreeNode, ifcsverchok.helper.SvIfcCore): + bl_idname = "SvIfcSbRectangle" + bl_label = "IFC Rectangle" + + def sv_init(self, context): + helper.create_socket( + self.inputs, + "Size (2D)", + data_type="list[list[tuple[float, float]]]", + ) + helper.create_socket( + self.outputs, + "Rectangle", + description="Rectangle", + data_type="list[list[ifcopenshell.entity_instance]]", + ) + + def process(self): + file = helper.get_file() + builder = ShapeBuilder(file) + size: tuple[float, ...] = helper.get_socket_value(self.inputs, "Size", value_type="CONTAINER") + rectangle = builder.rectangle(size=size) + helper.set_socket_value(self.outputs, "Rectangle", rectangle) + + +def register(): + bpy.utils.register_class(SvIfcSbRectangle) + + +def unregister(): + bpy.utils.unregister_class(SvIfcSbRectangle) diff --git a/src/ifcsverchok/nodes/ifc/shape_builder/representation.py b/src/ifcsverchok/nodes/ifc/shape_builder/representation.py new file mode 100644 index 00000000000..7fefe038dc3 --- /dev/null +++ b/src/ifcsverchok/nodes/ifc/shape_builder/representation.py @@ -0,0 +1,63 @@ +# IfcSverchok - IFC Sverchok extension +# Copyright (C) 2022 Martina Jakubowska +# +# This file is part of IfcSverchok. +# +# IfcSverchok is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# IfcSverchok is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with IfcSverchok. If not, see . + +import bpy +import ifcopenshell +import ifcopenshell.util.representation +import ifcsverchok.helper +import ifcsverchok.helper as helper +from ifcopenshell.util.shape_builder import ShapeBuilder +from sverchok.node_tree import SverchCustomTreeNode + + +class SvIfcSbRepresentation(bpy.types.Node, SverchCustomTreeNode, ifcsverchok.helper.SvIfcCore): + bl_idname = "SvIfcSbRepresentation" + bl_label = "IFC Representation" + + def sv_init(self, context): + helper.create_socket( + self.inputs, + "Representation Item", + description="Representation Item", + data_type="list[list[ifcopenshell.entity_instance]]", + ) + helper.create_socket( + self.outputs, + "Shape Representation", + description="IfcShapeRepresentation", + data_type="list[list[ifcopenshell.entity_instance]]", + ) + + def process(self): + self.file = helper.get_file() + representation_items: list[ifcopenshell.entity_instance] + representation_items = helper.get_socket_value(self.inputs, "Representation Item", value_type="FLATTEN") + + builder = ShapeBuilder(self.file) + context = ifcopenshell.util.representation.get_context(self.file, "Model", "Body", "MODEL_VIEW") + assert context is not None + representation = builder.get_representation(context, items=representation_items) + helper.set_socket_value(self.outputs, "Shape Representation", representation) + + +def register(): + bpy.utils.register_class(SvIfcSbRepresentation) + + +def unregister(): + bpy.utils.unregister_class(SvIfcSbRepresentation) diff --git a/src/ifcsverchok/nodes/ifc/shape_builder/shape_output.py b/src/ifcsverchok/nodes/ifc/shape_builder/shape_output.py new file mode 100644 index 00000000000..d8585ba7a29 --- /dev/null +++ b/src/ifcsverchok/nodes/ifc/shape_builder/shape_output.py @@ -0,0 +1,67 @@ +# IfcSverchok - IFC Sverchok extension +# Copyright (C) 2022 Martina Jakubowska +# +# This file is part of IfcSverchok. +# +# IfcSverchok is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# IfcSverchok is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with IfcSverchok. If not, see . + +import bpy +import ifcopenshell +import ifcopenshell.geom +import ifcopenshell.ifcopenshell_wrapper as W +import ifcopenshell.util.shape +import ifcsverchok.helper as helper +import sverchok.core.sockets +from sverchok.node_tree import SverchCustomTreeNode + + +class SvSbShapeOutput(bpy.types.Node, SverchCustomTreeNode, helper.SvIfcCore): + """ + Triggers: Ifc create shape by entity + Tooltip: Convert IfcShapeRepresentation to geometry data. + """ + + bl_idname = "SvSbShapeOutput" + bl_label = "IFC Shape Output" + + def sv_init(self, context): + helper.create_socket(self.inputs, "Representation", data_type="list[list[ifcopenshell.entity_instance]]") + helper.create_socket(self.outputs, "Vers", socket_type=sverchok.core.sockets.SvVerticesSocket) + helper.create_socket(self.outputs, "Edgs") + helper.create_socket(self.outputs, "Pols") + + def process(self): + entity: ifcopenshell.entity_instance = helper.get_socket_value(self.inputs, "Representation") + self.create(entity) + helper.set_socket_value(self.outputs, "Vers", [self.verts], value_type="FINAL_VALUE") + helper.set_socket_value(self.outputs, "Edgs", [self.edges], value_type="FINAL_VALUE") + helper.set_socket_value(self.outputs, "Pols", [self.polys], value_type="FINAL_VALUE") + + def create(self, entity: ifcopenshell.entity_instance) -> None: + assert bpy.context.scene + settings = ifcopenshell.geom.settings() + settings.set("dimensionality", ifcopenshell.ifcopenshell_wrapper.CURVES_SURFACES_AND_SOLIDS) + shape = ifcopenshell.geom.create_shape(settings, entity) + assert isinstance(shape, W.Triangulation) + self.verts = ifcopenshell.util.shape.get_vertices(shape).tolist() + self.edges = ifcopenshell.util.shape.get_edges(shape).tolist() + self.polys = ifcopenshell.util.shape.get_faces(shape).tolist() + + +def register(): + bpy.utils.register_class(SvSbShapeOutput) + + +def unregister(): + bpy.utils.unregister_class(SvSbShapeOutput) diff --git a/src/ifcsverchok/nodes/ifc/shape_builder/test.py b/src/ifcsverchok/nodes/ifc/shape_builder/test.py new file mode 100644 index 00000000000..4b8cd2ba046 --- /dev/null +++ b/src/ifcsverchok/nodes/ifc/shape_builder/test.py @@ -0,0 +1,54 @@ +# IfcSverchok - IFC Sverchok extension +# Copyright (C) 2022 Martina Jakubowska +# +# This file is part of IfcSverchok. +# +# IfcSverchok is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# IfcSverchok is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with IfcSverchok. If not, see . + +import bpy +import ifcsverchok.helper +import ifcsverchok.helper as helper +from sverchok.node_tree import SverchCustomTreeNode + + +class SvIfcSbTest(bpy.types.Node, SverchCustomTreeNode, ifcsverchok.helper.SvIfcCore): + bl_idname = "SvIfcSbTest" + bl_label = "IFC Test" + + def sv_init(self, context): + helper.create_socket( + self.inputs, + "Input", + ) + helper.create_socket( + self.outputs, + "Output", + description="Extruded Profile", + ) + + def process(self): + print("test!") + self.sv_input_names = ["Input"] + super().process() + + def process_ifc(self, input_value: float) -> None: + self.outputs["Output"].sv_set([[input_value]]) + + +def register(): + bpy.utils.register_class(SvIfcSbTest) + + +def unregister(): + bpy.utils.unregister_class(SvIfcSbTest) diff --git a/src/ifcsverchok/nodes/ifc/sverchok_to_ifc.py b/src/ifcsverchok/nodes/ifc/sverchok_to_ifc.py index 69ac5f37f35..eb0965b8b31 100644 --- a/src/ifcsverchok/nodes/ifc/sverchok_to_ifc.py +++ b/src/ifcsverchok/nodes/ifc/sverchok_to_ifc.py @@ -17,12 +17,10 @@ # along with IfcSverchok. If not, see . import bpy -import ifcopenshell -import ifcopenshell.api import ifcopenshell.api.context import ifcopenshell.api.geometry import ifcopenshell.util.representation -from bpy.props import EnumProperty, FloatVectorProperty, IntProperty, StringProperty +from bpy.props import EnumProperty, StringProperty from sverchok.data_structure import ensure_min_nesting, updateNode from sverchok.node_tree import SverchCustomTreeNode @@ -145,7 +143,7 @@ def create(self, geo_data): for item in obj: representation = ifcopenshell.api.geometry.add_mesh_representation( self.file, - should_run_listeners=False, + should_run_listeners=False, # ty:ignore[unknown-argument] context=self.context, vertices=[list(map(tuple, item[0]))], edges=[list(map(tuple, item[1]))], diff --git a/src/ifcsverchok/nodes/ifc/write_file.py b/src/ifcsverchok/nodes/ifc/write_file.py index 3a25cd99ccb..8d52b3d77ac 100644 --- a/src/ifcsverchok/nodes/ifc/write_file.py +++ b/src/ifcsverchok/nodes/ifc/write_file.py @@ -20,7 +20,6 @@ import bpy import ifcopenshell -import ifcopenshell.api import ifcopenshell.api.aggregate import ifcopenshell.api.root import ifcopenshell.api.spatial diff --git a/src/ifcsverchok/pyproject.toml b/src/ifcsverchok/pyproject.toml new file mode 100644 index 00000000000..6952f66f068 --- /dev/null +++ b/src/ifcsverchok/pyproject.toml @@ -0,0 +1,5 @@ +[tool.ruff] +extend = "../../pyproject.toml" +lint.select = [ + "F401", # unused imports +] diff --git a/src/ifctester/Makefile b/src/ifctester/Makefile index a2df0c58204..71ecbd48d7e 100644 --- a/src/ifctester/Makefile +++ b/src/ifctester/Makefile @@ -25,9 +25,19 @@ WEBAPP_BUILD_DIR := $(WEBAPP_DIR)/dist PYODIDE_DIR := $(WEBAPP_DIR)/public/pyodide PYODIDE_VERSION := 0.28.0 PYODIDE_URL := https://github.com/pyodide/pyodide/releases/download/$(PYODIDE_VERSION)/pyodide-$(PYODIDE_VERSION).tar.bz2 +WORKER_BIN_DIR := $(WEBAPP_DIR)/public/worker/bin +IFCOPENSHELL_WASM_WHEEL := ifcopenshell-0.8.5+a51b2c5-cp313-cp313-pyodide_2025_0_wasm32.whl +IFCOPENSHELL_WASM_WHEEL_URL := https://s3.amazonaws.com/ifcopenshell-builds/ifcopenshell-0.8.5%2Ba51b2c5-cp313-cp313-pyodide_2025_0_wasm32.whl +IFCOPENSHELL_WASM_WHEEL_PATH := $(WORKER_BIN_DIR)/$(IFCOPENSHELL_WASM_WHEEL) +WEBAPP_GENERATED_DIR := $(WEBAPP_DIR)/public/worker/generated +WEBAPP_IFCTESTER_MANIFEST := $(WEBAPP_GENERATED_DIR)/ifctester.json +WEBAPP_IFCTESTER_BUILD_DIR := build-webapp-wheel +PACKAGE_WEBAPP_DIR := $(PACKAGE_NAME)/webapp +PACKAGE_WEBAPP_WWW_DIR := $(PACKAGE_WEBAPP_DIR)/www .PHONY: webapp-dev -webapp-dev: +webapp-dev: pyodide-download ifcopenshell-wasm-download webapp-stage-ifctester-wheel + cd $(WEBAPP_DIR) && npm install cd $(WEBAPP_DIR) && npm run dev .PHONY: pyodide-download @@ -62,8 +72,43 @@ pyodide-download: echo "Pyodide $(PYODIDE_VERSION) prepared in $(PYODIDE_DIR)"; \ fi +.PHONY: ifcopenshell-wasm-download +ifcopenshell-wasm-download: + @if [ -f "$(IFCOPENSHELL_WASM_WHEEL_PATH)" ]; then \ + echo "IfcOpenShell wasm wheel already exists at $(IFCOPENSHELL_WASM_WHEEL_PATH), skipping download"; \ + else \ + echo "Downloading IfcOpenShell wasm wheel..."; \ + mkdir -p $(WORKER_BIN_DIR); \ + rm -f $(WORKER_BIN_DIR)/ifcopenshell-*.whl; \ + curl -fL -o "$(IFCOPENSHELL_WASM_WHEEL_PATH)" "$(IFCOPENSHELL_WASM_WHEEL_URL)"; \ + echo "IfcOpenShell wasm wheel prepared at $(IFCOPENSHELL_WASM_WHEEL_PATH)"; \ + fi + +.PHONY: webapp-stage-ifctester-wheel +webapp-stage-ifctester-wheel: + rm -rf $(WEBAPP_GENERATED_DIR) + rm -rf $(WEBAPP_IFCTESTER_BUILD_DIR) + mkdir -p $(WEBAPP_IFCTESTER_BUILD_DIR) + cp -r $(PACKAGE_NAME) $(WEBAPP_IFCTESTER_BUILD_DIR)/ + rm -rf $(WEBAPP_IFCTESTER_BUILD_DIR)/$(PACKAGE_NAME)/webapp + cp pyproject.toml $(WEBAPP_IFCTESTER_BUILD_DIR)/ + cp README.md $(WEBAPP_IFCTESTER_BUILD_DIR)/ +ifeq ($(IS_STABLE), TRUE) + $(SED) 's/version = "0.0.0"/version = "$(VERSION)"/' $(WEBAPP_IFCTESTER_BUILD_DIR)/pyproject.toml + $(SED) 's/version = "0.0.0"/version = "$(VERSION)"/' $(WEBAPP_IFCTESTER_BUILD_DIR)/$(PACKAGE_NAME)/__init__.py +else + $(SED) 's/version = "0.0.0"/version = "$(VERSION)a$(VERSION_DATE)"/' $(WEBAPP_IFCTESTER_BUILD_DIR)/pyproject.toml + $(SED) 's/version = "0.0.0"/version = "$(VERSION)-alpha$(VERSION_DATE)"/' $(WEBAPP_IFCTESTER_BUILD_DIR)/$(PACKAGE_NAME)/__init__.py +endif + cd $(WEBAPP_IFCTESTER_BUILD_DIR) && $(PYTHON) -m venv env --system-site-packages && . env/$(VENV_ACTIVATE) && python -m pip install build && python -m build --wheel --no-isolation + mkdir -p $(WEBAPP_GENERATED_DIR) + wheel=$$(basename $(WEBAPP_IFCTESTER_BUILD_DIR)/dist/$(PACKAGE_NAME)-*.whl); \ + cp "$(WEBAPP_IFCTESTER_BUILD_DIR)/dist/$$wheel" "$(WEBAPP_GENERATED_DIR)/$$wheel"; \ + printf '{\n "wheel_url": "/worker/generated/%s"\n}\n' "$$wheel" > "$(WEBAPP_IFCTESTER_MANIFEST)" + rm -rf $(WEBAPP_IFCTESTER_BUILD_DIR) + .PHONY: webapp-build -webapp-build: pyodide-download +webapp-build: pyodide-download ifcopenshell-wasm-download webapp-stage-ifctester-wheel cd $(WEBAPP_DIR) && npm install cd $(WEBAPP_DIR) && npm run build @@ -76,23 +121,36 @@ clean: rm -rf $(WEBAPP_BUILD_DIR) rm -rf $(WEBAPP_DIR)/node_modules rm -rf $(PYODIDE_DIR) + rm -f $(WORKER_BIN_DIR)/ifcopenshell-*.whl + rm -rf $(WEBAPP_GENERATED_DIR) + rm -rf $(WEBAPP_IFCTESTER_BUILD_DIR) rm -rf $(PACKAGE_NAME)/webapp rm -rf dist -.PHONY: dist -dist: webapp-prepare +.PHONY: python-dist +python-dist: + rm -rf dist # For some reason OS is not initalized when we call common.mk dist, which matters on Windows. # So we pass it explicitly. - $(MAKE) -f ../common.mk dist PACKAGE_NAME=$(PACKAGE_NAME) OS=$(OS) + $(MAKE) -f ../common.mk dist PACKAGE_NAME=$(PACKAGE_NAME) OS=$(OS) IS_STABLE=$(IS_STABLE) + +.PHONY: dist +dist: webapp-prepare + $(MAKE) python-dist OS=$(OS) IS_STABLE=$(IS_STABLE) .PHONY: webapp-prepare webapp-prepare: webapp-build - rm -rf $(PACKAGE_NAME)/webapp/www/* - mkdir -p $(PACKAGE_NAME)/webapp/www - cp -r $(WEBAPP_BUILD_DIR)/* $(PACKAGE_NAME)/webapp/www/ - cp $(WEBAPP_DIR)/__init__.py $(PACKAGE_NAME)/webapp/__init__.py - cp $(WEBAPP_DIR)/serve.py $(PACKAGE_NAME)/webapp/serve.py + rm -rf $(PACKAGE_WEBAPP_WWW_DIR) + mkdir -p $(PACKAGE_WEBAPP_WWW_DIR) + cp -r $(WEBAPP_BUILD_DIR)/* $(PACKAGE_WEBAPP_WWW_DIR)/ + cp $(WEBAPP_DIR)/__init__.py $(PACKAGE_WEBAPP_DIR)/__init__.py + cp $(WEBAPP_DIR)/serve.py $(PACKAGE_WEBAPP_DIR)/serve.py .PHONY: test test: pytest -p no:pytest-blender test + +.PHONY: build-ids-docs +build-ids-docs: + mkdir -p test/build + cd test && python ids_doc_generator.py diff --git a/src/ifctester/ifctester/__init__.py b/src/ifctester/ifctester/__init__.py index edb1db90e47..f7d708105d0 100644 --- a/src/ifctester/ifctester/__init__.py +++ b/src/ifctester/ifctester/__init__.py @@ -19,3 +19,4 @@ from .ids import open __version__ = version = "0.0.0" +__all__ = ["open"] diff --git a/src/ifctester/ifctester/ids.py b/src/ifctester/ifctester/ids.py index ea21aa15fd7..8d00ce9fac1 100644 --- a/src/ifctester/ifctester/ids.py +++ b/src/ifctester/ifctester/ids.py @@ -42,6 +42,7 @@ get_psets, ) +__all__ = ["Attribute", "Classification", "Entity", "Material", "PartOf", "Property", "Restriction"] cwd = os.path.dirname(os.path.realpath(__file__)) schema = None @@ -300,23 +301,15 @@ def validate(self, ifc_file: ifcopenshell.file, should_filter_version: bool = Fa if not is_applicable: continue self.applicable_entities.append(element) - for facet in self.requirements: - result = facet(element) - is_pass = bool(result) - if self.maxOccurs != 0: # This is a required or optional specification - if is_pass: + if self.maxOccurs != 0: # Requirements are skipped for prohibited applicability + for facet in self.requirements: + result = facet(element) + if bool(result): self.passed_entities.add(element) facet.passed_entities.add(element) else: self.failed_entities.add(element) facet.failures.append(FacetFailure(element=element, reason=str(result))) - else: # This is a prohibited specification - if is_pass: - self.failed_entities.add(element) - facet.failures.append(FacetFailure(element=element, reason=str(result))) - else: - self.passed_entities.add(element) - facet.passed_entities.add(element) self.status = True for facet in self.requirements: diff --git a/src/ifctester/ifctester/reporter.py b/src/ifctester/ifctester/reporter.py index 220d0f96a9d..38b3ba8f5bb 100644 --- a/src/ifctester/ifctester/reporter.py +++ b/src/ifctester/ifctester/reporter.py @@ -81,10 +81,12 @@ class ResultsSpecification(TypedDict): description: str instructions: str status: bool + is_skipped: bool is_ifc_version: bool total_applicable: int total_applicable_pass: int total_applicable_fail: int + applicable_entities: list[ResultsEntity] percent_applicable_pass: ResultsPercent total_checks: int total_checks_pass: int @@ -367,16 +369,24 @@ def report_specification(self, specification: Specification) -> ResultsSpecifica cardinality = "optional" elif specification.minOccurs == 0 and specification.maxOccurs == 0: cardinality = "prohibited" + elif specification.minOccurs >= 1: + # Any minimum occurrence >= 1 means the specification is required + cardinality = "required" + else: + # minOccurs == 0 with any other maxOccurs value means optional + cardinality = "optional" return ResultsSpecification( name=specification.name, description=specification.description, instructions=specification.instructions, status=specification.status, + is_skipped=cardinality == "optional" and total_checks == 0, is_ifc_version=specification.is_ifc_version, total_applicable=total_applicable, total_applicable_pass=total_applicable_pass, total_applicable_fail=total_applicable - total_applicable_pass, + applicable_entities=self.report_applicable_entities(specification), percent_applicable_pass=percent_applicable_pass, total_checks=total_checks, total_checks_pass=total_checks_pass, @@ -387,6 +397,24 @@ def report_specification(self, specification: Specification) -> ResultsSpecifica requirements=requirements, ) + def report_applicable_entities(self, specification: Specification) -> list[ResultsEntity]: + return [ + ResultsEntity( + { + "element": e, + "element_type": ifcopenshell.util.element.get_type(e), + "class": e.is_a(), + "predefined_type": ifcopenshell.util.element.get_predefined_type(e), + "name": getattr(e, "Name", None), + "description": getattr(e, "Description", None), + "id": e.id(), + "global_id": getattr(e, "GlobalId", None), + "tag": getattr(e, "Tag", None), + } + ) + for e in specification.applicable_entities + ] + def report_passed_entities(self, requirement: Facet) -> list[ResultsEntity]: return [ ResultsEntity( @@ -448,11 +476,13 @@ def __init__(self, ids: Ids, hide_skipped: bool = False): def report(self) -> None: super().report() for spec in self.results["specifications"]: - if spec["cardinality"] == "optional" and spec["total_checks"] == 0: - spec["is_skipped"] = True spec["is_prohibited"] = spec["cardinality"] == "prohibited" spec["cardinality"] = spec["cardinality"].capitalize() spec["has_requirements"] = bool(spec["requirements"]) + total_applicable_entities = len(spec["applicable_entities"]) + spec["applicable_entities"] = self.limit_entities(spec["applicable_entities"]) + spec["has_omitted_applicable"] = total_applicable_entities > self.entity_limit + spec["total_omitted_applicable"] = total_applicable_entities - self.entity_limit for requirement in spec["requirements"]: total_passed_entities = len(requirement["passed_entities"]) total_failed_entities = len(requirement["failed_entities"]) diff --git a/src/ifctester/ifctester/templates/report.html b/src/ifctester/ifctester/templates/report.html index 456e90e5f48..51beb5c0f54 100644 --- a/src/ifctester/ifctester/templates/report.html +++ b/src/ifctester/ifctester/templates/report.html @@ -152,7 +152,6 @@

    {{name}}

    Requirements

    - {{/has_requirements}}
      {{#requirements}}
    1. @@ -252,6 +251,45 @@

      {{name}}

    2. {{/requirements}}
    + {{/has_requirements}} + {{#is_prohibited}} + {{#total_applicable}} + + + + + + + + + + + + + {{#applicable_entities}} + + + + + + + + + {{#extra_of_type}} + + + + {{/extra_of_type}} + {{/applicable_entities}} + {{#has_omitted_applicable}} + + + + {{/has_omitted_applicable}} + +
    ClassPredefinedTypeNameDescriptionGlobalIdTag
    {{class}}{{predefined_type}}{{name}}{{description}}{{global_id}}{{tag}}
    ... {{extra_of_type}} more of the same element type ({{type_name}} with Tag {{type_tag}} and GlobalId {{type_global_id}}) not shown ...
    ... {{total_omitted_applicable}} more failing elements not shown out of {{total_applicable}} total ...
    + {{/total_applicable}} + {{/is_prohibited}} {{/specifications}} diff --git a/src/ifctester/pyproject.toml b/src/ifctester/pyproject.toml index c174854190c..1be89ed68b3 100644 --- a/src/ifctester/pyproject.toml +++ b/src/ifctester/pyproject.toml @@ -32,3 +32,9 @@ exclude = ["test*"] [tool.setuptools.package-data] "*" = ["*.*"] + +[tool.ruff] +extend = "../../pyproject.toml" +lint.select = [ + "F401", # unused imports +] diff --git a/src/ifctester/test/ids_doc_generator.py b/src/ifctester/test/ids_doc_generator.py index a8323fbeed5..f91decc1a7b 100644 --- a/src/ifctester/test/ids_doc_generator.py +++ b/src/ifctester/test/ids_doc_generator.py @@ -16,6 +16,16 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcTester. If not, see . +""" +Documentation generator for IfcTester IDS facets and test cases. + +This is not a test file. It lives in the test/ directory because it reuses +test cases from test_facet.py and test_ids.py to generate example IFC files, +IDS files, and Markdown documentation into test/build/. + +Run via: make build-ids-docs (from src/ifctester/) +""" + import functools import os import re @@ -24,7 +34,6 @@ from xml.dom.minidom import parseString import ifcopenshell -import ifcopenshell.api import ifcopenshell.api.aggregate import ifcopenshell.api.context import ifcopenshell.api.geometry @@ -41,6 +50,7 @@ from ifcopenshell import validate import ifctester +import ifctester.facet from ifctester import ids outdir = "build" @@ -118,6 +128,8 @@ def __call__(self, name, *, facet, inst, expected): {"name": name, "ids": xml_text, "ifc": ifc_text, "basename": basename, "result": result, "id": inst.id()} ) + ifctester.facet.get_pset.cache_clear() + ifctester.facet.get_psets.cache_clear() assert bool(facet(inst)) is expected def set_facet(self, facet): @@ -141,7 +153,7 @@ def __call__(self, name, ids, ifc, expected, applicable_entities=None, failed_en all_applicable.update(spec.applicable_entities) for requirement in spec.requirements: if requirement.status is False: - all_failures.update(requirement.failed_entities) + all_failures.update(f["element"] for f in requirement.failures) assert set(all_applicable) == set(applicable_entities) assert set(all_failures) == set(failed_entities) @@ -152,7 +164,11 @@ def __call__(self, name, ids, ifc, expected, applicable_entities=None, failed_en l = validate.json_logger() validate.validate(ifc, l) for issue in l.statements: - raise Exception("About to emit invalid example data:", issue) + # test_parsing_entities_with_no_attributes uses nameless IfcMaterial; fix for doc generation. + if issue["instance"].is_a("IfcMaterial") and issue.get("attribute") == "IfcMaterial.Name": + issue["instance"].Name = "Unnamed" + else: + raise Exception("About to emit invalid example data:", issue) lines = ifc.wrapped_data.to_string().split("\n")[7:-3] ifc_text = "" @@ -294,12 +310,12 @@ def __call__(self, name, ids, ifc, expected, applicable_entities=None, failed_en ) specs.specifications.append(spec) spec.applicability.append(ifctester.ids.Entity(name="IFCWALLTYPE")) -restriction = ifctester.ids.Restriction(options={"pattern": "(-|[0-9]{2,3})\/(-|[0-9]{2,3})\/(-|[0-9]{2,3})"}) +restriction = ifctester.ids.Restriction(options={"pattern": r"(-|[0-9]{2,3})/(-|[0-9]{2,3})/(-|[0-9]{2,3})"}) spec.requirements.append( ifctester.ids.Property( propertySet="Pset_WallCommon", - name="FireRating", - datatype="IfcLabel", + baseName="FireRating", + dataType="IfcLabel", value=restriction, instructions="Fire rating is specified using the Fire Resistance Level as defined in the Australian National Construction Code (NCC) 2019. Valid examples include -/-/-, -/120/120, and 60/60/60", ) diff --git a/src/ifctester/test/test_facet.py b/src/ifctester/test/test_facet.py index 2e0a16ec852..3c5d91a6e45 100644 --- a/src/ifctester/test/test_facet.py +++ b/src/ifctester/test/test_facet.py @@ -20,7 +20,6 @@ import uuid import ifcopenshell -import ifcopenshell.api import ifcopenshell.api.aggregate import ifcopenshell.api.classification import ifcopenshell.api.group @@ -34,6 +33,7 @@ import ifcopenshell.api.unit import ifcopenshell.guid import ifcopenshell.util.pset + import ifctester.facet import ifctester.ids from ifctester.facet import ( diff --git a/src/ifctester/test/test_ids.py b/src/ifctester/test/test_ids.py index 0a851a355c4..9410d739489 100644 --- a/src/ifctester/test/test_ids.py +++ b/src/ifctester/test/test_ids.py @@ -20,7 +20,6 @@ from typing import Optional import ifcopenshell -import ifcopenshell.api import ifcopenshell.api.material import pytest import xmlschema diff --git a/src/ifctester/webapp/.gitignore b/src/ifctester/webapp/.gitignore index 4205867691a..f7daf321ef3 100644 --- a/src/ifctester/webapp/.gitignore +++ b/src/ifctester/webapp/.gitignore @@ -11,6 +11,8 @@ node_modules dist dist-ssr *.local +public/worker/bin/ifcopenshell-*.whl +public/worker/generated # Editor directories and files .vscode/* @@ -24,4 +26,4 @@ dist-ssr *.sw? .claude -experiment/* \ No newline at end of file +experiment/* diff --git a/src/ifctester/webapp/biome.json b/src/ifctester/webapp/biome.json new file mode 100644 index 00000000000..ce01c80c3fa --- /dev/null +++ b/src/ifctester/webapp/biome.json @@ -0,0 +1,31 @@ +{ + "$schema": "https://biomejs.dev/schemas/1.9.4/schema.json", + "files": { + "ignore": [ + "dist", + "node_modules", + "public/pyodide", + "**/*.svelte" + ] + }, + "linter": { + "enabled": true, + "rules": { + "recommended": true + } + }, + "overrides": [ + { + "include": [ + "src/modules/wasm/worker/**" + ], + "linter": { + "rules": { + "suspicious": { + "noExplicitAny": "off" + } + } + } + } + ] +} diff --git a/src/ifctester/webapp/index.html b/src/ifctester/webapp/index.html index 27c32440dcf..48ac4cc1c80 100644 --- a/src/ifctester/webapp/index.html +++ b/src/ifctester/webapp/index.html @@ -9,6 +9,6 @@
    - + diff --git a/src/ifctester/webapp/jsconfig.json b/src/ifctester/webapp/jsconfig.json deleted file mode 100644 index 2aef2313e4f..00000000000 --- a/src/ifctester/webapp/jsconfig.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "compilerOptions": { - "moduleResolution": "bundler", - "target": "ESNext", - "module": "ESNext", - /** - * svelte-preprocess cannot figure out whether you have - * a value or a type, so tell TypeScript to enforce using - * `import type` instead of `import` for Types. - */ - "verbatimModuleSyntax": true, - "isolatedModules": true, - "resolveJsonModule": true, - /** - * To have warnings / errors of the Svelte compiler at the - * correct position, enable source maps by default. - */ - "sourceMap": true, - "esModuleInterop": true, - "skipLibCheck": true, - /** - * Typecheck JS in `.svelte` and `.js` files by default. - * Disable this if you'd like to use dynamic types. - */ - "checkJs": false, - "baseUrl": ".", - "paths": { - "$lib": ["./src/lib"], - "$lib/*": ["./src/lib/*"], - "$src": ["./src"], - "$src/*": ["./src/*"] - } - }, - /** - * Use global.d.ts instead of compilerOptions.types - * to avoid limiting type declarations. - */ - "include": ["src/**/*.d.ts", "src/**/*.js", "src/**/*.svelte"] -} diff --git a/src/ifctester/webapp/package-lock.json b/src/ifctester/webapp/package-lock.json index 392c2dfe13b..90a67434436 100644 --- a/src/ifctester/webapp/package-lock.json +++ b/src/ifctester/webapp/package-lock.json @@ -16,6 +16,7 @@ "svelte-spa-router": "^4.0.1" }, "devDependencies": { + "@biomejs/biome": "^1.9.4", "@internationalized/date": "^3.8.1", "@lucide/svelte": "^0.515.0", "@sveltejs/vite-plugin-svelte": "^5.0.3", @@ -24,19 +25,22 @@ "clsx": "^2.1.1", "mode-watcher": "^1.1.0", "sass-embedded": "^1.89.0", - "svelte": "^5.28.1", + "svelte": "^5.53.6", + "svelte-check": "^4.0.0", "svelte-sonner": "^1.0.5", "tailwind-merge": "^3.3.0", "tailwind-variants": "^1.0.0", "tailwindcss": "^4.0.0", "tw-animate-css": "^1.3.2", - "vite": "^6.4.1" + "typescript": "^5.8.3", + "vite": "^6.4.2" } }, "node_modules/@ampproject/remapping": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, "license": "Apache-2.0", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", @@ -46,6 +50,170 @@ "node": ">=6.0.0" } }, + "node_modules/@biomejs/biome": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-1.9.4.tgz", + "integrity": "sha512-1rkd7G70+o9KkTn5KLmDYXihGoTaIGO9PIIN2ZB7UJxFrWw04CZHPYiMRjYsaDvVV7hP1dYNRLxSANLaBFGpog==", + "dev": true, + "hasInstallScript": true, + "license": "MIT OR Apache-2.0", + "bin": { + "biome": "bin/biome" + }, + "engines": { + "node": ">=14.21.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/biome" + }, + "optionalDependencies": { + "@biomejs/cli-darwin-arm64": "1.9.4", + "@biomejs/cli-darwin-x64": "1.9.4", + "@biomejs/cli-linux-arm64": "1.9.4", + "@biomejs/cli-linux-arm64-musl": "1.9.4", + "@biomejs/cli-linux-x64": "1.9.4", + "@biomejs/cli-linux-x64-musl": "1.9.4", + "@biomejs/cli-win32-arm64": "1.9.4", + "@biomejs/cli-win32-x64": "1.9.4" + } + }, + "node_modules/@biomejs/cli-darwin-arm64": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-1.9.4.tgz", + "integrity": "sha512-bFBsPWrNvkdKrNCYeAp+xo2HecOGPAy9WyNyB/jKnnedgzl4W4Hb9ZMzYNbf8dMCGmUdSavlYHiR01QaYR58cw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-darwin-x64": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-1.9.4.tgz", + "integrity": "sha512-ngYBh/+bEedqkSevPVhLP4QfVPCpb+4BBe2p7Xs32dBgs7rh9nY2AIYUL6BgLw1JVXV8GlpKmb/hNiuIxfPfZg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-arm64": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-1.9.4.tgz", + "integrity": "sha512-fJIW0+LYujdjUgJJuwesP4EjIBl/N/TcOX3IvIHJQNsAqvV2CHIogsmA94BPG6jZATS4Hi+xv4SkBBQSt1N4/g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-arm64-musl": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.9.4.tgz", + "integrity": "sha512-v665Ct9WCRjGa8+kTr0CzApU0+XXtRgwmzIf1SeKSGAv+2scAlW6JR5PMFo6FzqqZ64Po79cKODKf3/AAmECqA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-x64": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-1.9.4.tgz", + "integrity": "sha512-lRCJv/Vi3Vlwmbd6K+oQ0KhLHMAysN8lXoCI7XeHlxaajk06u7G+UsFSO01NAs5iYuWKmVZjmiOzJ0OJmGsMwg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-x64-musl": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-1.9.4.tgz", + "integrity": "sha512-gEhi/jSBhZ2m6wjV530Yy8+fNqG8PAinM3oV7CyO+6c3CEh16Eizm21uHVsyVBEB6RIM8JHIl6AGYCv6Q6Q9Tg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-win32-arm64": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-1.9.4.tgz", + "integrity": "sha512-tlbhLk+WXZmgwoIKwHIHEBZUwxml7bRJgk0X2sPyNR3S93cdRq6XulAZRQJ17FYGGzWne0fgrXBKpl7l4M87Hg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-win32-x64": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-1.9.4.tgz", + "integrity": "sha512-8Y5wMhVIPaWe6jw2H+KlEm4wP/f7EW3810ZLmDlrEEy5KvBsb9ECEfu/kMWD484ijfQ8+nIi0giMgu9g1UAuuA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.21.3" + } + }, "node_modules/@bufbuild/protobuf": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.5.1.tgz", @@ -543,6 +711,16 @@ "node": ">=6.0.0" } }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", @@ -588,9 +766,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.41.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.41.1.tgz", - "integrity": "sha512-NELNvyEWZ6R9QMkiytB4/L4zSEaBC03KIXEghptLGLZWJ6VPrL63ooZQCOnlx36aQPGhzuOMwDerC1Eb2VmrLw==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.59.0.tgz", + "integrity": "sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==", "cpu": [ "arm" ], @@ -602,9 +780,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.41.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.41.1.tgz", - "integrity": "sha512-DXdQe1BJ6TK47ukAoZLehRHhfKnKg9BjnQYUu9gzhI8Mwa1d2fzxA1aw2JixHVl403bwp1+/o/NhhHtxWJBgEA==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.59.0.tgz", + "integrity": "sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==", "cpu": [ "arm64" ], @@ -616,9 +794,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.41.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.41.1.tgz", - "integrity": "sha512-5afxvwszzdulsU2w8JKWwY8/sJOLPzf0e1bFuvcW5h9zsEg+RQAojdW0ux2zyYAz7R8HvvzKCjLNJhVq965U7w==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.59.0.tgz", + "integrity": "sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==", "cpu": [ "arm64" ], @@ -630,9 +808,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.41.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.41.1.tgz", - "integrity": "sha512-egpJACny8QOdHNNMZKf8xY0Is6gIMz+tuqXlusxquWu3F833DcMwmGM7WlvCO9sB3OsPjdC4U0wHw5FabzCGZg==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.59.0.tgz", + "integrity": "sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==", "cpu": [ "x64" ], @@ -644,9 +822,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.41.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.41.1.tgz", - "integrity": "sha512-DBVMZH5vbjgRk3r0OzgjS38z+atlupJ7xfKIDJdZZL6sM6wjfDNo64aowcLPKIx7LMQi8vybB56uh1Ftck/Atg==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.59.0.tgz", + "integrity": "sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==", "cpu": [ "arm64" ], @@ -658,9 +836,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.41.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.41.1.tgz", - "integrity": "sha512-3FkydeohozEskBxNWEIbPfOE0aqQgB6ttTkJ159uWOFn42VLyfAiyD9UK5mhu+ItWzft60DycIN1Xdgiy8o/SA==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.59.0.tgz", + "integrity": "sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==", "cpu": [ "x64" ], @@ -672,9 +850,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.41.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.41.1.tgz", - "integrity": "sha512-wC53ZNDgt0pqx5xCAgNunkTzFE8GTgdZ9EwYGVcg+jEjJdZGtq9xPjDnFgfFozQI/Xm1mh+D9YlYtl+ueswNEg==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.59.0.tgz", + "integrity": "sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==", "cpu": [ "arm" ], @@ -686,9 +864,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.41.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.41.1.tgz", - "integrity": "sha512-jwKCca1gbZkZLhLRtsrka5N8sFAaxrGz/7wRJ8Wwvq3jug7toO21vWlViihG85ei7uJTpzbXZRcORotE+xyrLA==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.59.0.tgz", + "integrity": "sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==", "cpu": [ "arm" ], @@ -700,9 +878,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.41.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.41.1.tgz", - "integrity": "sha512-g0UBcNknsmmNQ8V2d/zD2P7WWfJKU0F1nu0k5pW4rvdb+BIqMm8ToluW/eeRmxCared5dD76lS04uL4UaNgpNA==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.59.0.tgz", + "integrity": "sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==", "cpu": [ "arm64" ], @@ -714,9 +892,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.41.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.41.1.tgz", - "integrity": "sha512-XZpeGB5TKEZWzIrj7sXr+BEaSgo/ma/kCgrZgL0oo5qdB1JlTzIYQKel/RmhT6vMAvOdM2teYlAaOGJpJ9lahg==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.59.0.tgz", + "integrity": "sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==", "cpu": [ "arm64" ], @@ -727,10 +905,24 @@ "linux" ] }, - "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.41.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.41.1.tgz", - "integrity": "sha512-bkCfDJ4qzWfFRCNt5RVV4DOw6KEgFTUZi2r2RuYhGWC8WhCA8lCAJhDeAmrM/fdiAH54m0mA0Vk2FGRPyzI+tw==", + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.59.0.tgz", + "integrity": "sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.59.0.tgz", + "integrity": "sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==", "cpu": [ "loong64" ], @@ -741,10 +933,24 @@ "linux" ] }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.41.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.41.1.tgz", - "integrity": "sha512-3mr3Xm+gvMX+/8EKogIZSIEF0WUu0HL9di+YWlJpO8CQBnoLAEL/roTCxuLncEdgcfJcvA4UMOf+2dnjl4Ut1A==", + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.59.0.tgz", + "integrity": "sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.59.0.tgz", + "integrity": "sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==", "cpu": [ "ppc64" ], @@ -756,9 +962,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.41.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.41.1.tgz", - "integrity": "sha512-3rwCIh6MQ1LGrvKJitQjZFuQnT2wxfU+ivhNBzmxXTXPllewOF7JR1s2vMX/tWtUYFgphygxjqMl76q4aMotGw==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.59.0.tgz", + "integrity": "sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==", "cpu": [ "riscv64" ], @@ -770,9 +976,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.41.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.41.1.tgz", - "integrity": "sha512-LdIUOb3gvfmpkgFZuccNa2uYiqtgZAz3PTzjuM5bH3nvuy9ty6RGc/Q0+HDFrHrizJGVpjnTZ1yS5TNNjFlklw==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.59.0.tgz", + "integrity": "sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==", "cpu": [ "riscv64" ], @@ -784,9 +990,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.41.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.41.1.tgz", - "integrity": "sha512-oIE6M8WC9ma6xYqjvPhzZYk6NbobIURvP/lEbh7FWplcMO6gn7MM2yHKA1eC/GvYwzNKK/1LYgqzdkZ8YFxR8g==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.59.0.tgz", + "integrity": "sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==", "cpu": [ "s390x" ], @@ -798,9 +1004,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.41.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.41.1.tgz", - "integrity": "sha512-cWBOvayNvA+SyeQMp79BHPK8ws6sHSsYnK5zDcsC3Hsxr1dgTABKjMnMslPq1DvZIp6uO7kIWhiGwaTdR4Og9A==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.59.0.tgz", + "integrity": "sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==", "cpu": [ "x64" ], @@ -812,9 +1018,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.41.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.41.1.tgz", - "integrity": "sha512-y5CbN44M+pUCdGDlZFzGGBSKCA4A/J2ZH4edTYSSxFg7ce1Xt3GtydbVKWLlzL+INfFIZAEg1ZV6hh9+QQf9YQ==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.59.0.tgz", + "integrity": "sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==", "cpu": [ "x64" ], @@ -825,10 +1031,38 @@ "linux" ] }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.59.0.tgz", + "integrity": "sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.59.0.tgz", + "integrity": "sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.41.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.41.1.tgz", - "integrity": "sha512-lZkCxIrjlJlMt1dLO/FbpZbzt6J/A8p4DnqzSa4PWqPEUUUnzXLeki/iyPLfV0BmHItlYgHUqJe+3KiyydmiNQ==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.59.0.tgz", + "integrity": "sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==", "cpu": [ "arm64" ], @@ -840,9 +1074,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.41.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.41.1.tgz", - "integrity": "sha512-+psFT9+pIh2iuGsxFYYa/LhS5MFKmuivRsx9iPJWNSGbh2XVEjk90fmpUEjCnILPEPJnikAU6SFDiEUyOv90Pg==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.59.0.tgz", + "integrity": "sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==", "cpu": [ "ia32" ], @@ -853,10 +1087,24 @@ "win32" ] }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.59.0.tgz", + "integrity": "sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.41.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.41.1.tgz", - "integrity": "sha512-Wq2zpapRYLfi4aKxf2Xff0tN+7slj2d4R87WEzqw7ZLsVvO5zwYCIuEGSZYiK41+GlwUo1HiR+GdkLEJnCKTCw==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.59.0.tgz", + "integrity": "sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==", "cpu": [ "x64" ], @@ -1270,9 +1518,15 @@ } }, "node_modules/@types/estree": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", - "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "license": "MIT" + }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", "license": "MIT" }, "node_modules/acorn": { @@ -1288,9 +1542,9 @@ } }, "node_modules/aria-query": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", - "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.1.tgz", + "integrity": "sha512-Z/ZeOgVl7bcSYZ/u/rh0fOpvEpq//LZmdbkXyc7syVzjPAhfOa9ebsdTSjEBDU4vs5nC98Kfduj1uFo0qyET3g==", "license": "Apache-2.0", "engines": { "node": ">= 0.4" @@ -1381,6 +1635,22 @@ "dev": true, "license": "MIT/X11" }, + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/chownr": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", @@ -1411,7 +1681,6 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", - "dev": true, "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -1445,6 +1714,12 @@ "node": ">=8" } }, + "node_modules/devalue": { + "version": "5.6.4", + "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.6.4.tgz", + "integrity": "sha512-Gp6rDldRsFh/7XuouDbxMH3Mx8GMCcgzIb1pDTvNyn8pZGQ22u+Wa+lGV9dQCltFQ7uVw0MhRyb8XDskNFOReA==", + "license": "MIT" + }, "node_modules/engine.io-client": { "version": "6.6.3", "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.6.3.tgz", @@ -1546,9 +1821,9 @@ "license": "MIT" }, "node_modules/esrap": { - "version": "1.4.6", - "resolved": "https://registry.npmjs.org/esrap/-/esrap-1.4.6.tgz", - "integrity": "sha512-F/D2mADJ9SHY3IwksD4DAXjTt7qt7GWUf3/8RhCNWmC/67tyb55dpimHmy7EplakFaflV0R/PC+fdSPqrRHAQw==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/esrap/-/esrap-2.2.3.tgz", + "integrity": "sha512-8fOS+GIGCQZl/ZIlhl59htOlms6U8NvX6ZYgYHpRU/b6tVSh3uHkOHZikl3D4cMbYM0JlpBe+p/BkZEi8J9XIQ==", "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" @@ -1639,9 +1914,9 @@ "license": "BSD-3-Clause" }, "node_modules/immutable": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.2.tgz", - "integrity": "sha512-qHKXW1q6liAk1Oys6umoaZbDRqjcjgSrbnrifHsfsttza7zcvRAsL7mMV6xWcyhwQy7Xj5v4hhbr6b+iDYwlmQ==", + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.5.tgz", + "integrity": "sha512-t7xcm2siw+hlUM68I+UEOK+z84RzmN59as9DZ7P1l0994DKUWV7UXBMQZVxaoMSRQ+PBZbHCOoBt7a2wxOMt+A==", "dev": true, "license": "MIT" }, @@ -1955,9 +2230,9 @@ } }, "node_modules/minizlib": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.2.tgz", - "integrity": "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", + "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", "dev": true, "license": "MIT", "dependencies": { @@ -1967,22 +2242,6 @@ "node": ">= 18" } }, - "node_modules/mkdirp": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", - "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", - "dev": true, - "license": "MIT", - "bin": { - "mkdirp": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/mode-watcher": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/mode-watcher/-/mode-watcher-1.1.0.tgz", @@ -2050,6 +2309,16 @@ "svelte": "^5.7.0" } }, + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -2083,9 +2352,9 @@ "license": "ISC" }, "node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "dev": true, "license": "MIT", "engines": { @@ -2124,6 +2393,20 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/regexparam": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/regexparam/-/regexparam-2.0.2.tgz", @@ -2134,13 +2417,13 @@ } }, "node_modules/rollup": { - "version": "4.41.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.41.1.tgz", - "integrity": "sha512-cPmwD3FnFv8rKMBc1MxWCwVQFxwf1JEmSX3iQXrRVVG15zerAIXRjMFVWnd5Q5QvgKF7Aj+5ykXFhUl+QGnyOw==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.59.0.tgz", + "integrity": "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==", "dev": true, "license": "MIT", "dependencies": { - "@types/estree": "1.0.7" + "@types/estree": "1.0.8" }, "bin": { "rollup": "dist/bin/rollup" @@ -2150,26 +2433,31 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.41.1", - "@rollup/rollup-android-arm64": "4.41.1", - "@rollup/rollup-darwin-arm64": "4.41.1", - "@rollup/rollup-darwin-x64": "4.41.1", - "@rollup/rollup-freebsd-arm64": "4.41.1", - "@rollup/rollup-freebsd-x64": "4.41.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.41.1", - "@rollup/rollup-linux-arm-musleabihf": "4.41.1", - "@rollup/rollup-linux-arm64-gnu": "4.41.1", - "@rollup/rollup-linux-arm64-musl": "4.41.1", - "@rollup/rollup-linux-loongarch64-gnu": "4.41.1", - "@rollup/rollup-linux-powerpc64le-gnu": "4.41.1", - "@rollup/rollup-linux-riscv64-gnu": "4.41.1", - "@rollup/rollup-linux-riscv64-musl": "4.41.1", - "@rollup/rollup-linux-s390x-gnu": "4.41.1", - "@rollup/rollup-linux-x64-gnu": "4.41.1", - "@rollup/rollup-linux-x64-musl": "4.41.1", - "@rollup/rollup-win32-arm64-msvc": "4.41.1", - "@rollup/rollup-win32-ia32-msvc": "4.41.1", - "@rollup/rollup-win32-x64-msvc": "4.41.1", + "@rollup/rollup-android-arm-eabi": "4.59.0", + "@rollup/rollup-android-arm64": "4.59.0", + "@rollup/rollup-darwin-arm64": "4.59.0", + "@rollup/rollup-darwin-x64": "4.59.0", + "@rollup/rollup-freebsd-arm64": "4.59.0", + "@rollup/rollup-freebsd-x64": "4.59.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.59.0", + "@rollup/rollup-linux-arm-musleabihf": "4.59.0", + "@rollup/rollup-linux-arm64-gnu": "4.59.0", + "@rollup/rollup-linux-arm64-musl": "4.59.0", + "@rollup/rollup-linux-loong64-gnu": "4.59.0", + "@rollup/rollup-linux-loong64-musl": "4.59.0", + "@rollup/rollup-linux-ppc64-gnu": "4.59.0", + "@rollup/rollup-linux-ppc64-musl": "4.59.0", + "@rollup/rollup-linux-riscv64-gnu": "4.59.0", + "@rollup/rollup-linux-riscv64-musl": "4.59.0", + "@rollup/rollup-linux-s390x-gnu": "4.59.0", + "@rollup/rollup-linux-x64-gnu": "4.59.0", + "@rollup/rollup-linux-x64-musl": "4.59.0", + "@rollup/rollup-openbsd-x64": "4.59.0", + "@rollup/rollup-openharmony-arm64": "4.59.0", + "@rollup/rollup-win32-arm64-msvc": "4.59.0", + "@rollup/rollup-win32-ia32-msvc": "4.59.0", + "@rollup/rollup-win32-x64-gnu": "4.59.0", + "@rollup/rollup-win32-x64-msvc": "4.59.0", "fsevents": "~2.3.2" } }, @@ -2200,6 +2488,19 @@ "tslib": "^2.1.0" } }, + "node_modules/sade": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", + "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "mri": "^1.1.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/sass-embedded": { "version": "1.89.0", "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.89.0.tgz", @@ -2618,35 +2919,18 @@ } }, "node_modules/socket.io-parser": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", - "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.6.tgz", + "integrity": "sha512-asJqbVBDsBCJx0pTqw3WfesSY0iRX+2xzWEWzrpcH7L6fLzrhyF8WPI8UaeM4YCuDfpwA/cgsdugMsmtz8EJeg==", "license": "MIT", "dependencies": { "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.1" + "debug": "~4.4.1" }, "engines": { "node": ">=10.0.0" } }, - "node_modules/socket.io-parser/node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", @@ -2693,21 +2977,23 @@ } }, "node_modules/svelte": { - "version": "5.33.10", - "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.33.10.tgz", - "integrity": "sha512-/yArPQIBoQS2p86LKnvJywOXkVHeEXnFgrDPSxkEfIAEkykopYuy2bF6UUqHG4IbZlJD6OurLxJT8Kn7kTk9WA==", + "version": "5.53.6", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.53.6.tgz", + "integrity": "sha512-lP5DGF3oDDI9fhHcSpaBiJEkFLuS16h92DhM1L5K1lFm0WjOmUh1i2sNkBBk8rkxJRpob0dBE75jRfUzGZUOGA==", "license": "MIT", "dependencies": { - "@ampproject/remapping": "^2.3.0", + "@jridgewell/remapping": "^2.3.4", "@jridgewell/sourcemap-codec": "^1.5.0", "@sveltejs/acorn-typescript": "^1.0.5", "@types/estree": "^1.0.5", + "@types/trusted-types": "^2.0.7", "acorn": "^8.12.1", - "aria-query": "^5.3.1", + "aria-query": "5.3.1", "axobject-query": "^4.1.0", "clsx": "^2.1.1", + "devalue": "^5.6.3", "esm-env": "^1.2.1", - "esrap": "^1.4.6", + "esrap": "^2.2.2", "is-reference": "^3.0.3", "locate-character": "^3.0.0", "magic-string": "^0.30.11", @@ -2717,6 +3003,30 @@ "node": ">=18" } }, + "node_modules/svelte-check": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-4.3.5.tgz", + "integrity": "sha512-e4VWZETyXaKGhpkxOXP+B/d0Fp/zKViZoJmneZWe/05Y2aqSKj3YN2nLfYPJBQ87WEiY4BQCQ9hWGu9mPT1a1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "chokidar": "^4.0.1", + "fdir": "^6.2.0", + "picocolors": "^1.0.0", + "sade": "^1.7.4" + }, + "bin": { + "svelte-check": "bin/svelte-check" + }, + "engines": { + "node": ">= 18.0.0" + }, + "peerDependencies": { + "svelte": "^4.0.0 || ^5.0.0-next.0", + "typescript": ">=5.0.0" + } + }, "node_modules/svelte-sonner": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/svelte-sonner/-/svelte-sonner-1.0.5.tgz", @@ -2867,17 +3177,16 @@ } }, "node_modules/tar": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", - "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", + "version": "7.5.11", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.11.tgz", + "integrity": "sha512-ChjMH33/KetonMTAtpYdgUFr0tbz69Fp2v7zWxQfYZX4g5ZN2nOBXm1R2xyA+lMIKrLKIoKAwFj93jE/avX9cQ==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", "minipass": "^7.1.2", - "minizlib": "^3.0.1", - "mkdirp": "^3.0.1", + "minizlib": "^3.1.0", "yallist": "^5.0.0" }, "engines": { @@ -2918,6 +3227,20 @@ "url": "https://github.com/sponsors/Wombosvideo" } }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, "node_modules/uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", @@ -2941,9 +3264,9 @@ "license": "MIT" }, "node_modules/vite": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.1.tgz", - "integrity": "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.2.tgz", + "integrity": "sha512-2N/55r4JDJ4gdrCvGgINMy+HH3iRpNIz8K6SFwVsA+JbQScLiC+clmAxBgwiSPgcG9U15QmvqCGWzMbqda5zGQ==", "dev": true, "license": "MIT", "dependencies": { diff --git a/src/ifctester/webapp/package.json b/src/ifctester/webapp/package.json index 4a8abd7897e..f36baf96ec3 100644 --- a/src/ifctester/webapp/package.json +++ b/src/ifctester/webapp/package.json @@ -6,11 +6,15 @@ "scripts": { "dev": "vite", "build": "vite build", + "check": "tsc -p tsconfig.json --noEmit && svelte-check && biome lint .", + "lint": "biome lint .", + "lint:fix": "biome lint --write .", "preview": "vite preview", "deploy": "npm run build && npx wrangler pages deploy dist" }, "devDependencies": { "@internationalized/date": "^3.8.1", + "@biomejs/biome": "^1.9.4", "@lucide/svelte": "^0.515.0", "@sveltejs/vite-plugin-svelte": "^5.0.3", "@tailwindcss/vite": "^4.0.0", @@ -18,13 +22,15 @@ "clsx": "^2.1.1", "mode-watcher": "^1.1.0", "sass-embedded": "^1.89.0", - "svelte": "^5.28.1", + "svelte": "^5.53.6", + "svelte-check": "^4.0.0", "svelte-sonner": "^1.0.5", "tailwind-merge": "^3.3.0", "tailwind-variants": "^1.0.0", "tailwindcss": "^4.0.0", + "typescript": "^5.8.3", "tw-animate-css": "^1.3.2", - "vite": "^6.4.1" + "vite": "^6.4.2" }, "dependencies": { "eventemitter3": "^5.0.1", diff --git a/src/ifctester/webapp/public/worker/api.py b/src/ifctester/webapp/public/worker/api.py index dafc61c6463..c7d3a906628 100644 --- a/src/ifctester/webapp/public/worker/api.py +++ b/src/ifctester/webapp/public/worker/api.py @@ -1,13 +1,10 @@ -import xml.etree.ElementTree as ET - import ifcopenshell -import ifcopenshell.util import ifcopenshell.util.attribute import ifcopenshell.util.pset -import ifcopenshell.util.schema -from ifctester.ids import Ids, IdsXmlValidationError, get_schema from xmlschema.validators.exceptions import XMLSchemaValidationError +from ifctester.ids import Ids, IdsXmlValidationError, get_schema + # https://github.com/buildingSMART/IDS/blob/9914d568c7ac037acd97e58a0d16e9f93c3e3416/Schema/ids.xsd#L232 ifc_schemas = ["IFC2X3", "IFC4", "IFC4X3_ADD2"] diff --git a/src/ifctester/webapp/public/worker/bin/ifcopenshell-0.8.3+bb329af-cp313-cp313-emscripten_4_0_9_wasm32.whl b/src/ifctester/webapp/public/worker/bin/ifcopenshell-0.8.3+bb329af-cp313-cp313-emscripten_4_0_9_wasm32.whl deleted file mode 100644 index 703ae3b8779..00000000000 Binary files a/src/ifctester/webapp/public/worker/bin/ifcopenshell-0.8.3+bb329af-cp313-cp313-emscripten_4_0_9_wasm32.whl and /dev/null differ diff --git a/src/ifctester/webapp/serve.py b/src/ifctester/webapp/serve.py index 5b18f155451..c114b475428 100644 --- a/src/ifctester/webapp/serve.py +++ b/src/ifctester/webapp/serve.py @@ -22,9 +22,6 @@ import sys bonsai_lib_path = os.environ.get("BONSAI_LIB_PATH") -print(os.environ) -print(bonsai_lib_path) -bonsai_version = os.environ.get("BONSAI_VERSION") if bonsai_lib_path: sys.path.insert(0, bonsai_lib_path) diff --git a/src/ifctester/webapp/src/App.svelte b/src/ifctester/webapp/src/App.svelte index 19222ad8d1f..27b5c8001b6 100644 --- a/src/ifctester/webapp/src/App.svelte +++ b/src/ifctester/webapp/src/App.svelte @@ -1,4 +1,4 @@ - diff --git a/src/ifctester/webapp/src/app.d.ts b/src/ifctester/webapp/src/app.d.ts new file mode 100644 index 00000000000..ff864896262 --- /dev/null +++ b/src/ifctester/webapp/src/app.d.ts @@ -0,0 +1,4 @@ +declare module "*.svelte" { + import type { SvelteComponent } from "svelte"; + export default class Component extends SvelteComponent {} +} diff --git a/src/ifctester/webapp/src/components/AppHeader.svelte b/src/ifctester/webapp/src/components/AppHeader.svelte index 61f8a5b3b22..8fb71b61805 100644 --- a/src/ifctester/webapp/src/components/AppHeader.svelte +++ b/src/ifctester/webapp/src/components/AppHeader.svelte @@ -1,11 +1,11 @@ - @@ -142,4 +143,4 @@ - \ No newline at end of file + diff --git a/src/ifctester/webapp/src/components/AppRibbon.svelte b/src/ifctester/webapp/src/components/AppRibbon.svelte index 4f9643637e3..662a93b500d 100644 --- a/src/ifctester/webapp/src/components/AppRibbon.svelte +++ b/src/ifctester/webapp/src/components/AppRibbon.svelte @@ -1,6 +1,5 @@ -
    @@ -20,4 +19,4 @@ Error
    {/if} - \ No newline at end of file + diff --git a/src/ifctester/webapp/src/components/AppToolbar.svelte b/src/ifctester/webapp/src/components/AppToolbar.svelte index 3552b13969d..c9b3dd29683 100644 --- a/src/ifctester/webapp/src/components/AppToolbar.svelte +++ b/src/ifctester/webapp/src/components/AppToolbar.svelte @@ -1,14 +1,16 @@ - @@ -63,4 +65,4 @@ Part Of - \ No newline at end of file + diff --git a/src/ifctester/webapp/src/components/IdsTabs.svelte b/src/ifctester/webapp/src/components/IdsTabs.svelte index 0f6f38a569b..25d6891ab77 100644 --- a/src/ifctester/webapp/src/components/IdsTabs.svelte +++ b/src/ifctester/webapp/src/components/IdsTabs.svelte @@ -1,13 +1,22 @@ -
    @@ -15,10 +24,13 @@
    switchDocument(docId)} - aria-label={doc.info.title || "Untitled"} + onkeydown={(event) => handleActivation(event, () => switchDocument(docId))} + aria-label={(doc as IdsDocument).info.title || "Untitled"} > - {doc.info.title || "Untitled"} + {(doc as IdsDocument).info.title || "Untitled"}
    {/each}
    -
    \ No newline at end of file + diff --git a/src/ifctester/webapp/src/config.json b/src/ifctester/webapp/src/config.json index d5c450f4602..f4f469178fa 100644 --- a/src/ifctester/webapp/src/config.json +++ b/src/ifctester/webapp/src/config.json @@ -1,8 +1,7 @@ { "wasm": { - "wheel_url": "/worker/bin/ifcopenshell-0.8.3+bb329af-cp313-cp313-emscripten_4_0_9_wasm32.whl", + "wheel_url": "/worker/bin/ifcopenshell-0.8.5+a51b2c5-cp313-cp313-pyodide_2025_0_wasm32.whl", "odfpy_url": "/worker/bin/odfpy-1.4.2-py2.py3-none-any.whl", - "api_py_url": "/worker/api.py", - "pyodide_url": "https://cdn.jsdelivr.net/pyodide/v0.28.0/full/pyodide.js" + "api_py_url": "/worker/api.py" } -} \ No newline at end of file +} diff --git a/src/ifctester/webapp/src/css/app.css b/src/ifctester/webapp/src/css/app.css index a8210b43e88..09f12f3b9fe 100644 --- a/src/ifctester/webapp/src/css/app.css +++ b/src/ifctester/webapp/src/css/app.css @@ -576,7 +576,8 @@ html, body { display: flex; flex-direction: column; - label { + label, + .form-label { margin-bottom: 4px; font-size: 14px; font-weight: 500; diff --git a/src/ifctester/webapp/src/lib/components/ui/dialog/dialog-close.svelte b/src/ifctester/webapp/src/lib/components/ui/dialog/dialog-close.svelte index 94266a6315c..a6ac3f979af 100644 --- a/src/ifctester/webapp/src/lib/components/ui/dialog/dialog-close.svelte +++ b/src/ifctester/webapp/src/lib/components/ui/dialog/dialog-close.svelte @@ -1,7 +1,11 @@ - - \ No newline at end of file + diff --git a/src/ifctester/webapp/src/lib/components/ui/dialog/dialog-content.svelte b/src/ifctester/webapp/src/lib/components/ui/dialog/dialog-content.svelte index 9ceaa7faf72..17d98fe392c 100644 --- a/src/ifctester/webapp/src/lib/components/ui/dialog/dialog-content.svelte +++ b/src/ifctester/webapp/src/lib/components/ui/dialog/dialog-content.svelte @@ -1,8 +1,17 @@ - @@ -35,4 +44,4 @@ {/if} - \ No newline at end of file + diff --git a/src/ifctester/webapp/src/lib/components/ui/dialog/dialog-description.svelte b/src/ifctester/webapp/src/lib/components/ui/dialog/dialog-description.svelte index 419a27e449a..0f91cf0670d 100644 --- a/src/ifctester/webapp/src/lib/components/ui/dialog/dialog-description.svelte +++ b/src/ifctester/webapp/src/lib/components/ui/dialog/dialog-description.svelte @@ -1,12 +1,17 @@ - \ No newline at end of file +/> diff --git a/src/ifctester/webapp/src/lib/components/ui/dialog/dialog-footer.svelte b/src/ifctester/webapp/src/lib/components/ui/dialog/dialog-footer.svelte index b2d4035e6e0..7071ae2a0ca 100644 --- a/src/ifctester/webapp/src/lib/components/ui/dialog/dialog-footer.svelte +++ b/src/ifctester/webapp/src/lib/components/ui/dialog/dialog-footer.svelte @@ -1,11 +1,19 @@ -
    {@render children?.()} -
    \ No newline at end of file + diff --git a/src/ifctester/webapp/src/lib/components/ui/dialog/dialog-header.svelte b/src/ifctester/webapp/src/lib/components/ui/dialog/dialog-header.svelte index 791dcde5d7a..9bb73aa6016 100644 --- a/src/ifctester/webapp/src/lib/components/ui/dialog/dialog-header.svelte +++ b/src/ifctester/webapp/src/lib/components/ui/dialog/dialog-header.svelte @@ -1,12 +1,19 @@ -
    {@render children?.()} -
    \ No newline at end of file + diff --git a/src/ifctester/webapp/src/lib/components/ui/dialog/dialog-overlay.svelte b/src/ifctester/webapp/src/lib/components/ui/dialog/dialog-overlay.svelte index adb8a38e941..90e31041480 100644 --- a/src/ifctester/webapp/src/lib/components/ui/dialog/dialog-overlay.svelte +++ b/src/ifctester/webapp/src/lib/components/ui/dialog/dialog-overlay.svelte @@ -1,12 +1,17 @@ - \ No newline at end of file +/> diff --git a/src/ifctester/webapp/src/lib/components/ui/dialog/dialog-title.svelte b/src/ifctester/webapp/src/lib/components/ui/dialog/dialog-title.svelte index 2d36371d01d..866d5ef826d 100644 --- a/src/ifctester/webapp/src/lib/components/ui/dialog/dialog-title.svelte +++ b/src/ifctester/webapp/src/lib/components/ui/dialog/dialog-title.svelte @@ -1,12 +1,17 @@ - \ No newline at end of file +/> diff --git a/src/ifctester/webapp/src/lib/components/ui/dialog/dialog-trigger.svelte b/src/ifctester/webapp/src/lib/components/ui/dialog/dialog-trigger.svelte index 7a38ff9e6a2..5636ea2df14 100644 --- a/src/ifctester/webapp/src/lib/components/ui/dialog/dialog-trigger.svelte +++ b/src/ifctester/webapp/src/lib/components/ui/dialog/dialog-trigger.svelte @@ -1,7 +1,11 @@ - - \ No newline at end of file + diff --git a/src/ifctester/webapp/src/lib/components/ui/dialog/index.js b/src/ifctester/webapp/src/lib/components/ui/dialog/index.ts similarity index 100% rename from src/ifctester/webapp/src/lib/components/ui/dialog/index.js rename to src/ifctester/webapp/src/lib/components/ui/dialog/index.ts diff --git a/src/ifctester/webapp/src/lib/components/ui/dropdown-menu/dropdown-menu-checkbox-item.svelte b/src/ifctester/webapp/src/lib/components/ui/dropdown-menu/dropdown-menu-checkbox-item.svelte index fc034efd31e..242f3088eff 100644 --- a/src/ifctester/webapp/src/lib/components/ui/dropdown-menu/dropdown-menu-checkbox-item.svelte +++ b/src/ifctester/webapp/src/lib/components/ui/dropdown-menu/dropdown-menu-checkbox-item.svelte @@ -1,8 +1,16 @@ - {@render childrenProp?.()} {/snippet} - \ No newline at end of file + diff --git a/src/ifctester/webapp/src/lib/components/ui/dropdown-menu/dropdown-menu-content.svelte b/src/ifctester/webapp/src/lib/components/ui/dropdown-menu/dropdown-menu-content.svelte index d13c1ad08d9..b793c23e850 100644 --- a/src/ifctester/webapp/src/lib/components/ui/dropdown-menu/dropdown-menu-content.svelte +++ b/src/ifctester/webapp/src/lib/components/ui/dropdown-menu/dropdown-menu-content.svelte @@ -1,14 +1,21 @@ - @@ -22,4 +29,4 @@ )} {...restProps} /> - \ No newline at end of file + diff --git a/src/ifctester/webapp/src/lib/components/ui/dropdown-menu/dropdown-menu-group-heading.svelte b/src/ifctester/webapp/src/lib/components/ui/dropdown-menu/dropdown-menu-group-heading.svelte index 89454b26dfe..83032fee1e3 100644 --- a/src/ifctester/webapp/src/lib/components/ui/dropdown-menu/dropdown-menu-group-heading.svelte +++ b/src/ifctester/webapp/src/lib/components/ui/dropdown-menu/dropdown-menu-group-heading.svelte @@ -1,12 +1,17 @@ - \ No newline at end of file +/> diff --git a/src/ifctester/webapp/src/lib/components/ui/dropdown-menu/dropdown-menu-group.svelte b/src/ifctester/webapp/src/lib/components/ui/dropdown-menu/dropdown-menu-group.svelte index 4f3421fbe86..55220a4783d 100644 --- a/src/ifctester/webapp/src/lib/components/ui/dropdown-menu/dropdown-menu-group.svelte +++ b/src/ifctester/webapp/src/lib/components/ui/dropdown-menu/dropdown-menu-group.svelte @@ -1,7 +1,11 @@ - - \ No newline at end of file + diff --git a/src/ifctester/webapp/src/lib/components/ui/dropdown-menu/dropdown-menu-item.svelte b/src/ifctester/webapp/src/lib/components/ui/dropdown-menu/dropdown-menu-item.svelte index a06f2099dde..20744df2889 100644 --- a/src/ifctester/webapp/src/lib/components/ui/dropdown-menu/dropdown-menu-item.svelte +++ b/src/ifctester/webapp/src/lib/components/ui/dropdown-menu/dropdown-menu-item.svelte @@ -1,14 +1,21 @@ - \ No newline at end of file +/> diff --git a/src/ifctester/webapp/src/lib/components/ui/dropdown-menu/dropdown-menu-label.svelte b/src/ifctester/webapp/src/lib/components/ui/dropdown-menu/dropdown-menu-label.svelte index e0aceee7d31..2fc90b933b6 100644 --- a/src/ifctester/webapp/src/lib/components/ui/dropdown-menu/dropdown-menu-label.svelte +++ b/src/ifctester/webapp/src/lib/components/ui/dropdown-menu/dropdown-menu-label.svelte @@ -1,12 +1,20 @@ -
    {@render children?.()} -
    \ No newline at end of file + diff --git a/src/ifctester/webapp/src/lib/components/ui/dropdown-menu/dropdown-menu-radio-group.svelte b/src/ifctester/webapp/src/lib/components/ui/dropdown-menu/dropdown-menu-radio-group.svelte index 009a4dd02d8..0be28956313 100644 --- a/src/ifctester/webapp/src/lib/components/ui/dropdown-menu/dropdown-menu-radio-group.svelte +++ b/src/ifctester/webapp/src/lib/components/ui/dropdown-menu/dropdown-menu-radio-group.svelte @@ -1,11 +1,16 @@ - \ No newline at end of file +/> diff --git a/src/ifctester/webapp/src/lib/components/ui/dropdown-menu/dropdown-menu-radio-item.svelte b/src/ifctester/webapp/src/lib/components/ui/dropdown-menu/dropdown-menu-radio-item.svelte index 218db7f78a9..629cc375631 100644 --- a/src/ifctester/webapp/src/lib/components/ui/dropdown-menu/dropdown-menu-radio-item.svelte +++ b/src/ifctester/webapp/src/lib/components/ui/dropdown-menu/dropdown-menu-radio-item.svelte @@ -1,14 +1,22 @@ - {@render childrenProp?.({ checked })} {/snippet} - \ No newline at end of file + diff --git a/src/ifctester/webapp/src/lib/components/ui/dropdown-menu/dropdown-menu-separator.svelte b/src/ifctester/webapp/src/lib/components/ui/dropdown-menu/dropdown-menu-separator.svelte index 4d02884d170..533e47c5747 100644 --- a/src/ifctester/webapp/src/lib/components/ui/dropdown-menu/dropdown-menu-separator.svelte +++ b/src/ifctester/webapp/src/lib/components/ui/dropdown-menu/dropdown-menu-separator.svelte @@ -1,12 +1,17 @@ - \ No newline at end of file +/> diff --git a/src/ifctester/webapp/src/lib/components/ui/dropdown-menu/dropdown-menu-shortcut.svelte b/src/ifctester/webapp/src/lib/components/ui/dropdown-menu/dropdown-menu-shortcut.svelte index 20f2210c5a7..93b6175647c 100644 --- a/src/ifctester/webapp/src/lib/components/ui/dropdown-menu/dropdown-menu-shortcut.svelte +++ b/src/ifctester/webapp/src/lib/components/ui/dropdown-menu/dropdown-menu-shortcut.svelte @@ -1,12 +1,19 @@ - {@render children?.()} - \ No newline at end of file + diff --git a/src/ifctester/webapp/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-content.svelte b/src/ifctester/webapp/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-content.svelte index 0f3c698fea2..7a33ac199cd 100644 --- a/src/ifctester/webapp/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-content.svelte +++ b/src/ifctester/webapp/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-content.svelte @@ -1,12 +1,17 @@ - \ No newline at end of file +/> diff --git a/src/ifctester/webapp/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-trigger.svelte b/src/ifctester/webapp/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-trigger.svelte index e4e236e1119..a2be23a1367 100644 --- a/src/ifctester/webapp/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-trigger.svelte +++ b/src/ifctester/webapp/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-trigger.svelte @@ -1,7 +1,15 @@ - {@render children?.()} - \ No newline at end of file + diff --git a/src/ifctester/webapp/src/lib/components/ui/dropdown-menu/dropdown-menu-trigger.svelte b/src/ifctester/webapp/src/lib/components/ui/dropdown-menu/dropdown-menu-trigger.svelte index 720d196b77b..1aa23bc5123 100644 --- a/src/ifctester/webapp/src/lib/components/ui/dropdown-menu/dropdown-menu-trigger.svelte +++ b/src/ifctester/webapp/src/lib/components/ui/dropdown-menu/dropdown-menu-trigger.svelte @@ -1,7 +1,11 @@ - - \ No newline at end of file + diff --git a/src/ifctester/webapp/src/lib/components/ui/dropdown-menu/index.js b/src/ifctester/webapp/src/lib/components/ui/dropdown-menu/index.ts similarity index 100% rename from src/ifctester/webapp/src/lib/components/ui/dropdown-menu/index.js rename to src/ifctester/webapp/src/lib/components/ui/dropdown-menu/index.ts diff --git a/src/ifctester/webapp/src/lib/components/ui/menubar/index.js b/src/ifctester/webapp/src/lib/components/ui/menubar/index.ts similarity index 100% rename from src/ifctester/webapp/src/lib/components/ui/menubar/index.js rename to src/ifctester/webapp/src/lib/components/ui/menubar/index.ts diff --git a/src/ifctester/webapp/src/lib/components/ui/menubar/menubar-checkbox-item.svelte b/src/ifctester/webapp/src/lib/components/ui/menubar/menubar-checkbox-item.svelte index 0d6e298b0f2..bb020eec7bf 100644 --- a/src/ifctester/webapp/src/lib/components/ui/menubar/menubar-checkbox-item.svelte +++ b/src/ifctester/webapp/src/lib/components/ui/menubar/menubar-checkbox-item.svelte @@ -1,8 +1,16 @@ - {@render childrenProp?.()} {/snippet} - \ No newline at end of file + diff --git a/src/ifctester/webapp/src/lib/components/ui/menubar/menubar-content.svelte b/src/ifctester/webapp/src/lib/components/ui/menubar/menubar-content.svelte index 2706fc76e2a..4c7696d2181 100644 --- a/src/ifctester/webapp/src/lib/components/ui/menubar/menubar-content.svelte +++ b/src/ifctester/webapp/src/lib/components/ui/menubar/menubar-content.svelte @@ -1,6 +1,19 @@ - @@ -28,4 +41,4 @@ )} {...restProps} /> - \ No newline at end of file + diff --git a/src/ifctester/webapp/src/lib/components/ui/menubar/menubar-group-heading.svelte b/src/ifctester/webapp/src/lib/components/ui/menubar/menubar-group-heading.svelte index c64dd915341..13417d54ecb 100644 --- a/src/ifctester/webapp/src/lib/components/ui/menubar/menubar-group-heading.svelte +++ b/src/ifctester/webapp/src/lib/components/ui/menubar/menubar-group-heading.svelte @@ -1,12 +1,17 @@ - \ No newline at end of file +/> diff --git a/src/ifctester/webapp/src/lib/components/ui/menubar/menubar-group.svelte b/src/ifctester/webapp/src/lib/components/ui/menubar/menubar-group.svelte index 8acc8b9549d..2c77293f764 100644 --- a/src/ifctester/webapp/src/lib/components/ui/menubar/menubar-group.svelte +++ b/src/ifctester/webapp/src/lib/components/ui/menubar/menubar-group.svelte @@ -1,10 +1,14 @@ - - \ No newline at end of file + diff --git a/src/ifctester/webapp/src/lib/components/ui/menubar/menubar-item.svelte b/src/ifctester/webapp/src/lib/components/ui/menubar/menubar-item.svelte index f4fee4711e9..1ff76231a5f 100644 --- a/src/ifctester/webapp/src/lib/components/ui/menubar/menubar-item.svelte +++ b/src/ifctester/webapp/src/lib/components/ui/menubar/menubar-item.svelte @@ -1,6 +1,13 @@ - \ No newline at end of file +/> diff --git a/src/ifctester/webapp/src/lib/components/ui/menubar/menubar-label.svelte b/src/ifctester/webapp/src/lib/components/ui/menubar/menubar-label.svelte index 129be16dd55..efbbb9b0172 100644 --- a/src/ifctester/webapp/src/lib/components/ui/menubar/menubar-label.svelte +++ b/src/ifctester/webapp/src/lib/components/ui/menubar/menubar-label.svelte @@ -1,12 +1,19 @@ -
    {@render children?.()} -
    \ No newline at end of file + diff --git a/src/ifctester/webapp/src/lib/components/ui/menubar/menubar-radio-item.svelte b/src/ifctester/webapp/src/lib/components/ui/menubar/menubar-radio-item.svelte index c7c122881f2..1947458beb3 100644 --- a/src/ifctester/webapp/src/lib/components/ui/menubar/menubar-radio-item.svelte +++ b/src/ifctester/webapp/src/lib/components/ui/menubar/menubar-radio-item.svelte @@ -1,14 +1,22 @@ - {@render childrenProp?.({ checked })} {/snippet} - \ No newline at end of file + diff --git a/src/ifctester/webapp/src/lib/components/ui/menubar/menubar-separator.svelte b/src/ifctester/webapp/src/lib/components/ui/menubar/menubar-separator.svelte index d32bbab6735..7674b560bc1 100644 --- a/src/ifctester/webapp/src/lib/components/ui/menubar/menubar-separator.svelte +++ b/src/ifctester/webapp/src/lib/components/ui/menubar/menubar-separator.svelte @@ -1,12 +1,17 @@ - \ No newline at end of file +/> diff --git a/src/ifctester/webapp/src/lib/components/ui/menubar/menubar-shortcut.svelte b/src/ifctester/webapp/src/lib/components/ui/menubar/menubar-shortcut.svelte index 7df7a0d1184..05cf1bc13b8 100644 --- a/src/ifctester/webapp/src/lib/components/ui/menubar/menubar-shortcut.svelte +++ b/src/ifctester/webapp/src/lib/components/ui/menubar/menubar-shortcut.svelte @@ -1,12 +1,19 @@ - {@render children?.()} - \ No newline at end of file + diff --git a/src/ifctester/webapp/src/lib/components/ui/menubar/menubar-sub-content.svelte b/src/ifctester/webapp/src/lib/components/ui/menubar/menubar-sub-content.svelte index 5a79de2c588..67b68ca6331 100644 --- a/src/ifctester/webapp/src/lib/components/ui/menubar/menubar-sub-content.svelte +++ b/src/ifctester/webapp/src/lib/components/ui/menubar/menubar-sub-content.svelte @@ -1,12 +1,17 @@ - \ No newline at end of file +/> diff --git a/src/ifctester/webapp/src/lib/components/ui/menubar/menubar-sub-trigger.svelte b/src/ifctester/webapp/src/lib/components/ui/menubar/menubar-sub-trigger.svelte index f9fa0461ee4..c14976bd127 100644 --- a/src/ifctester/webapp/src/lib/components/ui/menubar/menubar-sub-trigger.svelte +++ b/src/ifctester/webapp/src/lib/components/ui/menubar/menubar-sub-trigger.svelte @@ -1,7 +1,15 @@ - {@render children?.()} - \ No newline at end of file + diff --git a/src/ifctester/webapp/src/lib/components/ui/menubar/menubar-trigger.svelte b/src/ifctester/webapp/src/lib/components/ui/menubar/menubar-trigger.svelte index c39921a2a1d..33119d913cb 100644 --- a/src/ifctester/webapp/src/lib/components/ui/menubar/menubar-trigger.svelte +++ b/src/ifctester/webapp/src/lib/components/ui/menubar/menubar-trigger.svelte @@ -1,12 +1,17 @@ - \ No newline at end of file +/> diff --git a/src/ifctester/webapp/src/lib/components/ui/menubar/menubar.svelte b/src/ifctester/webapp/src/lib/components/ui/menubar/menubar.svelte index cddff1b9089..ebc3534d09a 100644 --- a/src/ifctester/webapp/src/lib/components/ui/menubar/menubar.svelte +++ b/src/ifctester/webapp/src/lib/components/ui/menubar/menubar.svelte @@ -1,12 +1,17 @@ - \ No newline at end of file +/> diff --git a/src/ifctester/webapp/src/lib/components/ui/sonner/index.js b/src/ifctester/webapp/src/lib/components/ui/sonner/index.ts similarity index 100% rename from src/ifctester/webapp/src/lib/components/ui/sonner/index.js rename to src/ifctester/webapp/src/lib/components/ui/sonner/index.ts diff --git a/src/ifctester/webapp/src/lib/components/ui/sonner/sonner.svelte b/src/ifctester/webapp/src/lib/components/ui/sonner/sonner.svelte index 91981de7e61..28a794ca0f7 100644 --- a/src/ifctester/webapp/src/lib/components/ui/sonner/sonner.svelte +++ b/src/ifctester/webapp/src/lib/components/ui/sonner/sonner.svelte @@ -1,8 +1,8 @@ - \ No newline at end of file +/> diff --git a/src/ifctester/webapp/src/lib/components/ui/tooltip/index.js b/src/ifctester/webapp/src/lib/components/ui/tooltip/index.ts similarity index 100% rename from src/ifctester/webapp/src/lib/components/ui/tooltip/index.js rename to src/ifctester/webapp/src/lib/components/ui/tooltip/index.ts diff --git a/src/ifctester/webapp/src/lib/components/ui/tooltip/tooltip-content.svelte b/src/ifctester/webapp/src/lib/components/ui/tooltip/tooltip-content.svelte index 3c25c65b9af..6db22038576 100644 --- a/src/ifctester/webapp/src/lib/components/ui/tooltip/tooltip-content.svelte +++ b/src/ifctester/webapp/src/lib/components/ui/tooltip/tooltip-content.svelte @@ -1,6 +1,18 @@ - @@ -42,4 +54,4 @@ {/snippet} - \ No newline at end of file + diff --git a/src/ifctester/webapp/src/lib/components/ui/tooltip/tooltip-trigger.svelte b/src/ifctester/webapp/src/lib/components/ui/tooltip/tooltip-trigger.svelte index a2885f2cca9..b1524c3a3c6 100644 --- a/src/ifctester/webapp/src/lib/components/ui/tooltip/tooltip-trigger.svelte +++ b/src/ifctester/webapp/src/lib/components/ui/tooltip/tooltip-trigger.svelte @@ -1,7 +1,11 @@ - - \ No newline at end of file + diff --git a/src/ifctester/webapp/src/lib/utils.js b/src/ifctester/webapp/src/lib/utils.js deleted file mode 100644 index f79e2db4c90..00000000000 --- a/src/ifctester/webapp/src/lib/utils.js +++ /dev/null @@ -1,8 +0,0 @@ -import { clsx, } from "clsx"; -import { twMerge } from "tailwind-merge"; - -export function cn(...inputs) { - return twMerge(clsx(inputs)); -} - -// eslint-disable-next-line @typescript-eslint/no-explicit-any \ No newline at end of file diff --git a/src/ifctester/webapp/src/lib/utils.ts b/src/ifctester/webapp/src/lib/utils.ts new file mode 100644 index 00000000000..be010d3ced1 --- /dev/null +++ b/src/ifctester/webapp/src/lib/utils.ts @@ -0,0 +1,7 @@ +import { clsx } from "clsx"; +import type { ClassValue } from "clsx"; +import { twMerge } from "tailwind-merge"; + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)); +} diff --git a/src/ifctester/webapp/src/main.js b/src/ifctester/webapp/src/main.js deleted file mode 100644 index 14fb0c3be84..00000000000 --- a/src/ifctester/webapp/src/main.js +++ /dev/null @@ -1,9 +0,0 @@ -import { mount } from 'svelte'; -import './css/app.css'; -import App from './App.svelte'; - -const app = mount(App, { - target: document.getElementById('root'), -}); - -export default app; \ No newline at end of file diff --git a/src/ifctester/webapp/src/main.ts b/src/ifctester/webapp/src/main.ts new file mode 100644 index 00000000000..54ddb22cf97 --- /dev/null +++ b/src/ifctester/webapp/src/main.ts @@ -0,0 +1,14 @@ +import { mount } from 'svelte'; +import './css/app.css'; +import App from './App.svelte'; + +const root = document.getElementById('root'); +if (!root) { + throw new Error('Missing root element'); +} + +const app = mount(App, { + target: root, +}); + +export default app; diff --git a/src/ifctester/webapp/src/modules/api/api.svelte.js b/src/ifctester/webapp/src/modules/api/api.svelte.ts similarity index 72% rename from src/ifctester/webapp/src/modules/api/api.svelte.js rename to src/ifctester/webapp/src/modules/api/api.svelte.ts index ad2a7b8c3f2..b4ebe01fdc6 100644 --- a/src/ifctester/webapp/src/modules/api/api.svelte.js +++ b/src/ifctester/webapp/src/modules/api/api.svelte.ts @@ -1,8 +1,31 @@ import wasm from "$src/modules/wasm"; -import * as IDS from "$src/modules/api/ids.svelte.js"; +import * as IDS from "$src/modules/api/ids.svelte"; import hyperid from "hyperid"; +import type { AuditReport, AuditReportData } from "$src/types/report"; +import type { IdsDocument } from "$src/types/ids"; -export let Autocompletions = $state({ +type AutocompletionState = { + entityClasses: string[]; + materialCategories: string[]; + classificationSystems: Record; + dataTypes: string[]; + isLoaded: boolean; +}; + +type IfcModel = { + id: string; + fileName: string; + fileSize: number; + loadedAt: Date; +}; + +type IfcModelState = { + models: IfcModel[]; + isLoading: boolean; + audits: AuditReport[]; +}; + +export const Autocompletions: AutocompletionState = $state({ entityClasses: [], materialCategories: [], classificationSystems: {}, @@ -10,13 +33,13 @@ export let Autocompletions = $state({ isLoaded: false }); -export let IFCModels = $state({ +export const IFCModels: IfcModelState = $state({ models: [], isLoading: false, audits: [] }); -const id = hyperid(); +const id: () => string = hyperid(); // Preload autocompletions on initialization wasm.init().then(async () => { @@ -30,26 +53,30 @@ export async function preloadAutocompletions() { // Entity classes const entitySets = await Promise.all( schemas.map(schema => wasm.getAllEntityClasses(schema)) - ); - const allEntities = new Set(); - entitySets.forEach(entities => { - entities.forEach(entity => allEntities.add(entity.toUpperCase())); - }); + ) as string[][]; + const allEntities = new Set(); + for (const entities of entitySets) { + for (const entity of entities) { + allEntities.add(entity.toUpperCase()); + } + } // Data types const dataTypeSets = await Promise.all( schemas.map(schema => wasm.getAllDataTypes(schema)) - ); - const allDataTypes = new Set(); - dataTypeSets.forEach(dataTypes => { - Object.keys(dataTypes).forEach(dataType => allDataTypes.add(dataType)); - }); + ) as Record[]; + const allDataTypes = new Set(); + for (const dataTypes of dataTypeSets) { + for (const dataType of Object.keys(dataTypes as Record)) { + allDataTypes.add(dataType); + } + } // Material categories and Classification systems const [materialCategories, classificationSystems] = await Promise.all([ wasm.getMaterialCategories(), wasm.getStandardClassificationSystems() - ]); + ]) as [string[], AutocompletionState["classificationSystems"]]; // Cache autocompletions Autocompletions.entityClasses = Array.from(allEntities).sort(); @@ -64,15 +91,15 @@ export async function preloadAutocompletions() { } } -export async function getPredefinedTypes(schema, entity) { +export async function getPredefinedTypes(schema: string, entity: string) { return await wasm.getPredefinedTypes(schema, entity); } -export async function getEntityAttributes(schema, entity) { +export async function getEntityAttributes(schema: string, entity: string) { return await wasm.getEntityAttributes(schema, entity); } -export async function getApplicablePsets(schema, entity, predefinedType = '') { +export async function getApplicablePsets(schema: string, entity: string, predefinedType = '') { return await wasm.getApplicablePsets(schema, entity, predefinedType); } @@ -92,7 +119,7 @@ export function getDataTypes() { return Autocompletions.dataTypes; } -export async function loadIfc(file) { +export async function loadIfc(file: File): Promise { try { IFCModels.isLoading = true; @@ -100,10 +127,10 @@ export async function loadIfc(file) { const uint8Array = new Uint8Array(arrayBuffer); // Load IFC model - const ifcId = await wasm.loadIfc(Array.from(uint8Array)); + const ifcId = await wasm.loadIfc(Array.from(uint8Array)) as string; // Add to models list - const model = { + const model: IfcModel = { id: ifcId, fileName: file.name, fileSize: file.size, @@ -121,7 +148,7 @@ export async function loadIfc(file) { } } -export async function unloadIfc(modelId) { +export async function unloadIfc(modelId: string) { try { // Unload model await wasm.unloadIfc(modelId); @@ -136,9 +163,9 @@ export async function unloadIfc(modelId) { } } -export async function auditIfc(modelId, idsData) { +export async function auditIfc(modelId: string, idsData: string | Uint8Array | ArrayBuffer) { try { - let idsBytes; + let idsBytes: Uint8Array; if (typeof idsData === 'string') { idsBytes = new TextEncoder().encode(idsData); } else if (idsData instanceof ArrayBuffer) { @@ -148,7 +175,7 @@ export async function auditIfc(modelId, idsData) { } // Run audit - const auditResult = await wasm.auditIfc(modelId, idsBytes); + const auditResult = await wasm.auditIfc(modelId, idsBytes) as { json: AuditReportData; html: string }; console.log(`Audit completed for model ${modelId}`); return auditResult; @@ -163,13 +190,14 @@ export function getLoadedModels() { } export async function openIfc() { - return new Promise((resolve, reject) => { + return new Promise((resolve, reject) => { const fileInput = document.createElement('input'); fileInput.type = 'file'; fileInput.accept = '.ifc'; fileInput.onchange = async (event) => { - const file = event.target.files[0]; + const target = event.target as HTMLInputElement | null; + const file = target?.files?.[0]; if (!file) { reject(new Error('No file selected')); return; @@ -194,15 +222,20 @@ export async function openIfc() { }); } -export function getIfcById(modelId) { +export function getIfcById(modelId: string) { return IFCModels.models.find(model => model.id === modelId); } -export function createAuditReport(modelId, document, auditData, htmlReport = null) { +export function createAuditReport( + modelId: string, + document: string, + auditData: AuditReportData, + htmlReport: string | null = null +): AuditReport | undefined { const model = getIfcById(modelId); if (!model) return; - const auditReport = { + const auditReport: AuditReport = { id: id(), modelId: modelId, modelName: model.fileName, @@ -216,19 +249,19 @@ export function createAuditReport(modelId, document, auditData, htmlReport = nul return auditReport; } -export function getAuditReportsForIfc(modelId) { +export function getAuditReportsForIfc(modelId: string) { return IFCModels.audits.filter(audit => audit.modelId === modelId); } -export function getAuditReportById(auditId) { +export function getAuditReportById(auditId: string) { return IFCModels.audits.find(audit => audit.id === auditId); } -export function clearIdsAuditReports(document) { +export function clearIdsAuditReports(document: string) { IFCModels.audits = IFCModels.audits.filter(audit => audit.document !== document); } -export async function downloadAuditReport(auditId) { +export async function downloadAuditReport(auditId: string) { const audit = getAuditReportById(auditId); if (!audit || !audit.htmlReport) { throw new Error('HTML report not available for this audit'); @@ -237,7 +270,7 @@ export async function downloadAuditReport(auditId) { // Get IDS document title for filename let filename = 'report.html'; if (audit.document && IDS.Module.documents[audit.document]) { - const doc = IDS.Module.documents[audit.document]; + const doc = IDS.Module.documents[audit.document] as IdsDocument; const title = doc.info?.title || 'untitled'; filename = `report_${title.replace(/[^a-z0-9]/gi, '_').toLowerCase()}.html`; } @@ -270,9 +303,12 @@ export async function runAudit() { // Get the active IDS document XML const idsXml = await IDS.exportActiveDocument(); + if (!idsXml) { + throw new Error('Failed to export IDS document'); + } // Run audit on all loaded models - let firstAuditReport = null; + let firstAuditReport: AuditReport | undefined; for (const model of IFCModels.models) { const result = await auditIfc(model.id, idsXml); @@ -280,7 +316,10 @@ export async function runAudit() { const jsonData = result.json || null; const htmlReport = result.html || null; - const auditReport = createAuditReport(model.id, IDS.Module.activeDocument, jsonData, htmlReport); + if (!jsonData) { + continue; + } + const auditReport = createAuditReport(model.id, IDS.Module.activeDocument as string, jsonData, htmlReport); // Store the first audit report to open in viewer if (!firstAuditReport) { diff --git a/src/ifctester/webapp/src/modules/api/bonsai.svelte.js b/src/ifctester/webapp/src/modules/api/bonsai.svelte.ts similarity index 64% rename from src/ifctester/webapp/src/modules/api/bonsai.svelte.js rename to src/ifctester/webapp/src/modules/api/bonsai.svelte.ts index bcc4b8965d4..5ed9b562f49 100644 --- a/src/ifctester/webapp/src/modules/api/bonsai.svelte.js +++ b/src/ifctester/webapp/src/modules/api/bonsai.svelte.ts @@ -1,12 +1,37 @@ import { io } from 'socket.io-client'; -import { IFCModels } from './api.svelte.js'; -import * as IDS from './ids.svelte.js'; -import { error, success } from '../utils/toast.svelte.js'; +import type { Socket } from 'socket.io-client'; +import { IFCModels } from './api.svelte'; +import * as IDS from './ids.svelte'; +import { error, success } from '../utils/toast.svelte'; import hyperid from 'hyperid'; -import { onMount } from 'svelte'; +import type { AuditReport, AuditReportData } from "$src/types/report"; // Bonsai connection state -export let Bonsai = $state({ +type BonsaiState = { + enabled: boolean; + port: string | null; + socket: Socket | null; + connected: boolean; + auditing: boolean; +}; + +type PendingAudit = { + resolve: (value: string | null) => void; + reject: (reason?: unknown) => void; +}; + +type AuditResultPayload = { + id?: string; + json_report?: string; + html_report?: string; +}; + +type AuditErrorPayload = { + id?: string; + error?: string; +}; + +export const Bonsai: BonsaiState = $state({ enabled: false, port: null, socket: null, @@ -14,8 +39,8 @@ export let Bonsai = $state({ auditing: false }); -const id = hyperid(); -const pendingAudits = new Map(); +const id: () => string = hyperid(); +const pendingAudits = new Map(); // Check for Bonsai server port in URL parameters const urlParams = new URLSearchParams(window.location.search); @@ -29,8 +54,11 @@ if (serverPort) { /** * Connect to Bonsai server */ -export const connect = () => new Promise((resolve, reject) => { - if (!Bonsai.port) return; +export const connect = () => new Promise((resolve, reject) => { + if (!Bonsai.port) { + resolve(); + return; + } try { Bonsai.socket = io(`ws://127.0.0.1:${Bonsai.port}/ifctester`, { @@ -49,7 +77,7 @@ export const connect = () => new Promise((resolve, reject) => { Bonsai.connected = false; }); - Bonsai.socket.on('connect_error', (err) => { + Bonsai.socket.on('connect_error', (err: Error) => { Bonsai.connected = false; error(`Failed to connect to Bonsai: ${err.message}`); reject(err); @@ -59,7 +87,8 @@ export const connect = () => new Promise((resolve, reject) => { Bonsai.socket.on('error', handleAuditError); } catch (err) { - error(`Failed to connect to Bonsai: ${err.message}`); + const message = err instanceof Error ? err.message : String(err); + error(`Failed to connect to Bonsai: ${message}`); reject(err); } }); @@ -93,14 +122,21 @@ export const runAudit = async () => { // Convert IDS document to XML string const idsXml = await IDS.exportActiveDocument(); + if (!idsXml) { + throw new Error('Failed to export IDS document'); + } const requestId = id(); + const socket = Bonsai.socket; + if (!socket) { + throw new Error('Bonsai socket not connected'); + } - return new Promise((resolve, reject) => { + return new Promise((resolve, reject) => { // Store request with resolve/reject functions pendingAudits.set(requestId, { resolve, reject }); - Bonsai.socket.emit('audit_ids', { + socket.emit('audit_ids', { id: requestId, ids: idsXml }); @@ -108,7 +144,8 @@ export const runAudit = async () => { } catch (err) { Bonsai.auditing = false; - error(`Failed to run Bonsai audit: ${err.message}`); + const message = err instanceof Error ? err.message : String(err); + error(`Failed to run Bonsai audit: ${message}`); return null; } }; @@ -117,7 +154,7 @@ export const runAudit = async () => { * Handles audit results from Bonsai server * @param {Object} data - Audit result data */ -const handleAuditResult = (data) => { +const handleAuditResult = (data: AuditResultPayload) => { if (!data.id || !data.json_report) return; const pendingAudit = pendingAudits.get(data.id); @@ -130,13 +167,14 @@ const handleAuditResult = (data) => { const { resolve } = pendingAudit; try { - const reportData = JSON.parse(data.json_report); + const reportData = JSON.parse(data.json_report) as AuditReportData; - const auditReport = { + const auditReport: AuditReport = { id: data.id, + modelId: `bonsai:${data.id}`, date: new Date().toISOString(), modelName: 'Bonsai IFC Model', - document: IDS.Module.activeDocument, + document: IDS.Module.activeDocument ?? "", data: reportData, htmlReport: data.html_report }; @@ -152,7 +190,8 @@ const handleAuditResult = (data) => { } catch (err) { Bonsai.auditing = false; - error(`Failed to process audit result: ${err.message}`); + const message = err instanceof Error ? err.message : String(err); + error(`Failed to process audit result: ${message}`); resolve(null); } }; @@ -161,7 +200,7 @@ const handleAuditResult = (data) => { * Handles audit errors from Bonsai server * @param {Object} data - Error data */ -const handleAuditError = (data) => { +const handleAuditError = (data: AuditErrorPayload) => { if (!data.id) return; const pendingAudit = pendingAudits.get(data.id); @@ -174,7 +213,6 @@ const handleAuditError = (data) => { const { resolve } = pendingAudit; Bonsai.auditing = false; - error(`Audit failed (Bonsai): ${data.error}`); + error(`Audit failed (Bonsai): ${data.error ?? "Unknown error"}`); resolve(null); }; - diff --git a/src/ifctester/webapp/src/modules/api/ids.svelte.js b/src/ifctester/webapp/src/modules/api/ids.svelte.ts similarity index 63% rename from src/ifctester/webapp/src/modules/api/ids.svelte.js rename to src/ifctester/webapp/src/modules/api/ids.svelte.ts index 3d30948d3de..3035113654d 100644 --- a/src/ifctester/webapp/src/modules/api/ids.svelte.js +++ b/src/ifctester/webapp/src/modules/api/ids.svelte.ts @@ -1,10 +1,18 @@ import wasm from "$src/modules/wasm"; -import { clearIdsAuditReports } from "./api.svelte.js"; +import { clearIdsAuditReports } from "./api.svelte"; import hyperid from "hyperid"; import {tick} from "svelte"; +import type { DocumentState, Facet, FacetValue, IdsDocument, IdsCardinality, Restriction, Specification } from "$src/types/ids"; -export let Module = $state({ - documents: [], +type ModuleState = { + documents: Record; + activeDocument: string | null; + status: "loading" | "ready" | "error"; + states: Record; +}; + +export const Module: ModuleState = $state({ + documents: {}, activeDocument: null, status: "loading", states: {} @@ -17,14 +25,15 @@ wasm.init().then(() => { Module.status = "error"; }); -const id = hyperid() +const id: () => string = hyperid(); -export function setDocumentState(docId, updates) { +export function setDocumentState(docId: string, updates: Partial) { if (!Module.states[docId]) { Module.states[docId] = { activeTab: 'info', viewMode: 'editor', - activeSpecification: null + activeSpecification: null, + auditReport: null }; } Object.assign(Module.states[docId], updates); @@ -32,7 +41,7 @@ export function setDocumentState(docId, updates) { export async function createDocument() { const docId = id(); - const doc = await wasm.createIDS(); + const doc = await wasm.createIDS() as IdsDocument; Module.documents[docId] = doc; @@ -43,14 +52,14 @@ export async function createDocument() { Module.activeDocument = docId; } -export async function deleteDocument(id) { +export async function deleteDocument(id: string) { // Clear any audit reports generated using this IDS document clearIdsAuditReports(id); delete Module.documents[id]; delete Module.states[id]; - if (Module.activeDocument == id) { + if (Module.activeDocument === id) { // If there are other documents, set the first one as active if (Object.keys(Module.documents).length > 0) { Module.activeDocument = Object.keys(Module.documents)[0]; @@ -62,19 +71,19 @@ export async function deleteDocument(id) { // Normalize (remove xs: prefix) from JSON dict returned from Python // We need this because the backend exports with xs: prefix, yet expects a dict without prefixes. -function normalizeIdsDict(obj) { +function normalizeIdsDict(obj: unknown): unknown { if (typeof obj !== 'object' || obj === null) return obj; if (Array.isArray(obj)) { return obj.map(normalizeIdsDict); } - const result = {}; + const result: Record = {}; for (const [key, value] of Object.entries(obj)) { if (key === 'xs:restriction' && Array.isArray(value) && value.length > 0) { // Convert xs:restriction array to restriction object - const restriction = value[0]; - const newRestriction = {}; + const restriction = value[0] as Record; + const newRestriction: Record = {}; for (const [restrictionKey, restrictionValue] of Object.entries(restriction)) { if (restrictionKey.startsWith('xs:')) { @@ -86,7 +95,7 @@ function normalizeIdsDict(obj) { } } - result['restriction'] = newRestriction; + result.restriction = newRestriction; } else { result[key] = normalizeIdsDict(value); } @@ -96,13 +105,16 @@ function normalizeIdsDict(obj) { } export async function openDocument() { - return new Promise((resolve, reject) => { - const fileInput = document.createElement('input'); + return new Promise((resolve, reject) => { + const fileInput = document.createElement('input') as HTMLInputElement & { + oncancel?: ((this: HTMLInputElement, ev: Event) => void) | null; + }; fileInput.type = 'file'; fileInput.accept = '.ids,.xml'; fileInput.onchange = async (event) => { - const file = event.target.files[0]; + const target = event.target as HTMLInputElement | null; + const file = target?.files?.[0]; if (!file) { reject(new Error('No file selected')); return; @@ -112,8 +124,8 @@ export async function openDocument() { const reader = new FileReader(); reader.onload = async (e) => { try { - const fileContent = e.target.result; - const doc = normalizeIdsDict(await wasm.openIDS(fileContent, false)); + const fileContent = (e.target as FileReader).result; + const doc = normalizeIdsDict(await wasm.openIDS(String(fileContent), false)) as IdsDocument; const docId = id(); // Add document to list and set as active @@ -145,16 +157,16 @@ export async function openDocument() { }); } -export async function exportActiveDocument() { +export async function exportActiveDocument(): Promise { if (!Module.activeDocument) return null; const doc = $state.snapshot(Module.documents[Module.activeDocument]); - const xmlString = await wasm.exportIDS(doc); + const xmlString = await wasm.exportIDS(doc as Record) as string; return xmlString; } -export async function exportDocument(docId) { +export async function exportDocument(docId: string) { const doc = $state.snapshot(Module.documents[docId]); // Validate @@ -162,37 +174,38 @@ export async function exportDocument(docId) { throw new Error("Please create at least one specification before exporting the document."); } - const xmlString = await wasm.exportIDS(doc); + const xmlString = await wasm.exportIDS(doc as Record) as string; // Create and download file const blob = new Blob([xmlString], { type: 'application/xml' }); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; - a.download = `${Module.documents[docId].info.title.replace(/[^a-zA-Z0-9]/g, '_')}.ids`; + const title = Module.documents[docId].info.title || "untitled"; + a.download = `${title.replace(/[^a-zA-Z0-9]/g, '_')}.ids`; a.click(); URL.revokeObjectURL(url); } -export async function createSpecification(docId) { - const spec = await wasm.createSpecification(); +export async function createSpecification(docId: string) { + const spec = await wasm.createSpecification() as Specification; // Add specification to document Module.documents[docId].specifications.specification.push(spec); // Set as active specification - if (Module.activeDocument == docId) { + if (Module.activeDocument === docId) { const state = Module.states[docId]; state.activeSpecification = Module.documents[docId].specifications.specification.length - 1; } } -export async function deleteSpecification(docId, specId) { +export async function deleteSpecification(docId: string, specId: number) { Module.documents[docId].specifications.specification.splice(specId, 1); - if (Module.activeDocument == docId) { + if (Module.activeDocument === docId) { const state = Module.states[docId]; - if (state.activeSpecification == specId) { + if (state.activeSpecification === specId) { // We need to wait for the next tick here because of Svelte's internal shenanigans await tick(); setDocumentState(docId, { activeSpecification: null }); @@ -209,124 +222,148 @@ export async function deleteSpecification(docId, specId) { * clause: "applicability", "requirements" * facet: "entity", "attribute", "classification", "partOf", "property", "material" */ -export async function createFacet(docId, specId, clause, facet) { - let facetObj; - if (facet == "entity") { - facetObj = await wasm.createEntityFacet(clause, {}); - } else if (facet == "attribute") { - facetObj = await wasm.createAttributeFacet(clause, {}); - } else if (facet == "classification") { - facetObj = await wasm.createClassificationFacet(clause, {}); - } else if (facet == "partOf") { - facetObj = await wasm.createPartOfFacet(clause, {}); - } else if (facet == "property") { - facetObj = await wasm.createPropertyFacet(clause, {}); - } else if (facet == "material") { - facetObj = await wasm.createMaterialFacet(clause, {}); +export async function createFacet( + docId: string, + specId: number, + clause: "applicability" | "requirements", + facet: "entity" | "attribute" | "classification" | "partOf" | "property" | "material" +) { + let facetObj: Facet | undefined; + if (facet === "entity") { + facetObj = await wasm.createEntityFacet(clause, {}) as Facet; + } else if (facet === "attribute") { + facetObj = await wasm.createAttributeFacet(clause, {}) as Facet; + } else if (facet === "classification") { + facetObj = await wasm.createClassificationFacet(clause, {}) as Facet; + } else if (facet === "partOf") { + facetObj = await wasm.createPartOfFacet(clause, {}) as Facet; + } else if (facet === "property") { + facetObj = await wasm.createPropertyFacet(clause, {}) as Facet; + } else if (facet === "material") { + facetObj = await wasm.createMaterialFacet(clause, {}) as Facet; } - if (!(facet in Module.documents[docId].specifications.specification[specId][clause])) { - Module.documents[docId].specifications.specification[specId][clause][facet] = []; + if (!facetObj) return; + + const spec = Module.documents[docId].specifications.specification[specId]; + const clauseKey = clause as "applicability" | "requirements"; + if (!spec[clauseKey]) spec[clauseKey] = {}; + if (!(facet in (spec[clauseKey] as Record))) { + (spec[clauseKey] as Record)[facet] = []; } - Module.documents[docId].specifications.specification[specId][clause][facet].push(facetObj); + ((spec[clauseKey] as Record)[facet] as Facet[]).push(facetObj); } -export async function deleteFacet(docId, specId, clause, facet, facetId) { - delete Module.documents[docId].specifications.specification[specId][clause][facet][facetId]; +export async function deleteFacet( + docId: string, + specId: number, + clause: "applicability" | "requirements", + facet: "entity" | "attribute" | "classification" | "partOf" | "property" | "material", + facetId: number +) { + const spec = Module.documents[docId].specifications.specification[specId]; + const list = (spec[clause] as Record | undefined)?.[facet] as Facet[] | undefined; + if (!list) return; + list.splice(facetId, 1); } -export function getSpecUsage(spec) { +export function getSpecUsage(spec?: Specification | null): IdsCardinality { if (!spec?.applicability) return 'required'; - const minOccurs = spec.applicability["@minOccurs"]; - const maxOccurs = spec.applicability["@maxOccurs"]; - - if (minOccurs === 1 && maxOccurs === "unbounded") return 'required'; - if (minOccurs === 0 && maxOccurs === "unbounded") return 'optional'; - if (minOccurs === 0 && maxOccurs === 0) return 'prohibited'; + const minOccurs = spec.applicability["@minOccurs"] as number | undefined; + const maxOccurs = spec.applicability["@maxOccurs"] as number | "unbounded" | undefined; + + if (minOccurs !== 0) return 'required'; + if (minOccurs === 0 && maxOccurs !== 0) return 'optional'; + if (maxOccurs === 0) return 'prohibited'; return 'required'; }; // Converts facet to human-readable description -export function stringifyFacet(clauseType, facet, facetType, spec) { +export function stringifyFacet( + clauseType: "applicability" | "requirements", + facet: Facet, + facetType: string, + spec?: Specification | null +) { if (!facet) return ""; const usage = getSpecUsage(spec); - const descriptions = []; + const descriptions: string[] = []; // Entity facet if (facetType === "entity") { if (clauseType === "applicability") { - descriptions.push(`All data where IFC class ${stringifyValue(facet.name)}`); + descriptions.push(`All data where IFC class ${stringifyValue(facet.name as FacetValue)}`); } else { - descriptions.push(`Shall be data where IFC class ${stringifyValue(facet.name)}`); + descriptions.push(`Shall be data where IFC class ${stringifyValue(facet.name as FacetValue)}`); } if (facet.predefinedType) { - descriptions.push(`and type ${stringifyValue(facet.predefinedType)}`); + descriptions.push(`and type ${stringifyValue(facet.predefinedType as FacetValue)}`); } } // Attribute facet else if (facetType === "attribute") { if (clauseType === "applicability") { - descriptions.push(`All data where attribute ${stringifyValue(facet.name)}`); + descriptions.push(`All data where attribute ${stringifyValue(facet.name as FacetValue)}`); } else { - descriptions.push(`Shall be data where attribute ${stringifyValue(facet.name)}`); + descriptions.push(`Shall be data where attribute ${stringifyValue(facet.name as FacetValue)}`); } - descriptions.push(`and value ${stringifyValue(facet.value)}`); + descriptions.push(`and value ${stringifyValue(facet.value as FacetValue)}`); } // Property facet else if (facetType === "property") { if (clauseType === "applicability") { - descriptions.push(`Elements where property ${stringifyValue(facet.baseName)}`); + descriptions.push(`Elements where property ${stringifyValue(facet.baseName as FacetValue)}`); } else { - descriptions.push(`Shall be elements where property ${stringifyValue(facet.baseName)}`); + descriptions.push(`Shall be elements where property ${stringifyValue(facet.baseName as FacetValue)}`); } if (facet.value) { - descriptions.push(`and value ${stringifyValue(facet.value)}`); + descriptions.push(`and value ${stringifyValue(facet.value as FacetValue)}`); } - descriptions.push(`and dataset ${stringifyValue(facet.propertySet)}`); + descriptions.push(`and dataset ${stringifyValue(facet.propertySet as FacetValue)}`); } // Classification facet else if (facetType === "classification") { if (clauseType === "applicability") { - descriptions.push(`All data where classification system ${stringifyValue(facet.system)}`); + descriptions.push(`All data where classification system ${stringifyValue(facet.system as FacetValue)}`); } else { - descriptions.push(`Shall be data where classification system ${stringifyValue(facet.system)}`); + descriptions.push(`Shall be data where classification system ${stringifyValue(facet.system as FacetValue)}`); } if (facet.value) { - descriptions.push(`and classification ${stringifyValue(facet.value)}`); + descriptions.push(`and classification ${stringifyValue(facet.value as FacetValue)}`); } } // Material facet else if (facetType === "material") { if (clauseType === "applicability") { - descriptions.push(`All data where material ${stringifyValue(facet.value)}`); + descriptions.push(`All data where material ${stringifyValue(facet.value as FacetValue)}`); } else { - descriptions.push(`Shall be data where material ${stringifyValue(facet.value)}`); + descriptions.push(`Shall be data where material ${stringifyValue(facet.value as FacetValue)}`); } } // PartOf facet else if (facetType === "partOf") { if (clauseType === "applicability") { - descriptions.push(`An element with an **${facet['@relation']}** relationship`); + descriptions.push(`An element with an **${String(facet['@relation'] ?? "")}** relationship`); if (facet.name) { - descriptions.push(`with an entity where IFC class ${stringifyValue(facet.name)}`); + descriptions.push(`with an entity where IFC class ${stringifyValue(facet.name as FacetValue)}`); } } else { - descriptions.push(`An element shall have an **${facet['@relation']}** relationship`); + descriptions.push(`An element shall have an **${String(facet['@relation'] ?? "")}** relationship`); if (facet.name) { - descriptions.push(`with an entity where IFC class ${stringifyValue(facet.name)}`); + descriptions.push(`with an entity where IFC class ${stringifyValue(facet.name as FacetValue)}`); } if (facet.predefinedType) { - descriptions.push(`and predefined type ${stringifyValue(facet.predefinedType)}`); + descriptions.push(`and predefined type ${stringifyValue(facet.predefinedType as FacetValue)}`); } } } @@ -336,20 +373,22 @@ export function stringifyFacet(clauseType, facet, facetType, spec) { // Post-process for prohibited and optional requirements let isProhibited = false; - if (usage == "prohibited") isProhibited = !isProhibited; - if (clauseType == "requirements" && "@cardinality" in facet && facet["@cardinality"] == "prohibited") isProhibited = !isProhibited; + if (usage === "prohibited") isProhibited = !isProhibited; + if (clauseType === "requirements" && "@cardinality" in facet && facet["@cardinality"] === "prohibited") { + isProhibited = !isProhibited; + } if (isProhibited) combined = combined.replace("Shall", "Shall not").replace("shall", "shall not"); - if (clauseType == "requirements" && "@cardinality" in facet && facet["@cardinality"] == "optional") + if (clauseType === "requirements" && "@cardinality" in facet && facet["@cardinality"] === "optional") combined = combined.replace("Shall", "May").replace("shall", "may"); return renderFacetString(combined); } // Converts value objects to human-readable strings -function stringifyValue(value) { +function stringifyValue(value?: FacetValue) { if (!value) return "is provided"; if (value.simpleValue) return `is **${value.simpleValue}**`; if (value.restriction) return stringifyRestriction(value.restriction); @@ -357,7 +396,7 @@ function stringifyValue(value) { } // Converts restriction objects to human-readable strings -function stringifyRestriction(restriction) { +function stringifyRestriction(restriction: Restriction) { if (!restriction) return ""; // Handle enumeration @@ -394,7 +433,7 @@ function stringifyRestriction(restriction) { if (restriction.maxExclusive && restriction.maxExclusive.length > 0) { parts.push(`**< ${restriction.maxExclusive[0]['@value'] || ''}**`); } - return parts.length > 0 ? "is in range " + parts.join(", ") : "has range restriction"; + return parts.length > 0 ? `is in range ${parts.join(", ")}` : "has range restriction"; } // Handle length range restrictions @@ -406,18 +445,18 @@ function stringifyRestriction(restriction) { if (restriction.maxLength && restriction.maxLength.length > 0) { parts.push(`**max length ${restriction.maxLength[0]['@value'] || ''}**`); } - return parts.length > 0 ? "has " + parts.join(", ") : "has length range restriction"; + return parts.length > 0 ? `has ${parts.join(", ")}` : "has length range restriction"; } return "has complex restriction"; } -function renderFacetString(text) { +function renderFacetString(text: string): string { // Convert **text** to text - text = text.replace(/\*\*([^*]+)\*\*/g, '$1'); + const withStrong = text.replace(/\*\*([^*]+)\*\*/g, '$1'); // Convert `text` to text - text = text.replace(/`([^`]+)`/g, '$1'); + const withCode = withStrong.replace(/`([^`]+)`/g, '$1'); - return text; -} \ No newline at end of file + return withCode; +} diff --git a/src/ifctester/webapp/src/modules/utils/toast.svelte.js b/src/ifctester/webapp/src/modules/utils/toast.svelte.ts similarity index 73% rename from src/ifctester/webapp/src/modules/utils/toast.svelte.js rename to src/ifctester/webapp/src/modules/utils/toast.svelte.ts index eaf9b373f0c..335be486451 100644 --- a/src/ifctester/webapp/src/modules/utils/toast.svelte.js +++ b/src/ifctester/webapp/src/modules/utils/toast.svelte.ts @@ -4,7 +4,7 @@ import { toast } from "svelte-sonner"; * Show an error toast notification * @param {string} message - The error message to display */ -export function error(message) { +export function error(message: string): void { toast.error(message); } @@ -12,7 +12,7 @@ export function error(message) { * Show a success toast notification * @param {string} message - The success message to display */ -export function success(message) { +export function success(message: string): void { toast.success(message); } @@ -20,7 +20,7 @@ export function success(message) { * Show an info toast notification * @param {string} message - The info message to display */ -export function info(message) { +export function info(message: string): void { toast.info(message); } @@ -28,7 +28,7 @@ export function info(message) { * Show a warning toast notification * @param {string} message - The warning message to display */ -export function warning(message) { +export function warning(message: string): void { toast.warning(message); } @@ -37,7 +37,7 @@ export function warning(message) { * @param {string} message - The loading message to display * @returns {string} - Toast ID for dismissing later */ -export function loading(message) { +export function loading(message: string): string | number { return toast.loading(message); } @@ -45,7 +45,7 @@ export function loading(message) { * Dismiss a specific toast * @param {string} toastId - The toast ID to dismiss */ -export function dismiss(toastId) { +export function dismiss(toastId: string | number): void { toast.dismiss(toastId); } @@ -57,10 +57,16 @@ export function dismiss(toastId) { * @param {string} messages.success - Success message * @param {string} messages.error - Error message */ -export function promise(promiseToTrack, messages) { +type PromiseToastMessages = { + loading: string; + success: string; + error: string; +}; + +export function promise(promiseToTrack: Promise, messages: PromiseToastMessages) { return toast.promise(promiseToTrack, { loading: messages.loading, success: messages.success, error: messages.error, }); -} \ No newline at end of file +} diff --git a/src/ifctester/webapp/src/modules/wasm/index.js b/src/ifctester/webapp/src/modules/wasm/index.ts similarity index 69% rename from src/ifctester/webapp/src/modules/wasm/index.js rename to src/ifctester/webapp/src/modules/wasm/index.ts index cecb655f736..d7c4f1e40a9 100644 --- a/src/ifctester/webapp/src/modules/wasm/index.js +++ b/src/ifctester/webapp/src/modules/wasm/index.ts @@ -5,6 +5,7 @@ import hyperid from "hyperid"; import EventEmitter from "eventemitter3"; +import type { WorkerResponse } from "$src/types/wasm"; // Message types export const MessageType = { @@ -25,52 +26,57 @@ export const MessageType = { // WASM module disposed DISPOSED: 'disposed' +} as const; + +type PendingMessage = { + resolve: (value?: unknown) => void; + reject: (reason?: unknown) => void; }; +type WasmReadyState = boolean | Promise; + class WASMModule extends EventEmitter { id = hyperid(); - ready = false; - worker = null; - pendingMessages = new Map(); + ready: WasmReadyState = false; + worker: Worker | null = null; + pendingMessages = new Map(); async init() { if (this.ready === true) return; - else if (this.ready instanceof Promise) return this.ready; + if (this.ready instanceof Promise) return this.ready; - this.worker = new Worker(new URL('./worker/worker.js', import.meta.url), {type: 'module'}); + this.worker = new Worker(new URL('./worker/worker.ts', import.meta.url), {type: 'module'}); - this.worker.onmessage = (event) => { + this.worker.onmessage = (event: MessageEvent) => { this._handleWorkerMessage(event.data); }; - this.worker.onerror = (error) => { + this.worker.onerror = (error: ErrorEvent) => { console.error('[WASM] Web worker error:', error); this._rejectPendingMessages(error); }; - this.ready = new Promise(async (resolve, reject) => { - try { - await this._sendMessage(MessageType.INIT); - resolve(true); - } catch (error) { + this.ready = this._sendMessage(MessageType.INIT) + .then(() => true) + .catch((error) => { console.error('[WASM] Failed to initialize:', error); this.ready = false; - reject(error); - } - }); + throw error; + }); return this.ready; } - async _sendMessage(type, payload = {}) { - if (!this.worker) throw new Error('Worker not initialized'); + async _sendMessage(type: string, payload: Record = {}): Promise { + const worker = this.worker; + if (!worker) throw new Error('Worker not initialized'); const id = this.id(); return new Promise((resolve, reject) => { this.pendingMessages.set(id, { resolve, reject }); - this.worker.postMessage({ + worker.postMessage({ type, payload, id @@ -78,7 +84,7 @@ class WASMModule extends EventEmitter { }); } - _handleWorkerMessage({ type, payload, id }) { + _handleWorkerMessage({ type, payload, id }: WorkerResponse) { const pendingMessage = this.pendingMessages.get(id); if (!pendingMessage) { @@ -97,23 +103,28 @@ class WASMModule extends EventEmitter { case MessageType.API_RESPONSE: resolve(payload); break; - case MessageType.ERROR: - reject(new Error(payload.message)); + case MessageType.ERROR: { + const message = + payload && typeof payload === "object" && "message" in payload + ? String(payload.message) + : "Unknown worker error"; + reject(new Error(message)); break; + } default: console.warn('[WASM] Unknown message type:', type); reject(new Error(`Unknown message type: ${type}`)); } } - _rejectPendingMessages(error) { + _rejectPendingMessages(error: unknown) { for (const { reject } of this.pendingMessages.values()) { reject(error); } this.pendingMessages.clear(); } - async _apiCall(method, ...args) { + async _apiCall(method: string, ...args: unknown[]) { if (!this.ready) await this.init(); const result = await this._sendMessage(MessageType.API_CALL, { method, args }); @@ -123,35 +134,35 @@ class WASMModule extends EventEmitter { /** * Get all entity classes in a given IFC schema */ - async getAllEntityClasses(schema) { + async getAllEntityClasses(schema: string) { return this._apiCall('getAllEntityClasses', schema); } /** * Get all data types in a given IFC schema */ - async getAllDataTypes(schema) { + async getAllDataTypes(schema: string) { return this._apiCall('getAllDataTypes', schema); } /** * Get predefined types for a given IFC entity */ - async getPredefinedTypes(schema, entity) { + async getPredefinedTypes(schema: string, entity: string) { return this._apiCall('getPredefinedTypes', schema, entity); } /** * Get all attributes for a given IFC entity */ - async getEntityAttributes(schema, entity) { + async getEntityAttributes(schema: string, entity: string) { return this._apiCall('getEntityAttributes', schema, entity); } /** * Get applicable property sets for a given IFC entity */ - async getApplicablePsets(schema, entity, predefinedType = '') { + async getApplicablePsets(schema: string, entity: string, predefinedType = '') { return this._apiCall('getApplicablePsets', schema, entity, predefinedType); } @@ -172,21 +183,21 @@ class WASMModule extends EventEmitter { /** * Load an IFC file. Returns a unique ID for the loaded file. */ - async loadIfc(ifcData) { + async loadIfc(ifcData: number[] | Uint8Array | ArrayBuffer) { return this._apiCall('loadIfc', ifcData); } /** * Unload an IFC file */ - async unloadIfc(ifcId) { + async unloadIfc(ifcId: string) { return this._apiCall('unloadIfc', ifcId); } /** * Audit a loaded IFC file against IDS specifications */ - async auditIfc(ifcId, idsData) { + async auditIfc(ifcId: string, idsData: ArrayBuffer | Uint8Array | number[]) { const idsBytes = idsData instanceof ArrayBuffer ? new Uint8Array(idsData) : idsData; return this._apiCall('auditIfc', ifcId, Array.from(idsBytes)); @@ -204,70 +215,70 @@ class WASMModule extends EventEmitter { /** * Open an existing IDS from XML string */ - async openIDS(idsXml, validate = false) { + async openIDS(idsXml: string, validate = false) { return this._apiCall('openIDS', idsXml, validate); } /** * Create a specification */ - async createSpecification(options = {}) { + async createSpecification(options: Record = {}) { return this._apiCall('createSpecification', options); } /** * Create an entity facet */ - async createEntityFacet(clause, options = {}) { + async createEntityFacet(clause: string, options: Record = {}) { return this._apiCall('createEntityFacet', clause, options); } /** * Create an attribute facet */ - async createAttributeFacet(clause, options = {}) { + async createAttributeFacet(clause: string, options: Record = {}) { return this._apiCall('createAttributeFacet', clause, options); } /** * Create a property facet */ - async createPropertyFacet(clause, options = {}) { + async createPropertyFacet(clause: string, options: Record = {}) { return this._apiCall('createPropertyFacet', clause, options); } /** * Create a material facet */ - async createMaterialFacet(clause, options = {}) { + async createMaterialFacet(clause: string, options: Record = {}) { return this._apiCall('createMaterialFacet', clause, options); } /** * Create a classification facet */ - async createClassificationFacet(clause, options = {}) { + async createClassificationFacet(clause: string, options: Record = {}) { return this._apiCall('createClassificationFacet', clause, options); } /** * Create a part-of facet */ - async createPartOfFacet(clause, options = {}) { + async createPartOfFacet(clause: string, options: Record = {}) { return this._apiCall('createPartOfFacet', clause, options); } /** * Validate an IDS object */ - async validateIDS(idsObj) { + async validateIDS(idsObj: Record) { return await this._apiCall('validateIDS', idsObj); } /** * Export IDS instance to XML string */ - async exportIDS(idsObj) { + async exportIDS(idsObj: Record) { return this._apiCall('exportIDS', idsObj); } @@ -319,4 +330,4 @@ export const { dispose } = wasm; -export default wasm; \ No newline at end of file +export default wasm; diff --git a/src/ifctester/webapp/src/modules/wasm/worker/api.js b/src/ifctester/webapp/src/modules/wasm/worker/api.ts similarity index 80% rename from src/ifctester/webapp/src/modules/wasm/worker/api.js rename to src/ifctester/webapp/src/modules/wasm/worker/api.ts index d08c17efe2a..283971bc27d 100644 --- a/src/ifctester/webapp/src/modules/wasm/worker/api.js +++ b/src/ifctester/webapp/src/modules/wasm/worker/api.ts @@ -1,12 +1,13 @@ -import config from '../../../config.json'; import hyperid from 'hyperid'; +import config from '../../../config.json'; +import type { AuditReportData } from "$src/types/report"; -let pyodide = null; -let id = hyperid(); +let pyodide: any = null; +const id = hyperid(); -let LoadedIFC = new Map(); +const LoadedIFC = new Map(); -export async function init(pdide) { +export async function init(pdide: any) { pyodide = pdide; // Load Python API bindings @@ -18,7 +19,7 @@ export async function init(pdide) { `); } -export async function getPredefinedTypes(schema, entity) { +export async function getPredefinedTypes(schema: string, entity: string) { const result = await pyodide.runPythonAsync(` from api import get_predefined_types_for_entity predef_types = get_predefined_types_for_entity("${schema}", "${entity}") @@ -27,7 +28,7 @@ export async function getPredefinedTypes(schema, entity) { return result.toJs({ dict_converter: Object.fromEntries }); } -export async function getAllEntityClasses(schema) { +export async function getAllEntityClasses(schema: string) { const result = await pyodide.runPythonAsync(` from api import get_all_entity_classes entities = get_all_entity_classes("${schema}") @@ -36,7 +37,7 @@ export async function getAllEntityClasses(schema) { return result.toJs({ dict_converter: Object.fromEntries }); } -export async function getAllDataTypes(schema) { +export async function getAllDataTypes(schema: string) { const result = await pyodide.runPythonAsync(` from api import get_all_data_types data_types = get_all_data_types("${schema}") @@ -45,7 +46,7 @@ export async function getAllDataTypes(schema) { return result.toJs({ dict_converter: Object.fromEntries }); } -export async function getEntityAttributes(schema, entity) { +export async function getEntityAttributes(schema: string, entity: string) { const result = await pyodide.runPythonAsync(` from api import get_entity_attributes attrs = get_entity_attributes("${schema}", "${entity}") @@ -54,7 +55,7 @@ export async function getEntityAttributes(schema, entity) { return result.toJs({ dict_converter: Object.fromEntries }); } -export async function getApplicablePsets(schema, entity, predefinedType = '') { +export async function getApplicablePsets(schema: string, entity: string, predefinedType = '') { const result = await pyodide.runPythonAsync(` from api import get_applicable_psets psets = get_applicable_psets("${schema}", "${entity}", "${predefinedType}") @@ -81,7 +82,7 @@ export async function getStandardClassificationSystems() { return result.toJs({ dict_converter: Object.fromEntries }); } -export async function loadIfc(ifcData) { +export async function loadIfc(ifcData: number[] | Uint8Array | ArrayBuffer) { const ifc_id = id(); const path = `/tmp/${encodeURIComponent(ifc_id)}.ifc`; @@ -97,14 +98,14 @@ export async function loadIfc(ifcData) { return ifc_id; } -export async function unloadIfc(ifcId) { +export async function unloadIfc(ifcId: string) { const path = `/tmp/${encodeURIComponent(ifcId)}.ifc`; pyodide.FS.unlink(path); LoadedIFC.delete(ifcId); } -export async function auditIfc(ifcId, idsData) { +export async function auditIfc(ifcId: string, idsData: number[] | Uint8Array | ArrayBuffer) { const reporter = pyodide.pyimport("ifctester.reporter"); const api = pyodide.pyimport("api"); @@ -116,16 +117,16 @@ export async function auditIfc(ifcId, idsData) { specs.validate(ifc); // Create report in both HTML and JSON formats - let jsonReporter = reporter.Json(specs); + const jsonReporter = reporter.Json(specs); jsonReporter.report(); const jsonReport = jsonReporter.to_string(); - let htmlReporter = reporter.Html(specs); + const htmlReporter = reporter.Html(specs); htmlReporter.report(); const htmlReport = htmlReporter.to_string(); return { - json: JSON.parse(jsonReport), + json: JSON.parse(jsonReport) as AuditReportData, html: htmlReport }; } @@ -142,4 +143,4 @@ export const API = { "loadIfc": loadIfc, "unloadIfc": unloadIfc, "auditIfc": auditIfc -}; \ No newline at end of file +}; diff --git a/src/ifctester/webapp/src/modules/wasm/worker/ids.js b/src/ifctester/webapp/src/modules/wasm/worker/ids.ts similarity index 57% rename from src/ifctester/webapp/src/modules/wasm/worker/ids.js rename to src/ifctester/webapp/src/modules/wasm/worker/ids.ts index 8afc023cecc..ca34b21d759 100644 --- a/src/ifctester/webapp/src/modules/wasm/worker/ids.js +++ b/src/ifctester/webapp/src/modules/wasm/worker/ids.ts @@ -2,13 +2,19 @@ * IDS module */ -let pyodide = null; +let pyodide: any = null; // IDS Python classes -let Ids, Specification; -let Entity, Attribute, Property, Material, Classification, PartOf; - -export async function init(pdide) { +let Ids: any; +let Specification: any; +let Entity: any; +let Attribute: any; +let Property: any; +let Material: any; +let Classification: any; +let PartOf: any; + +export async function init(pdide: any) { pyodide = pdide; await pyodide.loadPackagesFromImports(` @@ -29,24 +35,24 @@ export async function init(pdide) { PartOf = pyodide.pyimport("ifctester.facet").PartOf; } -function _idsToInstance(idsObj) { +function _idsToInstance(idsObj: Record) { const ids_raw = Ids(); return ids_raw.parse(pyodide.toPy(idsObj)) } -export function createIDS() { +export function createIDS(): Record { const ids_raw = Ids() return ids_raw.asdict().toJs({dict_converter: Object.fromEntries}); } -export function openIDS(ids_xml, validate = false) { +export function openIDS(ids_xml: string, validate = false): Record { const ids_from_xml_string = pyodide.pyimport("api").ids_from_xml_string; const ids_raw = ids_from_xml_string(ids_xml, validate); return ids_raw.asdict().toJs({dict_converter: Object.fromEntries}); } -export function validateIDS(idsObj) { +export function validateIDS(idsObj: Record): boolean { const ids_raw = _idsToInstance(idsObj) const tempFilename = `temp_${Date.now()}.xml`; const isValid = ids_raw.to_xml(tempFilename); // to_xml validates the XML as well, as far as I understand @@ -60,12 +66,26 @@ export function validateIDS(idsObj) { return isValid; } -export function exportIDS(idsObj) { +export function exportIDS(idsObj: Record): string { const ids_raw = _idsToInstance(idsObj) return ids_raw.to_string(); } -export function createSpecification({name = "Unnamed", ifcVersion = ["IFC2X3", "IFC4"], identifier = null, description = null, instructions = null, usage = "required"}) { +export function createSpecification({ + name = "Unnamed", + ifcVersion = ["IFC2X3", "IFC4"], + identifier = null, + description = null, + instructions = null, + usage = "required" +}: { + name?: string; + ifcVersion?: string[]; + identifier?: string | null; + description?: string | null; + instructions?: string | null; + usage?: string; +} = {}): Record { const spec = Specification.callKwargs({ name: name, ifcVersion: ifcVersion, @@ -79,7 +99,14 @@ export function createSpecification({name = "Unnamed", ifcVersion = ["IFC2X3", " } // @instructions -export function createEntityFacet(clause, {name = "IFCWALL", predefinedType = null, instructions = null}) { +export function createEntityFacet( + clause: string, + {name = "IFCWALL", predefinedType = null, instructions = null}: { + name?: string; + predefinedType?: string | null; + instructions?: string | null; + } = {} +): Record { const entity = Entity.callKwargs({ name: name, predefinedType: predefinedType, @@ -89,7 +116,15 @@ export function createEntityFacet(clause, {name = "IFCWALL", predefinedType = nu } // @cardinality, @instructions -export function createAttributeFacet(clause, {name = "Name", value = null, cardinality = "required", instructions = null}) { +export function createAttributeFacet( + clause: string, + {name = "Name", value = null, cardinality = "required", instructions = null}: { + name?: string; + value?: string | null; + cardinality?: string; + instructions?: string | null; + } = {} +): Record { const attribute = Attribute.callKwargs({ name: name, value: value, @@ -100,7 +135,16 @@ export function createAttributeFacet(clause, {name = "Name", value = null, cardi } // @uri, @cardinality, @instructions -export function createClassificationFacet(clause, {value = null, system = null, uri = null, cardinality = "required", instructions = null}) { +export function createClassificationFacet( + clause: string, + {value = null, system = null, uri = null, cardinality = "required", instructions = null}: { + value?: string | null; + system?: string | null; + uri?: string | null; + cardinality?: string; + instructions?: string | null; + } = {} +): Record { const classification = Classification.callKwargs({ value: value, system: system, @@ -112,7 +156,16 @@ export function createClassificationFacet(clause, {value = null, system = null, } // @relation, @cardinality, @instructions -export function createPartOfFacet(clause, {name = "IFCWALL", predefinedType = null, relation = null, cardinality = "required", instructions = null}) { +export function createPartOfFacet( + clause: string, + {name = "IFCWALL", predefinedType = null, relation = null, cardinality = "required", instructions = null}: { + name?: string; + predefinedType?: string | null; + relation?: string | null; + cardinality?: string; + instructions?: string | null; + } = {} +): Record { const part_of = PartOf.callKwargs({ name: name, predefinedType: predefinedType, @@ -124,7 +177,26 @@ export function createPartOfFacet(clause, {name = "IFCWALL", predefinedType = nu } // @dataType, @uri, @cardinality, @instructions -export function createPropertyFacet(clause, {propertySet = "Property_Set", baseName = "propertyName", value = null, dataType = null, uri = null, cardinality = "required", instructions = null}) { +export function createPropertyFacet( + clause: string, + { + propertySet = "Property_Set", + baseName = "propertyName", + value = null, + dataType = null, + uri = null, + cardinality = "required", + instructions = null + }: { + propertySet?: string; + baseName?: string; + value?: string | null; + dataType?: string | null; + uri?: string | null; + cardinality?: string; + instructions?: string | null; + } = {} +): Record { const property = Property.callKwargs({ propertySet: propertySet, baseName: baseName, @@ -138,7 +210,15 @@ export function createPropertyFacet(clause, {propertySet = "Property_Set", baseN } // @uri, @cardinality, @instructions -export function createMaterialFacet(clause, {value = null, uri = null, cardinality = "required", instructions = null}) { +export function createMaterialFacet( + clause: string, + {value = null, uri = null, cardinality = "required", instructions = null}: { + value?: string | null; + uri?: string | null; + cardinality?: string; + instructions?: string | null; + } = {} +): Record { const material = Material.callKwargs({ value: value, uri: uri, @@ -149,7 +229,7 @@ export function createMaterialFacet(clause, {value = null, uri = null, cardinali } // Helper function to convert date to ISO format string -export function formatDate(date) { +export function formatDate(date?: string | number | Date | null): string | null { if (!date) return null; const d = new Date(date); return d.toISOString().split('T')[0]; @@ -168,4 +248,4 @@ export const API = { "createPartOfFacet": createPartOfFacet, "createPropertyFacet": createPropertyFacet, "createMaterialFacet": createMaterialFacet, -}; \ No newline at end of file +}; diff --git a/src/ifctester/webapp/src/modules/wasm/worker/worker.js b/src/ifctester/webapp/src/modules/wasm/worker/worker.ts similarity index 61% rename from src/ifctester/webapp/src/modules/wasm/worker/worker.js rename to src/ifctester/webapp/src/modules/wasm/worker/worker.ts index 6bf47e46feb..fe4b1886442 100644 --- a/src/ifctester/webapp/src/modules/wasm/worker/worker.js +++ b/src/ifctester/webapp/src/modules/wasm/worker/worker.ts @@ -4,13 +4,14 @@ import { MessageType } from '../index'; import config from '../../../config.json'; -import * as IDS from './ids.js'; +import * as IDS from './ids'; import * as API from './api'; +import type { ApiCallPayload, WorkerRequest } from "$src/types/wasm"; -let pyodide = null; +let pyodide: any = null; let ready = false; -self.addEventListener('message', async (event) => { +self.addEventListener('message', async (event: MessageEvent) => { console.log("[worker] Received message:", event.data); const { type, payload, id } = event.data; @@ -25,27 +26,33 @@ self.addEventListener('message', async (event) => { }); break; - case MessageType.API_CALL: + case MessageType.API_CALL: { if (!ready) { throw new Error('[worker] Pyodide not initialized'); } - const result = await handleApiCall(payload); + if (!payload) { + throw new Error('[worker] Missing payload for API call'); + } + const result = await handleApiCall(payload as ApiCallPayload); self.postMessage({ type: MessageType.API_RESPONSE, payload: result, id }); break; + } default: throw new Error(`[worker] Unknown message type: ${type}`); } } catch (error) { + const message = error instanceof Error ? error.message : String(error); + const stack = error instanceof Error ? error.stack : undefined; self.postMessage({ type: MessageType.ERROR, payload: { - message: error.message, - stack: error.stack + message, + stack }, id }); @@ -76,7 +83,13 @@ async function initEnvironment() { await pyodide.loadPackage("shapely"); // Install IfcTester - await micropip.install('ifctester'); + const ifctesterManifest = await fetch('/worker/generated/ifctester.json').then((response) => { + if (!response.ok) { + throw new Error(`[worker] Failed to load IfcTester wheel manifest: ${response.status} ${response.statusText}`); + } + return response.json() as Promise<{ wheel_url: string }>; + }); + await micropip.install(ifctesterManifest.wheel_url); // Initialize IDS and API await API.init(pyodide); @@ -93,17 +106,17 @@ async function cleanupEnvironment() { console.log("[worker] Closed environment"); } -async function handleApiCall({ method, args = [] }) { +async function handleApiCall({ method, args = [] }: ApiCallPayload) { if (method === 'internal.cleanup') { await cleanupEnvironment(); return true; } if (method in API.API) { - return await API.API[method](...args); - } else if (method in IDS.API) { - return await IDS.API[method](...args); - } else { - throw new Error(`[worker] Unknown API method: ${method}`); + return await (API.API as Record unknown>)[method](...args); } -} \ No newline at end of file + if (method in IDS.API) { + return await (IDS.API as Record unknown>)[method](...args); + } + throw new Error(`[worker] Unknown API method: ${method}`); +} diff --git a/src/ifctester/webapp/src/pages/Home/ApplicabilityPanel.svelte b/src/ifctester/webapp/src/pages/Home/ApplicabilityPanel.svelte index 2bf687ecc06..df2cfbe9b08 100644 --- a/src/ifctester/webapp/src/pages/Home/ApplicabilityPanel.svelte +++ b/src/ifctester/webapp/src/pages/Home/ApplicabilityPanel.svelte @@ -1,37 +1,56 @@ -
    @@ -40,22 +59,19 @@
    - {#if activeSpecification?.applicability} - {#each Object.entries(activeSpecification.applicability) as [facetType, facets]} - {#if facetType !== "@minOccurs" && facetType !== "@maxOccurs"} - {#each facets as facet, index} - - {/each} - {/if} + {#if activeSpecification && applicabilityEntries.length > 0} + {#each applicabilityEntries as [facetType, facets]} + {#each facets as facet, index} + + {/each} {/each} {/if}
    - \ No newline at end of file + diff --git a/src/ifctester/webapp/src/pages/Home/FacetEditor.svelte b/src/ifctester/webapp/src/pages/Home/FacetEditor.svelte index 4d807625b31..dbc6091f950 100644 --- a/src/ifctester/webapp/src/pages/Home/FacetEditor.svelte +++ b/src/ifctester/webapp/src/pages/Home/FacetEditor.svelte @@ -1,20 +1,40 @@ -
    @@ -48,8 +68,8 @@
    - - getSpecialProp("@relation"), (v) => setSpecialProp("@relation", v)}> @@ -62,8 +82,8 @@ {#if activeTab === 'requirements'} {#if facetType !== 'entity'}
    - - getSpecialProp("@cardinality"), (v) => setSpecialProp("@cardinality", v)}> @@ -71,9 +91,9 @@
    {/if}
    - - + +
    {/if}
    -
    \ No newline at end of file + diff --git a/src/ifctester/webapp/src/pages/Home/IdsMetadataEditor.svelte b/src/ifctester/webapp/src/pages/Home/IdsMetadataEditor.svelte index 59cd95c0a58..63b762fc5ec 100644 --- a/src/ifctester/webapp/src/pages/Home/IdsMetadataEditor.svelte +++ b/src/ifctester/webapp/src/pages/Home/IdsMetadataEditor.svelte @@ -1,13 +1,17 @@ - @@ -18,36 +22,36 @@
    - - getProp("title"), (v) => setProp("title", v)} placeholder="Enter IDS title"> + + getProp("title"), (v) => setProp("title", v)} placeholder="Enter IDS title">
    - - getProp("author"), (v) => setProp("author", v)} placeholder="Enter author"> + + getProp("author"), (v) => setProp("author", v)} placeholder="Enter author">
    - - getProp("version"), (v) => setProp("version", v)} placeholder="Enter version"> + + getProp("version"), (v) => setProp("version", v)} placeholder="Enter version">
    - - getProp("date"), (v) => setProp("date", v)}> + + getProp("date"), (v) => setProp("date", v)}>
    - - + +
    - - getProp("purpose"), (v) => setProp("purpose", v)} placeholder="Enter purpose"> + + getProp("purpose"), (v) => setProp("purpose", v)} placeholder="Enter purpose">
    - - getProp("milestone"), (v) => setProp("milestone", v)} placeholder="Enter milestone"> + + getProp("milestone"), (v) => setProp("milestone", v)} placeholder="Enter milestone">
    - - getProp("copyright"), (v) => setProp("copyright", v)} placeholder="Enter copyright"> + + getProp("copyright"), (v) => setProp("copyright", v)} placeholder="Enter copyright">
    diff --git a/src/ifctester/webapp/src/pages/Home/IdsViewer.svelte b/src/ifctester/webapp/src/pages/Home/IdsViewer.svelte index e9645e09841..beadd151b89 100644 --- a/src/ifctester/webapp/src/pages/Home/IdsViewer.svelte +++ b/src/ifctester/webapp/src/pages/Home/IdsViewer.svelte @@ -1,18 +1,28 @@ -
    @@ -211,8 +254,17 @@
    {#each activeDocument.specifications.specification as spec, index} + {@const usage = getDocumentSpecificationUsage(spec)} + {@const requirementGroups = getRequirementGroups(spec)}
    -
    toggleSpecification(index)}> +
    toggleSpecification(index)} + onkeydown={(event) => handleActivation(event, () => toggleSpecification(index))} + >

    {spec["@name"] || `Specification ${index + 1}`}

    @@ -240,19 +292,30 @@ {#if "@description" in spec}

    {spec["@description"]}

    {/if} +
    + {#if usage === 'required'} + Required + {/if} + {#if usage === 'optional'} + Optional + {/if} + {#if usage === 'prohibited'} + Prohibited + {/if} + {#if auditReport} + {@const stats = getSpecificationStats(index, auditReport.data)} + {@const status = getSpecificationStatus(index, auditReport.data)} + {#if stats && usage !== 'prohibited' && status !== 'skipped'} + Checks: {stats.checksPassed}/{stats.checksTotal} + Requirements: {stats.requirementsPassed}/{stats.requirements} + {/if} + {/if} +
    {#if auditReport} {@const reason = getSpecificationReason(index, auditReport.data)} {#if reason}

    {reason}

    {/if} - {@const stats = getSpecificationStats(index, auditReport.data)} - {@const status = getSpecificationStatus(index, auditReport.data)} - {#if stats && status !== 'skipped'} -
    - Checks: {stats.checksPassed}/{stats.checksTotal} - Requirements: {stats.requirementsPassed}/{stats.requirements} -
    - {/if} {/if}
    @@ -292,39 +355,135 @@ {/if} {/each}
    + + {#if auditReport} + {@const status = getSpecificationStatus(index, auditReport.data)} + {#if status === false && usage === 'prohibited'} + {@const specReport = auditReport.data.specifications[index]} + {@const applicableEntities = specReport.applicable_entities ?? []} +
    + {#if applicableEntities.length > 0} +
    +

    Failed Elements ({applicableEntities.length})

    +
    + + + + + + + + + + + + + + + {#each applicableEntities.slice(0, 10) as entity} + + + + + + + + + + {/each} + {#if applicableEntities.length > 10} + + + + {/if} + +
    ClassPredefinedTypeNameDescriptionWarningGlobalIdTag
    {entity.class}{entity.predefined_type || '-'} + + +
    {entity.name || '-'}
    +
    + +

    {entity.name || '-'}

    +
    +
    +
    + + +
    {entity.description || '-'}
    +
    + +

    {entity.description || '-'}

    +
    +
    +
    + + +
    {entity.reason || '-'}
    +
    + +

    {entity.reason || '-'}

    +
    +
    +
    + + +
    {entity.global_id || '-'}
    +
    + +

    {entity.global_id || '-'}

    +
    +
    +
    + + +
    {entity.tag || '-'}
    +
    + +

    {entity.tag || '-'}

    +
    +
    +
    ... {applicableEntities.length - 10} more failing elements not shown ...
    +
    +
    +
    + {/if} +
    + + {/if} + {/if}
    + {#if requirementGroups.length > 0}

    Requirements

    - {#each Object.entries(spec.requirements || {}) as [facetType, facets]} - {#if Array.isArray(facets) && facets.length > 0} -
    - {#each facets as facet, facetIndex} - {@const reqAuditData = auditReport ? getRequirementStatus(index, facetIndex, auditReport.data) : null} - {@const specStatus = auditReport ? getSpecificationStatus(index, auditReport.data) : null} -
    - - {#if isRequirementDetailsExpanded(index, facetIndex)} + {/if} + + {#if reqAuditData && isRequirementDetailsExpanded(index, item.reqIndex)}
    {#if reqAuditData.passed_entities && reqAuditData.passed_entities.length > 0} @@ -489,14 +648,14 @@ {/if}
    - {/if} -
    - {/each} -
    - {/if} + {/if} +
    + {/each} +
    {/each}
    + {/if}
    {/if} @@ -1128,4 +1287,4 @@ white-space: nowrap; cursor: pointer; } - \ No newline at end of file + diff --git a/src/ifctester/webapp/src/pages/Home/RequirementsPanel.svelte b/src/ifctester/webapp/src/pages/Home/RequirementsPanel.svelte index 189d9c7066f..b034778a674 100644 --- a/src/ifctester/webapp/src/pages/Home/RequirementsPanel.svelte +++ b/src/ifctester/webapp/src/pages/Home/RequirementsPanel.svelte @@ -1,37 +1,53 @@ -
    @@ -40,8 +56,8 @@
    - {#if activeSpecification?.requirements} - {#each Object.entries(activeSpecification.requirements) as [facetType, facets]} + {#if activeSpecification && requirementEntries.length > 0} + {#each requirementEntries as [facetType, facets]} {#each facets as facet, index} {/each} {/each} {/if}
    - \ No newline at end of file + diff --git a/src/ifctester/webapp/src/pages/Home/RestrictionEditor.svelte b/src/ifctester/webapp/src/pages/Home/RestrictionEditor.svelte index 3bc50420656..c8942b2a52d 100644 --- a/src/ifctester/webapp/src/pages/Home/RestrictionEditor.svelte +++ b/src/ifctester/webapp/src/pages/Home/RestrictionEditor.svelte @@ -1,34 +1,86 @@ -
    - -
    + {label} +
    {#if !isSpecialProp}
    - handleTypeChange((e.target as HTMLSelectElement).value)} + > @@ -477,7 +537,7 @@ placeholder={placeholder} /> {:else} - getSimpleValue(), (v) => setSimpleValue(v)} {placeholder}> + getSimpleValue(), (v) => setSimpleValue(v)} {placeholder} aria-label={label}> {/if} {:else if restrictionType === 'Enumeration'} @@ -497,7 +557,14 @@ placeholder={placeholder} /> {:else} - updateEnumerationValue(index, e.target.value)} {placeholder}> + updateEnumerationValue(index, (e.target as HTMLInputElement).value)} + {placeholder} + aria-label={`${label} option ${index + 1}`} + > {/if}
    {:else if restrictionType === 'Pattern'} - getPatternValue(), (v) => setPatternValue(v)} placeholder="Enter regex pattern (e.g., DT[0-9]{2})"> + getPatternValue(), (v) => setPatternValue(v)} placeholder="Enter regex pattern (e.g., DT[0-9]{2})" aria-label={`${label} pattern`}> {:else if restrictionType === 'Range'} + {@const range = getRangeValues()}
    - - getRangeValues().min, (v) => { const range = getRangeValues(); setRangeValues(v, range.max, range.minType, range.maxType); }} placeholder="0"> - range.min, (v) => setRangeValues(v, range.max, range.minType, range.maxType)} + placeholder="0" + > +
    - - getRangeValues().max, (v) => { const range = getRangeValues(); setRangeValues(range.min, v, range.minType, range.maxType); }} placeholder="0"> - range.max, (v) => setRangeValues(range.min, v, range.minType, range.maxType)} + placeholder="0" + > + @@ -538,17 +626,18 @@
    {:else if restrictionType === 'Length'} - getLengthValue(), (v) => setLengthValue(v)} placeholder="Enter exact length"> + getLengthValue(), (v) => setLengthValue(v)} placeholder="Enter exact length" aria-label={`${label} length`}> {:else if restrictionType === 'Length Range'} + {@const lengthRange = getLengthRangeValues()}
    - - getLengthRangeValues().min, (v) => { const range = getLengthRangeValues(); setLengthRangeValues(v, range.max); }} placeholder="0"> + + lengthRange.min, (v) => setLengthRangeValues(v, lengthRange.max)} placeholder="0">
    - - getLengthRangeValues().max, (v) => { const range = getLengthRangeValues(); setLengthRangeValues(range.min, v); }} placeholder="0"> + + lengthRange.max, (v) => setLengthRangeValues(lengthRange.min, v)} placeholder="0">
    {/if} @@ -656,4 +745,4 @@ color: #666; margin: 0; } - \ No newline at end of file + diff --git a/src/ifctester/webapp/src/pages/Home/SpecificationEditor.svelte b/src/ifctester/webapp/src/pages/Home/SpecificationEditor.svelte index be524ea4117..cc340f6cbe3 100644 --- a/src/ifctester/webapp/src/pages/Home/SpecificationEditor.svelte +++ b/src/ifctester/webapp/src/pages/Home/SpecificationEditor.svelte @@ -1,33 +1,44 @@ - {#if IDS.Module.status != "ready"} @@ -130,8 +158,7 @@ Import from IDS - {#each Object.entries(IDS.Module.documents) as [docId, doc]} - {#if docId !== IDS.Module.activeDocument && doc.specifications?.specification?.length > 0} + {#each importableDocuments as [docId, doc], docIndex} {doc.info?.title || 'Untitled Document'} @@ -146,12 +173,11 @@ {/each} - {#if Object.entries(IDS.Module.documents).filter(([id, d]) => id !== IDS.Module.activeDocument && d.specifications?.specification?.length > 0).indexOf([docId, doc]) < Object.entries(IDS.Module.documents).filter(([id, d]) => id !== IDS.Module.activeDocument && d.specifications?.specification?.length > 0).length - 1} + {#if docIndex < importableDocuments.length - 1} {/if} - {/if} {/each} - {#if Object.entries(IDS.Module.documents).filter(([docId, doc]) => docId !== IDS.Module.activeDocument && doc.specifications?.specification?.length > 0).length === 0} + {#if importableDocuments.length === 0} No specifications available to import @@ -162,16 +188,30 @@
    -
    { if (IDS.Module.activeDocument) IDS.setDocumentState(IDS.Module.activeDocument, { activeSpecification: null }); }}> +
    { if (IDS.Module.activeDocument) IDS.setDocumentState(IDS.Module.activeDocument, { activeSpecification: null }); }} + onkeydown={(event) => handleActivation(event, () => { if (IDS.Module.activeDocument) IDS.setDocumentState(IDS.Module.activeDocument, { activeSpecification: null }); })} + > ℹ️ IDS Information
    {#if activeDocument?.specifications?.specification} {#each activeDocument.specifications.specification as spec, index} -
    selectSpecification(index)}> +
    selectSpecification(index)} + onkeydown={(event) => handleActivation(event, () => selectSpecification(index))} + > 📄 {spec["@name"] || "Specification " + (index + 1)} - -
    @@ -209,18 +249,18 @@

    {activeSpecification ? activeSpecification["@name"] || "Specification" : "Specification"}

    - - - + + +
    {#if documentState?.activeTab === 'info'} {:else if documentState?.activeTab === 'applicability'} - + {:else if documentState?.activeTab === 'requirements'} - + {/if}
    {/if} diff --git a/src/ifctester/webapp/src/pages/index.js b/src/ifctester/webapp/src/pages/index.ts similarity index 100% rename from src/ifctester/webapp/src/pages/index.js rename to src/ifctester/webapp/src/pages/index.ts diff --git a/src/ifctester/webapp/src/routes.js b/src/ifctester/webapp/src/routes.ts similarity index 100% rename from src/ifctester/webapp/src/routes.js rename to src/ifctester/webapp/src/routes.ts diff --git a/src/ifctester/webapp/src/types/ids.ts b/src/ifctester/webapp/src/types/ids.ts new file mode 100644 index 00000000000..a8213e6baa8 --- /dev/null +++ b/src/ifctester/webapp/src/types/ids.ts @@ -0,0 +1,70 @@ +export type IdsCardinality = "required" | "optional" | "prohibited"; + +export type RestrictionValue = { + "@value": string; +}; + +export type Restriction = { + "@base"?: string; + enumeration?: RestrictionValue[]; + pattern?: RestrictionValue[]; + length?: RestrictionValue[]; + minLength?: RestrictionValue[]; + maxLength?: RestrictionValue[]; + minInclusive?: RestrictionValue[]; + maxInclusive?: RestrictionValue[]; + minExclusive?: RestrictionValue[]; + maxExclusive?: RestrictionValue[]; +}; + +export type SimpleValue = { + simpleValue: string; +}; + +export type FacetValue = { + simpleValue?: string; + restriction?: Restriction; +}; + +export type Facet = Record; + +export type FacetClause = Record; + +export type Specification = { + "@name"?: string; + "@identifier"?: string; + "@description"?: string; + "@instructions"?: string; + "@ifcVersion"?: string[]; + applicability?: FacetClause; + requirements?: FacetClause; +}; + +export type IdsInfo = { + title?: string; + copyright?: string; + version?: string; + description?: string; + author?: string; + date?: string; + purpose?: string; + milestone?: string; +}; + +export type IdsDocument = { + "@xmlns"?: string; + "@xmlns:xs"?: string; + "@xmlns:xsi"?: string; + "@xsi:schemaLocation"?: string; + info: IdsInfo; + specifications: { + specification: Specification[]; + }; +}; + +export type DocumentState = { + activeTab: "info" | "applicability" | "requirements"; + viewMode: "editor" | "viewer"; + activeSpecification: number | null; + auditReport?: string | null; +}; diff --git a/src/ifctester/webapp/src/types/report.ts b/src/ifctester/webapp/src/types/report.ts new file mode 100644 index 00000000000..ee683e08084 --- /dev/null +++ b/src/ifctester/webapp/src/types/report.ts @@ -0,0 +1,95 @@ +export type ResultsPercent = number | "N/A"; + +export type AuditReportEntity = { + reason?: string; + element?: unknown; + element_type?: unknown; + class?: string; + predefined_type?: string; + name?: string | null; + description?: string | null; + id?: number; + global_id?: string | null; + tag?: string | null; + type_name?: string; + type_tag?: string | null; + type_global_id?: string | null; + extra_of_type?: number; +}; + +export type AuditRequirement = { + facet_type: string; + metadata: Record; + label: string; + value: string; + description: string; + status: boolean; + passed_entities: AuditReportEntity[]; + failed_entities: AuditReportEntity[]; + total_applicable: number; + total_pass: number; + total_fail: number; + percent_pass: ResultsPercent; + instructions?: string; + total_failed_entities?: number; + total_omitted_failures?: number; + has_omitted_failures?: boolean; + total_passed_entities?: number; + total_omitted_passes?: number; + has_omitted_passes?: boolean; +}; + +export type AuditSpecification = { + name: string; + description: string; + instructions: string; + status: boolean; + is_skipped?: boolean; + is_ifc_version: boolean; + total_applicable: number; + total_applicable_pass: number; + total_applicable_fail: number; + percent_applicable_pass: ResultsPercent; + total_checks: number; + total_checks_pass: number; + total_checks_fail: number; + percent_checks_pass: ResultsPercent; + cardinality: string; + applicability: string[]; + applicable_entities?: AuditReportEntity[]; + requirements: AuditRequirement[]; + total_requirements?: number; + total_requirements_pass?: number; +}; + +export type AuditReportData = { + title: string; + date: string; + filepath: string | null; + filename: string | null; + hide_skipped: boolean; + specifications: AuditSpecification[]; + status: boolean; + total_specifications: number; + total_specifications_pass: number; + total_specifications_fail: number; + percent_specifications_pass: ResultsPercent; + total_requirements: number; + total_requirements_pass: number; + total_requirements_fail: number; + percent_requirements_pass: ResultsPercent; + total_checks: number; + total_checks_pass: number; + total_checks_fail: number; + percent_checks_pass: ResultsPercent; +}; + +export type AuditReport = { + id: string; + modelId: string; + modelName: string; + document: string; + date: string; + data: AuditReportData; + htmlReport?: string | null; +}; diff --git a/src/ifctester/webapp/src/types/wasm.ts b/src/ifctester/webapp/src/types/wasm.ts new file mode 100644 index 00000000000..101796bd114 --- /dev/null +++ b/src/ifctester/webapp/src/types/wasm.ts @@ -0,0 +1,24 @@ +export type WorkerMessageType = + | "init" + | "api_call" + | "ready" + | "api_response" + | "error" + | "disposed"; + +export type WorkerRequest = { + type: WorkerMessageType; + payload?: Record; + id: string; +}; + +export type WorkerResponse = { + type: WorkerMessageType; + payload?: Record; + id: string; +}; + +export type ApiCallPayload = { + method: string; + args?: unknown[]; +}; diff --git a/src/ifctester/webapp/tsconfig.json b/src/ifctester/webapp/tsconfig.json new file mode 100644 index 00000000000..39e15a0e102 --- /dev/null +++ b/src/ifctester/webapp/tsconfig.json @@ -0,0 +1,22 @@ +{ + "compilerOptions": { + "moduleResolution": "bundler", + "target": "ESNext", + "module": "ESNext", + "verbatimModuleSyntax": true, + "isolatedModules": true, + "resolveJsonModule": true, + "sourceMap": true, + "esModuleInterop": true, + "skipLibCheck": true, + "strict": true, + "baseUrl": ".", + "paths": { + "$lib": ["./src/lib"], + "$lib/*": ["./src/lib/*"], + "$src": ["./src"], + "$src/*": ["./src/*"] + } + }, + "include": ["src/**/*.d.ts", "src/**/*.ts", "src/**/*.svelte"] +} diff --git a/src/ifctester/webapp/vite.config.js b/src/ifctester/webapp/vite.config.js index cfc33f9356b..46cecde534d 100644 --- a/src/ifctester/webapp/vite.config.js +++ b/src/ifctester/webapp/vite.config.js @@ -1,7 +1,7 @@ import tailwindcss from '@tailwindcss/vite'; import { defineConfig } from 'vite'; import { svelte } from '@sveltejs/vite-plugin-svelte'; -import path from "path"; +import path from "node:path"; export default defineConfig({ plugins: [tailwindcss(), svelte()], @@ -11,4 +11,4 @@ export default defineConfig({ $src: path.resolve("./src"), }, }, -}); \ No newline at end of file +}); diff --git a/src/ifcwrap/CMakeLists.txt b/src/ifcwrap/CMakeLists.txt index 47420d98174..16e3a865657 100644 --- a/src/ifcwrap/CMakeLists.txt +++ b/src/ifcwrap/CMakeLists.txt @@ -140,6 +140,7 @@ else() target_link_libraries(ifcopenshell_wrapper PRIVATE ${IFCOPENSHELL_LIBRARIES} ${LIBSVGFILL}) endif() target_link_libraries(ifcopenshell_wrapper PRIVATE ${CGAL_LIBRARIES}) +target_link_libraries(ifcopenshell_wrapper PRIVATE IfcGeom ${kernel_libraries}) if((NOT WIN32) AND BUILD_SHARED_LIBS) SET_INSTALL_RPATHS(ifcopenshell_wrapper "${IFCDIRS};${OCC_LIBRARY_DIR}") endif() diff --git a/src/ifcwrap/IfcGeomWrapper.i b/src/ifcwrap/IfcGeomWrapper.i index e155c2837e8..e992e4beab9 100644 --- a/src/ifcwrap/IfcGeomWrapper.i +++ b/src/ifcwrap/IfcGeomWrapper.i @@ -1166,6 +1166,7 @@ ifcopenshell::geometry::taxonomy::item::ptr try_upcast(PyObject* obj0, swig_type %ignore svgfill::line_segments_to_polygons; %ignore svgfill::svg_to_polygons; %ignore svgfill::arrange_polygons; +%ignore svgfill::abstract_arrangement; %template(svg_line_segments) std::vector>; %template(svg_groups_of_line_segments) std::vector>>; @@ -1287,9 +1288,9 @@ ifcopenshell::geometry::taxonomy::item::ptr try_upcast(PyObject* obj0, swig_type } } - std::vector arrange_polygons(const std::vector& polygons) { + std::vector arrange_polygons(svgfill::arrange_polygon_settings settings, const std::vector& polygons) { std::vector r; - if (svgfill::arrange_polygons(polygons, r)) { + if (svgfill::arrange_polygons(settings, polygons, r)) { return r; } else { throw std::runtime_error("Failed to arrange polygons"); diff --git a/src/ifcwrap/IfcPython.i b/src/ifcwrap/IfcPython.i index db772ba26e1..ca802cedfac 100644 --- a/src/ifcwrap/IfcPython.i +++ b/src/ifcwrap/IfcPython.i @@ -108,6 +108,7 @@ %ignore FloatingPointDigits; %ignore BaseUri; %ignore WktUseSection; +%ignore SeparateZUpNode; // ConversionSettings.h %ignore MesherLinearDeflection; %ignore MesherAngularDeflection; @@ -158,11 +159,11 @@ %ignore CgalEmitOriginalEdges; %ignore OcctNoCleanTriangulation; %ignore CacheShapes; +%ignore MakeVolume; %ignore DeferProcessingFirstElement; %ignore MaxOffset; %ignore MaxOffsetDeviation; %ignore ApplyOffset; -%ignore SeparateZUpNode; %ignore XmlSerializerFactory; %ignore JsonSerializerFactory; diff --git a/src/ifcwrap/utils/type_conversion.i b/src/ifcwrap/utils/type_conversion.i index 292a2e0c11d..3eacf55fac8 100644 --- a/src/ifcwrap/utils/type_conversion.i +++ b/src/ifcwrap/utils/type_conversion.i @@ -31,6 +31,7 @@ bool check_aggregate_of_type(PyObject* aggregate, void* type_obj) { if (!PySequence_Check(aggregate)) return false; + if (PySequence_Size(aggregate) == -1) return false; for(Py_ssize_t i = 0; i < PySequence_Size(aggregate); ++i) { PyObject* element = PySequence_GetItem(aggregate, i); // This is equivalent to the PyFloat_CheckExact macro. This means @@ -46,6 +47,7 @@ bool check_aggregate_of_aggregate_of_type(PyObject* aggregate, void* type_obj) { if (!PySequence_Check(aggregate)) return false; + if (PySequence_Size(aggregate) == -1) return false; for(Py_ssize_t i = 0; i < PySequence_Size(aggregate); ++i) { PyObject* element = PySequence_GetItem(aggregate, i); bool b = check_aggregate_of_type(element, type_obj); diff --git a/src/opencdeserver/api/app/repository/bcf.py b/src/opencdeserver/api/app/repository/bcf.py index a65c43d1153..3812334e41e 100644 --- a/src/opencdeserver/api/app/repository/bcf.py +++ b/src/opencdeserver/api/app/repository/bcf.py @@ -694,8 +694,7 @@ def post_viewpoint_work(tx) -> str: snapshot_type = "" snapshot = False set_snapshot = "" - cypher_viewpoint = ( - """ + cypher_viewpoint = """ MATCH (u:User)-[r1:HAS_ACTIONS_ON]->(p:Project)-[r2:HAS]->(t:Topic) WHERE u.username = $username AND r1.createViewpoint = True @@ -713,9 +712,7 @@ def post_viewpoint_work(tx) -> str: v.spaces_visible = $spaces_visible, v.space_boundaries_visible = $space_boundaries_visible, v.openings_visible = $openings_visible - """ - % set_snapshot - ) + """ % set_snapshot if viewpoint.guid is None: viewpoint.guid = uuid4() if viewpoint.orthogonal_camera is None: @@ -1450,8 +1447,7 @@ def post_topic_document_reference_work(tx) -> bool: else: document_url = "" document_reference.url = "" - cypher = ( - """ + cypher = """ MATCH (u:User)-[r1:HAS_ACTIONS_ON]->(p:Project)-[r2:HAS]->(t:Topic) WHERE u.username = $username AND r1.updateDocumentReferences = True @@ -1461,9 +1457,7 @@ def post_topic_document_reference_work(tx) -> bool: SET r3.guid: $document_reference_id, %s d.description = $description - """ - % document_url - ) + """ % document_url result = tx.run( cypher, username=current_user.username, diff --git a/src/opencdeserver/api/app/repository/documents.py b/src/opencdeserver/api/app/repository/documents.py index 95c669a7bc2..d03512c8e32 100644 --- a/src/opencdeserver/api/app/repository/documents.py +++ b/src/opencdeserver/api/app/repository/documents.py @@ -36,17 +36,14 @@ def get_document_work(tx) -> Union[Document, bool]: else: version_index_criteria = "AND d.version_index = $version_index" - cypher = ( - """ + cypher = """ MATCH (d:Document) WHERE d.document_id = $document_id %s RETURN d AS document ORDER by d.version_index DESC LIMIT 1 - """ - % version_index_criteria - ) + """ % version_index_criteria result = tx.run(cypher, document_id=document_id, version_index=version_index) @@ -891,8 +888,7 @@ def get_document_version_work(tx) -> Union[DocumentVersion, bool]: else: version_index_criteria = "" - cypher = ( - """ + cypher = """ MATCH (u:User)-[r3:HAS_ACTIONS_ON]->(p:Project)-[r4:CONTAINS]->(d:Document) WHERE u.username = $username AND d.document_id = $document_id @@ -900,9 +896,7 @@ def get_document_version_work(tx) -> Union[DocumentVersion, bool]: RETURN d AS document ORDER by d.version_index DESC LIMIT 1 - """ - % version_index_criteria - ) + """ % version_index_criteria result = tx.run( cypher, username=current_user.username, document_id=document_id, version_index=version_index @@ -927,8 +921,7 @@ def get_document_version_metadata_work(tx) -> DocumentMetadataEntries: else: version_index_criteria = "" - cypher = ( - """ + cypher = """ MATCH (u:User)-[r3:HAS_ACTIONS_ON]->(p:Project)-[r4:CONTAINS]->(d:Document) WHERE u.username = $username AND d.document_id = $document_id @@ -936,9 +929,7 @@ def get_document_version_metadata_work(tx) -> DocumentMetadataEntries: RETURN d AS document ORDER by d.version_index DESC LIMIT 1 - """ - % version_index_criteria - ) + """ % version_index_criteria result = tx.run( cypher, username=current_user.username, document_id=document_id, version_index=version_index diff --git a/src/opencdeserver/api/app/security/secure.py b/src/opencdeserver/api/app/security/secure.py index fec837b8680..e332c946479 100644 --- a/src/opencdeserver/api/app/security/secure.py +++ b/src/opencdeserver/api/app/security/secure.py @@ -1,7 +1,7 @@ from __future__ import annotations import os -from datetime import datetime, timedelta +from datetime import datetime, timedelta, timezone from database.neo4j import db from fastapi import Depends, HTTPException, Security, status @@ -33,10 +33,8 @@ def create_access_token(data: dict, expires_delta: timedelta | None = None): payload = data.copy() - if expires_delta: - expire = datetime.utcnow() + expires_delta - else: - expire = datetime.utcnow() + timedelta(minutes=15) + expires_delta = expires_delta or timedelta(minutes=15) + expire = datetime.now(timezone.utc) + expires_delta payload.update({"expires": str(expire)}) encoded_jwt = jwt.encode(payload, secrets["security_secret_key"], algorithm=os.environ["SECURITY_ALGORITHM"]) return encoded_jwt diff --git a/src/serializers/WavefrontObjSerializer.cpp b/src/serializers/WavefrontObjSerializer.cpp index f29612a65ec..848dd9beb72 100644 --- a/src/serializers/WavefrontObjSerializer.cpp +++ b/src/serializers/WavefrontObjSerializer.cpp @@ -32,6 +32,7 @@ WaveFrontOBJSerializer::WaveFrontOBJSerializer(const stream_or_filename& obj_fil , obj_stream(obj_filename) , mtl_stream(mtl_filename) , vcount_total(1) + , ncount_total(1) { obj_stream.stream << std::setprecision(settings.get().get()); mtl_stream.stream << std::setprecision(settings.get().get()); diff --git a/src/serializers/schema_dependent/CMakeLists.txt b/src/serializers/schema_dependent/CMakeLists.txt index ef877342e95..73c1e5d3e7e 100644 --- a/src/serializers/schema_dependent/CMakeLists.txt +++ b/src/serializers/schema_dependent/CMakeLists.txt @@ -9,9 +9,9 @@ foreach(schema ${SCHEMA_VERSIONS}) Serializers_ifc${schema} PROPERTIES COMPILE_FLAGS "-DIFC_GEOM_EXPORTS -DIfcSchema=Ifc${schema}" ) - target_link_libraries(Serializers_ifc${schema} ${HDF5_LIBRARIES} ${GLTF_LIBRARIES}) + target_link_libraries(Serializers_ifc${schema} IfcGeom ${HDF5_LIBRARIES} ${GLTF_LIBRARIES}) if(NOT WASM_BUILD) - target_link_libraries(Serializers_ifc${schema} IfcGeom ${OpenCASCADE_LIBRARIES}) + target_link_libraries(Serializers_ifc${schema} ${OpenCASCADE_LIBRARIES}) endif() endforeach() diff --git a/src/svgfill/CMakeLists.txt b/src/svgfill/CMakeLists.txt index f2f8c1a062d..0d9764013ae 100644 --- a/src/svgfill/CMakeLists.txt +++ b/src/svgfill/CMakeLists.txt @@ -36,7 +36,14 @@ message(STATUS "Boost include files found in ${Boost_INCLUDE_DIRS}") find_package(LibXml2 REQUIRED) find_package(CGAL REQUIRED) -include_directories(${Boost_INCLUDE_DIRS} ${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/svgpp/include) +set(SVGPP_INCLUDE "${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/svgpp/include") +if(NOT EXISTS ${SVGPP_INCLUDE}) + message( + FATAL_ERROR + "Missing svgpp include path, probably you forgot to initialize submodules in git repo. Missing path - '${SVGPP_INCLUDE}'." + ) +endif() +include_directories(${Boost_INCLUDE_DIRS} ${SVGPP_INCLUDE}) file(GLOB LIB_H_FILES src/*.h) file(GLOB LIB_CPP_FILES src/svgfill.cpp src/arrange_polygons.cpp) diff --git a/src/svgfill/src/arrange_polygons.cpp b/src/svgfill/src/arrange_polygons.cpp index 7bddc2e41a4..f405f707c14 100644 --- a/src/svgfill/src/arrange_polygons.cpp +++ b/src/svgfill/src/arrange_polygons.cpp @@ -1,4 +1,4 @@ -// #define SVGFILL_DEBUG +#define SVGFILL_DEBUG // #define SVGFILL_MAIN #ifndef SVGFILL_MAIN @@ -38,6 +38,7 @@ typedef CGAL::Exact_predicates_exact_constructions_kernel K; typedef CGAL::Polygon_2 Polygon_2; typedef CGAL::Polygon_with_holes_2 Polygon_with_holes_2; typedef K::Point_2 Point_2; +typedef K::Vector_2 Vector_2; typedef K::Segment_2 Segment_2; typedef std::vector Polygon_list; typedef CGAL::Arr_segment_traits_2 Traits_2; @@ -164,31 +165,6 @@ boost::optional subtract_retain_largest(const T& lhs, const T& rhs) { return boost::none; } -// Function to write polygons as line segments in OBJ format -void write_polygon_to_obj(std::ofstream& ofs, size_t& vertex_index, bool as_line, const Polygon_2& polygon, const std::string& name) { - ofs << "o " << name << "\n"; // Object name - - // Write vertices - for (auto vit = polygon.vertices_begin(); vit != polygon.vertices_end(); ++vit) { - ofs << "v " << CGAL::to_double(vit->x()) << " " << CGAL::to_double(vit->y()) << " 0\n"; - } - - if (as_line) { - // Write line segments (edges) - for (size_t j = 0; j < polygon.size(); ++j) { - ofs << "l " << vertex_index + j << " " << vertex_index + (j + 1) % polygon.size() << "\n"; - } - } else { - ofs << "f"; - for (size_t j = 0; j < polygon.size(); ++j) { - ofs << " " << vertex_index + j; - } - ofs << "\n"; - } - - vertex_index += polygon.size(); -} - Polygon_2 circ_to_poly(typename Arrangement_2::Ccb_halfedge_const_circulator circ) { Polygon_2 poly; @@ -208,27 +184,6 @@ Polygon_with_holes_2 circ_to_poly(typename Arrangement_2::Ccb_halfedge_const_cir return poly; } -void write_polygon_to_svg(std::ostream& ofs, const Polygon_2& polygon) { - ofs << "x()) << "," << CGAL::to_double(vit->y()) << " "; - } - ofs << "\" style=\"fill:none;stroke-width:1\" />\n"; -} - -// Function to write a Polygon_with_holes_2 to an SVG file -void write_polygon_with_holes_to_svg(std::ostream& ofs, const Polygon_with_holes_2& polygon_with_holes) { - // Write the outer boundary (main polygon) - if (!polygon_with_holes.is_unbounded()) { - write_polygon_to_svg(ofs, polygon_with_holes.outer_boundary()); - } - - // Write the holes (if any) with a different color (e.g., red) - for (auto hit = polygon_with_holes.holes_begin(); hit != polygon_with_holes.holes_end(); ++hit) { - write_polygon_to_svg(ofs, *hit); - } -} - Polygon_2 fuse_with_offset(const std::vector& polygons, double polygon_offset_distance) { // Find the outer perimeter using offset - union - negative offset std::vector offset_polygons; @@ -285,78 +240,77 @@ Polygon_2 fuse_with_offset(const std::vector& polygons, double polygo return inner_offset.front(); } -void arrange_cgal_polygons(const std::vector& input_polygons_, std::vector& output_polygons, double polygon_offset_distance = -1.) { - static const double OVERLAP_RESOLUTION_DISTANCE = 1.e-2; - // even larger amount of inset so that outer perimeter is safely within all input polygons even when overlap resolution is applied - // no, `1.e-2 + 1.e-5` creates issues with the outer perimeter, are there other tolerances in play? - static const double OUTER_PERIMITER_ADDITIONAL_INSET_AMOUNT = 1.e-5; - - if (polygon_offset_distance < 0.) { - double total_edge_length = 0.; - size_t num_edges = 0; - for (auto& p : input_polygons_) { - for (auto it = p.edges_begin(); it != p.edges_end(); ++it) { - total_edge_length += std::sqrt(CGAL::to_double(CGAL::squared_distance(it->start(), it->end()))); - num_edges += 1; - } +double estimate_polygon_offset_distance(const std::vector& polygons) { + double total_edge_length = 0.; + size_t num_edges = 0; + for (auto& p : polygons) { + for (auto it = p.edges_begin(); it != p.edges_end(); ++it) { + total_edge_length += std::sqrt(CGAL::to_double(CGAL::squared_distance(it->start(), it->end()))); + num_edges += 1; } - polygon_offset_distance = total_edge_length / num_edges / 2; } + return total_edge_length / num_edges / 2; +} - auto input_polygons__ = input_polygons_; - decltype(input_polygons__) input_polygons; - - for (auto& i : input_polygons__) { - std::vector> ps(i.begin(), i.end()); - if (ps.front() == ps.back()) { - ps.pop_back(); - } - input_polygons.emplace_back(ps.begin(), ps.end()); +void clean_polygon(Polygon_2& poly) { + // Ensure counterclockwise orientation and remove duplicate last point if present also remove close points + if (!poly.is_counterclockwise_oriented()) { + poly.reverse_orientation(); } + std::vector> ps(poly.begin(), poly.end()); + if (ps.front() == ps.back()) { + ps.pop_back(); + } + poly = Polygon_2(ps.begin(), ps.end()); + remove_close_points(poly); +} - for (auto& polygon : input_polygons) { - if (!polygon.is_counterclockwise_oriented()) { - polygon.reverse_orientation(); +void smooth_polygon(double factor, Polygon_2& poly) { + auto ps = create_and_convert_offset_polygon(-factor, poly); + if (ps.size() == 1) { + auto r2 = ps.front(); + ps = create_and_convert_offset_polygon(+factor, r2); + if (ps.size() == 1) { + poly = ps.front(); } } +} - for (auto& polygon : input_polygons) { - remove_close_points(polygon); +template +void split_self_intersecting_polygon(const CGAL::Polygon_2& poly, OutIt output_it) { + if (poly.is_simple()) { + *output_it++ = poly; + return; } - -#ifdef SVGFILL_DEBUG - std::ofstream obj("obj.obj"); - size_t vi = 1; - - std::ofstream svg("svg.svg"); - svg << "\n"; - - for (auto it = input_polygons.begin(); it != input_polygons.end(); ++it) { - write_polygon_to_obj(obj, vi, true, *it, "input_poly_" + std::to_string(std::distance(input_polygons.begin(), it))); - write_polygon_to_svg(svg, *it); + Arrangement_2 arr; + for (auto it = poly.edges_begin(); it != poly.edges_end(); ++it) { + CGAL::insert(arr, Segment_2(it->start(), it->end())); } + for (auto it = arr.faces_begin(); it != arr.faces_end(); ++it) { + if (it->is_unbounded()) { + for (auto jt = it->inner_ccbs_begin(); jt != it->inner_ccbs_end(); ++jt) { + auto inner = circ_to_poly(*jt); + // reverse because it's an inner bound to the infinite outer facet + inner.reverse_orientation(); + *output_it++ = inner; + } + } + } +} - obj << std::flush; -#endif - +std::set> +find_overlaps(const std::vector& polygons) { typedef CGAL::Box_intersection_d::Box_with_handle_d Box; + std::vector boxes; + std::vector>> input_triangulated; - std::vector boxes; - for (auto it = input_polygons.begin(); it != input_polygons.end(); ++it) { + for (auto it = polygons.begin(); it != polygons.end(); ++it) { constexpr double offset = 1.e-3; auto b = it->bbox(); boxes.emplace_back( CGAL::Bbox_2(b.xmin() - offset, b.ymin() - offset, b.xmax() + offset, b.ymax() + offset), - std::distance(input_polygons.begin(), it) - ); - - if (!it->is_simple()) { -#ifdef SVGFILL_DEBUG - write_polygon_to_obj(obj, vi, true, *it, "self-intersecting"); -#endif - throw std::runtime_error("Self-intersecting input"); - } + std::distance(polygons.begin(), it)); CGAL::Polygon_triangulation_decomposition_2 decompositor; std::vector temp; @@ -378,10 +332,8 @@ void arrange_cgal_polygons(const std::vector& input_polygons_, std::v bool registered_overlap = false; for (auto& t2 : input_triangulated[b.handle()]) { if (CGAL::squared_distance(t1, t2) < (1.e-3 * 1.e-3)) { - overlaps.insert({ - (a.handle() < b.handle()) ? a.handle() : b.handle(), - (a.handle() < b.handle()) ? b.handle() : a.handle() - }); + overlaps.insert({(a.handle() < b.handle()) ? a.handle() : b.handle(), + (a.handle() < b.handle()) ? b.handle() : a.handle()}); registered_overlap = true; break; } @@ -393,297 +345,384 @@ void arrange_cgal_polygons(const std::vector& input_polygons_, std::v } }); - if (true) { - // solve overlaps by means of subtraction - // loop over overlaps and subtract the smaller polygon from the larger one + return overlaps; +} + +class DebugWriter { + public: + DebugWriter() : enabled_(false) {} - std::set eliminated_polies; - std::map overlap_counts; - for (auto& p : overlaps) { - overlap_counts[p.first]++; - overlap_counts[p.second]++; + DebugWriter(bool enabled, const std::string& filename_prefix) + : enabled_(enabled) { + if (enabled_) { + obj.open(filename_prefix + ".obj"); + vi = 1; + svg.open(filename_prefix + ".svg"); + svg << "\n"; + } + } + ~DebugWriter() { + if (enabled_) { + svg << "\n"; + obj << std::flush; + obj.close(); + svg.close(); } + } - for (const auto& edge : overlaps) { - // Skip eliminated - if (eliminated_polies.find(edge.first) != eliminated_polies.end() || - eliminated_polies.find(edge.second) != eliminated_polies.end()) { - continue; - } + DebugWriter(const DebugWriter&) = delete; - // Many overlaps indicate an aggregated polygon, skip them - /* - if (overlap_counts[edge.first] > 10 || overlap_counts[edge.second] > 10) { - if (overlap_counts[edge.first] > 10) { - eliminated_polies.insert(edge.first); - } - if (overlap_counts[edge.second] > 10) { - eliminated_polies.insert(edge.second); - } - continue; - } - */ + DebugWriter(DebugWriter&& other) noexcept + : obj(std::move(other.obj)), vi(other.vi), svg(std::move(other.svg)), enabled_(other.enabled_), last_segment_name_(std::move(other.last_segment_name_)) + { + other.enabled_ = false; + other.vi = 1; + other.last_segment_name_.clear(); + } - // these are pointers now, because otherwise swap would not work? - auto* poly1 = &input_polygons[edge.first]; - auto* poly2 = &input_polygons[edge.second]; + DebugWriter& operator=(const DebugWriter&) = delete; + + DebugWriter& operator=(DebugWriter&& other) noexcept { + if (this == &other) { + return *this; + } - // Populate eliminated_polies with small polygons - // This can happen over time when modifications are made to the polygons to solve overlaps - bool skip = false; - if (poly1->area() < 1.e-2) { - eliminated_polies.insert(edge.first); - skip = true; - } - if (poly2->area() < 1.e-2) { - eliminated_polies.insert(edge.second); - skip = true; - } - // Small slivers are also just eliminated - if (!maybe_take_first_if_single_item(create_and_convert_offset_polygon(-1.e-1, *poly1))) { - eliminated_polies.insert(edge.first); - skip = true; - } - if (!maybe_take_first_if_single_item(create_and_convert_offset_polygon(-1.e-1, *poly2))) { - eliminated_polies.insert(edge.second); - skip = true; - } - if (skip) { - continue; - } - - // Skip polygons that have a very high intersection over union - // ratio, which indicates that they are very likely duplicates - if (CGAL::do_intersect(*poly1, *poly2)) { - std::vector result; - CGAL::intersection(*poly1, *poly2, std::back_inserter(result)); - typename K::FT intersection_area = 0; - for (auto& r : result) { - auto poly_area = r.outer_boundary().area(); - for (auto& h : r.holes()) { - poly_area -= h.area(); - } - intersection_area += poly_area; - } - CGAL::Polygon_with_holes_2 poly12; - CGAL::join(*poly1, *poly2, poly12); - typename K::FT union_area = poly12.outer_boundary().area(); - for (auto& h : poly12.holes()) { - union_area -= h.area(); - } - if (union_area > 0 && intersection_area / union_area > 0.99) { - // std::cerr << intersection_area / union_area << std::endl; - eliminated_polies.insert(edge.first); - continue; - } - } + if (enabled_) { + svg << "\n"; + obj << std::flush; + obj.close(); + svg.close(); + } - if (!(poly1->is_simple() && poly2->is_simple())) { - continue; - } + obj = std::move(other.obj); + svg = std::move(other.svg); + vi = other.vi; + enabled_ = other.enabled_; + last_segment_name_ = std::move(other.last_segment_name_); - { - std::vector result; - // std::cerr << poly1.area() << " " << poly2.area() << std::endl; - // std::cerr.flush(); + other.enabled_ = false; + other.vi = 1; + other.last_segment_name_.clear(); - boost::optional mp1, mp2, mp3, mp4; - bool swap = false; + return *this; + } - swap = poly1->area() <= poly2->area(); - if (swap) { - std::swap(poly1, poly2); - } + void write_polygon(const Polygon_2& polygon, const std::string& name) { + if (enabled_) { + write_polygon_to_obj_(obj, vi, true, polygon, name); + write_polygon_to_svg_(svg, polygon, name); + obj << std::flush; + } + } - bool success = false; - if ((mp1 = maybe_take_first_if_single_item(create_and_convert_offset_polygon(OVERLAP_RESOLUTION_DISTANCE, *poly2)))) { - if ((mp2 = subtract_retain_largest(*poly1, *mp1))) { - if ((mp3 = maybe_take_first_if_single_item(create_and_convert_offset_polygon(OVERLAP_RESOLUTION_DISTANCE * 2, *mp2)))) { - if ((mp4 = subtract_retain_largest(*poly2, *mp3))) { - *poly1 = *mp2; - *poly2 = *mp4; - success = true; - } - } - } - } + void write_segment(const Point_2& p, const Point_2& q, const std::string& name) { + if (enabled_) { + if (last_segment_name_ != name) { + last_segment_name_ = name; + obj << "o " << name << "\n"; + } + obj << "v " << CGAL::to_double(p.x()) << " " << CGAL::to_double(p.y()) << " 0\n"; + obj << "v " << CGAL::to_double(q.x()) << " " << CGAL::to_double(q.y()) << " 0\n"; + obj << "l " << vi++; + obj << " " << vi++ << "\n"; - /* - if (swap) { - // swap back to retain original ordering - // what's the point in swapping back here? - std::swap(poly1, poly2); - } - */ + svg << "\n"; - if (!success) { - eliminated_polies.insert(swap ? edge.first : edge.second); - continue; + obj << std::flush; + } + } + + void write_polygon(const Polygon_with_holes_2& polygon, const std::string& name) { + if (enabled_) { + write_polygon(polygon.outer_boundary(), name); + for (auto hit = polygon.holes_begin(); hit != polygon.holes_end(); ++hit) { + write_polygon(*hit, name); + } + } + } + + void write_polygons(const std::vector& polygons, const std::string& name) { + if (enabled_) { + size_t i = 0; + for (auto& polygon : polygons) { + write_polygon_to_obj_(obj, vi, true, polygon, name + "_" + std::to_string(i++)); + write_polygon_to_svg_(svg, polygon, name); + } + obj << std::flush; + } + } + + void write_polygons(const std::vector& polygons, const std::string& name) { + if (enabled_) { + size_t i = 0; + for (auto& polygon : polygons) { + write_polygon_to_obj_(obj, vi, true, polygon.outer_boundary(), name + "_" + std::to_string(i)); + write_polygon_to_svg_(svg, polygon.outer_boundary(), name); + for (auto hit = polygon.holes_begin(); hit != polygon.holes_end(); ++hit) { + write_polygon_to_obj_(obj, vi, true, *hit, name + "_" + std::to_string(i)); + write_polygon_to_svg_(svg, *hit, name); } } + obj << std::flush; + } + } + + private: + std::ofstream obj; + size_t vi; + std::ofstream svg; + bool enabled_; + std::string last_segment_name_; + + void write_polygon_to_svg_(std::ostream& ofs, const Polygon_2& polygon, const std::string& class_name = "") { + ofs << "x()) << "," << -CGAL::to_double(vit->y()) << " "; + } + ofs << "\"/>\n"; + } + + void write_polygon_to_obj_(std::ofstream& ofs, size_t& vertex_index, bool as_line, const Polygon_2& polygon, const std::string& name) { + ofs << "o " << name << "\n"; // Object name + + // Write vertices + for (auto vit = polygon.vertices_begin(); vit != polygon.vertices_end(); ++vit) { + ofs << "v " << CGAL::to_double(vit->x()) << " " << CGAL::to_double(vit->y()) << " 0\n"; } - // iterate over the eliminated polygons and remove them from the input polygons - for (auto it = eliminated_polies.rbegin(); it != eliminated_polies.rend(); ++it) { - input_polygons.erase(input_polygons.begin() + *it); + if (as_line) { + // Write line segments (edges) + for (size_t j = 0; j < polygon.size(); ++j) { + ofs << "l " << vertex_index + j << " " << vertex_index + (j + 1) % polygon.size() << "\n"; + } + } else { + ofs << "f"; + for (size_t j = 0; j < polygon.size(); ++j) { + ofs << " " << vertex_index + j; + } + ofs << "\n"; } + + vertex_index += polygon.size(); } +}; + +void eliminate_overlaps(DebugWriter& debug_writer, double OVERLAP_RESOLUTION_DISTANCE, std::vector& polygons) { + // solve overlaps by means of subtraction + // loop over overlaps and subtract the smaller polygon from the larger one + + std::set eliminated_polies; /* - if constexpr (false) { - // solve overlap by means of union into components - std::vector> adj(input_polygons.size()); - for (const auto& edge : overlaps) { - adj[edge.first].push_back(edge.second); - adj[edge.second].push_back(edge.first); - } - - std::vector visited(input_polygons.size(), false); - std::vector> connected_components; - - for (size_t v = 0; v < input_polygons.size(); ++v) { - if (!visited[v]) { - connected_components.emplace_back(); - - std::stack stack; - stack.push(v); - visited[v] = true; - - while (!stack.empty()) { - size_t u = stack.top(); - stack.pop(); - connected_components.back().push_back(u); - - for (size_t neighbor : adj[u]) { - if (!visited[neighbor]) { - visited[neighbor] = true; - stack.push(neighbor); - } - } - } + std::map overlap_counts; + for (auto& p : overlaps) { + overlap_counts[p.first]++; + overlap_counts[p.second]++; + } + */ + + auto overlaps = find_overlaps(polygons); + + for (const auto& edge : overlaps) { + // Skip eliminated + if (eliminated_polies.find(edge.first) != eliminated_polies.end() || + eliminated_polies.find(edge.second) != eliminated_polies.end()) { + continue; + } + + // Many overlaps indicate an aggregated polygon, skip them + /* + if (overlap_counts[edge.first] > 10 || overlap_counts[edge.second] > 10) { + if (overlap_counts[edge.first] > 10) { + eliminated_polies.insert(edge.first); + } + if (overlap_counts[edge.second] > 10) { + eliminated_polies.insert(edge.second); } + continue; } + */ - std::vector fused_polies; + // these are pointers now, because otherwise swap would not work? + auto* poly1 = &polygons[edge.first]; + auto* poly2 = &polygons[edge.second]; - for (auto& comp : connected_components) { - std::vector comp_polies; - if (comp.size() == 1) { - fused_polies.push_back(input_polygons[comp.front()]); - } else { - for (auto& c : comp) { - comp_polies.push_back(input_polygons[c]); + // @todo this is applied during overlap processing, maybe better after the boolean operation, + // because they can be come small or narrow when overlaps are resolved + + // Populate eliminated_polies with small polygons + // This can happen over time when modifications are made to the polygons to solve overlaps + bool skip = false; + if (poly1->area() < 1.e-2) { + eliminated_polies.insert(edge.first); + skip = true; + } + if (poly2->area() < 1.e-2) { + eliminated_polies.insert(edge.second); + skip = true; + } + // Small slivers are also just eliminated + if (!maybe_take_first_if_single_item(create_and_convert_offset_polygon(-1.e-1, *poly1))) { + eliminated_polies.insert(edge.first); + skip = true; + } + if (!maybe_take_first_if_single_item(create_and_convert_offset_polygon(-1.e-1, *poly2))) { + eliminated_polies.insert(edge.second); + skip = true; + } + if (skip) { + continue; + } + + // Skip polygons that have a very high intersection over union + // ratio, which indicates that they are very likely duplicates + if (CGAL::do_intersect(*poly1, *poly2)) { + std::vector result; + CGAL::intersection(*poly1, *poly2, std::back_inserter(result)); + typename K::FT intersection_area = 0; + for (auto& r : result) { + auto poly_area = r.outer_boundary().area(); + for (auto& h : r.holes()) { + poly_area -= h.area(); } - fused_polies.push_back(fuse_with_offset(comp_polies, 1.e-2)); + intersection_area += poly_area; + } + CGAL::Polygon_with_holes_2 poly12; + CGAL::join(*poly1, *poly2, poly12); + typename K::FT union_area = poly12.outer_boundary().area(); + for (auto& h : poly12.holes()) { + union_area -= h.area(); + } + if (union_area > 0 && intersection_area / union_area > 0.99) { + // std::cerr << intersection_area / union_area << std::endl; + eliminated_polies.insert(edge.first); + continue; } } -#ifdef SVGFILL_DEBUG - for (auto it = fused_polies.begin(); it != fused_polies.end(); ++it) { - write_polygon_to_obj(obj, vi, true, *it, "fused_poly_" + std::to_string(std::distance(fused_polies.begin(), it))); - write_polygon_to_svg(svg, *it); + if (!(poly1->is_simple() && poly2->is_simple())) { + continue; } -#endif - input_polygons = fused_polies; - } - */ + { + std::vector result; - { - // [NB Nov 6] we cannot do this anymore because it could revert the spacing between input polygons - // that touch in the corner. - // Now that overlaps/touches at corners are handled more locally only a small indent is produced - // which would be undone by means of an inset+offset. - // - // [NB Nov 10] this is actually still necessary though, but we apply a much smaller distance now - // to keep the overlap eliminations in tact - // - // Inset-offset to remove tiny details that may cause enourmous spikes in offsets - for (auto& r : input_polygons) { - auto ps = create_and_convert_offset_polygon(-polygon_offset_distance / 10000., r); - if (ps.size() == 1) { - auto r2 = ps.front(); - ps = create_and_convert_offset_polygon(+polygon_offset_distance / 10000., r2); - if (ps.size() == 1) { - r = ps.front(); + boost::optional mp1, mp2, mp3, mp4; + bool swap = false; + + swap = poly1->area() <= poly2->area(); + if (swap) { + std::swap(poly1, poly2); + } + + bool is_ = edge == std::make_pair(25, 27); + + bool success = false; + if ((mp1 = maybe_take_first_if_single_item(create_and_convert_offset_polygon(OVERLAP_RESOLUTION_DISTANCE, *poly2)))) { + if (is_) { + debug_writer.write_polygon(*mp1, "mp1"); } + smooth_polygon(OVERLAP_RESOLUTION_DISTANCE / 100., *mp1); + if (is_) { + debug_writer.write_polygon(*mp1, "mp1b"); + } + if ((mp2 = subtract_retain_largest(*poly1, *mp1))) { + if (is_) { + debug_writer.write_polygon(*mp2, "mp2"); + } + smooth_polygon(OVERLAP_RESOLUTION_DISTANCE / 100., *mp2); + if (is_) { + debug_writer.write_polygon(*mp2, "mp2b"); + } + if ((mp3 = maybe_take_first_if_single_item(create_and_convert_offset_polygon(OVERLAP_RESOLUTION_DISTANCE * 2, *mp2)))) { + if (is_) { + debug_writer.write_polygon(*mp3, "mp3"); + } + smooth_polygon(OVERLAP_RESOLUTION_DISTANCE / 100., *mp3); + if (is_) { + debug_writer.write_polygon(*mp3, "mp3b"); + } + if ((mp4 = subtract_retain_largest(*poly2, *mp3))) { + if (is_) { + debug_writer.write_polygon(*mp4, "mp4"); + } + *poly1 = *mp2; + *poly2 = *mp4; + success = true; + } + } + } + } + + if (!success) { + eliminated_polies.insert(swap ? edge.first : edge.second); + continue; } } } -#ifdef SVGFILL_DEBUG - for (auto it = input_polygons.begin(); it != input_polygons.end(); ++it) { - write_polygon_to_obj(obj, vi, true, *it, "processed_input_poly_" + std::to_string(std::distance(input_polygons.begin(), it))); - write_polygon_to_svg(svg, *it); + // iterate over the eliminated polygons and remove them from the input polygons + for (auto it = eliminated_polies.rbegin(); it != eliminated_polies.rend(); ++it) { + polygons.erase(polygons.begin() + *it); } -#endif +} - // Unfortunately CGAL does not seem to have a ready to use aabb primitive for segments in 2D, - // so we have to use 3D segments and aabb tree for 2D polygons. - std::list> all_segs; - std::unordered_map*, decltype(input_polygons.begin())> seg_to_poly; +class SegmentLookup { + public: + typedef std::vector::const_iterator PolygonIt; - for (auto it = input_polygons.begin(); it != input_polygons.end(); ++it) { - for (auto eit = it->edges_begin(); eit != it->edges_end(); ++eit) { - CGAL::Segment_3 seg3d( - CGAL::Point_3(eit->source().x(), eit->source().y(), 0), - CGAL::Point_3(eit->target().x(), eit->target().y(), 0) - ); - all_segs.push_back(seg3d); - seg_to_poly[&all_segs.back()] = it; + SegmentLookup(const std::vector& polygons) + : polygons_ref_(polygons) + { + // Unfortunately CGAL does not seem to have a ready to use aabb primitive for segments in 2D, + // so we have to use 3D segments and aabb tree for 2D polygons. + for (auto it = polygons.begin(); it != polygons.end(); ++it) { + for (auto eit = it->edges_begin(); eit != it->edges_end(); ++eit) { + CGAL::Segment_3 seg3d( + CGAL::Point_3(eit->source().x(), eit->source().y(), 0), + CGAL::Point_3(eit->target().x(), eit->target().y(), 0)); + all_segs.push_back(seg3d); + seg_to_poly[&all_segs.back()] = it; + } } + tree_ = Tree(all_segs.begin(), all_segs.end()); + tree_.accelerate_distance_queries(); } - using TreeTraits = CGAL::AABB_traits>::iterator>>; - using Tree = CGAL::AABB_tree; - - Tree tree(all_segs.begin(), all_segs.end()); - tree.accelerate_distance_queries(); + // This part is the most computationally expensive. Caching effectively halves the lookup time here, since every vertex on the subdivided corridor mesh has on average two outgoing edges. + PolygonIt input_polygon_boundary(const Point_2& p, double tol = 1e-5) { + auto it = input_polygon_boundary_cache_.find(p); + if (it != input_polygon_boundary_cache_.end()) { + return it->second; + } - auto input_polygon_boundary = - [&](const Point_2& p, double tol = 1e-5) -> decltype(input_polygons.begin()) - { // Find closest point & corresponding segment - auto closest = tree.closest_point_and_primitive(CGAL::Point_3(p.x(), p.y(), 0)); + auto closest = tree_.closest_point_and_primitive(CGAL::Point_3(p.x(), p.y(), 0)); const auto& closest_pt = closest.first; auto seg_ptr = &*closest.second; double d = CGAL::to_double(CGAL::squared_distance(p, Point_2(closest_pt.x(), closest_pt.y()))); + + PolygonIt res; if (d < (tol * tol)) { - return seg_to_poly.find(seg_ptr)->second; + res = seg_to_poly.find(seg_ptr)->second; + } else { + res = polygons_ref_.end(); } - return input_polygons.end(); - }; - /* - auto input_polygon_boundary = [&input_polygons](const CGAL::Point_2& p, double tol = 1.e-5) { - // unfortunately some imprecision slept into the code so we can't - // so we can't just use has_on_boundary() anymore - double D = std::numeric_limits::infinity(); - for (auto it = input_polygons.begin(); it != input_polygons.end(); ++it) { - for (auto jt = it->edges_begin(); jt != it->edges_end(); ++jt) { - const auto& seg = *jt; - auto d = std::sqrt(CGAL::to_double(CGAL::squared_distance(seg, p))); - if (d < D) { - D = d; - } - if (d < tol) { - return it; - } - } - } - return input_polygons.end(); + input_polygon_boundary_cache_[p] = res; + return res; }; - */ - auto close_input_point = [&input_polygons](const CGAL::Point_2& P) { + std::pair> close_input_point(const CGAL::Point_2& P) const { + // @todo use tree CGAL::Point_2 closest; double closest_distance = std::numeric_limits::infinity(); - auto input_it = input_polygons.end(); + auto input_it = polygons_ref_.end(); // unfortunately some imprecision slept into the code so we can't // so we can't just use has_on_boundary() anymore - for (auto it = input_polygons.begin(); it != input_polygons.end(); ++it) { + for (auto it = polygons_ref_.begin(); it != polygons_ref_.end(); ++it) { for (auto& p : *it) { auto d = std::sqrt(CGAL::to_double(CGAL::squared_distance(P, p))); if (d < closest_distance) { @@ -697,14 +736,16 @@ void arrange_cgal_polygons(const std::vector& input_polygons_, std::v return std::make_pair(input_it, closest); }; - auto project_input_point = [&input_polygons](const CGAL::Point_2& P) { + std::pair> project_input_point(const CGAL::Point_2& P) const { + // @todo use tree + CGAL::Point_2 closest; typename K::FT closest_sq_distance = std::numeric_limits::infinity(); - auto input_it = input_polygons.end(); + auto input_it = polygons_ref_.end(); // unfortunately some imprecision slept into the code so we can't // so we can't just use has_on_boundary() anymore - for (auto it = input_polygons.begin(); it != input_polygons.end(); ++it) { + for (auto it = polygons_ref_.begin(); it != polygons_ref_.end(); ++it) { for (auto jt = it->edges_begin(); jt != it->edges_end(); ++jt) { auto Pp = jt->supporting_line().projection(P); auto d = CGAL::squared_distance(Pp, P); @@ -719,224 +760,101 @@ void arrange_cgal_polygons(const std::vector& input_polygons_, std::v return std::make_pair(input_it, closest); }; - // Find the outer perimeter using offset - union - negative offset - std::vector offset_polygons; - for (auto& r : input_polygons) { - auto R = r; - if (!R.is_counterclockwise_oriented()) { - R.reverse_orientation(); - } - - // Overlap removal can also result in close points causing problems when converted into non-exact nt - remove_close_points(R); + std::vector> n_closest_input_segments(const Segment_2& e, size_t n = 2) const { + auto mid = CGAL::ORIGIN + ((e.source() - CGAL::ORIGIN) + (e.target() - CGAL::ORIGIN)) / 2; - auto ps = create_and_convert_offset_polygon(polygon_offset_distance, R); - for (auto& p : ps) { - if (!p.is_simple()) { - /*{ - std::cerr << "input ["; - bool first = true; - for (auto& pp : r) { - if (!first) { - std::cerr << ","; - } - first = false; - std::cerr << "(" << pp.x() << "," << pp.y() << ")"; - } - std::cerr << "]" << std::endl; - } + std::vector>::iterator> cands; + cands.reserve(64); - { - std::cerr << "["; - bool first = true; - for (auto& pp : p) { - if (!first) { - std::cerr << ","; - } - first = false; - std::cerr << "(" << pp.x() << "," << pp.y() << ")"; - } - std::cerr << "]" << std::endl; - }*/ + auto mid3 = CGAL::Point_3(mid.x(), mid.y(), 0); - throw std::runtime_error("Complex polygon originated from offset"); + for (int i = -1; i <= 3; ++i) { + cands.clear(); + double r = std::pow(10.0, i); + auto midbb = mid3.bbox(); + CGAL::Bbox_3 box(midbb.xmin() - r, midbb.ymin() - r, -1.0, midbb.xmax() + r, midbb.ymax() + r, +1.0); + tree_.all_intersected_primitives(box, std::back_inserter(cands)); + if (cands.size() >= n) { + break; } } - offset_polygons.insert(offset_polygons.end(), ps.begin(), ps.end()); - } -#ifdef SVGFILL_DEBUG - for (auto it = offset_polygons.begin(); it != offset_polygons.end(); ++it) { - write_polygon_to_obj(obj, vi, true, *it, "offset_poly_" + std::to_string(std::distance(offset_polygons.begin(), it))); - write_polygon_to_svg(svg, *it); - } -#endif + if (cands.empty()) { + return {}; + } - // Perform Boolean union on the offset polygons - std::vector unioned_polygons; - CGAL::join(offset_polygons.begin(), offset_polygons.end(), std::back_inserter(unioned_polygons)); + std::vector>> scored; + scored.reserve(cands.size()); + for (auto it : cands) { + const auto& s3 = *it; + Segment_2 s2(Point_2(s3.source().x(), s3.source().y()), Point_2(s3.target().x(), s3.target().y())); + scored.emplace_back(CGAL::squared_distance(mid, s2), s2); + } - if (unioned_polygons.size() > 1) { - // @todo this is currently one of the major limitations in the code that still can be eliminated - // by grouping the input polygons by their perimiter polygon in unioned_polygons - std::sort(unioned_polygons.begin(), unioned_polygons.end(), [](auto& p, auto& q) { return p.outer_boundary().area() > q.outer_boundary().area(); }); - } + std::sort(scored.begin(), scored.end(), [](auto& a, auto& b) { return a.first < b.first; }); + if (scored.size() > n) { + scored.resize(n); + } -#ifdef SVGFILL_DEBUG - write_polygon_to_obj(obj, vi, true, unioned_polygons.front().outer_boundary(), "offset_poly_joined"); - write_polygon_to_svg(svg, unioned_polygons.front().outer_boundary()); + std::vector> out; + out.reserve(scored.size()); + for (auto& p : scored) { + out.push_back(p.second); + } + return out; + } -#endif +private: + using TreeTraits = CGAL::AABB_traits>::iterator>>; + using Tree = CGAL::AABB_tree; - Polygon_2 fused_removed_close_points; - { - std::vector> ps; - auto& p = unioned_polygons.front().outer_boundary(); - ps.reserve(p.size()); - auto I = p.begin(); - auto J = I + 1; - for (;; ++J) { - bool last = false; - if (J == p.end()) { - J = p.begin(); - last = true; - } - // if (CGAL::squared_distance(*I, *J) > (polygon_offset_distance * polygon_offset_distance)) { - if (CGAL::squared_distance(*I, *J) > (1.e-4 * 1.e-4)) { - ps.push_back(*J); - I = J; - } - if (last) { - break; - } + const std::vector& polygons_ref_; + std::list> all_segs; + std::unordered_map*, PolygonIt> seg_to_poly; + Tree tree_; + + std::map::const_iterator> input_polygon_boundary_cache_; +}; + +Polygon_2 subdivide_polygon(double max_distance, const Polygon_2 & p) { + std::vector points; + for (auto it = p.edges_begin(); it != p.edges_end(); ++it) { + const auto& seg = *it; + auto num_splits = (int)std::ceil(std::sqrt(CGAL::to_double(seg.squared_length())) / max_distance) - 1; + points.push_back(seg.source()); + for (auto i = 0; i < num_splits; ++i) { + auto d = (seg.target() - seg.source()) / (num_splits + 1) * (i + 1); + points.push_back(seg.source() + d); } - fused_removed_close_points = Polygon_2(ps.begin(), ps.end()); } + return Polygon_2(points.begin(), points.end()); +}; + +Polygon_with_holes_2 subdivide_polygon(double max_distance, const Polygon_with_holes_2& pwh) { + Polygon_2 outer = subdivide_polygon(max_distance, pwh.outer_boundary()); + std::vector holes; + for (auto hit = pwh.holes_begin(); hit != pwh.holes_end(); ++hit) { + holes.push_back(subdivide_polygon(max_distance, *hit)); + } + return Polygon_with_holes_2(outer, holes.begin(), holes.end()); +}; + +std::tuple< + std::map>, + std::map>, + std::map, std::vector*>>, + std::map +> +build_line_graph(const std::vector& input_polygons, SegmentLookup& segment_lookup, const std::vector& triangular_polygons) +{ - // Apply negative offset to get the outer perimeter polygon - auto inner_offset = create_and_convert_offset_polygon( - // Because polygon_offset is inexact, make sure our inset distance is slightly larger - // std::nexttoward(-polygon_offset_distance, -std::numeric_limits::infinity()), - - // 1.e-8 even was too little and still resulted in slivers of triangle around the perimeter - -polygon_offset_distance - OUTER_PERIMITER_ADDITIONAL_INSET_AMOUNT, - fused_removed_close_points); - -#ifdef SVGFILL_DEBUG - write_polygon_to_obj(obj, vi, true, inner_offset.front(), "joined_inset"); - write_polygon_to_svg(svg, inner_offset.front()); -#endif - - /* - // there is non-insignificant chance that around the outer boundary, vertices are located in - // between of the input polyhedra, but intermediate vertices result in triangles that will no longer - // span between the two spaces with two edges and therefore cause the topological centre line - // to no run up to the center. Eliminate all vertices that are not on the polyhedral boundary of polygon. - - // this theory proved to be false. once we have topological end points in our graph that are - // connected to input polyhedra to form closed cells, we move those topological end points to - // the average of the input polyhedra corner points, thus effectively also moving them outwards. - { - for (auto& i : inner_offset) { - std::vector> ps; - for (auto& p : i) { - if (input_polygon_boundary(p, 1.e-3) != input_polygons.end()) { - ps.push_back(p); - } - } - i = Polygon_2(ps.begin(), ps.end()); - } - } - -#ifdef SVGFILL_DEBUG - write_polygon_to_obj(obj, vi, true, inner_offset.front(), "joined_inset_cleaned"); - write_polygon_to_svg(svg, inner_offset.front()); -#endif - */ - - // Subtract original polygons from outer perimeter - std::vector difference_result, difference_result_subdivided; - for (auto& i : inner_offset) { - std::vector working_copy; - working_copy.emplace_back(i); - - for (auto& r : input_polygons) { - std::vector temp_working_copy; - for (auto& wc : working_copy) { - CGAL::difference(wc, r, std::back_inserter(temp_working_copy)); - } - working_copy = temp_working_copy; - } - difference_result.insert(difference_result.end(), working_copy.begin(), working_copy.end()); - } - - // subdivide difference_result to have better behave triangulation - - { - const double max_distance = polygon_offset_distance / 8.; - auto subdivide_polygon = [max_distance](const Polygon_2& p) { - std::vector points; - for (auto it = p.edges_begin(); it != p.edges_end(); ++it) { - const auto& seg = *it; - auto num_splits = (int)std::ceil(std::sqrt(CGAL::to_double(seg.squared_length())) / max_distance) - 1; - points.push_back(seg.source()); - for (auto i = 0; i < num_splits; ++i) { - auto d = (seg.target() - seg.source()) / (num_splits + 1) * (i + 1); - points.push_back(seg.source() + d); - } - } - return Polygon_2(points.begin(), points.end()); - }; - - for (auto& pwh : difference_result) { - // Subdivide outer boundary - Polygon_2 outer = subdivide_polygon(pwh.outer_boundary()); - // Subdivide holes - std::vector holes; - for (auto hit = pwh.holes_begin(); hit != pwh.holes_end(); ++hit) { - holes.push_back(subdivide_polygon(*hit)); - } - // Construct new Polygon_with_holes_2 - difference_result_subdivided.push_back(Polygon_with_holes_2(outer, holes.begin(), holes.end())); - } - } - -#ifdef SVGFILL_DEBUG - for (auto it = difference_result_subdivided.begin(); it != difference_result_subdivided.end(); ++it) { - auto i = std::distance(difference_result_subdivided.begin(), it); - write_polygon_to_obj(obj, vi, true, it->outer_boundary(), "difference_result_subdivided_" + std::to_string(i)); - write_polygon_to_svg(svg, it->outer_boundary()); - for (auto& p : it->holes()) { - write_polygon_to_obj(obj, vi, true, p, "difference_result_subdivided_" + std::to_string(i)); - write_polygon_to_svg(svg, p); - } - } -#endif - - std::list> triangular_polygons; - - for (auto& pwh : difference_result_subdivided) { - CGAL::Polygon_triangulation_decomposition_2 decompositor; - decompositor(pwh, std::back_inserter(triangular_polygons)); - } - - triangular_polygons.erase(std::remove_if(triangular_polygons.begin(), triangular_polygons.end(), [](const CGAL::Polygon_2& p) { - return CGAL::to_double(p.area()) < 1.e-8; - }), triangular_polygons.end()); - -#ifdef SVGFILL_DEBUG - for (auto it = triangular_polygons.begin(); it != triangular_polygons.end(); ++it) { - write_polygon_to_obj(obj, vi, false, *it, "tri_" + std::to_string(std::distance(triangular_polygons.begin(), it))); - write_polygon_to_svg(svg, *it); - } -#endif - - // Build maps of triangle -> edge and edge -> triangle in order to do traversal on the 'corridor mesh' - std::map, std::vector*>> segment_to_facet; - std::map, std::vector*>> segment_to_input_facet; - std::map, Point_2> segment_to_midpoint; - std::map> midpoint_to_segment; - std::map*, std::vector>> facet_to_segment; + // Build maps of triangle -> edge and edge -> triangle in order to do traversal on the 'corridor mesh' + std::map, std::vector*>> segment_to_facet; + std::map, std::vector*>> segment_to_input_facet; + std::map, Point_2> segment_to_midpoint; + std::map> midpoint_to_segment; + std::map*, std::vector>> facet_to_segment; + std::map midpoint_to_edge_length; for (auto& tri : triangular_polygons) { for (size_t i = 0; i < 3; ++i) { @@ -950,26 +868,14 @@ void arrange_cgal_polygons(const std::vector& input_polygons_, std::v } } - // This part is the most computationally expensive. Caching effectively halves the lookup time here, since every vertex has two outgoing edges. - std::map input_polygon_boundary_cache; - auto cached_input_polygon_boundary = [&](const Point_2& p, double tol = 1e-5) -> decltype(input_polygons.begin()) - { - auto it = input_polygon_boundary_cache.find(p); - if (it == input_polygon_boundary_cache.end()) { - auto index = input_polygon_boundary(p, tol); - input_polygon_boundary_cache[p] = index; - return index; - } else { - return it->second; - } - }; + // @todo The smarter thing to do probably after creating the corridor mesh, register segments wrt to originating input polygon(s) and maintain that mapping when subdividing // Register midpoints on the edges within the 'corridor mesh' that span multiple input polygons for (auto& p : segment_to_facet) { auto center = CGAL::ORIGIN + (((p.first.first - CGAL::ORIGIN) + (p.first.second - CGAL::ORIGIN)) / 2); - auto p1index = cached_input_polygon_boundary(p.first.first); - auto p2index = cached_input_polygon_boundary(p.first.second); + auto p1index = segment_lookup.input_polygon_boundary(p.first.first); + auto p2index = segment_lookup.input_polygon_boundary(p.first.second); segment_to_input_facet[p.first].push_back(&*p1index); segment_to_input_facet[p.first].push_back(&*p2index); @@ -977,18 +883,10 @@ void arrange_cgal_polygons(const std::vector& input_polygons_, std::v if (p1index != input_polygons.end() && p2index != input_polygons.end() && p1index != p2index) { segment_to_midpoint[p.first] = center; midpoint_to_segment[center] = p.first; - } - - if (p1index != input_polygons.end() && p2index != input_polygons.end() && p1index != p2index) { - segment_to_midpoint[p.first] = center; - midpoint_to_segment[center] = p.first; + midpoint_to_edge_length[center] = std::sqrt(CGAL::to_double(CGAL::squared_distance(p.first.first, p.first.second))); } } -#ifdef SVGFILL_DEBUG - obj << "o network_1\n"; -#endif - // Observe corridor mesh topology to join edge midpoints into a network std::map> line_graph; for (auto& p : segment_to_midpoint) { @@ -1000,349 +898,1065 @@ void arrange_cgal_polygons(const std::vector& input_polygons_, std::v decltype(segment_to_midpoint)::const_iterator it; if ((it = segment_to_midpoint.find(r)) != segment_to_midpoint.end()) { line_graph[p.second].push_back(it->second); - -#ifdef SVGFILL_DEBUG - obj << "v " << CGAL::to_double(p.second.x()) << " " << CGAL::to_double(p.second.y()) << " 0\n"; - obj << "v " << CGAL::to_double(it->second.x()) << " " << CGAL::to_double(it->second.y()) << " 0\n"; - obj << "l " << vi++; - obj << " " << vi++ << "\n"; - - svg << "second.x()) << "\" y2=\"" << CGAL::to_double(it->second.y()) << "\" />"; -#endif } } } } - // Find triangles in this network often occuring at junctions in the corridor mesh - std::set> triangles; - std::function&)> find_triangles_recursive; - find_triangles_recursive = [&](std::vector& path) -> void { - // If depth reaches 3, check for a triangle - if (path.size() == 3) { - // Check if we can complete the triangle by going from the current point back to the start - const std::vector& neighbors_current = line_graph.at(path.back()); - if (std::find(neighbors_current.begin(), neighbors_current.end(), path.front()) != neighbors_current.end()) { - // We found a triangle, add it to the set - Triangle triangle = { path[0], path[1], path[2] }; - std::sort(triangle.begin(), triangle.end()); - triangles.insert(triangle); - } - return; - } + return {line_graph, midpoint_to_segment, segment_to_input_facet, midpoint_to_edge_length}; +} - // Otherwise, continue exploring neighbors - const std::vector& neighbors = line_graph.at(path.back()); - for (const Point_2& neighbor : neighbors) { - if (std::find(path.begin(), path.end(), neighbor) == path.end()) { - path.push_back(neighbor); - find_triangles_recursive(path); - path.pop_back(); // Backtrack - } +using DPoint = CGAL::Simple_cartesian::Point_2; +using DDir = CGAL::Simple_cartesian::Vector_2; +using DBox = std::array; + +struct CenterLineGraphData { + std::vector points; + std::vector points_double; + std::vector widths; + std::vector> edges; + std::vector> incident_edges; +}; + +struct LineRun { + Point_2 start_exact; + Point_2 end_exact; + DPoint start; + DPoint end; + DDir direction; + double avg_width; + double length; + size_t vertex_count; +}; + +struct RunBoxRecord { + size_t run_index; + DPoint start; + DPoint end; + DDir direction; + double width; + double length; + std::array corners; + DBox bbox; +}; + +struct MergedBoxRecord { + DPoint start; + DPoint end; + DDir direction; + DDir normal; + double avg_width; + double length; + size_t member_count; + std::vector members; + std::array corners; + DBox bbox; + Point_2 exact_start; + Point_2 exact_end; +}; + +struct BoxCluster { + std::vector members; + MergedBoxRecord box; +}; + +struct SnapCandidate { + size_t box_index; + double box_distance; + double line_distance; + Point_2 projection; +}; + +DDir unit(const DDir& a) { + auto n = std::sqrt(a.squared_length()); + if (n < 1.e-9) { + return {0., 0.}; + } + return a / n; +} + +DDir perpendicular(const DDir& a) { + return DDir(-a.y(), a.x()); +} + +DDir canonicalize_like(const DDir& a, const DDir& ref) { + return (a * ref) < 0. ? -a : a; +} + +DPoint to_double_point(const Point_2& p) { + return {CGAL::to_double(p.x()), CGAL::to_double(p.y())}; +} + +Point_2 to_exact_point(const DPoint& p) { + return Point_2(p.x(), p.y()); +} + +double point_line_distance(const DPoint& p, const DPoint& line_point, const DDir& line_dir) { + auto u = unit(line_dir); + auto delta = (p - line_point); + if (u.squared_length() < 1.e-18) { + return std::sqrt(delta.squared_length()); + } + return std::abs(CGAL::determinant(u.x(), u.y(), delta.x(), delta.y())); +} + +double angle_between_dirs_deg(const DDir& a, const DDir& b) { + auto u = unit(a); + auto v = unit(b); + auto c = std::abs(u * v); + if (c > 1.) { + c = 1.; + } + return std::acos(c) * 180. / 3.14159265358979323846; +} + +std::array rectangle_corners(const DPoint& start, const DPoint& end, double width) { + auto u = unit(end - start); + if (u.squared_length() < 1.e-18) { + u = {1., 0.}; + } + auto n = perpendicular(u); + auto ext = width; + auto p0 = start - u * ext; + auto p1 = end + u * ext; + auto w = n * (width / 2.); + return {p0 + w, p1 + w, p1 - w, p0 - w}; +} + +DBox aabb_from_points(const std::array& corners) { + DBox bbox{corners[0], corners[0]}; + for (auto& p : corners) { + bbox[0] = {std::min(bbox[0].x(), p.x()), std::min(bbox[0].y(), p.y())}; + bbox[1] = {std::max(bbox[1].x(), p.x()), std::max(bbox[1].y(), p.y())}; + } + return bbox; +} + +bool aabb_overlap(const DBox& a, const DBox& b, double eps = 1.e-9) { + return a[0].x() <= b[1].x() + eps && + a[1].x() + eps >= b[0].x() && + a[0].y() <= b[1].y() + eps && + a[1].y() + eps >= b[0].y(); +} + +CenterLineGraphData make_center_line_graph_data( + const std::map>& line_graph, + const std::map& midpoint_to_edge_length) +{ + CenterLineGraphData graph; + std::map point_to_index; + + auto ensure_point = [&](const Point_2& p) { + auto it = point_to_index.find(p); + if (it != point_to_index.end()) { + return it->second; } + auto i = graph.points.size(); + point_to_index[p] = i; + graph.points.push_back(p); + graph.points_double.push_back(to_double_point(p)); + auto wt = midpoint_to_edge_length.find(p); + graph.widths.push_back(wt == midpoint_to_edge_length.end() ? 0. : wt->second); + graph.incident_edges.emplace_back(); + return i; }; for (auto& p : line_graph) { - std::vector ps = { p.first }; - find_triangles_recursive(ps); + ensure_point(p.first); + for (auto& q : p.second) { + ensure_point(q); + } } - // For every triangle found in the network we eliminate one edge to break the cycle - // The edge we eliminate is the edge with the greatest angle with any of it's neighbours - - // non exact time, we need sqrt - using SK = CGAL::Simple_cartesian; - CGAL::Cartesian_converter C{}; + std::set> seen_edges; + for (auto& p : line_graph) { + auto i = ensure_point(p.first); + for (auto& q : p.second) { + auto j = ensure_point(q); + if (i == j) { + continue; + } + auto e = i < j ? std::make_pair(i, j) : std::make_pair(j, i); + if (seen_edges.insert(e).second) { + auto k = graph.edges.size(); + graph.edges.push_back(e); + graph.incident_edges[e.first].push_back(k); + graph.incident_edges[e.second].push_back(k); + } + } + } -#ifdef SVGFILL_DEBUG - obj << "o eliminated\n"; -#endif + return graph; +} - std::set> eliminated_segments; +double segment_width(const CenterLineGraphData& graph, const std::pair& edge) { + return 0.5 * (graph.widths[edge.first] + graph.widths[edge.second]); +} - for (auto& t : triangles) { - Triangle st; - std::transform(t.begin(), t.end(), st.begin(), C); +bool edge_supports_same_line( + const DPoint& seed_a, + const DPoint& seed_b, + const DPoint& test_a, + const DPoint& test_b, + double angle_tol_deg = 3., + double line_dist_tol = 0.15) +{ + auto d_seed = seed_b - seed_a; + auto d_test = test_b - test_a; + if (d_seed.squared_length() < 1.e-18 || d_test.squared_length() < 1.e-18) { + return false; + } + if (angle_between_dirs_deg(d_seed, d_test) > angle_tol_deg) { + return false; + } + return + point_line_distance(test_a, seed_a, d_seed) <= line_dist_tol && + point_line_distance(test_b, seed_a, d_seed) <= line_dist_tol; +} - double global_min_abs_dot = std::numeric_limits::infinity(); - size_t global_min_abs_dot_index; +std::vector runs_from_graph(const CenterLineGraphData& graph, double angle_tol_deg = 3., double line_dist_tol = 0.15) { + std::vector visited(graph.edges.size(), false); + std::vector runs; - for (size_t i = 0; i < 3; ++i) { - auto j = (i + 2) % 3; - auto e0 = st[i] - st[j]; - e0 /= std::sqrt(e0.squared_length()); + for (size_t seed_ei = 0; seed_ei < graph.edges.size(); ++seed_ei) { + if (visited[seed_ei]) { + continue; + } - double max_abs_dot = 0.; + const auto& seed_edge = graph.edges[seed_ei]; + auto seed_a = graph.points_double[seed_edge.first]; + auto seed_b = graph.points_double[seed_edge.second]; + auto seed_dir = seed_b - seed_a; + if (seed_dir.squared_length() < 1.e-18) { + visited[seed_ei] = true; + continue; + } - { - auto& ni = line_graph[t[i]]; - for (auto& n : ni) { - if (std::find(t.begin(), t.end(), n) == t.end()) { - // not contained in triangle - auto sn = C(n); - auto en = sn - st[i]; - en /= std::sqrt(en.squared_length()); - auto dot = std::abs(en * e0); + std::vector queue = {seed_ei}; + std::set component_edges; - if (dot > max_abs_dot) { - max_abs_dot = dot; - } - } - } + while (!queue.empty()) { + auto ei = queue.back(); + queue.pop_back(); + if (!component_edges.insert(ei).second) { + continue; } - { - auto& nj = line_graph[t[j]]; - for (auto& n : nj) { - if (std::find(t.begin(), t.end(), n) == t.end()) { - // not contained in triangle - auto sn = C(n); - auto en = sn - st[j]; - en /= std::sqrt(en.squared_length()); - auto dot = std::abs(en * e0); - - if (dot > max_abs_dot) { - max_abs_dot = dot; - } + const auto& edge = graph.edges[ei]; + std::array vertices = {edge.first, edge.second}; + for (auto v : vertices) { + for (auto ej : graph.incident_edges[v]) { + if (ej == ei || visited[ej] || component_edges.count(ej)) { + continue; + } + const auto& candidate = graph.edges[ej]; + auto test_a = graph.points_double[candidate.first]; + auto test_b = graph.points_double[candidate.second]; + if (edge_supports_same_line(seed_a, seed_b, test_a, test_b, angle_tol_deg, line_dist_tol)) { + queue.push_back(ej); } } - } + } - if (max_abs_dot < global_min_abs_dot) { - global_min_abs_dot = max_abs_dot; - global_min_abs_dot_index = i; - } + for (auto ei : component_edges) { + visited[ei] = true; } - { - auto i = global_min_abs_dot_index; - auto j = (i + 2) % 3; + std::set component_vertices; + auto ref = unit(seed_dir); + DDir direction_sum{0., 0.}; + double total_length = 0.; + double weighted_width_sum = 0.; - eliminated_segments.insert({ t[i], t[j] }); - eliminated_segments.insert({ t[j], t[i] }); + for (auto ei : component_edges) { + const auto& edge = graph.edges[ei]; + component_vertices.insert(edge.first); + component_vertices.insert(edge.second); -#ifdef SVGFILL_DEBUG - obj << "v " << st[j].x() << " " << st[j].y() << " 0\n"; - obj << "v " << st[i].x() << " " << st[i].y() << " 0\n"; - obj << "l " << vi++; - obj << " " << vi++ << "\n"; + auto d = graph.points_double[edge.second] - graph.points_double[edge.first]; + auto u = canonicalize_like(unit(d), ref); + direction_sum = direction_sum + u; - svg << ""; -#endif + auto len = std::sqrt(d.squared_length()); + total_length += len; + weighted_width_sum += len * segment_width(graph, edge); + } + + auto run_direction = direction_sum.squared_length() < 1.e-18 ? ref : unit(direction_sum); + + double min_t = std::numeric_limits::infinity(); + double max_t = -std::numeric_limits::infinity(); + size_t start_index = *component_vertices.begin(); + size_t end_index = start_index; + for (auto vi : component_vertices) { + auto t = (graph.points_double[vi] - CGAL::ORIGIN) * run_direction; + if (t < min_t) { + min_t = t; + start_index = vi; + } + if (t > max_t) { + max_t = t; + end_index = vi; + } } + auto avg_width = total_length < 1.e-9 ? segment_width(graph, seed_edge) : weighted_width_sum / total_length; + + runs.push_back({ + graph.points[start_index], + graph.points[end_index], + graph.points_double[start_index], + graph.points_double[end_index], + run_direction, + avg_width, + std::sqrt((graph.points_double[end_index] - graph.points_double[start_index]).squared_length()), + component_vertices.size() + }); } - Graph2D G2(line_graph); - for (auto& e : eliminated_segments) { - G2.remove_edge(e.first, e.second); + return runs; +} + +std::vector build_run_box_records(const std::vector& runs) { + std::vector records; + records.reserve(runs.size()); + for (size_t i = 0; i < runs.size(); ++i) { + auto corners = rectangle_corners(runs[i].start, runs[i].end, runs[i].avg_width); + records.push_back({ + i, + runs[i].start, + runs[i].end, + unit(runs[i].end - runs[i].start), + runs[i].avg_width, + runs[i].length, + corners, + aabb_from_points(corners) + }); } + return records; +} + +template +std::pair projected_interval_on_axis(const T& box, const DDir& axis_u) { + auto u = unit(axis_u); + auto ta = (box.start - CGAL::ORIGIN) * u; + auto tb = (box.end - CGAL::ORIGIN) * u; + return {std::min(ta, tb), std::max(ta, tb)}; +} - auto G = G2.weld_vertices(); +double interval_overlap_length(const std::pair& a, const std::pair& b) { + return std::max(0., std::min(a.second, b.second) - std::max(a.first, b.first)); +} -#ifdef SVGFILL_DEBUG - obj << "o network_2\n"; - for (auto it = G.edges_begin(); it != G.edges_end(); ++it) { - obj << "v " << CGAL::to_double(it->first.x()) << " " << CGAL::to_double(it->first.y()) << " 0\n"; - obj << "v " << CGAL::to_double(it->second.x()) << " " << CGAL::to_double(it->second.y()) << " 0\n"; - obj << "l " << vi++; - obj << " " << vi++ << "\n"; +template +double boxes_overlap_along_merge_axis(const T& a, const T& b) { + auto d1 = unit(a.end - a.start); + auto d2 = unit(b.end - b.start); + if (d1 * d2 < 0.) { + d2 = {-d2.x(), -d2.y()}; + } + auto merge_axis = unit(d1 + d2); + if (merge_axis.squared_length() < 1.e-18) { + merge_axis = d1; } - obj << std::flush; -#endif - auto is_parallel_2degree_node = [](decltype(G)::vertex_const_iterator vit) { - auto it = vit->second.begin(); - auto& P = *it++; - auto& Q = *it++; - auto e1 = P - vit->first; - auto e2 = vit->first - Q; - if (e1.squared_length() == 0 || e2.squared_length() == 0) { - // @todo why does this happen? - return false; - } - e1 /= std::sqrt(CGAL::to_double(e1.squared_length())); - e2 /= std::sqrt(CGAL::to_double(e2.squared_length())); - return std::abs(CGAL::to_double(e1 * e2)) > (1. - 1.e-5); - }; + auto i1 = projected_interval_on_axis(a, merge_axis); + auto i2 = projected_interval_on_axis(b, merge_axis); + auto overlap = interval_overlap_length(i1, i2); + auto small_length = std::min(i1.second - i1.first, i2.second - i2.first); + if (small_length < 1.e-9) { + return false; + } + return overlap / small_length; +} - { - // Remove colinear vertices - size_t n_vertices_removed = 0; - for (auto vit = G.vertices_begin(); vit != G.vertices_end();) { - if (vit->second.size() == 2) { - if (is_parallel_2degree_node(vit)) { - vit = G.eliminate_vertex(vit); - ++n_vertices_removed; - } else { - ++vit; - } - } else { - ++vit; - } - } - // std::cout << "Eliminated " << n_vertices_removed << " vertices" << std::endl; +MergedBoxRecord merge_cluster_to_box(const std::vector& member_indices, const std::vector& records) { + auto ref = records[member_indices.front()].direction; + DDir direction_sum{0., 0.}; + for (auto i : member_indices) { + auto u = canonicalize_like(records[i].direction, ref); + direction_sum = direction_sum + u * std::max(records[i].length, 1.e-9); } - // Ortho edge slide - { - std::list> edges_to_remove, edges_to_insert; + auto u = direction_sum.squared_length() < 1.e-18 ? ref : unit(direction_sum); + auto n = perpendicular(u); - for (auto vit = G.vertices_begin(); vit != G.vertices_end(); ++vit) { - auto& selected = vit->first; + double tmin = std::numeric_limits::infinity(); + double tmax = -std::numeric_limits::infinity(); + double smin = std::numeric_limits::infinity(); + double smax = -std::numeric_limits::infinity(); - if (vit->second.size() >= 3) { - for (auto vjt = vit->second.begin(); vjt != vit->second.end(); ++vjt) { - auto& neighbour = *vjt; - bool processed_neighbour = false; + for (auto i : member_indices) { + for (auto& corner : records[i].corners) { + auto t = (corner - CGAL::ORIGIN) * u; + auto s = (corner - CGAL::ORIGIN) * n; + tmin = std::min(tmin, t); + tmax = std::max(tmax, t); + smin = std::min(smin, s); + smax = std::max(smax, s); + } + } - if (G.find(neighbour)->second.size() == 2 && !is_parallel_2degree_node(G.find(neighbour))) { - auto vkt = G.find(neighbour)->second.begin(); - if (selected == *vkt) { - vkt++; - } - auto& other = *vkt; + auto width = smax - smin; + auto sc = (smin + smax) / 2.; + auto start = u * tmin + n * sc; + auto end = u * tmax + n * sc; + auto corners = rectangle_corners(CGAL::ORIGIN + start, CGAL::ORIGIN + end, width); + + MergedBoxRecord box{ + CGAL::ORIGIN + start, + CGAL::ORIGIN + end, + u, + n, + width, + std::sqrt((end - start).squared_length()), + member_indices.size(), + member_indices, + corners, + aabb_from_points(corners), + to_exact_point(CGAL::ORIGIN + start), + to_exact_point(CGAL::ORIGIN + end) + }; + return box; +} - if ((other - neighbour).squared_length() < (neighbour - selected).squared_length()) { - continue; - } +std::pair merge_score(const MergedBoxRecord& a, const MergedBoxRecord& b) { + auto ang = angle_between_dirs_deg(a.direction, b.direction); + auto center_a = ((a.start - CGAL::ORIGIN) + (a.end - CGAL::ORIGIN)) / 2.; + auto center_b = ((b.start - CGAL::ORIGIN) + (b.end - CGAL::ORIGIN)) / 2.; + return {ang, std::sqrt((center_b - center_a).squared_length())}; +} - auto incoming = CGAL::Ray_2(other, neighbour - other); - boost::optional> closest_neighbouring_segment; - boost::optional> closest_intersection_point; - K::FT sq_distance_along_ray = std::numeric_limits::infinity(); +bool clusters_can_merge(const BoxCluster& a, const BoxCluster& b, double angle_tol_deg = 5., double axis_overlap_ratio_limit = 0.5) { + if (!aabb_overlap(a.box.bbox, b.box.bbox)) { + return false; + } + if (angle_between_dirs_deg(a.box.direction, b.box.direction) > angle_tol_deg) { + return false; + } + if (boxes_overlap_along_merge_axis(a.box, b.box) > axis_overlap_ratio_limit) { + auto a_center = CGAL::ORIGIN + ((a.box.start - CGAL::ORIGIN) + (a.box.end - CGAL::ORIGIN)) / 2.; + auto b_center = CGAL::ORIGIN + ((b.box.start - CGAL::ORIGIN) + (b.box.end - CGAL::ORIGIN)) / 2.; + auto a_dir = a.box.direction; + auto b_dir = b.box.direction; + auto dist = a.box.length < b.box.length ? point_line_distance(a_center, b_center, b_dir) : point_line_distance(b_center, a_center, a_dir); + auto ref = a.box.length < b.box.length ? a.box.avg_width : b.box.avg_width; + return dist < (ref / 4.); + } + return true; +} - for (auto vlt = vit->second.begin(); vlt != vit->second.end(); ++vlt) { - auto& other_neighbour = *vlt; - if (vlt != vjt) { - CGAL::Segment_2 neighbouring_segment(selected, other_neighbour); - auto x = CGAL::intersection(incoming, neighbouring_segment); - if (x) { - if (auto* xp = variant_get>(&*x)) { - auto dist = ((*xp) - other).squared_length(); - if (dist < sq_distance_along_ray) { - closest_neighbouring_segment = neighbouring_segment; - closest_intersection_point = *xp; - sq_distance_along_ray = dist; - } - } - } - } - } +std::vector merge_intersecting_parallel_boxes_iterative(const std::vector& runs) { + auto records = build_run_box_records(runs); + std::vector clusters; + clusters.reserve(records.size()); + for (size_t i = 0; i < records.size(); ++i) { + clusters.push_back({{i}, merge_cluster_to_box({i}, records)}); + } - if (closest_intersection_point && closest_neighbouring_segment) { - edges_to_remove.push_back(*closest_neighbouring_segment); - edges_to_remove.push_back({ neighbour, selected }); - edges_to_insert.push_back({ closest_neighbouring_segment->source(), *closest_intersection_point }); - edges_to_insert.push_back({ closest_neighbouring_segment->target(), *closest_intersection_point }); - edges_to_insert.push_back({ neighbour, *closest_intersection_point }); + while (true) { + std::optional> best_pair; + std::pair best_score; - processed_neighbour = true; - } - } - if (processed_neighbour) { - // Only one neigbour is processed because otherwise we obtain intersections - break; - } + for (size_t i = 0; i < clusters.size(); ++i) { + for (size_t j = i + 1; j < clusters.size(); ++j) { + if (!clusters_can_merge(clusters[i], clusters[j])) { + continue; + } + auto score = merge_score(clusters[i].box, clusters[j].box); + if (!best_pair || score < best_score) { + best_pair = std::make_pair(i, j); + best_score = score; } } } - for (auto& s : edges_to_remove) { - G.remove_edge(s.source(), s.target()); + if (!best_pair) { + break; } + auto i = best_pair->first; + auto j = best_pair->second; + std::vector members = clusters[i].members; + members.insert(members.end(), clusters[j].members.begin(), clusters[j].members.end()); + auto merged = BoxCluster{members, merge_cluster_to_box(members, records)}; - for (auto& s : edges_to_insert) { - G.insert(s.source(), s.target()); + std::vector next_clusters; + next_clusters.reserve(clusters.size() - 1); + for (size_t k = 0; k < clusters.size(); ++k) { + if (k != i && k != j) { + next_clusters.push_back(std::move(clusters[k])); + } } + next_clusters.push_back(std::move(merged)); + clusters = std::move(next_clusters); + } -#ifdef SVGFILL_DEBUG - obj << "o network_3\n"; - for (auto it = G.edges_begin(); it != G.edges_end(); ++it) { - obj << "v " << CGAL::to_double(it->first.x()) << " " << CGAL::to_double(it->first.y()) << " 0\n"; - obj << "v " << CGAL::to_double(it->second.x()) << " " << CGAL::to_double(it->second.y()) << " 0\n"; - obj << "l " << vi++; - obj << " " << vi++ << "\n"; - } -#endif + std::vector merged_boxes; + merged_boxes.reserve(clusters.size()); + for (auto& cluster : clusters) { + merged_boxes.push_back(cluster.box); } + return merged_boxes; +} - // Now plot the edges on an arrangement in order to find planar cycles - // and merge the corridor-halves with their neighbouring input polygon +Point_2 project_point_to_line_exact(const Point_2& p, const MergedBoxRecord& box) { + auto d = box.exact_end - box.exact_start; + if (d.squared_length() == 0) { + return box.exact_start; + } + auto t = ((p - box.exact_start) * d) / d.squared_length(); + return box.exact_start + d * t; +} - Arrangement_2 arr; +boost::optional intersect_infinite_lines_exact(const MergedBoxRecord& a, const MergedBoxRecord& b) { + if (a.exact_start == a.exact_end || b.exact_start == b.exact_end) { + return boost::none; + } + auto x = CGAL::intersection(CGAL::Line_2(a.exact_start, a.exact_end), CGAL::Line_2(b.exact_start, b.exact_end)); + if (!x) { + return boost::none; + } + if (auto* xp = variant_get(&*x)) { + return *xp; + } + return boost::none; +} + +double point_to_oriented_box_distance(const DPoint& p, const MergedBoxRecord& box) { + auto d = box.end - box.start; + auto L = std::sqrt(d.squared_length()); + if (L < 1.e-9) { + return std::sqrt((p - box.start).squared_length()); + } + + auto u = d / L; + auto n = perpendicular(u); + auto rel = p - box.start; + auto t = rel * u; + auto s = rel * n; + + auto tmin = -box.avg_width / 2.; + auto tmax = L + box.avg_width / 2.; + auto smin = -box.avg_width / 2.; + auto smax = box.avg_width / 2.; + + double dt = 0.; + if (t < tmin) { + dt = tmin - t; + } else if (t > tmax) { + dt = t - tmax; + } + + double ds = 0.; + if (s < smin) { + ds = smin - s; + } else if (s > smax) { + ds = s - smax; + } + + return std::hypot(dt, ds); +} + +std::map> snap_points_to_box_axes( + const CenterLineGraphData& graph, + const std::vector& boxes, + const K::FT& max_projection_distance) { + std::vector snapped_points(graph.points.size()); + + for (size_t i = 0; i < graph.points.size(); ++i) { + if (boxes.empty()) { + snapped_points[i] = graph.points[i]; + continue; + } + + std::vector candidates; + candidates.reserve(boxes.size()); + for (size_t j = 0; j < boxes.size(); ++j) { + candidates.push_back({ + j, + point_to_oriented_box_distance(graph.points_double[i], boxes[j]), + point_line_distance(graph.points_double[i], boxes[j].start, boxes[j].direction), + project_point_to_line_exact(graph.points[i], boxes[j]) + }); + } + + std::vector containing; + for (auto& candidate : candidates) { + if (candidate.box_distance <= 1.e-9) { + containing.push_back(candidate); + } + } + + auto less = [](const SnapCandidate& a, const SnapCandidate& b) { + if (a.line_distance != b.line_distance) { + return a.line_distance < b.line_distance; + } + return a.box_distance < b.box_distance; + }; + + if (containing.size() >= 2) { + std::sort(containing.begin(), containing.end(), less); + auto& c1 = containing[0]; + auto& c2 = containing[1]; + if (angle_between_dirs_deg(boxes[c1.box_index].direction, boxes[c2.box_index].direction) > 8.) { + if (auto x = intersect_infinite_lines_exact(boxes[c1.box_index], boxes[c2.box_index])) { + snapped_points[i] = *x; + continue; + } + } + snapped_points[i] = c1.projection; + continue; + } + + if (containing.size() == 1) { + snapped_points[i] = containing[0].projection; + continue; + } - for (auto it = G.edges_begin(); it != G.edges_end(); ++it) { - if (it->first == it->second) { + auto best = *std::min_element(candidates.begin(), candidates.end(), [](const SnapCandidate& a, const SnapCandidate& b) { + if (a.box_distance != b.box_distance) { + return a.box_distance < b.box_distance; + } + return a.line_distance < b.line_distance; + }); + + if ((snapped_points[i] - best.projection).squared_length() < (max_projection_distance * max_projection_distance)) { + snapped_points[i] = best.projection; + } + } + + std::map> adjacency; + for (auto& edge : graph.edges) { + auto a = snapped_points[edge.first]; + auto b = snapped_points[edge.second]; + if (a == b) { continue; } - CGAL::insert(arr, Segment_2(it->first, it->second)); + adjacency[a].insert(b); + adjacency[b].insert(a); + } + + std::map> snapped_graph; + for (auto& p : adjacency) { + snapped_graph[p.first] = {p.second.begin(), p.second.end()}; } + return snapped_graph; +} - std::list> move_ops; - std::list> edge_ops; +Graph2D join_segment_runs( + DebugWriter& debug, + const std::map>& line_graph, + const std::map& midpoint_to_edge_length, + const K::FT& max_projection_distance) { + auto graph = make_center_line_graph_data(line_graph, midpoint_to_edge_length); + auto runs = runs_from_graph(graph); + runs.erase(std::remove_if(runs.begin(), runs.end(), [](const LineRun& run) { + return run.vertex_count <= 5; + }), runs.end()); + + std::vector run_polygons; + for (auto& r : runs) { + auto ps = rectangle_corners(r.start, r.end, r.avg_width); + std::array exact_corners; + std::transform(ps.begin(), ps.end(), exact_corners.begin(), [](const DPoint& p) { + return to_exact_point(p); + }); + run_polygons.emplace_back(exact_corners.begin(), exact_corners.end()); + } + debug.write_polygons(run_polygons, "initial_runs"); + run_polygons.clear(); - for (auto it = G.vertices_begin(); it != G.vertices_end(); ++it) { - if (it->second.size() == 1) { - auto& M = it->first; + auto boxes = merge_intersecting_parallel_boxes_iterative(runs); + + for (auto& r : boxes) { + auto ps = rectangle_corners(r.start, r.end, r.avg_width); + std::array exact_corners; + std::transform(ps.begin(), ps.end(), exact_corners.begin(), [](const DPoint& p) { + return to_exact_point(p); + }); + run_polygons.emplace_back(exact_corners.begin(), exact_corners.end()); + } + debug.write_polygons(run_polygons, "merged_boxes"); + + auto snapped_graph = snap_points_to_box_axes(graph, boxes, max_projection_distance); + return Graph2D(snapped_graph); +} + +std::set> find_triangles(const std::map>& line_graph) { + // Find triangles in this network often occuring at junctions in the corridor mesh + std::set> triangles; + std::function&)> find_triangles_recursive; + find_triangles_recursive = [&](std::vector& path) -> void { + // If depth reaches 3, check for a triangle + if (path.size() == 3) { + // Check if we can complete the triangle by going from the current point back to the start + const std::vector& neighbors_current = line_graph.at(path.back()); + if (std::find(neighbors_current.begin(), neighbors_current.end(), path.front()) != neighbors_current.end()) { + // We found a triangle, add it to the set + Triangle triangle = {path[0], path[1], path[2]}; + std::sort(triangle.begin(), triangle.end()); + triangles.insert(triangle); + } + return; + } + + // Otherwise, continue exploring neighbors + const std::vector& neighbors = line_graph.at(path.back()); + for (const Point_2& neighbor : neighbors) { + if (std::find(path.begin(), path.end(), neighbor) == path.end()) { + path.push_back(neighbor); + find_triangles_recursive(path); + path.pop_back(); // Backtrack + } + } + }; + + for (auto& p : line_graph) { + std::vector ps = {p.first}; + find_triangles_recursive(ps); + } + + return triangles; +} + +std::set> eliminate_triangles(const std::map>& line_graph) { + auto triangles = find_triangles(line_graph); + + // @todo this currently uses a simple cartesian kernel for performance for support of sqrt, but + // this should be possible to rewrite as ratios/slopes in the exact kernel as well + using SK = CGAL::Simple_cartesian; + CGAL::Cartesian_converter C{}; + + std::set> eliminated_segments; + for (auto& t : triangles) { + Triangle st; + std::transform(t.begin(), t.end(), st.begin(), C); + + double global_min_abs_dot = std::numeric_limits::infinity(); + size_t global_min_abs_dot_index; + + for (size_t i = 0; i < 3; ++i) { + auto j = (i + 2) % 3; + auto e0 = st[i] - st[j]; + e0 /= std::sqrt(e0.squared_length()); + + double max_abs_dot = 0.; + + { + auto& ni = line_graph.find(t[i])->second; + for (auto& n : ni) { + if (std::find(t.begin(), t.end(), n) == t.end()) { + // not contained in triangle + auto sn = C(n); + auto en = sn - st[i]; + en /= std::sqrt(en.squared_length()); + auto dot = std::abs(en * e0); + + if (dot > max_abs_dot) { + max_abs_dot = dot; + } + } + } + } - decltype(midpoint_to_segment)::mapped_type* q = nullptr; + { + auto& nj = line_graph.find(t[j])->second; + for (auto& n : nj) { + if (std::find(t.begin(), t.end(), n) == t.end()) { + // not contained in triangle + auto sn = C(n); + auto en = sn - st[j]; + en /= std::sqrt(en.squared_length()); + auto dot = std::abs(en * e0); - if (midpoint_to_segment.find(M) == midpoint_to_segment.end()) { - typename K::FT min_sq_distance = std::numeric_limits::infinity(); - for (auto& pa : midpoint_to_segment) { - if (CGAL::squared_distance(pa.first, M) < min_sq_distance) { - q = &pa.second; - min_sq_distance = CGAL::squared_distance(pa.first, M); + if (dot > max_abs_dot) { + max_abs_dot = dot; + } } } - } else { - q = &midpoint_to_segment[M]; } - if (q == nullptr) { - continue; + if (max_abs_dot < global_min_abs_dot) { + global_min_abs_dot = max_abs_dot; + global_min_abs_dot_index = i; + } + } + + { + auto i = global_min_abs_dot_index; + auto j = (i + 2) % 3; + + eliminated_segments.insert({t[i], t[j]}); + eliminated_segments.insert({t[j], t[i]}); + } + } + + return eliminated_segments; +} + +bool is_parallel_2degree_node(Graph2D::vertex_const_iterator vit) { + auto it = vit->second.begin(); + auto& P = *it++; + auto& Q = *it++; + auto e1 = P - vit->first; + auto e2 = vit->first - Q; + if (e1.squared_length() == 0 || e2.squared_length() == 0) { + // @todo why does this happen? + return false; + } + e1 /= std::sqrt(CGAL::to_double(e1.squared_length())); + e2 /= std::sqrt(CGAL::to_double(e2.squared_length())); + return std::abs(CGAL::to_double(e1 * e2)) > (1. - 1.e-5); +}; + + +void eliminate_colinear_vertices(Graph2D& G) { + size_t n_vertices_removed = 0; + for (auto vit = G.vertices_begin(); vit != G.vertices_end();) { + if (vit->second.size() == 2) { + if (is_parallel_2degree_node(vit)) { + vit = G.eliminate_vertex(vit); + ++n_vertices_removed; + } else { + ++vit; } + } else { + ++vit; + } + } +} + +struct Ccw_radial_sort { + Point_2 c; + explicit Ccw_radial_sort(const Point_2& center) : c(center) {} + + bool operator()(const Point_2& a, const Point_2& b) const { + const Vector_2 va = a - c; + const Vector_2 vb = b - c; + + // Only left-turn is not sufficient because we should not wrap around, + // but rather start from e.g positive x-axis and then sort CCW. + // Therefore top-half plane always comes before bottom-half plane. + const bool ua = va.y() == 0 ? va.x() > 0 : va.y() > 0; + const bool ub = vb.y() == 0 ? vb.x() > 0 : vb.y() > 0; + if (ua != ub) { + return ua; + } + + if (CGAL::collinear(c, a, b)) { + // Nearer first so that original polygon edges are likely retained + // (not sure if it matters). + return va.squared_length() < vb.squared_length(); + } + + // This is a less functor, so we return true if c,a,b is a left turn, which means that a is CCW before b + return CGAL::left_turn(c, a, b); + } +}; + +void build_radial_neighbour_map(const std::vector& polygons, double radius, std::map>& neighbour_map) { + for (auto& poly : polygons) { + for (auto it = poly.edges_begin(); it != poly.edges_end(); ++it) { + auto source = it->source(); + auto target = it->target(); + neighbour_map[source].push_back(target); + neighbour_map[target].push_back(source); + } + } + + // Box_intersection_d package to find close vertices and connect them as well + typedef CGAL::Box_intersection_d::Box_with_handle_d Box; + std::vector boxes; + for (auto& poly : polygons) { + for (auto it = poly.vertices_begin(); it != poly.vertices_end(); ++it) { + const auto pb = it->bbox(); + boxes.emplace_back( + CGAL::Bbox_2(pb.xmin() - radius, pb.ymin() - radius, pb.xmax() + radius, pb.ymax() + radius), + *it); + } + } + CGAL::box_self_intersection_d(boxes.begin(), boxes.end(), [&](const Box& a, const Box& b) { + if ((a.handle() - b.handle()).squared_length() <= (radius * radius)) { + neighbour_map[a.handle()].push_back(b.handle()); + neighbour_map[b.handle()].push_back(a.handle()); + } + }); + + // radial sort + for (auto& p : neighbour_map) { + auto& nb = p.second; + std::sort(nb.begin(), nb.end(), Ccw_radial_sort(p.first)); + } +} + +void edge_slide(Graph2D& G) { + std::list> edges_to_remove, edges_to_insert; + + for (auto vit = G.vertices_begin(); vit != G.vertices_end(); ++vit) { + auto& selected = vit->first; + + if (vit->second.size() >= 3) { + for (auto vjt = vit->second.begin(); vjt != vit->second.end(); ++vjt) { + auto& neighbour = *vjt; + bool processed_neighbour = false; + + if (G.find(neighbour)->second.size() == 2 && !is_parallel_2degree_node(G.find(neighbour))) { + auto vkt = G.find(neighbour)->second.begin(); + if (selected == *vkt) { + vkt++; + } + auto& other = *vkt; + + if ((other - neighbour).squared_length() < (neighbour - selected).squared_length()) { + continue; + } + + auto incoming = CGAL::Ray_2(other, neighbour - other); + boost::optional> closest_neighbouring_segment; + boost::optional> closest_intersection_point; + K::FT sq_distance_along_ray = std::numeric_limits::infinity(); - bool handled_as_graph_path = false; - - // distance from unioned - shoot ray? - if (segment_to_input_facet[*q].size() == 2) { - for (auto& bnd : inner_offset) { - // if point M is contained in bnd interior: - if (bnd.has_on_bounded_side(M)) { - auto& incoming = *it->second.begin(); - // create ray incoming -> M - CGAL::Ray_2 ray(incoming, M - incoming); - // intersect ray with boundary - boost::optional> closest_segment; - boost::optional> closest_intersection_point; - K::FT sq_distance_along_ray = std::numeric_limits::infinity(); - for (auto jt = bnd.edges_begin(); jt != bnd.edges_end(); ++jt) { - const auto& seg = *jt; - auto x = CGAL::intersection(ray, seg); + for (auto vlt = vit->second.begin(); vlt != vit->second.end(); ++vlt) { + auto& other_neighbour = *vlt; + if (vlt != vjt) { + CGAL::Segment_2 neighbouring_segment(selected, other_neighbour); + auto x = CGAL::intersection(incoming, neighbouring_segment); if (x) { if (auto* xp = variant_get>(&*x)) { - auto dist = ((*xp) - M).squared_length(); + auto dist = ((*xp) - other).squared_length(); if (dist < sq_distance_along_ray) { - closest_segment = seg; + closest_neighbouring_segment = neighbouring_segment; closest_intersection_point = *xp; sq_distance_along_ray = dist; } } } } + } + + if (closest_intersection_point && closest_neighbouring_segment) { + edges_to_remove.push_back(*closest_neighbouring_segment); + edges_to_remove.push_back({neighbour, selected}); + edges_to_insert.push_back({closest_neighbouring_segment->source(), *closest_intersection_point}); + edges_to_insert.push_back({closest_neighbouring_segment->target(), *closest_intersection_point}); + edges_to_insert.push_back({neighbour, *closest_intersection_point}); + + processed_neighbour = true; + } + } + if (processed_neighbour) { + // Only one neigbour is processed because otherwise we obtain intersections + break; + } + } + } + } + + for (auto& s : edges_to_remove) { + G.remove_edge(s.source(), s.target()); + } + + for (auto& s : edges_to_insert) { + G.insert(s.source(), s.target()); + } +} + +std::list> extend_end_vertices_based_on_input( + const Graph2D& G, + const std::map>& midpoint_to_segment, + const std::map, std::vector*>>& segment_to_input_facet, + const Polygon_list& outer_perimiter, + const SegmentLookup& segment_lookup, + const K::FT& max_projection_distance +){ + std::list> constructed_segments; + + std::set processed_vertices; + + while (true) { + // The idea was to peal off 1-degree vertices when projecting them did not result into + // nearby intersections with the outer perimiter. This in case there would be turns near + // the perimeter, which would be eliminated by pealing off the vertices, which would then + // require out of the loop because of invalidated iterators. For now we decided to stick + // to a projection of the vertex onto the perimeter segment when the projection distance + // exceeds a threshold. + bool broke_out = false; + + for (auto it = G.vertices_begin(); it != G.vertices_end(); ++it) { + if (it->second.size() == 1) { + auto& M = it->first; + + if (processed_vertices.find(M) != processed_vertices.end()) { + continue; + } + + const std::pair* q = nullptr; + + if (midpoint_to_segment.find(M) == midpoint_to_segment.end()) { + typename K::FT min_sq_distance = std::numeric_limits::infinity(); + for (auto& pa : midpoint_to_segment) { + if (CGAL::squared_distance(pa.first, M) < min_sq_distance) { + q = &pa.second; + min_sq_distance = CGAL::squared_distance(pa.first, M); + } + } + } else { + q = &midpoint_to_segment.find(M)->second; + } + + if (q == nullptr) { + continue; + } - if (closest_intersection_point) { + bool handled_as_graph_path = false; + + // distance from unioned - shoot ray? + if (segment_to_input_facet.find(*q)->second.size() == 2) { + for (auto& bnd : outer_perimiter) { + // if point M is contained in bnd interior: + // if (!bnd.has_on_unbounded_side(M)) { + if (bnd.has_on_bounded_side(M)) { + auto& incoming = *it->second.begin(); + // create ray incoming -> M + CGAL::Ray_2 ray(incoming, M - incoming); + + // intersect ray with boundary + boost::optional> closest_segment; + boost::optional> closest_intersection_point; + K::FT sq_distance_along_ray = std::numeric_limits::infinity(); + for (auto jt = bnd.edges_begin(); jt != bnd.edges_end(); ++jt) { + const auto& seg = *jt; + auto x = CGAL::intersection(ray, seg); + if (x) { + if (auto* xp = variant_get>(&*x)) { + auto dist = ((*xp) - M).squared_length(); + if (dist < sq_distance_along_ray) { + if (dist < (max_projection_distance * max_projection_distance)) { + closest_segment = seg; + closest_intersection_point = *xp; + sq_distance_along_ray = dist; + } else { + + } + } + } + } + } + + if (closest_intersection_point) { + constructed_segments.push_front({M, *closest_intersection_point}); + processed_vertices.insert(M); + break; +#if 0 Graph2D GGG(bnd); GGG.refine(*GGG.query(*closest_intersection_point, 0.01), *closest_intersection_point); - std::array>, 2> input_points = { { {}, {} } }; + std::array>, 2> input_points = {{{}, {}}}; size_t i = 0; - for (auto& fac : segment_to_input_facet[*q]) { + for (auto& fac : segment_to_input_facet.find(*q)->second) { for (auto it = fac->vertices_begin(); it != fac->vertices_end(); ++it) { auto seg = GGG.query(*it, 0.01); if (seg) { @@ -1361,28 +1975,55 @@ void arrange_cgal_polygons(const std::vector& input_polygons_, std::v if (!a1.empty() && !a2.empty()) { if (M != *closest_intersection_point) { - edge_ops.push_front({ M, *closest_intersection_point }); + constructed_segments.push_front({M, *closest_intersection_point}); } for (auto it = a1.begin(); it != a1.end() && std::next(it) != a1.end(); ++it) { - edge_ops.push_front({ *it, *(std::next(it)) }); + constructed_segments.push_front({*it, *(std::next(it))}); } for (auto it = a2.begin(); it != a2.end() && std::next(it) != a2.end(); ++it) { - edge_ops.push_front({ *it, *(std::next(it)) }); + constructed_segments.push_front({*it, *(std::next(it))}); } handled_as_graph_path = true; break; } +#endif + } else { + + // Loop over boundary segments, and project point onto it, take the closest + K::FT closest_distance = std::numeric_limits::infinity(); + boost::optional> closest_point; + for (auto& poly : outer_perimiter) { + for (auto jt = poly.edges_begin(); jt != poly.edges_end(); ++jt) { + auto seg = *jt; + auto Pp = seg.supporting_line().projection(M); + if (seg.has_on(Pp)) { + auto d = CGAL::squared_distance(Pp, M); + if (d < (max_projection_distance * max_projection_distance)) { + if (d < closest_distance) { + closest_distance = d; + closest_point = Pp; + } + } + } + } + } + + if (closest_point) { + constructed_segments.push_front({M, *closest_point}); + processed_vertices.insert(M); + } + } } } } - } +#if 0 if (!handled_as_graph_path) { // else we choose to map point to the midpoint of the found two close points. - auto pq = close_input_point(q->first); - auto pr = close_input_point(q->second); + auto pq = segment_lookup.close_input_point(q->first); + auto pr = segment_lookup.close_input_point(q->second); auto Q = pq.second; auto R = pr.second; @@ -1392,16 +2033,16 @@ void arrange_cgal_polygons(const std::vector& input_polygons_, std::v // where Q and R are co-located, because the point R' is further away // in that case M + M-Q should gives is x that we then project onto the // input boundary - // - // - // ┌───────┐ - // │ │ - // │ │ - // │ │ - // └───────o <--Q,R - // - // ────────o <--M - // + // + // + // ┌───────┐ + // │ │ + // │ │ + // │ │ + // └───────o <--Q,R + // + // ────────o <--M + // // ┌───────x───────────────o <---R' // │ │ // │ │ @@ -1410,93 +2051,105 @@ void arrange_cgal_polygons(const std::vector& input_polygons_, std::v // └───────────────────────┘ // @todo is this projection actually necessary or is it already 'exact enough'? - R = project_input_point(M + (M - Q)).second; + R = segment_lookup.project_input_point(M + (M - Q)).second; } auto avg = CGAL::ORIGIN + ((Q - CGAL::ORIGIN) + (R - CGAL::ORIGIN)) / 2; - move_ops.push_front({ M, avg }); - edge_ops.push_front({ avg, Q }); - edge_ops.push_front({ avg, R }); - + constructed_segments.push_front({M, avg}); + constructed_segments.push_front({avg, Q}); + constructed_segments.push_front({avg, R}); } - } - } - -#ifdef SVGFILL_DEBUG - obj << "o network_4\n"; #endif - - // note that we actually don't move but draw an edge - for (auto& pq : move_ops) { - if (pq.first == pq.second) { - continue; + } } - CGAL::insert(arr, Segment_2(pq.first, pq.second)); -#ifdef SVGFILL_DEBUG - obj << "v " << CGAL::to_double(pq.first.x()) << " " << CGAL::to_double(pq.first.y()) << " 0\n"; - obj << "v " << CGAL::to_double(pq.second.x()) << " " << CGAL::to_double(pq.second.y()) << " 0\n"; - obj << "l " << vi++; - obj << " " << vi++ << "\n"; -#endif + if (!broke_out) { + break; + } } + return constructed_segments; +} - for (auto& pq : edge_ops) { - if (pq.first == pq.second) { - continue; - } - CGAL::insert(arr, Segment_2(pq.first, pq.second)); +std::list> +extend_end_vertices_based_on_input_simple( + const Graph2D& G, + const Polygon_list& outer_perimiter, + const K::FT& max_projection_distance) +{ + std::list> constructed_segments; -#ifdef SVGFILL_DEBUG - obj << "v " << CGAL::to_double(pq.first.x()) << " " << CGAL::to_double(pq.first.y()) << " 0\n"; - obj << "v " << CGAL::to_double(pq.second.x()) << " " << CGAL::to_double(pq.second.y()) << " 0\n"; - obj << "l " << vi++; - obj << " " << vi++ << "\n"; -#endif - } + for (auto it = G.vertices_begin(); it != G.vertices_end(); ++it) { + if (it->second.size() == 1) { + auto& M = it->first; - // Plot input polygons - for (auto& poly : input_polygons) { - for (size_t i = 0; i != poly.size(); ++i) { - auto j = (i + 1) % poly.size(); - if (poly.vertex(i) == poly.vertex(j)) { - continue; - } - CGAL::insert(arr, Segment_2(poly.vertex(i), poly.vertex(j))); - } - } + for (auto& bnd : outer_perimiter) { + // if point M is contained in bnd interior: + // if (!bnd.has_on_unbounded_side(M)) { + if (bnd.has_on_bounded_side(M)) { + auto& incoming = *it->second.begin(); + // create ray incoming -> M + CGAL::Ray_2 ray(incoming, M - incoming); + + // intersect ray with boundary + boost::optional> closest_segment; + boost::optional> closest_intersection_point; + K::FT sq_distance_along_ray = std::numeric_limits::infinity(); + for (auto jt = bnd.edges_begin(); jt != bnd.edges_end(); ++jt) { + const auto& seg = *jt; + auto x = CGAL::intersection(ray, seg); + if (x) { + if (auto* xp = variant_get>(&*x)) { + auto dist = ((*xp) - M).squared_length(); + if (dist < sq_distance_along_ray) { + if (dist < (max_projection_distance * max_projection_distance)) { + closest_segment = seg; + closest_intersection_point = *xp; + sq_distance_along_ray = dist; + } else { + } + } + } + } + } + if (closest_intersection_point) { + constructed_segments.push_front({M, *closest_intersection_point}); + } else { -#ifdef SVGFILL_DEBUG - { - obj << "o arrangement_1\n"; - for (auto it = arr.edges_begin(); it != arr.edges_end(); ++it) { - auto& p = it->source()->point(); - auto& q = it->target()->point(); - obj << "v " << CGAL::to_double(p.x()) << " " << CGAL::to_double(p.y()) << " 0\n"; - obj << "v " << CGAL::to_double(q.x()) << " " << CGAL::to_double(q.y()) << " 0\n"; - obj << "l " << vi++; - obj << " " << vi++ << "\n"; - } - } -#endif + // Loop over boundary segments, and project point onto it, take the closest + K::FT closest_distance = std::numeric_limits::infinity(); + boost::optional> closest_point; + for (auto& poly : outer_perimiter) { + for (auto jt = poly.edges_begin(); jt != poly.edges_end(); ++jt) { + auto seg = *jt; + auto Pp = seg.supporting_line().projection(M); + if (seg.has_on(Pp)) { + auto d = CGAL::squared_distance(Pp, M); + if (d < (max_projection_distance * max_projection_distance)) { + if (d < closest_distance) { + closest_distance = d; + closest_point = Pp; + } + } + } + } + } - /* { - // debug, add outer bounds so that we can plot the face for any remaining edges - auto poly = unioned_polygons.front().outer_boundary(); - for (size_t i = 0; i != poly.size(); ++i) { - auto j = (i + 1) % poly.size(); - CGAL::insert(arr, Segment_2(poly.vertex(i), poly.vertex(j))); + if (closest_point) { + constructed_segments.push_front({M, *closest_point}); + } + } + } + } } - } */ + } - // Now loop over the arrangement faces, when a face coincides with a point on the - // corridor network we know it needs to be joined with an input polygon. In that - // case the edges need to be eliminated that correspond to original geometry. + return constructed_segments; +} - size_t face_id = 0; +void fuse_corridor_halves_with_input(Arrangement_2& arr, Graph2D& G, SegmentLookup& segment_lookup, const Polygon_list& input_polygons, DebugWriter& debug_output) { std::set edges_to_remove; for (auto it = arr.faces_begin(); it != arr.faces_end(); ++it) { @@ -1535,7 +2188,7 @@ void arrange_cgal_polygons(const std::vector& input_polygons_, std::v auto& p = curr->source()->point(); auto& q = curr->target()->point(); auto center = CGAL::ORIGIN + (((p - CGAL::ORIGIN) + (q - CGAL::ORIGIN)) / 2); - auto p1index = input_polygon_boundary(center); + auto p1index = segment_lookup.input_polygon_boundary(center); const bool on_orig_bound = p1index != input_polygons.end(); if (on_orig_bound) { if (edges_to_remove.find(curr->twin()) != edges_to_remove.end()) { @@ -1553,7 +2206,7 @@ void arrange_cgal_polygons(const std::vector& input_polygons_, std::v auto& p = curr->source()->point(); auto& q = curr->target()->point(); auto center = CGAL::ORIGIN + (((p - CGAL::ORIGIN) + (q - CGAL::ORIGIN)) / 2); - auto p1index = input_polygon_boundary(center); + auto p1index = segment_lookup.input_polygon_boundary(center); const bool on_orig_bound = p1index != input_polygons.end(); if (on_orig_bound) { if (edges_to_remove.find(curr->twin()) != edges_to_remove.end()) { @@ -1569,132 +2222,1243 @@ void arrange_cgal_polygons(const std::vector& input_polygons_, std::v } } } + } -#ifdef SVGFILL_DEBUG - write_polygon_to_svg(svg, circ_to_poly(it->outer_ccb())); + size_t remove_id = 0; + for (auto& e : edges_to_remove) { + debug_output.write_segment(e->source()->point(), e->target()->point(), "arr_remove_edge_" + std::to_string(remove_id++)); + CGAL::remove_edge(arr, e); + } +} - obj << "o " << "face_"; - if (is_corridor) { - obj << "corri_"; +class Segment_2_less { + public: + bool operator()(const Segment_2& a, const Segment_2& b) const { + if (a.source() != b.source()) { + return a.source() < b.source(); } - obj << face_id++ << "\n"; + return a.target() < b.target(); + } +}; - std::ostringstream oss; +std::vector arrangement_cell_iou(DebugWriter& debug_output, Arrangement_2& left, Arrangement_2& right) { - { - auto vv = vi; - auto curr = it->outer_ccb(); - do { - auto& p = curr->source()->point(); - obj << "v " << CGAL::to_double(p.x()) << " " << CGAL::to_double(p.y()) << " 0\n"; - oss << "l " << vi++; - ++curr; - if (curr == it->outer_ccb()) { - oss << " " << vv << "\n"; - } else { - oss << " " << vi << "\n"; + using Walk_pl = CGAL::Arr_walk_along_line_point_location; + Walk_pl walk_pl(right); + + std::set visited_faces_on_right; + + std::vector return_values; + + K::FT max_iou_deviation = 1; + std::array max_deviation_poly_pair; + + for (auto it = left.faces_begin(); it != left.faces_end(); ++it) { + if (!it->is_unbounded()) { + // convert arr facet to polygon with holes + auto polygon_exterior = circ_to_poly(it->outer_ccb()); + Polygon_with_holes_2 pwh(polygon_exterior); + for (auto hit = it->inner_ccbs_begin(); hit != it->inner_ccbs_end(); ++hit) { + pwh.add_hole(circ_to_poly(*hit)); + } + if (!pwh.outer_boundary().is_simple()) { + throw std::runtime_error("Polygon with holes has a non-simple outer boundary"); + } + + CGAL::Polygon_triangulation_decomposition_2 decompositor; + std::vector temp; + decompositor(pwh, std::back_inserter(temp)); + + std::set visited_points; + + while (true) { + // select triangle edge that has largest squared edge length times distance from polygon exterior + K::FT max_score = -std::numeric_limits::infinity(); + Point_2 best_point; + for (auto& tri : temp) { + for (size_t i = 0; i < 3; ++i) { + size_t j = (i + 1) % 3; + auto& pi = tri.vertex(i); + auto& pj = tri.vertex(j); + + auto center_point = CGAL::ORIGIN + (((pi - CGAL::ORIGIN) + (pj - CGAL::ORIGIN)) / 2); + + K::FT min_dist = std::numeric_limits::infinity(); + for (auto eit = polygon_exterior.edges_begin(); eit != polygon_exterior.edges_end(); ++eit) { + auto ep = eit->source(); + auto eq = eit->target(); + Segment_2 seg(ep, eq); + auto dist = CGAL::squared_distance(center_point, seg); + if (dist < min_dist) { + min_dist = dist; + } + } + + auto sq_length = CGAL::squared_distance(pi, pj); + + auto score = sq_length * min_dist; + if (score > max_score && visited_points.count(center_point) == 0) { + max_score = score; + best_point = center_point; + } + } } - } while (curr != it->outer_ccb()); - } - for (auto jt = it->inner_ccbs_begin(); jt != it->inner_ccbs_end(); ++jt) { - auto vv = vi; - auto curr = *jt; - do { - auto& p = curr->source()->point(); - obj << "v " << CGAL::to_double(p.x()) << " " << CGAL::to_double(p.y()) << " 0\n"; - oss << "l " << vi++; - ++curr; - if (curr == *jt) { - oss << " " << vv << "\n"; + if (max_score == -std::numeric_limits::infinity()) { + // no more points to try + return_values.push_back(0); + break; + } + + visited_points.insert(best_point); + + auto res = walk_pl.locate(best_point); + if (auto* v = variant_get(&res)) { + if ((*v)->is_unbounded()) { + // try next point + continue; + } + if (visited_faces_on_right.count(*v) > 0) { + // Maybe we should be more permissive, try some other points etc. + return_values.push_back(0); + } else { + // convert arr facet to polygon with holes + auto polygon_exterior = circ_to_poly((*v)->outer_ccb()); + Polygon_with_holes_2 pwh_right(polygon_exterior); + for (auto hit = (*v)->inner_ccbs_begin(); hit != (*v)->inner_ccbs_end(); ++hit) { + pwh_right.add_hole(circ_to_poly(*hit)); + } + if (!pwh_right.outer_boundary().is_simple()) { + throw std::runtime_error("Polygon with holes has a non-simple outer boundary"); + } + + // compute intersection over union of pwh and the original polygon + if (CGAL::do_intersect(pwh, pwh_right)) { + std::vector result; + CGAL::intersection(pwh, pwh_right, std::back_inserter(result)); + typename K::FT intersection_area = 0; + for (auto& r : result) { + auto poly_area = r.outer_boundary().area(); + for (auto& h : r.holes()) { + poly_area -= CGAL::abs(h.area()); + } + intersection_area += poly_area; + } + CGAL::Polygon_with_holes_2 poly12; + CGAL::join(pwh, pwh_right, poly12); + typename K::FT union_area = poly12.outer_boundary().area(); + for (auto& h : poly12.holes()) { + union_area -= CGAL::abs(h.area()); + } + return_values.push_back(intersection_area / union_area); + + auto& v = return_values.back(); + if (v < max_iou_deviation) { + max_iou_deviation = v; + max_deviation_poly_pair = {pwh.outer_boundary(), pwh_right.outer_boundary()}; + } + } else { + return_values.push_back(0); + } + } + visited_faces_on_right.insert(*v); + break; } else { - oss << " " << vi << "\n"; + // Not in facet on right, retry another point + continue; } - } while (curr != *jt); + } } + } - obj << oss.str(); -#endif + if (max_iou_deviation != 1) { + debug_output.write_polygon(max_deviation_poly_pair[0], "max_iou_deviation_left"); + debug_output.write_polygon(max_deviation_poly_pair[1], "max_iou_deviation_right"); } - size_t remove_id = 0; - for (auto& e : edges_to_remove) { -#ifdef SVGFILL_DEBUG - obj << "o " << "remove_" << remove_id++ << "\n"; - { - auto& p = e->source()->point(); - obj << "v " << CGAL::to_double(p.x()) << " " << CGAL::to_double(p.y()) << " 0\n"; + return return_values; +} + +void clean_noisy_paths(DebugWriter& debug_output, Arrangement_2& arr, SegmentLookup& segment_lookup, double& threshold) { + using SK = CGAL::Simple_cartesian; + CGAL::Cartesian_converter C{}; + + auto other = [](const Segment_2& e, const Point_2& v) { + return (e.source() == v) ? e.target() : e.source(); + }; + + std::set edges; + for (auto he = arr.edges_begin(); he != arr.edges_end(); ++he) { + auto a = he->source()->point(); + auto b = he->target()->point(); + if (a < b) { + edges.insert({a, b}); + } else { + edges.insert({b, a}); } - { - auto& p = e->target()->point(); - obj << "v " << CGAL::to_double(p.x()) << " " << CGAL::to_double(p.y()) << " 0\n"; + } + + auto edge_badness = [&](const Segment_2& e) -> double { + auto closest = segment_lookup.n_closest_input_segments(e, 2); + if (closest.size() != 2) { + throw std::runtime_error("Unable to locate two nearby edges"); } - obj << "l " << vi++; - obj << " " << vi++ << std::endl; -#endif - CGAL::remove_edge(arr, e); + + auto get_dir = [&](const Segment_2& s) { + auto a = C(s.source()); + auto b = C(s.target()); + SK::Vector_2 v = b - a; + double l = std::sqrt(v.squared_length()); + if (l <= 1e-12) { + return std::make_pair(SK::Vector_2(0, 0), 0.); + } + return std::make_pair(v / l, l); + }; + + auto [own_dir, own_length] = get_dir(e); + + auto angle = [&](const SK::Vector_2& ov) { + double d = std::abs(own_dir * ov); + if (d > 1.0) { + d = 1.0; + } + return std::acos(d); + }; + + double best = std::numeric_limits::infinity(); + for (auto& s : closest) { + auto [dv, dl] = get_dir(s); + best = std::min(best, angle(dv)); + } + return (best + 0.01) / own_length; + }; + + std::map badnesses; + for (auto& e : edges) { + badnesses[e] = edge_badness(e); } - for (auto it = arr.faces_begin(); it != arr.faces_end(); ++it) { - if (it->is_unbounded()) { - continue; + { + std::vector tmp; + tmp.reserve(badnesses.size()); + for (auto& p : badnesses) { + tmp.push_back(p.second); + } + std::nth_element(tmp.begin(), tmp.begin() + tmp.size() / 2, tmp.end()); + double med = tmp[tmp.size() / 2]; + threshold = 4.0 * med; + } + + std::set bad_edges; + for (auto& p : badnesses) { + if (p.second > threshold) { + bad_edges.insert(p.first); } + } - output_polygons.push_back(circ_to_poly(it->outer_ccb())); + std::map> topo, bad_topo; + + for (auto& e : edges) { + topo[e.source()].push_back(e); + topo[e.target()].push_back(e); + } + for (auto& e : bad_edges) { + bad_topo[e.source()].push_back(e); + bad_topo[e.target()].push_back(e); + } -#ifdef SVGFILL_DEBUG - write_polygon_to_svg(svg, circ_to_poly(it->outer_ccb())); + std::set break_vertices; + for (auto& p : bad_topo) { + const auto& v = p.first; + if (!(topo[v].size() == 2 && bad_topo[v].size() == 2)) { + break_vertices.insert(v); + } + } - obj << "o " << "merged_face_"; - obj << face_id++ << "\n"; + std::set seen; + std::vector> bad_paths; - std::ostringstream oss; + for (auto& s : break_vertices) { + for (auto& e0 : bad_topo[s]) { + if (seen.count(e0)) { + continue; + } - { - auto vv = vi; - auto curr = it->outer_ccb(); - do { - auto& p = curr->source()->point(); - obj << "v " << CGAL::to_double(p.x()) << " " << CGAL::to_double(p.y()) << " 0\n"; - oss << "l " << vi++; - ++curr; - if (curr == it->outer_ccb()) { - oss << " " << vv << "\n"; - } else { - oss << " " << vi << "\n"; + Point_2 v = s; + std::vector path; + path.push_back(s); + + auto e = e0; + while (true) { + seen.insert(e); + v = other(e, v); + path.push_back(v); + + if (break_vertices.count(v)) { + break; } - } while (curr != it->outer_ccb()); + + auto& inc = bad_topo[v]; + std::vector nxt; + nxt.reserve(2); + for (auto& ee : inc) { + if (ee != e && !seen.count(ee)) { + nxt.push_back(ee); + } + } + if (nxt.size() != 1) { + break; + } + e = nxt[0]; + } + + if (path.size() > 1) { + bad_paths.push_back(std::move(path)); + } } + } - for (auto jt = it->inner_ccbs_begin(); jt != it->inner_ccbs_end(); ++jt) { - auto vv = vi; - auto curr = *jt; - do { - auto& p = curr->source()->point(); - obj << "v " << CGAL::to_double(p.x()) << " " << CGAL::to_double(p.y()) << " 0\n"; - oss << "l " << vi++; - ++curr; - if (curr == *jt) { - oss << " " << vv << "\n"; - } else { - oss << " " << vi << "\n"; + std::set> to_remove; + std::vector> to_insert; + + auto dirs_from = [&](const Point_2& v, const std::set& path_edges) { + std::vector ds; + for (auto& ee : topo[v]) { + if (path_edges.count(ee) || bad_edges.count(ee)) { + continue; + } + Point_2 u = other(ee, v); + ds.push_back(v - u); + } + return ds; + }; + + auto collapse_path = [&](const std::vector& path) -> std::optional { + std::set path_edges; + for (size_t i = 0; i + 1 < path.size(); ++i) { + auto* a = &path[i]; + auto* b = &path[i + 1]; + if (*a < *b) { + path_edges.insert({*a, *b}); + } else { + path_edges.insert({*b, *a}); + } + } + + const auto& a0 = path.front(); + const auto& b0 = path.back(); + + auto das = dirs_from(a0, path_edges); + auto dbs = dirs_from(b0, path_edges); + if (das.empty() || dbs.empty()) { + return std::nullopt; + } + + K::FT best_ke = std::numeric_limits::infinity(); + std::optional best_x; + + for (auto& da : das) { + for (auto& db : dbs) { + CGAL::Ray_2 r1(a0, da); + CGAL::Ray_2 r2(b0, db); + + auto x = CGAL::intersection(r1, r2); + if (x) { + if (auto* xp = variant_get>(&*x)) { + // @todo does it matter that this is squared? + auto ke = CGAL::squared_distance(*xp, a0) + CGAL::squared_distance(*xp, b0); + if (ke < best_ke) { + best_ke = ke; + best_x = *xp; + } + } + } + } + } + + return best_x; + }; + + auto process_modifications = [&]( + Arrangement_2& arr_, + const std::set>& to_remove_, + const std::vector>& to_insert_) { + for (auto& e : to_remove_) { + bool removed = false; + for (auto he = arr_.edges_begin(); he != arr_.edges_end(); ++he) { + auto a = he->source()->point(); + auto b = he->target()->point(); + if ((a == e.first && b == e.second) || (a == e.second && b == e.first)) { + CGAL::remove_edge(arr_, he); + removed = true; + break; } - } while (curr != *jt); + } + if (!removed) { + std::cerr << "Warning: unable to locate edge for removal, skipping" << std::endl; + } + } + + for (auto& pq : to_insert_) { + if (pq.first == pq.second) { + continue; + } + CGAL::insert(arr_, Segment_2(pq.first, pq.second)); + } + }; + + size_t path_index = 0; + for (auto& path : bad_paths) { + decltype(to_remove) to_remove_this_path; + decltype(to_insert) to_insert_this_path; + + for (size_t i = 0; i < path.size() - 1; ++i) { + auto& a = path[i]; + auto& b = path[i + 1]; + + debug_output.write_segment(a, b, "arr_bad_path path_nr_" + std::to_string(path_index)); + } + + auto x = collapse_path(path); + if (!x) { + // std::cerr << "Unable to collapse path, skipping" << std::endl; + continue; + } + + double orig_length = 0.; + for (size_t i = 0; i < path.size() - 1; ++i) { + auto& a = path[i]; + auto& b = path[i + 1]; + orig_length += std::sqrt(CGAL::to_double(CGAL::squared_distance(a, b))); + } + + double new_length = std::sqrt(CGAL::to_double((path.front() - *x).squared_length())) + std::sqrt(CGAL::to_double((path.back() - *x).squared_length())); + + if (new_length > orig_length * 2 || orig_length > new_length * 2) { + // std::cerr << "Collapsing path would increase length too much, skipping" << std::endl; + continue; + } + + for (size_t i = 0; i < path.size(); ++i) { + auto& v = path[i]; + if (CGAL::squared_distance(v, *x) < 1.e-5) { + // std::cerr << "Collapsing path would create near-duplicate vert to previous path, skipping" << std::endl; + continue; + } + } + + for (size_t i = 0; i < path.size() - 1; ++i) { + auto& a = path[i]; + auto& b = path[i + 1]; + if (a < b) { + to_remove.insert({a, b}); + to_remove_this_path.insert({a, b}); + } else { + to_remove.insert({b, a}); + to_remove_this_path.insert({b, a}); + } + } + auto s = path.front(); + auto t = path.back(); + if (s != *x) { + to_insert.push_back({s, *x}); + to_insert_this_path.push_back({s, *x}); + + debug_output.write_segment(s, *x, "corrected_path path_nr_" + std::to_string(path_index)); + } + if (t != *x) { + to_insert.push_back({t, *x}); + to_insert_this_path.push_back({t, *x}); + + debug_output.write_segment(t, *x, "corrected_path path_nr_" + std::to_string(path_index)); } - obj << oss.str(); + path_index += 1; + +#if 1 + process_modifications(arr, to_remove_this_path, to_insert_this_path); +#else + auto arr_copy = arr; + process_modifications(arr_copy, to_remove_this_path, to_insert_this_path); + auto ious = arrangement_cell_iou(arr, arr_copy); + for (auto& iou : ious) { + std::cerr << " - cell iou: " << CGAL::to_double(iou) << std::endl; + } + std::swap(arr_copy, arr); #endif } -#ifdef SVGFILL_DEBUG - svg << "\n"; -#endif + process_modifications(arr, to_remove, to_insert); } -#ifndef SVGFILL_MAIN +template +void next_circular(typename Vec::const_iterator& it, const Vec& vec) { + std::advance(it, 1); + if (it == vec.end()) { + it = vec.begin(); + } +} -bool svgfill::arrange_polygons(const std::vector& polygons, std::vector& arranged) -{ +template +void previous_circular(typename Vec::const_iterator& it, const Vec& vec) { + if (it == vec.begin()) { + it = vec.end(); + } + std::advance(it, -1); +} + +template +std::size_t circular_distance(typename Vec::const_iterator first, + typename Vec::const_iterator last, + const Vec& vec) { + if (first <= last) { + return static_cast(last - first); + } + return static_cast(vec.end() - first) + static_cast(last - vec.begin()); +} + +template +std::pair +longest_wrapping_true_run(const Vec& v, Pred pred) { + using It = typename Vec::const_iterator; + + const auto n = v.size(); + if (n == 0) { + return {v.end(), v.end()}; + } + + // Find best non-wrapping run + std::size_t best_len = 0; + std::size_t best_start = 0; + + std::size_t curr_len = 0; + std::size_t curr_start = 0; + + for (std::size_t i = 0; i < n; ++i) { + if (pred(v[i])) { + if (curr_len == 0) { + curr_start = i; + } + ++curr_len; + if (curr_len > best_len) { + best_len = curr_len; + best_start = curr_start; + } + } else { + curr_len = 0; + } + } + + // Count leading true + std::size_t leading = 0; + while (leading < n && pred(v[leading])) { + ++leading; + } + + // All true + if (leading == n) { + return {v.begin(), v.end()}; + } + + // Count trailing true + std::size_t trailing = 0; + while (trailing < n && pred(v[n - 1 - trailing])) { + ++trailing; + } + + // Wrapped run = [n - trailing, n) + [0, leading) + const std::size_t wrapped_len = leading + trailing; + + if (wrapped_len > best_len) { + It first = v.begin() + static_cast(n - trailing); + It last = v.begin() + static_cast(leading); + return {first, last}; + } + + It first = v.begin() + static_cast(best_start); + It last = first + static_cast(best_len); + return {first, last}; +} + +void clean_noisy_bounds(DebugWriter& debug_output, Arrangement_2& arr, SegmentLookup& segment_lookup, double threshold) { + using SK = CGAL::Simple_cartesian; + CGAL::Cartesian_converter C{}; + + auto other = [](const Segment_2& e, const Point_2& v) { + return (e.source() == v) ? e.target() : e.source(); + }; + + auto edge_badness = [&](const Segment_2& e) -> double { + auto closest = segment_lookup.n_closest_input_segments(e, 2); + if (closest.size() != 2) { + throw std::runtime_error("Unable to locate two nearby edges"); + } + + auto get_dir = [&](const Segment_2& s) { + auto a = C(s.source()); + auto b = C(s.target()); + SK::Vector_2 v = b - a; + double l = std::sqrt(v.squared_length()); + if (l <= 1e-12) { + return std::make_pair(SK::Vector_2(0, 0), 0.); + } + return std::make_pair(v / l, l); + }; + + auto [own_dir, own_length] = get_dir(e); + + auto angle = [&](const SK::Vector_2& ov) { + double d = std::abs(own_dir * ov); + if (d > 1.0) { + d = 1.0; + } + return std::acos(d); + }; + + double best = std::numeric_limits::infinity(); + for (auto& s : closest) { + auto [dv, dl] = get_dir(s); + best = std::min(best, angle(dv)); + } + return (best + 0.01) / own_length; + }; + + size_t facet_index = 0; + for (auto it = arr.faces_begin(); it != arr.faces_end(); ++it, ++facet_index) { + if (!it->is_unbounded()) { + std::set> to_remove; + std::vector> to_insert; + + std::vector segs; + std::vector vertices; + std::vector halfedges; + + auto circ = it->outer_ccb(); + do { + auto a = circ->source()->point(); + auto b = circ->target()->point(); + segs.emplace_back(a, b); + vertices.push_back(circ->source()); + halfedges.push_back(circ); + ++circ; + } while (circ != it->outer_ccb()); + + std::vector badnesses; + for (auto& e : segs) { + badnesses.push_back(edge_badness(e)); + } + + auto bit = std::min_element(badnesses.begin(), badnesses.end()); + if (*bit > threshold) { + // std::cerr << "All edges are good, skipping" << std::endl; + continue; + } + + auto it_pair = longest_wrapping_true_run(badnesses, [&](double d) { return d > threshold; }); + auto N = circular_distance(it_pair.first, it_pair.second, badnesses); + + if (N == 0) { + // std::cerr << "Unable to find run of bad edges, skipping" << std::endl; + continue; + } + + std::vector> incoming_paths; + + auto jt = it_pair.first; + for (std::size_t k = 0; k < N; ++k, next_circular(jt, badnesses)) { + + auto he = halfedges[std::distance(badnesses.cbegin(), jt)]; + to_remove.insert({he->source()->point(), he->target()->point()}); + debug_output.write_segment(he->source()->point(), he->target()->point(), "arr_bad_bound facet_" + std::to_string(facet_index)); + + Arrangement_2::Vertex_handle v = he->source(); + + // circle around other edges onto v + Arrangement_2::Halfedge_around_vertex_circulator first, curr; + first = curr = v->incident_halfedges(); + do { + Arrangement_2::Vertex_handle u = curr->source(); + if (curr->face() != it && curr->twin()->face() != it) { + + // loop until we find a 3-degree vertex, or we come back to the start + std::vector path{v->point(), u->point()}; + auto he = curr; + + while (u->degree() == 2 && u != v && path.size() < 10) { + std::vector hes; + + { + Arrangement_2::Halfedge_around_vertex_circulator first, curr; + first = curr = u->incident_halfedges(); + do { + hes.push_back(curr); + curr++; + } while (curr != first); + } + + auto next_he = hes.front() != he && hes.front() != he->twin() ? hes.front() : hes.back(); + auto next_v = next_he->target() != u ? next_he->target() : next_he->source(); + + path.push_back(next_v->point()); + u = next_v; + } + incoming_paths.push_back(std::move(path)); + } + } while (++curr != first); + } + + const std::size_t start = + static_cast(std::distance(badnesses.cbegin(), it_pair.first)); + + auto n = badnesses.size(); + + auto wrap = [n](std::ptrdiff_t i) -> std::size_t { + i %= static_cast(n); + if (i < 0) { + i += static_cast(n); + } + return static_cast(i); + }; + + const std::size_t ib = start; + const std::size_t ia = wrap(static_cast(start) - 1); + const std::size_t ic = wrap(static_cast(start + N)); + const std::size_t id = wrap(static_cast(start + N + 1)); + + auto a = vertices.begin() + static_cast(ia); + auto b = vertices.begin() + static_cast(ib); + auto c = vertices.begin() + static_cast(ic); + auto d = vertices.begin() + static_cast(id); + + CGAL::Ray_2 r1((*a)->point(), (*b)->point()); + CGAL::Ray_2 r2((*d)->point(), (*c)->point()); + + auto x = CGAL::intersection(r1, r2); + if (x) { + if (auto* xp = variant_get>(&*x)) { + to_insert.emplace_back((*b)->point(), *xp); + to_insert.emplace_back((*c)->point(), *xp); + + debug_output.write_segment((*b)->point(), *xp, "corrected_bound facet_" + std::to_string(facet_index)); + debug_output.write_segment((*c)->point(), *xp, "corrected_bound facet_" + std::to_string(facet_index)); + } + } else { + CGAL::Line_2 r1((*a)->point(), (*b)->point()); + CGAL::Line_2 r2((*d)->point(), (*c)->point()); + + auto x = CGAL::intersection(r1, r2); + if (x) { + if (auto* xp = variant_get>(&*x)) { + to_insert.emplace_back((*b)->point(), *xp); + to_insert.emplace_back((*c)->point(), *xp); + + debug_output.write_segment((*b)->point(), *xp, "corrected_bound facet_" + std::to_string(facet_index)); + debug_output.write_segment((*c)->point(), *xp, "corrected_bound facet_" + std::to_string(facet_index)); + } + } + } + } + } +} + +void remove_colinear_vertices(Arrangement_2& arr) { + std::set to_remove; + std::set> to_add; + while (true) { + bool removed_this_round = false; + for (auto it = arr.vertices_begin(); it != arr.vertices_end(); ++it) { + if (it->degree() == 2) { + Arrangement_2::Halfedge_around_vertex_circulator first, curr; + first = curr = it->incident_halfedges(); + size_t i = 0; + std::array pts; + std::array hes; + do { + Arrangement_2::Vertex_const_handle u = curr->source(); + hes[i] = curr; + pts[i++] = u->point(); + } while (++curr != first); + + using SK = CGAL::Simple_cartesian; + CGAL::Cartesian_converter C{}; + + auto a = C(pts[0]); + auto b = C(it->point()); + auto c = C(pts[1]); + + SK::Vector_2 ab = b - a; + SK::Vector_2 ac = c - a; + ab /= std::sqrt(ab.squared_length()); + ac /= std::sqrt(ac.squared_length()); + + double d = ab * ac; + if (std::acos(d) < 1e-12) { + CGAL::remove_edge(arr, hes[0]); + CGAL::remove_edge(arr, hes[1]); + CGAL::insert(arr, Segment_2(pts[0], pts[1])); + removed_this_round = true; + break; + }; + } + } + if (!removed_this_round) { + break; + } + } +} + +class timer { + public: + class entry { + public: + entry() {} + + entry(std::map::const_iterator start_it) + : start_it(start_it) {} + + void stop() { + if (start_it) { + auto end = std::chrono::high_resolution_clock::now(); + auto duration = std::chrono::duration(end - start_it.value()->second).count(); + std::cerr << "Timing for " << start_it.value()->first << ": " << duration << " ms" << std::endl; + } + } + + private: + std::optional::const_iterator> start_it; + }; + + timer(bool enabled = true) : enabled_(enabled) {} + + entry start(const std::string& name) { + if (enabled_) { + return entry(timings_.insert({name, std::chrono::high_resolution_clock::now()}).first); + } else { + return entry(); + } + } + + private: + std::map< + std::string, + std::chrono::high_resolution_clock::time_point> + timings_; + + bool enabled_; +}; + +size_t delete_same_facet_edge_pairs(Arrangement_2& arr) { + size_t n_deleted = 0; + for (auto it = arr.edges_begin(); it != arr.edges_end();) { + decltype(it) current = it++; + if (current->face() == current->twin()->face()) { + arr.remove_edge(current); + n_deleted++; + } + } + return n_deleted; +} + +void arrange_cgal_polygons(svgfill::arrange_polygon_settings settings, const std::vector& input_polygons_, std::vector& output_polygons, double polygon_offset_distance = -1.) { + static const double OVERLAP_RESOLUTION_DISTANCE = 1.e-1; + // even larger amount of inset so that outer perimeter is safely within all input polygons even when overlap resolution is applied + // no, `1.e-2 + 1.e-5` creates issues with the outer perimeter, are there other tolerances in play? + static const double OUTER_PERIMITER_ADDITIONAL_INSET_AMOUNT = 1.e-5; + + DebugWriter debug_output; + if (settings.debug_output) { + auto t = std::time(nullptr); + auto tm = *std::localtime(&t); + + std::ostringstream oss; + oss << std::put_time(&tm, "arrangement_%Y%m%d%H%M%S"); + auto now = oss.str(); + debug_output = DebugWriter(true, now); + } else { + debug_output = DebugWriter(false, ""); + } + + timer timer(settings.debug_output); + + auto t0 = timer.start("input"); + + debug_output.write_polygons(input_polygons_, "input"); + + if (polygon_offset_distance < 0.) { + polygon_offset_distance = estimate_polygon_offset_distance(input_polygons_); + } + + // Create copy to make mutable for cleaning + auto input_polygons = input_polygons_; + + for (auto& polygon : input_polygons) { + clean_polygon(polygon); + } + + { + decltype(input_polygons) split_polygons; + for (auto& poly : input_polygons) { + split_self_intersecting_polygon(poly, std::back_inserter(split_polygons)); + } + std::swap(input_polygons, split_polygons); + } + + t0.stop(); + t0 = timer.start("overlap elimination"); + + eliminate_overlaps(debug_output, OVERLAP_RESOLUTION_DISTANCE, input_polygons); + + t0.stop(); + + // [NB Nov 6] we cannot do this anymore because it could revert the spacing between input polygons + // that touch in the corner. + // Now that overlaps/touches at corners are handled more locally only a small indent is produced + // which would be undone by means of an inset+offset. + // + // [NB Nov 10] this is actually still necessary though, but we apply a much smaller distance now + // to keep the overlap eliminations in tact + // + // Inset-offset to remove tiny details that may cause enourmous spikes in offsets + for (auto& r : input_polygons) { + smooth_polygon(polygon_offset_distance / 1000., r); + } + + debug_output.write_polygons(input_polygons, "processed_input"); + + std::vector outer_perimiter; + if (settings.outer_perimiter_algo == 0) { + t0 = timer.start("outer perimeter"); + + // Find the outer perimeter using offset - union - negative offset + std::vector offset_polygons; + for (auto& r : input_polygons) { + auto R = r; + if (!R.is_counterclockwise_oriented()) { + R.reverse_orientation(); + } + + // Overlap removal can also result in close points causing problems when converted into non-exact nt + remove_close_points(R); + + auto ps = create_and_convert_offset_polygon(polygon_offset_distance, R); + for (auto& p : ps) { + if (!p.is_simple()) { + throw std::runtime_error("Complex polygon originated from offset"); + } + } + offset_polygons.insert(offset_polygons.end(), ps.begin(), ps.end()); + } + + debug_output.write_polygons(offset_polygons, "offset_input"); + + // Perform Boolean union on the offset polygons + std::vector unioned_polygons; + CGAL::join(offset_polygons.begin(), offset_polygons.end(), std::back_inserter(unioned_polygons)); + + if (unioned_polygons.size() > 1) { + // @todo this is currently one of the major limitations in the code that still can be eliminated + // by grouping the input polygons by their perimiter polygon in unioned_polygons + std::sort(unioned_polygons.begin(), unioned_polygons.end(), [](auto& p, auto& q) { return p.outer_boundary().area() > q.outer_boundary().area(); }); + } + + debug_output.write_polygon(unioned_polygons.front().outer_boundary(), "offset_joined"); + + Polygon_2 fused_removed_close_points = unioned_polygons.front().outer_boundary(); + remove_close_points(fused_removed_close_points, 1.e-4); + + // Apply negative offset to get the outer perimeter polygon + outer_perimiter = create_and_convert_offset_polygon( + // Because polygon_offset is inexact, make sure our inset distance is slightly larger + // std::nexttoward(-polygon_offset_distance, -std::numeric_limits::infinity()), + + // 1.e-8 even was too little and still resulted in slivers of triangle around the perimeter + -polygon_offset_distance - OUTER_PERIMITER_ADDITIONAL_INSET_AMOUNT, + fused_removed_close_points); + + debug_output.write_polygons(outer_perimiter, "outer_perimiter"); + } else { + std::map> neighbour_map; + build_radial_neighbour_map(input_polygons, polygon_offset_distance, neighbour_map); + + auto start_vertex = neighbour_map.rbegin()->first; + auto next_vertex = neighbour_map.rbegin()->second.front(); + + std::vector cycle = {start_vertex, next_vertex}; + while (cycle.back() != cycle.front()) { + const auto& incoming_from = *(cycle.rbegin() + 1); + const auto& nb = neighbour_map[cycle.back()]; + auto it = std::find(nb.begin(), nb.end(), incoming_from); + // cycle it -1 around nb + if (it == nb.begin()) { + it = nb.end() - 1; + } else { + --it; + } + cycle.push_back(*it); + } + outer_perimiter.emplace_back(cycle.begin(), cycle.end()); + } + + t0.stop(); + t0 = timer.start("corridor creation"); + + // Subtract original polygons from outer perimeter + std::vector difference_result, difference_result_subdivided; + for (auto& i : outer_perimiter) { + std::vector working_copy; + working_copy.emplace_back(i); + + for (auto& r : input_polygons) { + std::vector temp_working_copy; + for (auto& wc : working_copy) { + CGAL::difference(wc, r, std::back_inserter(temp_working_copy)); + } + working_copy = temp_working_copy; + } + difference_result.insert(difference_result.end(), working_copy.begin(), working_copy.end()); + } + + t0.stop(); + t0 = timer.start("corridor triangulation"); + + // subdivide difference_result to have better more detailed triangulation and therefore less-pronounced artefacts in midpoint network + + auto subdivision_length = polygon_offset_distance / settings.subdivision_factor; + + for (auto& pwh : difference_result) { + difference_result_subdivided.push_back(subdivide_polygon(subdivision_length, pwh)); + // difference_result_subdivided.push_back(subdivide_polygon(polygon_offset_distance / 64., pwh)); + } + + debug_output.write_polygons(difference_result_subdivided, "corridor_subdivided"); + + std::vector> triangular_polygons; + for (auto& pwh : difference_result_subdivided) { + CGAL::Polygon_triangulation_decomposition_2 decompositor; + decompositor(pwh, std::back_inserter(triangular_polygons)); + } + + t0.stop(); + + /* + * // @todo decide whether this is smart or not + * // Would this not hurt topology too much? + triangular_polygons.erase(std::remove_if(triangular_polygons.begin(), triangular_polygons.end(), [](const CGAL::Polygon_2& p) { + return CGAL::to_double(p.area()) < 1.e-8; + }), triangular_polygons.end()); + */ + + t0 = timer.start("center line"); + + debug_output.write_polygons(triangular_polygons, "triangulated_corridor"); + + SegmentLookup segment_lookup(input_polygons); + + auto [line_graph, midpoint_to_segment, segment_to_input_facet, midpoint_to_edge_length] = build_line_graph(input_polygons, segment_lookup, triangular_polygons); + for (auto& p : line_graph) { + for (auto& q : p.second) { + debug_output.write_segment(p.first, q, "network_1"); + } + } + + t0.stop(); + + t0 = timer.start("center line cleaning"); + + Graph2D G; + Graph2D G_orig(line_graph); + + if (settings.line_cleaning_algo == 0) { + G = join_segment_runs(debug_output, line_graph, midpoint_to_edge_length, subdivision_length * 4); + Arrangement_2 arr; + G.to_arrangement(arr); + Graph2D G2; + G2.from_arrangement(arr); + eliminate_colinear_vertices(G2); + G = G2; + for (auto it = G.edges_begin(); it != G.edges_end(); ++it) { + debug_output.write_segment(it->first, it->second, "network_2"); + } + } else { + auto eliminated_segments = eliminate_triangles(line_graph); + + Graph2D G2(line_graph); + for (auto& e : eliminated_segments) { + debug_output.write_segment(e.first, e.second, "eliminated"); + G2.remove_edge(e.first, e.second); + } + + G = G2.weld_vertices(); + + for (auto it = G.edges_begin(); it != G.edges_end(); ++it) { + debug_output.write_segment(it->first, it->second, "network_2"); + } + + eliminate_colinear_vertices(G); + + edge_slide(G); + + for (auto it = G.edges_begin(); it != G.edges_end(); ++it) { + debug_output.write_segment(it->first, it->second, "network_3"); + } + } + + t0.stop(); + + t0 = timer.start("topology"); + + std::list> segments, segments1, segments2; + + if (settings.line_cleaning_algo == 0) { + segments1 = extend_end_vertices_based_on_input_simple(G, outer_perimiter, subdivision_length * 4); + segments2 = extend_end_vertices_based_on_input_simple(G_orig, outer_perimiter, subdivision_length * 4); + + Arrangement_2 arr_clean; + G.to_arrangement(arr_clean); + for (auto& pq : segments1) { + if (pq.first == pq.second) { + continue; + } + CGAL::insert(arr_clean, Segment_2(pq.first, pq.second)); + } + + Arrangement_2 arr_orig; + G_orig.to_arrangement(arr_orig); + for (auto& pq : segments2) { + if (pq.first == pq.second) { + continue; + } + CGAL::insert(arr_orig, Segment_2(pq.first, pq.second)); + } + + delete_same_facet_edge_pairs(arr_clean); + delete_same_facet_edge_pairs(arr_orig); + + for (auto& p : outer_perimiter) { + for (auto it = p.edges_begin(); it != p.edges_end(); ++it) { + auto source = it->source(); + auto target = it->target(); + if (source == target) { + continue; + } + CGAL::insert(arr_orig, Segment_2(source, target)); + CGAL::insert(arr_clean, Segment_2(source, target)); + } + } + + auto ious = arrangement_cell_iou(debug_output, arr_clean, arr_orig); + /* + for (auto& iou : ious) { + std::cout << " " << CGAL::to_double(iou - 1); + } + std::cout << std::endl; + */ + + auto it = std::min_element(ious.begin(), ious.end()); + + if (it != ious.end() && (*it < 0.5)) { + std::cerr << "Significant difference between cleaned and original arrangement, using original for topology reconstruction: " << *it << std::endl; + segments = segments2; + G = G_orig; + } else { + segments = segments1; + } + } else { + segments = extend_end_vertices_based_on_input(G, midpoint_to_segment, segment_to_input_facet, outer_perimiter, segment_lookup, subdivision_length * 4); + } + + // Now plot the edges on an arrangement in order to find planar cycles + // and merge the corridor-halves with their neighbouring input polygon + Arrangement_2 arr; + G.to_arrangement(arr); + + for (auto& pq : segments) { + if (pq.first == pq.second) { + continue; + } + CGAL::insert(arr, Segment_2(pq.first, pq.second)); + + debug_output.write_segment(pq.first, pq.second, "extended_segments"); + } + + if (settings.topology_reconstruction_algo != 0) { + // Write input polygons to arrangement_2 + // We no longer do this because we add the outer perimiter now, subdivided by the corridor network which is extended and intersected with the outer perimiter + for (auto& poly : input_polygons) { + for (size_t i = 0; i != poly.size(); ++i) { + auto j = (i + 1) % poly.size(); + if (poly.vertex(i) == poly.vertex(j)) { + continue; + } + CGAL::insert(arr, Segment_2(poly.vertex(i), poly.vertex(j))); + } + } + } else { + // Write outer perimeter to arrangement_2 + for (auto& p : outer_perimiter) { + for (auto it = p.edges_begin(); it != p.edges_end(); ++it) { + auto source = it->source(); + auto target = it->target(); + if (source == target) { + continue; + } + CGAL::insert(arr, Segment_2(source, target)); + } + } + } + + // Just for the automatic numbering, create a full vector + std::vector temp; + for (auto it = arr.faces_begin(); it != arr.faces_end(); ++it) { + if (it->is_unbounded()) { + continue; + } + temp.push_back(circ_to_poly(it->outer_ccb())); + } + debug_output.write_polygons(temp, "arr_faces"); + + + /* { + // debug, add outer bounds so that we can plot the face for any remaining edges + auto poly = unioned_polygons.front().outer_boundary(); + for (size_t i = 0; i != poly.size(); ++i) { + auto j = (i + 1) % poly.size(); + CGAL::insert(arr, Segment_2(poly.vertex(i), poly.vertex(j))); + } + } */ + + // Now loop over the arrangement faces, when a face coincides with a point on the + // corridor network we know it needs to be joined with an input polygon. In that + // case the edges need to be eliminated that correspond to original geometry. + + if (settings.topology_reconstruction_algo != 0) { + fuse_corridor_halves_with_input(arr, G, segment_lookup, input_polygons, debug_output); + } + + if (settings.perform_cleanup && settings.line_cleaning_algo != 0) { + remove_colinear_vertices(arr); + double threshold; + clean_noisy_paths(debug_output, arr, segment_lookup, threshold); + remove_colinear_vertices(arr); + // clean_noisy_bounds(debug_output, arr, segment_lookup, threshold); + } + + t0.stop(); + + for (auto it = arr.faces_begin(); it != arr.faces_end(); ++it) { + if (it->is_unbounded()) { + continue; + } + output_polygons.push_back(circ_to_poly(it->outer_ccb())); + } + + debug_output.write_polygons(output_polygons, "arr_faces_merged"); +} + +#ifndef SVGFILL_MAIN + +bool svgfill::arrange_polygons(arrange_polygon_settings settings, const std::vector& polygons, std::vector& arranged) { std::vector cgal_polygons, cgal_polygons_out; std::transform(polygons.begin(), polygons.end(), std::back_inserter(cgal_polygons), [](auto& poly) { Polygon_2 result; @@ -1703,7 +3467,7 @@ bool svgfill::arrange_polygons(const std::vector& polygons, }); return result; }); - arrange_cgal_polygons(cgal_polygons, cgal_polygons_out); + arrange_cgal_polygons(settings, cgal_polygons, cgal_polygons_out); std::transform(cgal_polygons_out.begin(), cgal_polygons_out.end(), std::back_inserter(arranged), [](auto& poly) { svgfill::polygon_2 result; std::transform(poly.begin(), poly.end(), std::back_inserter(result.boundary), [](auto& pt) { @@ -1753,7 +3517,7 @@ int main(int argc, char** argv) { input_polygons.back().push_back(CGAL::Point_2(x, y)); } } - arrange_cgal_polygons(input_polygons, output); + arrange_cgal_polygons(arrange_polygon_settings{}, input_polygons, output); break; } return 0; @@ -1766,7 +3530,7 @@ int main(int argc, char** argv) { input_polygons = { rect1, rect2, rect3, rect4, rect5 }; } - arrange_cgal_polygons(input_polygons, output); + arrange_cgal_polygons(arrange_polygon_settings{}, input_polygons, output); return 0; } diff --git a/src/svgfill/src/graph_2d.h b/src/svgfill/src/graph_2d.h index aaaa059b4e4..d19418ff62d 100644 --- a/src/svgfill/src/graph_2d.h +++ b/src/svgfill/src/graph_2d.h @@ -2,8 +2,10 @@ #define GRAPH_2D_H #ifdef SVGFILL_DEBUG +#if 0 #include #endif +#endif template class Graph2D { @@ -334,6 +336,23 @@ class Graph2D { return Graph2D(input_adjacency_list); } + template + void to_arrangement(T& arr) { + for (auto it = edges_begin(); it != edges_end(); ++it) { + if (it->first == it->second) { + continue; + } + CGAL::insert(arr, CGAL::Segment_2(it->first, it->second)); + } + } + + template + void from_arrangement(T& arr) { + for (auto it = arr.edges_begin(); it != arr.edges_end(); ++it) { + insert(it->source()->point(), it->target()->point()); + } + } + void assert_symmetric() { #ifdef SVGFILL_DEBUG #if 0 diff --git a/src/svgfill/src/svgfill.cpp b/src/svgfill/src/svgfill.cpp index 8a2a1bb0087..cf45881c934 100644 --- a/src/svgfill/src/svgfill.cpp +++ b/src/svgfill/src/svgfill.cpp @@ -483,6 +483,18 @@ class cgal_arrangement : public svgfill::abstract_arrangement { return ps; } + size_t delete_same_facet_edge_pairs() { + size_t n_deleted = 0; + for (auto it = arr.edges_begin(); it != arr.edges_end();) { + decltype(it) current = it++; + if (current->face() == current->twin()->face()) { + arr.remove_edge(current); + n_deleted++; + } + } + return n_deleted; + } + void merge(const std::vector& edge_indices) { if (edge_indices.empty()) { return; diff --git a/src/svgfill/src/svgfill.h b/src/svgfill/src/svgfill.h index 396fc9c9245..2588636a8df 100644 --- a/src/svgfill/src/svgfill.h +++ b/src/svgfill/src/svgfill.h @@ -67,6 +67,7 @@ namespace svgfill { virtual std::vector get_face_pairs() = 0; virtual size_t num_edges() = 0; virtual size_t num_faces() = 0; + virtual size_t delete_same_facet_edge_pairs() = 0; }; class SVGFILL_API context { @@ -101,6 +102,7 @@ namespace svgfill { void write(std::vector>&); size_t num_edges() { return arr_->num_edges(); } size_t num_faces() { return arr_->num_faces(); } + size_t delete_same_facet_edge_pairs() { return arr_->delete_same_facet_edge_pairs(); } ~context() { delete arr_; @@ -113,7 +115,25 @@ namespace svgfill { SVGFILL_API std::string polygons_to_svg(const std::vector>& polygons, bool random_color=false); SVGFILL_API std::string polygons_to_svg(const std::vector& polygons, bool random_color = false); SVGFILL_API bool svg_to_polygons(const std::string& data, const boost::optional& class_name, std::vector& polygons); - SVGFILL_API bool arrange_polygons(const std::vector& polygons, std::vector& arranged); -} + + struct SVGFILL_API arrange_polygon_settings { + bool debug_output = false; + // -1: compute from average edge length + double polygon_offset_distance = -1.; + // 0: use offset - union - negative offset to find the outer perimeter + // 1: radial walk along vertices; exact, but can only reuse vertices, not create new positions by means of intersections + int outer_perimiter_algo = 0; + // 0: outer perimiter and corridor center lines + // 1: input polygons, corridor center lines and segments connecting corridor center lines to input polygons + int topology_reconstruction_algo = 0; + // 0: join segment runs + // 1: local badness reduction + int line_cleaning_algo = 0; + bool perform_cleanup = true; + double subdivision_factor = 16.; + }; + + SVGFILL_API bool arrange_polygons(arrange_polygon_settings settings, const std::vector& polygons, std::vector& arranged); + } #endif diff --git a/test/run.py b/test/run.py index 320b8decc44..ad1880166fc 100644 --- a/test/run.py +++ b/test/run.py @@ -28,7 +28,6 @@ import inspect import os -import shutil import subprocess import sys from urllib.request import urlretrieve diff --git a/win/build-all-win.py b/win/build-all-win.py index 087f869ac4b..ded9a36bb67 100644 --- a/win/build-all-win.py +++ b/win/build-all-win.py @@ -5,10 +5,21 @@ """ import os +import platform import subprocess +import zipfile from pathlib import Path from zipfile import ZipFile + +def is_arm64() -> bool: + arch = os.environ.get("TARGET_ARCH", "").lower() + if arch in ("arm64", "aarch64"): + return True + if arch in ("x64", "amd64", "x86_64"): + return False + return platform.machine().lower() in ("arm64", "aarch64") + assert Path.cwd() == Path(__file__).parent, "Run this script from the 'win' directory." PYTHON_VERSIONS = ["3.10.3", "3.11.8", "3.12.1", "3.13.0", "3.14.0"] @@ -22,12 +33,28 @@ OUTPUT_DIR = Path.home() / "output" OUTPUT_DIR.mkdir(exist_ok=True) print("Output directory:", OUTPUT_DIR) -ZIP_TEMPLATE = f"{{package_name}}-v{VERSION}-{SHA}-win64.zip" +ZIP_TEMPLATE = f"{{package_name}}-v{VERSION}-{SHA}-{'win-arm64' if is_arm64() else 'win64'}.zip" def run(command: list[str]) -> None: print("Running:", command) - subprocess.check_call(command) # nosec B603 + subprocess.check_call(command) + + +def set_env(var_name: str, value: str) -> tuple[str, str | None]: + """ + :return: Tuple of ``(var_name, old_value)`` to be passed to ``restore_env``. + """ + old_value = os.getenv(var_name) + os.environ[var_name] = value + return var_name, old_value + + +def restore_env(var_name: str, old_value: str | None) -> None: + if old_value is None: + del os.environ[var_name] + else: + os.environ[var_name] = old_value def build() -> None: @@ -35,22 +62,22 @@ def build() -> None: os.environ["PYTHON_VERSION"] = python_version print(f"Building for Python {python_version}...") subprocess.run( - [str(REPO_WIN / "build-deps.cmd"), "vs2022-x64", "Release"], + [str(REPO_WIN / "build-deps.cmd"), "vs2022-ARM64" if is_arm64() else "vs2022-x64", "Release"], check=True, text=True, input="y\n", ) + OLD_ADD_COMMIT_SHA = set_env("ADD_COMMIT_SHA", "ON") run( [ str(REPO_WIN / "run-cmake.bat"), - "vs2022-x64", + "vs2022-ARM64" if is_arm64() else "vs2022-x64", "-DENABLE_BUILD_OPTIMIZATIONS=ON", "-DGLTF_SUPPORT=ON", - "-DADD_COMMIT_SHA=ON", - "-DVERSION_OVERRIDE=ON", ] ) - run([str(REPO_WIN / "install-ifcopenshell.bat"), "vs2022-x64", "Release"]) + restore_env(*OLD_ADD_COMMIT_SHA) + run([str(REPO_WIN / "install-ifcopenshell.bat"), "vs2022-ARM64" if is_arm64() else "vs2022-x64", "Release"]) def archive_executables() -> None: @@ -61,7 +88,7 @@ def archive_executables() -> None: if file.suffix.lower() != ".exe": continue zip_name = ZIP_TEMPLATE.format(package_name=file.stem) - with ZipFile(OUTPUT_DIR / zip_name, "w") as zipf: + with ZipFile(OUTPUT_DIR / zip_name, "w", compression=zipfile.ZIP_DEFLATED) as zipf: zipf.write(file, arcname=file.name) print(f"{file} -> {zip_name}") @@ -76,7 +103,7 @@ def archive_python_package(python_version: str, python_path: Path) -> None: file.unlink() zip_name = ZIP_TEMPLATE.format(package_name=f"ifcopenshell-python-{python_version_major_minor}") - with ZipFile(OUTPUT_DIR / zip_name, "w") as zipf: + with ZipFile(OUTPUT_DIR / zip_name, "w", compression=zipfile.ZIP_DEFLATED) as zipf: for file in package_path.rglob("*"): arcname = file.relative_to(site_packages) zipf.write(file, arcname=arcname) @@ -87,7 +114,7 @@ def archive_python_packages() -> None: deps_path = REPO_PATH / "_deps" python_versions: list[str] = [] for d in deps_path.iterdir(): - if d.is_dir() and d.name.startswith("python."): + if d.is_dir() and (d.name.startswith("python.") or d.name.startswith("pythonarm64.")): python_version = d.name.partition(".")[2] python_path = d / "tools" archive_python_package(python_version, python_path) diff --git a/win/build-deps.cmd b/win/build-deps.cmd index c81541104f0..8e543f10936 100644 --- a/win/build-deps.cmd +++ b/win/build-deps.cmd @@ -132,7 +132,7 @@ call cecho.cmd 0 10 "Script configuration:" call cecho.cmd 0 13 "* CMake Generator`t= '`"%GENERATOR%`'`t echo - Passed to CMake -G option. call cecho.cmd 0 13 "* Target Architecture`t= %TARGET_ARCH%" -echo - Whether were doing 32-bit (x86) or 64-bit (x64) build. +echo - Whether were doing 32-bit (x86) or 64-bit (x64, arm64) build. call cecho.cmd 0 13 "* Target Platform`t= %VS_PLATFORM%" echo - Passed to CMake -A option. call cecho.cmd 0 13 "* Target Toolset`t= %VS_TOOLSET%" @@ -187,8 +187,15 @@ IF DEFINED PYTHON_VERSION ( ) :: VERSION DERIVATIONS +for /f "tokens=1,2,3 delims=." %%a in ("%PYTHON_VERSION%") do ( + set PY_VER_MAJOR_MINOR=%%a%%b +) IF "%IFCOS_INSTALL_PYTHON%"=="TRUE" ( - set PYTHONHOME=%DEPS_DIR%\python.%PYTHON_VERSION%\tools + IF /I "%TARGET_ARCH%"=="arm64" ( + set PYTHONHOME=%DEPS_DIR%\pythonarm64.%PYTHON_VERSION%\tools + ) ELSE ( + set PYTHONHOME=%DEPS_DIR%\python.%PYTHON_VERSION%\tools + ) ) :: Cache last used CMake generator and configurable dependency dirs for other scripts to use @@ -249,8 +256,9 @@ IF NOT %ERRORLEVEL%==0 GOTO :Error :proj -IF EXIST "%INSTALL_DIR%\proj-9.2.1" ( - echo Found existing "%INSTALL_DIR%\proj-9.2.1", skipping +set PROJ_VERSION=9.4.1 +IF EXIST "%INSTALL_DIR%\proj-%PROJ_VERSION%" ( + echo Found existing "%INSTALL_DIR%\proj-%PROJ_VERSION%", skipping goto :mpir ) @@ -269,13 +277,13 @@ copy sqlite3.h %INSTALL_DIR%\sqlite3\include popd set DEPENDENCY_NAME=proj -set DEPENDENCY_DIR=%DEPS_DIR%\proj-9.2.1 -call :DownloadFile https://download.osgeo.org/proj/proj-9.2.1.zip "%DEPS_DIR%" proj-9.2.1.zip +set DEPENDENCY_DIR=%DEPS_DIR%\proj-%PROJ_VERSION% +call :DownloadFile https://download.osgeo.org/proj/proj-%PROJ_VERSION%.zip "%DEPS_DIR%" proj-%PROJ_VERSION%.zip IF NOT %ERRORLEVEL%==0 GOTO :Error -call :ExtractArchive proj-9.2.1.zip "%DEPS_DIR%" "%DEPS_DIR%\proj-9.2.1" +call :ExtractArchive proj-%PROJ_VERSION%.zip "%DEPS_DIR%" "%DEPS_DIR%\proj-%PROJ_VERSION%" IF NOT %ERRORLEVEL%==0 GOTO :Error pushd "%DEPENDENCY_DIR%" -call :RunCMake -DCMAKE_INSTALL_PREFIX="%INSTALL_DIR%\proj-9.2.1" ^ +call :RunCMake -DCMAKE_INSTALL_PREFIX="%INSTALL_DIR%\proj-%PROJ_VERSION%" ^ -DSQLITE3_INCLUDE_DIR=%INSTALL_DIR%\sqlite3\include ^ -DSQLITE3_LIBRARY=%INSTALL_DIR%\sqlite3\lib\sqlite3.lib ^ -DENABLE_TIFF=Off -DENABLE_CURL=Off -DBUILD_PROJSYNC=Off ^ @@ -297,8 +305,9 @@ IF EXIST "%INSTALL_DIR%\mpir" ( ) set DEPENDENCY_NAME=mpir +:: `mpfr` depends on relative path `..\mpir\config.h`, so dependency name should match exactly. set DEPENDENCY_DIR=%DEPS_DIR%\mpir -call :GitCloneAndCheckoutRevision https://github.com/BrianGladman/mpir.git "%DEPENDENCY_DIR%" +call :GitCloneAndCheckoutRevision https://github.com/Andrej730/mpir-vs2026.git "%DEPENDENCY_DIR%" IF NOT %ERRORLEVEL%==0 GOTO :Error pushd "%DEPENDENCY_DIR%" git reset --hard @@ -310,6 +319,11 @@ powershell -c "get-content %~dp0patches\mpir.patch | %%{$_ -replace \"sdk\",\"%U IF NOT %ERRORLEVEL%==0 GOTO :Error if NOT "%USE_STATIC_RUNTIME%"=="FALSE" git apply "%~dp0patches\mpir_runtime.patch" --unidiff-zero --ignore-whitespace IF NOT %ERRORLEVEL%==0 GOTO :Error +IF /I "%VS_PLATFORM%"=="ARM64" ( + echo "Applying ARM64 Patches for Mpir" + git apply "%~dp0patches\mpir-arm64-changes.patch" --unidiff-zero --ignore-whitespace +) +IF NOT %ERRORLEVEL%==0 GOTO :Error cd msvc cd vs%VS_VER:~2,2% call .\msbuild.bat gc LIB %VS_PLATFORM% %DEBUG_OR_RELEASE% @@ -336,6 +350,10 @@ powershell -c "get-content %~dp0patches\mpfr.patch | %%{$_ -replace \"sdk\",\"%U IF NOT %ERRORLEVEL%==0 GOTO :Error if NOT "%USE_STATIC_RUNTIME%"=="FALSE" git apply "%~dp0patches\mpfr_runtime.patch" --unidiff-zero --ignore-whitespace IF NOT %ERRORLEVEL%==0 GOTO :Error +IF /I "%VS_PLATFORM%"=="ARM64" ( + echo "Applying ARM64 Patches for Mpfr" + git apply "%~dp0patches\mpfr-arm64-changes.patch" --unidiff-zero --ignore-whitespace +) if "%VS_VER%"=="2017" ( set mpfr_sln=build.vc15 set orig_platform_toolset=v141 @@ -404,6 +422,7 @@ cd "%DEPS_DIR%" call :DownloadFile https://github.com/boostorg/boost/releases/download/boost-%BOOST_VERSION%/%BOOST_ZIP% "%DEPS_DIR%" %BOOST_ZIP% IF NOT %ERRORLEVEL%==0 GOTO :Error +cd "%DEPS_DIR%" call :ExtractArchive %BOOST_ZIP% "%DEPS_DIR%" %DEPENDENCY_DIR% IF NOT %ERRORLEVEL%==0 GOTO :Error @@ -412,6 +431,11 @@ if exist "%DEPS_DIR%\boost-%BOOST_VERSION%". ( ren %DEPS_DIR%\boost-%BOOST_VERSION% boost_%BOOST_VER% ) +:: As boost 1.90.0 it still includes b2 that doesn't support vc145 (not to mention older boost versions). +:: So to support vc145 we download b2 separately (only if we do use vc145). +call :check_boost_vc145_compatibility "%VC_VER%" "%DEPS_DIR%" "%DEPENDENCY_DIR%" +if NOT %ERRORLEVEL%==0 GOTO :Error + :: Build Boost build script if not exist "%DEPENDENCY_DIR%\project-config.jam". ( cd "%DEPS_DIR%" @@ -422,13 +446,21 @@ if not exist "%DEPENDENCY_DIR%\project-config.jam". ( IF NOT %ERRORLEVEL%==0 GOTO :Error ) +if /I "%TARGET_ARCH%"=="x64" ( + set B2_ARCH_FEATURE=x86 +) else if /I "%TARGET_ARCH%"=="arm64" ( + set B2_ARCH_FEATURE=arm +) else ( + echo "Failed to identify architecture" + GOTO :Error +) set BOOST_LIBS=--with-system --with-regex --with-thread --with-program_options --with-date_time --with-iostreams --with-filesystem :: NOTE Boost is fast to build with limited set of libraries so build it always. cd "%DEPENDENCY_DIR%" call cecho.cmd 0 13 "Building %DEPENDENCY_NAME% %BOOST_LIBS% Please be patient, this will take a while." IF EXIST "%DEPENDENCY_DIR%\bin.v2\project-cache.jam" del "%DEPENDENCY_DIR%\bin.v2\project-cache.jam" -call .\b2 toolset=%BOOST_TOOLSET% runtime-link=shared address-model=%ARCH_BITS% --abbreviate-paths -j%IFCOS_NUM_BUILD_PROCS% ^ +call .\b2 toolset=%BOOST_TOOLSET% architecture=%B2_ARCH_FEATURE% runtime-link=shared address-model=%ARCH_BITS% --abbreviate-paths -j%IFCOS_NUM_BUILD_PROCS% ^ variant=%DEBUG_OR_RELEASE_LOWERCASE% %BOOST_WIN_API% %BOOST_LIBS% stage --stagedir=%DEPENDENCY_INSTALL_DIR% IF NOT %ERRORLEVEL%==0 GOTO :Error @@ -462,8 +494,10 @@ IF NOT %ERRORLEVEL%==0 git apply --reject --whitespace=fix "%~dp0patches\OpenCOL :: uncomment to following line in order to delete the CMakeCache.txt always if experiencing problems. REM IF EXIST "%DEPENDENCY_DIR%\%BUILD_DIR%\CMakeCache.txt". del "%DEPENDENCY_DIR%\%BUILD_DIR%\CMakeCache.txt" :: NOTE Enforce that the embedded LibXml2 and PCRE are used as there might be problems with arbitrary versions of the libraries. +:: OpenCOLLADA is ancient at this point and allows cmake 2.6+, which results in error in cmake 4, so we override minimum cmake version. call :RunCMake -DCMAKE_INSTALL_PREFIX="%INSTALL_DIR%\%DEPENDENCY_INSTALL_NAME%" -DUSE_STATIC_MSVC_RUNTIME=0 -DCMAKE_DEBUG_POSTFIX=d ^ - -DLIBXML2_LIBRARIES="" -DLIBXML2_INCLUDE_DIR="" -DPCRE_INCLUDE_DIR="" -DPCRE_LIBRARIES="" + -DLIBXML2_LIBRARIES="" -DLIBXML2_INCLUDE_DIR="" -DPCRE_INCLUDE_DIR="" -DPCRE_LIBRARIES="" ^ + -DCMAKE_POLICY_VERSION_MINIMUM=3.5 IF NOT %ERRORLEVEL%==0 GOTO :Error REM IF NOT EXIST "%DEPS_DIR%\OpenCOLLADA\%BUILD_DIR%\lib\%DEBUG_OR_RELEASE%\OpenCOLLADASaxFrameworkLoader.lib". call :BuildCMakeProject "%DEPENDENCY_DIR%\%BUILD_DIR%" %DEBUG_OR_RELEASE% @@ -509,9 +543,18 @@ cd "%DEPENDENCY_DIR%" :: TODO: remove CMAKE_DEBUG_POSTFIX setting later. :: Temporarily explicitly set `CMAKE_DEBUG_POSTFIX` to empty to override it's perviously being set to `d`. :: OCCT don't need it, since it's layout is separating debug and release build by different folders. +:: +:: OCCT 7.8.1 we're using is becoming old and it was targeting cmake 3.1+. +::To make it buildable on cmake 4, we override policy version, but it may have some quirks in the future and we may consider version bump. call :RunCMake -DINSTALL_DIR="%DEPENDENCY_INSTALL_DIR%" -DBUILD_LIBRARY_TYPE="Static" -DCMAKE_DEBUG_POSTFIX="" ^ - -DBUILD_MODULE_Draw=0 -DUSE_FREETYPE=OFF ^ - -DBUILD_USE_PCH=ON + -DBUILD_MODULE_Draw=0 ^ + -DBUILD_RELEASE_DISABLE_EXCEPTIONS=OFF ^ + -DUSE_XLIB=OFF ^ + -DUSE_FREETYPE=OFF ^ + -DUSE_OPENGL=OFF ^ + -DUSE_GLES2=OFF ^ + -DBUILD_USE_PCH=ON ^ + -DCMAKE_POLICY_VERSION_MINIMUM=3.5 if not %ERRORLEVEL%==0 goto :Error :: whole program optimization avoids Visual C++ hanging when compiling 32-bit release OCCT up to version 7.4.0 @@ -543,9 +586,10 @@ SET COMPILE_WITH_WPO=FALSE :Python set DEPENDENCY_NAME=Python %PYTHON_VERSION% set DEPENDENCY_DIR=N/A -set PYTHON_AMD64_POSTFIX=-amd64 -IF NOT %TARGET_ARCH%==x64 set PYTHON_AMD64_POSTFIX= -set PYTHON_INSTALLER=python-%PYTHON_VERSION%%PYTHON_AMD64_POSTFIX%.exe +set PYTHON_AMD64_POSTFIX= +IF /I "%TARGET_ARCH%"=="x64" set "PYTHON_AMD64_POSTFIX=-amd64" +IF /I "%TARGET_ARCH%"=="arm64" set "PYTHON_AMD64_POSTFIX=-arm64" +set "PYTHON_INSTALLER=python-%PYTHON_VERSION%%PYTHON_AMD64_POSTFIX%.exe" IF NOT "%IFCOS_INSTALL_PYTHON%"=="TRUE" ( call cecho.cmd 0 13 "IFCOS_INSTALL_PYTHON not 'TRUE', skipping installation of Python." @@ -553,26 +597,29 @@ IF NOT "%IFCOS_INSTALL_PYTHON%"=="TRUE" ( ) :: nuget doesn't support providing architecture for packages. -if NOT %TARGET_ARCH%==x64 ( +IF /I NOT "%TARGET_ARCH%"=="x64" IF /I NOT "%TARGET_ARCH%"=="arm64" ( call cecho.cmd 0 12 "Automatic insallation of Python for x86 builds is not supported," call cecho.cmd 0 12 "please install Python %PYTHON_VERSION% manually and ensure that it is available in PATH." call cecho.cmd 0 12 "https://www.python.org/ftp/python/%PYTHON_VERSION%/%PYTHON_INSTALLER%" goto :Error ) - if EXIST "%PYTHONHOME%" ( echo Found existing '%PYTHONHOME%', skipping installation. goto :SWIG ) -"%NUGET_EXE%" install Python -Version %PYTHON_VERSION% -OutputDirectory "%DEPS_DIR%" -IF NOT %ERRORLEVEL%==0 GOTO :Error - +IF /I "%TARGET_ARCH%"=="x64" ( + "%NUGET_EXE%" install Python -Version %PYTHON_VERSION% -OutputDirectory "%DEPS_DIR%" + IF NOT %ERRORLEVEL%==0 GOTO :Error +) ELSE ( + "%NUGET_EXE%" install pythonarm64 -Version %PYTHON_VERSION% -OutputDirectory "%DEPS_DIR%" + IF NOT %ERRORLEVEL%==0 GOTO :Error +) :SWIG set DEPENDENCY_NAME=SWIG -set SWIG_VERSION=4.1.0 +set SWIG_VERSION=4.2.1 set DEPENDENCY_DIR=%DEPS_DIR%\swig-%SWIG_VERSION% set DEPENDENCY_INSTALL_DIR=%INSTALL_DIR%\swig-%SWIG_VERSION% echo SWIG_INSTALL_DIR=%DEPENDENCY_INSTALL_DIR%>>"%~dp0\%BUILD_DEPS_CACHE_PATH%" @@ -705,6 +752,9 @@ call :RunCMake -DCMAKE_INSTALL_PREFIX="%INSTALL_DIR%\%DEPENDENCY_INSTALL_NAME%" -DWITH_CORE_TOOLS=OFF ^ -DROCKSDB_BUILD_SHARED=OFF ^ -DWITH_ZSTD=On ^ + -DZSTD_INCLUDE_DIR="%ZSTD_INCLUDE%" ^ + -DZSTD_LIBRARY_DEBUG="%ZSTD_LIB_DEBUG%" ^ + -DZSTD_LIBRARY_RELEASE="%ZSTD_LIB_RELEASE%" ^ -DPORTABLE=1 ^ -DCMAKE_DEBUG_POSTFIX="_d" IF NOT %ERRORLEVEL%==0 GOTO :Error @@ -917,6 +967,15 @@ exit /b 0 IF NOT %ERRORLEVEL%==0 GOTO :Error exit /b 0 +:: Params: +:: - %1 - VC_VER +:: - %2 - DEPS_DIR +:: - %3 - BOOST_ROOT +:check_boost_vc145_compatibility +%PWSH_TOOLS% check_boost_vc145_compatibility "%1" "%2" "%3" +IF NOT %ERRORLEVEL%==0 GOTO :Error +exit /b 0 + :: PrintUsage - Prints usage information :PrintUsage call "%~dp0\utils\cecho.cmd" 0 10 "Requirements for a successful execution:" @@ -933,4 +992,3 @@ echo - https://msdn.microsoft.com/en-us/library/ms229859(v=vs.110).aspx echo. echo NB: This script needs to be ran from the directory directly containing it. echo. - diff --git a/win/patches/.gersemirc b/win/patches/.gersemirc new file mode 100644 index 00000000000..f64d72913d9 --- /dev/null +++ b/win/patches/.gersemirc @@ -0,0 +1 @@ +disable_formatting: true diff --git a/win/patches/V7_8_1.patch b/win/patches/V7_8_1.patch index 842a52bad64..9f185521c28 100644 --- a/win/patches/V7_8_1.patch +++ b/win/patches/V7_8_1.patch @@ -84,3 +84,16 @@ index c9399159f1..0aa55392f9 100644 endif() if (BUILD_SHARED_LIBS AND NOT "${BUILD_SHARED_LIBRARY_NAME_POSTFIX}" STREQUAL "") +diff --git a/adm/cmake/cotire.cmake b/adm/cmake/cotire.cmake +index acdca71a9f..6c6e29b374 100644 +--- a/adm/cmake/cotire.cmake ++++ b/adm/cmake/cotire.cmake +@@ -37,7 +37,7 @@ set(__COTIRE_INCLUDED TRUE) + if (NOT CMAKE_SCRIPT_MODE_FILE) + cmake_policy(PUSH) + endif() +-cmake_minimum_required(VERSION 2.8.12) ++cmake_minimum_required(VERSION 3.5) + if (NOT CMAKE_SCRIPT_MODE_FILE) + cmake_policy(POP) + endif() diff --git a/win/patches/mpfr-arm64-changes.patch b/win/patches/mpfr-arm64-changes.patch new file mode 100644 index 00000000000..82f7bbbbd64 --- /dev/null +++ b/win/patches/mpfr-arm64-changes.patch @@ -0,0 +1,26854 @@ +diff --git a/build.vs19/bench_lib/bench_lib.vcxproj b/build.vs19/bench_lib/bench_lib.vcxproj +index ceaf5abf..3447b804 100644 +--- a/build.vs19/bench_lib/bench_lib.vcxproj ++++ b/build.vs19/bench_lib/bench_lib.vcxproj +@@ -1,10 +1,18 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -32,6 +40,12 @@ + v142 + Unicode + ++ ++ Application ++ true ++ v142 ++ Unicode ++ + + Application + false +@@ -39,6 +53,13 @@ + true + Unicode + ++ ++ Application ++ false ++ v142 ++ true ++ Unicode ++ + + Application + true +@@ -60,9 +81,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -78,6 +105,11 @@ + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + ++ ++ true ++ $(SolutionDir)$(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ ++ + + true + +@@ -86,6 +118,11 @@ + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + ++ ++ false ++ $(SolutionDir)$(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ ++ + + + Level3 +@@ -118,6 +155,20 @@ + ..\..\lib\$(IntDir)\mpfr.lib;..\..\..\mpir\lib\$(IntDir)\mpir.lib;%(AdditionalDependencies) + + ++ ++ ++ ++ ++ Level3 ++ Disabled ++ WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) ++ ..\..\src;..\..\..\mpir ++ ++ ++ Console ++ ..\..\lib\$(IntDir)\mpfr.lib;..\..\..\mpir\lib\$(IntDir)\mpir.lib;%(AdditionalDependencies) ++ ++ + + + +@@ -150,6 +201,24 @@ + ..\..\lib\$(IntDir)\mpfr.lib;..\..\..\mpir\lib\$(IntDir)\mpir.lib;%(AdditionalDependencies) + + ++ ++ ++ Level3 ++ ++ ++ MaxSpeed ++ true ++ true ++ WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) ++ ..\..\src;..\..\..\mpir ++ ++ ++ Console ++ true ++ true ++ ..\..\lib\$(IntDir)\mpfr.lib;..\..\..\mpir\lib\$(IntDir)\mpir.lib;%(AdditionalDependencies) ++ ++ + + + +diff --git a/build.vs19/lib_mpfr.sln b/build.vs19/lib_mpfr.sln +index c4444383..f30891b2 100644 +--- a/build.vs19/lib_mpfr.sln ++++ b/build.vs19/lib_mpfr.sln +@@ -1,7 +1,7 @@ +  + Microsoft Visual Studio Solution File, Format Version 12.00 +-# Visual Studio 15 +-VisualStudioVersion = 15.0.27130.0 ++# Visual Studio Version 17 ++VisualStudioVersion = 17.14.36429.23 d17.14 + MinimumVisualStudioVersion = 10.0.40219.1 + Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "lib_mpfr_tests", "lib_mpfr_tests", "{610C8F32-024C-4868-B514-3F2C9AFCE83F}" + EndProject +@@ -1098,1504 +1098,2254 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ttotal_order", "lib_mpfr_te + EndProject + Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution ++ Debug|ARM64 = Debug|ARM64 + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 ++ Release|ARM64 = Release|ARM64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution ++ {96DA1C71-3895-49FA-A4F1-2775C650AF3D}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {96DA1C71-3895-49FA-A4F1-2775C650AF3D}.Debug|ARM64.Build.0 = Debug|ARM64 + {96DA1C71-3895-49FA-A4F1-2775C650AF3D}.Debug|Win32.ActiveCfg = Debug|Win32 + {96DA1C71-3895-49FA-A4F1-2775C650AF3D}.Debug|Win32.Build.0 = Debug|Win32 + {96DA1C71-3895-49FA-A4F1-2775C650AF3D}.Debug|x64.ActiveCfg = Debug|x64 + {96DA1C71-3895-49FA-A4F1-2775C650AF3D}.Debug|x64.Build.0 = Debug|x64 ++ {96DA1C71-3895-49FA-A4F1-2775C650AF3D}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {96DA1C71-3895-49FA-A4F1-2775C650AF3D}.Release|ARM64.Build.0 = Release|ARM64 + {96DA1C71-3895-49FA-A4F1-2775C650AF3D}.Release|Win32.ActiveCfg = Release|Win32 + {96DA1C71-3895-49FA-A4F1-2775C650AF3D}.Release|Win32.Build.0 = Release|Win32 + {96DA1C71-3895-49FA-A4F1-2775C650AF3D}.Release|x64.ActiveCfg = Release|x64 + {96DA1C71-3895-49FA-A4F1-2775C650AF3D}.Release|x64.Build.0 = Release|x64 ++ {D40DAE6F-7CDB-4845-AE8C-BE9A9E7E6E0F}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {D40DAE6F-7CDB-4845-AE8C-BE9A9E7E6E0F}.Debug|ARM64.Build.0 = Debug|ARM64 + {D40DAE6F-7CDB-4845-AE8C-BE9A9E7E6E0F}.Debug|Win32.ActiveCfg = Debug|Win32 + {D40DAE6F-7CDB-4845-AE8C-BE9A9E7E6E0F}.Debug|Win32.Build.0 = Debug|Win32 + {D40DAE6F-7CDB-4845-AE8C-BE9A9E7E6E0F}.Debug|x64.ActiveCfg = Debug|x64 + {D40DAE6F-7CDB-4845-AE8C-BE9A9E7E6E0F}.Debug|x64.Build.0 = Debug|x64 ++ {D40DAE6F-7CDB-4845-AE8C-BE9A9E7E6E0F}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {D40DAE6F-7CDB-4845-AE8C-BE9A9E7E6E0F}.Release|ARM64.Build.0 = Release|ARM64 + {D40DAE6F-7CDB-4845-AE8C-BE9A9E7E6E0F}.Release|Win32.ActiveCfg = Release|Win32 + {D40DAE6F-7CDB-4845-AE8C-BE9A9E7E6E0F}.Release|Win32.Build.0 = Release|Win32 + {D40DAE6F-7CDB-4845-AE8C-BE9A9E7E6E0F}.Release|x64.ActiveCfg = Release|x64 + {D40DAE6F-7CDB-4845-AE8C-BE9A9E7E6E0F}.Release|x64.Build.0 = Release|x64 ++ {DA42D428-8779-45CA-825A-BE7BE71336EC}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {DA42D428-8779-45CA-825A-BE7BE71336EC}.Debug|ARM64.Build.0 = Debug|ARM64 + {DA42D428-8779-45CA-825A-BE7BE71336EC}.Debug|Win32.ActiveCfg = Debug|Win32 + {DA42D428-8779-45CA-825A-BE7BE71336EC}.Debug|Win32.Build.0 = Debug|Win32 + {DA42D428-8779-45CA-825A-BE7BE71336EC}.Debug|x64.ActiveCfg = Debug|x64 + {DA42D428-8779-45CA-825A-BE7BE71336EC}.Debug|x64.Build.0 = Debug|x64 ++ {DA42D428-8779-45CA-825A-BE7BE71336EC}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {DA42D428-8779-45CA-825A-BE7BE71336EC}.Release|ARM64.Build.0 = Release|ARM64 + {DA42D428-8779-45CA-825A-BE7BE71336EC}.Release|Win32.ActiveCfg = Release|Win32 + {DA42D428-8779-45CA-825A-BE7BE71336EC}.Release|Win32.Build.0 = Release|Win32 + {DA42D428-8779-45CA-825A-BE7BE71336EC}.Release|x64.ActiveCfg = Release|x64 + {DA42D428-8779-45CA-825A-BE7BE71336EC}.Release|x64.Build.0 = Release|x64 ++ {92BCDA65-6B9B-4447-AA93-C47B460194AD}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {92BCDA65-6B9B-4447-AA93-C47B460194AD}.Debug|ARM64.Build.0 = Debug|ARM64 + {92BCDA65-6B9B-4447-AA93-C47B460194AD}.Debug|Win32.ActiveCfg = Debug|Win32 + {92BCDA65-6B9B-4447-AA93-C47B460194AD}.Debug|Win32.Build.0 = Debug|Win32 + {92BCDA65-6B9B-4447-AA93-C47B460194AD}.Debug|x64.ActiveCfg = Debug|x64 + {92BCDA65-6B9B-4447-AA93-C47B460194AD}.Debug|x64.Build.0 = Debug|x64 ++ {92BCDA65-6B9B-4447-AA93-C47B460194AD}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {92BCDA65-6B9B-4447-AA93-C47B460194AD}.Release|ARM64.Build.0 = Release|ARM64 + {92BCDA65-6B9B-4447-AA93-C47B460194AD}.Release|Win32.ActiveCfg = Release|Win32 + {92BCDA65-6B9B-4447-AA93-C47B460194AD}.Release|Win32.Build.0 = Release|Win32 + {92BCDA65-6B9B-4447-AA93-C47B460194AD}.Release|x64.ActiveCfg = Release|x64 + {92BCDA65-6B9B-4447-AA93-C47B460194AD}.Release|x64.Build.0 = Release|x64 ++ {09BDA649-C94B-47FA-83AF-5DB9A6AA8983}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {09BDA649-C94B-47FA-83AF-5DB9A6AA8983}.Debug|ARM64.Build.0 = Debug|ARM64 + {09BDA649-C94B-47FA-83AF-5DB9A6AA8983}.Debug|Win32.ActiveCfg = Debug|Win32 + {09BDA649-C94B-47FA-83AF-5DB9A6AA8983}.Debug|Win32.Build.0 = Debug|Win32 + {09BDA649-C94B-47FA-83AF-5DB9A6AA8983}.Debug|x64.ActiveCfg = Debug|x64 + {09BDA649-C94B-47FA-83AF-5DB9A6AA8983}.Debug|x64.Build.0 = Debug|x64 ++ {09BDA649-C94B-47FA-83AF-5DB9A6AA8983}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {09BDA649-C94B-47FA-83AF-5DB9A6AA8983}.Release|ARM64.Build.0 = Release|ARM64 + {09BDA649-C94B-47FA-83AF-5DB9A6AA8983}.Release|Win32.ActiveCfg = Release|Win32 + {09BDA649-C94B-47FA-83AF-5DB9A6AA8983}.Release|Win32.Build.0 = Release|Win32 + {09BDA649-C94B-47FA-83AF-5DB9A6AA8983}.Release|x64.ActiveCfg = Release|x64 + {09BDA649-C94B-47FA-83AF-5DB9A6AA8983}.Release|x64.Build.0 = Release|x64 ++ {09681D3D-E6F5-4B5E-8CC8-B65E6A63D43B}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {09681D3D-E6F5-4B5E-8CC8-B65E6A63D43B}.Debug|ARM64.Build.0 = Debug|ARM64 + {09681D3D-E6F5-4B5E-8CC8-B65E6A63D43B}.Debug|Win32.ActiveCfg = Debug|Win32 + {09681D3D-E6F5-4B5E-8CC8-B65E6A63D43B}.Debug|Win32.Build.0 = Debug|Win32 + {09681D3D-E6F5-4B5E-8CC8-B65E6A63D43B}.Debug|x64.ActiveCfg = Debug|x64 + {09681D3D-E6F5-4B5E-8CC8-B65E6A63D43B}.Debug|x64.Build.0 = Debug|x64 ++ {09681D3D-E6F5-4B5E-8CC8-B65E6A63D43B}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {09681D3D-E6F5-4B5E-8CC8-B65E6A63D43B}.Release|ARM64.Build.0 = Release|ARM64 + {09681D3D-E6F5-4B5E-8CC8-B65E6A63D43B}.Release|Win32.ActiveCfg = Release|Win32 + {09681D3D-E6F5-4B5E-8CC8-B65E6A63D43B}.Release|Win32.Build.0 = Release|Win32 + {09681D3D-E6F5-4B5E-8CC8-B65E6A63D43B}.Release|x64.ActiveCfg = Release|x64 + {09681D3D-E6F5-4B5E-8CC8-B65E6A63D43B}.Release|x64.Build.0 = Release|x64 ++ {017724C7-107D-4E09-AB81-635C22A1B4DF}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {017724C7-107D-4E09-AB81-635C22A1B4DF}.Debug|ARM64.Build.0 = Debug|ARM64 + {017724C7-107D-4E09-AB81-635C22A1B4DF}.Debug|Win32.ActiveCfg = Debug|Win32 + {017724C7-107D-4E09-AB81-635C22A1B4DF}.Debug|Win32.Build.0 = Debug|Win32 + {017724C7-107D-4E09-AB81-635C22A1B4DF}.Debug|x64.ActiveCfg = Debug|x64 + {017724C7-107D-4E09-AB81-635C22A1B4DF}.Debug|x64.Build.0 = Debug|x64 ++ {017724C7-107D-4E09-AB81-635C22A1B4DF}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {017724C7-107D-4E09-AB81-635C22A1B4DF}.Release|ARM64.Build.0 = Release|ARM64 + {017724C7-107D-4E09-AB81-635C22A1B4DF}.Release|Win32.ActiveCfg = Release|Win32 + {017724C7-107D-4E09-AB81-635C22A1B4DF}.Release|Win32.Build.0 = Release|Win32 + {017724C7-107D-4E09-AB81-635C22A1B4DF}.Release|x64.ActiveCfg = Release|x64 + {017724C7-107D-4E09-AB81-635C22A1B4DF}.Release|x64.Build.0 = Release|x64 ++ {366F59FE-A9B7-426E-9199-99BBAAA548FE}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {366F59FE-A9B7-426E-9199-99BBAAA548FE}.Debug|ARM64.Build.0 = Debug|ARM64 + {366F59FE-A9B7-426E-9199-99BBAAA548FE}.Debug|Win32.ActiveCfg = Debug|Win32 + {366F59FE-A9B7-426E-9199-99BBAAA548FE}.Debug|Win32.Build.0 = Debug|Win32 + {366F59FE-A9B7-426E-9199-99BBAAA548FE}.Debug|x64.ActiveCfg = Debug|x64 + {366F59FE-A9B7-426E-9199-99BBAAA548FE}.Debug|x64.Build.0 = Debug|x64 ++ {366F59FE-A9B7-426E-9199-99BBAAA548FE}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {366F59FE-A9B7-426E-9199-99BBAAA548FE}.Release|ARM64.Build.0 = Release|ARM64 + {366F59FE-A9B7-426E-9199-99BBAAA548FE}.Release|Win32.ActiveCfg = Release|Win32 + {366F59FE-A9B7-426E-9199-99BBAAA548FE}.Release|Win32.Build.0 = Release|Win32 + {366F59FE-A9B7-426E-9199-99BBAAA548FE}.Release|x64.ActiveCfg = Release|x64 + {366F59FE-A9B7-426E-9199-99BBAAA548FE}.Release|x64.Build.0 = Release|x64 ++ {FA416777-D0A2-4636-A7E1-35708380538C}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {FA416777-D0A2-4636-A7E1-35708380538C}.Debug|ARM64.Build.0 = Debug|ARM64 + {FA416777-D0A2-4636-A7E1-35708380538C}.Debug|Win32.ActiveCfg = Debug|Win32 + {FA416777-D0A2-4636-A7E1-35708380538C}.Debug|Win32.Build.0 = Debug|Win32 + {FA416777-D0A2-4636-A7E1-35708380538C}.Debug|x64.ActiveCfg = Debug|x64 + {FA416777-D0A2-4636-A7E1-35708380538C}.Debug|x64.Build.0 = Debug|x64 ++ {FA416777-D0A2-4636-A7E1-35708380538C}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {FA416777-D0A2-4636-A7E1-35708380538C}.Release|ARM64.Build.0 = Release|ARM64 + {FA416777-D0A2-4636-A7E1-35708380538C}.Release|Win32.ActiveCfg = Release|Win32 + {FA416777-D0A2-4636-A7E1-35708380538C}.Release|Win32.Build.0 = Release|Win32 + {FA416777-D0A2-4636-A7E1-35708380538C}.Release|x64.ActiveCfg = Release|x64 + {FA416777-D0A2-4636-A7E1-35708380538C}.Release|x64.Build.0 = Release|x64 ++ {8E87763F-3C5F-4902-9328-3872F425447C}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {8E87763F-3C5F-4902-9328-3872F425447C}.Debug|ARM64.Build.0 = Debug|ARM64 + {8E87763F-3C5F-4902-9328-3872F425447C}.Debug|Win32.ActiveCfg = Debug|Win32 + {8E87763F-3C5F-4902-9328-3872F425447C}.Debug|Win32.Build.0 = Debug|Win32 + {8E87763F-3C5F-4902-9328-3872F425447C}.Debug|x64.ActiveCfg = Debug|x64 + {8E87763F-3C5F-4902-9328-3872F425447C}.Debug|x64.Build.0 = Debug|x64 ++ {8E87763F-3C5F-4902-9328-3872F425447C}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {8E87763F-3C5F-4902-9328-3872F425447C}.Release|ARM64.Build.0 = Release|ARM64 + {8E87763F-3C5F-4902-9328-3872F425447C}.Release|Win32.ActiveCfg = Release|Win32 + {8E87763F-3C5F-4902-9328-3872F425447C}.Release|Win32.Build.0 = Release|Win32 + {8E87763F-3C5F-4902-9328-3872F425447C}.Release|x64.ActiveCfg = Release|x64 + {8E87763F-3C5F-4902-9328-3872F425447C}.Release|x64.Build.0 = Release|x64 ++ {A541016C-6F8A-4314-86D4-AC95878294DD}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {A541016C-6F8A-4314-86D4-AC95878294DD}.Debug|ARM64.Build.0 = Debug|ARM64 + {A541016C-6F8A-4314-86D4-AC95878294DD}.Debug|Win32.ActiveCfg = Debug|Win32 + {A541016C-6F8A-4314-86D4-AC95878294DD}.Debug|Win32.Build.0 = Debug|Win32 + {A541016C-6F8A-4314-86D4-AC95878294DD}.Debug|x64.ActiveCfg = Debug|x64 + {A541016C-6F8A-4314-86D4-AC95878294DD}.Debug|x64.Build.0 = Debug|x64 ++ {A541016C-6F8A-4314-86D4-AC95878294DD}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {A541016C-6F8A-4314-86D4-AC95878294DD}.Release|ARM64.Build.0 = Release|ARM64 + {A541016C-6F8A-4314-86D4-AC95878294DD}.Release|Win32.ActiveCfg = Release|Win32 + {A541016C-6F8A-4314-86D4-AC95878294DD}.Release|Win32.Build.0 = Release|Win32 + {A541016C-6F8A-4314-86D4-AC95878294DD}.Release|x64.ActiveCfg = Release|x64 + {A541016C-6F8A-4314-86D4-AC95878294DD}.Release|x64.Build.0 = Release|x64 ++ {1D0FB421-6CEF-4C99-9778-587EE917CDD9}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {1D0FB421-6CEF-4C99-9778-587EE917CDD9}.Debug|ARM64.Build.0 = Debug|ARM64 + {1D0FB421-6CEF-4C99-9778-587EE917CDD9}.Debug|Win32.ActiveCfg = Debug|Win32 + {1D0FB421-6CEF-4C99-9778-587EE917CDD9}.Debug|Win32.Build.0 = Debug|Win32 + {1D0FB421-6CEF-4C99-9778-587EE917CDD9}.Debug|x64.ActiveCfg = Debug|x64 + {1D0FB421-6CEF-4C99-9778-587EE917CDD9}.Debug|x64.Build.0 = Debug|x64 ++ {1D0FB421-6CEF-4C99-9778-587EE917CDD9}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {1D0FB421-6CEF-4C99-9778-587EE917CDD9}.Release|ARM64.Build.0 = Release|ARM64 + {1D0FB421-6CEF-4C99-9778-587EE917CDD9}.Release|Win32.ActiveCfg = Release|Win32 + {1D0FB421-6CEF-4C99-9778-587EE917CDD9}.Release|Win32.Build.0 = Release|Win32 + {1D0FB421-6CEF-4C99-9778-587EE917CDD9}.Release|x64.ActiveCfg = Release|x64 + {1D0FB421-6CEF-4C99-9778-587EE917CDD9}.Release|x64.Build.0 = Release|x64 ++ {EAE91382-3BDE-45F9-B784-47228C572B3F}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {EAE91382-3BDE-45F9-B784-47228C572B3F}.Debug|ARM64.Build.0 = Debug|ARM64 + {EAE91382-3BDE-45F9-B784-47228C572B3F}.Debug|Win32.ActiveCfg = Debug|Win32 + {EAE91382-3BDE-45F9-B784-47228C572B3F}.Debug|Win32.Build.0 = Debug|Win32 + {EAE91382-3BDE-45F9-B784-47228C572B3F}.Debug|x64.ActiveCfg = Debug|x64 + {EAE91382-3BDE-45F9-B784-47228C572B3F}.Debug|x64.Build.0 = Debug|x64 ++ {EAE91382-3BDE-45F9-B784-47228C572B3F}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {EAE91382-3BDE-45F9-B784-47228C572B3F}.Release|ARM64.Build.0 = Release|ARM64 + {EAE91382-3BDE-45F9-B784-47228C572B3F}.Release|Win32.ActiveCfg = Release|Win32 + {EAE91382-3BDE-45F9-B784-47228C572B3F}.Release|Win32.Build.0 = Release|Win32 + {EAE91382-3BDE-45F9-B784-47228C572B3F}.Release|x64.ActiveCfg = Release|x64 + {EAE91382-3BDE-45F9-B784-47228C572B3F}.Release|x64.Build.0 = Release|x64 ++ {FEC1769E-F942-4564-892C-CF5A68967153}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {FEC1769E-F942-4564-892C-CF5A68967153}.Debug|ARM64.Build.0 = Debug|ARM64 + {FEC1769E-F942-4564-892C-CF5A68967153}.Debug|Win32.ActiveCfg = Debug|Win32 + {FEC1769E-F942-4564-892C-CF5A68967153}.Debug|Win32.Build.0 = Debug|Win32 + {FEC1769E-F942-4564-892C-CF5A68967153}.Debug|x64.ActiveCfg = Debug|x64 + {FEC1769E-F942-4564-892C-CF5A68967153}.Debug|x64.Build.0 = Debug|x64 ++ {FEC1769E-F942-4564-892C-CF5A68967153}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {FEC1769E-F942-4564-892C-CF5A68967153}.Release|ARM64.Build.0 = Release|ARM64 + {FEC1769E-F942-4564-892C-CF5A68967153}.Release|Win32.ActiveCfg = Release|Win32 + {FEC1769E-F942-4564-892C-CF5A68967153}.Release|Win32.Build.0 = Release|Win32 + {FEC1769E-F942-4564-892C-CF5A68967153}.Release|x64.ActiveCfg = Release|x64 + {FEC1769E-F942-4564-892C-CF5A68967153}.Release|x64.Build.0 = Release|x64 ++ {034672AB-E2D5-4CB9-9A27-77E5B9037B5E}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {034672AB-E2D5-4CB9-9A27-77E5B9037B5E}.Debug|ARM64.Build.0 = Debug|ARM64 + {034672AB-E2D5-4CB9-9A27-77E5B9037B5E}.Debug|Win32.ActiveCfg = Debug|Win32 + {034672AB-E2D5-4CB9-9A27-77E5B9037B5E}.Debug|Win32.Build.0 = Debug|Win32 + {034672AB-E2D5-4CB9-9A27-77E5B9037B5E}.Debug|x64.ActiveCfg = Debug|x64 + {034672AB-E2D5-4CB9-9A27-77E5B9037B5E}.Debug|x64.Build.0 = Debug|x64 ++ {034672AB-E2D5-4CB9-9A27-77E5B9037B5E}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {034672AB-E2D5-4CB9-9A27-77E5B9037B5E}.Release|ARM64.Build.0 = Release|ARM64 + {034672AB-E2D5-4CB9-9A27-77E5B9037B5E}.Release|Win32.ActiveCfg = Release|Win32 + {034672AB-E2D5-4CB9-9A27-77E5B9037B5E}.Release|Win32.Build.0 = Release|Win32 + {034672AB-E2D5-4CB9-9A27-77E5B9037B5E}.Release|x64.ActiveCfg = Release|x64 + {034672AB-E2D5-4CB9-9A27-77E5B9037B5E}.Release|x64.Build.0 = Release|x64 ++ {FE6341F9-E211-45EA-92B4-D5784A53447B}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {FE6341F9-E211-45EA-92B4-D5784A53447B}.Debug|ARM64.Build.0 = Debug|ARM64 + {FE6341F9-E211-45EA-92B4-D5784A53447B}.Debug|Win32.ActiveCfg = Debug|Win32 + {FE6341F9-E211-45EA-92B4-D5784A53447B}.Debug|Win32.Build.0 = Debug|Win32 + {FE6341F9-E211-45EA-92B4-D5784A53447B}.Debug|x64.ActiveCfg = Debug|x64 + {FE6341F9-E211-45EA-92B4-D5784A53447B}.Debug|x64.Build.0 = Debug|x64 ++ {FE6341F9-E211-45EA-92B4-D5784A53447B}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {FE6341F9-E211-45EA-92B4-D5784A53447B}.Release|ARM64.Build.0 = Release|ARM64 + {FE6341F9-E211-45EA-92B4-D5784A53447B}.Release|Win32.ActiveCfg = Release|Win32 + {FE6341F9-E211-45EA-92B4-D5784A53447B}.Release|Win32.Build.0 = Release|Win32 + {FE6341F9-E211-45EA-92B4-D5784A53447B}.Release|x64.ActiveCfg = Release|x64 + {FE6341F9-E211-45EA-92B4-D5784A53447B}.Release|x64.Build.0 = Release|x64 ++ {D75E6142-D7D7-4F85-9D58-77BCD6B64F99}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {D75E6142-D7D7-4F85-9D58-77BCD6B64F99}.Debug|ARM64.Build.0 = Debug|ARM64 + {D75E6142-D7D7-4F85-9D58-77BCD6B64F99}.Debug|Win32.ActiveCfg = Debug|Win32 + {D75E6142-D7D7-4F85-9D58-77BCD6B64F99}.Debug|Win32.Build.0 = Debug|Win32 + {D75E6142-D7D7-4F85-9D58-77BCD6B64F99}.Debug|x64.ActiveCfg = Debug|x64 + {D75E6142-D7D7-4F85-9D58-77BCD6B64F99}.Debug|x64.Build.0 = Debug|x64 ++ {D75E6142-D7D7-4F85-9D58-77BCD6B64F99}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {D75E6142-D7D7-4F85-9D58-77BCD6B64F99}.Release|ARM64.Build.0 = Release|ARM64 + {D75E6142-D7D7-4F85-9D58-77BCD6B64F99}.Release|Win32.ActiveCfg = Release|Win32 + {D75E6142-D7D7-4F85-9D58-77BCD6B64F99}.Release|Win32.Build.0 = Release|Win32 + {D75E6142-D7D7-4F85-9D58-77BCD6B64F99}.Release|x64.ActiveCfg = Release|x64 + {D75E6142-D7D7-4F85-9D58-77BCD6B64F99}.Release|x64.Build.0 = Release|x64 ++ {F49E86B3-8F94-4CDE-95A3-B1D895A3D86F}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {F49E86B3-8F94-4CDE-95A3-B1D895A3D86F}.Debug|ARM64.Build.0 = Debug|ARM64 + {F49E86B3-8F94-4CDE-95A3-B1D895A3D86F}.Debug|Win32.ActiveCfg = Debug|Win32 + {F49E86B3-8F94-4CDE-95A3-B1D895A3D86F}.Debug|Win32.Build.0 = Debug|Win32 + {F49E86B3-8F94-4CDE-95A3-B1D895A3D86F}.Debug|x64.ActiveCfg = Debug|x64 + {F49E86B3-8F94-4CDE-95A3-B1D895A3D86F}.Debug|x64.Build.0 = Debug|x64 ++ {F49E86B3-8F94-4CDE-95A3-B1D895A3D86F}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {F49E86B3-8F94-4CDE-95A3-B1D895A3D86F}.Release|ARM64.Build.0 = Release|ARM64 + {F49E86B3-8F94-4CDE-95A3-B1D895A3D86F}.Release|Win32.ActiveCfg = Release|Win32 + {F49E86B3-8F94-4CDE-95A3-B1D895A3D86F}.Release|Win32.Build.0 = Release|Win32 + {F49E86B3-8F94-4CDE-95A3-B1D895A3D86F}.Release|x64.ActiveCfg = Release|x64 + {F49E86B3-8F94-4CDE-95A3-B1D895A3D86F}.Release|x64.Build.0 = Release|x64 ++ {5496E6C5-E041-4FE5-9414-4A0121212452}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {5496E6C5-E041-4FE5-9414-4A0121212452}.Debug|ARM64.Build.0 = Debug|ARM64 + {5496E6C5-E041-4FE5-9414-4A0121212452}.Debug|Win32.ActiveCfg = Debug|Win32 + {5496E6C5-E041-4FE5-9414-4A0121212452}.Debug|Win32.Build.0 = Debug|Win32 + {5496E6C5-E041-4FE5-9414-4A0121212452}.Debug|x64.ActiveCfg = Debug|x64 + {5496E6C5-E041-4FE5-9414-4A0121212452}.Debug|x64.Build.0 = Debug|x64 ++ {5496E6C5-E041-4FE5-9414-4A0121212452}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {5496E6C5-E041-4FE5-9414-4A0121212452}.Release|ARM64.Build.0 = Release|ARM64 + {5496E6C5-E041-4FE5-9414-4A0121212452}.Release|Win32.ActiveCfg = Release|Win32 + {5496E6C5-E041-4FE5-9414-4A0121212452}.Release|Win32.Build.0 = Release|Win32 + {5496E6C5-E041-4FE5-9414-4A0121212452}.Release|x64.ActiveCfg = Release|x64 + {5496E6C5-E041-4FE5-9414-4A0121212452}.Release|x64.Build.0 = Release|x64 ++ {5E26BF9C-6CBE-4A13-B5DF-229C738CE813}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {5E26BF9C-6CBE-4A13-B5DF-229C738CE813}.Debug|ARM64.Build.0 = Debug|ARM64 + {5E26BF9C-6CBE-4A13-B5DF-229C738CE813}.Debug|Win32.ActiveCfg = Debug|Win32 + {5E26BF9C-6CBE-4A13-B5DF-229C738CE813}.Debug|Win32.Build.0 = Debug|Win32 + {5E26BF9C-6CBE-4A13-B5DF-229C738CE813}.Debug|x64.ActiveCfg = Debug|x64 + {5E26BF9C-6CBE-4A13-B5DF-229C738CE813}.Debug|x64.Build.0 = Debug|x64 ++ {5E26BF9C-6CBE-4A13-B5DF-229C738CE813}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {5E26BF9C-6CBE-4A13-B5DF-229C738CE813}.Release|ARM64.Build.0 = Release|ARM64 + {5E26BF9C-6CBE-4A13-B5DF-229C738CE813}.Release|Win32.ActiveCfg = Release|Win32 + {5E26BF9C-6CBE-4A13-B5DF-229C738CE813}.Release|Win32.Build.0 = Release|Win32 + {5E26BF9C-6CBE-4A13-B5DF-229C738CE813}.Release|x64.ActiveCfg = Release|x64 + {5E26BF9C-6CBE-4A13-B5DF-229C738CE813}.Release|x64.Build.0 = Release|x64 ++ {4501C9A9-EF51-43A8-A017-620B86BE4B14}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {4501C9A9-EF51-43A8-A017-620B86BE4B14}.Debug|ARM64.Build.0 = Debug|ARM64 + {4501C9A9-EF51-43A8-A017-620B86BE4B14}.Debug|Win32.ActiveCfg = Debug|Win32 + {4501C9A9-EF51-43A8-A017-620B86BE4B14}.Debug|Win32.Build.0 = Debug|Win32 + {4501C9A9-EF51-43A8-A017-620B86BE4B14}.Debug|x64.ActiveCfg = Debug|x64 + {4501C9A9-EF51-43A8-A017-620B86BE4B14}.Debug|x64.Build.0 = Debug|x64 ++ {4501C9A9-EF51-43A8-A017-620B86BE4B14}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {4501C9A9-EF51-43A8-A017-620B86BE4B14}.Release|ARM64.Build.0 = Release|ARM64 + {4501C9A9-EF51-43A8-A017-620B86BE4B14}.Release|Win32.ActiveCfg = Release|Win32 + {4501C9A9-EF51-43A8-A017-620B86BE4B14}.Release|Win32.Build.0 = Release|Win32 + {4501C9A9-EF51-43A8-A017-620B86BE4B14}.Release|x64.ActiveCfg = Release|x64 + {4501C9A9-EF51-43A8-A017-620B86BE4B14}.Release|x64.Build.0 = Release|x64 ++ {56A453CE-2E66-4378-94C1-E5AA27B8941F}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {56A453CE-2E66-4378-94C1-E5AA27B8941F}.Debug|ARM64.Build.0 = Debug|ARM64 + {56A453CE-2E66-4378-94C1-E5AA27B8941F}.Debug|Win32.ActiveCfg = Debug|Win32 + {56A453CE-2E66-4378-94C1-E5AA27B8941F}.Debug|Win32.Build.0 = Debug|Win32 + {56A453CE-2E66-4378-94C1-E5AA27B8941F}.Debug|x64.ActiveCfg = Debug|x64 + {56A453CE-2E66-4378-94C1-E5AA27B8941F}.Debug|x64.Build.0 = Debug|x64 ++ {56A453CE-2E66-4378-94C1-E5AA27B8941F}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {56A453CE-2E66-4378-94C1-E5AA27B8941F}.Release|ARM64.Build.0 = Release|ARM64 + {56A453CE-2E66-4378-94C1-E5AA27B8941F}.Release|Win32.ActiveCfg = Release|Win32 + {56A453CE-2E66-4378-94C1-E5AA27B8941F}.Release|Win32.Build.0 = Release|Win32 + {56A453CE-2E66-4378-94C1-E5AA27B8941F}.Release|x64.ActiveCfg = Release|x64 + {56A453CE-2E66-4378-94C1-E5AA27B8941F}.Release|x64.Build.0 = Release|x64 ++ {B35E3F13-8512-4DF1-8B85-22F1A041F1E7}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {B35E3F13-8512-4DF1-8B85-22F1A041F1E7}.Debug|ARM64.Build.0 = Debug|ARM64 + {B35E3F13-8512-4DF1-8B85-22F1A041F1E7}.Debug|Win32.ActiveCfg = Debug|Win32 + {B35E3F13-8512-4DF1-8B85-22F1A041F1E7}.Debug|Win32.Build.0 = Debug|Win32 + {B35E3F13-8512-4DF1-8B85-22F1A041F1E7}.Debug|x64.ActiveCfg = Debug|x64 + {B35E3F13-8512-4DF1-8B85-22F1A041F1E7}.Debug|x64.Build.0 = Debug|x64 ++ {B35E3F13-8512-4DF1-8B85-22F1A041F1E7}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {B35E3F13-8512-4DF1-8B85-22F1A041F1E7}.Release|ARM64.Build.0 = Release|ARM64 + {B35E3F13-8512-4DF1-8B85-22F1A041F1E7}.Release|Win32.ActiveCfg = Release|Win32 + {B35E3F13-8512-4DF1-8B85-22F1A041F1E7}.Release|Win32.Build.0 = Release|Win32 + {B35E3F13-8512-4DF1-8B85-22F1A041F1E7}.Release|x64.ActiveCfg = Release|x64 + {B35E3F13-8512-4DF1-8B85-22F1A041F1E7}.Release|x64.Build.0 = Release|x64 ++ {E8C21063-72AF-49EA-A1BD-D9B7A42D3FB9}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {E8C21063-72AF-49EA-A1BD-D9B7A42D3FB9}.Debug|ARM64.Build.0 = Debug|ARM64 + {E8C21063-72AF-49EA-A1BD-D9B7A42D3FB9}.Debug|Win32.ActiveCfg = Debug|Win32 + {E8C21063-72AF-49EA-A1BD-D9B7A42D3FB9}.Debug|Win32.Build.0 = Debug|Win32 + {E8C21063-72AF-49EA-A1BD-D9B7A42D3FB9}.Debug|x64.ActiveCfg = Debug|x64 + {E8C21063-72AF-49EA-A1BD-D9B7A42D3FB9}.Debug|x64.Build.0 = Debug|x64 ++ {E8C21063-72AF-49EA-A1BD-D9B7A42D3FB9}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {E8C21063-72AF-49EA-A1BD-D9B7A42D3FB9}.Release|ARM64.Build.0 = Release|ARM64 + {E8C21063-72AF-49EA-A1BD-D9B7A42D3FB9}.Release|Win32.ActiveCfg = Release|Win32 + {E8C21063-72AF-49EA-A1BD-D9B7A42D3FB9}.Release|Win32.Build.0 = Release|Win32 + {E8C21063-72AF-49EA-A1BD-D9B7A42D3FB9}.Release|x64.ActiveCfg = Release|x64 + {E8C21063-72AF-49EA-A1BD-D9B7A42D3FB9}.Release|x64.Build.0 = Release|x64 ++ {3FB4F222-0CBD-4D15-B967-A2582254C31C}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {3FB4F222-0CBD-4D15-B967-A2582254C31C}.Debug|ARM64.Build.0 = Debug|ARM64 + {3FB4F222-0CBD-4D15-B967-A2582254C31C}.Debug|Win32.ActiveCfg = Debug|Win32 + {3FB4F222-0CBD-4D15-B967-A2582254C31C}.Debug|Win32.Build.0 = Debug|Win32 + {3FB4F222-0CBD-4D15-B967-A2582254C31C}.Debug|x64.ActiveCfg = Debug|x64 + {3FB4F222-0CBD-4D15-B967-A2582254C31C}.Debug|x64.Build.0 = Debug|x64 ++ {3FB4F222-0CBD-4D15-B967-A2582254C31C}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {3FB4F222-0CBD-4D15-B967-A2582254C31C}.Release|ARM64.Build.0 = Release|ARM64 + {3FB4F222-0CBD-4D15-B967-A2582254C31C}.Release|Win32.ActiveCfg = Release|Win32 + {3FB4F222-0CBD-4D15-B967-A2582254C31C}.Release|Win32.Build.0 = Release|Win32 + {3FB4F222-0CBD-4D15-B967-A2582254C31C}.Release|x64.ActiveCfg = Release|x64 + {3FB4F222-0CBD-4D15-B967-A2582254C31C}.Release|x64.Build.0 = Release|x64 ++ {5E12295C-00AA-4078-8F39-BB563E650D86}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {5E12295C-00AA-4078-8F39-BB563E650D86}.Debug|ARM64.Build.0 = Debug|ARM64 + {5E12295C-00AA-4078-8F39-BB563E650D86}.Debug|Win32.ActiveCfg = Debug|Win32 + {5E12295C-00AA-4078-8F39-BB563E650D86}.Debug|Win32.Build.0 = Debug|Win32 + {5E12295C-00AA-4078-8F39-BB563E650D86}.Debug|x64.ActiveCfg = Debug|x64 + {5E12295C-00AA-4078-8F39-BB563E650D86}.Debug|x64.Build.0 = Debug|x64 ++ {5E12295C-00AA-4078-8F39-BB563E650D86}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {5E12295C-00AA-4078-8F39-BB563E650D86}.Release|ARM64.Build.0 = Release|ARM64 + {5E12295C-00AA-4078-8F39-BB563E650D86}.Release|Win32.ActiveCfg = Release|Win32 + {5E12295C-00AA-4078-8F39-BB563E650D86}.Release|Win32.Build.0 = Release|Win32 + {5E12295C-00AA-4078-8F39-BB563E650D86}.Release|x64.ActiveCfg = Release|x64 + {5E12295C-00AA-4078-8F39-BB563E650D86}.Release|x64.Build.0 = Release|x64 ++ {E580BC14-0DC6-4D4E-B0EC-E0124812886F}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {E580BC14-0DC6-4D4E-B0EC-E0124812886F}.Debug|ARM64.Build.0 = Debug|ARM64 + {E580BC14-0DC6-4D4E-B0EC-E0124812886F}.Debug|Win32.ActiveCfg = Debug|Win32 + {E580BC14-0DC6-4D4E-B0EC-E0124812886F}.Debug|Win32.Build.0 = Debug|Win32 + {E580BC14-0DC6-4D4E-B0EC-E0124812886F}.Debug|x64.ActiveCfg = Debug|x64 + {E580BC14-0DC6-4D4E-B0EC-E0124812886F}.Debug|x64.Build.0 = Debug|x64 ++ {E580BC14-0DC6-4D4E-B0EC-E0124812886F}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {E580BC14-0DC6-4D4E-B0EC-E0124812886F}.Release|ARM64.Build.0 = Release|ARM64 + {E580BC14-0DC6-4D4E-B0EC-E0124812886F}.Release|Win32.ActiveCfg = Release|Win32 + {E580BC14-0DC6-4D4E-B0EC-E0124812886F}.Release|Win32.Build.0 = Release|Win32 + {E580BC14-0DC6-4D4E-B0EC-E0124812886F}.Release|x64.ActiveCfg = Release|x64 + {E580BC14-0DC6-4D4E-B0EC-E0124812886F}.Release|x64.Build.0 = Release|x64 ++ {194DD0B4-DE77-4697-B629-D6FF7DDCA65D}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {194DD0B4-DE77-4697-B629-D6FF7DDCA65D}.Debug|ARM64.Build.0 = Debug|ARM64 + {194DD0B4-DE77-4697-B629-D6FF7DDCA65D}.Debug|Win32.ActiveCfg = Debug|Win32 + {194DD0B4-DE77-4697-B629-D6FF7DDCA65D}.Debug|Win32.Build.0 = Debug|Win32 + {194DD0B4-DE77-4697-B629-D6FF7DDCA65D}.Debug|x64.ActiveCfg = Debug|x64 + {194DD0B4-DE77-4697-B629-D6FF7DDCA65D}.Debug|x64.Build.0 = Debug|x64 ++ {194DD0B4-DE77-4697-B629-D6FF7DDCA65D}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {194DD0B4-DE77-4697-B629-D6FF7DDCA65D}.Release|ARM64.Build.0 = Release|ARM64 + {194DD0B4-DE77-4697-B629-D6FF7DDCA65D}.Release|Win32.ActiveCfg = Release|Win32 + {194DD0B4-DE77-4697-B629-D6FF7DDCA65D}.Release|Win32.Build.0 = Release|Win32 + {194DD0B4-DE77-4697-B629-D6FF7DDCA65D}.Release|x64.ActiveCfg = Release|x64 + {194DD0B4-DE77-4697-B629-D6FF7DDCA65D}.Release|x64.Build.0 = Release|x64 ++ {677A8D67-7853-47E6-AE8B-5F8B40129DF3}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {677A8D67-7853-47E6-AE8B-5F8B40129DF3}.Debug|ARM64.Build.0 = Debug|ARM64 + {677A8D67-7853-47E6-AE8B-5F8B40129DF3}.Debug|Win32.ActiveCfg = Debug|Win32 + {677A8D67-7853-47E6-AE8B-5F8B40129DF3}.Debug|Win32.Build.0 = Debug|Win32 + {677A8D67-7853-47E6-AE8B-5F8B40129DF3}.Debug|x64.ActiveCfg = Debug|x64 + {677A8D67-7853-47E6-AE8B-5F8B40129DF3}.Debug|x64.Build.0 = Debug|x64 ++ {677A8D67-7853-47E6-AE8B-5F8B40129DF3}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {677A8D67-7853-47E6-AE8B-5F8B40129DF3}.Release|ARM64.Build.0 = Release|ARM64 + {677A8D67-7853-47E6-AE8B-5F8B40129DF3}.Release|Win32.ActiveCfg = Release|Win32 + {677A8D67-7853-47E6-AE8B-5F8B40129DF3}.Release|Win32.Build.0 = Release|Win32 + {677A8D67-7853-47E6-AE8B-5F8B40129DF3}.Release|x64.ActiveCfg = Release|x64 + {677A8D67-7853-47E6-AE8B-5F8B40129DF3}.Release|x64.Build.0 = Release|x64 ++ {A203C619-D9AC-4E6A-A96B-A8C2480ABA2B}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {A203C619-D9AC-4E6A-A96B-A8C2480ABA2B}.Debug|ARM64.Build.0 = Debug|ARM64 + {A203C619-D9AC-4E6A-A96B-A8C2480ABA2B}.Debug|Win32.ActiveCfg = Debug|Win32 + {A203C619-D9AC-4E6A-A96B-A8C2480ABA2B}.Debug|Win32.Build.0 = Debug|Win32 + {A203C619-D9AC-4E6A-A96B-A8C2480ABA2B}.Debug|x64.ActiveCfg = Debug|x64 + {A203C619-D9AC-4E6A-A96B-A8C2480ABA2B}.Debug|x64.Build.0 = Debug|x64 ++ {A203C619-D9AC-4E6A-A96B-A8C2480ABA2B}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {A203C619-D9AC-4E6A-A96B-A8C2480ABA2B}.Release|ARM64.Build.0 = Release|ARM64 + {A203C619-D9AC-4E6A-A96B-A8C2480ABA2B}.Release|Win32.ActiveCfg = Release|Win32 + {A203C619-D9AC-4E6A-A96B-A8C2480ABA2B}.Release|Win32.Build.0 = Release|Win32 + {A203C619-D9AC-4E6A-A96B-A8C2480ABA2B}.Release|x64.ActiveCfg = Release|x64 + {A203C619-D9AC-4E6A-A96B-A8C2480ABA2B}.Release|x64.Build.0 = Release|x64 ++ {14963081-DA64-4F44-9F58-612E8C71E9F0}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {14963081-DA64-4F44-9F58-612E8C71E9F0}.Debug|ARM64.Build.0 = Debug|ARM64 + {14963081-DA64-4F44-9F58-612E8C71E9F0}.Debug|Win32.ActiveCfg = Debug|Win32 + {14963081-DA64-4F44-9F58-612E8C71E9F0}.Debug|Win32.Build.0 = Debug|Win32 + {14963081-DA64-4F44-9F58-612E8C71E9F0}.Debug|x64.ActiveCfg = Debug|x64 + {14963081-DA64-4F44-9F58-612E8C71E9F0}.Debug|x64.Build.0 = Debug|x64 ++ {14963081-DA64-4F44-9F58-612E8C71E9F0}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {14963081-DA64-4F44-9F58-612E8C71E9F0}.Release|ARM64.Build.0 = Release|ARM64 + {14963081-DA64-4F44-9F58-612E8C71E9F0}.Release|Win32.ActiveCfg = Release|Win32 + {14963081-DA64-4F44-9F58-612E8C71E9F0}.Release|Win32.Build.0 = Release|Win32 + {14963081-DA64-4F44-9F58-612E8C71E9F0}.Release|x64.ActiveCfg = Release|x64 + {14963081-DA64-4F44-9F58-612E8C71E9F0}.Release|x64.Build.0 = Release|x64 ++ {8B188707-F923-4055-B92B-0E8D909460A9}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {8B188707-F923-4055-B92B-0E8D909460A9}.Debug|ARM64.Build.0 = Debug|ARM64 + {8B188707-F923-4055-B92B-0E8D909460A9}.Debug|Win32.ActiveCfg = Debug|Win32 + {8B188707-F923-4055-B92B-0E8D909460A9}.Debug|Win32.Build.0 = Debug|Win32 + {8B188707-F923-4055-B92B-0E8D909460A9}.Debug|x64.ActiveCfg = Debug|x64 + {8B188707-F923-4055-B92B-0E8D909460A9}.Debug|x64.Build.0 = Debug|x64 ++ {8B188707-F923-4055-B92B-0E8D909460A9}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {8B188707-F923-4055-B92B-0E8D909460A9}.Release|ARM64.Build.0 = Release|ARM64 + {8B188707-F923-4055-B92B-0E8D909460A9}.Release|Win32.ActiveCfg = Release|Win32 + {8B188707-F923-4055-B92B-0E8D909460A9}.Release|Win32.Build.0 = Release|Win32 + {8B188707-F923-4055-B92B-0E8D909460A9}.Release|x64.ActiveCfg = Release|x64 + {8B188707-F923-4055-B92B-0E8D909460A9}.Release|x64.Build.0 = Release|x64 ++ {937CA6A8-068B-4E11-A6C7-DBE3783600C4}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {937CA6A8-068B-4E11-A6C7-DBE3783600C4}.Debug|ARM64.Build.0 = Debug|ARM64 + {937CA6A8-068B-4E11-A6C7-DBE3783600C4}.Debug|Win32.ActiveCfg = Debug|Win32 + {937CA6A8-068B-4E11-A6C7-DBE3783600C4}.Debug|Win32.Build.0 = Debug|Win32 + {937CA6A8-068B-4E11-A6C7-DBE3783600C4}.Debug|x64.ActiveCfg = Debug|x64 + {937CA6A8-068B-4E11-A6C7-DBE3783600C4}.Debug|x64.Build.0 = Debug|x64 ++ {937CA6A8-068B-4E11-A6C7-DBE3783600C4}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {937CA6A8-068B-4E11-A6C7-DBE3783600C4}.Release|ARM64.Build.0 = Release|ARM64 + {937CA6A8-068B-4E11-A6C7-DBE3783600C4}.Release|Win32.ActiveCfg = Release|Win32 + {937CA6A8-068B-4E11-A6C7-DBE3783600C4}.Release|Win32.Build.0 = Release|Win32 + {937CA6A8-068B-4E11-A6C7-DBE3783600C4}.Release|x64.ActiveCfg = Release|x64 + {937CA6A8-068B-4E11-A6C7-DBE3783600C4}.Release|x64.Build.0 = Release|x64 ++ {75CB1254-66B7-40B0-83E1-146C82043392}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {75CB1254-66B7-40B0-83E1-146C82043392}.Debug|ARM64.Build.0 = Debug|ARM64 + {75CB1254-66B7-40B0-83E1-146C82043392}.Debug|Win32.ActiveCfg = Debug|Win32 + {75CB1254-66B7-40B0-83E1-146C82043392}.Debug|Win32.Build.0 = Debug|Win32 + {75CB1254-66B7-40B0-83E1-146C82043392}.Debug|x64.ActiveCfg = Debug|x64 + {75CB1254-66B7-40B0-83E1-146C82043392}.Debug|x64.Build.0 = Debug|x64 ++ {75CB1254-66B7-40B0-83E1-146C82043392}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {75CB1254-66B7-40B0-83E1-146C82043392}.Release|ARM64.Build.0 = Release|ARM64 + {75CB1254-66B7-40B0-83E1-146C82043392}.Release|Win32.ActiveCfg = Release|Win32 + {75CB1254-66B7-40B0-83E1-146C82043392}.Release|Win32.Build.0 = Release|Win32 + {75CB1254-66B7-40B0-83E1-146C82043392}.Release|x64.ActiveCfg = Release|x64 + {75CB1254-66B7-40B0-83E1-146C82043392}.Release|x64.Build.0 = Release|x64 ++ {8E9FE9AB-FDF6-412C-997E-1926F45BDD85}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {8E9FE9AB-FDF6-412C-997E-1926F45BDD85}.Debug|ARM64.Build.0 = Debug|ARM64 + {8E9FE9AB-FDF6-412C-997E-1926F45BDD85}.Debug|Win32.ActiveCfg = Debug|Win32 + {8E9FE9AB-FDF6-412C-997E-1926F45BDD85}.Debug|Win32.Build.0 = Debug|Win32 + {8E9FE9AB-FDF6-412C-997E-1926F45BDD85}.Debug|x64.ActiveCfg = Debug|x64 + {8E9FE9AB-FDF6-412C-997E-1926F45BDD85}.Debug|x64.Build.0 = Debug|x64 ++ {8E9FE9AB-FDF6-412C-997E-1926F45BDD85}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {8E9FE9AB-FDF6-412C-997E-1926F45BDD85}.Release|ARM64.Build.0 = Release|ARM64 + {8E9FE9AB-FDF6-412C-997E-1926F45BDD85}.Release|Win32.ActiveCfg = Release|Win32 + {8E9FE9AB-FDF6-412C-997E-1926F45BDD85}.Release|Win32.Build.0 = Release|Win32 + {8E9FE9AB-FDF6-412C-997E-1926F45BDD85}.Release|x64.ActiveCfg = Release|x64 + {8E9FE9AB-FDF6-412C-997E-1926F45BDD85}.Release|x64.Build.0 = Release|x64 ++ {502DB345-C8D1-4555-87B2-39E890E9EA4E}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {502DB345-C8D1-4555-87B2-39E890E9EA4E}.Debug|ARM64.Build.0 = Debug|ARM64 + {502DB345-C8D1-4555-87B2-39E890E9EA4E}.Debug|Win32.ActiveCfg = Debug|Win32 + {502DB345-C8D1-4555-87B2-39E890E9EA4E}.Debug|Win32.Build.0 = Debug|Win32 + {502DB345-C8D1-4555-87B2-39E890E9EA4E}.Debug|x64.ActiveCfg = Debug|x64 + {502DB345-C8D1-4555-87B2-39E890E9EA4E}.Debug|x64.Build.0 = Debug|x64 ++ {502DB345-C8D1-4555-87B2-39E890E9EA4E}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {502DB345-C8D1-4555-87B2-39E890E9EA4E}.Release|ARM64.Build.0 = Release|ARM64 + {502DB345-C8D1-4555-87B2-39E890E9EA4E}.Release|Win32.ActiveCfg = Release|Win32 + {502DB345-C8D1-4555-87B2-39E890E9EA4E}.Release|Win32.Build.0 = Release|Win32 + {502DB345-C8D1-4555-87B2-39E890E9EA4E}.Release|x64.ActiveCfg = Release|x64 + {502DB345-C8D1-4555-87B2-39E890E9EA4E}.Release|x64.Build.0 = Release|x64 ++ {C47034AB-1F38-43EC-9EE5-FF8D51F5C39B}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {C47034AB-1F38-43EC-9EE5-FF8D51F5C39B}.Debug|ARM64.Build.0 = Debug|ARM64 + {C47034AB-1F38-43EC-9EE5-FF8D51F5C39B}.Debug|Win32.ActiveCfg = Debug|Win32 + {C47034AB-1F38-43EC-9EE5-FF8D51F5C39B}.Debug|Win32.Build.0 = Debug|Win32 + {C47034AB-1F38-43EC-9EE5-FF8D51F5C39B}.Debug|x64.ActiveCfg = Debug|x64 + {C47034AB-1F38-43EC-9EE5-FF8D51F5C39B}.Debug|x64.Build.0 = Debug|x64 ++ {C47034AB-1F38-43EC-9EE5-FF8D51F5C39B}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {C47034AB-1F38-43EC-9EE5-FF8D51F5C39B}.Release|ARM64.Build.0 = Release|ARM64 + {C47034AB-1F38-43EC-9EE5-FF8D51F5C39B}.Release|Win32.ActiveCfg = Release|Win32 + {C47034AB-1F38-43EC-9EE5-FF8D51F5C39B}.Release|Win32.Build.0 = Release|Win32 + {C47034AB-1F38-43EC-9EE5-FF8D51F5C39B}.Release|x64.ActiveCfg = Release|x64 + {C47034AB-1F38-43EC-9EE5-FF8D51F5C39B}.Release|x64.Build.0 = Release|x64 ++ {BF983093-3FD9-457F-8DE1-1F50B92536C4}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {BF983093-3FD9-457F-8DE1-1F50B92536C4}.Debug|ARM64.Build.0 = Debug|ARM64 + {BF983093-3FD9-457F-8DE1-1F50B92536C4}.Debug|Win32.ActiveCfg = Debug|Win32 + {BF983093-3FD9-457F-8DE1-1F50B92536C4}.Debug|Win32.Build.0 = Debug|Win32 + {BF983093-3FD9-457F-8DE1-1F50B92536C4}.Debug|x64.ActiveCfg = Debug|x64 + {BF983093-3FD9-457F-8DE1-1F50B92536C4}.Debug|x64.Build.0 = Debug|x64 ++ {BF983093-3FD9-457F-8DE1-1F50B92536C4}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {BF983093-3FD9-457F-8DE1-1F50B92536C4}.Release|ARM64.Build.0 = Release|ARM64 + {BF983093-3FD9-457F-8DE1-1F50B92536C4}.Release|Win32.ActiveCfg = Release|Win32 + {BF983093-3FD9-457F-8DE1-1F50B92536C4}.Release|Win32.Build.0 = Release|Win32 + {BF983093-3FD9-457F-8DE1-1F50B92536C4}.Release|x64.ActiveCfg = Release|x64 + {BF983093-3FD9-457F-8DE1-1F50B92536C4}.Release|x64.Build.0 = Release|x64 ++ {8772B3A3-F33A-4174-8006-C72DC40DE189}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {8772B3A3-F33A-4174-8006-C72DC40DE189}.Debug|ARM64.Build.0 = Debug|ARM64 + {8772B3A3-F33A-4174-8006-C72DC40DE189}.Debug|Win32.ActiveCfg = Debug|Win32 + {8772B3A3-F33A-4174-8006-C72DC40DE189}.Debug|Win32.Build.0 = Debug|Win32 + {8772B3A3-F33A-4174-8006-C72DC40DE189}.Debug|x64.ActiveCfg = Debug|x64 + {8772B3A3-F33A-4174-8006-C72DC40DE189}.Debug|x64.Build.0 = Debug|x64 ++ {8772B3A3-F33A-4174-8006-C72DC40DE189}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {8772B3A3-F33A-4174-8006-C72DC40DE189}.Release|ARM64.Build.0 = Release|ARM64 + {8772B3A3-F33A-4174-8006-C72DC40DE189}.Release|Win32.ActiveCfg = Release|Win32 + {8772B3A3-F33A-4174-8006-C72DC40DE189}.Release|Win32.Build.0 = Release|Win32 + {8772B3A3-F33A-4174-8006-C72DC40DE189}.Release|x64.ActiveCfg = Release|x64 + {8772B3A3-F33A-4174-8006-C72DC40DE189}.Release|x64.Build.0 = Release|x64 ++ {5CE429F3-E82C-42A8-A235-EDA309B34A47}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {5CE429F3-E82C-42A8-A235-EDA309B34A47}.Debug|ARM64.Build.0 = Debug|ARM64 + {5CE429F3-E82C-42A8-A235-EDA309B34A47}.Debug|Win32.ActiveCfg = Debug|Win32 + {5CE429F3-E82C-42A8-A235-EDA309B34A47}.Debug|Win32.Build.0 = Debug|Win32 + {5CE429F3-E82C-42A8-A235-EDA309B34A47}.Debug|x64.ActiveCfg = Debug|x64 + {5CE429F3-E82C-42A8-A235-EDA309B34A47}.Debug|x64.Build.0 = Debug|x64 ++ {5CE429F3-E82C-42A8-A235-EDA309B34A47}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {5CE429F3-E82C-42A8-A235-EDA309B34A47}.Release|ARM64.Build.0 = Release|ARM64 + {5CE429F3-E82C-42A8-A235-EDA309B34A47}.Release|Win32.ActiveCfg = Release|Win32 + {5CE429F3-E82C-42A8-A235-EDA309B34A47}.Release|Win32.Build.0 = Release|Win32 + {5CE429F3-E82C-42A8-A235-EDA309B34A47}.Release|x64.ActiveCfg = Release|x64 + {5CE429F3-E82C-42A8-A235-EDA309B34A47}.Release|x64.Build.0 = Release|x64 ++ {3C4EEB75-4F9C-4016-AC37-21EF5BC87C67}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {3C4EEB75-4F9C-4016-AC37-21EF5BC87C67}.Debug|ARM64.Build.0 = Debug|ARM64 + {3C4EEB75-4F9C-4016-AC37-21EF5BC87C67}.Debug|Win32.ActiveCfg = Debug|Win32 + {3C4EEB75-4F9C-4016-AC37-21EF5BC87C67}.Debug|Win32.Build.0 = Debug|Win32 + {3C4EEB75-4F9C-4016-AC37-21EF5BC87C67}.Debug|x64.ActiveCfg = Debug|x64 + {3C4EEB75-4F9C-4016-AC37-21EF5BC87C67}.Debug|x64.Build.0 = Debug|x64 ++ {3C4EEB75-4F9C-4016-AC37-21EF5BC87C67}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {3C4EEB75-4F9C-4016-AC37-21EF5BC87C67}.Release|ARM64.Build.0 = Release|ARM64 + {3C4EEB75-4F9C-4016-AC37-21EF5BC87C67}.Release|Win32.ActiveCfg = Release|Win32 + {3C4EEB75-4F9C-4016-AC37-21EF5BC87C67}.Release|Win32.Build.0 = Release|Win32 + {3C4EEB75-4F9C-4016-AC37-21EF5BC87C67}.Release|x64.ActiveCfg = Release|x64 + {3C4EEB75-4F9C-4016-AC37-21EF5BC87C67}.Release|x64.Build.0 = Release|x64 ++ {7C43699D-0EC4-4776-8901-F78D84CC464F}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {7C43699D-0EC4-4776-8901-F78D84CC464F}.Debug|ARM64.Build.0 = Debug|ARM64 + {7C43699D-0EC4-4776-8901-F78D84CC464F}.Debug|Win32.ActiveCfg = Debug|Win32 + {7C43699D-0EC4-4776-8901-F78D84CC464F}.Debug|Win32.Build.0 = Debug|Win32 + {7C43699D-0EC4-4776-8901-F78D84CC464F}.Debug|x64.ActiveCfg = Debug|x64 + {7C43699D-0EC4-4776-8901-F78D84CC464F}.Debug|x64.Build.0 = Debug|x64 ++ {7C43699D-0EC4-4776-8901-F78D84CC464F}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {7C43699D-0EC4-4776-8901-F78D84CC464F}.Release|ARM64.Build.0 = Release|ARM64 + {7C43699D-0EC4-4776-8901-F78D84CC464F}.Release|Win32.ActiveCfg = Release|Win32 + {7C43699D-0EC4-4776-8901-F78D84CC464F}.Release|Win32.Build.0 = Release|Win32 + {7C43699D-0EC4-4776-8901-F78D84CC464F}.Release|x64.ActiveCfg = Release|x64 + {7C43699D-0EC4-4776-8901-F78D84CC464F}.Release|x64.Build.0 = Release|x64 ++ {1AC592D5-4F5B-4224-B36F-F43914891A54}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {1AC592D5-4F5B-4224-B36F-F43914891A54}.Debug|ARM64.Build.0 = Debug|ARM64 + {1AC592D5-4F5B-4224-B36F-F43914891A54}.Debug|Win32.ActiveCfg = Debug|Win32 + {1AC592D5-4F5B-4224-B36F-F43914891A54}.Debug|Win32.Build.0 = Debug|Win32 + {1AC592D5-4F5B-4224-B36F-F43914891A54}.Debug|x64.ActiveCfg = Debug|x64 + {1AC592D5-4F5B-4224-B36F-F43914891A54}.Debug|x64.Build.0 = Debug|x64 ++ {1AC592D5-4F5B-4224-B36F-F43914891A54}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {1AC592D5-4F5B-4224-B36F-F43914891A54}.Release|ARM64.Build.0 = Release|ARM64 + {1AC592D5-4F5B-4224-B36F-F43914891A54}.Release|Win32.ActiveCfg = Release|Win32 + {1AC592D5-4F5B-4224-B36F-F43914891A54}.Release|Win32.Build.0 = Release|Win32 + {1AC592D5-4F5B-4224-B36F-F43914891A54}.Release|x64.ActiveCfg = Release|x64 + {1AC592D5-4F5B-4224-B36F-F43914891A54}.Release|x64.Build.0 = Release|x64 ++ {555FE755-B744-4C13-9A7D-0F9D8FDEC132}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {555FE755-B744-4C13-9A7D-0F9D8FDEC132}.Debug|ARM64.Build.0 = Debug|ARM64 + {555FE755-B744-4C13-9A7D-0F9D8FDEC132}.Debug|Win32.ActiveCfg = Debug|Win32 + {555FE755-B744-4C13-9A7D-0F9D8FDEC132}.Debug|Win32.Build.0 = Debug|Win32 + {555FE755-B744-4C13-9A7D-0F9D8FDEC132}.Debug|x64.ActiveCfg = Debug|x64 + {555FE755-B744-4C13-9A7D-0F9D8FDEC132}.Debug|x64.Build.0 = Debug|x64 ++ {555FE755-B744-4C13-9A7D-0F9D8FDEC132}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {555FE755-B744-4C13-9A7D-0F9D8FDEC132}.Release|ARM64.Build.0 = Release|ARM64 + {555FE755-B744-4C13-9A7D-0F9D8FDEC132}.Release|Win32.ActiveCfg = Release|Win32 + {555FE755-B744-4C13-9A7D-0F9D8FDEC132}.Release|Win32.Build.0 = Release|Win32 + {555FE755-B744-4C13-9A7D-0F9D8FDEC132}.Release|x64.ActiveCfg = Release|x64 + {555FE755-B744-4C13-9A7D-0F9D8FDEC132}.Release|x64.Build.0 = Release|x64 ++ {6707C818-9BC2-4E4D-85DB-374C8CAA491E}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {6707C818-9BC2-4E4D-85DB-374C8CAA491E}.Debug|ARM64.Build.0 = Debug|ARM64 + {6707C818-9BC2-4E4D-85DB-374C8CAA491E}.Debug|Win32.ActiveCfg = Debug|Win32 + {6707C818-9BC2-4E4D-85DB-374C8CAA491E}.Debug|Win32.Build.0 = Debug|Win32 + {6707C818-9BC2-4E4D-85DB-374C8CAA491E}.Debug|x64.ActiveCfg = Debug|x64 + {6707C818-9BC2-4E4D-85DB-374C8CAA491E}.Debug|x64.Build.0 = Debug|x64 ++ {6707C818-9BC2-4E4D-85DB-374C8CAA491E}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {6707C818-9BC2-4E4D-85DB-374C8CAA491E}.Release|ARM64.Build.0 = Release|ARM64 + {6707C818-9BC2-4E4D-85DB-374C8CAA491E}.Release|Win32.ActiveCfg = Release|Win32 + {6707C818-9BC2-4E4D-85DB-374C8CAA491E}.Release|Win32.Build.0 = Release|Win32 + {6707C818-9BC2-4E4D-85DB-374C8CAA491E}.Release|x64.ActiveCfg = Release|x64 + {6707C818-9BC2-4E4D-85DB-374C8CAA491E}.Release|x64.Build.0 = Release|x64 ++ {B5534C9D-9886-44DE-920B-29F0F1C9DD28}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {B5534C9D-9886-44DE-920B-29F0F1C9DD28}.Debug|ARM64.Build.0 = Debug|ARM64 + {B5534C9D-9886-44DE-920B-29F0F1C9DD28}.Debug|Win32.ActiveCfg = Debug|Win32 + {B5534C9D-9886-44DE-920B-29F0F1C9DD28}.Debug|Win32.Build.0 = Debug|Win32 + {B5534C9D-9886-44DE-920B-29F0F1C9DD28}.Debug|x64.ActiveCfg = Debug|x64 + {B5534C9D-9886-44DE-920B-29F0F1C9DD28}.Debug|x64.Build.0 = Debug|x64 ++ {B5534C9D-9886-44DE-920B-29F0F1C9DD28}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {B5534C9D-9886-44DE-920B-29F0F1C9DD28}.Release|ARM64.Build.0 = Release|ARM64 + {B5534C9D-9886-44DE-920B-29F0F1C9DD28}.Release|Win32.ActiveCfg = Release|Win32 + {B5534C9D-9886-44DE-920B-29F0F1C9DD28}.Release|Win32.Build.0 = Release|Win32 + {B5534C9D-9886-44DE-920B-29F0F1C9DD28}.Release|x64.ActiveCfg = Release|x64 + {B5534C9D-9886-44DE-920B-29F0F1C9DD28}.Release|x64.Build.0 = Release|x64 ++ {800B208B-50A2-48B7-BA68-DC1CC6F42D8C}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {800B208B-50A2-48B7-BA68-DC1CC6F42D8C}.Debug|ARM64.Build.0 = Debug|ARM64 + {800B208B-50A2-48B7-BA68-DC1CC6F42D8C}.Debug|Win32.ActiveCfg = Debug|Win32 + {800B208B-50A2-48B7-BA68-DC1CC6F42D8C}.Debug|Win32.Build.0 = Debug|Win32 + {800B208B-50A2-48B7-BA68-DC1CC6F42D8C}.Debug|x64.ActiveCfg = Debug|x64 + {800B208B-50A2-48B7-BA68-DC1CC6F42D8C}.Debug|x64.Build.0 = Debug|x64 ++ {800B208B-50A2-48B7-BA68-DC1CC6F42D8C}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {800B208B-50A2-48B7-BA68-DC1CC6F42D8C}.Release|ARM64.Build.0 = Release|ARM64 + {800B208B-50A2-48B7-BA68-DC1CC6F42D8C}.Release|Win32.ActiveCfg = Release|Win32 + {800B208B-50A2-48B7-BA68-DC1CC6F42D8C}.Release|Win32.Build.0 = Release|Win32 + {800B208B-50A2-48B7-BA68-DC1CC6F42D8C}.Release|x64.ActiveCfg = Release|x64 + {800B208B-50A2-48B7-BA68-DC1CC6F42D8C}.Release|x64.Build.0 = Release|x64 ++ {5D159FE5-DE77-4EDF-974E-D4FF448BD717}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {5D159FE5-DE77-4EDF-974E-D4FF448BD717}.Debug|ARM64.Build.0 = Debug|ARM64 + {5D159FE5-DE77-4EDF-974E-D4FF448BD717}.Debug|Win32.ActiveCfg = Debug|Win32 + {5D159FE5-DE77-4EDF-974E-D4FF448BD717}.Debug|Win32.Build.0 = Debug|Win32 + {5D159FE5-DE77-4EDF-974E-D4FF448BD717}.Debug|x64.ActiveCfg = Debug|x64 + {5D159FE5-DE77-4EDF-974E-D4FF448BD717}.Debug|x64.Build.0 = Debug|x64 ++ {5D159FE5-DE77-4EDF-974E-D4FF448BD717}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {5D159FE5-DE77-4EDF-974E-D4FF448BD717}.Release|ARM64.Build.0 = Release|ARM64 + {5D159FE5-DE77-4EDF-974E-D4FF448BD717}.Release|Win32.ActiveCfg = Release|Win32 + {5D159FE5-DE77-4EDF-974E-D4FF448BD717}.Release|Win32.Build.0 = Release|Win32 + {5D159FE5-DE77-4EDF-974E-D4FF448BD717}.Release|x64.ActiveCfg = Release|x64 + {5D159FE5-DE77-4EDF-974E-D4FF448BD717}.Release|x64.Build.0 = Release|x64 ++ {211B1F3D-33CA-4DB0-883A-203CF6402EFA}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {211B1F3D-33CA-4DB0-883A-203CF6402EFA}.Debug|ARM64.Build.0 = Debug|ARM64 + {211B1F3D-33CA-4DB0-883A-203CF6402EFA}.Debug|Win32.ActiveCfg = Debug|Win32 + {211B1F3D-33CA-4DB0-883A-203CF6402EFA}.Debug|Win32.Build.0 = Debug|Win32 + {211B1F3D-33CA-4DB0-883A-203CF6402EFA}.Debug|x64.ActiveCfg = Debug|x64 + {211B1F3D-33CA-4DB0-883A-203CF6402EFA}.Debug|x64.Build.0 = Debug|x64 ++ {211B1F3D-33CA-4DB0-883A-203CF6402EFA}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {211B1F3D-33CA-4DB0-883A-203CF6402EFA}.Release|ARM64.Build.0 = Release|ARM64 + {211B1F3D-33CA-4DB0-883A-203CF6402EFA}.Release|Win32.ActiveCfg = Release|Win32 + {211B1F3D-33CA-4DB0-883A-203CF6402EFA}.Release|Win32.Build.0 = Release|Win32 + {211B1F3D-33CA-4DB0-883A-203CF6402EFA}.Release|x64.ActiveCfg = Release|x64 + {211B1F3D-33CA-4DB0-883A-203CF6402EFA}.Release|x64.Build.0 = Release|x64 ++ {A84C7B38-C92A-4A05-9588-4D1FB71B1BE0}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {A84C7B38-C92A-4A05-9588-4D1FB71B1BE0}.Debug|ARM64.Build.0 = Debug|ARM64 + {A84C7B38-C92A-4A05-9588-4D1FB71B1BE0}.Debug|Win32.ActiveCfg = Debug|Win32 + {A84C7B38-C92A-4A05-9588-4D1FB71B1BE0}.Debug|Win32.Build.0 = Debug|Win32 + {A84C7B38-C92A-4A05-9588-4D1FB71B1BE0}.Debug|x64.ActiveCfg = Debug|x64 + {A84C7B38-C92A-4A05-9588-4D1FB71B1BE0}.Debug|x64.Build.0 = Debug|x64 ++ {A84C7B38-C92A-4A05-9588-4D1FB71B1BE0}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {A84C7B38-C92A-4A05-9588-4D1FB71B1BE0}.Release|ARM64.Build.0 = Release|ARM64 + {A84C7B38-C92A-4A05-9588-4D1FB71B1BE0}.Release|Win32.ActiveCfg = Release|Win32 + {A84C7B38-C92A-4A05-9588-4D1FB71B1BE0}.Release|Win32.Build.0 = Release|Win32 + {A84C7B38-C92A-4A05-9588-4D1FB71B1BE0}.Release|x64.ActiveCfg = Release|x64 + {A84C7B38-C92A-4A05-9588-4D1FB71B1BE0}.Release|x64.Build.0 = Release|x64 ++ {F5819E2D-1A7F-460E-B220-328A83A8FD2C}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {F5819E2D-1A7F-460E-B220-328A83A8FD2C}.Debug|ARM64.Build.0 = Debug|ARM64 + {F5819E2D-1A7F-460E-B220-328A83A8FD2C}.Debug|Win32.ActiveCfg = Debug|Win32 + {F5819E2D-1A7F-460E-B220-328A83A8FD2C}.Debug|Win32.Build.0 = Debug|Win32 + {F5819E2D-1A7F-460E-B220-328A83A8FD2C}.Debug|x64.ActiveCfg = Debug|x64 + {F5819E2D-1A7F-460E-B220-328A83A8FD2C}.Debug|x64.Build.0 = Debug|x64 ++ {F5819E2D-1A7F-460E-B220-328A83A8FD2C}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {F5819E2D-1A7F-460E-B220-328A83A8FD2C}.Release|ARM64.Build.0 = Release|ARM64 + {F5819E2D-1A7F-460E-B220-328A83A8FD2C}.Release|Win32.ActiveCfg = Release|Win32 + {F5819E2D-1A7F-460E-B220-328A83A8FD2C}.Release|Win32.Build.0 = Release|Win32 + {F5819E2D-1A7F-460E-B220-328A83A8FD2C}.Release|x64.ActiveCfg = Release|x64 + {F5819E2D-1A7F-460E-B220-328A83A8FD2C}.Release|x64.Build.0 = Release|x64 ++ {35798C92-CC45-4AC5-A33E-8D82F7CF847E}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {35798C92-CC45-4AC5-A33E-8D82F7CF847E}.Debug|ARM64.Build.0 = Debug|ARM64 + {35798C92-CC45-4AC5-A33E-8D82F7CF847E}.Debug|Win32.ActiveCfg = Debug|Win32 + {35798C92-CC45-4AC5-A33E-8D82F7CF847E}.Debug|Win32.Build.0 = Debug|Win32 + {35798C92-CC45-4AC5-A33E-8D82F7CF847E}.Debug|x64.ActiveCfg = Debug|x64 + {35798C92-CC45-4AC5-A33E-8D82F7CF847E}.Debug|x64.Build.0 = Debug|x64 ++ {35798C92-CC45-4AC5-A33E-8D82F7CF847E}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {35798C92-CC45-4AC5-A33E-8D82F7CF847E}.Release|ARM64.Build.0 = Release|ARM64 + {35798C92-CC45-4AC5-A33E-8D82F7CF847E}.Release|Win32.ActiveCfg = Release|Win32 + {35798C92-CC45-4AC5-A33E-8D82F7CF847E}.Release|Win32.Build.0 = Release|Win32 + {35798C92-CC45-4AC5-A33E-8D82F7CF847E}.Release|x64.ActiveCfg = Release|x64 + {35798C92-CC45-4AC5-A33E-8D82F7CF847E}.Release|x64.Build.0 = Release|x64 ++ {28734BFB-4C00-455D-96A7-2CA6C0D598E1}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {28734BFB-4C00-455D-96A7-2CA6C0D598E1}.Debug|ARM64.Build.0 = Debug|ARM64 + {28734BFB-4C00-455D-96A7-2CA6C0D598E1}.Debug|Win32.ActiveCfg = Debug|Win32 + {28734BFB-4C00-455D-96A7-2CA6C0D598E1}.Debug|Win32.Build.0 = Debug|Win32 + {28734BFB-4C00-455D-96A7-2CA6C0D598E1}.Debug|x64.ActiveCfg = Debug|x64 + {28734BFB-4C00-455D-96A7-2CA6C0D598E1}.Debug|x64.Build.0 = Debug|x64 ++ {28734BFB-4C00-455D-96A7-2CA6C0D598E1}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {28734BFB-4C00-455D-96A7-2CA6C0D598E1}.Release|ARM64.Build.0 = Release|ARM64 + {28734BFB-4C00-455D-96A7-2CA6C0D598E1}.Release|Win32.ActiveCfg = Release|Win32 + {28734BFB-4C00-455D-96A7-2CA6C0D598E1}.Release|Win32.Build.0 = Release|Win32 + {28734BFB-4C00-455D-96A7-2CA6C0D598E1}.Release|x64.ActiveCfg = Release|x64 + {28734BFB-4C00-455D-96A7-2CA6C0D598E1}.Release|x64.Build.0 = Release|x64 ++ {1738FE1E-34B4-4657-AE5A-94CA8A31A6E9}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {1738FE1E-34B4-4657-AE5A-94CA8A31A6E9}.Debug|ARM64.Build.0 = Debug|ARM64 + {1738FE1E-34B4-4657-AE5A-94CA8A31A6E9}.Debug|Win32.ActiveCfg = Debug|Win32 + {1738FE1E-34B4-4657-AE5A-94CA8A31A6E9}.Debug|Win32.Build.0 = Debug|Win32 + {1738FE1E-34B4-4657-AE5A-94CA8A31A6E9}.Debug|x64.ActiveCfg = Debug|x64 + {1738FE1E-34B4-4657-AE5A-94CA8A31A6E9}.Debug|x64.Build.0 = Debug|x64 ++ {1738FE1E-34B4-4657-AE5A-94CA8A31A6E9}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {1738FE1E-34B4-4657-AE5A-94CA8A31A6E9}.Release|ARM64.Build.0 = Release|ARM64 + {1738FE1E-34B4-4657-AE5A-94CA8A31A6E9}.Release|Win32.ActiveCfg = Release|Win32 + {1738FE1E-34B4-4657-AE5A-94CA8A31A6E9}.Release|Win32.Build.0 = Release|Win32 + {1738FE1E-34B4-4657-AE5A-94CA8A31A6E9}.Release|x64.ActiveCfg = Release|x64 + {1738FE1E-34B4-4657-AE5A-94CA8A31A6E9}.Release|x64.Build.0 = Release|x64 ++ {A6116D1B-1A43-4F56-AF6B-DF79D7A28317}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {A6116D1B-1A43-4F56-AF6B-DF79D7A28317}.Debug|ARM64.Build.0 = Debug|ARM64 + {A6116D1B-1A43-4F56-AF6B-DF79D7A28317}.Debug|Win32.ActiveCfg = Debug|Win32 + {A6116D1B-1A43-4F56-AF6B-DF79D7A28317}.Debug|Win32.Build.0 = Debug|Win32 + {A6116D1B-1A43-4F56-AF6B-DF79D7A28317}.Debug|x64.ActiveCfg = Debug|x64 + {A6116D1B-1A43-4F56-AF6B-DF79D7A28317}.Debug|x64.Build.0 = Debug|x64 ++ {A6116D1B-1A43-4F56-AF6B-DF79D7A28317}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {A6116D1B-1A43-4F56-AF6B-DF79D7A28317}.Release|ARM64.Build.0 = Release|ARM64 + {A6116D1B-1A43-4F56-AF6B-DF79D7A28317}.Release|Win32.ActiveCfg = Release|Win32 + {A6116D1B-1A43-4F56-AF6B-DF79D7A28317}.Release|Win32.Build.0 = Release|Win32 + {A6116D1B-1A43-4F56-AF6B-DF79D7A28317}.Release|x64.ActiveCfg = Release|x64 + {A6116D1B-1A43-4F56-AF6B-DF79D7A28317}.Release|x64.Build.0 = Release|x64 ++ {40607BCA-7DC6-400F-BC4C-96A9AB208475}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {40607BCA-7DC6-400F-BC4C-96A9AB208475}.Debug|ARM64.Build.0 = Debug|ARM64 + {40607BCA-7DC6-400F-BC4C-96A9AB208475}.Debug|Win32.ActiveCfg = Debug|Win32 + {40607BCA-7DC6-400F-BC4C-96A9AB208475}.Debug|Win32.Build.0 = Debug|Win32 + {40607BCA-7DC6-400F-BC4C-96A9AB208475}.Debug|x64.ActiveCfg = Debug|x64 + {40607BCA-7DC6-400F-BC4C-96A9AB208475}.Debug|x64.Build.0 = Debug|x64 ++ {40607BCA-7DC6-400F-BC4C-96A9AB208475}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {40607BCA-7DC6-400F-BC4C-96A9AB208475}.Release|ARM64.Build.0 = Release|ARM64 + {40607BCA-7DC6-400F-BC4C-96A9AB208475}.Release|Win32.ActiveCfg = Release|Win32 + {40607BCA-7DC6-400F-BC4C-96A9AB208475}.Release|Win32.Build.0 = Release|Win32 + {40607BCA-7DC6-400F-BC4C-96A9AB208475}.Release|x64.ActiveCfg = Release|x64 + {40607BCA-7DC6-400F-BC4C-96A9AB208475}.Release|x64.Build.0 = Release|x64 ++ {B59EE041-28C6-4919-80F9-52249A799B7B}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {B59EE041-28C6-4919-80F9-52249A799B7B}.Debug|ARM64.Build.0 = Debug|ARM64 + {B59EE041-28C6-4919-80F9-52249A799B7B}.Debug|Win32.ActiveCfg = Debug|Win32 + {B59EE041-28C6-4919-80F9-52249A799B7B}.Debug|Win32.Build.0 = Debug|Win32 + {B59EE041-28C6-4919-80F9-52249A799B7B}.Debug|x64.ActiveCfg = Debug|x64 + {B59EE041-28C6-4919-80F9-52249A799B7B}.Debug|x64.Build.0 = Debug|x64 ++ {B59EE041-28C6-4919-80F9-52249A799B7B}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {B59EE041-28C6-4919-80F9-52249A799B7B}.Release|ARM64.Build.0 = Release|ARM64 + {B59EE041-28C6-4919-80F9-52249A799B7B}.Release|Win32.ActiveCfg = Release|Win32 + {B59EE041-28C6-4919-80F9-52249A799B7B}.Release|Win32.Build.0 = Release|Win32 + {B59EE041-28C6-4919-80F9-52249A799B7B}.Release|x64.ActiveCfg = Release|x64 + {B59EE041-28C6-4919-80F9-52249A799B7B}.Release|x64.Build.0 = Release|x64 ++ {0CAA738A-C56B-4F54-A8A3-B27C7220FC75}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {0CAA738A-C56B-4F54-A8A3-B27C7220FC75}.Debug|ARM64.Build.0 = Debug|ARM64 + {0CAA738A-C56B-4F54-A8A3-B27C7220FC75}.Debug|Win32.ActiveCfg = Debug|Win32 + {0CAA738A-C56B-4F54-A8A3-B27C7220FC75}.Debug|Win32.Build.0 = Debug|Win32 + {0CAA738A-C56B-4F54-A8A3-B27C7220FC75}.Debug|x64.ActiveCfg = Debug|x64 + {0CAA738A-C56B-4F54-A8A3-B27C7220FC75}.Debug|x64.Build.0 = Debug|x64 ++ {0CAA738A-C56B-4F54-A8A3-B27C7220FC75}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {0CAA738A-C56B-4F54-A8A3-B27C7220FC75}.Release|ARM64.Build.0 = Release|ARM64 + {0CAA738A-C56B-4F54-A8A3-B27C7220FC75}.Release|Win32.ActiveCfg = Release|Win32 + {0CAA738A-C56B-4F54-A8A3-B27C7220FC75}.Release|Win32.Build.0 = Release|Win32 + {0CAA738A-C56B-4F54-A8A3-B27C7220FC75}.Release|x64.ActiveCfg = Release|x64 + {0CAA738A-C56B-4F54-A8A3-B27C7220FC75}.Release|x64.Build.0 = Release|x64 ++ {950ACA47-2721-4D2E-8F19-C48759F1E492}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {950ACA47-2721-4D2E-8F19-C48759F1E492}.Debug|ARM64.Build.0 = Debug|ARM64 + {950ACA47-2721-4D2E-8F19-C48759F1E492}.Debug|Win32.ActiveCfg = Debug|Win32 + {950ACA47-2721-4D2E-8F19-C48759F1E492}.Debug|Win32.Build.0 = Debug|Win32 + {950ACA47-2721-4D2E-8F19-C48759F1E492}.Debug|x64.ActiveCfg = Debug|x64 + {950ACA47-2721-4D2E-8F19-C48759F1E492}.Debug|x64.Build.0 = Debug|x64 ++ {950ACA47-2721-4D2E-8F19-C48759F1E492}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {950ACA47-2721-4D2E-8F19-C48759F1E492}.Release|ARM64.Build.0 = Release|ARM64 + {950ACA47-2721-4D2E-8F19-C48759F1E492}.Release|Win32.ActiveCfg = Release|Win32 + {950ACA47-2721-4D2E-8F19-C48759F1E492}.Release|Win32.Build.0 = Release|Win32 + {950ACA47-2721-4D2E-8F19-C48759F1E492}.Release|x64.ActiveCfg = Release|x64 + {950ACA47-2721-4D2E-8F19-C48759F1E492}.Release|x64.Build.0 = Release|x64 ++ {4C225734-B4C0-4D1D-94F6-2CC48144F12D}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {4C225734-B4C0-4D1D-94F6-2CC48144F12D}.Debug|ARM64.Build.0 = Debug|ARM64 + {4C225734-B4C0-4D1D-94F6-2CC48144F12D}.Debug|Win32.ActiveCfg = Debug|Win32 + {4C225734-B4C0-4D1D-94F6-2CC48144F12D}.Debug|Win32.Build.0 = Debug|Win32 + {4C225734-B4C0-4D1D-94F6-2CC48144F12D}.Debug|x64.ActiveCfg = Debug|x64 + {4C225734-B4C0-4D1D-94F6-2CC48144F12D}.Debug|x64.Build.0 = Debug|x64 ++ {4C225734-B4C0-4D1D-94F6-2CC48144F12D}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {4C225734-B4C0-4D1D-94F6-2CC48144F12D}.Release|ARM64.Build.0 = Release|ARM64 + {4C225734-B4C0-4D1D-94F6-2CC48144F12D}.Release|Win32.ActiveCfg = Release|Win32 + {4C225734-B4C0-4D1D-94F6-2CC48144F12D}.Release|Win32.Build.0 = Release|Win32 + {4C225734-B4C0-4D1D-94F6-2CC48144F12D}.Release|x64.ActiveCfg = Release|x64 + {4C225734-B4C0-4D1D-94F6-2CC48144F12D}.Release|x64.Build.0 = Release|x64 ++ {487DF829-9D13-4C6F-AA24-2C8A4115B657}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {487DF829-9D13-4C6F-AA24-2C8A4115B657}.Debug|ARM64.Build.0 = Debug|ARM64 + {487DF829-9D13-4C6F-AA24-2C8A4115B657}.Debug|Win32.ActiveCfg = Debug|Win32 + {487DF829-9D13-4C6F-AA24-2C8A4115B657}.Debug|Win32.Build.0 = Debug|Win32 + {487DF829-9D13-4C6F-AA24-2C8A4115B657}.Debug|x64.ActiveCfg = Debug|x64 + {487DF829-9D13-4C6F-AA24-2C8A4115B657}.Debug|x64.Build.0 = Debug|x64 ++ {487DF829-9D13-4C6F-AA24-2C8A4115B657}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {487DF829-9D13-4C6F-AA24-2C8A4115B657}.Release|ARM64.Build.0 = Release|ARM64 + {487DF829-9D13-4C6F-AA24-2C8A4115B657}.Release|Win32.ActiveCfg = Release|Win32 + {487DF829-9D13-4C6F-AA24-2C8A4115B657}.Release|Win32.Build.0 = Release|Win32 + {487DF829-9D13-4C6F-AA24-2C8A4115B657}.Release|x64.ActiveCfg = Release|x64 + {487DF829-9D13-4C6F-AA24-2C8A4115B657}.Release|x64.Build.0 = Release|x64 ++ {DD8664D4-902B-493B-BAFA-E559100A2755}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {DD8664D4-902B-493B-BAFA-E559100A2755}.Debug|ARM64.Build.0 = Debug|ARM64 + {DD8664D4-902B-493B-BAFA-E559100A2755}.Debug|Win32.ActiveCfg = Debug|Win32 + {DD8664D4-902B-493B-BAFA-E559100A2755}.Debug|Win32.Build.0 = Debug|Win32 + {DD8664D4-902B-493B-BAFA-E559100A2755}.Debug|x64.ActiveCfg = Debug|x64 + {DD8664D4-902B-493B-BAFA-E559100A2755}.Debug|x64.Build.0 = Debug|x64 ++ {DD8664D4-902B-493B-BAFA-E559100A2755}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {DD8664D4-902B-493B-BAFA-E559100A2755}.Release|ARM64.Build.0 = Release|ARM64 + {DD8664D4-902B-493B-BAFA-E559100A2755}.Release|Win32.ActiveCfg = Release|Win32 + {DD8664D4-902B-493B-BAFA-E559100A2755}.Release|Win32.Build.0 = Release|Win32 + {DD8664D4-902B-493B-BAFA-E559100A2755}.Release|x64.ActiveCfg = Release|x64 + {DD8664D4-902B-493B-BAFA-E559100A2755}.Release|x64.Build.0 = Release|x64 ++ {475193E3-1120-4D13-A9C1-C6B99558E44A}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {475193E3-1120-4D13-A9C1-C6B99558E44A}.Debug|ARM64.Build.0 = Debug|ARM64 + {475193E3-1120-4D13-A9C1-C6B99558E44A}.Debug|Win32.ActiveCfg = Debug|Win32 + {475193E3-1120-4D13-A9C1-C6B99558E44A}.Debug|Win32.Build.0 = Debug|Win32 + {475193E3-1120-4D13-A9C1-C6B99558E44A}.Debug|x64.ActiveCfg = Debug|x64 + {475193E3-1120-4D13-A9C1-C6B99558E44A}.Debug|x64.Build.0 = Debug|x64 ++ {475193E3-1120-4D13-A9C1-C6B99558E44A}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {475193E3-1120-4D13-A9C1-C6B99558E44A}.Release|ARM64.Build.0 = Release|ARM64 + {475193E3-1120-4D13-A9C1-C6B99558E44A}.Release|Win32.ActiveCfg = Release|Win32 + {475193E3-1120-4D13-A9C1-C6B99558E44A}.Release|Win32.Build.0 = Release|Win32 + {475193E3-1120-4D13-A9C1-C6B99558E44A}.Release|x64.ActiveCfg = Release|x64 + {475193E3-1120-4D13-A9C1-C6B99558E44A}.Release|x64.Build.0 = Release|x64 ++ {59759753-CAC1-4D61-9B98-E1DEDD2C3E69}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {59759753-CAC1-4D61-9B98-E1DEDD2C3E69}.Debug|ARM64.Build.0 = Debug|ARM64 + {59759753-CAC1-4D61-9B98-E1DEDD2C3E69}.Debug|Win32.ActiveCfg = Debug|Win32 + {59759753-CAC1-4D61-9B98-E1DEDD2C3E69}.Debug|Win32.Build.0 = Debug|Win32 + {59759753-CAC1-4D61-9B98-E1DEDD2C3E69}.Debug|x64.ActiveCfg = Debug|x64 + {59759753-CAC1-4D61-9B98-E1DEDD2C3E69}.Debug|x64.Build.0 = Debug|x64 ++ {59759753-CAC1-4D61-9B98-E1DEDD2C3E69}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {59759753-CAC1-4D61-9B98-E1DEDD2C3E69}.Release|ARM64.Build.0 = Release|ARM64 + {59759753-CAC1-4D61-9B98-E1DEDD2C3E69}.Release|Win32.ActiveCfg = Release|Win32 + {59759753-CAC1-4D61-9B98-E1DEDD2C3E69}.Release|Win32.Build.0 = Release|Win32 + {59759753-CAC1-4D61-9B98-E1DEDD2C3E69}.Release|x64.ActiveCfg = Release|x64 + {59759753-CAC1-4D61-9B98-E1DEDD2C3E69}.Release|x64.Build.0 = Release|x64 ++ {4746E6DB-D6FB-4DDC-8B49-7F184231C15A}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {4746E6DB-D6FB-4DDC-8B49-7F184231C15A}.Debug|ARM64.Build.0 = Debug|ARM64 + {4746E6DB-D6FB-4DDC-8B49-7F184231C15A}.Debug|Win32.ActiveCfg = Debug|Win32 + {4746E6DB-D6FB-4DDC-8B49-7F184231C15A}.Debug|Win32.Build.0 = Debug|Win32 + {4746E6DB-D6FB-4DDC-8B49-7F184231C15A}.Debug|x64.ActiveCfg = Debug|x64 + {4746E6DB-D6FB-4DDC-8B49-7F184231C15A}.Debug|x64.Build.0 = Debug|x64 ++ {4746E6DB-D6FB-4DDC-8B49-7F184231C15A}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {4746E6DB-D6FB-4DDC-8B49-7F184231C15A}.Release|ARM64.Build.0 = Release|ARM64 + {4746E6DB-D6FB-4DDC-8B49-7F184231C15A}.Release|Win32.ActiveCfg = Release|Win32 + {4746E6DB-D6FB-4DDC-8B49-7F184231C15A}.Release|Win32.Build.0 = Release|Win32 + {4746E6DB-D6FB-4DDC-8B49-7F184231C15A}.Release|x64.ActiveCfg = Release|x64 + {4746E6DB-D6FB-4DDC-8B49-7F184231C15A}.Release|x64.Build.0 = Release|x64 ++ {1F0FA3CB-10DD-4EEF-911D-D3D904B4EF4A}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {1F0FA3CB-10DD-4EEF-911D-D3D904B4EF4A}.Debug|ARM64.Build.0 = Debug|ARM64 + {1F0FA3CB-10DD-4EEF-911D-D3D904B4EF4A}.Debug|Win32.ActiveCfg = Debug|Win32 + {1F0FA3CB-10DD-4EEF-911D-D3D904B4EF4A}.Debug|Win32.Build.0 = Debug|Win32 + {1F0FA3CB-10DD-4EEF-911D-D3D904B4EF4A}.Debug|x64.ActiveCfg = Debug|x64 + {1F0FA3CB-10DD-4EEF-911D-D3D904B4EF4A}.Debug|x64.Build.0 = Debug|x64 ++ {1F0FA3CB-10DD-4EEF-911D-D3D904B4EF4A}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {1F0FA3CB-10DD-4EEF-911D-D3D904B4EF4A}.Release|ARM64.Build.0 = Release|ARM64 + {1F0FA3CB-10DD-4EEF-911D-D3D904B4EF4A}.Release|Win32.ActiveCfg = Release|Win32 + {1F0FA3CB-10DD-4EEF-911D-D3D904B4EF4A}.Release|Win32.Build.0 = Release|Win32 + {1F0FA3CB-10DD-4EEF-911D-D3D904B4EF4A}.Release|x64.ActiveCfg = Release|x64 + {1F0FA3CB-10DD-4EEF-911D-D3D904B4EF4A}.Release|x64.Build.0 = Release|x64 ++ {DE3219F6-E665-4A8E-A990-8BB9A929CCB7}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {DE3219F6-E665-4A8E-A990-8BB9A929CCB7}.Debug|ARM64.Build.0 = Debug|ARM64 + {DE3219F6-E665-4A8E-A990-8BB9A929CCB7}.Debug|Win32.ActiveCfg = Debug|Win32 + {DE3219F6-E665-4A8E-A990-8BB9A929CCB7}.Debug|Win32.Build.0 = Debug|Win32 + {DE3219F6-E665-4A8E-A990-8BB9A929CCB7}.Debug|x64.ActiveCfg = Debug|x64 + {DE3219F6-E665-4A8E-A990-8BB9A929CCB7}.Debug|x64.Build.0 = Debug|x64 ++ {DE3219F6-E665-4A8E-A990-8BB9A929CCB7}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {DE3219F6-E665-4A8E-A990-8BB9A929CCB7}.Release|ARM64.Build.0 = Release|ARM64 + {DE3219F6-E665-4A8E-A990-8BB9A929CCB7}.Release|Win32.ActiveCfg = Release|Win32 + {DE3219F6-E665-4A8E-A990-8BB9A929CCB7}.Release|Win32.Build.0 = Release|Win32 + {DE3219F6-E665-4A8E-A990-8BB9A929CCB7}.Release|x64.ActiveCfg = Release|x64 + {DE3219F6-E665-4A8E-A990-8BB9A929CCB7}.Release|x64.Build.0 = Release|x64 ++ {E625B0EF-8AC1-489C-9E6B-EE249A507FC7}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {E625B0EF-8AC1-489C-9E6B-EE249A507FC7}.Debug|ARM64.Build.0 = Debug|ARM64 + {E625B0EF-8AC1-489C-9E6B-EE249A507FC7}.Debug|Win32.ActiveCfg = Debug|Win32 + {E625B0EF-8AC1-489C-9E6B-EE249A507FC7}.Debug|Win32.Build.0 = Debug|Win32 + {E625B0EF-8AC1-489C-9E6B-EE249A507FC7}.Debug|x64.ActiveCfg = Debug|x64 + {E625B0EF-8AC1-489C-9E6B-EE249A507FC7}.Debug|x64.Build.0 = Debug|x64 ++ {E625B0EF-8AC1-489C-9E6B-EE249A507FC7}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {E625B0EF-8AC1-489C-9E6B-EE249A507FC7}.Release|ARM64.Build.0 = Release|ARM64 + {E625B0EF-8AC1-489C-9E6B-EE249A507FC7}.Release|Win32.ActiveCfg = Release|Win32 + {E625B0EF-8AC1-489C-9E6B-EE249A507FC7}.Release|Win32.Build.0 = Release|Win32 + {E625B0EF-8AC1-489C-9E6B-EE249A507FC7}.Release|x64.ActiveCfg = Release|x64 + {E625B0EF-8AC1-489C-9E6B-EE249A507FC7}.Release|x64.Build.0 = Release|x64 ++ {0188609D-EB9A-4B25-88C6-EB952B4E39E7}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {0188609D-EB9A-4B25-88C6-EB952B4E39E7}.Debug|ARM64.Build.0 = Debug|ARM64 + {0188609D-EB9A-4B25-88C6-EB952B4E39E7}.Debug|Win32.ActiveCfg = Debug|Win32 + {0188609D-EB9A-4B25-88C6-EB952B4E39E7}.Debug|Win32.Build.0 = Debug|Win32 + {0188609D-EB9A-4B25-88C6-EB952B4E39E7}.Debug|x64.ActiveCfg = Debug|x64 + {0188609D-EB9A-4B25-88C6-EB952B4E39E7}.Debug|x64.Build.0 = Debug|x64 ++ {0188609D-EB9A-4B25-88C6-EB952B4E39E7}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {0188609D-EB9A-4B25-88C6-EB952B4E39E7}.Release|ARM64.Build.0 = Release|ARM64 + {0188609D-EB9A-4B25-88C6-EB952B4E39E7}.Release|Win32.ActiveCfg = Release|Win32 + {0188609D-EB9A-4B25-88C6-EB952B4E39E7}.Release|Win32.Build.0 = Release|Win32 + {0188609D-EB9A-4B25-88C6-EB952B4E39E7}.Release|x64.ActiveCfg = Release|x64 + {0188609D-EB9A-4B25-88C6-EB952B4E39E7}.Release|x64.Build.0 = Release|x64 ++ {90B4302C-0A10-4987-A4DF-3F578D49CED2}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {90B4302C-0A10-4987-A4DF-3F578D49CED2}.Debug|ARM64.Build.0 = Debug|ARM64 + {90B4302C-0A10-4987-A4DF-3F578D49CED2}.Debug|Win32.ActiveCfg = Debug|Win32 + {90B4302C-0A10-4987-A4DF-3F578D49CED2}.Debug|Win32.Build.0 = Debug|Win32 + {90B4302C-0A10-4987-A4DF-3F578D49CED2}.Debug|x64.ActiveCfg = Debug|x64 + {90B4302C-0A10-4987-A4DF-3F578D49CED2}.Debug|x64.Build.0 = Debug|x64 ++ {90B4302C-0A10-4987-A4DF-3F578D49CED2}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {90B4302C-0A10-4987-A4DF-3F578D49CED2}.Release|ARM64.Build.0 = Release|ARM64 + {90B4302C-0A10-4987-A4DF-3F578D49CED2}.Release|Win32.ActiveCfg = Release|Win32 + {90B4302C-0A10-4987-A4DF-3F578D49CED2}.Release|Win32.Build.0 = Release|Win32 + {90B4302C-0A10-4987-A4DF-3F578D49CED2}.Release|x64.ActiveCfg = Release|x64 + {90B4302C-0A10-4987-A4DF-3F578D49CED2}.Release|x64.Build.0 = Release|x64 ++ {13D31BD0-B598-4468-9AA2-5C5363DDB648}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {13D31BD0-B598-4468-9AA2-5C5363DDB648}.Debug|ARM64.Build.0 = Debug|ARM64 + {13D31BD0-B598-4468-9AA2-5C5363DDB648}.Debug|Win32.ActiveCfg = Debug|Win32 + {13D31BD0-B598-4468-9AA2-5C5363DDB648}.Debug|Win32.Build.0 = Debug|Win32 + {13D31BD0-B598-4468-9AA2-5C5363DDB648}.Debug|x64.ActiveCfg = Debug|x64 + {13D31BD0-B598-4468-9AA2-5C5363DDB648}.Debug|x64.Build.0 = Debug|x64 ++ {13D31BD0-B598-4468-9AA2-5C5363DDB648}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {13D31BD0-B598-4468-9AA2-5C5363DDB648}.Release|ARM64.Build.0 = Release|ARM64 + {13D31BD0-B598-4468-9AA2-5C5363DDB648}.Release|Win32.ActiveCfg = Release|Win32 + {13D31BD0-B598-4468-9AA2-5C5363DDB648}.Release|Win32.Build.0 = Release|Win32 + {13D31BD0-B598-4468-9AA2-5C5363DDB648}.Release|x64.ActiveCfg = Release|x64 + {13D31BD0-B598-4468-9AA2-5C5363DDB648}.Release|x64.Build.0 = Release|x64 ++ {85668C77-928A-49FB-9844-0E975140E32F}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {85668C77-928A-49FB-9844-0E975140E32F}.Debug|ARM64.Build.0 = Debug|ARM64 + {85668C77-928A-49FB-9844-0E975140E32F}.Debug|Win32.ActiveCfg = Debug|Win32 + {85668C77-928A-49FB-9844-0E975140E32F}.Debug|Win32.Build.0 = Debug|Win32 + {85668C77-928A-49FB-9844-0E975140E32F}.Debug|x64.ActiveCfg = Debug|x64 + {85668C77-928A-49FB-9844-0E975140E32F}.Debug|x64.Build.0 = Debug|x64 ++ {85668C77-928A-49FB-9844-0E975140E32F}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {85668C77-928A-49FB-9844-0E975140E32F}.Release|ARM64.Build.0 = Release|ARM64 + {85668C77-928A-49FB-9844-0E975140E32F}.Release|Win32.ActiveCfg = Release|Win32 + {85668C77-928A-49FB-9844-0E975140E32F}.Release|Win32.Build.0 = Release|Win32 + {85668C77-928A-49FB-9844-0E975140E32F}.Release|x64.ActiveCfg = Release|x64 + {85668C77-928A-49FB-9844-0E975140E32F}.Release|x64.Build.0 = Release|x64 ++ {5D6BF8AC-E329-473C-8E66-020458740EC2}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {5D6BF8AC-E329-473C-8E66-020458740EC2}.Debug|ARM64.Build.0 = Debug|ARM64 + {5D6BF8AC-E329-473C-8E66-020458740EC2}.Debug|Win32.ActiveCfg = Debug|Win32 + {5D6BF8AC-E329-473C-8E66-020458740EC2}.Debug|Win32.Build.0 = Debug|Win32 + {5D6BF8AC-E329-473C-8E66-020458740EC2}.Debug|x64.ActiveCfg = Debug|x64 + {5D6BF8AC-E329-473C-8E66-020458740EC2}.Debug|x64.Build.0 = Debug|x64 ++ {5D6BF8AC-E329-473C-8E66-020458740EC2}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {5D6BF8AC-E329-473C-8E66-020458740EC2}.Release|ARM64.Build.0 = Release|ARM64 + {5D6BF8AC-E329-473C-8E66-020458740EC2}.Release|Win32.ActiveCfg = Release|Win32 + {5D6BF8AC-E329-473C-8E66-020458740EC2}.Release|Win32.Build.0 = Release|Win32 + {5D6BF8AC-E329-473C-8E66-020458740EC2}.Release|x64.ActiveCfg = Release|x64 + {5D6BF8AC-E329-473C-8E66-020458740EC2}.Release|x64.Build.0 = Release|x64 ++ {30690FC7-2E6D-493E-88D6-BF963BE8A8A2}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {30690FC7-2E6D-493E-88D6-BF963BE8A8A2}.Debug|ARM64.Build.0 = Debug|ARM64 + {30690FC7-2E6D-493E-88D6-BF963BE8A8A2}.Debug|Win32.ActiveCfg = Debug|Win32 + {30690FC7-2E6D-493E-88D6-BF963BE8A8A2}.Debug|Win32.Build.0 = Debug|Win32 + {30690FC7-2E6D-493E-88D6-BF963BE8A8A2}.Debug|x64.ActiveCfg = Debug|x64 + {30690FC7-2E6D-493E-88D6-BF963BE8A8A2}.Debug|x64.Build.0 = Debug|x64 ++ {30690FC7-2E6D-493E-88D6-BF963BE8A8A2}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {30690FC7-2E6D-493E-88D6-BF963BE8A8A2}.Release|ARM64.Build.0 = Release|ARM64 + {30690FC7-2E6D-493E-88D6-BF963BE8A8A2}.Release|Win32.ActiveCfg = Release|Win32 + {30690FC7-2E6D-493E-88D6-BF963BE8A8A2}.Release|Win32.Build.0 = Release|Win32 + {30690FC7-2E6D-493E-88D6-BF963BE8A8A2}.Release|x64.ActiveCfg = Release|x64 + {30690FC7-2E6D-493E-88D6-BF963BE8A8A2}.Release|x64.Build.0 = Release|x64 ++ {BC4DC963-603B-4969-8141-ECAEFECD8D87}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {BC4DC963-603B-4969-8141-ECAEFECD8D87}.Debug|ARM64.Build.0 = Debug|ARM64 + {BC4DC963-603B-4969-8141-ECAEFECD8D87}.Debug|Win32.ActiveCfg = Debug|Win32 + {BC4DC963-603B-4969-8141-ECAEFECD8D87}.Debug|Win32.Build.0 = Debug|Win32 + {BC4DC963-603B-4969-8141-ECAEFECD8D87}.Debug|x64.ActiveCfg = Debug|x64 + {BC4DC963-603B-4969-8141-ECAEFECD8D87}.Debug|x64.Build.0 = Debug|x64 ++ {BC4DC963-603B-4969-8141-ECAEFECD8D87}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {BC4DC963-603B-4969-8141-ECAEFECD8D87}.Release|ARM64.Build.0 = Release|ARM64 + {BC4DC963-603B-4969-8141-ECAEFECD8D87}.Release|Win32.ActiveCfg = Release|Win32 + {BC4DC963-603B-4969-8141-ECAEFECD8D87}.Release|Win32.Build.0 = Release|Win32 + {BC4DC963-603B-4969-8141-ECAEFECD8D87}.Release|x64.ActiveCfg = Release|x64 + {BC4DC963-603B-4969-8141-ECAEFECD8D87}.Release|x64.Build.0 = Release|x64 ++ {8502DF4F-A2FB-4033-AAA2-F4C707EB4AB3}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {8502DF4F-A2FB-4033-AAA2-F4C707EB4AB3}.Debug|ARM64.Build.0 = Debug|ARM64 + {8502DF4F-A2FB-4033-AAA2-F4C707EB4AB3}.Debug|Win32.ActiveCfg = Debug|Win32 + {8502DF4F-A2FB-4033-AAA2-F4C707EB4AB3}.Debug|Win32.Build.0 = Debug|Win32 + {8502DF4F-A2FB-4033-AAA2-F4C707EB4AB3}.Debug|x64.ActiveCfg = Debug|x64 + {8502DF4F-A2FB-4033-AAA2-F4C707EB4AB3}.Debug|x64.Build.0 = Debug|x64 ++ {8502DF4F-A2FB-4033-AAA2-F4C707EB4AB3}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {8502DF4F-A2FB-4033-AAA2-F4C707EB4AB3}.Release|ARM64.Build.0 = Release|ARM64 + {8502DF4F-A2FB-4033-AAA2-F4C707EB4AB3}.Release|Win32.ActiveCfg = Release|Win32 + {8502DF4F-A2FB-4033-AAA2-F4C707EB4AB3}.Release|Win32.Build.0 = Release|Win32 + {8502DF4F-A2FB-4033-AAA2-F4C707EB4AB3}.Release|x64.ActiveCfg = Release|x64 + {8502DF4F-A2FB-4033-AAA2-F4C707EB4AB3}.Release|x64.Build.0 = Release|x64 ++ {B2446452-DF81-48E3-8244-88A76549EE47}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {B2446452-DF81-48E3-8244-88A76549EE47}.Debug|ARM64.Build.0 = Debug|ARM64 + {B2446452-DF81-48E3-8244-88A76549EE47}.Debug|Win32.ActiveCfg = Debug|Win32 + {B2446452-DF81-48E3-8244-88A76549EE47}.Debug|Win32.Build.0 = Debug|Win32 + {B2446452-DF81-48E3-8244-88A76549EE47}.Debug|x64.ActiveCfg = Debug|x64 + {B2446452-DF81-48E3-8244-88A76549EE47}.Debug|x64.Build.0 = Debug|x64 ++ {B2446452-DF81-48E3-8244-88A76549EE47}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {B2446452-DF81-48E3-8244-88A76549EE47}.Release|ARM64.Build.0 = Release|ARM64 + {B2446452-DF81-48E3-8244-88A76549EE47}.Release|Win32.ActiveCfg = Release|Win32 + {B2446452-DF81-48E3-8244-88A76549EE47}.Release|Win32.Build.0 = Release|Win32 + {B2446452-DF81-48E3-8244-88A76549EE47}.Release|x64.ActiveCfg = Release|x64 + {B2446452-DF81-48E3-8244-88A76549EE47}.Release|x64.Build.0 = Release|x64 ++ {1E7722BB-1F2F-475A-8F12-36A6A4DB68C3}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {1E7722BB-1F2F-475A-8F12-36A6A4DB68C3}.Debug|ARM64.Build.0 = Debug|ARM64 + {1E7722BB-1F2F-475A-8F12-36A6A4DB68C3}.Debug|Win32.ActiveCfg = Debug|Win32 + {1E7722BB-1F2F-475A-8F12-36A6A4DB68C3}.Debug|Win32.Build.0 = Debug|Win32 + {1E7722BB-1F2F-475A-8F12-36A6A4DB68C3}.Debug|x64.ActiveCfg = Debug|x64 + {1E7722BB-1F2F-475A-8F12-36A6A4DB68C3}.Debug|x64.Build.0 = Debug|x64 ++ {1E7722BB-1F2F-475A-8F12-36A6A4DB68C3}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {1E7722BB-1F2F-475A-8F12-36A6A4DB68C3}.Release|ARM64.Build.0 = Release|ARM64 + {1E7722BB-1F2F-475A-8F12-36A6A4DB68C3}.Release|Win32.ActiveCfg = Release|Win32 + {1E7722BB-1F2F-475A-8F12-36A6A4DB68C3}.Release|Win32.Build.0 = Release|Win32 + {1E7722BB-1F2F-475A-8F12-36A6A4DB68C3}.Release|x64.ActiveCfg = Release|x64 + {1E7722BB-1F2F-475A-8F12-36A6A4DB68C3}.Release|x64.Build.0 = Release|x64 ++ {0E5EF163-AC52-4CD9-B680-F90DAE280DCE}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {0E5EF163-AC52-4CD9-B680-F90DAE280DCE}.Debug|ARM64.Build.0 = Debug|ARM64 + {0E5EF163-AC52-4CD9-B680-F90DAE280DCE}.Debug|Win32.ActiveCfg = Debug|Win32 + {0E5EF163-AC52-4CD9-B680-F90DAE280DCE}.Debug|Win32.Build.0 = Debug|Win32 + {0E5EF163-AC52-4CD9-B680-F90DAE280DCE}.Debug|x64.ActiveCfg = Debug|x64 + {0E5EF163-AC52-4CD9-B680-F90DAE280DCE}.Debug|x64.Build.0 = Debug|x64 ++ {0E5EF163-AC52-4CD9-B680-F90DAE280DCE}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {0E5EF163-AC52-4CD9-B680-F90DAE280DCE}.Release|ARM64.Build.0 = Release|ARM64 + {0E5EF163-AC52-4CD9-B680-F90DAE280DCE}.Release|Win32.ActiveCfg = Release|Win32 + {0E5EF163-AC52-4CD9-B680-F90DAE280DCE}.Release|Win32.Build.0 = Release|Win32 + {0E5EF163-AC52-4CD9-B680-F90DAE280DCE}.Release|x64.ActiveCfg = Release|x64 + {0E5EF163-AC52-4CD9-B680-F90DAE280DCE}.Release|x64.Build.0 = Release|x64 ++ {15B97F60-510B-41E2-9B4F-80ED90497763}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {15B97F60-510B-41E2-9B4F-80ED90497763}.Debug|ARM64.Build.0 = Debug|ARM64 + {15B97F60-510B-41E2-9B4F-80ED90497763}.Debug|Win32.ActiveCfg = Debug|Win32 + {15B97F60-510B-41E2-9B4F-80ED90497763}.Debug|Win32.Build.0 = Debug|Win32 + {15B97F60-510B-41E2-9B4F-80ED90497763}.Debug|x64.ActiveCfg = Debug|x64 + {15B97F60-510B-41E2-9B4F-80ED90497763}.Debug|x64.Build.0 = Debug|x64 ++ {15B97F60-510B-41E2-9B4F-80ED90497763}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {15B97F60-510B-41E2-9B4F-80ED90497763}.Release|ARM64.Build.0 = Release|ARM64 + {15B97F60-510B-41E2-9B4F-80ED90497763}.Release|Win32.ActiveCfg = Release|Win32 + {15B97F60-510B-41E2-9B4F-80ED90497763}.Release|Win32.Build.0 = Release|Win32 + {15B97F60-510B-41E2-9B4F-80ED90497763}.Release|x64.ActiveCfg = Release|x64 + {15B97F60-510B-41E2-9B4F-80ED90497763}.Release|x64.Build.0 = Release|x64 ++ {B095FDE3-CFD2-4612-8D99-202C275A2B76}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {B095FDE3-CFD2-4612-8D99-202C275A2B76}.Debug|ARM64.Build.0 = Debug|ARM64 + {B095FDE3-CFD2-4612-8D99-202C275A2B76}.Debug|Win32.ActiveCfg = Debug|Win32 + {B095FDE3-CFD2-4612-8D99-202C275A2B76}.Debug|Win32.Build.0 = Debug|Win32 + {B095FDE3-CFD2-4612-8D99-202C275A2B76}.Debug|x64.ActiveCfg = Debug|x64 + {B095FDE3-CFD2-4612-8D99-202C275A2B76}.Debug|x64.Build.0 = Debug|x64 ++ {B095FDE3-CFD2-4612-8D99-202C275A2B76}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {B095FDE3-CFD2-4612-8D99-202C275A2B76}.Release|ARM64.Build.0 = Release|ARM64 + {B095FDE3-CFD2-4612-8D99-202C275A2B76}.Release|Win32.ActiveCfg = Release|Win32 + {B095FDE3-CFD2-4612-8D99-202C275A2B76}.Release|Win32.Build.0 = Release|Win32 + {B095FDE3-CFD2-4612-8D99-202C275A2B76}.Release|x64.ActiveCfg = Release|x64 + {B095FDE3-CFD2-4612-8D99-202C275A2B76}.Release|x64.Build.0 = Release|x64 ++ {8FA19AAE-38EF-42F9-BDD0-B77F08833068}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {8FA19AAE-38EF-42F9-BDD0-B77F08833068}.Debug|ARM64.Build.0 = Debug|ARM64 + {8FA19AAE-38EF-42F9-BDD0-B77F08833068}.Debug|Win32.ActiveCfg = Debug|Win32 + {8FA19AAE-38EF-42F9-BDD0-B77F08833068}.Debug|Win32.Build.0 = Debug|Win32 + {8FA19AAE-38EF-42F9-BDD0-B77F08833068}.Debug|x64.ActiveCfg = Debug|x64 + {8FA19AAE-38EF-42F9-BDD0-B77F08833068}.Debug|x64.Build.0 = Debug|x64 ++ {8FA19AAE-38EF-42F9-BDD0-B77F08833068}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {8FA19AAE-38EF-42F9-BDD0-B77F08833068}.Release|ARM64.Build.0 = Release|ARM64 + {8FA19AAE-38EF-42F9-BDD0-B77F08833068}.Release|Win32.ActiveCfg = Release|Win32 + {8FA19AAE-38EF-42F9-BDD0-B77F08833068}.Release|Win32.Build.0 = Release|Win32 + {8FA19AAE-38EF-42F9-BDD0-B77F08833068}.Release|x64.ActiveCfg = Release|x64 + {8FA19AAE-38EF-42F9-BDD0-B77F08833068}.Release|x64.Build.0 = Release|x64 ++ {896E9492-0D80-4372-B385-1E5ACB805604}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {896E9492-0D80-4372-B385-1E5ACB805604}.Debug|ARM64.Build.0 = Debug|ARM64 + {896E9492-0D80-4372-B385-1E5ACB805604}.Debug|Win32.ActiveCfg = Debug|Win32 + {896E9492-0D80-4372-B385-1E5ACB805604}.Debug|Win32.Build.0 = Debug|Win32 + {896E9492-0D80-4372-B385-1E5ACB805604}.Debug|x64.ActiveCfg = Debug|x64 + {896E9492-0D80-4372-B385-1E5ACB805604}.Debug|x64.Build.0 = Debug|x64 ++ {896E9492-0D80-4372-B385-1E5ACB805604}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {896E9492-0D80-4372-B385-1E5ACB805604}.Release|ARM64.Build.0 = Release|ARM64 + {896E9492-0D80-4372-B385-1E5ACB805604}.Release|Win32.ActiveCfg = Release|Win32 + {896E9492-0D80-4372-B385-1E5ACB805604}.Release|Win32.Build.0 = Release|Win32 + {896E9492-0D80-4372-B385-1E5ACB805604}.Release|x64.ActiveCfg = Release|x64 + {896E9492-0D80-4372-B385-1E5ACB805604}.Release|x64.Build.0 = Release|x64 ++ {0414F249-0D60-46C7-B70E-16FD9D25C8D7}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {0414F249-0D60-46C7-B70E-16FD9D25C8D7}.Debug|ARM64.Build.0 = Debug|ARM64 + {0414F249-0D60-46C7-B70E-16FD9D25C8D7}.Debug|Win32.ActiveCfg = Debug|Win32 + {0414F249-0D60-46C7-B70E-16FD9D25C8D7}.Debug|Win32.Build.0 = Debug|Win32 + {0414F249-0D60-46C7-B70E-16FD9D25C8D7}.Debug|x64.ActiveCfg = Debug|x64 + {0414F249-0D60-46C7-B70E-16FD9D25C8D7}.Debug|x64.Build.0 = Debug|x64 ++ {0414F249-0D60-46C7-B70E-16FD9D25C8D7}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {0414F249-0D60-46C7-B70E-16FD9D25C8D7}.Release|ARM64.Build.0 = Release|ARM64 + {0414F249-0D60-46C7-B70E-16FD9D25C8D7}.Release|Win32.ActiveCfg = Release|Win32 + {0414F249-0D60-46C7-B70E-16FD9D25C8D7}.Release|Win32.Build.0 = Release|Win32 + {0414F249-0D60-46C7-B70E-16FD9D25C8D7}.Release|x64.ActiveCfg = Release|x64 + {0414F249-0D60-46C7-B70E-16FD9D25C8D7}.Release|x64.Build.0 = Release|x64 ++ {2DE033B4-1CD2-44C0-A824-09AFCE213C42}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {2DE033B4-1CD2-44C0-A824-09AFCE213C42}.Debug|ARM64.Build.0 = Debug|ARM64 + {2DE033B4-1CD2-44C0-A824-09AFCE213C42}.Debug|Win32.ActiveCfg = Debug|Win32 + {2DE033B4-1CD2-44C0-A824-09AFCE213C42}.Debug|Win32.Build.0 = Debug|Win32 + {2DE033B4-1CD2-44C0-A824-09AFCE213C42}.Debug|x64.ActiveCfg = Debug|x64 + {2DE033B4-1CD2-44C0-A824-09AFCE213C42}.Debug|x64.Build.0 = Debug|x64 ++ {2DE033B4-1CD2-44C0-A824-09AFCE213C42}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {2DE033B4-1CD2-44C0-A824-09AFCE213C42}.Release|ARM64.Build.0 = Release|ARM64 + {2DE033B4-1CD2-44C0-A824-09AFCE213C42}.Release|Win32.ActiveCfg = Release|Win32 + {2DE033B4-1CD2-44C0-A824-09AFCE213C42}.Release|Win32.Build.0 = Release|Win32 + {2DE033B4-1CD2-44C0-A824-09AFCE213C42}.Release|x64.ActiveCfg = Release|x64 + {2DE033B4-1CD2-44C0-A824-09AFCE213C42}.Release|x64.Build.0 = Release|x64 ++ {D52FB1F4-FFF9-4546-B691-3EBEEB982E5D}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {D52FB1F4-FFF9-4546-B691-3EBEEB982E5D}.Debug|ARM64.Build.0 = Debug|ARM64 + {D52FB1F4-FFF9-4546-B691-3EBEEB982E5D}.Debug|Win32.ActiveCfg = Debug|Win32 + {D52FB1F4-FFF9-4546-B691-3EBEEB982E5D}.Debug|Win32.Build.0 = Debug|Win32 + {D52FB1F4-FFF9-4546-B691-3EBEEB982E5D}.Debug|x64.ActiveCfg = Debug|x64 + {D52FB1F4-FFF9-4546-B691-3EBEEB982E5D}.Debug|x64.Build.0 = Debug|x64 ++ {D52FB1F4-FFF9-4546-B691-3EBEEB982E5D}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {D52FB1F4-FFF9-4546-B691-3EBEEB982E5D}.Release|ARM64.Build.0 = Release|ARM64 + {D52FB1F4-FFF9-4546-B691-3EBEEB982E5D}.Release|Win32.ActiveCfg = Release|Win32 + {D52FB1F4-FFF9-4546-B691-3EBEEB982E5D}.Release|Win32.Build.0 = Release|Win32 + {D52FB1F4-FFF9-4546-B691-3EBEEB982E5D}.Release|x64.ActiveCfg = Release|x64 + {D52FB1F4-FFF9-4546-B691-3EBEEB982E5D}.Release|x64.Build.0 = Release|x64 ++ {95B42F70-8AB5-4CC6-8C7D-A466F78CE119}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {95B42F70-8AB5-4CC6-8C7D-A466F78CE119}.Debug|ARM64.Build.0 = Debug|ARM64 + {95B42F70-8AB5-4CC6-8C7D-A466F78CE119}.Debug|Win32.ActiveCfg = Debug|Win32 + {95B42F70-8AB5-4CC6-8C7D-A466F78CE119}.Debug|Win32.Build.0 = Debug|Win32 + {95B42F70-8AB5-4CC6-8C7D-A466F78CE119}.Debug|x64.ActiveCfg = Debug|x64 + {95B42F70-8AB5-4CC6-8C7D-A466F78CE119}.Debug|x64.Build.0 = Debug|x64 ++ {95B42F70-8AB5-4CC6-8C7D-A466F78CE119}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {95B42F70-8AB5-4CC6-8C7D-A466F78CE119}.Release|ARM64.Build.0 = Release|ARM64 + {95B42F70-8AB5-4CC6-8C7D-A466F78CE119}.Release|Win32.ActiveCfg = Release|Win32 + {95B42F70-8AB5-4CC6-8C7D-A466F78CE119}.Release|Win32.Build.0 = Release|Win32 + {95B42F70-8AB5-4CC6-8C7D-A466F78CE119}.Release|x64.ActiveCfg = Release|x64 + {95B42F70-8AB5-4CC6-8C7D-A466F78CE119}.Release|x64.Build.0 = Release|x64 ++ {F6B45CEC-339B-4153-A8A3-696EEF12C058}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {F6B45CEC-339B-4153-A8A3-696EEF12C058}.Debug|ARM64.Build.0 = Debug|ARM64 + {F6B45CEC-339B-4153-A8A3-696EEF12C058}.Debug|Win32.ActiveCfg = Debug|Win32 + {F6B45CEC-339B-4153-A8A3-696EEF12C058}.Debug|Win32.Build.0 = Debug|Win32 + {F6B45CEC-339B-4153-A8A3-696EEF12C058}.Debug|x64.ActiveCfg = Debug|x64 + {F6B45CEC-339B-4153-A8A3-696EEF12C058}.Debug|x64.Build.0 = Debug|x64 ++ {F6B45CEC-339B-4153-A8A3-696EEF12C058}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {F6B45CEC-339B-4153-A8A3-696EEF12C058}.Release|ARM64.Build.0 = Release|ARM64 + {F6B45CEC-339B-4153-A8A3-696EEF12C058}.Release|Win32.ActiveCfg = Release|Win32 + {F6B45CEC-339B-4153-A8A3-696EEF12C058}.Release|Win32.Build.0 = Release|Win32 + {F6B45CEC-339B-4153-A8A3-696EEF12C058}.Release|x64.ActiveCfg = Release|x64 + {F6B45CEC-339B-4153-A8A3-696EEF12C058}.Release|x64.Build.0 = Release|x64 ++ {B49D5853-266E-4C8C-A05E-DEA26051D0F4}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {B49D5853-266E-4C8C-A05E-DEA26051D0F4}.Debug|ARM64.Build.0 = Debug|ARM64 + {B49D5853-266E-4C8C-A05E-DEA26051D0F4}.Debug|Win32.ActiveCfg = Debug|Win32 + {B49D5853-266E-4C8C-A05E-DEA26051D0F4}.Debug|Win32.Build.0 = Debug|Win32 + {B49D5853-266E-4C8C-A05E-DEA26051D0F4}.Debug|x64.ActiveCfg = Debug|x64 + {B49D5853-266E-4C8C-A05E-DEA26051D0F4}.Debug|x64.Build.0 = Debug|x64 ++ {B49D5853-266E-4C8C-A05E-DEA26051D0F4}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {B49D5853-266E-4C8C-A05E-DEA26051D0F4}.Release|ARM64.Build.0 = Release|ARM64 + {B49D5853-266E-4C8C-A05E-DEA26051D0F4}.Release|Win32.ActiveCfg = Release|Win32 + {B49D5853-266E-4C8C-A05E-DEA26051D0F4}.Release|Win32.Build.0 = Release|Win32 + {B49D5853-266E-4C8C-A05E-DEA26051D0F4}.Release|x64.ActiveCfg = Release|x64 + {B49D5853-266E-4C8C-A05E-DEA26051D0F4}.Release|x64.Build.0 = Release|x64 ++ {86A79561-EC9B-451D-A535-4066F0F0E722}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {86A79561-EC9B-451D-A535-4066F0F0E722}.Debug|ARM64.Build.0 = Debug|ARM64 + {86A79561-EC9B-451D-A535-4066F0F0E722}.Debug|Win32.ActiveCfg = Debug|Win32 + {86A79561-EC9B-451D-A535-4066F0F0E722}.Debug|Win32.Build.0 = Debug|Win32 + {86A79561-EC9B-451D-A535-4066F0F0E722}.Debug|x64.ActiveCfg = Debug|x64 + {86A79561-EC9B-451D-A535-4066F0F0E722}.Debug|x64.Build.0 = Debug|x64 ++ {86A79561-EC9B-451D-A535-4066F0F0E722}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {86A79561-EC9B-451D-A535-4066F0F0E722}.Release|ARM64.Build.0 = Release|ARM64 + {86A79561-EC9B-451D-A535-4066F0F0E722}.Release|Win32.ActiveCfg = Release|Win32 + {86A79561-EC9B-451D-A535-4066F0F0E722}.Release|Win32.Build.0 = Release|Win32 + {86A79561-EC9B-451D-A535-4066F0F0E722}.Release|x64.ActiveCfg = Release|x64 + {86A79561-EC9B-451D-A535-4066F0F0E722}.Release|x64.Build.0 = Release|x64 ++ {F5A61A1F-C1C6-490B-90F6-28002FA0650E}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {F5A61A1F-C1C6-490B-90F6-28002FA0650E}.Debug|ARM64.Build.0 = Debug|ARM64 + {F5A61A1F-C1C6-490B-90F6-28002FA0650E}.Debug|Win32.ActiveCfg = Debug|Win32 + {F5A61A1F-C1C6-490B-90F6-28002FA0650E}.Debug|Win32.Build.0 = Debug|Win32 + {F5A61A1F-C1C6-490B-90F6-28002FA0650E}.Debug|x64.ActiveCfg = Debug|x64 + {F5A61A1F-C1C6-490B-90F6-28002FA0650E}.Debug|x64.Build.0 = Debug|x64 ++ {F5A61A1F-C1C6-490B-90F6-28002FA0650E}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {F5A61A1F-C1C6-490B-90F6-28002FA0650E}.Release|ARM64.Build.0 = Release|ARM64 + {F5A61A1F-C1C6-490B-90F6-28002FA0650E}.Release|Win32.ActiveCfg = Release|Win32 + {F5A61A1F-C1C6-490B-90F6-28002FA0650E}.Release|Win32.Build.0 = Release|Win32 + {F5A61A1F-C1C6-490B-90F6-28002FA0650E}.Release|x64.ActiveCfg = Release|x64 + {F5A61A1F-C1C6-490B-90F6-28002FA0650E}.Release|x64.Build.0 = Release|x64 ++ {0837655D-CF8A-4625-B9A2-C49E2B7FDC0C}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {0837655D-CF8A-4625-B9A2-C49E2B7FDC0C}.Debug|ARM64.Build.0 = Debug|ARM64 + {0837655D-CF8A-4625-B9A2-C49E2B7FDC0C}.Debug|Win32.ActiveCfg = Debug|Win32 + {0837655D-CF8A-4625-B9A2-C49E2B7FDC0C}.Debug|Win32.Build.0 = Debug|Win32 + {0837655D-CF8A-4625-B9A2-C49E2B7FDC0C}.Debug|x64.ActiveCfg = Debug|x64 + {0837655D-CF8A-4625-B9A2-C49E2B7FDC0C}.Debug|x64.Build.0 = Debug|x64 ++ {0837655D-CF8A-4625-B9A2-C49E2B7FDC0C}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {0837655D-CF8A-4625-B9A2-C49E2B7FDC0C}.Release|ARM64.Build.0 = Release|ARM64 + {0837655D-CF8A-4625-B9A2-C49E2B7FDC0C}.Release|Win32.ActiveCfg = Release|Win32 + {0837655D-CF8A-4625-B9A2-C49E2B7FDC0C}.Release|Win32.Build.0 = Release|Win32 + {0837655D-CF8A-4625-B9A2-C49E2B7FDC0C}.Release|x64.ActiveCfg = Release|x64 + {0837655D-CF8A-4625-B9A2-C49E2B7FDC0C}.Release|x64.Build.0 = Release|x64 ++ {E03D617B-BDA4-4EC8-A935-0D926E22E364}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {E03D617B-BDA4-4EC8-A935-0D926E22E364}.Debug|ARM64.Build.0 = Debug|ARM64 + {E03D617B-BDA4-4EC8-A935-0D926E22E364}.Debug|Win32.ActiveCfg = Debug|Win32 + {E03D617B-BDA4-4EC8-A935-0D926E22E364}.Debug|Win32.Build.0 = Debug|Win32 + {E03D617B-BDA4-4EC8-A935-0D926E22E364}.Debug|x64.ActiveCfg = Debug|x64 + {E03D617B-BDA4-4EC8-A935-0D926E22E364}.Debug|x64.Build.0 = Debug|x64 ++ {E03D617B-BDA4-4EC8-A935-0D926E22E364}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {E03D617B-BDA4-4EC8-A935-0D926E22E364}.Release|ARM64.Build.0 = Release|ARM64 + {E03D617B-BDA4-4EC8-A935-0D926E22E364}.Release|Win32.ActiveCfg = Release|Win32 + {E03D617B-BDA4-4EC8-A935-0D926E22E364}.Release|Win32.Build.0 = Release|Win32 + {E03D617B-BDA4-4EC8-A935-0D926E22E364}.Release|x64.ActiveCfg = Release|x64 + {E03D617B-BDA4-4EC8-A935-0D926E22E364}.Release|x64.Build.0 = Release|x64 ++ {5633803A-9A09-4087-84B0-0C63D425F72C}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {5633803A-9A09-4087-84B0-0C63D425F72C}.Debug|ARM64.Build.0 = Debug|ARM64 + {5633803A-9A09-4087-84B0-0C63D425F72C}.Debug|Win32.ActiveCfg = Debug|Win32 + {5633803A-9A09-4087-84B0-0C63D425F72C}.Debug|Win32.Build.0 = Debug|Win32 + {5633803A-9A09-4087-84B0-0C63D425F72C}.Debug|x64.ActiveCfg = Debug|x64 + {5633803A-9A09-4087-84B0-0C63D425F72C}.Debug|x64.Build.0 = Debug|x64 ++ {5633803A-9A09-4087-84B0-0C63D425F72C}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {5633803A-9A09-4087-84B0-0C63D425F72C}.Release|ARM64.Build.0 = Release|ARM64 + {5633803A-9A09-4087-84B0-0C63D425F72C}.Release|Win32.ActiveCfg = Release|Win32 + {5633803A-9A09-4087-84B0-0C63D425F72C}.Release|Win32.Build.0 = Release|Win32 + {5633803A-9A09-4087-84B0-0C63D425F72C}.Release|x64.ActiveCfg = Release|x64 + {5633803A-9A09-4087-84B0-0C63D425F72C}.Release|x64.Build.0 = Release|x64 ++ {BC1CE36E-B05B-41BB-8432-213DAF1568EA}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {BC1CE36E-B05B-41BB-8432-213DAF1568EA}.Debug|ARM64.Build.0 = Debug|ARM64 + {BC1CE36E-B05B-41BB-8432-213DAF1568EA}.Debug|Win32.ActiveCfg = Debug|Win32 + {BC1CE36E-B05B-41BB-8432-213DAF1568EA}.Debug|Win32.Build.0 = Debug|Win32 + {BC1CE36E-B05B-41BB-8432-213DAF1568EA}.Debug|x64.ActiveCfg = Debug|x64 + {BC1CE36E-B05B-41BB-8432-213DAF1568EA}.Debug|x64.Build.0 = Debug|x64 ++ {BC1CE36E-B05B-41BB-8432-213DAF1568EA}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {BC1CE36E-B05B-41BB-8432-213DAF1568EA}.Release|ARM64.Build.0 = Release|ARM64 + {BC1CE36E-B05B-41BB-8432-213DAF1568EA}.Release|Win32.ActiveCfg = Release|Win32 + {BC1CE36E-B05B-41BB-8432-213DAF1568EA}.Release|Win32.Build.0 = Release|Win32 + {BC1CE36E-B05B-41BB-8432-213DAF1568EA}.Release|x64.ActiveCfg = Release|x64 + {BC1CE36E-B05B-41BB-8432-213DAF1568EA}.Release|x64.Build.0 = Release|x64 ++ {25413149-E392-470D-9B40-4FA285C71094}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {25413149-E392-470D-9B40-4FA285C71094}.Debug|ARM64.Build.0 = Debug|ARM64 + {25413149-E392-470D-9B40-4FA285C71094}.Debug|Win32.ActiveCfg = Debug|Win32 + {25413149-E392-470D-9B40-4FA285C71094}.Debug|Win32.Build.0 = Debug|Win32 + {25413149-E392-470D-9B40-4FA285C71094}.Debug|x64.ActiveCfg = Debug|x64 + {25413149-E392-470D-9B40-4FA285C71094}.Debug|x64.Build.0 = Debug|x64 ++ {25413149-E392-470D-9B40-4FA285C71094}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {25413149-E392-470D-9B40-4FA285C71094}.Release|ARM64.Build.0 = Release|ARM64 + {25413149-E392-470D-9B40-4FA285C71094}.Release|Win32.ActiveCfg = Release|Win32 + {25413149-E392-470D-9B40-4FA285C71094}.Release|Win32.Build.0 = Release|Win32 + {25413149-E392-470D-9B40-4FA285C71094}.Release|x64.ActiveCfg = Release|x64 + {25413149-E392-470D-9B40-4FA285C71094}.Release|x64.Build.0 = Release|x64 ++ {D8143866-9AEF-4820-B712-89FF16876ABD}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {D8143866-9AEF-4820-B712-89FF16876ABD}.Debug|ARM64.Build.0 = Debug|ARM64 + {D8143866-9AEF-4820-B712-89FF16876ABD}.Debug|Win32.ActiveCfg = Debug|Win32 + {D8143866-9AEF-4820-B712-89FF16876ABD}.Debug|Win32.Build.0 = Debug|Win32 + {D8143866-9AEF-4820-B712-89FF16876ABD}.Debug|x64.ActiveCfg = Debug|x64 + {D8143866-9AEF-4820-B712-89FF16876ABD}.Debug|x64.Build.0 = Debug|x64 ++ {D8143866-9AEF-4820-B712-89FF16876ABD}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {D8143866-9AEF-4820-B712-89FF16876ABD}.Release|ARM64.Build.0 = Release|ARM64 + {D8143866-9AEF-4820-B712-89FF16876ABD}.Release|Win32.ActiveCfg = Release|Win32 + {D8143866-9AEF-4820-B712-89FF16876ABD}.Release|Win32.Build.0 = Release|Win32 + {D8143866-9AEF-4820-B712-89FF16876ABD}.Release|x64.ActiveCfg = Release|x64 + {D8143866-9AEF-4820-B712-89FF16876ABD}.Release|x64.Build.0 = Release|x64 ++ {004E35BF-4455-42C5-94DA-468597F76156}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {004E35BF-4455-42C5-94DA-468597F76156}.Debug|ARM64.Build.0 = Debug|ARM64 + {004E35BF-4455-42C5-94DA-468597F76156}.Debug|Win32.ActiveCfg = Debug|Win32 + {004E35BF-4455-42C5-94DA-468597F76156}.Debug|Win32.Build.0 = Debug|Win32 + {004E35BF-4455-42C5-94DA-468597F76156}.Debug|x64.ActiveCfg = Debug|x64 + {004E35BF-4455-42C5-94DA-468597F76156}.Debug|x64.Build.0 = Debug|x64 ++ {004E35BF-4455-42C5-94DA-468597F76156}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {004E35BF-4455-42C5-94DA-468597F76156}.Release|ARM64.Build.0 = Release|ARM64 + {004E35BF-4455-42C5-94DA-468597F76156}.Release|Win32.ActiveCfg = Release|Win32 + {004E35BF-4455-42C5-94DA-468597F76156}.Release|Win32.Build.0 = Release|Win32 + {004E35BF-4455-42C5-94DA-468597F76156}.Release|x64.ActiveCfg = Release|x64 + {004E35BF-4455-42C5-94DA-468597F76156}.Release|x64.Build.0 = Release|x64 ++ {E4F400E9-A717-4D73-ACBB-29399DA25E7F}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {E4F400E9-A717-4D73-ACBB-29399DA25E7F}.Debug|ARM64.Build.0 = Debug|ARM64 + {E4F400E9-A717-4D73-ACBB-29399DA25E7F}.Debug|Win32.ActiveCfg = Debug|Win32 + {E4F400E9-A717-4D73-ACBB-29399DA25E7F}.Debug|Win32.Build.0 = Debug|Win32 + {E4F400E9-A717-4D73-ACBB-29399DA25E7F}.Debug|x64.ActiveCfg = Debug|x64 + {E4F400E9-A717-4D73-ACBB-29399DA25E7F}.Debug|x64.Build.0 = Debug|x64 ++ {E4F400E9-A717-4D73-ACBB-29399DA25E7F}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {E4F400E9-A717-4D73-ACBB-29399DA25E7F}.Release|ARM64.Build.0 = Release|ARM64 + {E4F400E9-A717-4D73-ACBB-29399DA25E7F}.Release|Win32.ActiveCfg = Release|Win32 + {E4F400E9-A717-4D73-ACBB-29399DA25E7F}.Release|Win32.Build.0 = Release|Win32 + {E4F400E9-A717-4D73-ACBB-29399DA25E7F}.Release|x64.ActiveCfg = Release|x64 + {E4F400E9-A717-4D73-ACBB-29399DA25E7F}.Release|x64.Build.0 = Release|x64 ++ {6114120D-110E-4C81-A7F0-63EC013C56D6}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {6114120D-110E-4C81-A7F0-63EC013C56D6}.Debug|ARM64.Build.0 = Debug|ARM64 + {6114120D-110E-4C81-A7F0-63EC013C56D6}.Debug|Win32.ActiveCfg = Debug|Win32 + {6114120D-110E-4C81-A7F0-63EC013C56D6}.Debug|Win32.Build.0 = Debug|Win32 + {6114120D-110E-4C81-A7F0-63EC013C56D6}.Debug|x64.ActiveCfg = Debug|x64 + {6114120D-110E-4C81-A7F0-63EC013C56D6}.Debug|x64.Build.0 = Debug|x64 ++ {6114120D-110E-4C81-A7F0-63EC013C56D6}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {6114120D-110E-4C81-A7F0-63EC013C56D6}.Release|ARM64.Build.0 = Release|ARM64 + {6114120D-110E-4C81-A7F0-63EC013C56D6}.Release|Win32.ActiveCfg = Release|Win32 + {6114120D-110E-4C81-A7F0-63EC013C56D6}.Release|Win32.Build.0 = Release|Win32 + {6114120D-110E-4C81-A7F0-63EC013C56D6}.Release|x64.ActiveCfg = Release|x64 + {6114120D-110E-4C81-A7F0-63EC013C56D6}.Release|x64.Build.0 = Release|x64 ++ {165E9831-B8EF-4857-ACA4-261677950214}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {165E9831-B8EF-4857-ACA4-261677950214}.Debug|ARM64.Build.0 = Debug|ARM64 + {165E9831-B8EF-4857-ACA4-261677950214}.Debug|Win32.ActiveCfg = Debug|Win32 + {165E9831-B8EF-4857-ACA4-261677950214}.Debug|Win32.Build.0 = Debug|Win32 + {165E9831-B8EF-4857-ACA4-261677950214}.Debug|x64.ActiveCfg = Debug|x64 + {165E9831-B8EF-4857-ACA4-261677950214}.Debug|x64.Build.0 = Debug|x64 ++ {165E9831-B8EF-4857-ACA4-261677950214}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {165E9831-B8EF-4857-ACA4-261677950214}.Release|ARM64.Build.0 = Release|ARM64 + {165E9831-B8EF-4857-ACA4-261677950214}.Release|Win32.ActiveCfg = Release|Win32 + {165E9831-B8EF-4857-ACA4-261677950214}.Release|Win32.Build.0 = Release|Win32 + {165E9831-B8EF-4857-ACA4-261677950214}.Release|x64.ActiveCfg = Release|x64 + {165E9831-B8EF-4857-ACA4-261677950214}.Release|x64.Build.0 = Release|x64 ++ {E3C009AF-69B7-4732-8509-DD72DBA757B1}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {E3C009AF-69B7-4732-8509-DD72DBA757B1}.Debug|ARM64.Build.0 = Debug|ARM64 + {E3C009AF-69B7-4732-8509-DD72DBA757B1}.Debug|Win32.ActiveCfg = Debug|Win32 + {E3C009AF-69B7-4732-8509-DD72DBA757B1}.Debug|Win32.Build.0 = Debug|Win32 + {E3C009AF-69B7-4732-8509-DD72DBA757B1}.Debug|x64.ActiveCfg = Debug|x64 + {E3C009AF-69B7-4732-8509-DD72DBA757B1}.Debug|x64.Build.0 = Debug|x64 ++ {E3C009AF-69B7-4732-8509-DD72DBA757B1}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {E3C009AF-69B7-4732-8509-DD72DBA757B1}.Release|ARM64.Build.0 = Release|ARM64 + {E3C009AF-69B7-4732-8509-DD72DBA757B1}.Release|Win32.ActiveCfg = Release|Win32 + {E3C009AF-69B7-4732-8509-DD72DBA757B1}.Release|Win32.Build.0 = Release|Win32 + {E3C009AF-69B7-4732-8509-DD72DBA757B1}.Release|x64.ActiveCfg = Release|x64 + {E3C009AF-69B7-4732-8509-DD72DBA757B1}.Release|x64.Build.0 = Release|x64 ++ {32C0D774-5C56-46A3-B14A-625691E3B626}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {32C0D774-5C56-46A3-B14A-625691E3B626}.Debug|ARM64.Build.0 = Debug|ARM64 + {32C0D774-5C56-46A3-B14A-625691E3B626}.Debug|Win32.ActiveCfg = Debug|Win32 + {32C0D774-5C56-46A3-B14A-625691E3B626}.Debug|Win32.Build.0 = Debug|Win32 + {32C0D774-5C56-46A3-B14A-625691E3B626}.Debug|x64.ActiveCfg = Debug|x64 + {32C0D774-5C56-46A3-B14A-625691E3B626}.Debug|x64.Build.0 = Debug|x64 ++ {32C0D774-5C56-46A3-B14A-625691E3B626}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {32C0D774-5C56-46A3-B14A-625691E3B626}.Release|ARM64.Build.0 = Release|ARM64 + {32C0D774-5C56-46A3-B14A-625691E3B626}.Release|Win32.ActiveCfg = Release|Win32 + {32C0D774-5C56-46A3-B14A-625691E3B626}.Release|Win32.Build.0 = Release|Win32 + {32C0D774-5C56-46A3-B14A-625691E3B626}.Release|x64.ActiveCfg = Release|x64 + {32C0D774-5C56-46A3-B14A-625691E3B626}.Release|x64.Build.0 = Release|x64 ++ {4C3B7646-88AC-4915-A92D-7C4096EDAE24}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {4C3B7646-88AC-4915-A92D-7C4096EDAE24}.Debug|ARM64.Build.0 = Debug|ARM64 + {4C3B7646-88AC-4915-A92D-7C4096EDAE24}.Debug|Win32.ActiveCfg = Debug|Win32 + {4C3B7646-88AC-4915-A92D-7C4096EDAE24}.Debug|Win32.Build.0 = Debug|Win32 + {4C3B7646-88AC-4915-A92D-7C4096EDAE24}.Debug|x64.ActiveCfg = Debug|x64 + {4C3B7646-88AC-4915-A92D-7C4096EDAE24}.Debug|x64.Build.0 = Debug|x64 ++ {4C3B7646-88AC-4915-A92D-7C4096EDAE24}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {4C3B7646-88AC-4915-A92D-7C4096EDAE24}.Release|ARM64.Build.0 = Release|ARM64 + {4C3B7646-88AC-4915-A92D-7C4096EDAE24}.Release|Win32.ActiveCfg = Release|Win32 + {4C3B7646-88AC-4915-A92D-7C4096EDAE24}.Release|Win32.Build.0 = Release|Win32 + {4C3B7646-88AC-4915-A92D-7C4096EDAE24}.Release|x64.ActiveCfg = Release|x64 + {4C3B7646-88AC-4915-A92D-7C4096EDAE24}.Release|x64.Build.0 = Release|x64 ++ {7905E464-EAC1-4DA4-962C-D20DAC6F3327}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {7905E464-EAC1-4DA4-962C-D20DAC6F3327}.Debug|ARM64.Build.0 = Debug|ARM64 + {7905E464-EAC1-4DA4-962C-D20DAC6F3327}.Debug|Win32.ActiveCfg = Debug|Win32 + {7905E464-EAC1-4DA4-962C-D20DAC6F3327}.Debug|Win32.Build.0 = Debug|Win32 + {7905E464-EAC1-4DA4-962C-D20DAC6F3327}.Debug|x64.ActiveCfg = Debug|x64 + {7905E464-EAC1-4DA4-962C-D20DAC6F3327}.Debug|x64.Build.0 = Debug|x64 ++ {7905E464-EAC1-4DA4-962C-D20DAC6F3327}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {7905E464-EAC1-4DA4-962C-D20DAC6F3327}.Release|ARM64.Build.0 = Release|ARM64 + {7905E464-EAC1-4DA4-962C-D20DAC6F3327}.Release|Win32.ActiveCfg = Release|Win32 + {7905E464-EAC1-4DA4-962C-D20DAC6F3327}.Release|Win32.Build.0 = Release|Win32 + {7905E464-EAC1-4DA4-962C-D20DAC6F3327}.Release|x64.ActiveCfg = Release|x64 + {7905E464-EAC1-4DA4-962C-D20DAC6F3327}.Release|x64.Build.0 = Release|x64 ++ {123FA41A-5844-4ED0-821C-D465530818F9}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {123FA41A-5844-4ED0-821C-D465530818F9}.Debug|ARM64.Build.0 = Debug|ARM64 + {123FA41A-5844-4ED0-821C-D465530818F9}.Debug|Win32.ActiveCfg = Debug|Win32 + {123FA41A-5844-4ED0-821C-D465530818F9}.Debug|Win32.Build.0 = Debug|Win32 + {123FA41A-5844-4ED0-821C-D465530818F9}.Debug|x64.ActiveCfg = Debug|x64 + {123FA41A-5844-4ED0-821C-D465530818F9}.Debug|x64.Build.0 = Debug|x64 ++ {123FA41A-5844-4ED0-821C-D465530818F9}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {123FA41A-5844-4ED0-821C-D465530818F9}.Release|ARM64.Build.0 = Release|ARM64 + {123FA41A-5844-4ED0-821C-D465530818F9}.Release|Win32.ActiveCfg = Release|Win32 + {123FA41A-5844-4ED0-821C-D465530818F9}.Release|Win32.Build.0 = Release|Win32 + {123FA41A-5844-4ED0-821C-D465530818F9}.Release|x64.ActiveCfg = Release|x64 + {123FA41A-5844-4ED0-821C-D465530818F9}.Release|x64.Build.0 = Release|x64 ++ {A104B1FB-A0E0-4AA0-ABCC-D473054BB979}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {A104B1FB-A0E0-4AA0-ABCC-D473054BB979}.Debug|ARM64.Build.0 = Debug|ARM64 + {A104B1FB-A0E0-4AA0-ABCC-D473054BB979}.Debug|Win32.ActiveCfg = Debug|Win32 + {A104B1FB-A0E0-4AA0-ABCC-D473054BB979}.Debug|Win32.Build.0 = Debug|Win32 + {A104B1FB-A0E0-4AA0-ABCC-D473054BB979}.Debug|x64.ActiveCfg = Debug|x64 + {A104B1FB-A0E0-4AA0-ABCC-D473054BB979}.Debug|x64.Build.0 = Debug|x64 ++ {A104B1FB-A0E0-4AA0-ABCC-D473054BB979}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {A104B1FB-A0E0-4AA0-ABCC-D473054BB979}.Release|ARM64.Build.0 = Release|ARM64 + {A104B1FB-A0E0-4AA0-ABCC-D473054BB979}.Release|Win32.ActiveCfg = Release|Win32 + {A104B1FB-A0E0-4AA0-ABCC-D473054BB979}.Release|Win32.Build.0 = Release|Win32 + {A104B1FB-A0E0-4AA0-ABCC-D473054BB979}.Release|x64.ActiveCfg = Release|x64 + {A104B1FB-A0E0-4AA0-ABCC-D473054BB979}.Release|x64.Build.0 = Release|x64 ++ {549E1B95-D3F2-4ABE-BD3D-BDE49E75B927}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {549E1B95-D3F2-4ABE-BD3D-BDE49E75B927}.Debug|ARM64.Build.0 = Debug|ARM64 + {549E1B95-D3F2-4ABE-BD3D-BDE49E75B927}.Debug|Win32.ActiveCfg = Debug|Win32 + {549E1B95-D3F2-4ABE-BD3D-BDE49E75B927}.Debug|Win32.Build.0 = Debug|Win32 + {549E1B95-D3F2-4ABE-BD3D-BDE49E75B927}.Debug|x64.ActiveCfg = Debug|x64 + {549E1B95-D3F2-4ABE-BD3D-BDE49E75B927}.Debug|x64.Build.0 = Debug|x64 ++ {549E1B95-D3F2-4ABE-BD3D-BDE49E75B927}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {549E1B95-D3F2-4ABE-BD3D-BDE49E75B927}.Release|ARM64.Build.0 = Release|ARM64 + {549E1B95-D3F2-4ABE-BD3D-BDE49E75B927}.Release|Win32.ActiveCfg = Release|Win32 + {549E1B95-D3F2-4ABE-BD3D-BDE49E75B927}.Release|Win32.Build.0 = Release|Win32 + {549E1B95-D3F2-4ABE-BD3D-BDE49E75B927}.Release|x64.ActiveCfg = Release|x64 + {549E1B95-D3F2-4ABE-BD3D-BDE49E75B927}.Release|x64.Build.0 = Release|x64 ++ {329EF5E3-BE7D-45EC-83CB-6F80D1D97FFB}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {329EF5E3-BE7D-45EC-83CB-6F80D1D97FFB}.Debug|ARM64.Build.0 = Debug|ARM64 + {329EF5E3-BE7D-45EC-83CB-6F80D1D97FFB}.Debug|Win32.ActiveCfg = Debug|Win32 + {329EF5E3-BE7D-45EC-83CB-6F80D1D97FFB}.Debug|Win32.Build.0 = Debug|Win32 + {329EF5E3-BE7D-45EC-83CB-6F80D1D97FFB}.Debug|x64.ActiveCfg = Debug|x64 + {329EF5E3-BE7D-45EC-83CB-6F80D1D97FFB}.Debug|x64.Build.0 = Debug|x64 ++ {329EF5E3-BE7D-45EC-83CB-6F80D1D97FFB}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {329EF5E3-BE7D-45EC-83CB-6F80D1D97FFB}.Release|ARM64.Build.0 = Release|ARM64 + {329EF5E3-BE7D-45EC-83CB-6F80D1D97FFB}.Release|Win32.ActiveCfg = Release|Win32 + {329EF5E3-BE7D-45EC-83CB-6F80D1D97FFB}.Release|Win32.Build.0 = Release|Win32 + {329EF5E3-BE7D-45EC-83CB-6F80D1D97FFB}.Release|x64.ActiveCfg = Release|x64 + {329EF5E3-BE7D-45EC-83CB-6F80D1D97FFB}.Release|x64.Build.0 = Release|x64 ++ {92B49C5E-5F18-445C-B290-92AB03B27A6B}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {92B49C5E-5F18-445C-B290-92AB03B27A6B}.Debug|ARM64.Build.0 = Debug|ARM64 + {92B49C5E-5F18-445C-B290-92AB03B27A6B}.Debug|Win32.ActiveCfg = Debug|Win32 + {92B49C5E-5F18-445C-B290-92AB03B27A6B}.Debug|Win32.Build.0 = Debug|Win32 + {92B49C5E-5F18-445C-B290-92AB03B27A6B}.Debug|x64.ActiveCfg = Debug|x64 + {92B49C5E-5F18-445C-B290-92AB03B27A6B}.Debug|x64.Build.0 = Debug|x64 ++ {92B49C5E-5F18-445C-B290-92AB03B27A6B}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {92B49C5E-5F18-445C-B290-92AB03B27A6B}.Release|ARM64.Build.0 = Release|ARM64 + {92B49C5E-5F18-445C-B290-92AB03B27A6B}.Release|Win32.ActiveCfg = Release|Win32 + {92B49C5E-5F18-445C-B290-92AB03B27A6B}.Release|Win32.Build.0 = Release|Win32 + {92B49C5E-5F18-445C-B290-92AB03B27A6B}.Release|x64.ActiveCfg = Release|x64 + {92B49C5E-5F18-445C-B290-92AB03B27A6B}.Release|x64.Build.0 = Release|x64 ++ {FC8A14DB-8D5B-4609-8838-675291632ADA}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {FC8A14DB-8D5B-4609-8838-675291632ADA}.Debug|ARM64.Build.0 = Debug|ARM64 + {FC8A14DB-8D5B-4609-8838-675291632ADA}.Debug|Win32.ActiveCfg = Debug|Win32 + {FC8A14DB-8D5B-4609-8838-675291632ADA}.Debug|Win32.Build.0 = Debug|Win32 + {FC8A14DB-8D5B-4609-8838-675291632ADA}.Debug|x64.ActiveCfg = Debug|x64 + {FC8A14DB-8D5B-4609-8838-675291632ADA}.Debug|x64.Build.0 = Debug|x64 ++ {FC8A14DB-8D5B-4609-8838-675291632ADA}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {FC8A14DB-8D5B-4609-8838-675291632ADA}.Release|ARM64.Build.0 = Release|ARM64 + {FC8A14DB-8D5B-4609-8838-675291632ADA}.Release|Win32.ActiveCfg = Release|Win32 + {FC8A14DB-8D5B-4609-8838-675291632ADA}.Release|Win32.Build.0 = Release|Win32 + {FC8A14DB-8D5B-4609-8838-675291632ADA}.Release|x64.ActiveCfg = Release|x64 + {FC8A14DB-8D5B-4609-8838-675291632ADA}.Release|x64.Build.0 = Release|x64 ++ {31423127-18E5-4C60-AFF9-AE36EFE1C511}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {31423127-18E5-4C60-AFF9-AE36EFE1C511}.Debug|ARM64.Build.0 = Debug|ARM64 + {31423127-18E5-4C60-AFF9-AE36EFE1C511}.Debug|Win32.ActiveCfg = Debug|Win32 + {31423127-18E5-4C60-AFF9-AE36EFE1C511}.Debug|Win32.Build.0 = Debug|Win32 + {31423127-18E5-4C60-AFF9-AE36EFE1C511}.Debug|x64.ActiveCfg = Debug|x64 + {31423127-18E5-4C60-AFF9-AE36EFE1C511}.Debug|x64.Build.0 = Debug|x64 ++ {31423127-18E5-4C60-AFF9-AE36EFE1C511}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {31423127-18E5-4C60-AFF9-AE36EFE1C511}.Release|ARM64.Build.0 = Release|ARM64 + {31423127-18E5-4C60-AFF9-AE36EFE1C511}.Release|Win32.ActiveCfg = Release|Win32 + {31423127-18E5-4C60-AFF9-AE36EFE1C511}.Release|Win32.Build.0 = Release|Win32 + {31423127-18E5-4C60-AFF9-AE36EFE1C511}.Release|x64.ActiveCfg = Release|x64 + {31423127-18E5-4C60-AFF9-AE36EFE1C511}.Release|x64.Build.0 = Release|x64 ++ {C31DD6A8-7C99-40CE-B3BE-0F411525E1C6}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {C31DD6A8-7C99-40CE-B3BE-0F411525E1C6}.Debug|ARM64.Build.0 = Debug|ARM64 + {C31DD6A8-7C99-40CE-B3BE-0F411525E1C6}.Debug|Win32.ActiveCfg = Debug|Win32 + {C31DD6A8-7C99-40CE-B3BE-0F411525E1C6}.Debug|Win32.Build.0 = Debug|Win32 + {C31DD6A8-7C99-40CE-B3BE-0F411525E1C6}.Debug|x64.ActiveCfg = Debug|x64 + {C31DD6A8-7C99-40CE-B3BE-0F411525E1C6}.Debug|x64.Build.0 = Debug|x64 ++ {C31DD6A8-7C99-40CE-B3BE-0F411525E1C6}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {C31DD6A8-7C99-40CE-B3BE-0F411525E1C6}.Release|ARM64.Build.0 = Release|ARM64 + {C31DD6A8-7C99-40CE-B3BE-0F411525E1C6}.Release|Win32.ActiveCfg = Release|Win32 + {C31DD6A8-7C99-40CE-B3BE-0F411525E1C6}.Release|Win32.Build.0 = Release|Win32 + {C31DD6A8-7C99-40CE-B3BE-0F411525E1C6}.Release|x64.ActiveCfg = Release|x64 + {C31DD6A8-7C99-40CE-B3BE-0F411525E1C6}.Release|x64.Build.0 = Release|x64 ++ {0AE4CB71-FE7F-4969-BA2F-0C6ABF131229}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {0AE4CB71-FE7F-4969-BA2F-0C6ABF131229}.Debug|ARM64.Build.0 = Debug|ARM64 + {0AE4CB71-FE7F-4969-BA2F-0C6ABF131229}.Debug|Win32.ActiveCfg = Debug|Win32 + {0AE4CB71-FE7F-4969-BA2F-0C6ABF131229}.Debug|Win32.Build.0 = Debug|Win32 + {0AE4CB71-FE7F-4969-BA2F-0C6ABF131229}.Debug|x64.ActiveCfg = Debug|x64 + {0AE4CB71-FE7F-4969-BA2F-0C6ABF131229}.Debug|x64.Build.0 = Debug|x64 ++ {0AE4CB71-FE7F-4969-BA2F-0C6ABF131229}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {0AE4CB71-FE7F-4969-BA2F-0C6ABF131229}.Release|ARM64.Build.0 = Release|ARM64 + {0AE4CB71-FE7F-4969-BA2F-0C6ABF131229}.Release|Win32.ActiveCfg = Release|Win32 + {0AE4CB71-FE7F-4969-BA2F-0C6ABF131229}.Release|Win32.Build.0 = Release|Win32 + {0AE4CB71-FE7F-4969-BA2F-0C6ABF131229}.Release|x64.ActiveCfg = Release|x64 + {0AE4CB71-FE7F-4969-BA2F-0C6ABF131229}.Release|x64.Build.0 = Release|x64 ++ {F89148E0-94F1-4B8A-B25E-8484558047BC}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {F89148E0-94F1-4B8A-B25E-8484558047BC}.Debug|ARM64.Build.0 = Debug|ARM64 + {F89148E0-94F1-4B8A-B25E-8484558047BC}.Debug|Win32.ActiveCfg = Debug|Win32 + {F89148E0-94F1-4B8A-B25E-8484558047BC}.Debug|Win32.Build.0 = Debug|Win32 + {F89148E0-94F1-4B8A-B25E-8484558047BC}.Debug|x64.ActiveCfg = Debug|x64 + {F89148E0-94F1-4B8A-B25E-8484558047BC}.Debug|x64.Build.0 = Debug|x64 ++ {F89148E0-94F1-4B8A-B25E-8484558047BC}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {F89148E0-94F1-4B8A-B25E-8484558047BC}.Release|ARM64.Build.0 = Release|ARM64 + {F89148E0-94F1-4B8A-B25E-8484558047BC}.Release|Win32.ActiveCfg = Release|Win32 + {F89148E0-94F1-4B8A-B25E-8484558047BC}.Release|Win32.Build.0 = Release|Win32 + {F89148E0-94F1-4B8A-B25E-8484558047BC}.Release|x64.ActiveCfg = Release|x64 + {F89148E0-94F1-4B8A-B25E-8484558047BC}.Release|x64.Build.0 = Release|x64 ++ {517A628D-6961-4E71-B5EB-A85A1C1425BE}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {517A628D-6961-4E71-B5EB-A85A1C1425BE}.Debug|ARM64.Build.0 = Debug|ARM64 + {517A628D-6961-4E71-B5EB-A85A1C1425BE}.Debug|Win32.ActiveCfg = Debug|Win32 + {517A628D-6961-4E71-B5EB-A85A1C1425BE}.Debug|Win32.Build.0 = Debug|Win32 + {517A628D-6961-4E71-B5EB-A85A1C1425BE}.Debug|x64.ActiveCfg = Debug|x64 + {517A628D-6961-4E71-B5EB-A85A1C1425BE}.Debug|x64.Build.0 = Debug|x64 ++ {517A628D-6961-4E71-B5EB-A85A1C1425BE}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {517A628D-6961-4E71-B5EB-A85A1C1425BE}.Release|ARM64.Build.0 = Release|ARM64 + {517A628D-6961-4E71-B5EB-A85A1C1425BE}.Release|Win32.ActiveCfg = Release|Win32 + {517A628D-6961-4E71-B5EB-A85A1C1425BE}.Release|Win32.Build.0 = Release|Win32 + {517A628D-6961-4E71-B5EB-A85A1C1425BE}.Release|x64.ActiveCfg = Release|x64 + {517A628D-6961-4E71-B5EB-A85A1C1425BE}.Release|x64.Build.0 = Release|x64 ++ {7D1AA370-21E1-4B03-B7AE-75B9654BBCFA}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {7D1AA370-21E1-4B03-B7AE-75B9654BBCFA}.Debug|ARM64.Build.0 = Debug|ARM64 + {7D1AA370-21E1-4B03-B7AE-75B9654BBCFA}.Debug|Win32.ActiveCfg = Debug|Win32 + {7D1AA370-21E1-4B03-B7AE-75B9654BBCFA}.Debug|Win32.Build.0 = Debug|Win32 + {7D1AA370-21E1-4B03-B7AE-75B9654BBCFA}.Debug|x64.ActiveCfg = Debug|x64 + {7D1AA370-21E1-4B03-B7AE-75B9654BBCFA}.Debug|x64.Build.0 = Debug|x64 ++ {7D1AA370-21E1-4B03-B7AE-75B9654BBCFA}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {7D1AA370-21E1-4B03-B7AE-75B9654BBCFA}.Release|ARM64.Build.0 = Release|ARM64 + {7D1AA370-21E1-4B03-B7AE-75B9654BBCFA}.Release|Win32.ActiveCfg = Release|Win32 + {7D1AA370-21E1-4B03-B7AE-75B9654BBCFA}.Release|Win32.Build.0 = Release|Win32 + {7D1AA370-21E1-4B03-B7AE-75B9654BBCFA}.Release|x64.ActiveCfg = Release|x64 + {7D1AA370-21E1-4B03-B7AE-75B9654BBCFA}.Release|x64.Build.0 = Release|x64 ++ {1D0C1AC1-D607-40ED-B4A0-F013F469D10F}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {1D0C1AC1-D607-40ED-B4A0-F013F469D10F}.Debug|ARM64.Build.0 = Debug|ARM64 + {1D0C1AC1-D607-40ED-B4A0-F013F469D10F}.Debug|Win32.ActiveCfg = Debug|Win32 + {1D0C1AC1-D607-40ED-B4A0-F013F469D10F}.Debug|Win32.Build.0 = Debug|Win32 + {1D0C1AC1-D607-40ED-B4A0-F013F469D10F}.Debug|x64.ActiveCfg = Debug|x64 + {1D0C1AC1-D607-40ED-B4A0-F013F469D10F}.Debug|x64.Build.0 = Debug|x64 ++ {1D0C1AC1-D607-40ED-B4A0-F013F469D10F}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {1D0C1AC1-D607-40ED-B4A0-F013F469D10F}.Release|ARM64.Build.0 = Release|ARM64 + {1D0C1AC1-D607-40ED-B4A0-F013F469D10F}.Release|Win32.ActiveCfg = Release|Win32 + {1D0C1AC1-D607-40ED-B4A0-F013F469D10F}.Release|Win32.Build.0 = Release|Win32 + {1D0C1AC1-D607-40ED-B4A0-F013F469D10F}.Release|x64.ActiveCfg = Release|x64 + {1D0C1AC1-D607-40ED-B4A0-F013F469D10F}.Release|x64.Build.0 = Release|x64 ++ {02D6A1E4-E2C7-400B-9429-5E3D5D9480DA}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {02D6A1E4-E2C7-400B-9429-5E3D5D9480DA}.Debug|ARM64.Build.0 = Debug|ARM64 + {02D6A1E4-E2C7-400B-9429-5E3D5D9480DA}.Debug|Win32.ActiveCfg = Debug|Win32 + {02D6A1E4-E2C7-400B-9429-5E3D5D9480DA}.Debug|Win32.Build.0 = Debug|Win32 + {02D6A1E4-E2C7-400B-9429-5E3D5D9480DA}.Debug|x64.ActiveCfg = Debug|x64 + {02D6A1E4-E2C7-400B-9429-5E3D5D9480DA}.Debug|x64.Build.0 = Debug|x64 ++ {02D6A1E4-E2C7-400B-9429-5E3D5D9480DA}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {02D6A1E4-E2C7-400B-9429-5E3D5D9480DA}.Release|ARM64.Build.0 = Release|ARM64 + {02D6A1E4-E2C7-400B-9429-5E3D5D9480DA}.Release|Win32.ActiveCfg = Release|Win32 + {02D6A1E4-E2C7-400B-9429-5E3D5D9480DA}.Release|Win32.Build.0 = Release|Win32 + {02D6A1E4-E2C7-400B-9429-5E3D5D9480DA}.Release|x64.ActiveCfg = Release|x64 + {02D6A1E4-E2C7-400B-9429-5E3D5D9480DA}.Release|x64.Build.0 = Release|x64 ++ {589879B3-C37E-4EE9-A063-6FF419DC8CD1}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {589879B3-C37E-4EE9-A063-6FF419DC8CD1}.Debug|ARM64.Build.0 = Debug|ARM64 + {589879B3-C37E-4EE9-A063-6FF419DC8CD1}.Debug|Win32.ActiveCfg = Debug|Win32 + {589879B3-C37E-4EE9-A063-6FF419DC8CD1}.Debug|Win32.Build.0 = Debug|Win32 + {589879B3-C37E-4EE9-A063-6FF419DC8CD1}.Debug|x64.ActiveCfg = Debug|x64 + {589879B3-C37E-4EE9-A063-6FF419DC8CD1}.Debug|x64.Build.0 = Debug|x64 ++ {589879B3-C37E-4EE9-A063-6FF419DC8CD1}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {589879B3-C37E-4EE9-A063-6FF419DC8CD1}.Release|ARM64.Build.0 = Release|ARM64 + {589879B3-C37E-4EE9-A063-6FF419DC8CD1}.Release|Win32.ActiveCfg = Release|Win32 + {589879B3-C37E-4EE9-A063-6FF419DC8CD1}.Release|Win32.Build.0 = Release|Win32 + {589879B3-C37E-4EE9-A063-6FF419DC8CD1}.Release|x64.ActiveCfg = Release|x64 + {589879B3-C37E-4EE9-A063-6FF419DC8CD1}.Release|x64.Build.0 = Release|x64 ++ {2A6A40B9-0D5A-4457-A77B-831BD00772A7}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {2A6A40B9-0D5A-4457-A77B-831BD00772A7}.Debug|ARM64.Build.0 = Debug|ARM64 + {2A6A40B9-0D5A-4457-A77B-831BD00772A7}.Debug|Win32.ActiveCfg = Debug|Win32 + {2A6A40B9-0D5A-4457-A77B-831BD00772A7}.Debug|Win32.Build.0 = Debug|Win32 + {2A6A40B9-0D5A-4457-A77B-831BD00772A7}.Debug|x64.ActiveCfg = Debug|x64 + {2A6A40B9-0D5A-4457-A77B-831BD00772A7}.Debug|x64.Build.0 = Debug|x64 ++ {2A6A40B9-0D5A-4457-A77B-831BD00772A7}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {2A6A40B9-0D5A-4457-A77B-831BD00772A7}.Release|ARM64.Build.0 = Release|ARM64 + {2A6A40B9-0D5A-4457-A77B-831BD00772A7}.Release|Win32.ActiveCfg = Release|Win32 + {2A6A40B9-0D5A-4457-A77B-831BD00772A7}.Release|Win32.Build.0 = Release|Win32 + {2A6A40B9-0D5A-4457-A77B-831BD00772A7}.Release|x64.ActiveCfg = Release|x64 + {2A6A40B9-0D5A-4457-A77B-831BD00772A7}.Release|x64.Build.0 = Release|x64 ++ {CAC13AAE-ABF9-47E2-8DFB-08AA506FF50A}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {CAC13AAE-ABF9-47E2-8DFB-08AA506FF50A}.Debug|ARM64.Build.0 = Debug|ARM64 + {CAC13AAE-ABF9-47E2-8DFB-08AA506FF50A}.Debug|Win32.ActiveCfg = Debug|Win32 + {CAC13AAE-ABF9-47E2-8DFB-08AA506FF50A}.Debug|Win32.Build.0 = Debug|Win32 + {CAC13AAE-ABF9-47E2-8DFB-08AA506FF50A}.Debug|x64.ActiveCfg = Debug|x64 + {CAC13AAE-ABF9-47E2-8DFB-08AA506FF50A}.Debug|x64.Build.0 = Debug|x64 ++ {CAC13AAE-ABF9-47E2-8DFB-08AA506FF50A}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {CAC13AAE-ABF9-47E2-8DFB-08AA506FF50A}.Release|ARM64.Build.0 = Release|ARM64 + {CAC13AAE-ABF9-47E2-8DFB-08AA506FF50A}.Release|Win32.ActiveCfg = Release|Win32 + {CAC13AAE-ABF9-47E2-8DFB-08AA506FF50A}.Release|Win32.Build.0 = Release|Win32 + {CAC13AAE-ABF9-47E2-8DFB-08AA506FF50A}.Release|x64.ActiveCfg = Release|x64 + {CAC13AAE-ABF9-47E2-8DFB-08AA506FF50A}.Release|x64.Build.0 = Release|x64 ++ {A18471D1-BEDD-464A-8581-6B128A828B07}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {A18471D1-BEDD-464A-8581-6B128A828B07}.Debug|ARM64.Build.0 = Debug|ARM64 + {A18471D1-BEDD-464A-8581-6B128A828B07}.Debug|Win32.ActiveCfg = Debug|Win32 + {A18471D1-BEDD-464A-8581-6B128A828B07}.Debug|Win32.Build.0 = Debug|Win32 + {A18471D1-BEDD-464A-8581-6B128A828B07}.Debug|x64.ActiveCfg = Debug|x64 + {A18471D1-BEDD-464A-8581-6B128A828B07}.Debug|x64.Build.0 = Debug|x64 ++ {A18471D1-BEDD-464A-8581-6B128A828B07}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {A18471D1-BEDD-464A-8581-6B128A828B07}.Release|ARM64.Build.0 = Release|ARM64 + {A18471D1-BEDD-464A-8581-6B128A828B07}.Release|Win32.ActiveCfg = Release|Win32 + {A18471D1-BEDD-464A-8581-6B128A828B07}.Release|Win32.Build.0 = Release|Win32 + {A18471D1-BEDD-464A-8581-6B128A828B07}.Release|x64.ActiveCfg = Release|x64 + {A18471D1-BEDD-464A-8581-6B128A828B07}.Release|x64.Build.0 = Release|x64 ++ {7DED61E4-5229-4F03-8E52-165FE173E1A2}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {7DED61E4-5229-4F03-8E52-165FE173E1A2}.Debug|ARM64.Build.0 = Debug|ARM64 + {7DED61E4-5229-4F03-8E52-165FE173E1A2}.Debug|Win32.ActiveCfg = Debug|Win32 + {7DED61E4-5229-4F03-8E52-165FE173E1A2}.Debug|Win32.Build.0 = Debug|Win32 + {7DED61E4-5229-4F03-8E52-165FE173E1A2}.Debug|x64.ActiveCfg = Debug|x64 + {7DED61E4-5229-4F03-8E52-165FE173E1A2}.Debug|x64.Build.0 = Debug|x64 ++ {7DED61E4-5229-4F03-8E52-165FE173E1A2}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {7DED61E4-5229-4F03-8E52-165FE173E1A2}.Release|ARM64.Build.0 = Release|ARM64 + {7DED61E4-5229-4F03-8E52-165FE173E1A2}.Release|Win32.ActiveCfg = Release|Win32 + {7DED61E4-5229-4F03-8E52-165FE173E1A2}.Release|Win32.Build.0 = Release|Win32 + {7DED61E4-5229-4F03-8E52-165FE173E1A2}.Release|x64.ActiveCfg = Release|x64 + {7DED61E4-5229-4F03-8E52-165FE173E1A2}.Release|x64.Build.0 = Release|x64 ++ {18D3EF75-6C36-46C0-B102-377B37F6C3E2}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {18D3EF75-6C36-46C0-B102-377B37F6C3E2}.Debug|ARM64.Build.0 = Debug|ARM64 + {18D3EF75-6C36-46C0-B102-377B37F6C3E2}.Debug|Win32.ActiveCfg = Debug|Win32 + {18D3EF75-6C36-46C0-B102-377B37F6C3E2}.Debug|Win32.Build.0 = Debug|Win32 + {18D3EF75-6C36-46C0-B102-377B37F6C3E2}.Debug|x64.ActiveCfg = Debug|x64 + {18D3EF75-6C36-46C0-B102-377B37F6C3E2}.Debug|x64.Build.0 = Debug|x64 ++ {18D3EF75-6C36-46C0-B102-377B37F6C3E2}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {18D3EF75-6C36-46C0-B102-377B37F6C3E2}.Release|ARM64.Build.0 = Release|ARM64 + {18D3EF75-6C36-46C0-B102-377B37F6C3E2}.Release|Win32.ActiveCfg = Release|Win32 + {18D3EF75-6C36-46C0-B102-377B37F6C3E2}.Release|Win32.Build.0 = Release|Win32 + {18D3EF75-6C36-46C0-B102-377B37F6C3E2}.Release|x64.ActiveCfg = Release|x64 + {18D3EF75-6C36-46C0-B102-377B37F6C3E2}.Release|x64.Build.0 = Release|x64 ++ {EC50393D-5E56-4F43-80F5-7C816AFFBEF0}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {EC50393D-5E56-4F43-80F5-7C816AFFBEF0}.Debug|ARM64.Build.0 = Debug|ARM64 + {EC50393D-5E56-4F43-80F5-7C816AFFBEF0}.Debug|Win32.ActiveCfg = Debug|Win32 + {EC50393D-5E56-4F43-80F5-7C816AFFBEF0}.Debug|Win32.Build.0 = Debug|Win32 + {EC50393D-5E56-4F43-80F5-7C816AFFBEF0}.Debug|x64.ActiveCfg = Debug|x64 + {EC50393D-5E56-4F43-80F5-7C816AFFBEF0}.Debug|x64.Build.0 = Debug|x64 ++ {EC50393D-5E56-4F43-80F5-7C816AFFBEF0}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {EC50393D-5E56-4F43-80F5-7C816AFFBEF0}.Release|ARM64.Build.0 = Release|ARM64 + {EC50393D-5E56-4F43-80F5-7C816AFFBEF0}.Release|Win32.ActiveCfg = Release|Win32 + {EC50393D-5E56-4F43-80F5-7C816AFFBEF0}.Release|Win32.Build.0 = Release|Win32 + {EC50393D-5E56-4F43-80F5-7C816AFFBEF0}.Release|x64.ActiveCfg = Release|x64 + {EC50393D-5E56-4F43-80F5-7C816AFFBEF0}.Release|x64.Build.0 = Release|x64 ++ {FACD3CA8-671C-4A05-A7BF-B5D345F96337}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {FACD3CA8-671C-4A05-A7BF-B5D345F96337}.Debug|ARM64.Build.0 = Debug|ARM64 + {FACD3CA8-671C-4A05-A7BF-B5D345F96337}.Debug|Win32.ActiveCfg = Debug|Win32 + {FACD3CA8-671C-4A05-A7BF-B5D345F96337}.Debug|Win32.Build.0 = Debug|Win32 + {FACD3CA8-671C-4A05-A7BF-B5D345F96337}.Debug|x64.ActiveCfg = Debug|x64 + {FACD3CA8-671C-4A05-A7BF-B5D345F96337}.Debug|x64.Build.0 = Debug|x64 ++ {FACD3CA8-671C-4A05-A7BF-B5D345F96337}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {FACD3CA8-671C-4A05-A7BF-B5D345F96337}.Release|ARM64.Build.0 = Release|ARM64 + {FACD3CA8-671C-4A05-A7BF-B5D345F96337}.Release|Win32.ActiveCfg = Release|Win32 + {FACD3CA8-671C-4A05-A7BF-B5D345F96337}.Release|Win32.Build.0 = Release|Win32 + {FACD3CA8-671C-4A05-A7BF-B5D345F96337}.Release|x64.ActiveCfg = Release|x64 + {FACD3CA8-671C-4A05-A7BF-B5D345F96337}.Release|x64.Build.0 = Release|x64 ++ {E651C0A1-4574-43E9-897E-38E1A0B24F07}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {E651C0A1-4574-43E9-897E-38E1A0B24F07}.Debug|ARM64.Build.0 = Debug|ARM64 + {E651C0A1-4574-43E9-897E-38E1A0B24F07}.Debug|Win32.ActiveCfg = Debug|Win32 + {E651C0A1-4574-43E9-897E-38E1A0B24F07}.Debug|Win32.Build.0 = Debug|Win32 + {E651C0A1-4574-43E9-897E-38E1A0B24F07}.Debug|x64.ActiveCfg = Debug|x64 + {E651C0A1-4574-43E9-897E-38E1A0B24F07}.Debug|x64.Build.0 = Debug|x64 ++ {E651C0A1-4574-43E9-897E-38E1A0B24F07}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {E651C0A1-4574-43E9-897E-38E1A0B24F07}.Release|ARM64.Build.0 = Release|ARM64 + {E651C0A1-4574-43E9-897E-38E1A0B24F07}.Release|Win32.ActiveCfg = Release|Win32 + {E651C0A1-4574-43E9-897E-38E1A0B24F07}.Release|Win32.Build.0 = Release|Win32 + {E651C0A1-4574-43E9-897E-38E1A0B24F07}.Release|x64.ActiveCfg = Release|x64 + {E651C0A1-4574-43E9-897E-38E1A0B24F07}.Release|x64.Build.0 = Release|x64 ++ {8AFFEB34-67F5-4AF5-ACBF-380FF5CDB689}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {8AFFEB34-67F5-4AF5-ACBF-380FF5CDB689}.Debug|ARM64.Build.0 = Debug|ARM64 + {8AFFEB34-67F5-4AF5-ACBF-380FF5CDB689}.Debug|Win32.ActiveCfg = Debug|Win32 + {8AFFEB34-67F5-4AF5-ACBF-380FF5CDB689}.Debug|Win32.Build.0 = Debug|Win32 + {8AFFEB34-67F5-4AF5-ACBF-380FF5CDB689}.Debug|x64.ActiveCfg = Debug|x64 + {8AFFEB34-67F5-4AF5-ACBF-380FF5CDB689}.Debug|x64.Build.0 = Debug|x64 ++ {8AFFEB34-67F5-4AF5-ACBF-380FF5CDB689}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {8AFFEB34-67F5-4AF5-ACBF-380FF5CDB689}.Release|ARM64.Build.0 = Release|ARM64 + {8AFFEB34-67F5-4AF5-ACBF-380FF5CDB689}.Release|Win32.ActiveCfg = Release|Win32 + {8AFFEB34-67F5-4AF5-ACBF-380FF5CDB689}.Release|Win32.Build.0 = Release|Win32 + {8AFFEB34-67F5-4AF5-ACBF-380FF5CDB689}.Release|x64.ActiveCfg = Release|x64 + {8AFFEB34-67F5-4AF5-ACBF-380FF5CDB689}.Release|x64.Build.0 = Release|x64 ++ {C18CA7DE-01C1-4380-B5A4-E131C891476B}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {C18CA7DE-01C1-4380-B5A4-E131C891476B}.Debug|ARM64.Build.0 = Debug|ARM64 + {C18CA7DE-01C1-4380-B5A4-E131C891476B}.Debug|Win32.ActiveCfg = Debug|Win32 + {C18CA7DE-01C1-4380-B5A4-E131C891476B}.Debug|Win32.Build.0 = Debug|Win32 + {C18CA7DE-01C1-4380-B5A4-E131C891476B}.Debug|x64.ActiveCfg = Debug|x64 + {C18CA7DE-01C1-4380-B5A4-E131C891476B}.Debug|x64.Build.0 = Debug|x64 ++ {C18CA7DE-01C1-4380-B5A4-E131C891476B}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {C18CA7DE-01C1-4380-B5A4-E131C891476B}.Release|ARM64.Build.0 = Release|ARM64 + {C18CA7DE-01C1-4380-B5A4-E131C891476B}.Release|Win32.ActiveCfg = Release|Win32 + {C18CA7DE-01C1-4380-B5A4-E131C891476B}.Release|Win32.Build.0 = Release|Win32 + {C18CA7DE-01C1-4380-B5A4-E131C891476B}.Release|x64.ActiveCfg = Release|x64 + {C18CA7DE-01C1-4380-B5A4-E131C891476B}.Release|x64.Build.0 = Release|x64 ++ {9847994C-E043-4E29-9263-AB7C3E961878}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {9847994C-E043-4E29-9263-AB7C3E961878}.Debug|ARM64.Build.0 = Debug|ARM64 + {9847994C-E043-4E29-9263-AB7C3E961878}.Debug|Win32.ActiveCfg = Debug|Win32 + {9847994C-E043-4E29-9263-AB7C3E961878}.Debug|Win32.Build.0 = Debug|Win32 + {9847994C-E043-4E29-9263-AB7C3E961878}.Debug|x64.ActiveCfg = Debug|x64 + {9847994C-E043-4E29-9263-AB7C3E961878}.Debug|x64.Build.0 = Debug|x64 ++ {9847994C-E043-4E29-9263-AB7C3E961878}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {9847994C-E043-4E29-9263-AB7C3E961878}.Release|ARM64.Build.0 = Release|ARM64 + {9847994C-E043-4E29-9263-AB7C3E961878}.Release|Win32.ActiveCfg = Release|Win32 + {9847994C-E043-4E29-9263-AB7C3E961878}.Release|Win32.Build.0 = Release|Win32 + {9847994C-E043-4E29-9263-AB7C3E961878}.Release|x64.ActiveCfg = Release|x64 + {9847994C-E043-4E29-9263-AB7C3E961878}.Release|x64.Build.0 = Release|x64 ++ {CF89180E-B469-4E07-A2CB-01D0329A996D}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {CF89180E-B469-4E07-A2CB-01D0329A996D}.Debug|ARM64.Build.0 = Debug|ARM64 + {CF89180E-B469-4E07-A2CB-01D0329A996D}.Debug|Win32.ActiveCfg = Debug|Win32 + {CF89180E-B469-4E07-A2CB-01D0329A996D}.Debug|Win32.Build.0 = Debug|Win32 + {CF89180E-B469-4E07-A2CB-01D0329A996D}.Debug|x64.ActiveCfg = Debug|x64 + {CF89180E-B469-4E07-A2CB-01D0329A996D}.Debug|x64.Build.0 = Debug|x64 ++ {CF89180E-B469-4E07-A2CB-01D0329A996D}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {CF89180E-B469-4E07-A2CB-01D0329A996D}.Release|ARM64.Build.0 = Release|ARM64 + {CF89180E-B469-4E07-A2CB-01D0329A996D}.Release|Win32.ActiveCfg = Release|Win32 + {CF89180E-B469-4E07-A2CB-01D0329A996D}.Release|Win32.Build.0 = Release|Win32 + {CF89180E-B469-4E07-A2CB-01D0329A996D}.Release|x64.ActiveCfg = Release|x64 + {CF89180E-B469-4E07-A2CB-01D0329A996D}.Release|x64.Build.0 = Release|x64 ++ {96623DCD-5CBF-4D67-8619-34FD31900908}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {96623DCD-5CBF-4D67-8619-34FD31900908}.Debug|ARM64.Build.0 = Debug|ARM64 + {96623DCD-5CBF-4D67-8619-34FD31900908}.Debug|Win32.ActiveCfg = Debug|Win32 + {96623DCD-5CBF-4D67-8619-34FD31900908}.Debug|Win32.Build.0 = Debug|Win32 + {96623DCD-5CBF-4D67-8619-34FD31900908}.Debug|x64.ActiveCfg = Debug|x64 + {96623DCD-5CBF-4D67-8619-34FD31900908}.Debug|x64.Build.0 = Debug|x64 ++ {96623DCD-5CBF-4D67-8619-34FD31900908}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {96623DCD-5CBF-4D67-8619-34FD31900908}.Release|ARM64.Build.0 = Release|ARM64 + {96623DCD-5CBF-4D67-8619-34FD31900908}.Release|Win32.ActiveCfg = Release|Win32 + {96623DCD-5CBF-4D67-8619-34FD31900908}.Release|Win32.Build.0 = Release|Win32 + {96623DCD-5CBF-4D67-8619-34FD31900908}.Release|x64.ActiveCfg = Release|x64 + {96623DCD-5CBF-4D67-8619-34FD31900908}.Release|x64.Build.0 = Release|x64 ++ {6011B9C8-463C-464E-AB74-592218D89B41}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {6011B9C8-463C-464E-AB74-592218D89B41}.Debug|ARM64.Build.0 = Debug|ARM64 + {6011B9C8-463C-464E-AB74-592218D89B41}.Debug|Win32.ActiveCfg = Debug|Win32 + {6011B9C8-463C-464E-AB74-592218D89B41}.Debug|Win32.Build.0 = Debug|Win32 + {6011B9C8-463C-464E-AB74-592218D89B41}.Debug|x64.ActiveCfg = Debug|x64 + {6011B9C8-463C-464E-AB74-592218D89B41}.Debug|x64.Build.0 = Debug|x64 ++ {6011B9C8-463C-464E-AB74-592218D89B41}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {6011B9C8-463C-464E-AB74-592218D89B41}.Release|ARM64.Build.0 = Release|ARM64 + {6011B9C8-463C-464E-AB74-592218D89B41}.Release|Win32.ActiveCfg = Release|Win32 + {6011B9C8-463C-464E-AB74-592218D89B41}.Release|Win32.Build.0 = Release|Win32 + {6011B9C8-463C-464E-AB74-592218D89B41}.Release|x64.ActiveCfg = Release|x64 + {6011B9C8-463C-464E-AB74-592218D89B41}.Release|x64.Build.0 = Release|x64 ++ {9FE67414-4051-4208-B4BB-B114EABE139A}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {9FE67414-4051-4208-B4BB-B114EABE139A}.Debug|ARM64.Build.0 = Debug|ARM64 + {9FE67414-4051-4208-B4BB-B114EABE139A}.Debug|Win32.ActiveCfg = Debug|Win32 + {9FE67414-4051-4208-B4BB-B114EABE139A}.Debug|Win32.Build.0 = Debug|Win32 + {9FE67414-4051-4208-B4BB-B114EABE139A}.Debug|x64.ActiveCfg = Debug|x64 + {9FE67414-4051-4208-B4BB-B114EABE139A}.Debug|x64.Build.0 = Debug|x64 ++ {9FE67414-4051-4208-B4BB-B114EABE139A}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {9FE67414-4051-4208-B4BB-B114EABE139A}.Release|ARM64.Build.0 = Release|ARM64 + {9FE67414-4051-4208-B4BB-B114EABE139A}.Release|Win32.ActiveCfg = Release|Win32 + {9FE67414-4051-4208-B4BB-B114EABE139A}.Release|Win32.Build.0 = Release|Win32 + {9FE67414-4051-4208-B4BB-B114EABE139A}.Release|x64.ActiveCfg = Release|x64 + {9FE67414-4051-4208-B4BB-B114EABE139A}.Release|x64.Build.0 = Release|x64 ++ {BADABF03-AD0E-4717-9473-BD23B72FAA39}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {BADABF03-AD0E-4717-9473-BD23B72FAA39}.Debug|ARM64.Build.0 = Debug|ARM64 + {BADABF03-AD0E-4717-9473-BD23B72FAA39}.Debug|Win32.ActiveCfg = Debug|Win32 + {BADABF03-AD0E-4717-9473-BD23B72FAA39}.Debug|Win32.Build.0 = Debug|Win32 + {BADABF03-AD0E-4717-9473-BD23B72FAA39}.Debug|x64.ActiveCfg = Debug|x64 + {BADABF03-AD0E-4717-9473-BD23B72FAA39}.Debug|x64.Build.0 = Debug|x64 ++ {BADABF03-AD0E-4717-9473-BD23B72FAA39}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {BADABF03-AD0E-4717-9473-BD23B72FAA39}.Release|ARM64.Build.0 = Release|ARM64 + {BADABF03-AD0E-4717-9473-BD23B72FAA39}.Release|Win32.ActiveCfg = Release|Win32 + {BADABF03-AD0E-4717-9473-BD23B72FAA39}.Release|Win32.Build.0 = Release|Win32 + {BADABF03-AD0E-4717-9473-BD23B72FAA39}.Release|x64.ActiveCfg = Release|x64 + {BADABF03-AD0E-4717-9473-BD23B72FAA39}.Release|x64.Build.0 = Release|x64 ++ {C93DF7EF-78AC-4E29-AA7C-A3600BB4AA76}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {C93DF7EF-78AC-4E29-AA7C-A3600BB4AA76}.Debug|ARM64.Build.0 = Debug|ARM64 + {C93DF7EF-78AC-4E29-AA7C-A3600BB4AA76}.Debug|Win32.ActiveCfg = Debug|Win32 + {C93DF7EF-78AC-4E29-AA7C-A3600BB4AA76}.Debug|Win32.Build.0 = Debug|Win32 + {C93DF7EF-78AC-4E29-AA7C-A3600BB4AA76}.Debug|x64.ActiveCfg = Debug|x64 + {C93DF7EF-78AC-4E29-AA7C-A3600BB4AA76}.Debug|x64.Build.0 = Debug|x64 ++ {C93DF7EF-78AC-4E29-AA7C-A3600BB4AA76}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {C93DF7EF-78AC-4E29-AA7C-A3600BB4AA76}.Release|ARM64.Build.0 = Release|ARM64 + {C93DF7EF-78AC-4E29-AA7C-A3600BB4AA76}.Release|Win32.ActiveCfg = Release|Win32 + {C93DF7EF-78AC-4E29-AA7C-A3600BB4AA76}.Release|Win32.Build.0 = Release|Win32 + {C93DF7EF-78AC-4E29-AA7C-A3600BB4AA76}.Release|x64.ActiveCfg = Release|x64 + {C93DF7EF-78AC-4E29-AA7C-A3600BB4AA76}.Release|x64.Build.0 = Release|x64 ++ {D705539E-37BF-4CF1-B828-8D3D2665EB0F}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {D705539E-37BF-4CF1-B828-8D3D2665EB0F}.Debug|ARM64.Build.0 = Debug|ARM64 + {D705539E-37BF-4CF1-B828-8D3D2665EB0F}.Debug|Win32.ActiveCfg = Debug|Win32 + {D705539E-37BF-4CF1-B828-8D3D2665EB0F}.Debug|Win32.Build.0 = Debug|Win32 + {D705539E-37BF-4CF1-B828-8D3D2665EB0F}.Debug|x64.ActiveCfg = Debug|x64 + {D705539E-37BF-4CF1-B828-8D3D2665EB0F}.Debug|x64.Build.0 = Debug|x64 ++ {D705539E-37BF-4CF1-B828-8D3D2665EB0F}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {D705539E-37BF-4CF1-B828-8D3D2665EB0F}.Release|ARM64.Build.0 = Release|ARM64 + {D705539E-37BF-4CF1-B828-8D3D2665EB0F}.Release|Win32.ActiveCfg = Release|Win32 + {D705539E-37BF-4CF1-B828-8D3D2665EB0F}.Release|Win32.Build.0 = Release|Win32 + {D705539E-37BF-4CF1-B828-8D3D2665EB0F}.Release|x64.ActiveCfg = Release|x64 + {D705539E-37BF-4CF1-B828-8D3D2665EB0F}.Release|x64.Build.0 = Release|x64 ++ {225FE63C-6AA5-47CF-8605-F6D39854A042}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {225FE63C-6AA5-47CF-8605-F6D39854A042}.Debug|ARM64.Build.0 = Debug|ARM64 + {225FE63C-6AA5-47CF-8605-F6D39854A042}.Debug|Win32.ActiveCfg = Debug|Win32 + {225FE63C-6AA5-47CF-8605-F6D39854A042}.Debug|Win32.Build.0 = Debug|Win32 + {225FE63C-6AA5-47CF-8605-F6D39854A042}.Debug|x64.ActiveCfg = Debug|x64 + {225FE63C-6AA5-47CF-8605-F6D39854A042}.Debug|x64.Build.0 = Debug|x64 ++ {225FE63C-6AA5-47CF-8605-F6D39854A042}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {225FE63C-6AA5-47CF-8605-F6D39854A042}.Release|ARM64.Build.0 = Release|ARM64 + {225FE63C-6AA5-47CF-8605-F6D39854A042}.Release|Win32.ActiveCfg = Release|Win32 + {225FE63C-6AA5-47CF-8605-F6D39854A042}.Release|Win32.Build.0 = Release|Win32 + {225FE63C-6AA5-47CF-8605-F6D39854A042}.Release|x64.ActiveCfg = Release|x64 + {225FE63C-6AA5-47CF-8605-F6D39854A042}.Release|x64.Build.0 = Release|x64 ++ {9B757965-0ACF-4289-B7A0-08230AB59F79}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {9B757965-0ACF-4289-B7A0-08230AB59F79}.Debug|ARM64.Build.0 = Debug|ARM64 + {9B757965-0ACF-4289-B7A0-08230AB59F79}.Debug|Win32.ActiveCfg = Debug|Win32 + {9B757965-0ACF-4289-B7A0-08230AB59F79}.Debug|Win32.Build.0 = Debug|Win32 + {9B757965-0ACF-4289-B7A0-08230AB59F79}.Debug|x64.ActiveCfg = Debug|x64 + {9B757965-0ACF-4289-B7A0-08230AB59F79}.Debug|x64.Build.0 = Debug|x64 ++ {9B757965-0ACF-4289-B7A0-08230AB59F79}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {9B757965-0ACF-4289-B7A0-08230AB59F79}.Release|ARM64.Build.0 = Release|ARM64 + {9B757965-0ACF-4289-B7A0-08230AB59F79}.Release|Win32.ActiveCfg = Release|Win32 + {9B757965-0ACF-4289-B7A0-08230AB59F79}.Release|Win32.Build.0 = Release|Win32 + {9B757965-0ACF-4289-B7A0-08230AB59F79}.Release|x64.ActiveCfg = Release|x64 + {9B757965-0ACF-4289-B7A0-08230AB59F79}.Release|x64.Build.0 = Release|x64 ++ {EDA93DE7-D2C9-496A-A6E5-960A067D9772}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {EDA93DE7-D2C9-496A-A6E5-960A067D9772}.Debug|ARM64.Build.0 = Debug|ARM64 + {EDA93DE7-D2C9-496A-A6E5-960A067D9772}.Debug|Win32.ActiveCfg = Debug|Win32 + {EDA93DE7-D2C9-496A-A6E5-960A067D9772}.Debug|Win32.Build.0 = Debug|Win32 + {EDA93DE7-D2C9-496A-A6E5-960A067D9772}.Debug|x64.ActiveCfg = Debug|x64 + {EDA93DE7-D2C9-496A-A6E5-960A067D9772}.Debug|x64.Build.0 = Debug|x64 ++ {EDA93DE7-D2C9-496A-A6E5-960A067D9772}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {EDA93DE7-D2C9-496A-A6E5-960A067D9772}.Release|ARM64.Build.0 = Release|ARM64 + {EDA93DE7-D2C9-496A-A6E5-960A067D9772}.Release|Win32.ActiveCfg = Release|Win32 + {EDA93DE7-D2C9-496A-A6E5-960A067D9772}.Release|Win32.Build.0 = Release|Win32 + {EDA93DE7-D2C9-496A-A6E5-960A067D9772}.Release|x64.ActiveCfg = Release|x64 + {EDA93DE7-D2C9-496A-A6E5-960A067D9772}.Release|x64.Build.0 = Release|x64 ++ {11F4418F-D6C2-43E3-886D-5E60758B0B44}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {11F4418F-D6C2-43E3-886D-5E60758B0B44}.Debug|ARM64.Build.0 = Debug|ARM64 + {11F4418F-D6C2-43E3-886D-5E60758B0B44}.Debug|Win32.ActiveCfg = Debug|Win32 + {11F4418F-D6C2-43E3-886D-5E60758B0B44}.Debug|Win32.Build.0 = Debug|Win32 + {11F4418F-D6C2-43E3-886D-5E60758B0B44}.Debug|x64.ActiveCfg = Debug|x64 + {11F4418F-D6C2-43E3-886D-5E60758B0B44}.Debug|x64.Build.0 = Debug|x64 ++ {11F4418F-D6C2-43E3-886D-5E60758B0B44}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {11F4418F-D6C2-43E3-886D-5E60758B0B44}.Release|ARM64.Build.0 = Release|ARM64 + {11F4418F-D6C2-43E3-886D-5E60758B0B44}.Release|Win32.ActiveCfg = Release|Win32 + {11F4418F-D6C2-43E3-886D-5E60758B0B44}.Release|Win32.Build.0 = Release|Win32 + {11F4418F-D6C2-43E3-886D-5E60758B0B44}.Release|x64.ActiveCfg = Release|x64 + {11F4418F-D6C2-43E3-886D-5E60758B0B44}.Release|x64.Build.0 = Release|x64 ++ {26C258B1-9751-487A-9971-FF1813E5BE9F}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {26C258B1-9751-487A-9971-FF1813E5BE9F}.Debug|ARM64.Build.0 = Debug|ARM64 + {26C258B1-9751-487A-9971-FF1813E5BE9F}.Debug|Win32.ActiveCfg = Debug|Win32 + {26C258B1-9751-487A-9971-FF1813E5BE9F}.Debug|Win32.Build.0 = Debug|Win32 + {26C258B1-9751-487A-9971-FF1813E5BE9F}.Debug|x64.ActiveCfg = Debug|x64 + {26C258B1-9751-487A-9971-FF1813E5BE9F}.Debug|x64.Build.0 = Debug|x64 ++ {26C258B1-9751-487A-9971-FF1813E5BE9F}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {26C258B1-9751-487A-9971-FF1813E5BE9F}.Release|ARM64.Build.0 = Release|ARM64 + {26C258B1-9751-487A-9971-FF1813E5BE9F}.Release|Win32.ActiveCfg = Release|Win32 + {26C258B1-9751-487A-9971-FF1813E5BE9F}.Release|Win32.Build.0 = Release|Win32 + {26C258B1-9751-487A-9971-FF1813E5BE9F}.Release|x64.ActiveCfg = Release|x64 + {26C258B1-9751-487A-9971-FF1813E5BE9F}.Release|x64.Build.0 = Release|x64 ++ {11AEFA4F-1EEF-46C7-B08D-E4F2213A45B7}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {11AEFA4F-1EEF-46C7-B08D-E4F2213A45B7}.Debug|ARM64.Build.0 = Debug|ARM64 + {11AEFA4F-1EEF-46C7-B08D-E4F2213A45B7}.Debug|Win32.ActiveCfg = Debug|Win32 + {11AEFA4F-1EEF-46C7-B08D-E4F2213A45B7}.Debug|Win32.Build.0 = Debug|Win32 + {11AEFA4F-1EEF-46C7-B08D-E4F2213A45B7}.Debug|x64.ActiveCfg = Debug|x64 + {11AEFA4F-1EEF-46C7-B08D-E4F2213A45B7}.Debug|x64.Build.0 = Debug|x64 ++ {11AEFA4F-1EEF-46C7-B08D-E4F2213A45B7}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {11AEFA4F-1EEF-46C7-B08D-E4F2213A45B7}.Release|ARM64.Build.0 = Release|ARM64 + {11AEFA4F-1EEF-46C7-B08D-E4F2213A45B7}.Release|Win32.ActiveCfg = Release|Win32 + {11AEFA4F-1EEF-46C7-B08D-E4F2213A45B7}.Release|Win32.Build.0 = Release|Win32 + {11AEFA4F-1EEF-46C7-B08D-E4F2213A45B7}.Release|x64.ActiveCfg = Release|x64 + {11AEFA4F-1EEF-46C7-B08D-E4F2213A45B7}.Release|x64.Build.0 = Release|x64 ++ {9D5F7763-FF7B-4936-9861-819B5BDD9BA1}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {9D5F7763-FF7B-4936-9861-819B5BDD9BA1}.Debug|ARM64.Build.0 = Debug|ARM64 + {9D5F7763-FF7B-4936-9861-819B5BDD9BA1}.Debug|Win32.ActiveCfg = Debug|Win32 + {9D5F7763-FF7B-4936-9861-819B5BDD9BA1}.Debug|Win32.Build.0 = Debug|Win32 + {9D5F7763-FF7B-4936-9861-819B5BDD9BA1}.Debug|x64.ActiveCfg = Debug|x64 + {9D5F7763-FF7B-4936-9861-819B5BDD9BA1}.Debug|x64.Build.0 = Debug|x64 ++ {9D5F7763-FF7B-4936-9861-819B5BDD9BA1}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {9D5F7763-FF7B-4936-9861-819B5BDD9BA1}.Release|ARM64.Build.0 = Release|ARM64 + {9D5F7763-FF7B-4936-9861-819B5BDD9BA1}.Release|Win32.ActiveCfg = Release|Win32 + {9D5F7763-FF7B-4936-9861-819B5BDD9BA1}.Release|Win32.Build.0 = Release|Win32 + {9D5F7763-FF7B-4936-9861-819B5BDD9BA1}.Release|x64.ActiveCfg = Release|x64 + {9D5F7763-FF7B-4936-9861-819B5BDD9BA1}.Release|x64.Build.0 = Release|x64 ++ {A9AD6430-C35C-4A75-979C-391490242F86}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {A9AD6430-C35C-4A75-979C-391490242F86}.Debug|ARM64.Build.0 = Debug|ARM64 + {A9AD6430-C35C-4A75-979C-391490242F86}.Debug|Win32.ActiveCfg = Debug|Win32 + {A9AD6430-C35C-4A75-979C-391490242F86}.Debug|Win32.Build.0 = Debug|Win32 + {A9AD6430-C35C-4A75-979C-391490242F86}.Debug|x64.ActiveCfg = Debug|x64 + {A9AD6430-C35C-4A75-979C-391490242F86}.Debug|x64.Build.0 = Debug|x64 ++ {A9AD6430-C35C-4A75-979C-391490242F86}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {A9AD6430-C35C-4A75-979C-391490242F86}.Release|ARM64.Build.0 = Release|ARM64 + {A9AD6430-C35C-4A75-979C-391490242F86}.Release|Win32.ActiveCfg = Release|Win32 + {A9AD6430-C35C-4A75-979C-391490242F86}.Release|Win32.Build.0 = Release|Win32 + {A9AD6430-C35C-4A75-979C-391490242F86}.Release|x64.ActiveCfg = Release|x64 + {A9AD6430-C35C-4A75-979C-391490242F86}.Release|x64.Build.0 = Release|x64 ++ {D68B75F1-A6F1-425D-9923-03D67AC62D54}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {D68B75F1-A6F1-425D-9923-03D67AC62D54}.Debug|ARM64.Build.0 = Debug|ARM64 + {D68B75F1-A6F1-425D-9923-03D67AC62D54}.Debug|Win32.ActiveCfg = Debug|Win32 + {D68B75F1-A6F1-425D-9923-03D67AC62D54}.Debug|Win32.Build.0 = Debug|Win32 + {D68B75F1-A6F1-425D-9923-03D67AC62D54}.Debug|x64.ActiveCfg = Debug|x64 + {D68B75F1-A6F1-425D-9923-03D67AC62D54}.Debug|x64.Build.0 = Debug|x64 ++ {D68B75F1-A6F1-425D-9923-03D67AC62D54}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {D68B75F1-A6F1-425D-9923-03D67AC62D54}.Release|ARM64.Build.0 = Release|ARM64 + {D68B75F1-A6F1-425D-9923-03D67AC62D54}.Release|Win32.ActiveCfg = Release|Win32 + {D68B75F1-A6F1-425D-9923-03D67AC62D54}.Release|Win32.Build.0 = Release|Win32 + {D68B75F1-A6F1-425D-9923-03D67AC62D54}.Release|x64.ActiveCfg = Release|x64 + {D68B75F1-A6F1-425D-9923-03D67AC62D54}.Release|x64.Build.0 = Release|x64 ++ {943E7822-6E58-4F55-BD2F-A4A421D577E5}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {943E7822-6E58-4F55-BD2F-A4A421D577E5}.Debug|ARM64.Build.0 = Debug|ARM64 + {943E7822-6E58-4F55-BD2F-A4A421D577E5}.Debug|Win32.ActiveCfg = Debug|Win32 + {943E7822-6E58-4F55-BD2F-A4A421D577E5}.Debug|Win32.Build.0 = Debug|Win32 + {943E7822-6E58-4F55-BD2F-A4A421D577E5}.Debug|x64.ActiveCfg = Debug|x64 + {943E7822-6E58-4F55-BD2F-A4A421D577E5}.Debug|x64.Build.0 = Debug|x64 ++ {943E7822-6E58-4F55-BD2F-A4A421D577E5}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {943E7822-6E58-4F55-BD2F-A4A421D577E5}.Release|ARM64.Build.0 = Release|ARM64 + {943E7822-6E58-4F55-BD2F-A4A421D577E5}.Release|Win32.ActiveCfg = Release|Win32 + {943E7822-6E58-4F55-BD2F-A4A421D577E5}.Release|Win32.Build.0 = Release|Win32 + {943E7822-6E58-4F55-BD2F-A4A421D577E5}.Release|x64.ActiveCfg = Release|x64 + {943E7822-6E58-4F55-BD2F-A4A421D577E5}.Release|x64.Build.0 = Release|x64 ++ {0B7831C0-52EF-4A09-AD37-5E6F4CBA28E4}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {0B7831C0-52EF-4A09-AD37-5E6F4CBA28E4}.Debug|ARM64.Build.0 = Debug|ARM64 + {0B7831C0-52EF-4A09-AD37-5E6F4CBA28E4}.Debug|Win32.ActiveCfg = Debug|Win32 + {0B7831C0-52EF-4A09-AD37-5E6F4CBA28E4}.Debug|Win32.Build.0 = Debug|Win32 + {0B7831C0-52EF-4A09-AD37-5E6F4CBA28E4}.Debug|x64.ActiveCfg = Debug|x64 + {0B7831C0-52EF-4A09-AD37-5E6F4CBA28E4}.Debug|x64.Build.0 = Debug|x64 ++ {0B7831C0-52EF-4A09-AD37-5E6F4CBA28E4}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {0B7831C0-52EF-4A09-AD37-5E6F4CBA28E4}.Release|ARM64.Build.0 = Release|ARM64 + {0B7831C0-52EF-4A09-AD37-5E6F4CBA28E4}.Release|Win32.ActiveCfg = Release|Win32 + {0B7831C0-52EF-4A09-AD37-5E6F4CBA28E4}.Release|Win32.Build.0 = Release|Win32 + {0B7831C0-52EF-4A09-AD37-5E6F4CBA28E4}.Release|x64.ActiveCfg = Release|x64 + {0B7831C0-52EF-4A09-AD37-5E6F4CBA28E4}.Release|x64.Build.0 = Release|x64 ++ {2FD12E1A-40CD-4BC3-9C27-BD87B8F23A60}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {2FD12E1A-40CD-4BC3-9C27-BD87B8F23A60}.Debug|ARM64.Build.0 = Debug|ARM64 + {2FD12E1A-40CD-4BC3-9C27-BD87B8F23A60}.Debug|Win32.ActiveCfg = Debug|Win32 + {2FD12E1A-40CD-4BC3-9C27-BD87B8F23A60}.Debug|Win32.Build.0 = Debug|Win32 + {2FD12E1A-40CD-4BC3-9C27-BD87B8F23A60}.Debug|x64.ActiveCfg = Debug|x64 + {2FD12E1A-40CD-4BC3-9C27-BD87B8F23A60}.Debug|x64.Build.0 = Debug|x64 ++ {2FD12E1A-40CD-4BC3-9C27-BD87B8F23A60}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {2FD12E1A-40CD-4BC3-9C27-BD87B8F23A60}.Release|ARM64.Build.0 = Release|ARM64 + {2FD12E1A-40CD-4BC3-9C27-BD87B8F23A60}.Release|Win32.ActiveCfg = Release|Win32 + {2FD12E1A-40CD-4BC3-9C27-BD87B8F23A60}.Release|Win32.Build.0 = Release|Win32 + {2FD12E1A-40CD-4BC3-9C27-BD87B8F23A60}.Release|x64.ActiveCfg = Release|x64 + {2FD12E1A-40CD-4BC3-9C27-BD87B8F23A60}.Release|x64.Build.0 = Release|x64 ++ {4E16E373-475F-4F4A-B394-D88D0532EF0E}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {4E16E373-475F-4F4A-B394-D88D0532EF0E}.Debug|ARM64.Build.0 = Debug|ARM64 + {4E16E373-475F-4F4A-B394-D88D0532EF0E}.Debug|Win32.ActiveCfg = Debug|Win32 + {4E16E373-475F-4F4A-B394-D88D0532EF0E}.Debug|Win32.Build.0 = Debug|Win32 + {4E16E373-475F-4F4A-B394-D88D0532EF0E}.Debug|x64.ActiveCfg = Debug|x64 + {4E16E373-475F-4F4A-B394-D88D0532EF0E}.Debug|x64.Build.0 = Debug|x64 ++ {4E16E373-475F-4F4A-B394-D88D0532EF0E}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {4E16E373-475F-4F4A-B394-D88D0532EF0E}.Release|ARM64.Build.0 = Release|ARM64 + {4E16E373-475F-4F4A-B394-D88D0532EF0E}.Release|Win32.ActiveCfg = Release|Win32 + {4E16E373-475F-4F4A-B394-D88D0532EF0E}.Release|Win32.Build.0 = Release|Win32 + {4E16E373-475F-4F4A-B394-D88D0532EF0E}.Release|x64.ActiveCfg = Release|x64 + {4E16E373-475F-4F4A-B394-D88D0532EF0E}.Release|x64.Build.0 = Release|x64 ++ {0CB70131-B8C0-4780-B62E-776CD3F98BC7}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {0CB70131-B8C0-4780-B62E-776CD3F98BC7}.Debug|ARM64.Build.0 = Debug|ARM64 + {0CB70131-B8C0-4780-B62E-776CD3F98BC7}.Debug|Win32.ActiveCfg = Debug|Win32 + {0CB70131-B8C0-4780-B62E-776CD3F98BC7}.Debug|Win32.Build.0 = Debug|Win32 + {0CB70131-B8C0-4780-B62E-776CD3F98BC7}.Debug|x64.ActiveCfg = Debug|x64 + {0CB70131-B8C0-4780-B62E-776CD3F98BC7}.Debug|x64.Build.0 = Debug|x64 ++ {0CB70131-B8C0-4780-B62E-776CD3F98BC7}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {0CB70131-B8C0-4780-B62E-776CD3F98BC7}.Release|ARM64.Build.0 = Release|ARM64 + {0CB70131-B8C0-4780-B62E-776CD3F98BC7}.Release|Win32.ActiveCfg = Release|Win32 + {0CB70131-B8C0-4780-B62E-776CD3F98BC7}.Release|Win32.Build.0 = Release|Win32 + {0CB70131-B8C0-4780-B62E-776CD3F98BC7}.Release|x64.ActiveCfg = Release|x64 + {0CB70131-B8C0-4780-B62E-776CD3F98BC7}.Release|x64.Build.0 = Release|x64 ++ {9140227A-2900-4DE4-BD22-BFDD954F9BFB}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {9140227A-2900-4DE4-BD22-BFDD954F9BFB}.Debug|ARM64.Build.0 = Debug|ARM64 + {9140227A-2900-4DE4-BD22-BFDD954F9BFB}.Debug|Win32.ActiveCfg = Debug|Win32 + {9140227A-2900-4DE4-BD22-BFDD954F9BFB}.Debug|Win32.Build.0 = Debug|Win32 + {9140227A-2900-4DE4-BD22-BFDD954F9BFB}.Debug|x64.ActiveCfg = Debug|x64 + {9140227A-2900-4DE4-BD22-BFDD954F9BFB}.Debug|x64.Build.0 = Debug|x64 ++ {9140227A-2900-4DE4-BD22-BFDD954F9BFB}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {9140227A-2900-4DE4-BD22-BFDD954F9BFB}.Release|ARM64.Build.0 = Release|ARM64 + {9140227A-2900-4DE4-BD22-BFDD954F9BFB}.Release|Win32.ActiveCfg = Release|Win32 + {9140227A-2900-4DE4-BD22-BFDD954F9BFB}.Release|Win32.Build.0 = Release|Win32 + {9140227A-2900-4DE4-BD22-BFDD954F9BFB}.Release|x64.ActiveCfg = Release|x64 + {9140227A-2900-4DE4-BD22-BFDD954F9BFB}.Release|x64.Build.0 = Release|x64 ++ {9931ACC4-18E3-4251-A432-CD287DF0883C}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {9931ACC4-18E3-4251-A432-CD287DF0883C}.Debug|ARM64.Build.0 = Debug|ARM64 + {9931ACC4-18E3-4251-A432-CD287DF0883C}.Debug|Win32.ActiveCfg = Debug|Win32 + {9931ACC4-18E3-4251-A432-CD287DF0883C}.Debug|Win32.Build.0 = Debug|Win32 + {9931ACC4-18E3-4251-A432-CD287DF0883C}.Debug|x64.ActiveCfg = Debug|x64 + {9931ACC4-18E3-4251-A432-CD287DF0883C}.Debug|x64.Build.0 = Debug|x64 ++ {9931ACC4-18E3-4251-A432-CD287DF0883C}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {9931ACC4-18E3-4251-A432-CD287DF0883C}.Release|ARM64.Build.0 = Release|ARM64 + {9931ACC4-18E3-4251-A432-CD287DF0883C}.Release|Win32.ActiveCfg = Release|Win32 + {9931ACC4-18E3-4251-A432-CD287DF0883C}.Release|Win32.Build.0 = Release|Win32 + {9931ACC4-18E3-4251-A432-CD287DF0883C}.Release|x64.ActiveCfg = Release|x64 + {9931ACC4-18E3-4251-A432-CD287DF0883C}.Release|x64.Build.0 = Release|x64 ++ {8A8D1E59-166A-4C6F-8E64-CE6CC494F2F2}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {8A8D1E59-166A-4C6F-8E64-CE6CC494F2F2}.Debug|ARM64.Build.0 = Debug|ARM64 + {8A8D1E59-166A-4C6F-8E64-CE6CC494F2F2}.Debug|Win32.ActiveCfg = Debug|Win32 + {8A8D1E59-166A-4C6F-8E64-CE6CC494F2F2}.Debug|Win32.Build.0 = Debug|Win32 + {8A8D1E59-166A-4C6F-8E64-CE6CC494F2F2}.Debug|x64.ActiveCfg = Debug|x64 + {8A8D1E59-166A-4C6F-8E64-CE6CC494F2F2}.Debug|x64.Build.0 = Debug|x64 ++ {8A8D1E59-166A-4C6F-8E64-CE6CC494F2F2}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {8A8D1E59-166A-4C6F-8E64-CE6CC494F2F2}.Release|ARM64.Build.0 = Release|ARM64 + {8A8D1E59-166A-4C6F-8E64-CE6CC494F2F2}.Release|Win32.ActiveCfg = Release|Win32 + {8A8D1E59-166A-4C6F-8E64-CE6CC494F2F2}.Release|Win32.Build.0 = Release|Win32 + {8A8D1E59-166A-4C6F-8E64-CE6CC494F2F2}.Release|x64.ActiveCfg = Release|x64 + {8A8D1E59-166A-4C6F-8E64-CE6CC494F2F2}.Release|x64.Build.0 = Release|x64 ++ {F5CA9AEE-FD4D-43B8-9DE5-2A13F1AFF457}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {F5CA9AEE-FD4D-43B8-9DE5-2A13F1AFF457}.Debug|ARM64.Build.0 = Debug|ARM64 + {F5CA9AEE-FD4D-43B8-9DE5-2A13F1AFF457}.Debug|Win32.ActiveCfg = Debug|Win32 + {F5CA9AEE-FD4D-43B8-9DE5-2A13F1AFF457}.Debug|Win32.Build.0 = Debug|Win32 + {F5CA9AEE-FD4D-43B8-9DE5-2A13F1AFF457}.Debug|x64.ActiveCfg = Debug|x64 + {F5CA9AEE-FD4D-43B8-9DE5-2A13F1AFF457}.Debug|x64.Build.0 = Debug|x64 ++ {F5CA9AEE-FD4D-43B8-9DE5-2A13F1AFF457}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {F5CA9AEE-FD4D-43B8-9DE5-2A13F1AFF457}.Release|ARM64.Build.0 = Release|ARM64 + {F5CA9AEE-FD4D-43B8-9DE5-2A13F1AFF457}.Release|Win32.ActiveCfg = Release|Win32 + {F5CA9AEE-FD4D-43B8-9DE5-2A13F1AFF457}.Release|Win32.Build.0 = Release|Win32 + {F5CA9AEE-FD4D-43B8-9DE5-2A13F1AFF457}.Release|x64.ActiveCfg = Release|x64 + {F5CA9AEE-FD4D-43B8-9DE5-2A13F1AFF457}.Release|x64.Build.0 = Release|x64 ++ {DAB0C701-06F3-4FEE-AE96-262A5CBD87C7}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {DAB0C701-06F3-4FEE-AE96-262A5CBD87C7}.Debug|ARM64.Build.0 = Debug|ARM64 + {DAB0C701-06F3-4FEE-AE96-262A5CBD87C7}.Debug|Win32.ActiveCfg = Debug|Win32 + {DAB0C701-06F3-4FEE-AE96-262A5CBD87C7}.Debug|Win32.Build.0 = Debug|Win32 + {DAB0C701-06F3-4FEE-AE96-262A5CBD87C7}.Debug|x64.ActiveCfg = Debug|x64 + {DAB0C701-06F3-4FEE-AE96-262A5CBD87C7}.Debug|x64.Build.0 = Debug|x64 ++ {DAB0C701-06F3-4FEE-AE96-262A5CBD87C7}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {DAB0C701-06F3-4FEE-AE96-262A5CBD87C7}.Release|ARM64.Build.0 = Release|ARM64 + {DAB0C701-06F3-4FEE-AE96-262A5CBD87C7}.Release|Win32.ActiveCfg = Release|Win32 + {DAB0C701-06F3-4FEE-AE96-262A5CBD87C7}.Release|Win32.Build.0 = Release|Win32 + {DAB0C701-06F3-4FEE-AE96-262A5CBD87C7}.Release|x64.ActiveCfg = Release|x64 + {DAB0C701-06F3-4FEE-AE96-262A5CBD87C7}.Release|x64.Build.0 = Release|x64 ++ {75C62084-AF84-94A1-751B-1DDBBD96F648}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {75C62084-AF84-94A1-751B-1DDBBD96F648}.Debug|ARM64.Build.0 = Debug|ARM64 + {75C62084-AF84-94A1-751B-1DDBBD96F648}.Debug|Win32.ActiveCfg = Debug|Win32 + {75C62084-AF84-94A1-751B-1DDBBD96F648}.Debug|Win32.Build.0 = Debug|Win32 + {75C62084-AF84-94A1-751B-1DDBBD96F648}.Debug|x64.ActiveCfg = Debug|x64 + {75C62084-AF84-94A1-751B-1DDBBD96F648}.Debug|x64.Build.0 = Debug|x64 ++ {75C62084-AF84-94A1-751B-1DDBBD96F648}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {75C62084-AF84-94A1-751B-1DDBBD96F648}.Release|ARM64.Build.0 = Release|ARM64 + {75C62084-AF84-94A1-751B-1DDBBD96F648}.Release|Win32.ActiveCfg = Release|Win32 + {75C62084-AF84-94A1-751B-1DDBBD96F648}.Release|Win32.Build.0 = Release|Win32 + {75C62084-AF84-94A1-751B-1DDBBD96F648}.Release|x64.ActiveCfg = Release|x64 + {75C62084-AF84-94A1-751B-1DDBBD96F648}.Release|x64.Build.0 = Release|x64 ++ {C94BF7C7-CEDD-4CAF-9371-BDAABB419E8C}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {C94BF7C7-CEDD-4CAF-9371-BDAABB419E8C}.Debug|ARM64.Build.0 = Debug|ARM64 + {C94BF7C7-CEDD-4CAF-9371-BDAABB419E8C}.Debug|Win32.ActiveCfg = Debug|Win32 + {C94BF7C7-CEDD-4CAF-9371-BDAABB419E8C}.Debug|Win32.Build.0 = Debug|Win32 + {C94BF7C7-CEDD-4CAF-9371-BDAABB419E8C}.Debug|x64.ActiveCfg = Debug|x64 + {C94BF7C7-CEDD-4CAF-9371-BDAABB419E8C}.Debug|x64.Build.0 = Debug|x64 ++ {C94BF7C7-CEDD-4CAF-9371-BDAABB419E8C}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {C94BF7C7-CEDD-4CAF-9371-BDAABB419E8C}.Release|ARM64.Build.0 = Release|ARM64 + {C94BF7C7-CEDD-4CAF-9371-BDAABB419E8C}.Release|Win32.ActiveCfg = Release|Win32 + {C94BF7C7-CEDD-4CAF-9371-BDAABB419E8C}.Release|Win32.Build.0 = Release|Win32 + {C94BF7C7-CEDD-4CAF-9371-BDAABB419E8C}.Release|x64.ActiveCfg = Release|x64 + {C94BF7C7-CEDD-4CAF-9371-BDAABB419E8C}.Release|x64.Build.0 = Release|x64 ++ {73F41343-D63E-CF15-D549-DF9483F260B9}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {73F41343-D63E-CF15-D549-DF9483F260B9}.Debug|ARM64.Build.0 = Debug|ARM64 + {73F41343-D63E-CF15-D549-DF9483F260B9}.Debug|Win32.ActiveCfg = Debug|Win32 + {73F41343-D63E-CF15-D549-DF9483F260B9}.Debug|Win32.Build.0 = Debug|Win32 + {73F41343-D63E-CF15-D549-DF9483F260B9}.Debug|x64.ActiveCfg = Debug|x64 + {73F41343-D63E-CF15-D549-DF9483F260B9}.Debug|x64.Build.0 = Debug|x64 ++ {73F41343-D63E-CF15-D549-DF9483F260B9}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {73F41343-D63E-CF15-D549-DF9483F260B9}.Release|ARM64.Build.0 = Release|ARM64 + {73F41343-D63E-CF15-D549-DF9483F260B9}.Release|Win32.ActiveCfg = Release|Win32 + {73F41343-D63E-CF15-D549-DF9483F260B9}.Release|Win32.Build.0 = Release|Win32 + {73F41343-D63E-CF15-D549-DF9483F260B9}.Release|x64.ActiveCfg = Release|x64 + {73F41343-D63E-CF15-D549-DF9483F260B9}.Release|x64.Build.0 = Release|x64 ++ {EF613D11-70B1-5F25-5B2C-A561F2098B82}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {EF613D11-70B1-5F25-5B2C-A561F2098B82}.Debug|ARM64.Build.0 = Debug|ARM64 + {EF613D11-70B1-5F25-5B2C-A561F2098B82}.Debug|Win32.ActiveCfg = Debug|Win32 + {EF613D11-70B1-5F25-5B2C-A561F2098B82}.Debug|Win32.Build.0 = Debug|Win32 + {EF613D11-70B1-5F25-5B2C-A561F2098B82}.Debug|x64.ActiveCfg = Debug|x64 + {EF613D11-70B1-5F25-5B2C-A561F2098B82}.Debug|x64.Build.0 = Debug|x64 ++ {EF613D11-70B1-5F25-5B2C-A561F2098B82}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {EF613D11-70B1-5F25-5B2C-A561F2098B82}.Release|ARM64.Build.0 = Release|ARM64 + {EF613D11-70B1-5F25-5B2C-A561F2098B82}.Release|Win32.ActiveCfg = Release|Win32 + {EF613D11-70B1-5F25-5B2C-A561F2098B82}.Release|Win32.Build.0 = Release|Win32 + {EF613D11-70B1-5F25-5B2C-A561F2098B82}.Release|x64.ActiveCfg = Release|x64 + {EF613D11-70B1-5F25-5B2C-A561F2098B82}.Release|x64.Build.0 = Release|x64 ++ {4614B956-8BFC-40A7-89D0-18AE31671D7D}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {4614B956-8BFC-40A7-89D0-18AE31671D7D}.Debug|ARM64.Build.0 = Debug|ARM64 + {4614B956-8BFC-40A7-89D0-18AE31671D7D}.Debug|Win32.ActiveCfg = Debug|Win32 + {4614B956-8BFC-40A7-89D0-18AE31671D7D}.Debug|Win32.Build.0 = Debug|Win32 + {4614B956-8BFC-40A7-89D0-18AE31671D7D}.Debug|x64.ActiveCfg = Debug|x64 + {4614B956-8BFC-40A7-89D0-18AE31671D7D}.Debug|x64.Build.0 = Debug|x64 ++ {4614B956-8BFC-40A7-89D0-18AE31671D7D}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {4614B956-8BFC-40A7-89D0-18AE31671D7D}.Release|ARM64.Build.0 = Release|ARM64 + {4614B956-8BFC-40A7-89D0-18AE31671D7D}.Release|Win32.ActiveCfg = Release|Win32 + {4614B956-8BFC-40A7-89D0-18AE31671D7D}.Release|Win32.Build.0 = Release|Win32 + {4614B956-8BFC-40A7-89D0-18AE31671D7D}.Release|x64.ActiveCfg = Release|x64 + {4614B956-8BFC-40A7-89D0-18AE31671D7D}.Release|x64.Build.0 = Release|x64 ++ {78C5B90C-6509-48E8-85BD-3D4F5060351D}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {78C5B90C-6509-48E8-85BD-3D4F5060351D}.Debug|ARM64.Build.0 = Debug|ARM64 + {78C5B90C-6509-48E8-85BD-3D4F5060351D}.Debug|Win32.ActiveCfg = Debug|Win32 + {78C5B90C-6509-48E8-85BD-3D4F5060351D}.Debug|Win32.Build.0 = Debug|Win32 + {78C5B90C-6509-48E8-85BD-3D4F5060351D}.Debug|x64.ActiveCfg = Debug|x64 + {78C5B90C-6509-48E8-85BD-3D4F5060351D}.Debug|x64.Build.0 = Debug|x64 ++ {78C5B90C-6509-48E8-85BD-3D4F5060351D}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {78C5B90C-6509-48E8-85BD-3D4F5060351D}.Release|ARM64.Build.0 = Release|ARM64 + {78C5B90C-6509-48E8-85BD-3D4F5060351D}.Release|Win32.ActiveCfg = Release|Win32 + {78C5B90C-6509-48E8-85BD-3D4F5060351D}.Release|Win32.Build.0 = Release|Win32 + {78C5B90C-6509-48E8-85BD-3D4F5060351D}.Release|x64.ActiveCfg = Release|x64 + {78C5B90C-6509-48E8-85BD-3D4F5060351D}.Release|x64.Build.0 = Release|x64 ++ {AE57384E-BA9D-D3FB-9F69-043F9BF618CE}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {AE57384E-BA9D-D3FB-9F69-043F9BF618CE}.Debug|ARM64.Build.0 = Debug|ARM64 + {AE57384E-BA9D-D3FB-9F69-043F9BF618CE}.Debug|Win32.ActiveCfg = Debug|Win32 + {AE57384E-BA9D-D3FB-9F69-043F9BF618CE}.Debug|Win32.Build.0 = Debug|Win32 + {AE57384E-BA9D-D3FB-9F69-043F9BF618CE}.Debug|x64.ActiveCfg = Debug|x64 + {AE57384E-BA9D-D3FB-9F69-043F9BF618CE}.Debug|x64.Build.0 = Debug|x64 ++ {AE57384E-BA9D-D3FB-9F69-043F9BF618CE}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {AE57384E-BA9D-D3FB-9F69-043F9BF618CE}.Release|ARM64.Build.0 = Release|ARM64 + {AE57384E-BA9D-D3FB-9F69-043F9BF618CE}.Release|Win32.ActiveCfg = Release|Win32 + {AE57384E-BA9D-D3FB-9F69-043F9BF618CE}.Release|Win32.Build.0 = Release|Win32 + {AE57384E-BA9D-D3FB-9F69-043F9BF618CE}.Release|x64.ActiveCfg = Release|x64 + {AE57384E-BA9D-D3FB-9F69-043F9BF618CE}.Release|x64.Build.0 = Release|x64 ++ {F90EB29D-FD0E-327C-7DCF-BDDC5819B937}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {F90EB29D-FD0E-327C-7DCF-BDDC5819B937}.Debug|ARM64.Build.0 = Debug|ARM64 + {F90EB29D-FD0E-327C-7DCF-BDDC5819B937}.Debug|Win32.ActiveCfg = Debug|Win32 + {F90EB29D-FD0E-327C-7DCF-BDDC5819B937}.Debug|Win32.Build.0 = Debug|Win32 + {F90EB29D-FD0E-327C-7DCF-BDDC5819B937}.Debug|x64.ActiveCfg = Debug|x64 + {F90EB29D-FD0E-327C-7DCF-BDDC5819B937}.Debug|x64.Build.0 = Debug|x64 ++ {F90EB29D-FD0E-327C-7DCF-BDDC5819B937}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {F90EB29D-FD0E-327C-7DCF-BDDC5819B937}.Release|ARM64.Build.0 = Release|ARM64 + {F90EB29D-FD0E-327C-7DCF-BDDC5819B937}.Release|Win32.ActiveCfg = Release|Win32 + {F90EB29D-FD0E-327C-7DCF-BDDC5819B937}.Release|Win32.Build.0 = Release|Win32 + {F90EB29D-FD0E-327C-7DCF-BDDC5819B937}.Release|x64.ActiveCfg = Release|x64 + {F90EB29D-FD0E-327C-7DCF-BDDC5819B937}.Release|x64.Build.0 = Release|x64 ++ {B4E1761A-1226-BB87-9B56-B4A6A4622391}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {B4E1761A-1226-BB87-9B56-B4A6A4622391}.Debug|ARM64.Build.0 = Debug|ARM64 + {B4E1761A-1226-BB87-9B56-B4A6A4622391}.Debug|Win32.ActiveCfg = Debug|Win32 + {B4E1761A-1226-BB87-9B56-B4A6A4622391}.Debug|Win32.Build.0 = Debug|Win32 + {B4E1761A-1226-BB87-9B56-B4A6A4622391}.Debug|x64.ActiveCfg = Debug|x64 + {B4E1761A-1226-BB87-9B56-B4A6A4622391}.Debug|x64.Build.0 = Debug|x64 ++ {B4E1761A-1226-BB87-9B56-B4A6A4622391}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {B4E1761A-1226-BB87-9B56-B4A6A4622391}.Release|ARM64.Build.0 = Release|ARM64 + {B4E1761A-1226-BB87-9B56-B4A6A4622391}.Release|Win32.ActiveCfg = Release|Win32 + {B4E1761A-1226-BB87-9B56-B4A6A4622391}.Release|Win32.Build.0 = Release|Win32 + {B4E1761A-1226-BB87-9B56-B4A6A4622391}.Release|x64.ActiveCfg = Release|x64 + {B4E1761A-1226-BB87-9B56-B4A6A4622391}.Release|x64.Build.0 = Release|x64 ++ {6384E1A6-151A-3FAC-A932-26D0D9119020}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {6384E1A6-151A-3FAC-A932-26D0D9119020}.Debug|ARM64.Build.0 = Debug|ARM64 + {6384E1A6-151A-3FAC-A932-26D0D9119020}.Debug|Win32.ActiveCfg = Debug|Win32 + {6384E1A6-151A-3FAC-A932-26D0D9119020}.Debug|Win32.Build.0 = Debug|Win32 + {6384E1A6-151A-3FAC-A932-26D0D9119020}.Debug|x64.ActiveCfg = Debug|x64 + {6384E1A6-151A-3FAC-A932-26D0D9119020}.Debug|x64.Build.0 = Debug|x64 ++ {6384E1A6-151A-3FAC-A932-26D0D9119020}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {6384E1A6-151A-3FAC-A932-26D0D9119020}.Release|ARM64.Build.0 = Release|ARM64 + {6384E1A6-151A-3FAC-A932-26D0D9119020}.Release|Win32.ActiveCfg = Release|Win32 + {6384E1A6-151A-3FAC-A932-26D0D9119020}.Release|Win32.Build.0 = Release|Win32 + {6384E1A6-151A-3FAC-A932-26D0D9119020}.Release|x64.ActiveCfg = Release|x64 + {6384E1A6-151A-3FAC-A932-26D0D9119020}.Release|x64.Build.0 = Release|x64 ++ {D649BB77-A3D2-7879-0DE9-0407D1D07A07}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {D649BB77-A3D2-7879-0DE9-0407D1D07A07}.Debug|ARM64.Build.0 = Debug|ARM64 + {D649BB77-A3D2-7879-0DE9-0407D1D07A07}.Debug|Win32.ActiveCfg = Debug|Win32 + {D649BB77-A3D2-7879-0DE9-0407D1D07A07}.Debug|Win32.Build.0 = Debug|Win32 + {D649BB77-A3D2-7879-0DE9-0407D1D07A07}.Debug|x64.ActiveCfg = Debug|x64 + {D649BB77-A3D2-7879-0DE9-0407D1D07A07}.Debug|x64.Build.0 = Debug|x64 ++ {D649BB77-A3D2-7879-0DE9-0407D1D07A07}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {D649BB77-A3D2-7879-0DE9-0407D1D07A07}.Release|ARM64.Build.0 = Release|ARM64 + {D649BB77-A3D2-7879-0DE9-0407D1D07A07}.Release|Win32.ActiveCfg = Release|Win32 + {D649BB77-A3D2-7879-0DE9-0407D1D07A07}.Release|Win32.Build.0 = Release|Win32 + {D649BB77-A3D2-7879-0DE9-0407D1D07A07}.Release|x64.ActiveCfg = Release|x64 + {D649BB77-A3D2-7879-0DE9-0407D1D07A07}.Release|x64.Build.0 = Release|x64 ++ {D72015D0-0E47-B5D8-1832-15289D2D14D7}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {D72015D0-0E47-B5D8-1832-15289D2D14D7}.Debug|ARM64.Build.0 = Debug|ARM64 + {D72015D0-0E47-B5D8-1832-15289D2D14D7}.Debug|Win32.ActiveCfg = Debug|Win32 + {D72015D0-0E47-B5D8-1832-15289D2D14D7}.Debug|Win32.Build.0 = Debug|Win32 + {D72015D0-0E47-B5D8-1832-15289D2D14D7}.Debug|x64.ActiveCfg = Debug|x64 + {D72015D0-0E47-B5D8-1832-15289D2D14D7}.Debug|x64.Build.0 = Debug|x64 ++ {D72015D0-0E47-B5D8-1832-15289D2D14D7}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {D72015D0-0E47-B5D8-1832-15289D2D14D7}.Release|ARM64.Build.0 = Release|ARM64 + {D72015D0-0E47-B5D8-1832-15289D2D14D7}.Release|Win32.ActiveCfg = Release|Win32 + {D72015D0-0E47-B5D8-1832-15289D2D14D7}.Release|Win32.Build.0 = Release|Win32 + {D72015D0-0E47-B5D8-1832-15289D2D14D7}.Release|x64.ActiveCfg = Release|x64 + {D72015D0-0E47-B5D8-1832-15289D2D14D7}.Release|x64.Build.0 = Release|x64 ++ {AECB4999-B617-40C8-BC32-6FCFD810F462}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {AECB4999-B617-40C8-BC32-6FCFD810F462}.Debug|ARM64.Build.0 = Debug|ARM64 + {AECB4999-B617-40C8-BC32-6FCFD810F462}.Debug|Win32.ActiveCfg = Debug|Win32 + {AECB4999-B617-40C8-BC32-6FCFD810F462}.Debug|Win32.Build.0 = Debug|Win32 + {AECB4999-B617-40C8-BC32-6FCFD810F462}.Debug|x64.ActiveCfg = Debug|x64 + {AECB4999-B617-40C8-BC32-6FCFD810F462}.Debug|x64.Build.0 = Debug|x64 ++ {AECB4999-B617-40C8-BC32-6FCFD810F462}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {AECB4999-B617-40C8-BC32-6FCFD810F462}.Release|ARM64.Build.0 = Release|ARM64 + {AECB4999-B617-40C8-BC32-6FCFD810F462}.Release|Win32.ActiveCfg = Release|Win32 + {AECB4999-B617-40C8-BC32-6FCFD810F462}.Release|Win32.Build.0 = Release|Win32 + {AECB4999-B617-40C8-BC32-6FCFD810F462}.Release|x64.ActiveCfg = Release|x64 + {AECB4999-B617-40C8-BC32-6FCFD810F462}.Release|x64.Build.0 = Release|x64 ++ {BDF5959C-CB5E-4A41-8906-D9C0E7E437EF}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {BDF5959C-CB5E-4A41-8906-D9C0E7E437EF}.Debug|ARM64.Build.0 = Debug|ARM64 + {BDF5959C-CB5E-4A41-8906-D9C0E7E437EF}.Debug|Win32.ActiveCfg = Debug|Win32 + {BDF5959C-CB5E-4A41-8906-D9C0E7E437EF}.Debug|Win32.Build.0 = Debug|Win32 + {BDF5959C-CB5E-4A41-8906-D9C0E7E437EF}.Debug|x64.ActiveCfg = Debug|x64 + {BDF5959C-CB5E-4A41-8906-D9C0E7E437EF}.Debug|x64.Build.0 = Debug|x64 ++ {BDF5959C-CB5E-4A41-8906-D9C0E7E437EF}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {BDF5959C-CB5E-4A41-8906-D9C0E7E437EF}.Release|ARM64.Build.0 = Release|ARM64 + {BDF5959C-CB5E-4A41-8906-D9C0E7E437EF}.Release|Win32.ActiveCfg = Release|Win32 + {BDF5959C-CB5E-4A41-8906-D9C0E7E437EF}.Release|Win32.Build.0 = Release|Win32 + {BDF5959C-CB5E-4A41-8906-D9C0E7E437EF}.Release|x64.ActiveCfg = Release|x64 + {BDF5959C-CB5E-4A41-8906-D9C0E7E437EF}.Release|x64.Build.0 = Release|x64 ++ {4F1C9BE1-7C8C-4E84-B0A4-3AE06E970920}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {4F1C9BE1-7C8C-4E84-B0A4-3AE06E970920}.Debug|ARM64.Build.0 = Debug|ARM64 + {4F1C9BE1-7C8C-4E84-B0A4-3AE06E970920}.Debug|Win32.ActiveCfg = Debug|Win32 + {4F1C9BE1-7C8C-4E84-B0A4-3AE06E970920}.Debug|Win32.Build.0 = Debug|Win32 + {4F1C9BE1-7C8C-4E84-B0A4-3AE06E970920}.Debug|x64.ActiveCfg = Debug|x64 + {4F1C9BE1-7C8C-4E84-B0A4-3AE06E970920}.Debug|x64.Build.0 = Debug|x64 ++ {4F1C9BE1-7C8C-4E84-B0A4-3AE06E970920}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {4F1C9BE1-7C8C-4E84-B0A4-3AE06E970920}.Release|ARM64.Build.0 = Release|ARM64 + {4F1C9BE1-7C8C-4E84-B0A4-3AE06E970920}.Release|Win32.ActiveCfg = Release|Win32 + {4F1C9BE1-7C8C-4E84-B0A4-3AE06E970920}.Release|Win32.Build.0 = Release|Win32 + {4F1C9BE1-7C8C-4E84-B0A4-3AE06E970920}.Release|x64.ActiveCfg = Release|x64 + {4F1C9BE1-7C8C-4E84-B0A4-3AE06E970920}.Release|x64.Build.0 = Release|x64 ++ {89264F07-C21B-4C98-A76F-2635D40CFF96}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {89264F07-C21B-4C98-A76F-2635D40CFF96}.Debug|ARM64.Build.0 = Debug|ARM64 + {89264F07-C21B-4C98-A76F-2635D40CFF96}.Debug|Win32.ActiveCfg = Debug|Win32 + {89264F07-C21B-4C98-A76F-2635D40CFF96}.Debug|Win32.Build.0 = Debug|Win32 + {89264F07-C21B-4C98-A76F-2635D40CFF96}.Debug|x64.ActiveCfg = Debug|x64 + {89264F07-C21B-4C98-A76F-2635D40CFF96}.Debug|x64.Build.0 = Debug|x64 ++ {89264F07-C21B-4C98-A76F-2635D40CFF96}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {89264F07-C21B-4C98-A76F-2635D40CFF96}.Release|ARM64.Build.0 = Release|ARM64 + {89264F07-C21B-4C98-A76F-2635D40CFF96}.Release|Win32.ActiveCfg = Release|Win32 + {89264F07-C21B-4C98-A76F-2635D40CFF96}.Release|Win32.Build.0 = Release|Win32 + {89264F07-C21B-4C98-A76F-2635D40CFF96}.Release|x64.ActiveCfg = Release|x64 + {89264F07-C21B-4C98-A76F-2635D40CFF96}.Release|x64.Build.0 = Release|x64 ++ {0A440012-109E-4CFF-AFD7-BF6D59628D87}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {0A440012-109E-4CFF-AFD7-BF6D59628D87}.Debug|ARM64.Build.0 = Debug|ARM64 + {0A440012-109E-4CFF-AFD7-BF6D59628D87}.Debug|Win32.ActiveCfg = Debug|Win32 + {0A440012-109E-4CFF-AFD7-BF6D59628D87}.Debug|Win32.Build.0 = Debug|Win32 + {0A440012-109E-4CFF-AFD7-BF6D59628D87}.Debug|x64.ActiveCfg = Debug|x64 + {0A440012-109E-4CFF-AFD7-BF6D59628D87}.Debug|x64.Build.0 = Debug|x64 ++ {0A440012-109E-4CFF-AFD7-BF6D59628D87}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {0A440012-109E-4CFF-AFD7-BF6D59628D87}.Release|ARM64.Build.0 = Release|ARM64 + {0A440012-109E-4CFF-AFD7-BF6D59628D87}.Release|Win32.ActiveCfg = Release|Win32 + {0A440012-109E-4CFF-AFD7-BF6D59628D87}.Release|Win32.Build.0 = Release|Win32 + {0A440012-109E-4CFF-AFD7-BF6D59628D87}.Release|x64.ActiveCfg = Release|x64 + {0A440012-109E-4CFF-AFD7-BF6D59628D87}.Release|x64.Build.0 = Release|x64 ++ {1B635A04-9265-4274-9B57-C5F1C4027A4E}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {1B635A04-9265-4274-9B57-C5F1C4027A4E}.Debug|ARM64.Build.0 = Debug|ARM64 + {1B635A04-9265-4274-9B57-C5F1C4027A4E}.Debug|Win32.ActiveCfg = Debug|Win32 + {1B635A04-9265-4274-9B57-C5F1C4027A4E}.Debug|Win32.Build.0 = Debug|Win32 + {1B635A04-9265-4274-9B57-C5F1C4027A4E}.Debug|x64.ActiveCfg = Debug|x64 + {1B635A04-9265-4274-9B57-C5F1C4027A4E}.Debug|x64.Build.0 = Debug|x64 ++ {1B635A04-9265-4274-9B57-C5F1C4027A4E}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {1B635A04-9265-4274-9B57-C5F1C4027A4E}.Release|ARM64.Build.0 = Release|ARM64 + {1B635A04-9265-4274-9B57-C5F1C4027A4E}.Release|Win32.ActiveCfg = Release|Win32 + {1B635A04-9265-4274-9B57-C5F1C4027A4E}.Release|Win32.Build.0 = Release|Win32 + {1B635A04-9265-4274-9B57-C5F1C4027A4E}.Release|x64.ActiveCfg = Release|x64 + {1B635A04-9265-4274-9B57-C5F1C4027A4E}.Release|x64.Build.0 = Release|x64 ++ {9C50623C-7A82-424E-8DD4-E03D53F95B9B}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {9C50623C-7A82-424E-8DD4-E03D53F95B9B}.Debug|ARM64.Build.0 = Debug|ARM64 + {9C50623C-7A82-424E-8DD4-E03D53F95B9B}.Debug|Win32.ActiveCfg = Debug|Win32 + {9C50623C-7A82-424E-8DD4-E03D53F95B9B}.Debug|Win32.Build.0 = Debug|Win32 + {9C50623C-7A82-424E-8DD4-E03D53F95B9B}.Debug|x64.ActiveCfg = Debug|x64 + {9C50623C-7A82-424E-8DD4-E03D53F95B9B}.Debug|x64.Build.0 = Debug|x64 ++ {9C50623C-7A82-424E-8DD4-E03D53F95B9B}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {9C50623C-7A82-424E-8DD4-E03D53F95B9B}.Release|ARM64.Build.0 = Release|ARM64 + {9C50623C-7A82-424E-8DD4-E03D53F95B9B}.Release|Win32.ActiveCfg = Release|Win32 + {9C50623C-7A82-424E-8DD4-E03D53F95B9B}.Release|Win32.Build.0 = Release|Win32 + {9C50623C-7A82-424E-8DD4-E03D53F95B9B}.Release|x64.ActiveCfg = Release|x64 + {9C50623C-7A82-424E-8DD4-E03D53F95B9B}.Release|x64.Build.0 = Release|x64 ++ {31832E59-29F0-44C7-A19E-E322B1142425}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {31832E59-29F0-44C7-A19E-E322B1142425}.Debug|ARM64.Build.0 = Debug|ARM64 + {31832E59-29F0-44C7-A19E-E322B1142425}.Debug|Win32.ActiveCfg = Debug|Win32 + {31832E59-29F0-44C7-A19E-E322B1142425}.Debug|Win32.Build.0 = Debug|Win32 + {31832E59-29F0-44C7-A19E-E322B1142425}.Debug|x64.ActiveCfg = Debug|x64 + {31832E59-29F0-44C7-A19E-E322B1142425}.Debug|x64.Build.0 = Debug|x64 ++ {31832E59-29F0-44C7-A19E-E322B1142425}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {31832E59-29F0-44C7-A19E-E322B1142425}.Release|ARM64.Build.0 = Release|ARM64 + {31832E59-29F0-44C7-A19E-E322B1142425}.Release|Win32.ActiveCfg = Release|Win32 + {31832E59-29F0-44C7-A19E-E322B1142425}.Release|Win32.Build.0 = Release|Win32 + {31832E59-29F0-44C7-A19E-E322B1142425}.Release|x64.ActiveCfg = Release|x64 + {31832E59-29F0-44C7-A19E-E322B1142425}.Release|x64.Build.0 = Release|x64 ++ {541BB0AF-2A9D-4254-AEA2-C4AF64B072AE}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {541BB0AF-2A9D-4254-AEA2-C4AF64B072AE}.Debug|ARM64.Build.0 = Debug|ARM64 + {541BB0AF-2A9D-4254-AEA2-C4AF64B072AE}.Debug|Win32.ActiveCfg = Debug|Win32 + {541BB0AF-2A9D-4254-AEA2-C4AF64B072AE}.Debug|Win32.Build.0 = Debug|Win32 + {541BB0AF-2A9D-4254-AEA2-C4AF64B072AE}.Debug|x64.ActiveCfg = Debug|x64 + {541BB0AF-2A9D-4254-AEA2-C4AF64B072AE}.Debug|x64.Build.0 = Debug|x64 ++ {541BB0AF-2A9D-4254-AEA2-C4AF64B072AE}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {541BB0AF-2A9D-4254-AEA2-C4AF64B072AE}.Release|ARM64.Build.0 = Release|ARM64 + {541BB0AF-2A9D-4254-AEA2-C4AF64B072AE}.Release|Win32.ActiveCfg = Release|Win32 + {541BB0AF-2A9D-4254-AEA2-C4AF64B072AE}.Release|Win32.Build.0 = Release|Win32 + {541BB0AF-2A9D-4254-AEA2-C4AF64B072AE}.Release|x64.ActiveCfg = Release|x64 + {541BB0AF-2A9D-4254-AEA2-C4AF64B072AE}.Release|x64.Build.0 = Release|x64 ++ {94535CF0-A2CB-4A1B-88F6-B9883D209B81}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {94535CF0-A2CB-4A1B-88F6-B9883D209B81}.Debug|ARM64.Build.0 = Debug|ARM64 + {94535CF0-A2CB-4A1B-88F6-B9883D209B81}.Debug|Win32.ActiveCfg = Debug|Win32 + {94535CF0-A2CB-4A1B-88F6-B9883D209B81}.Debug|Win32.Build.0 = Debug|Win32 + {94535CF0-A2CB-4A1B-88F6-B9883D209B81}.Debug|x64.ActiveCfg = Debug|x64 + {94535CF0-A2CB-4A1B-88F6-B9883D209B81}.Debug|x64.Build.0 = Debug|x64 ++ {94535CF0-A2CB-4A1B-88F6-B9883D209B81}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {94535CF0-A2CB-4A1B-88F6-B9883D209B81}.Release|ARM64.Build.0 = Release|ARM64 + {94535CF0-A2CB-4A1B-88F6-B9883D209B81}.Release|Win32.ActiveCfg = Release|Win32 + {94535CF0-A2CB-4A1B-88F6-B9883D209B81}.Release|Win32.Build.0 = Release|Win32 + {94535CF0-A2CB-4A1B-88F6-B9883D209B81}.Release|x64.ActiveCfg = Release|x64 + {94535CF0-A2CB-4A1B-88F6-B9883D209B81}.Release|x64.Build.0 = Release|x64 ++ {324BFA7D-8AF3-4F2B-8B3E-1D2E3EE2BB19}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {324BFA7D-8AF3-4F2B-8B3E-1D2E3EE2BB19}.Debug|ARM64.Build.0 = Debug|ARM64 + {324BFA7D-8AF3-4F2B-8B3E-1D2E3EE2BB19}.Debug|Win32.ActiveCfg = Debug|Win32 + {324BFA7D-8AF3-4F2B-8B3E-1D2E3EE2BB19}.Debug|Win32.Build.0 = Debug|Win32 + {324BFA7D-8AF3-4F2B-8B3E-1D2E3EE2BB19}.Debug|x64.ActiveCfg = Debug|x64 + {324BFA7D-8AF3-4F2B-8B3E-1D2E3EE2BB19}.Debug|x64.Build.0 = Debug|x64 ++ {324BFA7D-8AF3-4F2B-8B3E-1D2E3EE2BB19}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {324BFA7D-8AF3-4F2B-8B3E-1D2E3EE2BB19}.Release|ARM64.Build.0 = Release|ARM64 + {324BFA7D-8AF3-4F2B-8B3E-1D2E3EE2BB19}.Release|Win32.ActiveCfg = Release|Win32 + {324BFA7D-8AF3-4F2B-8B3E-1D2E3EE2BB19}.Release|Win32.Build.0 = Release|Win32 + {324BFA7D-8AF3-4F2B-8B3E-1D2E3EE2BB19}.Release|x64.ActiveCfg = Release|x64 + {324BFA7D-8AF3-4F2B-8B3E-1D2E3EE2BB19}.Release|x64.Build.0 = Release|x64 ++ {44A27326-22B1-4838-85F2-0748CB9F5FB5}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {44A27326-22B1-4838-85F2-0748CB9F5FB5}.Debug|ARM64.Build.0 = Debug|ARM64 + {44A27326-22B1-4838-85F2-0748CB9F5FB5}.Debug|Win32.ActiveCfg = Debug|Win32 + {44A27326-22B1-4838-85F2-0748CB9F5FB5}.Debug|Win32.Build.0 = Debug|Win32 + {44A27326-22B1-4838-85F2-0748CB9F5FB5}.Debug|x64.ActiveCfg = Debug|x64 + {44A27326-22B1-4838-85F2-0748CB9F5FB5}.Debug|x64.Build.0 = Debug|x64 ++ {44A27326-22B1-4838-85F2-0748CB9F5FB5}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {44A27326-22B1-4838-85F2-0748CB9F5FB5}.Release|ARM64.Build.0 = Release|ARM64 + {44A27326-22B1-4838-85F2-0748CB9F5FB5}.Release|Win32.ActiveCfg = Release|Win32 + {44A27326-22B1-4838-85F2-0748CB9F5FB5}.Release|Win32.Build.0 = Release|Win32 + {44A27326-22B1-4838-85F2-0748CB9F5FB5}.Release|x64.ActiveCfg = Release|x64 + {44A27326-22B1-4838-85F2-0748CB9F5FB5}.Release|x64.Build.0 = Release|x64 ++ {1BA5CA1A-2CFD-44B6-8FEF-34A20D4E533C}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {1BA5CA1A-2CFD-44B6-8FEF-34A20D4E533C}.Debug|ARM64.Build.0 = Debug|ARM64 + {1BA5CA1A-2CFD-44B6-8FEF-34A20D4E533C}.Debug|Win32.ActiveCfg = Debug|Win32 + {1BA5CA1A-2CFD-44B6-8FEF-34A20D4E533C}.Debug|Win32.Build.0 = Debug|Win32 + {1BA5CA1A-2CFD-44B6-8FEF-34A20D4E533C}.Debug|x64.ActiveCfg = Debug|x64 + {1BA5CA1A-2CFD-44B6-8FEF-34A20D4E533C}.Debug|x64.Build.0 = Debug|x64 ++ {1BA5CA1A-2CFD-44B6-8FEF-34A20D4E533C}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {1BA5CA1A-2CFD-44B6-8FEF-34A20D4E533C}.Release|ARM64.Build.0 = Release|ARM64 + {1BA5CA1A-2CFD-44B6-8FEF-34A20D4E533C}.Release|Win32.ActiveCfg = Release|Win32 + {1BA5CA1A-2CFD-44B6-8FEF-34A20D4E533C}.Release|Win32.Build.0 = Release|Win32 + {1BA5CA1A-2CFD-44B6-8FEF-34A20D4E533C}.Release|x64.ActiveCfg = Release|x64 + {1BA5CA1A-2CFD-44B6-8FEF-34A20D4E533C}.Release|x64.Build.0 = Release|x64 ++ {F937F792-25ED-4DE4-AA9F-104163DB24DF}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {F937F792-25ED-4DE4-AA9F-104163DB24DF}.Debug|ARM64.Build.0 = Debug|ARM64 + {F937F792-25ED-4DE4-AA9F-104163DB24DF}.Debug|Win32.ActiveCfg = Debug|Win32 + {F937F792-25ED-4DE4-AA9F-104163DB24DF}.Debug|Win32.Build.0 = Debug|Win32 + {F937F792-25ED-4DE4-AA9F-104163DB24DF}.Debug|x64.ActiveCfg = Debug|x64 + {F937F792-25ED-4DE4-AA9F-104163DB24DF}.Debug|x64.Build.0 = Debug|x64 ++ {F937F792-25ED-4DE4-AA9F-104163DB24DF}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {F937F792-25ED-4DE4-AA9F-104163DB24DF}.Release|ARM64.Build.0 = Release|ARM64 + {F937F792-25ED-4DE4-AA9F-104163DB24DF}.Release|Win32.ActiveCfg = Release|Win32 + {F937F792-25ED-4DE4-AA9F-104163DB24DF}.Release|Win32.Build.0 = Release|Win32 + {F937F792-25ED-4DE4-AA9F-104163DB24DF}.Release|x64.ActiveCfg = Release|x64 + {F937F792-25ED-4DE4-AA9F-104163DB24DF}.Release|x64.Build.0 = Release|x64 ++ {37FA0D6B-E032-4E01-A2EE-2BAF59A551AC}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {37FA0D6B-E032-4E01-A2EE-2BAF59A551AC}.Debug|ARM64.Build.0 = Debug|ARM64 + {37FA0D6B-E032-4E01-A2EE-2BAF59A551AC}.Debug|Win32.ActiveCfg = Debug|Win32 + {37FA0D6B-E032-4E01-A2EE-2BAF59A551AC}.Debug|Win32.Build.0 = Debug|Win32 + {37FA0D6B-E032-4E01-A2EE-2BAF59A551AC}.Debug|x64.ActiveCfg = Debug|x64 + {37FA0D6B-E032-4E01-A2EE-2BAF59A551AC}.Debug|x64.Build.0 = Debug|x64 ++ {37FA0D6B-E032-4E01-A2EE-2BAF59A551AC}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {37FA0D6B-E032-4E01-A2EE-2BAF59A551AC}.Release|ARM64.Build.0 = Release|ARM64 + {37FA0D6B-E032-4E01-A2EE-2BAF59A551AC}.Release|Win32.ActiveCfg = Release|Win32 + {37FA0D6B-E032-4E01-A2EE-2BAF59A551AC}.Release|Win32.Build.0 = Release|Win32 + {37FA0D6B-E032-4E01-A2EE-2BAF59A551AC}.Release|x64.ActiveCfg = Release|x64 + {37FA0D6B-E032-4E01-A2EE-2BAF59A551AC}.Release|x64.Build.0 = Release|x64 ++ {44CE44BF-BC91-4564-B890-0EA6677EF3B3}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {44CE44BF-BC91-4564-B890-0EA6677EF3B3}.Debug|ARM64.Build.0 = Debug|ARM64 + {44CE44BF-BC91-4564-B890-0EA6677EF3B3}.Debug|Win32.ActiveCfg = Debug|Win32 + {44CE44BF-BC91-4564-B890-0EA6677EF3B3}.Debug|Win32.Build.0 = Debug|Win32 + {44CE44BF-BC91-4564-B890-0EA6677EF3B3}.Debug|x64.ActiveCfg = Debug|x64 + {44CE44BF-BC91-4564-B890-0EA6677EF3B3}.Debug|x64.Build.0 = Debug|x64 ++ {44CE44BF-BC91-4564-B890-0EA6677EF3B3}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {44CE44BF-BC91-4564-B890-0EA6677EF3B3}.Release|ARM64.Build.0 = Release|ARM64 + {44CE44BF-BC91-4564-B890-0EA6677EF3B3}.Release|Win32.ActiveCfg = Release|Win32 + {44CE44BF-BC91-4564-B890-0EA6677EF3B3}.Release|Win32.Build.0 = Release|Win32 + {44CE44BF-BC91-4564-B890-0EA6677EF3B3}.Release|x64.ActiveCfg = Release|x64 + {44CE44BF-BC91-4564-B890-0EA6677EF3B3}.Release|x64.Build.0 = Release|x64 ++ {52CE9EB2-E62B-4126-A4F8-D4F68ADD9EC1}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {52CE9EB2-E62B-4126-A4F8-D4F68ADD9EC1}.Debug|ARM64.Build.0 = Debug|ARM64 + {52CE9EB2-E62B-4126-A4F8-D4F68ADD9EC1}.Debug|Win32.ActiveCfg = Debug|Win32 + {52CE9EB2-E62B-4126-A4F8-D4F68ADD9EC1}.Debug|Win32.Build.0 = Debug|Win32 + {52CE9EB2-E62B-4126-A4F8-D4F68ADD9EC1}.Debug|x64.ActiveCfg = Debug|x64 + {52CE9EB2-E62B-4126-A4F8-D4F68ADD9EC1}.Debug|x64.Build.0 = Debug|x64 ++ {52CE9EB2-E62B-4126-A4F8-D4F68ADD9EC1}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {52CE9EB2-E62B-4126-A4F8-D4F68ADD9EC1}.Release|ARM64.Build.0 = Release|ARM64 + {52CE9EB2-E62B-4126-A4F8-D4F68ADD9EC1}.Release|Win32.ActiveCfg = Release|Win32 + {52CE9EB2-E62B-4126-A4F8-D4F68ADD9EC1}.Release|Win32.Build.0 = Release|Win32 + {52CE9EB2-E62B-4126-A4F8-D4F68ADD9EC1}.Release|x64.ActiveCfg = Release|x64 + {52CE9EB2-E62B-4126-A4F8-D4F68ADD9EC1}.Release|x64.Build.0 = Release|x64 ++ {66E288D7-106F-42B2-8BB9-64ADFCAFE283}.Debug|ARM64.ActiveCfg = Debug|ARM64 ++ {66E288D7-106F-42B2-8BB9-64ADFCAFE283}.Debug|ARM64.Build.0 = Debug|ARM64 + {66E288D7-106F-42B2-8BB9-64ADFCAFE283}.Debug|Win32.ActiveCfg = Debug|Win32 + {66E288D7-106F-42B2-8BB9-64ADFCAFE283}.Debug|Win32.Build.0 = Debug|Win32 + {66E288D7-106F-42B2-8BB9-64ADFCAFE283}.Debug|x64.ActiveCfg = Debug|x64 + {66E288D7-106F-42B2-8BB9-64ADFCAFE283}.Debug|x64.Build.0 = Debug|x64 ++ {66E288D7-106F-42B2-8BB9-64ADFCAFE283}.Release|ARM64.ActiveCfg = Release|ARM64 ++ {66E288D7-106F-42B2-8BB9-64ADFCAFE283}.Release|ARM64.Build.0 = Release|ARM64 + {66E288D7-106F-42B2-8BB9-64ADFCAFE283}.Release|Win32.ActiveCfg = Release|Win32 + {66E288D7-106F-42B2-8BB9-64ADFCAFE283}.Release|Win32.Build.0 = Release|Win32 + {66E288D7-106F-42B2-8BB9-64ADFCAFE283}.Release|x64.ActiveCfg = Release|x64 +diff --git a/build.vs19/lib_mpfr/lib_mpfr.vcxproj b/build.vs19/lib_mpfr/lib_mpfr.vcxproj +index 6fb09bdc..584acf4a 100644 +--- a/build.vs19/lib_mpfr/lib_mpfr.vcxproj ++++ b/build.vs19/lib_mpfr/lib_mpfr.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -27,19 +35,27 @@ + + + StaticLibrary +- v142 ++ v143 ++ ++ ++ StaticLibrary ++ v143 + + + StaticLibrary +- v142 ++ v143 ++ ++ ++ StaticLibrary ++ v143 + + + StaticLibrary +- v142 ++ v143 + + + StaticLibrary +- v142 ++ v143 + + + +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,21 +82,55 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)..\lib\$(Platform)\$(Configuration)\ ++ $(SolutionDir)..\lib\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)..\lib\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)..\lib\$(Platform)\$(Configuration)\ ++ $(SolutionDir)..\lib\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)..\lib\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + mpfr + mpfr + mpfr ++ mpfr + mpfr ++ mpfr + + + + ..\out_copy_rename.bat ..\..\src\mpfr.h ..\..\lib\$(IntDir) mpfr.h ++..\out_copy_rename.bat ..\..\src\mparam_h.in ..\..\ mparam.h ++ ++ ++ ++ ++ ++ ++ Disabled ++ ..\;..\..\src\;..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_WIN32;HAVE_CONFIG_H;_DEBUG;_LIB;_GMP_IEEE_FLOATS;_CRT_SECURE_NO_WARNINGS;MPFR_HAVE_GMP_IMPL ++ EnableFastChecks ++ MultiThreadedDebug ++ ++ ++ $(TargetDir)$(TargetName).pdb ++ true ++ ++ ++ ..\..\..\mpir\lib\$(IntDir)mpir.lib;%(AdditionalDependencies) ++ ++ ++ ++ ++ ++ ++ ++ ++ ..\out_copy_rename.bat ..\..\src\mpfr.h ..\..\lib\$(IntDir) mpfr.h + ..\out_copy_rename.bat ..\..\src\mparam_h.in ..\..\ mparam.h + + +@@ -135,6 +191,34 @@ + + + ..\out_copy_rename.bat ..\..\src\mpfr.h ..\..\lib\$(IntDir) mpfr.h ++..\out_copy_rename.bat ..\..\src\mparam_h.in ..\..\ mparam.h ++ ++ ++ ++ ++ ++ ++ Full ++ ..\;..\..\src\;..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_WIN32;HAVE_CONFIG_H;NDEBUG;_LIB;_GMP_IEEE_FLOATS;_CRT_SECURE_NO_WARNINGS;MPFR_HAVE_GMP_IMPL ++ MultiThreaded ++ false ++ ++ ++ $(TargetDir)$(TargetName).pdb ++ true ++ ++ ++ ..\..\..\mpir\lib\$(IntDir)mpir.lib;%(AdditionalDependencies) ++ ++ ++ ++ ++ ++ ++ ++ ++ ..\out_copy_rename.bat ..\..\src\mpfr.h ..\..\lib\$(IntDir) mpfr.h + ..\out_copy_rename.bat ..\..\src\mparam_h.in ..\..\ mparam.h + + +@@ -312,7 +396,9 @@ + + + true ++ true + true ++ true + true + true + +@@ -331,7 +417,9 @@ + + + true ++ true + true ++ true + true + true + +@@ -370,7 +458,9 @@ + + + true ++ true + true ++ true + true + true + +diff --git a/build.vs19/lib_mpfr_tests/lib_tests/lib_tests.vcxproj b/build.vs19/lib_mpfr_tests/lib_tests/lib_tests.vcxproj +index 1df4a01c..fa416169 100644 +--- a/build.vs19/lib_mpfr_tests/lib_tests/lib_tests.vcxproj ++++ b/build.vs19/lib_mpfr_tests/lib_tests/lib_tests.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + StaticLibrary + v142 + ++ ++ StaticLibrary ++ v142 ++ + + StaticLibrary + v142 + ++ ++ StaticLibrary ++ v142 ++ + + StaticLibrary + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -85,6 +111,23 @@ + MachineX86 + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;HAVE_CONFIG_H;_DEBUG;_LIB;MPFR_HAVE_GMP_IMPL ++ EnableFastChecks ++ ++ ++ Level3 ++ MultiThreadedDebug ++ true ++ ++ ++ ++ MachineX86 ++ ++ + + + X64 +@@ -119,6 +162,23 @@ + MachineX86 + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;HAVE_CONFIG_H;NDEBUG;_LIB;MPFR_HAVE_GMP_IMPL ++ ++ ++ Level3 ++ ProgramDatabase ++ MultiThreaded ++ true ++ ++ ++ ++ MachineX86 ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/mpf_compat/mpf_compat.vcxproj b/build.vs19/lib_mpfr_tests/mpf_compat/mpf_compat.vcxproj +index 044eae06..8e927cb5 100644 +--- a/build.vs19/lib_mpfr_tests/mpf_compat/mpf_compat.vcxproj ++++ b/build.vs19/lib_mpfr_tests/mpf_compat/mpf_compat.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/mpfr_compat/mpfr_compat.vcxproj b/build.vs19/lib_mpfr_tests/mpfr_compat/mpfr_compat.vcxproj +index dd3cc537..96e874a8 100644 +--- a/build.vs19/lib_mpfr_tests/mpfr_compat/mpfr_compat.vcxproj ++++ b/build.vs19/lib_mpfr_tests/mpfr_compat/mpfr_compat.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -132,6 +177,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/reuse/reuse.vcxproj b/build.vs19/lib_mpfr_tests/reuse/reuse.vcxproj +index 922bd519..3794683d 100644 +--- a/build.vs19/lib_mpfr_tests/reuse/reuse.vcxproj ++++ b/build.vs19/lib_mpfr_tests/reuse/reuse.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tabort_defalloc1/tabort_defalloc1.vcxproj b/build.vs19/lib_mpfr_tests/tabort_defalloc1/tabort_defalloc1.vcxproj +index ad66dcd4..38fa2d9b 100644 +--- a/build.vs19/lib_mpfr_tests/tabort_defalloc1/tabort_defalloc1.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tabort_defalloc1/tabort_defalloc1.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tabort_defalloc2/tabort_defalloc2.vcxproj b/build.vs19/lib_mpfr_tests/tabort_defalloc2/tabort_defalloc2.vcxproj +index e1e65d16..ed586676 100644 +--- a/build.vs19/lib_mpfr_tests/tabort_defalloc2/tabort_defalloc2.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tabort_defalloc2/tabort_defalloc2.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tabort_prec_max/tabort_prec_max.vcxproj b/build.vs19/lib_mpfr_tests/tabort_prec_max/tabort_prec_max.vcxproj +index 47dc575c..6b5bf6bb 100644 +--- a/build.vs19/lib_mpfr_tests/tabort_prec_max/tabort_prec_max.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tabort_prec_max/tabort_prec_max.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tabs/tabs.vcxproj b/build.vs19/lib_mpfr_tests/tabs/tabs.vcxproj +index 4a6c9c57..b332838a 100644 +--- a/build.vs19/lib_mpfr_tests/tabs/tabs.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tabs/tabs.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tacos/tacos.vcxproj b/build.vs19/lib_mpfr_tests/tacos/tacos.vcxproj +index d3436267..56d2087d 100644 +--- a/build.vs19/lib_mpfr_tests/tacos/tacos.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tacos/tacos.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tacosh/tacosh.vcxproj b/build.vs19/lib_mpfr_tests/tacosh/tacosh.vcxproj +index 295f982e..4b64914f 100644 +--- a/build.vs19/lib_mpfr_tests/tacosh/tacosh.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tacosh/tacosh.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tadd/tadd.vcxproj b/build.vs19/lib_mpfr_tests/tadd/tadd.vcxproj +index c254f526..780ce818 100644 +--- a/build.vs19/lib_mpfr_tests/tadd/tadd.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tadd/tadd.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tadd1sp/tadd1sp.vcxproj b/build.vs19/lib_mpfr_tests/tadd1sp/tadd1sp.vcxproj +index 739ea71e..3da0b2e0 100644 +--- a/build.vs19/lib_mpfr_tests/tadd1sp/tadd1sp.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tadd1sp/tadd1sp.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tadd_d/tadd_d.vcxproj b/build.vs19/lib_mpfr_tests/tadd_d/tadd_d.vcxproj +index 3d9cc010..da98318d 100644 +--- a/build.vs19/lib_mpfr_tests/tadd_d/tadd_d.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tadd_d/tadd_d.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tadd_ui/tadd_ui.vcxproj b/build.vs19/lib_mpfr_tests/tadd_ui/tadd_ui.vcxproj +index 97f96e8d..98267ebb 100644 +--- a/build.vs19/lib_mpfr_tests/tadd_ui/tadd_ui.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tadd_ui/tadd_ui.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tagm/tagm.vcxproj b/build.vs19/lib_mpfr_tests/tagm/tagm.vcxproj +index c15d19fa..1b58594b 100644 +--- a/build.vs19/lib_mpfr_tests/tagm/tagm.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tagm/tagm.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tai/tai.vcxproj b/build.vs19/lib_mpfr_tests/tai/tai.vcxproj +index 6c19a221..570f1deb 100644 +--- a/build.vs19/lib_mpfr_tests/tai/tai.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tai/tai.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/talloc/talloc.vcxproj b/build.vs19/lib_mpfr_tests/talloc/talloc.vcxproj +index 6e321198..2cad9dd7 100644 +--- a/build.vs19/lib_mpfr_tests/talloc/talloc.vcxproj ++++ b/build.vs19/lib_mpfr_tests/talloc/talloc.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tasin/tasin.vcxproj b/build.vs19/lib_mpfr_tests/tasin/tasin.vcxproj +index 8527e32f..82c21bfd 100644 +--- a/build.vs19/lib_mpfr_tests/tasin/tasin.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tasin/tasin.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tasinh/tasinh.vcxproj b/build.vs19/lib_mpfr_tests/tasinh/tasinh.vcxproj +index 3504fde7..2eaaace4 100644 +--- a/build.vs19/lib_mpfr_tests/tasinh/tasinh.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tasinh/tasinh.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tassert/tassert.vcxproj b/build.vs19/lib_mpfr_tests/tassert/tassert.vcxproj +index 5d29eb11..96835b6c 100644 +--- a/build.vs19/lib_mpfr_tests/tassert/tassert.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tassert/tassert.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tatan/tatan.vcxproj b/build.vs19/lib_mpfr_tests/tatan/tatan.vcxproj +index 63bed877..79eabfbe 100644 +--- a/build.vs19/lib_mpfr_tests/tatan/tatan.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tatan/tatan.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tatanh/tatanh.vcxproj b/build.vs19/lib_mpfr_tests/tatanh/tatanh.vcxproj +index 49507185..ef88a2f2 100644 +--- a/build.vs19/lib_mpfr_tests/tatanh/tatanh.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tatanh/tatanh.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/taway/taway.vcxproj b/build.vs19/lib_mpfr_tests/taway/taway.vcxproj +index 85d5459b..cf0e60aa 100644 +--- a/build.vs19/lib_mpfr_tests/taway/taway.vcxproj ++++ b/build.vs19/lib_mpfr_tests/taway/taway.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tbeta/tbeta.vcxproj b/build.vs19/lib_mpfr_tests/tbeta/tbeta.vcxproj +index 0ee0e856..4e58d7bc 100644 +--- a/build.vs19/lib_mpfr_tests/tbeta/tbeta.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tbeta/tbeta.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,15 +82,20 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + + ++ + + + +@@ -91,6 +118,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -134,6 +180,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tbuildopt/tbuildopt.vcxproj b/build.vs19/lib_mpfr_tests/tbuildopt/tbuildopt.vcxproj +index d637aa2b..4e75c919 100644 +--- a/build.vs19/lib_mpfr_tests/tbuildopt/tbuildopt.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tbuildopt/tbuildopt.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tcan_round/tcan_round.vcxproj b/build.vs19/lib_mpfr_tests/tcan_round/tcan_round.vcxproj +index 9afc1d7d..e47b4382 100644 +--- a/build.vs19/lib_mpfr_tests/tcan_round/tcan_round.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tcan_round/tcan_round.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tcbrt/tcbrt.vcxproj b/build.vs19/lib_mpfr_tests/tcbrt/tcbrt.vcxproj +index 99d75d55..3ffccbd9 100644 +--- a/build.vs19/lib_mpfr_tests/tcbrt/tcbrt.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tcbrt/tcbrt.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tcheck/tcheck.vcxproj b/build.vs19/lib_mpfr_tests/tcheck/tcheck.vcxproj +index a6b8ad85..503bc912 100644 +--- a/build.vs19/lib_mpfr_tests/tcheck/tcheck.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tcheck/tcheck.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tcmp/tcmp.vcxproj b/build.vs19/lib_mpfr_tests/tcmp/tcmp.vcxproj +index 08a100f2..9ae72794 100644 +--- a/build.vs19/lib_mpfr_tests/tcmp/tcmp.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tcmp/tcmp.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tcmp2/tcmp2.vcxproj b/build.vs19/lib_mpfr_tests/tcmp2/tcmp2.vcxproj +index 81ca4cdf..4976721f 100644 +--- a/build.vs19/lib_mpfr_tests/tcmp2/tcmp2.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tcmp2/tcmp2.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tcmp_d/tcmp_d.vcxproj b/build.vs19/lib_mpfr_tests/tcmp_d/tcmp_d.vcxproj +index 6f28fc37..42b54dff 100644 +--- a/build.vs19/lib_mpfr_tests/tcmp_d/tcmp_d.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tcmp_d/tcmp_d.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tcmp_ld/tcmp_ld.vcxproj b/build.vs19/lib_mpfr_tests/tcmp_ld/tcmp_ld.vcxproj +index 2545b85e..36fa53de 100644 +--- a/build.vs19/lib_mpfr_tests/tcmp_ld/tcmp_ld.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tcmp_ld/tcmp_ld.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tcmp_ui/tcmp_ui.vcxproj b/build.vs19/lib_mpfr_tests/tcmp_ui/tcmp_ui.vcxproj +index e7347613..52aa391a 100644 +--- a/build.vs19/lib_mpfr_tests/tcmp_ui/tcmp_ui.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tcmp_ui/tcmp_ui.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tcmpabs/tcmpabs.vcxproj b/build.vs19/lib_mpfr_tests/tcmpabs/tcmpabs.vcxproj +index 5cd00dba..35ca20cc 100644 +--- a/build.vs19/lib_mpfr_tests/tcmpabs/tcmpabs.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tcmpabs/tcmpabs.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tcomparisons/tcomparisons.vcxproj b/build.vs19/lib_mpfr_tests/tcomparisons/tcomparisons.vcxproj +index 8f669540..9719a0c0 100644 +--- a/build.vs19/lib_mpfr_tests/tcomparisons/tcomparisons.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tcomparisons/tcomparisons.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tconst_catalan/tconst_catalan.vcxproj b/build.vs19/lib_mpfr_tests/tconst_catalan/tconst_catalan.vcxproj +index 944da3e1..56b0f559 100644 +--- a/build.vs19/lib_mpfr_tests/tconst_catalan/tconst_catalan.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tconst_catalan/tconst_catalan.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tconst_euler/tconst_euler.vcxproj b/build.vs19/lib_mpfr_tests/tconst_euler/tconst_euler.vcxproj +index 51b7ffcf..c23185de 100644 +--- a/build.vs19/lib_mpfr_tests/tconst_euler/tconst_euler.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tconst_euler/tconst_euler.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tconst_log2/tconst_log2.vcxproj b/build.vs19/lib_mpfr_tests/tconst_log2/tconst_log2.vcxproj +index f0e19243..2b6346c7 100644 +--- a/build.vs19/lib_mpfr_tests/tconst_log2/tconst_log2.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tconst_log2/tconst_log2.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tconst_pi/tconst_pi.vcxproj b/build.vs19/lib_mpfr_tests/tconst_pi/tconst_pi.vcxproj +index 73ac73c6..9a72dcd6 100644 +--- a/build.vs19/lib_mpfr_tests/tconst_pi/tconst_pi.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tconst_pi/tconst_pi.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tcopysign/tcopysign.vcxproj b/build.vs19/lib_mpfr_tests/tcopysign/tcopysign.vcxproj +index bc9341ed..9bc12521 100644 +--- a/build.vs19/lib_mpfr_tests/tcopysign/tcopysign.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tcopysign/tcopysign.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tcos/tcos.vcxproj b/build.vs19/lib_mpfr_tests/tcos/tcos.vcxproj +index 7d2a52b0..31d14582 100644 +--- a/build.vs19/lib_mpfr_tests/tcos/tcos.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tcos/tcos.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tcosh/tcosh.vcxproj b/build.vs19/lib_mpfr_tests/tcosh/tcosh.vcxproj +index cbabd95b..d75f7d06 100644 +--- a/build.vs19/lib_mpfr_tests/tcosh/tcosh.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tcosh/tcosh.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tcot/tcot.vcxproj b/build.vs19/lib_mpfr_tests/tcot/tcot.vcxproj +index 08a27985..4d0b291c 100644 +--- a/build.vs19/lib_mpfr_tests/tcot/tcot.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tcot/tcot.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tcoth/tcoth.vcxproj b/build.vs19/lib_mpfr_tests/tcoth/tcoth.vcxproj +index 741db798..90a6f5ff 100644 +--- a/build.vs19/lib_mpfr_tests/tcoth/tcoth.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tcoth/tcoth.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tcsc/tcsc.vcxproj b/build.vs19/lib_mpfr_tests/tcsc/tcsc.vcxproj +index ef5e85cb..51e81e8d 100644 +--- a/build.vs19/lib_mpfr_tests/tcsc/tcsc.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tcsc/tcsc.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tcsch/tcsch.vcxproj b/build.vs19/lib_mpfr_tests/tcsch/tcsch.vcxproj +index 1238bc9d..c45dd81e 100644 +--- a/build.vs19/lib_mpfr_tests/tcsch/tcsch.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tcsch/tcsch.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/td_div/td_div.vcxproj b/build.vs19/lib_mpfr_tests/td_div/td_div.vcxproj +index 98997599..90fcd188 100644 +--- a/build.vs19/lib_mpfr_tests/td_div/td_div.vcxproj ++++ b/build.vs19/lib_mpfr_tests/td_div/td_div.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/td_sub/td_sub.vcxproj b/build.vs19/lib_mpfr_tests/td_sub/td_sub.vcxproj +index dd6b6f92..e8e70ba7 100644 +--- a/build.vs19/lib_mpfr_tests/td_sub/td_sub.vcxproj ++++ b/build.vs19/lib_mpfr_tests/td_sub/td_sub.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tdigamma/tdigamma.vcxproj b/build.vs19/lib_mpfr_tests/tdigamma/tdigamma.vcxproj +index d2091fe3..3403b69e 100644 +--- a/build.vs19/lib_mpfr_tests/tdigamma/tdigamma.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tdigamma/tdigamma.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tdim/tdim.vcxproj b/build.vs19/lib_mpfr_tests/tdim/tdim.vcxproj +index ae13962c..d2840c9c 100644 +--- a/build.vs19/lib_mpfr_tests/tdim/tdim.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tdim/tdim.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tdiv/tdiv.vcxproj b/build.vs19/lib_mpfr_tests/tdiv/tdiv.vcxproj +index 4029ff65..fc3a3284 100644 +--- a/build.vs19/lib_mpfr_tests/tdiv/tdiv.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tdiv/tdiv.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tdiv_d/tdiv_d.vcxproj b/build.vs19/lib_mpfr_tests/tdiv_d/tdiv_d.vcxproj +index b17386a0..133816ad 100644 +--- a/build.vs19/lib_mpfr_tests/tdiv_d/tdiv_d.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tdiv_d/tdiv_d.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tdiv_ui/tdiv_ui.vcxproj b/build.vs19/lib_mpfr_tests/tdiv_ui/tdiv_ui.vcxproj +index e19231b2..e6a37332 100644 +--- a/build.vs19/lib_mpfr_tests/tdiv_ui/tdiv_ui.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tdiv_ui/tdiv_ui.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tdot/tdot.vcxproj b/build.vs19/lib_mpfr_tests/tdot/tdot.vcxproj +index cda09602..f2d09002 100644 +--- a/build.vs19/lib_mpfr_tests/tdot/tdot.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tdot/tdot.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/teint/teint.vcxproj b/build.vs19/lib_mpfr_tests/teint/teint.vcxproj +index 3e211aaf..4bf78e95 100644 +--- a/build.vs19/lib_mpfr_tests/teint/teint.vcxproj ++++ b/build.vs19/lib_mpfr_tests/teint/teint.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/teq/teq.vcxproj b/build.vs19/lib_mpfr_tests/teq/teq.vcxproj +index d4d132a0..a84222c5 100644 +--- a/build.vs19/lib_mpfr_tests/teq/teq.vcxproj ++++ b/build.vs19/lib_mpfr_tests/teq/teq.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/terandom/terandom.vcxproj b/build.vs19/lib_mpfr_tests/terandom/terandom.vcxproj +index 87d74358..6199749e 100644 +--- a/build.vs19/lib_mpfr_tests/terandom/terandom.vcxproj ++++ b/build.vs19/lib_mpfr_tests/terandom/terandom.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/terandom_chisq/terandom_chisq.vcxproj b/build.vs19/lib_mpfr_tests/terandom_chisq/terandom_chisq.vcxproj +index 3b92a130..21ea4480 100644 +--- a/build.vs19/lib_mpfr_tests/terandom_chisq/terandom_chisq.vcxproj ++++ b/build.vs19/lib_mpfr_tests/terandom_chisq/terandom_chisq.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/terf/terf.vcxproj b/build.vs19/lib_mpfr_tests/terf/terf.vcxproj +index 9d81665e..8b6ca199 100644 +--- a/build.vs19/lib_mpfr_tests/terf/terf.vcxproj ++++ b/build.vs19/lib_mpfr_tests/terf/terf.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/texceptions/texceptions.vcxproj b/build.vs19/lib_mpfr_tests/texceptions/texceptions.vcxproj +index 35091ba8..84a5c813 100644 +--- a/build.vs19/lib_mpfr_tests/texceptions/texceptions.vcxproj ++++ b/build.vs19/lib_mpfr_tests/texceptions/texceptions.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/texp/texp.vcxproj b/build.vs19/lib_mpfr_tests/texp/texp.vcxproj +index fe32e215..036a3062 100644 +--- a/build.vs19/lib_mpfr_tests/texp/texp.vcxproj ++++ b/build.vs19/lib_mpfr_tests/texp/texp.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/texp10/texp10.vcxproj b/build.vs19/lib_mpfr_tests/texp10/texp10.vcxproj +index ec322bfe..c506d7f6 100644 +--- a/build.vs19/lib_mpfr_tests/texp10/texp10.vcxproj ++++ b/build.vs19/lib_mpfr_tests/texp10/texp10.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/texp2/texp2.vcxproj b/build.vs19/lib_mpfr_tests/texp2/texp2.vcxproj +index 06b71fa5..68202cab 100644 +--- a/build.vs19/lib_mpfr_tests/texp2/texp2.vcxproj ++++ b/build.vs19/lib_mpfr_tests/texp2/texp2.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/texpm1/texpm1.vcxproj b/build.vs19/lib_mpfr_tests/texpm1/texpm1.vcxproj +index 82e27bf3..82c11ab6 100644 +--- a/build.vs19/lib_mpfr_tests/texpm1/texpm1.vcxproj ++++ b/build.vs19/lib_mpfr_tests/texpm1/texpm1.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tfactorial/tfactorial.vcxproj b/build.vs19/lib_mpfr_tests/tfactorial/tfactorial.vcxproj +index 3b19fd78..c2e346d8 100644 +--- a/build.vs19/lib_mpfr_tests/tfactorial/tfactorial.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tfactorial/tfactorial.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tfits/tfits.vcxproj b/build.vs19/lib_mpfr_tests/tfits/tfits.vcxproj +index 110c88c1..d7a36c49 100644 +--- a/build.vs19/lib_mpfr_tests/tfits/tfits.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tfits/tfits.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tfma/tfma.vcxproj b/build.vs19/lib_mpfr_tests/tfma/tfma.vcxproj +index 7e727b6b..7aa91f21 100644 +--- a/build.vs19/lib_mpfr_tests/tfma/tfma.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tfma/tfma.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tfmma/tfmma.vcxproj b/build.vs19/lib_mpfr_tests/tfmma/tfmma.vcxproj +index cffb8b8e..61d1479c 100644 +--- a/build.vs19/lib_mpfr_tests/tfmma/tfmma.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tfmma/tfmma.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tfmod/tfmod.vcxproj b/build.vs19/lib_mpfr_tests/tfmod/tfmod.vcxproj +index 9cee910c..06e6eaf5 100644 +--- a/build.vs19/lib_mpfr_tests/tfmod/tfmod.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tfmod/tfmod.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tfms/tfms.vcxproj b/build.vs19/lib_mpfr_tests/tfms/tfms.vcxproj +index 08c17acb..2ac3fe9a 100644 +--- a/build.vs19/lib_mpfr_tests/tfms/tfms.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tfms/tfms.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tfpif/tfpif.vcxproj b/build.vs19/lib_mpfr_tests/tfpif/tfpif.vcxproj +index 239cdc7d..61a73809 100644 +--- a/build.vs19/lib_mpfr_tests/tfpif/tfpif.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tfpif/tfpif.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tfprintf/tfprintf.vcxproj b/build.vs19/lib_mpfr_tests/tfprintf/tfprintf.vcxproj +index 032cbb5e..ef9f2a3a 100644 +--- a/build.vs19/lib_mpfr_tests/tfprintf/tfprintf.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tfprintf/tfprintf.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tfrac/tfrac.vcxproj b/build.vs19/lib_mpfr_tests/tfrac/tfrac.vcxproj +index 7a8cfe03..bbf9044f 100644 +--- a/build.vs19/lib_mpfr_tests/tfrac/tfrac.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tfrac/tfrac.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tfrexp/tfrexp.vcxproj b/build.vs19/lib_mpfr_tests/tfrexp/tfrexp.vcxproj +index 5db653ef..827c345e 100644 +--- a/build.vs19/lib_mpfr_tests/tfrexp/tfrexp.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tfrexp/tfrexp.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tgamma/tgamma.vcxproj b/build.vs19/lib_mpfr_tests/tgamma/tgamma.vcxproj +index b347f469..c73e142e 100644 +--- a/build.vs19/lib_mpfr_tests/tgamma/tgamma.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tgamma/tgamma.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tgamma_inc/tgamma_inc.vcxproj b/build.vs19/lib_mpfr_tests/tgamma_inc/tgamma_inc.vcxproj +index 5921e7a3..ac3a89bc 100644 +--- a/build.vs19/lib_mpfr_tests/tgamma_inc/tgamma_inc.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tgamma_inc/tgamma_inc.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tget_d/tget_d.vcxproj b/build.vs19/lib_mpfr_tests/tget_d/tget_d.vcxproj +index 640dbb4e..4e9d36a5 100644 +--- a/build.vs19/lib_mpfr_tests/tget_d/tget_d.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tget_d/tget_d.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tget_d_2exp/tget_d_2exp.vcxproj b/build.vs19/lib_mpfr_tests/tget_d_2exp/tget_d_2exp.vcxproj +index 5606fd21..404b1f9e 100644 +--- a/build.vs19/lib_mpfr_tests/tget_d_2exp/tget_d_2exp.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tget_d_2exp/tget_d_2exp.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tget_f/tget_f.vcxproj b/build.vs19/lib_mpfr_tests/tget_f/tget_f.vcxproj +index e4184fd0..33b0b8eb 100644 +--- a/build.vs19/lib_mpfr_tests/tget_f/tget_f.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tget_f/tget_f.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tget_flt/tget_flt.vcxproj b/build.vs19/lib_mpfr_tests/tget_flt/tget_flt.vcxproj +index d45ed832..78c44f6d 100644 +--- a/build.vs19/lib_mpfr_tests/tget_flt/tget_flt.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tget_flt/tget_flt.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tget_ld_2exp/tget_ld_2exp.vcxproj b/build.vs19/lib_mpfr_tests/tget_ld_2exp/tget_ld_2exp.vcxproj +index acc5dda9..72afcb70 100644 +--- a/build.vs19/lib_mpfr_tests/tget_ld_2exp/tget_ld_2exp.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tget_ld_2exp/tget_ld_2exp.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tget_q/tget_q.vcxproj b/build.vs19/lib_mpfr_tests/tget_q/tget_q.vcxproj +index d687f476..db284bd8 100644 +--- a/build.vs19/lib_mpfr_tests/tget_q/tget_q.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tget_q/tget_q.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tget_set_d128/tget_set_d128.vcxproj b/build.vs19/lib_mpfr_tests/tget_set_d128/tget_set_d128.vcxproj +index 4c971b0e..7b1f9c05 100644 +--- a/build.vs19/lib_mpfr_tests/tget_set_d128/tget_set_d128.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tget_set_d128/tget_set_d128.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tget_set_d64/tget_set_d64.vcxproj b/build.vs19/lib_mpfr_tests/tget_set_d64/tget_set_d64.vcxproj +index 93723815..d3122846 100644 +--- a/build.vs19/lib_mpfr_tests/tget_set_d64/tget_set_d64.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tget_set_d64/tget_set_d64.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tget_sj/tget_sj.vcxproj b/build.vs19/lib_mpfr_tests/tget_sj/tget_sj.vcxproj +index 5e3b49e4..ca59196e 100644 +--- a/build.vs19/lib_mpfr_tests/tget_sj/tget_sj.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tget_sj/tget_sj.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tget_str/tget_str.vcxproj b/build.vs19/lib_mpfr_tests/tget_str/tget_str.vcxproj +index 27c54d4d..5b0dc506 100644 +--- a/build.vs19/lib_mpfr_tests/tget_str/tget_str.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tget_str/tget_str.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tget_z/tget_z.vcxproj b/build.vs19/lib_mpfr_tests/tget_z/tget_z.vcxproj +index a5a89611..bb6c84d6 100644 +--- a/build.vs19/lib_mpfr_tests/tget_z/tget_z.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tget_z/tget_z.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tgmpop/tgmpop.vcxproj b/build.vs19/lib_mpfr_tests/tgmpop/tgmpop.vcxproj +index d74ffa81..04836906 100644 +--- a/build.vs19/lib_mpfr_tests/tgmpop/tgmpop.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tgmpop/tgmpop.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tgrandom/tgrandom.vcxproj b/build.vs19/lib_mpfr_tests/tgrandom/tgrandom.vcxproj +index e30f8f2c..e231fcae 100644 +--- a/build.vs19/lib_mpfr_tests/tgrandom/tgrandom.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tgrandom/tgrandom.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/thyperbolic/thyperbolic.vcxproj b/build.vs19/lib_mpfr_tests/thyperbolic/thyperbolic.vcxproj +index 7e7d77b4..fee6588f 100644 +--- a/build.vs19/lib_mpfr_tests/thyperbolic/thyperbolic.vcxproj ++++ b/build.vs19/lib_mpfr_tests/thyperbolic/thyperbolic.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/thypot/thypot.vcxproj b/build.vs19/lib_mpfr_tests/thypot/thypot.vcxproj +index 7365e9f7..882449a5 100644 +--- a/build.vs19/lib_mpfr_tests/thypot/thypot.vcxproj ++++ b/build.vs19/lib_mpfr_tests/thypot/thypot.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tinits/tinits.vcxproj b/build.vs19/lib_mpfr_tests/tinits/tinits.vcxproj +index 1b5c74d4..be26d4c1 100644 +--- a/build.vs19/lib_mpfr_tests/tinits/tinits.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tinits/tinits.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tinp_str/tinp_str.vcxproj b/build.vs19/lib_mpfr_tests/tinp_str/tinp_str.vcxproj +index 30ca1d95..effd7896 100644 +--- a/build.vs19/lib_mpfr_tests/tinp_str/tinp_str.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tinp_str/tinp_str.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tinternals/tinternals.vcxproj b/build.vs19/lib_mpfr_tests/tinternals/tinternals.vcxproj +index 6429d8ab..0ca5e287 100644 +--- a/build.vs19/lib_mpfr_tests/tinternals/tinternals.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tinternals/tinternals.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tisnan/tisnan.vcxproj b/build.vs19/lib_mpfr_tests/tisnan/tisnan.vcxproj +index a2882f7f..60466c1d 100644 +--- a/build.vs19/lib_mpfr_tests/tisnan/tisnan.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tisnan/tisnan.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tisqrt/tisqrt.vcxproj b/build.vs19/lib_mpfr_tests/tisqrt/tisqrt.vcxproj +index 5eef6715..5762bd33 100644 +--- a/build.vs19/lib_mpfr_tests/tisqrt/tisqrt.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tisqrt/tisqrt.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tj0/tj0.vcxproj b/build.vs19/lib_mpfr_tests/tj0/tj0.vcxproj +index fd79adb1..b0f8f81e 100644 +--- a/build.vs19/lib_mpfr_tests/tj0/tj0.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tj0/tj0.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tj1/tj1.vcxproj b/build.vs19/lib_mpfr_tests/tj1/tj1.vcxproj +index fd490e18..ebc63114 100644 +--- a/build.vs19/lib_mpfr_tests/tj1/tj1.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tj1/tj1.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tjn/tjn.vcxproj b/build.vs19/lib_mpfr_tests/tjn/tjn.vcxproj +index 90722cc6..2578d20f 100644 +--- a/build.vs19/lib_mpfr_tests/tjn/tjn.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tjn/tjn.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tl2b/tl2b.vcxproj b/build.vs19/lib_mpfr_tests/tl2b/tl2b.vcxproj +index fa271e03..7650cb39 100644 +--- a/build.vs19/lib_mpfr_tests/tl2b/tl2b.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tl2b/tl2b.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tlgamma/tlgamma.vcxproj b/build.vs19/lib_mpfr_tests/tlgamma/tlgamma.vcxproj +index e06fd5c5..6bca619c 100644 +--- a/build.vs19/lib_mpfr_tests/tlgamma/tlgamma.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tlgamma/tlgamma.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tli2/tli2.vcxproj b/build.vs19/lib_mpfr_tests/tli2/tli2.vcxproj +index ee89e213..6da21466 100644 +--- a/build.vs19/lib_mpfr_tests/tli2/tli2.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tli2/tli2.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tlngamma/tlngamma.vcxproj b/build.vs19/lib_mpfr_tests/tlngamma/tlngamma.vcxproj +index 0b96011d..b8b0fffc 100644 +--- a/build.vs19/lib_mpfr_tests/tlngamma/tlngamma.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tlngamma/tlngamma.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tlog/tlog.vcxproj b/build.vs19/lib_mpfr_tests/tlog/tlog.vcxproj +index 343a1df1..787c71c4 100644 +--- a/build.vs19/lib_mpfr_tests/tlog/tlog.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tlog/tlog.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tlog10/tlog10.vcxproj b/build.vs19/lib_mpfr_tests/tlog10/tlog10.vcxproj +index 1e67345e..04fd8ba5 100644 +--- a/build.vs19/lib_mpfr_tests/tlog10/tlog10.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tlog10/tlog10.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tlog1p/tlog1p.vcxproj b/build.vs19/lib_mpfr_tests/tlog1p/tlog1p.vcxproj +index c7ec0cc3..b6bb18e2 100644 +--- a/build.vs19/lib_mpfr_tests/tlog1p/tlog1p.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tlog1p/tlog1p.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tlog2/tlog2.vcxproj b/build.vs19/lib_mpfr_tests/tlog2/tlog2.vcxproj +index 2724e950..d3e18d2f 100644 +--- a/build.vs19/lib_mpfr_tests/tlog2/tlog2.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tlog2/tlog2.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tlog_ui/tlog_ui.vcxproj b/build.vs19/lib_mpfr_tests/tlog_ui/tlog_ui.vcxproj +index 5aa95269..9898a4b1 100644 +--- a/build.vs19/lib_mpfr_tests/tlog_ui/tlog_ui.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tlog_ui/tlog_ui.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tmin_prec/tmin_prec.vcxproj b/build.vs19/lib_mpfr_tests/tmin_prec/tmin_prec.vcxproj +index 7d222c1d..0970be07 100644 +--- a/build.vs19/lib_mpfr_tests/tmin_prec/tmin_prec.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tmin_prec/tmin_prec.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tminmax/tminmax.vcxproj b/build.vs19/lib_mpfr_tests/tminmax/tminmax.vcxproj +index c2de145c..d8389934 100644 +--- a/build.vs19/lib_mpfr_tests/tminmax/tminmax.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tminmax/tminmax.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tmodf/tmodf.vcxproj b/build.vs19/lib_mpfr_tests/tmodf/tmodf.vcxproj +index c9731b07..e5ae3a6b 100644 +--- a/build.vs19/lib_mpfr_tests/tmodf/tmodf.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tmodf/tmodf.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tmul/tmul.vcxproj b/build.vs19/lib_mpfr_tests/tmul/tmul.vcxproj +index 95f1b933..e52a2336 100644 +--- a/build.vs19/lib_mpfr_tests/tmul/tmul.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tmul/tmul.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tmul_2exp/tmul_2exp.vcxproj b/build.vs19/lib_mpfr_tests/tmul_2exp/tmul_2exp.vcxproj +index d75b7e9e..60edcf95 100644 +--- a/build.vs19/lib_mpfr_tests/tmul_2exp/tmul_2exp.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tmul_2exp/tmul_2exp.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tmul_d/tmul_d.vcxproj b/build.vs19/lib_mpfr_tests/tmul_d/tmul_d.vcxproj +index c78956dd..2f9c5f82 100644 +--- a/build.vs19/lib_mpfr_tests/tmul_d/tmul_d.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tmul_d/tmul_d.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tmul_ui/tmul_ui.vcxproj b/build.vs19/lib_mpfr_tests/tmul_ui/tmul_ui.vcxproj +index 9c8f56c1..956bcc08 100644 +--- a/build.vs19/lib_mpfr_tests/tmul_ui/tmul_ui.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tmul_ui/tmul_ui.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tnext/tnext.vcxproj b/build.vs19/lib_mpfr_tests/tnext/tnext.vcxproj +index 1e9ee402..f9ad8e9c 100644 +--- a/build.vs19/lib_mpfr_tests/tnext/tnext.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tnext/tnext.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tnrandom/tnrandom.vcxproj b/build.vs19/lib_mpfr_tests/tnrandom/tnrandom.vcxproj +index 211e9b41..fe6a6dd7 100644 +--- a/build.vs19/lib_mpfr_tests/tnrandom/tnrandom.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tnrandom/tnrandom.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tnrandom_chisq/tnrandom_chisq.vcxproj b/build.vs19/lib_mpfr_tests/tnrandom_chisq/tnrandom_chisq.vcxproj +index 18c539cb..4ed4f610 100644 +--- a/build.vs19/lib_mpfr_tests/tnrandom_chisq/tnrandom_chisq.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tnrandom_chisq/tnrandom_chisq.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tout_str/tout_str.vcxproj b/build.vs19/lib_mpfr_tests/tout_str/tout_str.vcxproj +index 4a0ea540..32b82d97 100644 +--- a/build.vs19/lib_mpfr_tests/tout_str/tout_str.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tout_str/tout_str.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/toutimpl/toutimpl.vcxproj b/build.vs19/lib_mpfr_tests/toutimpl/toutimpl.vcxproj +index 58f44ac3..bee2343d 100644 +--- a/build.vs19/lib_mpfr_tests/toutimpl/toutimpl.vcxproj ++++ b/build.vs19/lib_mpfr_tests/toutimpl/toutimpl.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tpow/tpow.vcxproj b/build.vs19/lib_mpfr_tests/tpow/tpow.vcxproj +index 6614d5bd..eb5b5853 100644 +--- a/build.vs19/lib_mpfr_tests/tpow/tpow.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tpow/tpow.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tpow3/tpow3.vcxproj b/build.vs19/lib_mpfr_tests/tpow3/tpow3.vcxproj +index 0d530fb9..2319585d 100644 +--- a/build.vs19/lib_mpfr_tests/tpow3/tpow3.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tpow3/tpow3.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tpow_all/tpow_all.vcxproj b/build.vs19/lib_mpfr_tests/tpow_all/tpow_all.vcxproj +index 1467fea6..734f6578 100644 +--- a/build.vs19/lib_mpfr_tests/tpow_all/tpow_all.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tpow_all/tpow_all.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tpow_z/tpow_z.vcxproj b/build.vs19/lib_mpfr_tests/tpow_z/tpow_z.vcxproj +index 68295aae..58d18369 100644 +--- a/build.vs19/lib_mpfr_tests/tpow_z/tpow_z.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tpow_z/tpow_z.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tprec_round/tprec_round.vcxproj b/build.vs19/lib_mpfr_tests/tprec_round/tprec_round.vcxproj +index 5ef28572..efa27c73 100644 +--- a/build.vs19/lib_mpfr_tests/tprec_round/tprec_round.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tprec_round/tprec_round.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tprintf/tprintf.vcxproj b/build.vs19/lib_mpfr_tests/tprintf/tprintf.vcxproj +index 339411cc..63b86106 100644 +--- a/build.vs19/lib_mpfr_tests/tprintf/tprintf.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tprintf/tprintf.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/trandom/trandom.vcxproj b/build.vs19/lib_mpfr_tests/trandom/trandom.vcxproj +index 8506b3a5..e1e6f898 100644 +--- a/build.vs19/lib_mpfr_tests/trandom/trandom.vcxproj ++++ b/build.vs19/lib_mpfr_tests/trandom/trandom.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/trandom_deviate/trandom_deviate.vcxproj b/build.vs19/lib_mpfr_tests/trandom_deviate/trandom_deviate.vcxproj +index 60fd4f79..9fd3b616 100644 +--- a/build.vs19/lib_mpfr_tests/trandom_deviate/trandom_deviate.vcxproj ++++ b/build.vs19/lib_mpfr_tests/trandom_deviate/trandom_deviate.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/trec_sqrt/trec_sqrt.vcxproj b/build.vs19/lib_mpfr_tests/trec_sqrt/trec_sqrt.vcxproj +index 6f0e0d5e..45a03c4e 100644 +--- a/build.vs19/lib_mpfr_tests/trec_sqrt/trec_sqrt.vcxproj ++++ b/build.vs19/lib_mpfr_tests/trec_sqrt/trec_sqrt.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tremquo/tremquo.vcxproj b/build.vs19/lib_mpfr_tests/tremquo/tremquo.vcxproj +index 7580c8db..b54c9fc2 100644 +--- a/build.vs19/lib_mpfr_tests/tremquo/tremquo.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tremquo/tremquo.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/trint/trint.vcxproj b/build.vs19/lib_mpfr_tests/trint/trint.vcxproj +index d3c6474b..4e880e95 100644 +--- a/build.vs19/lib_mpfr_tests/trint/trint.vcxproj ++++ b/build.vs19/lib_mpfr_tests/trint/trint.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/trndna/trndna.vcxproj b/build.vs19/lib_mpfr_tests/trndna/trndna.vcxproj +index 72bf49f5..c4165609 100644 +--- a/build.vs19/lib_mpfr_tests/trndna/trndna.vcxproj ++++ b/build.vs19/lib_mpfr_tests/trndna/trndna.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/troot/troot.vcxproj b/build.vs19/lib_mpfr_tests/troot/troot.vcxproj +index 617799a5..d74551cb 100644 +--- a/build.vs19/lib_mpfr_tests/troot/troot.vcxproj ++++ b/build.vs19/lib_mpfr_tests/troot/troot.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/trootn_ui/trootn_ui.vcxproj b/build.vs19/lib_mpfr_tests/trootn_ui/trootn_ui.vcxproj +index a22f29c8..a47bef48 100644 +--- a/build.vs19/lib_mpfr_tests/trootn_ui/trootn_ui.vcxproj ++++ b/build.vs19/lib_mpfr_tests/trootn_ui/trootn_ui.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tsec/tsec.vcxproj b/build.vs19/lib_mpfr_tests/tsec/tsec.vcxproj +index c41638b8..ccfd8d7c 100644 +--- a/build.vs19/lib_mpfr_tests/tsec/tsec.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tsec/tsec.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tsech/tsech.vcxproj b/build.vs19/lib_mpfr_tests/tsech/tsech.vcxproj +index 89c5ab31..6cebc9ec 100644 +--- a/build.vs19/lib_mpfr_tests/tsech/tsech.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tsech/tsech.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tset/tset.vcxproj b/build.vs19/lib_mpfr_tests/tset/tset.vcxproj +index c18e0092..9cc175b9 100644 +--- a/build.vs19/lib_mpfr_tests/tset/tset.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tset/tset.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tset_d/tset_d.vcxproj b/build.vs19/lib_mpfr_tests/tset_d/tset_d.vcxproj +index 36b9719f..ea47dc29 100644 +--- a/build.vs19/lib_mpfr_tests/tset_d/tset_d.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tset_d/tset_d.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tset_exp/tset_exp.vcxproj b/build.vs19/lib_mpfr_tests/tset_exp/tset_exp.vcxproj +index 95810c3e..c234607a 100644 +--- a/build.vs19/lib_mpfr_tests/tset_exp/tset_exp.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tset_exp/tset_exp.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tset_f/tset_f.vcxproj b/build.vs19/lib_mpfr_tests/tset_f/tset_f.vcxproj +index bc09744b..9afce049 100644 +--- a/build.vs19/lib_mpfr_tests/tset_f/tset_f.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tset_f/tset_f.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tset_float128/tset_float128.vcxproj b/build.vs19/lib_mpfr_tests/tset_float128/tset_float128.vcxproj +index 67f2d41c..5f2c8924 100644 +--- a/build.vs19/lib_mpfr_tests/tset_float128/tset_float128.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tset_float128/tset_float128.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tset_ld/tset_ld.vcxproj b/build.vs19/lib_mpfr_tests/tset_ld/tset_ld.vcxproj +index ca1c364a..14689211 100644 +--- a/build.vs19/lib_mpfr_tests/tset_ld/tset_ld.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tset_ld/tset_ld.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tset_q/tset_q.vcxproj b/build.vs19/lib_mpfr_tests/tset_q/tset_q.vcxproj +index 45ecbd6f..1f6952b6 100644 +--- a/build.vs19/lib_mpfr_tests/tset_q/tset_q.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tset_q/tset_q.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tset_si/tset_si.vcxproj b/build.vs19/lib_mpfr_tests/tset_si/tset_si.vcxproj +index f8fe5e0b..cd609e3c 100644 +--- a/build.vs19/lib_mpfr_tests/tset_si/tset_si.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tset_si/tset_si.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tset_sj/tset_sj.vcxproj b/build.vs19/lib_mpfr_tests/tset_sj/tset_sj.vcxproj +index c030c0d0..b3d93425 100644 +--- a/build.vs19/lib_mpfr_tests/tset_sj/tset_sj.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tset_sj/tset_sj.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tset_str/tset_str.vcxproj b/build.vs19/lib_mpfr_tests/tset_str/tset_str.vcxproj +index 0f96aa4d..d7248918 100644 +--- a/build.vs19/lib_mpfr_tests/tset_str/tset_str.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tset_str/tset_str.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tset_z/tset_z.vcxproj b/build.vs19/lib_mpfr_tests/tset_z/tset_z.vcxproj +index 826d40d6..1c6bd5c2 100644 +--- a/build.vs19/lib_mpfr_tests/tset_z/tset_z.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tset_z/tset_z.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tset_z_exp/tset_z_exp.vcxproj b/build.vs19/lib_mpfr_tests/tset_z_exp/tset_z_exp.vcxproj +index 9cdd2468..42283be7 100644 +--- a/build.vs19/lib_mpfr_tests/tset_z_exp/tset_z_exp.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tset_z_exp/tset_z_exp.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.30128.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tsgn/tsgn.vcxproj b/build.vs19/lib_mpfr_tests/tsgn/tsgn.vcxproj +index 70b5ef80..e416afaf 100644 +--- a/build.vs19/lib_mpfr_tests/tsgn/tsgn.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tsgn/tsgn.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tsi_op/tsi_op.vcxproj b/build.vs19/lib_mpfr_tests/tsi_op/tsi_op.vcxproj +index 25e54898..f4b76c14 100644 +--- a/build.vs19/lib_mpfr_tests/tsi_op/tsi_op.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tsi_op/tsi_op.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tsin/tsin.vcxproj b/build.vs19/lib_mpfr_tests/tsin/tsin.vcxproj +index 7fb3bed9..c4289447 100644 +--- a/build.vs19/lib_mpfr_tests/tsin/tsin.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tsin/tsin.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tsin_cos/tsin_cos.vcxproj b/build.vs19/lib_mpfr_tests/tsin_cos/tsin_cos.vcxproj +index 2e814100..2538aa97 100644 +--- a/build.vs19/lib_mpfr_tests/tsin_cos/tsin_cos.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tsin_cos/tsin_cos.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tsinh/tsinh.vcxproj b/build.vs19/lib_mpfr_tests/tsinh/tsinh.vcxproj +index c12b52f2..5bec973d 100644 +--- a/build.vs19/lib_mpfr_tests/tsinh/tsinh.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tsinh/tsinh.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tsinh_cosh/tsinh_cosh.vcxproj b/build.vs19/lib_mpfr_tests/tsinh_cosh/tsinh_cosh.vcxproj +index 9655d1d2..68f75ff8 100644 +--- a/build.vs19/lib_mpfr_tests/tsinh_cosh/tsinh_cosh.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tsinh_cosh/tsinh_cosh.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tsprintf/tsprintf.vcxproj b/build.vs19/lib_mpfr_tests/tsprintf/tsprintf.vcxproj +index 492019c8..57a38cf1 100644 +--- a/build.vs19/lib_mpfr_tests/tsprintf/tsprintf.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tsprintf/tsprintf.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tsqr/tsqr.vcxproj b/build.vs19/lib_mpfr_tests/tsqr/tsqr.vcxproj +index b05525e5..28c57196 100644 +--- a/build.vs19/lib_mpfr_tests/tsqr/tsqr.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tsqr/tsqr.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tsqrt/tsqrt.vcxproj b/build.vs19/lib_mpfr_tests/tsqrt/tsqrt.vcxproj +index 0d30a4a7..682ff75a 100644 +--- a/build.vs19/lib_mpfr_tests/tsqrt/tsqrt.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tsqrt/tsqrt.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tsqrt_ui/tsqrt_ui.vcxproj b/build.vs19/lib_mpfr_tests/tsqrt_ui/tsqrt_ui.vcxproj +index 9ffe5915..afcff798 100644 +--- a/build.vs19/lib_mpfr_tests/tsqrt_ui/tsqrt_ui.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tsqrt_ui/tsqrt_ui.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tstckintc/tstckintc.vcxproj b/build.vs19/lib_mpfr_tests/tstckintc/tstckintc.vcxproj +index 07f1eab2..433a540b 100644 +--- a/build.vs19/lib_mpfr_tests/tstckintc/tstckintc.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tstckintc/tstckintc.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tstdint/tstdint.vcxproj b/build.vs19/lib_mpfr_tests/tstdint/tstdint.vcxproj +index 19120d35..52046835 100644 +--- a/build.vs19/lib_mpfr_tests/tstdint/tstdint.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tstdint/tstdint.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.30128.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tstrtofr/tstrtofr.vcxproj b/build.vs19/lib_mpfr_tests/tstrtofr/tstrtofr.vcxproj +index 3ee7785a..b1e8cf3a 100644 +--- a/build.vs19/lib_mpfr_tests/tstrtofr/tstrtofr.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tstrtofr/tstrtofr.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tsub/tsub.vcxproj b/build.vs19/lib_mpfr_tests/tsub/tsub.vcxproj +index b1b3b4ef..e69ac125 100644 +--- a/build.vs19/lib_mpfr_tests/tsub/tsub.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tsub/tsub.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tsub1sp/tsub1sp.vcxproj b/build.vs19/lib_mpfr_tests/tsub1sp/tsub1sp.vcxproj +index 7b34e819..ab0dcf27 100644 +--- a/build.vs19/lib_mpfr_tests/tsub1sp/tsub1sp.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tsub1sp/tsub1sp.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tsub_d/tsub_d.vcxproj b/build.vs19/lib_mpfr_tests/tsub_d/tsub_d.vcxproj +index b9836a5f..c5d5ebe4 100644 +--- a/build.vs19/lib_mpfr_tests/tsub_d/tsub_d.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tsub_d/tsub_d.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tsub_ui/tsub_ui.vcxproj b/build.vs19/lib_mpfr_tests/tsub_ui/tsub_ui.vcxproj +index 65b6d044..1bec0dc1 100644 +--- a/build.vs19/lib_mpfr_tests/tsub_ui/tsub_ui.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tsub_ui/tsub_ui.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tsubnormal/tsubnormal.vcxproj b/build.vs19/lib_mpfr_tests/tsubnormal/tsubnormal.vcxproj +index 525979e3..613358d4 100644 +--- a/build.vs19/lib_mpfr_tests/tsubnormal/tsubnormal.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tsubnormal/tsubnormal.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tsum/tsum.vcxproj b/build.vs19/lib_mpfr_tests/tsum/tsum.vcxproj +index 0a287acf..6ee64388 100644 +--- a/build.vs19/lib_mpfr_tests/tsum/tsum.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tsum/tsum.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tswap/tswap.vcxproj b/build.vs19/lib_mpfr_tests/tswap/tswap.vcxproj +index a68407a0..ce845fb0 100644 +--- a/build.vs19/lib_mpfr_tests/tswap/tswap.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tswap/tswap.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/ttan/ttan.vcxproj b/build.vs19/lib_mpfr_tests/ttan/ttan.vcxproj +index aa41d82b..07ee149b 100644 +--- a/build.vs19/lib_mpfr_tests/ttan/ttan.vcxproj ++++ b/build.vs19/lib_mpfr_tests/ttan/ttan.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/ttanh/ttanh.vcxproj b/build.vs19/lib_mpfr_tests/ttanh/ttanh.vcxproj +index 77cbc857..dc726624 100644 +--- a/build.vs19/lib_mpfr_tests/ttanh/ttanh.vcxproj ++++ b/build.vs19/lib_mpfr_tests/ttanh/ttanh.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/ttotal_order/ttotal_order.vcxproj b/build.vs19/lib_mpfr_tests/ttotal_order/ttotal_order.vcxproj +index 56e8db44..787faa91 100644 +--- a/build.vs19/lib_mpfr_tests/ttotal_order/ttotal_order.vcxproj ++++ b/build.vs19/lib_mpfr_tests/ttotal_order/ttotal_order.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/ttrunc/ttrunc.vcxproj b/build.vs19/lib_mpfr_tests/ttrunc/ttrunc.vcxproj +index 567c35f5..744cd9f7 100644 +--- a/build.vs19/lib_mpfr_tests/ttrunc/ttrunc.vcxproj ++++ b/build.vs19/lib_mpfr_tests/ttrunc/ttrunc.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tui_div/tui_div.vcxproj b/build.vs19/lib_mpfr_tests/tui_div/tui_div.vcxproj +index 31d0c2e6..10a32af3 100644 +--- a/build.vs19/lib_mpfr_tests/tui_div/tui_div.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tui_div/tui_div.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tui_pow/tui_pow.vcxproj b/build.vs19/lib_mpfr_tests/tui_pow/tui_pow.vcxproj +index 917ea1df..0609cf92 100644 +--- a/build.vs19/lib_mpfr_tests/tui_pow/tui_pow.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tui_pow/tui_pow.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tui_sub/tui_sub.vcxproj b/build.vs19/lib_mpfr_tests/tui_sub/tui_sub.vcxproj +index ad059e52..e246b094 100644 +--- a/build.vs19/lib_mpfr_tests/tui_sub/tui_sub.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tui_sub/tui_sub.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/turandom/turandom.vcxproj b/build.vs19/lib_mpfr_tests/turandom/turandom.vcxproj +index 00d8383e..5fb75f83 100644 +--- a/build.vs19/lib_mpfr_tests/turandom/turandom.vcxproj ++++ b/build.vs19/lib_mpfr_tests/turandom/turandom.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tvalist/tvalist.vcxproj b/build.vs19/lib_mpfr_tests/tvalist/tvalist.vcxproj +index 7ff65985..d4d32dac 100644 +--- a/build.vs19/lib_mpfr_tests/tvalist/tvalist.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tvalist/tvalist.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tversion/tversion.vcxproj b/build.vs19/lib_mpfr_tests/tversion/tversion.vcxproj +index 08d5a137..c79c9639 100644 +--- a/build.vs19/lib_mpfr_tests/tversion/tversion.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tversion/tversion.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/ty0/ty0.vcxproj b/build.vs19/lib_mpfr_tests/ty0/ty0.vcxproj +index f478c767..9e8eb23a 100644 +--- a/build.vs19/lib_mpfr_tests/ty0/ty0.vcxproj ++++ b/build.vs19/lib_mpfr_tests/ty0/ty0.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/ty1/ty1.vcxproj b/build.vs19/lib_mpfr_tests/ty1/ty1.vcxproj +index 6440cf69..104b5362 100644 +--- a/build.vs19/lib_mpfr_tests/ty1/ty1.vcxproj ++++ b/build.vs19/lib_mpfr_tests/ty1/ty1.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tyn/tyn.vcxproj b/build.vs19/lib_mpfr_tests/tyn/tyn.vcxproj +index 88710e2f..017d7f58 100644 +--- a/build.vs19/lib_mpfr_tests/tyn/tyn.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tyn/tyn.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tzeta/tzeta.vcxproj b/build.vs19/lib_mpfr_tests/tzeta/tzeta.vcxproj +index f6af2e0f..4dc890dd 100644 +--- a/build.vs19/lib_mpfr_tests/tzeta/tzeta.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tzeta/tzeta.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/lib_mpfr_tests/tzeta_ui/tzeta_ui.vcxproj b/build.vs19/lib_mpfr_tests/tzeta_ui/tzeta_ui.vcxproj +index 66332f60..11a9501d 100644 +--- a/build.vs19/lib_mpfr_tests/tzeta_ui/tzeta_ui.vcxproj ++++ b/build.vs19/lib_mpfr_tests/tzeta_ui/tzeta_ui.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -29,10 +37,18 @@ + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 + ++ ++ Application ++ v142 ++ + + Application + v142 +@@ -47,9 +63,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -60,11 +82,15 @@ + + <_ProjectFileVersion>10.0.21006.1 + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ ++ $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ + $(SolutionDir)lib_mpfr_tests\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + +@@ -87,6 +113,25 @@ + + + ++ ++ ++ Full ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ++ ++ MultiThreaded ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ true ++ true ++ ++ ++ ++ + + + X64 +@@ -130,6 +175,27 @@ + + + ++ ++ ++ Disabled ++ ..\..\;..\..\..\src\;..\..\..\..\mpir\lib\$(IntDir);%(AdditionalIncludeDirectories) ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ MultiThreadedDebug ++ ++ ++ true ++ ..\..\..\..\mpir\lib\$(IntDir)\config.h ++ ++ ++ ..\$(IntDir)lib_tests.lib;..\..\..\lib\$(IntDir)mpfr.lib;..\..\..\..\mpir\lib\$(IntDir)mpir.lib ++ ++ ++ ++ ++ ++ ++ ++ + + + X64 +diff --git a/build.vs19/timing/timing.vcxproj b/build.vs19/timing/timing.vcxproj +index 71a2f7ab..f4ff21c3 100644 +--- a/build.vs19/timing/timing.vcxproj ++++ b/build.vs19/timing/timing.vcxproj +@@ -1,10 +1,18 @@ + + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -34,6 +42,12 @@ + v142 + MultiByte + ++ ++ Application ++ true ++ v142 ++ MultiByte ++ + + Application + false +@@ -41,6 +55,13 @@ + true + MultiByte + ++ ++ Application ++ false ++ v142 ++ true ++ MultiByte ++ + + Application + true +@@ -62,9 +83,15 @@ + + + ++ ++ ++ + + + ++ ++ ++ + + + +@@ -76,10 +103,18 @@ + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + ++ ++ $(SolutionDir)$(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ ++ + + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + ++ ++ $(SolutionDir)$(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ ++ + + + Level3 +@@ -110,6 +145,19 @@ + ..\..\lib\$(IntDir)mpfr.lib;..\..\..\mpir\lib\$(IntDir)mpir.lib;..\..\..\mpir\msvc\vs17\$(IntDir)lib_speed.lib;%(AdditionalDependencies) + + ++ ++ ++ Level3 ++ Disabled ++ true ++ true ++ MultiThreadedDebug ++ ..\;..\..\;..\..\src\;..\..\..\mpir\lib\$(IntDir);..\..\..\mpir\tune;..\..\..\mpir\build.vc;%(AdditionalIncludeDirectories) ++ ++ ++ ..\..\lib\$(IntDir)mpfr.lib;..\..\..\mpir\lib\$(IntDir)mpir.lib;..\..\..\mpir\msvc\vs17\$(IntDir)lib_speed.lib;%(AdditionalDependencies) ++ ++ + + + Level3 +@@ -140,6 +188,23 @@ + ..\..\lib\$(IntDir)mpfr.lib;..\..\..\mpir\lib\$(IntDir)mpir.lib;..\..\..\mpir\msvc\vs17\$(IntDir)lib_speed.lib;%(AdditionalDependencies) + + ++ ++ ++ Level3 ++ MaxSpeed ++ true ++ true ++ true ++ true ++ MultiThreaded ++ ..\;..\..\;..\..\src\;..\..\..\mpir\lib\$(IntDir);..\..\..\mpir\tune;..\..\..\mpir\build.vc;%(AdditionalIncludeDirectories) ++ ++ ++ true ++ true ++ ..\..\lib\$(IntDir)mpfr.lib;..\..\..\mpir\lib\$(IntDir)mpir.lib;..\..\..\mpir\msvc\vs17\$(IntDir)lib_speed.lib;%(AdditionalDependencies) ++ ++ + + + +diff --git a/build.vs19/tuneup/tuneup.vcxproj b/build.vs19/tuneup/tuneup.vcxproj +index d076c235..61ef8867 100644 +--- a/build.vs19/tuneup/tuneup.vcxproj ++++ b/build.vs19/tuneup/tuneup.vcxproj +@@ -1,6 +1,10 @@ +  + + ++ ++ Debug ++ ARM64 ++ + + Debug + Win32 +@@ -9,6 +13,10 @@ + Debug + x64 + ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -31,6 +39,12 @@ + NotSet + v142 + ++ ++ Application ++ true ++ NotSet ++ v142 ++ + + Application + true +@@ -44,6 +58,13 @@ + NotSet + v142 + ++ ++ Application ++ false ++ true ++ NotSet ++ v142 ++ + + Application + false +@@ -57,12 +78,18 @@ + + + ++ ++ ++ + + + + + + ++ ++ ++ + + + +@@ -72,6 +99,11 @@ + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + ++ ++ true ++ $(SolutionDir)$(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ ++ + + true + $(SolutionDir)$(Platform)\$(Configuration)\ +@@ -82,6 +114,11 @@ + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + ++ ++ false ++ $(SolutionDir)$(Platform)\$(Configuration)\ ++ $(Platform)\$(Configuration)\ ++ + + false + $(SolutionDir)$(Platform)\$(Configuration)\ +@@ -107,6 +144,26 @@ + ..\..\lib\$(IntDir)mpfr.lib;..\..\..\mpir\lib\$(IntDir)mpir.lib;..\..\..\mpir\msvc\vs17\$(IntDir)lib_speed.lib;%(AdditionalDependencies) + + ++ ++ ++ ++ ++ Level3 ++ Disabled ++ WIN32;_DEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ..\;..\..\;..\..\src\;..\..\..\mpir\lib\$(IntDir);..\..\..\mpir\tune;..\..\..\mpir\msvc;%(AdditionalIncludeDirectories) ++ MultiThreadedDebug ++ ++ ++ true ++ true ++ ++ ++ Console ++ true ++ ..\..\lib\$(IntDir)mpfr.lib;..\..\..\mpir\lib\$(IntDir)mpir.lib;..\..\..\mpir\msvc\vs17\$(IntDir)lib_speed.lib;%(AdditionalDependencies) ++ ++ + + + +@@ -150,6 +207,29 @@ + ..\..\lib\$(IntDir)mpfr.lib;..\..\..\mpir\lib\$(IntDir)mpir.lib;..\..\..\mpir\msvc\vs17\$(IntDir)lib_speed.lib;%(AdditionalDependencies) + + ++ ++ ++ Level3 ++ ++ ++ Full ++ true ++ true ++ WIN32;NDEBUG;_CONSOLE;MPFR_HAVE_GMP_IMPL ++ ..\;..\..\;..\..\src\;..\..\..\mpir\lib\$(IntDir);..\..\..\mpir\tune;..\..\..\mpir\msvc;%(AdditionalIncludeDirectories) ++ MultiThreaded ++ ++ ++ true ++ ++ ++ Console ++ true ++ true ++ true ++ ..\..\lib\$(IntDir)mpfr.lib;..\..\..\mpir\lib\$(IntDir)mpir.lib;..\..\..\mpir\msvc\vs17\$(IntDir)lib_speed.lib;%(AdditionalDependencies) ++ ++ + + + Level3 diff --git a/win/patches/mpir-arm64-changes.patch b/win/patches/mpir-arm64-changes.patch new file mode 100644 index 00000000000..ab68519c2ce --- /dev/null +++ b/win/patches/mpir-arm64-changes.patch @@ -0,0 +1,519 @@ +diff --git a/msvc/postbuild.bat b/msvc/postbuild.bat +index 1c301d1a..7d5362be 100644 +--- a/msvc/postbuild.bat ++++ b/msvc/postbuild.bat +@@ -1,6 +1,6 @@ + @echo off + rem %1 = full target path +-rem %2 = last two digits of the Visual Studio version number (e.g. 17) ++rem %2 = last two digits of the Visual Studio version number (e.g. 17 or 22) + + set vs_ver=%2 + set str=%~1 +@@ -20,11 +20,13 @@ goto dele + set str=%str_confirmed% + echo "Final subpath %str%" + +-rem we now have: msvc.\vs\\\\mpir. +-rem extract: project_directory, platform (plat=), configuration (conf=) and file name ++rem we now have: msvc\vs\\\\mpir(.xx). ++rem extract: project_directory, platform (plat), configuration (conf) and file name + + set file= +-for /f "tokens=1,2,3,4,5,6 delims=\" %%a in ("%str%") do set tloc=%%c&set plat=%%d&set conf=%%e&set file=%%f ++for /f "tokens=1,2,3,4,5,6 delims=\" %%a in ("%str%") do ( ++ set tloc=%%c&set plat=%%d&set conf=%%e&set file=%%f ++) + if /i "%file%" NEQ "" (goto next) + call :seterr & echo ERROR: %1 is not supported & exit /b %errorlevel% + +@@ -42,9 +44,9 @@ call :seterr & echo "postbuild copy error ERROR: target=%tloc%, plat=%plat%, con + + :is2nd: + rem set the target and final binary output directories +-set tgt_dir="vs%vs_ver%\%loc%%plat%\%conf%\" +-set bin_dir="..\%extn%\%plat%\%conf%\" +-set hdr_dir="..\%extn%\%plat%\%conf%\" ++set "tgt_dir=vs%vs_ver%\%loc%%plat%\%conf%" ++set "bin_dir=..\%extn%\%plat%\%conf%" ++set "hdr_dir=..\%extn%\%plat%\%conf%" + + rem output parametrers for the MPIR tests + if /i "%filename%" EQU "mpirxx" goto skip +@@ -66,43 +68,42 @@ rem %1 = target (build output) directory + rem %2 = binary destination directory + rem %3 = configuration (debug/release) + rem %4 = library (lib/dll) +-rem %5 = file name ++rem %5 = file name (mpir | mpirxx) + :copyb + if "%4" EQU "dll" ( +- copy %1mpir.dll %2mpir.dll > nul 2>&1 +- copy %1mpir.exp %2mpir.exp > nul 2>&1 +- copy %1mpir.lib %2mpir.lib > nul 2>&1 +- if exist %1mpir.pdb (copy %1mpir.pdb %2mpir.pdb > nul 2>&1) ++ copy "%~1\mpir.dll" "%~2\mpir.dll" > nul 2>&1 ++ copy "%~1\mpir.exp" "%~2\mpir.exp" > nul 2>&1 ++ copy "%~1\mpir.lib" "%~2\mpir.lib" > nul 2>&1 ++ if exist "%~1\mpir.pdb" copy "%~1\mpir.pdb" "%~2\mpir.pdb" > nul 2>&1 + ) else if "%4" EQU "lib" ( + if "%5" EQU "mpir" ( +- if exist %1mpir.lib ( +- copy %1mpir.lib %2mpir.lib > nul 2>&1 +- if exist %1mpir.pdb (copy %1mpir.pdb %2mpir.pdb > nul 2>&1) ++ if exist "%~1\mpir.lib" ( ++ copy "%~1\mpir.lib" "%~2\mpir.lib" > nul 2>&1 ++ if exist "%~1\mpir.pdb" copy "%~1\mpir.pdb" "%~2\mpir.pdb" > nul 2>&1 ++ ) else ( ++ echo "Not Found MPIR at location" "%~1\mpir.lib" + ) + ) else if "%5" EQU "mpirxx" ( +- if exist %1mpirxx.lib ( +- copy %1mpirxx.lib %2mpirxx.lib > nul 2>&1 +- if exist %1mpirxx.pdb (copy %1mpirxx.pdb %2mpirxx.pdb > nul 2>&1) ++ if exist "%~1\mpirxx.lib" ( ++ copy "%~1\mpirxx.lib" "%~2\mpirxx.lib" > nul 2>&1 ++ if exist "%~1\mpirxx.pdb" copy "%~1\mpirxx.pdb" "%~2\mpirxx.pdb" > nul 2>&1 + ) + ) + ) else ( +- call :seterr & echo ERROR: illegal library type %4 & exit /b %errorlevel% ++ call :seterr & echo ERROR: illegal library type %4 & exit /b %errorlevel% + ) +- +-rem set configuration for the tests +-call gen_test_config_props %plat% %conf% %vs_ver% + exit /b 0 + + rem copy headers to final destination directory + :copyh +-copy ..\config.h %1config.h > nul 2>&1 +-copy ..\gmp-mparam.h %1gmp-mparam.h > nul 2>&1 +-copy ..\mpir.h %1mpir.h > nul 2>&1 +-copy ..\mpir.h %1gmp.h > nul 2>&1 +-copy ..\gmp-impl.h %1gmp-impl.h > nul 2>&1 +-copy ..\longlong.h %1longlong.h > nul 2>&1 +-copy ..\mpirxx.h %1mpirxx.h > nul 2>&1 +-copy ..\mpirxx.h %1gmpxx.h > nul 2>&1 ++copy "..\config.h" "%~1\config.h" > nul 2>&1 ++copy "..\gmp-mparam.h" "%~1\gmp-mparam.h" > nul 2>&1 ++copy "..\mpir.h" "%~1\mpir.h" > nul 2>&1 ++copy "..\mpir.h" "%~1\gmp.h" > nul 2>&1 ++copy "..\gmp-impl.h" "%~1\gmp-impl.h" > nul 2>&1 ++copy "..\longlong.h" "%~1\longlong.h" > nul 2>&1 ++copy "..\mpirxx.h" "%~1\mpirxx.h" > nul 2>&1 ++copy "..\mpirxx.h" "%~1\gmpxx.h" > nul 2>&1 + exit /b 0 + + :seterr +diff --git a/msvc/prebuild.bat b/msvc/prebuild.bat +index 243d054f..c1d49c67 100644 +--- a/msvc/prebuild.bat ++++ b/msvc/prebuild.bat +@@ -1,29 +1,56 @@ + @echo off +-rem %1 = mpn directory (generic, x86\... or x86_64\...) +-rem %2 = platform (win32 or x64) ++rem %1 = mpn directory (generic, x86\... or x86_64\... or arm64\...) ++rem %2 = platform (win32, x64/amd64, or arm64) + rem %3 = MSVC version number (e.g. 14) + +-if /i "%2" EQU "win32" ((set platform=win32) & (set bdir=x86w\)) else ((set platform=x64) & (set bdir=x86_64w\)) +-set sdir= +-if /i "%1" EQU "gc" ((set sdir=generic) & (set bdir=generic)) else (set sdir=%bdir%%1) +-if not exist ..\mpn\%sdir% (call :seterr & echo ERROR: %1 is not supported & exit /b %errorlevel%) ++set "platform=" ++set "bdir=" ++ ++if /i "%2"=="win32" ( ++ set "platform=win32" ++ set "bdir=x86w\" ++) else if /i "%2"=="x64" ( ++ set "platform=x64" ++ set "bdir=x86_64w\" ++) else if /i "%2"=="arm64" ( ++ set "platform=arm64" ++ set "bdir=arm64w\" ++) else ( ++ call :seterr & echo ERROR: Unsupported platform "%2" (expected win32, x64/amd64, or arm64) & exit /b %errorlevel% ++) ++ ++set "sdir=" ++if /i "%1"=="gc" ( ++ rem Generic C (portable) implementation ++ set "sdir=generic" ++ set "bdir=generic" ++) else ( ++ set "sdir=%bdir%%~1" ++) ++ ++if not exist "..\mpn\%sdir%" ( ++ call :seterr & echo ERROR: %1 is not supported & exit /b %errorlevel% ++) + + echo building MPIR for %1 (%platform%) from directory mpn\%sdir% + +-set cdir=vs%3\cdata\mpn\%sdir%\ +-set sdir=..\mpn\%sdir%\ +-set bdir=..\mpn\%bdir%\ ++set "cdir=vs%3\cdata\mpn\%sdir%\" ++set "sdir=..\mpn\%sdir%\" ++set "bdir=..\mpn\%bdir%\" + + call gen_mpir_h %platform% + call gen_config_h %cdir% + +-if exist %sdir%\gmp-mparam.h (call out_copy_rename %sdir%\gmp-mparam.h ..\ gmp-mparam.h) else ( +- call out_copy_rename %bdir%\gmp-mparam.h ..\ gmp-mparam.h) ++if exist "%sdir%\gmp-mparam.h" ( ++ call out_copy_rename "%sdir%\gmp-mparam.h" "..\" "gmp-mparam.h" ++) else ( ++ call out_copy_rename "%bdir%\gmp-mparam.h" "..\" "gmp-mparam.h" ++) + +-type ..\longlong_pre.h >tmp.h +-type %bdir%\longlong_inc.h >>tmp.h +-type ..\longlong_post.h >>tmp.h +-call out_copy_rename tmp.h ..\ longlong.h ++type "..\longlong_pre.h" > tmp.h ++type "%bdir%\longlong_inc.h" >> tmp.h ++type "..\longlong_post.h" >> tmp.h ++call out_copy_rename tmp.h "..\" "longlong.h" + del tmp.h + + exit /b 0 +diff --git a/msvc/vs22/lib_mpir_cxx/lib_mpir_cxx.vcxproj b/msvc/vs22/lib_mpir_cxx/lib_mpir_cxx.vcxproj +index 0aca0c6e..e4bcf619 100644 +--- a/msvc/vs22/lib_mpir_cxx/lib_mpir_cxx.vcxproj ++++ b/msvc/vs22/lib_mpir_cxx/lib_mpir_cxx.vcxproj +@@ -1,6 +1,14 @@ + + + ++ ++ Debug ++ ARM64 ++ ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -40,11 +48,21 @@ + false + v143 + ++ ++ StaticLibrary ++ false ++ v143 ++ + + StaticLibrary + true + v143 + ++ ++ StaticLibrary ++ true ++ v143 ++ + + + +@@ -58,17 +76,27 @@ + + + ++ ++ ++ ++ + + + + ++ ++ ++ ++ + + + <_ProjectFileVersion>10.0.21006.1 + mpirxx + mpirxx + mpirxx ++ mpirxx + mpirxx ++ mpirxx + + + +@@ -99,6 +127,17 @@ postbuild "$(TargetPath)" 22 + + + cd ..\..\ ++postbuild "$(TargetPath)" 22 ++ ++ ++ ++ ++ ++ ..\..\..\ ++ NDEBUG;WIN32;_LIB;HAVE_CONFIG_H;_WIN64;%(PreprocessorDefinitions) ++ ++ ++ cd ..\..\ + postbuild "$(TargetPath)" 22 + + +@@ -110,6 +149,17 @@ postbuild "$(TargetPath)" 22 + + + cd ..\..\ ++postbuild "$(TargetPath)" 22 ++ ++ ++ ++ ++ ++ ..\..\..\ ++ _DEBUG;WIN32;_LIB;HAVE_CONFIG_H;_WIN64;%(PreprocessorDefinitions) ++ ++ ++ cd ..\..\ + postbuild "$(TargetPath)" 22 + + +@@ -141,7 +191,7 @@ postbuild "$(TargetPath)" 22 + + + +- ++ + +- +- ++ ++ +\ No newline at end of file +diff --git a/msvc/vs22/lib_mpir_gc/lib_mpir_gc.vcxproj b/msvc/vs22/lib_mpir_gc/lib_mpir_gc.vcxproj +index 350ee110..faf49ac3 100644 +--- a/msvc/vs22/lib_mpir_gc/lib_mpir_gc.vcxproj ++++ b/msvc/vs22/lib_mpir_gc/lib_mpir_gc.vcxproj +@@ -1,6 +1,14 @@ + + + ++ ++ Debug ++ ARM64 ++ ++ ++ Release ++ ARM64 ++ + + Release + Win32 +@@ -40,11 +48,21 @@ + false + v143 + ++ ++ StaticLibrary ++ false ++ v143 ++ + + StaticLibrary + true + v143 + ++ ++ StaticLibrary ++ true ++ v143 ++ + + + +@@ -58,23 +76,32 @@ + + + ++ ++ ++ ++ + + + + ++ ++ ++ ++ + + + <_ProjectFileVersion>10.0.21006.1 + mpir + mpir + mpir ++ mpir + mpir ++ mpir + + + + cd ..\..\ +-prebuild gc Win32 22 +- ++prebuild gc $(Platform) 22 + + + ..\..\..\ +@@ -82,15 +109,13 @@ prebuild gc Win32 22 + + + cd ..\..\ +-postbuild "$(TargetPath)" 22 +- ++postbuild "$(TargetPath)" 22 + + + + + cd ..\..\ +-prebuild gc Win32 22 +- ++prebuild gc $(Platform) 22 + + + ..\..\..\ +@@ -98,15 +123,27 @@ prebuild gc Win32 22 + + + cd ..\..\ +-postbuild "$(TargetPath)" 22 +- ++postbuild "$(TargetPath)" 22 + + + + + cd ..\..\ +-prebuild gc x64 22 +- ++prebuild gc $(Platform) 22 ++ ++ ++ ..\..\..\ ++ NDEBUG;WIN32;_LIB;HAVE_CONFIG_H;_WIN64;%(PreprocessorDefinitions) ++ ++ ++ cd ..\..\ ++postbuild "$(TargetPath)" 22 ++ ++ ++ ++ ++ cd ..\..\ ++prebuild gc $(Platform) 22 + + + ..\..\..\ +@@ -114,15 +151,13 @@ prebuild gc x64 22 + + + cd ..\..\ +-postbuild "$(TargetPath)" 22 +- ++postbuild "$(TargetPath)" 22 + + + + + cd ..\..\ +-prebuild gc x64 22 +- ++prebuild gc $(Platform) 22 + + + ..\..\..\ +@@ -130,8 +165,21 @@ prebuild gc x64 22 + + + cd ..\..\ +-postbuild "$(TargetPath)" 22 +- ++postbuild "$(TargetPath)" 22 ++ ++ ++ ++ ++ cd ..\..\ ++prebuild gc $(Platform) 22 ++ ++ ++ ..\..\..\ ++ _DEBUG;WIN32;_LIB;HAVE_CONFIG_H;_WIN64;%(PreprocessorDefinitions) ++ ++ ++ cd ..\..\ ++postbuild "$(TargetPath)" 22 + + + +@@ -667,7 +715,7 @@ postbuild "$(TargetPath)" 22 + + + +- ++ + +- +- ++ ++ +\ No newline at end of file +diff --git a/msvc/vs22/msbuild.bat b/msvc/vs22/msbuild.bat +index f119c3e9..36bfe28b 100644 +--- a/msvc/vs22/msbuild.bat ++++ b/msvc/vs22/msbuild.bat +@@ -1,7 +1,7 @@ + @echo off + rem %1 = architecture + rem %2 = library type (LIB|DLL) +-rem %3 = platform (Win32|x64) ++rem %3 = platform (Win32|x64|ARM64) + rem %4 = configuration (Release|Debug) + rem %5 = Windows SDK Version + rem %6 = build tests (|+tests) +@@ -31,15 +31,21 @@ if not exist !msb_exe! ( + + if "%4" NEQ "" if "%3" NEQ "" if "%2" NEQ "" if "%1" NEQ "" goto cont + call :get_architectures - +-echo usage: msbuild architecture=^<%architectures:|=^|%^> library_type=^ platform=^ configuration=^ [Windows_SDK_Version=^] [+tests] ++echo usage: msbuild architecture=^<%architectures:|=^|%^> library_type=^ platform=^ configuration=^ [Windows_SDK_Version=^] [+tests] + goto :eof + + :cont + rem example use: msbuild sandybridge_ivybridge dll x64 release + if not exist "lib_mpir_%1" (call :get_architectures & call :seterr & echo ERROR: architecture is one of ^(%architectures%^) ^(not %1^) & exit /b %errorlevel%) + if /i "%2" EQU "DLL" (set libp=dll) else (if /i "%2" EQU "LIB" (set libp=lib) else ((call :seterr & echo ERROR: library type is "lib" or "dll" ^(not "%2"^) & exit /b %errorlevel%))) +-if /i "%3" EQU "x64" (set plat=x64) else (if /i "%3" EQU "Win32" (set plat=win32) else (call :seterr & echo ERROR: platform is "Win32" or "x64" ^(not "%3"^) & exit /b %errorlevel%)) +-if /i "%4" EQU "Debug" (set conf=Debug) else (if /i "%4" EQU "Release" (set conf=Release) else (call :seterr & echo ERROR: configuration is "Release" or "Debug" ^(not "%4"^) & exit /b %errorlevel%)) ++if /i "%3" EQU "x64" (set plat=x64) else ( ++ if /i "%3" EQU "Win32" (set plat=win32) else ( ++ if /i "%3" EQU "ARM64" (set plat=ARM64) else ( ++ call :seterr & echo ERROR: platform is "Win32", "x64", or "ARM64" ^(not %3^) & exit /b %errorlevel% ++ ) ++ ) ++) ++if /i "%4" EQU "Debug" (set conf=Debug) else (if /i "%4" EQU "Release" (set conf=Release) else (call :seterr & echo ERROR: configuration is "Release" or "Debug" ^(not %4^) & exit /b %errorlevel%)) + if /i "%5" NEQ "" if "%5" EQU "+tests" (set run_tests=y) else (set win_sdk=%5) + if /i "%6" NEQ "" if "%6" EQU "+tests" (set run_tests=y) + diff --git a/win/run-cmake.bat b/win/run-cmake.bat index 397887eb6cd..2a49a65042d 100755 --- a/win/run-cmake.bat +++ b/win/run-cmake.bat @@ -20,6 +20,10 @@ :: Example usage: :: run-cmake.bat vs2022-x64 :: run-cmake.bat vs2022-x64 -DGLTF_SUPPORT=ON -DHDF5_SUPPORT=OFF +:: +:: Used environment variables: +:: - `ADD_COMMIT_SHA` - if defined then `ADD_COMMIT_SHA` and `VERSION_OVERRIDE` cmake args will be set to `ON`. +:: - `USE_NINJA` - if defined then the Ninja generator will be used instead of the Visual Studio. @if not defined ECHO_ON ( echo off ) @@ -105,7 +109,13 @@ set PYTHON_LIBRARY=%PYTHONHOME%\libs\python%PY_VER_MAJOR_MINOR%.lib :: we can remove it later. if not defined SWIG_INSTALL_DIR set SWIG_INSTALL_DIR=%INSTALL_DIR%\swigwin set JSON_INCLUDE_DIR=%INSTALL_DIR%\json -if not defined ADD_COMMIT_SHA set ADD_COMMIT_SHA=Off +if defined ADD_COMMIT_SHA ( + set ADD_COMMIT_SHA=ON + set VERSION_OVERRIDE=ON +) else ( + set ADD_COMMIT_SHA=OFF + set VERSION_OVERRIDE=OFF +) set CGAL_INSTALL_DIR=%INSTALL_DIR%\cgal set GMP_INSTALL_DIR=%INSTALL_DIR%\mpir @@ -180,19 +190,16 @@ if defined USE_NINJA ( ) IF NOT "%VS_TOOLSET_HOST%"=="" ( - cmake.exe %CMAKELISTS_DIR% -G %GENERATOR% %ARCH_OPTION% -T %VS_TOOLSET_HOST% ^ - -DCMAKE_INSTALL_PREFIX="%CMAKE_INSTALL_PREFIX%" ^ - -DWITH_ROCKSDB=On -DWITH_ZSTD=On ^ - -DCMAKE_PREFIX_PATH="%CMAKE_PREFIX_PATH%" ^ - -DADD_COMMIT_SHA=%ADD_COMMIT_SHA% %ARGUMENTS% -) ELSE ( - cmake.exe %CMAKELISTS_DIR% -G %GENERATOR% %ARCH_OPTION% ^ - -DCMAKE_INSTALL_PREFIX="%CMAKE_INSTALL_PREFIX%" ^ - -DWITH_ROCKSDB=On -DWITH_ZSTD=On ^ - -DCMAKE_PREFIX_PATH="%CMAKE_PREFIX_PATH%" ^ - -DADD_COMMIT_SHA=%ADD_COMMIT_SHA% %ARGUMENTS% + set VS_TOOLSET_OPTION=-T %VS_TOOLSET_HOST% ) +cmake.exe %CMAKELISTS_DIR% -G %GENERATOR% %ARCH_OPTION% %VS_TOOLSET_OPTION% ^ + -DCMAKE_INSTALL_PREFIX="%CMAKE_INSTALL_PREFIX%" ^ + -DWITH_ROCKSDB=On -DWITH_ZSTD=On ^ + -DCMAKE_PREFIX_PATH="%CMAKE_PREFIX_PATH%" ^ + -DADD_COMMIT_SHA=%ADD_COMMIT_SHA% -DVERSION_OVERRIDE=%VERSION_OVERRIDE% ^ + %ARGUMENTS% + IF NOT %ERRORLEVEL%==0 GOTO :Error echo. diff --git a/win/utils/tools.ps1 b/win/utils/tools.ps1 index c1435817892..583e4cfb3b2 100644 --- a/win/utils/tools.ps1 +++ b/win/utils/tools.ps1 @@ -2,6 +2,8 @@ Set-PSDebug -Trace 0 Set-StrictMode -Version 3 $ErrorActionPreference = "Stop" +$cecho = "$PSScriptRoot\cecho.cmd" + # Create marker file to indicate whether Release or Debug build was installed. function mark { @@ -18,7 +20,7 @@ function mark { if (Test-Path -Path $marker_filepath) { return } - cecho.cmd 0 13 "Marking installation in '$installation_dir' with '$ENV:MARKER_FILE'." + . $cecho 0 13 "Marking installation in '$installation_dir' with '$ENV:MARKER_FILE'." New-Item -Path $marker_filepath -ItemType File | Out-Null } @@ -76,7 +78,7 @@ function mark_based_on_artifacts { if (Test-Path -Path $marker_filepath) { return } - cecho.cmd 0 13 "Found artifact '$artifact' for dependency '$dependency_name' $env:BUILD_CFG." + . $cecho 0 13 "Found artifact '$artifact' for dependency '$dependency_name' $env:BUILD_CFG." & mark $installation_dir } @@ -138,12 +140,11 @@ function extract_file { [string]$dir_after_extraction ) if (Test-Path -Path "$dir_after_extraction") { - cecho.cmd 0 13 "$dependency_name already extracted into '$dir_after_extraction'. Skipping." - exit 0 + . $cecho 0 13 "$dependency_name already extracted into '$dir_after_extraction'. Skipping." + return } - cecho.cmd 0 13 "Extracting $dependency_name into '$destination_dir' from '$filename'." + . $cecho 0 13 "Extracting $dependency_name into '$destination_dir' from '$filename'." 7za x "$filename" -o"$destination_dir" - exit 0 } @@ -161,13 +162,12 @@ function download_file { mkdir "$destination_dir" -Force | Out-Null pushd "$destination_dir" if (Test-Path -Path "$filename") { - cecho.cmd 0 13 "$dependency_name already downloaded. Skipping." - exit 0 + . $cecho 0 13 "$dependency_name already downloaded. Skipping." + return } - cecho.cmd 0 13 "Downloading $dependency_name into '$destination_dir'" + . $cecho 0 13 "Downloading $dependency_name into '$destination_dir'" Invoke-WebRequest $url -OutFile $filename - exit 0 } @@ -185,21 +185,20 @@ function git_clone_and_checkout_revision { [string]$revision ) if (Test-Path -Path "$dest_dir") { - cecho.cmd 0 13 "Cloning $dependency_name is already cloned." - exit 0 + . $cecho 0 13 "Cloning $dependency_name is already cloned." + return } - cecho.cmd 0 13 "Cloning $dependency_name into '$dest_dir'." + . $cecho 0 13 "Cloning $dependency_name into '$dest_dir'." pushd "$env:DEPS_DIR" git clone $git_url $dest_dir popd pushd "$dest_dir" git fetch - cecho.cmd 0 13 "Checking out $dependency_name revision $revision." + . $cecho 0 13 "Checking out $dependency_name revision $revision." git reset --hard git checkout $revision popd - exit 0 } function install_cmake_project { @@ -212,20 +211,61 @@ function install_cmake_project { [string]$configuration ) pushd "$build_dir" - cecho.cmd 0 13 "Installing $dependency_name ($configuration). Please be patient, this may take a while." + . $cecho 0 13 "Installing $dependency_name ($configuration). Please be patient, this may take a while." $command = "cmake --install . --config $configuration" - cecho.cmd 0 13 "$command" + . $cecho 0 13 "$command" Invoke-Expression $command popd - exit 0 } +function check_boost_vc145_compatibility { + param( + [Parameter(Mandatory = $true)] + [string]$VC_VER, + [Parameter(Mandatory = $true)] + [string]$DEPS_DIR, + [Parameter(Mandatory = $true)] + [string]$BOOST_ROOT + ) + + $boost_build_path = "$BOOST_ROOT/tools/build" + + if ($VC_VER -ne "14.5") { + . $cecho 0 13 "VC_VER is not 14.5, no need to install updated b2." + return + } + + $res = Select-String -Path "$boost_build_path/src/engine/build.bat" -Pattern 'vc143, vc145' -Quiet; + if ($res) { + . $cecho 0 13 "vc145 already supported, no need to install updated b2." + return + } + + $b2_version = "5.4.2" + $b2_stem = "b2-$b2_version" + $b2_path = "$DEPS_DIR\$b2_stem" + $b2_filename = "$b2_stem.zip" + + & download_file "b2" "https://github.com/bfgroup/b2/releases/download/$b2_version/$b2_filename" "$DEPS_DIR" "$b2_filename" + & extract_file "b2" "$b2_filename" "$DEPS_DIR" "$b2_path" + + . $cecho 0 13 "Installing b2 with vc145 support..." + Remove-Item -Recurse -Path "$boost_build_path" + Copy-Item -Path "$b2_path" -Destination "$boost_build_path" -Recurse + . $cecho 0 13 "b2 with vc145 support installed." +} + function main { & setup_build_cfg # Dispatch command. $command = $Args[0] - $command_args = $Args[1..($args.Count - 1)] + if ($args.Count -gt 1) { + $command_args = $Args[1..($args.Count - 1)] + } + else { + $command_args = @() + } & $command @command_args } diff --git a/win/vs-cfg.cmd b/win/vs-cfg.cmd index 794291792be..d89f3fa88be 100644 --- a/win/vs-cfg.cmd +++ b/win/vs-cfg.cmd @@ -35,6 +35,11 @@ :: "vs2019-x86-v141_xp" => cmake -G "Visual Studio 16 2019" -A Win32 -T v141_xp :: :: NOTE: The delayed environment variable expansion needs to be enabled before calling this. +:: +:: Output variables: +:: - VC_VER - e.g. "14.5" +:: - VS_VER - e.g. "2026" +:: - BOOST_BOOTSTRAP_VER - e.g. "vc145" @if not defined ECHO_ON ( echo off ) @@ -46,7 +51,8 @@ set GENERATORS[2]="Visual Studio 14 2015" set GENERATORS[3]="Visual Studio 15 2017" set GENERATORS[4]="Visual Studio 16 2019" set GENERATORS[5]="Visual Studio 17 2022" -set LAST_GENERATOR_IDX=5 +set GENERATORS[6]="Visual Studio 18 2026" +set LAST_GENERATOR_IDX=6 :: Is generator shorthand used? set GEN_SHORTHAND=!GENERATOR:vs=! @@ -104,6 +110,9 @@ IF "!GENERATOR!"=="" IF NOT "%VisualStudioVersion%"=="" ( GOTO :GeneratorValid ) ) + call utils\cecho.cmd 0 12 ^ + "Generator is not provided and VisualStudioVersion='%VisualStudioVersion%' is not supported - cannot proceed." + exit /b 1 ) :: Check that the used CMake version supports the chosen generator @@ -157,6 +166,7 @@ IF %VS_VER%==2015 ( set "VC_VER=14.0" ) IF %VS_VER%==2017 ( set "VC_VER=14.1" ) IF %VS_VER%==2019 ( set "VC_VER=14.2" ) IF %VS_VER%==2022 ( set "VC_VER=14.3" ) +IF %VS_VER%==2026 ( set "VC_VER=14.5" ) :: determine the argument for Boost bootstrap set BOOST_BOOTSTRAP_VER=vc%VC_VER%